From de8b3cf7a9b22be7abcb544a53dcea7f1b340760 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 20 Aug 2025 17:23:14 +0800
Subject: [PATCH] feat(ai): 新增开始答题V2 接口

---
 src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiMemberAnswerVoV2.java              |   16 ++++++++
 src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java                     |    2 +
 src/main/resources/mapper/modules/AiMemberAnswerItemMapper.xml                         |    1 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java            |   70 +++++++++++++++++++++++++++++++++++
 src/main/java/cc/mrbird/febs/ai/controller/memberAnswer/ApiMemberAnswerController.java |   10 +++++
 src/main/java/cc/mrbird/febs/ai/entity/AiMemberAnswerItem.java                         |    5 ++
 6 files changed, 103 insertions(+), 1 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberAnswer/ApiMemberAnswerController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberAnswer/ApiMemberAnswerController.java
index 99dd2db..e3c6dec 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/memberAnswer/ApiMemberAnswerController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/memberAnswer/ApiMemberAnswerController.java
@@ -33,6 +33,16 @@
 
     private final AiMemberAnswerService apiMemberAnswerService;
 
+    @ApiOperation(value = "开始答题V2", notes = "开始答题V2")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiMemberAnswerVoV2.class)
+    })
+    @PostMapping(value = "/startV2")
+    public FebsResponse startV2(@RequestBody @Validated ApiMemberAnswerDto dto) {
+
+        return apiMemberAnswerService.startAnswerV2(dto);
+    }
+
     @ApiOperation(value = "开始答题", notes = "开始答题")
     @ApiResponses({
             @ApiResponse(code = 200, message = "success", response = ApiMemberAnswerVo.class)
diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiMemberAnswerItem.java b/src/main/java/cc/mrbird/febs/ai/entity/AiMemberAnswerItem.java
index e040fa6..f90fea1 100644
--- a/src/main/java/cc/mrbird/febs/ai/entity/AiMemberAnswerItem.java
+++ b/src/main/java/cc/mrbird/febs/ai/entity/AiMemberAnswerItem.java
@@ -83,4 +83,9 @@
      * 是否加入错题集:0-否,1-是
      */
     private Integer isCollected;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiMemberAnswerVoV2.java b/src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiMemberAnswerVoV2.java
new file mode 100644
index 0000000..83f7165
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiMemberAnswerVoV2.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.ai.res.memberAnswer;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiMemberAnswerVoV2", description = "参数")
+public class ApiMemberAnswerVoV2 {
+
+    @ApiModelProperty(value = "当前页")
+    private Integer current;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
index 6fac5df..bf48a10 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
@@ -17,6 +17,8 @@
 
     AiMemberAnswer getOneByQuery(LambdaQueryWrapper<AiMemberAnswer> aiMemberAnswerLambdaQueryWrapper);
 
+    FebsResponse startAnswerV2(ApiMemberAnswerDto dto);
+
     FebsResponse startAnswer(ApiMemberAnswerDto dto);
 
     boolean checkMemberAnswerDone(AiMemberAnswer aiMemberAnswer);
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java
index 44a88fd..a13c68e 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java
@@ -53,6 +53,76 @@
         return aiMemberAnswerMapper.selectOne(aiMemberAnswerLambdaQueryWrapper);
     }
 
+    @Override
+    public FebsResponse startAnswerV2(ApiMemberAnswerDto dto) {
+        String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+        ApiMemberAnswerVoV2 apiMemberAnswerVoV2 = new ApiMemberAnswerVoV2();
+        Integer current = 1;
+
+        String productId = dto.getId();
+        AiProduct aiProduct = aiProductService.getById(productId);
+        if(ObjectUtil.isNull(aiProduct)){
+            throw new RuntimeException("产品不存在");
+        }
+        //验证产品分类下是否有题目
+        String productCategoryId = aiProduct.getProductCategoryId();
+        LambdaQueryWrapper<AiProductQuestion> questionLambdaQueryWrapper = Wrappers.lambdaQuery(AiProductQuestion.class);
+        questionLambdaQueryWrapper.eq(AiProductQuestion::getProductCategoryId,productCategoryId);
+        questionLambdaQueryWrapper.eq(AiProductQuestion::getState,1);
+        questionLambdaQueryWrapper.last("limit 1");
+        List<AiProductQuestion> aiProductQuestions = aiProductQuestionService.getListByQuery(questionLambdaQueryWrapper);
+        if(CollUtil.isEmpty(aiProductQuestions)){
+            // todo 没有题目采用AI生成题目
+            throw new RuntimeException("产品没有题目");
+        }
+        //判断该产品是否有正在进行的练习
+        Date createdTime = new Date();
+        LambdaQueryWrapper<AiMemberAnswer> aiMemberAnswerLambdaQueryWrapper = Wrappers.lambdaQuery(AiMemberAnswer.class);
+        aiMemberAnswerLambdaQueryWrapper.eq(AiMemberAnswer::getMemberId,memberUuid);
+        aiMemberAnswerLambdaQueryWrapper.eq(AiMemberAnswer::getProductId,aiProduct.getId());
+        aiMemberAnswerLambdaQueryWrapper.eq(AiMemberAnswer::getState,0);
+        AiMemberAnswer aiMemberAnswer = this.getOneByQuery(aiMemberAnswerLambdaQueryWrapper);
+        if(ObjectUtil.isNull(aiMemberAnswer)){
+            Integer questionCount = aiProduct.getQuestionCount();
+            aiMemberAnswer = new AiMemberAnswer();
+            aiMemberAnswer.setId(UUID.getSimpleUUIDString());
+            aiMemberAnswer.setCreatedTime(createdTime);
+            aiMemberAnswer.setUpdatedTime(createdTime);
+            aiMemberAnswer.setProductId(aiProduct.getId());
+            aiMemberAnswer.setMemberId(memberUuid);
+            aiMemberAnswer.setState(0);
+            aiMemberAnswer.setScore(0);
+            aiMemberAnswer.setQuestionCnt(questionCount);
+            aiMemberAnswer.setDoneCnt(0);
+            aiMemberAnswer.setCorrectCnt(0);
+            aiMemberAnswerMapper.insert(aiMemberAnswer);
+            List<AiMemberAnswerItem> aiMemberAnswerItems = new ArrayList<>();
+            for (int i = 1; i <= questionCount; i++){
+                //初始化答题记录
+                AiProductQuestion aiProductQuestion = aiProductQuestionService.createQuestion(aiProduct.getId());
+                AiMemberAnswerItem aiMemberAnswerItem = new AiMemberAnswerItem();
+                aiMemberAnswerItem.setId(UUID.getSimpleUUIDString());
+                aiMemberAnswerItem.setCreatedTime(createdTime);
+                aiMemberAnswerItem.setAnswerId(aiMemberAnswer.getId());
+                aiMemberAnswerItem.setProductId(aiMemberAnswer.getProductId());
+                aiMemberAnswerItem.setMemberId(memberUuid);
+                aiMemberAnswerItem.setProductQuestionId(aiProductQuestion.getId());
+                aiMemberAnswerItem.setTitle(aiProductQuestion.getTitle());
+                aiMemberAnswerItem.setDifficulty(aiProductQuestion.getDifficulty());
+                aiMemberAnswerItem.setMemberAnswerState(0);
+                aiMemberAnswerItem.setSort( i );
+                aiMemberAnswerItems.add(aiMemberAnswerItem);
+            }
+            aiMemberAnswerItemService.saveBatch(aiMemberAnswerItems);
+            current = 1;
+        }else{
+            current = aiMemberAnswer.getDoneCnt();
+        }
+        apiMemberAnswerVoV2.setCurrent(current);
+
+        return new FebsResponse().success().data(apiMemberAnswerVoV2);
+    }
+
 
     @Override
     public FebsResponse startAnswer(ApiMemberAnswerDto dto) {
diff --git a/src/main/resources/mapper/modules/AiMemberAnswerItemMapper.xml b/src/main/resources/mapper/modules/AiMemberAnswerItemMapper.xml
index b963691..1c01379 100644
--- a/src/main/resources/mapper/modules/AiMemberAnswerItemMapper.xml
+++ b/src/main/resources/mapper/modules/AiMemberAnswerItemMapper.xml
@@ -13,7 +13,6 @@
         from ai_member_answer_item a
         where
               a.answer_id = #{record.memberAnswerId}
-        and a.member_answer_state != 0
         order by a.CREATED_TIME desc
     </select>
 

--
Gitblit v1.9.1