|
|
@@ -287,6 +287,13 @@ class ExamService extends BaseService
|
|
|
return $datas;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取答题卡列表题目数据
|
|
|
+ * @param $userId 用户
|
|
|
+ * @param $paperId
|
|
|
+ * @param int $rid
|
|
|
+ * @return array|mixed
|
|
|
+ */
|
|
|
public function getCardList($userId, $paperId, $rid=0)
|
|
|
{
|
|
|
$cacheKey = "caches:exams:{$userId}_cardList:{$paperId}_{$rid}";
|
|
|
@@ -296,13 +303,29 @@ class ExamService extends BaseService
|
|
|
}
|
|
|
|
|
|
$datas = ExamTopicModel::from('exam_topics as a')
|
|
|
- ->leftJoin('exam_answers_topics as b',function($join) use($rid){
|
|
|
+ ->leftJoin('exam_answers_topics as b',function($join) use($userId, $rid){
|
|
|
if($rid){
|
|
|
- $join->
|
|
|
+ $join->on('b.topic_id','=','a.id')->where(['b.user_id'=>$userId,'b.answer_log_id'=> $rid,'status'=>1,'mark'=>1]);
|
|
|
}
|
|
|
})
|
|
|
->where(['a.paper_id'=> $paperId, 'a.status'=>1,'a.mark'=>1])
|
|
|
- ->select(['a.*','b.id'])
|
|
|
+ ->select(['a.id','a.topic_name','a.answer','a.score','a.paper_id','a.topic_type','b.id as rid','b.answer as submit_answer','b.accurate','b.score as submit_score'])
|
|
|
+ ->groupBy('a.topic_type')
|
|
|
+ ->orderBy('a.sort','desc')
|
|
|
+ ->orderBy('a.id','asc')
|
|
|
+ ->get();
|
|
|
+ $datas = $datas? $datas->toArray() :[];
|
|
|
+ if($datas){
|
|
|
+ foreach ($datas as &$item){
|
|
|
+ $item['rid'] = !empty($item['rid'])? $item['rid'] : 0;
|
|
|
+ $item['submit_answer'] = isset($item['submit_answer'])? $item['submit_answer'] : '';
|
|
|
+ $item['accurate'] = isset($item['accurate'])? $item['accurate'] : -1;
|
|
|
+ $item['submit_score'] = isset($item['submit_score'])? $item['submit_score'] : 0;
|
|
|
+ }
|
|
|
+ RedisService::set($cacheKey, $datas, rand(5, 10));
|
|
|
+ }
|
|
|
+
|
|
|
+ return $datas;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -340,12 +363,12 @@ class ExamService extends BaseService
|
|
|
$answerImage = isset($params['answer_image'])? $params['answer_image'] : '';
|
|
|
$answerType = isset($params['answer_type']) && $params['answer_type']? $params['answer_type'] : 2;
|
|
|
$remainTime = isset($params['remain_time']) && $params['remain_time']? $params['remain_time'] : 0;
|
|
|
- if($isSubmit<=0 && empty($answer)){
|
|
|
+ if($isSubmit<=0 && $answerType==2 && empty($answer)){
|
|
|
$this->error = '请先提交答案';
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- if($answerType==1 && empty($answerImage)){
|
|
|
+ if($isSubmit<=0 && $answerType==1 && empty($answerImage)){
|
|
|
$this->error = '请先上传图片答案';
|
|
|
return false;
|
|
|
}
|
|
|
@@ -418,7 +441,9 @@ class ExamService extends BaseService
|
|
|
}
|
|
|
|
|
|
// 直接交卷
|
|
|
- if($isSubmit==1 && empty($answer)){
|
|
|
+ $totalTime = ConfigService::make()->getConfigByCode('answer_total_time', 1800);
|
|
|
+ $answerTime = $totalTime >$remainTime? $totalTime-$remainTime : $totalTime;
|
|
|
+ if($isSubmit==1 && empty($answer) && empty($answerImage)){
|
|
|
// 是否提交过
|
|
|
if($answerCount<=0){
|
|
|
$this->error = '您未提交过答案,请先答题再交卷';
|
|
|
@@ -427,6 +452,15 @@ class ExamService extends BaseService
|
|
|
|
|
|
$this->model->where(['id'=> $rid])->update(['is_submit'=>1,'update_time'=>time()]);
|
|
|
$this->error = '交卷成功';
|
|
|
+
|
|
|
+ // 答题时间统计
|
|
|
+ $id = MemberAnswerRankModel::where(['user_id'=> $userId,'date'=>date('Y-m-d'),'mark'=>1])->value('id');
|
|
|
+ if($id){
|
|
|
+ MemberAnswerRankModel::where(['id'=> $id])->update(['answer_time'=>DB::raw("answer_time + {$answerTime}"),'answer_count'=>DB::raw("answer_count + {$answerCount}"),'update_time'=>time()]);
|
|
|
+ }else{
|
|
|
+ MemberAnswerRankModel::insert(['user_id'=>$userId,'answer_time'=>$answerTime,'answer_count'=> $answerCount,'date'=>date('Y-m-d'),'create_time'=>time()]);
|
|
|
+ }
|
|
|
+
|
|
|
RedisService::keyDel("caches:exams:{$userId}*");
|
|
|
return ['rid'=> $rid,'paper_id'=>$paperId];
|
|
|
}
|
|
|
@@ -469,13 +503,20 @@ class ExamService extends BaseService
|
|
|
}else {
|
|
|
// 图片答案AI验证
|
|
|
if($answerType == 1){
|
|
|
+ if(empty($answerImage)){
|
|
|
+ $this->error = '请上传图片答案~';
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
$submitType = 3;
|
|
|
$apiData = [
|
|
|
- 'answer'=> $answer,
|
|
|
+ 'answer'=> DeepSeekService::make()->getImageTopicData($answerImage),
|
|
|
'score'=> $topicScore,
|
|
|
'topic'=> $topicShowType == 2 && $topicName? DeepSeekService::make()->getImageTopicData($topicName) : $topicName,
|
|
|
];
|
|
|
|
|
|
+ var_dump($apiData);
|
|
|
+
|
|
|
$result = DeepSeekService::make()->apiRequest($apiData);
|
|
|
RedisService::clear($cacheKey.'_lock');
|
|
|
$this->error = '功能开放中~';
|
|
|
@@ -501,8 +542,6 @@ class ExamService extends BaseService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- $totalTime = ConfigService::make()->getConfigByCode('answer_total_time', 1800);
|
|
|
- $answerTime = $totalTime >$remainTime? $totalTime-$remainTime : $totalTime;
|
|
|
DB::beginTransaction();
|
|
|
if($rid){
|
|
|
$log = [
|
|
|
@@ -553,7 +592,7 @@ class ExamService extends BaseService
|
|
|
|
|
|
if($logId){
|
|
|
$topicData['update_time'] = $submitType;
|
|
|
- ExamAnswerTopicModel::where(['id'=> $logId])->update([$topicData]);
|
|
|
+ ExamAnswerTopicModel::where(['id'=> $logId])->update($topicData);
|
|
|
}else if (!ExamAnswerTopicModel::insert($topicData)){
|
|
|
DB::rollBack();
|
|
|
RedisService::clear($cacheKey.'_lock');
|
|
|
@@ -562,6 +601,18 @@ class ExamService extends BaseService
|
|
|
}
|
|
|
|
|
|
DB::commit();
|
|
|
+
|
|
|
+ // 答题时间统计
|
|
|
+ if($isSubmit==1){
|
|
|
+ $id = MemberAnswerRankModel::where(['user_id'=> $userId,'date'=>date('Y-m-d'),'mark'=>1])->value('id');
|
|
|
+ if($id){
|
|
|
+ $answerCount++;
|
|
|
+ MemberAnswerRankModel::where(['id'=> $id])->update(['answer_time'=>DB::raw("answer_time + {$answerTime}"),'answer_count'=>DB::raw("answer_count + {$answerCount}"),'update_time'=>time()]);
|
|
|
+ }else{
|
|
|
+ MemberAnswerRankModel::insert(['user_id'=>$userId,'answer_time'=>$answerTime,'answer_count'=> $answerCount,'date'=>date('Y-m-d'),'create_time'=>time()]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
$this->error = '答题成功';
|
|
|
RedisService::clear($cacheKey.'_lock');
|
|
|
RedisService::keyDel("caches:exams:{$userId}*");
|