From 50e115e0161091385286ab2462b09018b4f18456 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Wed, 13 Aug 2025 11:16:25 +0800 Subject: [PATCH] feat(ai): 新增错题集功能 --- src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java | 7 - src/main/resources/mapper/modules/AiMemberAnswerItemMapper.xml | 14 +++ src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java | 14 ++- src/main/java/cc/mrbird/febs/ai/controller/memberAnswer/ApiMemberAnswerController.java | 22 +++-- src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerItemMapper.java | 4 + src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java | 4 + src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiMemberAnswerWrongVo.java | 33 ++++++++ src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java | 57 ++++++++++++++ src/main/java/cc/mrbird/febs/ai/req/memberAnswer/ApiMemberAnswerWrongPageDto.java | 26 ++++++ 9 files changed, 165 insertions(+), 16 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 eb44e4a..99dd2db 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 @@ -1,14 +1,10 @@ package cc.mrbird.febs.ai.controller.memberAnswer; -import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerDto; -import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerInsureDto; -import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerPreviousDto; -import cc.mrbird.febs.ai.req.memberAnswer.ApiQuestionAnswerDto; +import cc.mrbird.febs.ai.req.memberAnswer.*; +import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; import cc.mrbird.febs.ai.req.product.ApiProductInfoDto; -import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerInsureVo; -import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerPreviousVo; -import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerVo; -import cc.mrbird.febs.ai.res.memberAnswer.ApiQuestionItemInfoVo; +import cc.mrbird.febs.ai.res.memberAnswer.*; +import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo; import cc.mrbird.febs.ai.res.product.ApiProductInfoVo; import cc.mrbird.febs.ai.service.AiMemberAnswerService; import cc.mrbird.febs.common.entity.FebsResponse; @@ -76,4 +72,14 @@ return apiMemberAnswerService.previous(dto); } + + @ApiOperation(value = "错题集记录分页查询", notes = "错题集记录分页查询") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = ApiMemberAnswerWrongVo.class) + }) + @PostMapping(value = "/wrongPage") + public FebsResponse wrongPage(@RequestBody @Validated ApiMemberAnswerWrongPageDto dto) { + + return apiMemberAnswerService.wrongPage(dto); + } } diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerItemMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerItemMapper.java index b2b1331..948f320 100644 --- a/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerItemMapper.java +++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerItemMapper.java @@ -2,7 +2,9 @@ import cc.mrbird.febs.ai.entity.AiMemberAnswerItem; import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerPreviousDto; +import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerWrongPageDto; import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerPreviousVo; +import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerWrongVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; @@ -16,4 +18,6 @@ public interface AiMemberAnswerItemMapper extends BaseMapper<AiMemberAnswerItem> { Page<ApiMemberAnswerPreviousVo> selectPageListByQuery(Page<ApiMemberAnswerPreviousVo> page, @Param("record") ApiMemberAnswerPreviousDto dto); + + Page<ApiMemberAnswerWrongVo> getWrongPageListByQuery(Page<ApiMemberAnswerWrongVo> page,@Param("record") ApiMemberAnswerWrongPageDto dto); } diff --git a/src/main/java/cc/mrbird/febs/ai/req/memberAnswer/ApiMemberAnswerWrongPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/memberAnswer/ApiMemberAnswerWrongPageDto.java new file mode 100644 index 0000000..8c7169d --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/req/memberAnswer/ApiMemberAnswerWrongPageDto.java @@ -0,0 +1,26 @@ +package cc.mrbird.febs.ai.req.memberAnswer; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiMemberAnswerWrongPageDto", description = "参数") +public class ApiMemberAnswerWrongPageDto { + + @NotNull(message = "页码不能为空") + @ApiModelProperty(value = "页码", example = "1") + private Integer pageNow; + + @NotNull(message = "每页数量不能为空") + @ApiModelProperty(value = "每页数量", example = "10") + private Integer pageSize; + + @ApiModelProperty(hidden = true) + private String memberUuid; +} diff --git a/src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiMemberAnswerWrongVo.java b/src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiMemberAnswerWrongVo.java new file mode 100644 index 0000000..66705f4 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiMemberAnswerWrongVo.java @@ -0,0 +1,33 @@ +package cc.mrbird.febs.ai.res.memberAnswer; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiMemberAnswerWrongVo", description = "参数") +public class ApiMemberAnswerWrongVo { + + @ApiModelProperty(value = "题目") + private String title; + + @ApiModelProperty(value = "难度:1-简单,2-中等,3-困难") + private Integer difficulty; + + @ApiModelProperty(value = "用户答题答案ID") + private String memberAnswerQuestionId; + + @ApiModelProperty(value = "答案解析") + private String answerAnalysis; + + @ApiModelProperty(value = "题目ID") + private String productQuestionId; + + @ApiModelProperty(value = "选项") + private List<ApiMemberAnswerPreviousItemVo> answerList; +} diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java index ac40919..1743108 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java @@ -2,7 +2,9 @@ import cc.mrbird.febs.ai.entity.AiMemberAnswerItem; import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerPreviousDto; +import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerWrongPageDto; import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerPreviousVo; +import cc.mrbird.febs.common.entity.FebsResponse; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -16,4 +18,6 @@ Page<ApiMemberAnswerPreviousVo> getPageListByQuery(Page<ApiMemberAnswerPreviousVo> page, ApiMemberAnswerPreviousDto dto); + + FebsResponse wrongPage(ApiMemberAnswerWrongPageDto dto); } 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 5e2e55c..6fac5df 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java @@ -1,10 +1,7 @@ package cc.mrbird.febs.ai.service; import cc.mrbird.febs.ai.entity.AiMemberAnswer; -import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerDto; -import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerInsureDto; -import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerPreviousDto; -import cc.mrbird.febs.ai.req.memberAnswer.ApiQuestionAnswerDto; +import cc.mrbird.febs.ai.req.memberAnswer.*; import cc.mrbird.febs.common.entity.FebsResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; @@ -29,4 +26,6 @@ FebsResponse insure(ApiMemberAnswerInsureDto dto); FebsResponse previous(ApiMemberAnswerPreviousDto dto); + + FebsResponse wrongPage(ApiMemberAnswerWrongPageDto dto); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java index 2512716..47ccb3b 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java @@ -1,15 +1,31 @@ package cc.mrbird.febs.ai.service.impl; import cc.mrbird.febs.ai.entity.AiMemberAnswerItem; +import cc.mrbird.febs.ai.entity.AiProductQuestionItem; import cc.mrbird.febs.ai.mapper.AiMemberAnswerItemMapper; import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerPreviousDto; +import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerWrongPageDto; +import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerPreviousItemVo; import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerPreviousVo; +import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerWrongVo; +import cc.mrbird.febs.ai.res.product.ApiProductVo; import cc.mrbird.febs.ai.service.AiMemberAnswerItemService; +import cc.mrbird.febs.ai.service.AiProductQuestionItemService; +import cc.mrbird.febs.common.entity.FebsResponse; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; /** * AI用户答题记录子表 Service实现类 @@ -23,9 +39,50 @@ public class AiMemberAnswerItemServiceImpl extends ServiceImpl<AiMemberAnswerItemMapper, AiMemberAnswerItem> implements AiMemberAnswerItemService { private final AiMemberAnswerItemMapper aiMemberAnswerItemMapper; + private final AiProductQuestionItemService aiProductQuestionItemService; @Override public Page<ApiMemberAnswerPreviousVo> getPageListByQuery(Page<ApiMemberAnswerPreviousVo> page, ApiMemberAnswerPreviousDto dto) { return aiMemberAnswerItemMapper.selectPageListByQuery(page, dto); } + + @Override + public FebsResponse wrongPage(ApiMemberAnswerWrongPageDto dto) { + // 创建分页对象,传入当前页和每页大小 + Page<ApiMemberAnswerWrongVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); + Page<ApiMemberAnswerWrongVo> pageListByQuery = aiMemberAnswerItemMapper.getWrongPageListByQuery(page, dto); + List<ApiMemberAnswerWrongVo> records = pageListByQuery.getRecords(); + if (CollUtil.isNotEmpty(records)){ + Set<String> collect = records.stream().map(ApiMemberAnswerWrongVo::getProductQuestionId).collect(Collectors.toSet()); + + LambdaQueryWrapper<AiProductQuestionItem> questionItemQuery = Wrappers.lambdaQuery(AiProductQuestionItem.class); + questionItemQuery.in(AiProductQuestionItem::getProductQuestionId,collect); + List<AiProductQuestionItem> listByQuery = aiProductQuestionItemService.getListByQuery(questionItemQuery); + + if (CollUtil.isNotEmpty(listByQuery)){ + //利用stream流,操作集合listByQuery,返回一个map对象,key为productQuestionId,value为List<AiProductQuestionItem>对象 + Map<String, List<AiProductQuestionItem>> questionItemMap = + listByQuery.stream().collect(Collectors.groupingBy(AiProductQuestionItem::getProductQuestionId)); + + for (ApiMemberAnswerWrongVo record : records){ + String productQuestionId = record.getProductQuestionId(); + + List<AiProductQuestionItem> questionItemList = questionItemMap.get(productQuestionId); + List<ApiMemberAnswerPreviousItemVo> answerList = new ArrayList<>(); + if (CollUtil.isNotEmpty(questionItemList)){ + for (AiProductQuestionItem questionItem : questionItemList){ + ApiMemberAnswerPreviousItemVo itemVo = new ApiMemberAnswerPreviousItemVo(); + itemVo.setId(questionItem.getId()); + itemVo.setAnswer(questionItem.getAnswer()); + itemVo.setAnswerAnalysis(questionItem.getAnswerAnalysis()); + itemVo.setCorrectAnswer(questionItem.getCorrectAnswer()); + answerList.add(itemVo); + } + } + record.setAnswerList(answerList); + } + } + } + return new FebsResponse().success().data(pageListByQuery); + } } 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 4f81043..39fe521 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 @@ -2,10 +2,7 @@ import cc.mrbird.febs.ai.entity.*; import cc.mrbird.febs.ai.mapper.AiMemberAnswerMapper; -import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerDto; -import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerInsureDto; -import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerPreviousDto; -import cc.mrbird.febs.ai.req.memberAnswer.ApiQuestionAnswerDto; +import cc.mrbird.febs.ai.req.memberAnswer.*; import cc.mrbird.febs.ai.res.memberAnswer.*; import cc.mrbird.febs.ai.res.product.ApiProductVo; import cc.mrbird.febs.ai.res.productQuestionItem.ApiMemberAnswerItemVo; @@ -282,4 +279,13 @@ } return new FebsResponse().success().data(apiMemberAnswerPreviousVo); } + + @Override + public FebsResponse wrongPage(ApiMemberAnswerWrongPageDto dto) { + + + String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); + dto.setMemberUuid(memberUuid); + return aiMemberAnswerItemService.wrongPage(dto); + } } diff --git a/src/main/resources/mapper/modules/AiMemberAnswerItemMapper.xml b/src/main/resources/mapper/modules/AiMemberAnswerItemMapper.xml index e343ce2..1c01379 100644 --- a/src/main/resources/mapper/modules/AiMemberAnswerItemMapper.xml +++ b/src/main/resources/mapper/modules/AiMemberAnswerItemMapper.xml @@ -15,4 +15,18 @@ a.answer_id = #{record.memberAnswerId} order by a.CREATED_TIME desc </select> + + <select id="getWrongPageListByQuery" resultType="cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerWrongVo"> + select + a.title as title, + a.difficulty as difficulty, + a.member_answer_question_id as memberAnswerQuestionId, + a.answer_analysis as answerAnalysis, + a.product_question_id as productQuestionId + from ai_member_answer_item a + where + a.member_id = #{record.memberUuid} + and a.is_collected = 1 + order by a.CREATED_TIME desc + </select> </mapper> \ No newline at end of file -- Gitblit v1.9.1