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

209 lines
8.4 KiB
PHP

<?php
namespace App\Http\Controllers\Server\H5;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\QATest;
use App\Models\QATestRecord;
use App\Models\QAAnswer;
use App\Models\Server\MerchantUser;
use App\Models\User;
use Illuminate\Support\Facades\Redis;
class EmoTestController extends Controller
{
/**
* 获取问答测试列表
* */
public function QA_testList(Request $request)
{
$merchant_id = $request->merchant_id;
$merchant_user_id = $request->merchant_user_id ?? 0;
$result = QATest::select('id', 'title', 'subtitle', 'pic', 'status', 'intro', 'created_at')->where('merchant_id', $merchant_id)->where('status', 1)->orderBy('is_top', 'desc')->orderBy('top_time', 'desc')->orderBy('id', 'desc')->paginate();
foreach ($result as $key => $value) {
$value->user_num = QATestRecord::where('q_a_test_id', $value->id)->groupby('merchant_user_id')->get()->count();
$value->status = QATestRecord::where('merchant_user_id', $merchant_user_id)->where('q_a_test_id', $value->id)->exists() ? 1 : 0;
}
return $this->success('ok', $result);
}
/**
* 获取问答测试详情
* */
public function QA_testDetail(Request $request)
{
$id = $request->id;
$QATest = QATest::withTrashed()->where('id', $id)->first();
// 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/' . $id);
$url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $request->merchant_id . '&url=' . $jump_url;
$qr_code = Redis::get('TestDetail_S' . $id);
if (!$qr_code) {
$qr_code = $this->getPreviewQrcode($url);
Redis::setex('TestDetail_S' . $id, 60 * 60 * 24 * 30, $qr_code);
$qr_code = Redis::get('TestDetail_S' . $id);
}
$QATest->share_qr_code = $qr_code;
// 访问记录
$QATest->qr_code = $QATest->merchant->qr_code ?? null;
unset($QATest->merchant);
$user = MerchantUser::where('id', $request->merchant_user_id)->first();
if (config('app.env') == 'production') {
$user->addlog($QATest);
}
//下架或删除状态 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;
$merchant_user_id = $request->merchant_user_id;
$merchant_user = MerchantUser::where('id', $merchant_user_id)->first();
if ($merchant_user) {
$QATest['share_nickname'] = $merchant_user->nickname ?? '匿名用户';
$QATest['share_avatar'] = $merchant_user->pic ?? User::DefaultAvatar;
}
return $this->success('ok', $QATest);
}
/**
* 提交问答测试
* */
public function QA_test(Request $request)
{
$merchant_id = $request->merchant_id;
$merchant_user_id = $request->merchant_user_id;
$q_a_test_id = $request->q_a_test_id;
$answer = $request->answer;
$score = 0;
foreach ($answer as $key => $value) {
$score += $value['score'];
}
$QATest = QATest::where('id', $q_a_test_id)->where('merchant_id', $merchant_id)->first();
if ($QATest->type != 'default') {
switch ($QATest->way) {
case '+':
$score = $score + $QATest->value;
break;
case '-':
$score = $score - $QATest->value;
break;
case '*':
$score = $score * $QATest->value;
break;
case '/':
$score = $score / $QATest->value;
break;
default:
$score = $score;
break;
}
}
$score = number_format($score, 2);
$q_a_answer = QAAnswer::where('min_score', '<=', $score)->where('max_score', '>=', $score)->where('q_a_test_id', $q_a_test_id)->first();
if (!$q_a_answer) {
$q_a_answer = QAAnswer::where('q_a_test_id', $q_a_test_id)->orderBY('max_score', 'desc')->first();
};
$obj = new QATestRecord();
$obj->merchant_user_id = $merchant_user_id;
$obj->q_a_test_id = $q_a_test_id;
$obj->q_a_answer_id = $q_a_answer->id;
$obj->score = $score ?? 0;
$obj->merchant_id = $merchant_id;
$obj->answer = json_encode($answer);
$obj->save();
$q_a_answer->score = $score;
return $this->success('ok', $q_a_answer);
}
/**
* 我的问答测试
* */
public function My_QA_test(Request $request)
{
$merchant_id = $request->merchant_id;
$merchant_user_id = $request->merchant_user_id;
$sql = QATestRecord::orderBy('id', 'DESC')->limit(1000);
$result = QATestRecord::from(\DB::raw('(' . $sql->toSql() . ') as a'))->where('merchant_user_id', $merchant_user_id)->where('merchant_id', $merchant_id)->groupBy('q_a_test_id')->orderBy('id', 'desc')->paginate();
foreach ($result as $key => $value) {
$value->answer = json_decode($value->answer, true);
$value->pic = $value->test->pic ?? '';
$value->title = $value->test->title ?? '测试不存在或已删除';
$value->question_num = 0;
if ($value->test) {
$value->question_num = count(json_decode($value->test->question)) ?? 0;
}
unset($value->test);
unset($value->answer);
}
return $this->success('ok', $result);
}
/**
* 获取问答测试详情
* */
public function my_QA_test_Detail(Request $request, $id)
{
$merchant_user_id = $request->merchant_user_id;
if ($request->type == 'user') {
$Record = QATestRecord::where('id', $id)->first();
} else {
$Record = QATestRecord::where('q_a_test_id', $id)->orderBy('id', 'desc')->first();
}
$result = QAAnswer::select('title', 'content')->where('id', $Record->q_a_answer_id)->first();
if (!$result) {
$result = QAAnswer::withTrashed()->where('id', $Record->q_a_answer_id)->select('title', 'content')->orderBy('id', 'desc')->first();
}
$result->score = $Record->score;
$result->pic = $Record->test ? $Record->test->pic : User::DefaultAvatar;
$jump_url = urlencode(env('APP_URL') . '/pu/#/questionnaire/' . $id);
$url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $request->merchant_id . '&url=' . $jump_url;
$qr_code = Redis::get('TestDetail_S' . $id);
if (!$qr_code) {
$qr_code = $this->getPreviewQrcode($url);
Redis::setex('TestDetail_S' . $id, 60 * 60 * 24 * 30, $qr_code);
$qr_code = Redis::get('TestDetail_S' . $id);
}
$result->share_qr_code = $qr_code;
$result->pv = Redis::zincrby('testpv', 1, $id);
return $this->success('ok', $result);
}
/**
* 问答测试用户
**/
public function QA_testUser(Request $request)
{
$merchant_id = $request->merchant_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);
}
}