Просмотр исходного кода

Merge branch 'master' of http://git.derkj.com:9095/waibao/NN2025081602

罗永浩 6 месяцев назад
Родитель
Сommit
f45f8bca39

+ 1 - 1
app/Http/Controllers/Api/v1/ExamController.php

@@ -141,7 +141,7 @@ class ExamController extends webApp
     }
 
     /**
-     * 排行榜
+     * 答题卡数据
      */
     public function cards()
     {

+ 3 - 0
app/Http/Controllers/Api/v1/IndexController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api\v1;
 
 use App\Http\Controllers\Api\webApp;
 use App\Services\Api\CourseService;
+use App\Services\Common\AdService;
 use App\Services\Common\NoticeService;
 use App\Services\ConfigService;
 use App\Services\RedisService;
@@ -57,6 +58,8 @@ class IndexController extends webApp
             'menuList' => config('platform.menuList'),
             // 公告
             'notices' => NoticeService::make()->getRecommandList(),
+            // 轮播
+            'banners' => AdService::make()->getListByPosition(1),
             // 线上课程
             'courses' => [
                 CourseService::make()->getListByType(1),

+ 5 - 5
app/Http/Controllers/Api/v1/TestController.php

@@ -17,10 +17,10 @@ class TestController extends webApp
 
     public function check()
     {
-        $ocr = new TesseractOCR();
-        $result = $ocr->recognize(ATTACHMENT_PATH.'/temp/20250922/answer1.jpeg');
+        //$ocr = new TesseractOCR();
+        //$result = $ocr->recognize(ATTACHMENT_PATH.'/temp/20250922/answer1.jpeg');
 //        $result = (new TesseractOCR(ATTACHMENT_PATH.'/temp/20250922/answer1.jpeg'))->lang('chi_sim')->run();
-        dump($result);
+        //dump($result);
 //        return 66;
 
 
@@ -34,8 +34,8 @@ class TestController extends webApp
         ];
 
 
-//        $result = DeepSeekService::make()->upload('/temp/20250922/topic2.jpeg');
-        $result = DeepSeekService::make()->apiRequest($data,'deepseek-chat');
+        $result = DeepSeekService::make()->upload('/temp/20250922/topic2.jpeg');
+//        $result = DeepSeekService::make()->apiRequest($data,'deepseek-chat');
         dump($result);
 //        $papers = [28,29];
 //        $datas = [];

+ 61 - 10
app/Services/Api/ExamService.php

@@ -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}*");

+ 1 - 38
app/Services/Common/VideoService.php

@@ -1,11 +1,9 @@
 <?php
 namespace App\Services\Common;
 
-use App\Models\VideoModel;
 use App\Models\ActionLogModel;
+use App\Models\VideoModel;
 use App\Services\BaseService;
-use App\Services\RedisService;
-use Illuminate\Support\Facades\DB;
 
 class VideoService extends BaseService
 {
@@ -152,41 +150,7 @@ class VideoService extends BaseService
 
         return $datas ? $datas->toArray() : [];
     }
-<<<<<<< HEAD
-=======
-
-    /**
-     * 获取
-     * @param $type
-     * @param int $num
-     * @return array|mixed
-     */
-    public function getListByType($type, $num = 0)
-    {
-        $num = $num? $num : \App\Services\ConfigService::make()->getConfigByCode('show_course_num', 4);
-        $cacheKey = "caches:videos:type_list_{$type}_{$num}";
-        $datas = RedisService::get($cacheKey);
-        if($datas){
-            return $datas;
-        }
 
-        $datas = $this->model->where(['type'=>$type,'status'=>1,'mark'=>1])
-                ->select(['id','video_name','poster','type','description','is_recommend','status'])
-                ->orderBy('is_recommend','asc')
-                ->orderBy('create_time','desc')
-                ->limit($num)
-                ->get();
-        $datas = $datas? $datas->toArray() : [];
-        if($datas){
-            foreach ($datas as &$item){
-                $item['poster'] = $item['poster'] ? get_image_url($item['poster']) : '';
-            }
-
-            RedisService::set($cacheKey, $datas, rand(3600, 7200));
-        }
-
-        return $datas;
-    }
 
     /**
      * 删除七天之前标记软删除的数据
@@ -199,5 +163,4 @@ class VideoService extends BaseService
         $this->model->where('mark', 0)->where('update_time', '<=', time() - 7 * 86400)->delete();
         return parent::delete();
     }
->>>>>>> 9fe3ebdb5f6152e2be13b11c08901349803b4db7
 }

+ 21 - 7
app/Services/DeepSeekService.php

@@ -26,7 +26,8 @@ class DeepSeekService extends BaseService
         // 授权登录
         'deepseek-chat' => '/chat/completions',
         'deepseek-reasoner' => '/chat/completions',
-        'upload' => '/v1/ocr/invoice',
+        'upload' => '/v1/upload',
+        'generate' => '/v1/text/generate',
     ];
 
 
@@ -118,20 +119,33 @@ class DeepSeekService extends BaseService
         }
 
         $headers = [
-            'Content-Type: application/json',
-            'Accept: application/json',
+//            'Content-Type: application/json',
+//            'Accept: application/json',
             'Authorization: Bearer ' . $this->apiKey
         ];
 
 
         $filePath = ATTACHMENT_PATH.get_image_path($image);
-        $obj = new \CURLFile($filePath);
+        dump($filePath);
+
+        $url = $this->apiUrl.$this->apiUrls['generate'];
+//        $url = $this->apiUrl.$this->apiUrls['upload'];
+
+        var_dump(basename($image));
+        $file = new \CURLFile(realpath($filePath), 'application/octet-stream', basename($image));
+        $files = ['image' => $file];
         $data = [
-            'image'=> $obj,
+            "files"=> $files
         ];
-        $url = $this->apiUrl.$this->apiUrls['upload'];
+        $data = [
+            "prompt"=> "解释量子计算的基本原理",
+            "max_tokens"=> 200,
+            "temperature"=>0.7
+        ];
+        var_dump($url);
+        var_dump($data);
         $result = aiRequest($url, $data, 10, $headers);
-
+var_dump($result);
     }
 
     /**