318 lines
13 KiB
PHP
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('服务器休息中,请稍后再试');
|
|
}
|
|
}
|
|
|
|
}
|