love_php/app/Http/Controllers/Server/Admin/EmoTestController.php
2026-04-02 09:20:51 +08:00

318 lines
13 KiB
PHP

<?php
namespace App\Http\Controllers\Server\Admin;
use App\Jobs\MakeQrcode;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\QAAnswer;
use App\Models\QATest;
use App\Models\QATestRecord;
use App\Models\User;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Redis;
class EmoTestController extends Controller
{
//情感测试
/**
* 新增问答测试
* @param Request $request
* @return JsonResponse|string
*/
public function addQA_test(Request $request)
{
try {
$title = $request->title;
$subtitle = $request->subtitle;
$status = $request->status ?? 0;
$pic = $request->pic;
$intro = $request->intro;
$answer = $request->answer;
$question = $request->question;
$merchant_id = $request->account_id;
$is_recommend = $request->is_recommend;
$QATest = new QATest();
$QATest->title = $title;
$QATest->subtitle = $subtitle;
$QATest->status = $status;
$QATest->pic = $pic;
$QATest->intro = $intro;
$QATest->merchant_id = $merchant_id;
$QATest->is_recommend = $is_recommend ?? 0;
$QATest->question = json_encode($question);
$QATest->save();
MakeQrcode::dispatch('test', $QATest->id, $QATest->merchant_id)->onQueue('love');
foreach ($answer as $key => $value) {
$answers = new QAAnswer();
$answers->q_a_test_id = $QATest->id;
$answers->title = $value['title'];
$answers->min_score = $value['min_score'];
$answers->max_score = $value['max_score'];
$answers->content = $value['content'];
$answers->save();
}
if (Cache::has('drafts_test_merchant_id_' . $request->account_id)) Cache::forget('drafts_test_merchant_id_' . $request->account_id);
return $this->success('ok', ['id' => $QATest->id]);
}catch (\Exception $e){
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
/**
* 更新问答测试
* @param Request $request
* @return JsonResponse|string
*/
public function UpdateQA_test(Request $request)
{
try {
$id = $request->id;
$title = $request->title;
$subtitle = $request->subtitle;
$status = $request->status ?? 0;
$pic = $request->pic;
$intro = $request->intro;
$type = $request->type ?? 'default';
$way = $request->way;
$value = $request->value;
$answer = $request->answer ?? [];
$question = $request->question;
// return $this->success('ok',$request->all());
$QATest = QATest::where('id', $id)->where('merchant_id', $request->account_id)->first();
if (!$QATest) return $this->failure('数据不存在或已删除');
$QATest->title = $title ?? $QATest->title;
$QATest->subtitle = $subtitle ?? $QATest->subtitle;
$QATest->intro = $intro ?? $QATest->intro;
if ($request->has('status')) {
$QATest->status = $request->status;
}
if ($request->has('is_top')) {
$QATest->is_top = $request->is_top;
$QATest->top_time = $request->is_top ? date('Y-m-d H:i:s') : null;
}
$QATest->pic = $pic ?? $QATest->pic;
$QATest->type = $type ?? $QATest->type;
$QATest->way = $way ?? $QATest->way;
$QATest->value = $value ?? $QATest->value;
$QATest->question = $question ? json_encode($question) : $QATest->question;
$QATest->save();
$ids = [];
if (!empty($answer)) {
foreach ($answer as $key => $value) {
if (isset($value['id'])) {
$answers = QAAnswer::where('id', $value['id'])->first();
} else {
$answers = new QAAnswer();
$answers->q_a_test_id = $QATest->id;
}
$answers->title = $value['title'] ?? $answers->title;
$answers->min_score = $value['min_score'] ?? $answers->min_score;
$answers->max_score = $value['max_score'] ?? $answers->max_score;
$answers->content = $value['content'] ?? $answers->content;
$answers->save();
array_push($ids, $answers->id);
}
QAAnswer::where('q_a_test_id', $QATest->id)->wherenotin('id', $ids)->delete();
}
return $this->success('ok');
}catch (\Exception $e){
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
/**
* 删除问答测试列表
* @param Request $request
* @return JsonResponse|string
*/
public function DelQA_test(Request $request)
{
try {
$merchant_id = $request->account_id;
$id = $request->id;
$QATest = QATest::where('id', $id)->where('merchant_id', $merchant_id)->first();
if (!$QATest) return $this->failure('数据不存在');
$QATest->delete();
QAAnswer::where('q_a_test_id', $id)->delete();
return $this->success('操作成功');
}catch (\Exception $e){
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
/**
* 获取问答测试列表
* @param Request $request
* @return JsonResponse|string
*/
public function QA_testList(Request $request)
{
try {
$keyword = $request->keyword;
$merchant_id = $request->account_id;
$status = $request->status ?? 2;
$result = QATest::with(['qrcode'=>function($sql) {
$sql->where('type', 'test');
}])->where('merchant_id', $merchant_id);
if ($status != 2) {
$result = $result->where('status', $status);
}
if ($keyword) {
$keyword = trim($keyword);
$result = $result->where('title', 'like', '%' . $keyword . '%');
}
$result = $result->orderBy('is_top', 'desc')
->orderBy('top_time', 'desc')
->orderBy('id', 'desc')
->paginate();
foreach ($result as $item) {
$pv = Redis::zscore('testpv', $item->id);
$item->pv = $pv ?: 0;
}
return $this->success('ok', $result);
}catch (\Exception $e){
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
/**
* 获取问答测试详情
* @param Request $request
* @return JsonResponse|string
*/
public function QA_testDetail(Request $request)
{
try {
$merchant_id = $request->account_id;
$id = $request->id;
$QATest = QATest::where('id', $id)->where('merchant_id', $merchant_id)->first();
if (!$QATest) return $this->failure('数据不存在或已删除');
$QATest->answer;
$QATest->question = json_decode($QATest->question, true);
return $this->success('ok', $QATest);
}catch (\Exception $e){
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
/**
* 问答测试成员列表
* @param Request $request
* @return JsonResponse|string
*/
public function QA_testUser(Request $request)
{
try {
$merchant_id = $request->account_id;
$id = $request->id;
$ids = QATestRecord::where('q_a_test_id', $id)->where('merchant_id', $merchant_id)->groupBy('merchant_user_id')->pluck('merchant_user_id');
$QATest = QATestRecord::select('id', 'merchant_user_id', 'q_a_test_id', 'score', 'q_a_answer_id', 'created_at')
->where('q_a_test_id', $id)
->where('merchant_id', $merchant_id)
->wherein('merchant_user_id', $ids)
->orderBy('id', 'desc')
->paginate();
foreach ($QATest as $key => $value) {
$value->nickname = $value->user->nickname ?? '匿名用户';
$value->pic = $value->user->pic ?? User::DefaultAvatar;
$value->title = $value->answer->title ?? '该测试不存在或已下架';
$value->content = $value->answer->content ?? null;
unset($value->answer);
unset($value->user);
}
return $this->success('ok', $QATest);
}catch (\Exception $e){
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
/**
* 移动端测试详情
* @param Request $request
* @param $test_id
* @return JsonResponse|string
*/
public function phoneTestDetail(Request $request, $test_id)
{
try {
$QATest = QATest::withTrashed()->where('id', $test_id)->first();
$serve_tab = $request->serve_tab;
// if(!$QATest) return $this->failure('测试不存在或已下架。');
$QATest->answer;
$QATest->question = json_decode($QATest->question, true);
$QATest->question_num = count($QATest->question) ?? 0;
$jump_url = urlencode(env('APP_URL') . '/pu/#/questionnaire/' . $test_id);
$url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $request->merchant_id . '&serve_tab=' . $serve_tab . '&url=' . $jump_url;
$qr_code = Redis::get('TestDetail_S' . $test_id);
if (!$qr_code) {
$qr_code = $this->getPreviewQrcode($url);
Redis::setex('TestDetail_S' . $test_id, 60 * 60 * 24 * 30, $qr_code);
$qr_code = Redis::get('TestDetail_S' . $test_id);
}
$QATest->share_qr_code = $qr_code;
$avatar = [];//参与测试用户头像
//参与测试人数
$QATest->consume_user_count = QATestRecord::where('q_a_test_id', $test_id)->count();/*->groupBy('merchant_user_id')->get()*/
//访问人数
$QATest->pv = Redis::zscore('testDetail', $test_id) ?: 0;
$rocords = QATestRecord::where('q_a_test_id', $test_id)->groupBy('merchant_user_id')->limit(3)->get();
foreach ($rocords as $key => $record) {
$avatar[$key] = $record->user ? $record->user->pic : User::DefaultAvatar;
if (empty($avatar[$key])) $avatar[$key] = User::DefaultAvatar;
unset($record->user);
}
$QATest->avatar = $avatar;
//下架或删除状态 0下架 1正常上架 2已删除
$publish_state = 0;
if ($QATest->deleted_at) {
$publish_state = 2;
} elseif ($QATest->status == 1) {
$publish_state = 1;
} else {
$publish_state = 0;
}
$QATest->publish_state = $publish_state;
return $this->success('ok', $QATest);
}catch (\Exception $e){
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
/**
* 移动端测试用户
* @param Request $request
* @param $test_id
* @return JsonResponse|string
*/
public function phoneTestUsers(Request $request, $test_id)
{
try {
$records = QATestRecord::where('q_a_test_id', $test_id)->select('id', 'merchant_user_id', 'score', 'created_at')->orderBy('id', 'desc')->paginate();
foreach ($records as $key => $record) {
$goods = QATest::where('id', $test_id)->value('title');
$record->text = $record->created_at . ' 测试了《' . $goods . '》';
$record->avatar = $record->user ? $record->user->pic : User::DefaultAvatar;
if (empty($record->avatar)) $record->avatar = User::DefaultAvatar;
$record->name = $record->user ? $record->user->nickname : '匿名用户';
unset($record->user);
}
return $this->success('ok', $records);
}catch (\Exception $e){
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
}