209 lines
8.4 KiB
PHP
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);
|
||
|
|
}
|
||
|
|
}
|