From 8130bed63a505cf718481c0d95d3fcf7b037db96 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Tue, 16 Sep 2025 15:11:45 +0800 Subject: [PATCH] refactor(ai): 优化代码结构和更新时间处理 --- src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java | 181 +++++++++++++++++++++++++++++++++++++++------ 1 files changed, 156 insertions(+), 25 deletions(-) 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 9a1587e..2434673 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,16 +2,14 @@ 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; import cc.mrbird.febs.ai.service.*; import cc.mrbird.febs.ai.utils.UUID; import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.LoginUserUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUnit; @@ -56,6 +54,82 @@ return aiMemberAnswerMapper.selectOne(aiMemberAnswerLambdaQueryWrapper); } + @Override + public FebsResponse startAnswerV2(ApiMemberAnswerDto dto) { + String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); + ApiMemberAnswerVoV2 apiMemberAnswerVoV2 = new ApiMemberAnswerVoV2(); + + String productId = dto.getId(); + AiProduct aiProduct = aiProductService.getById(productId); + if(ObjectUtil.isNull(aiProduct)){ + throw new FebsException("产品不存在"); + } + String companyId = aiProduct.getCompanyId(); + //验证产品分类下是否有题目 + 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 FebsException("产品没有题目"); + } + //判断该产品是否有正在进行的练习 + 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.setCompanyId(companyId); + 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.setCompanyId(companyId); + 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); + apiMemberAnswerVoV2.setCurrent(1); + }else{ + if (aiMemberAnswer.getQuestionCnt() > aiMemberAnswer.getDoneCnt()){ + apiMemberAnswerVoV2.setCurrent(aiMemberAnswer.getDoneCnt() + 1); + }else{ + apiMemberAnswerVoV2.setCurrent(aiMemberAnswer.getDoneCnt()); + } + } + apiMemberAnswerVoV2.setMemberAnswerId(aiMemberAnswer.getId()); + + return new FebsResponse().success().data(apiMemberAnswerVoV2); + } + @Override public FebsResponse startAnswer(ApiMemberAnswerDto dto) { @@ -64,7 +138,7 @@ String productId = dto.getId(); AiProduct aiProduct = aiProductService.getById(productId); if(ObjectUtil.isNull(aiProduct)){ - throw new RuntimeException("产品不存在"); + throw new FebsException("产品不存在"); } //验证产品分类下是否有题目 String productCategoryId = aiProduct.getProductCategoryId(); @@ -75,9 +149,10 @@ List<AiProductQuestion> aiProductQuestions = aiProductQuestionService.getListByQuery(questionLambdaQueryWrapper); if(CollUtil.isEmpty(aiProductQuestions)){ // todo 没有题目采用AI生成题目 - throw new RuntimeException("产品没有题目"); + throw new FebsException("产品没有题目"); } //判断该产品是否有正在进行的练习 + Date createdTime = new Date(); LambdaQueryWrapper<AiMemberAnswer> aiMemberAnswerLambdaQueryWrapper = Wrappers.lambdaQuery(AiMemberAnswer.class); aiMemberAnswerLambdaQueryWrapper.eq(AiMemberAnswer::getMemberId,memberUuid); aiMemberAnswerLambdaQueryWrapper.eq(AiMemberAnswer::getProductId,aiProduct.getId()); @@ -86,7 +161,6 @@ if(ObjectUtil.isNull(aiMemberAnswer)){ aiMemberAnswer = new AiMemberAnswer(); aiMemberAnswer.setId(UUID.getSimpleUUIDString()); - Date createdTime = new Date(); aiMemberAnswer.setCreatedTime(createdTime); aiMemberAnswer.setUpdatedTime(createdTime); aiMemberAnswer.setProductId(aiProduct.getId()); @@ -104,6 +178,7 @@ } ApiMemberAnswerVo apiMemberAnswerVo = new ApiMemberAnswerVo(); + apiMemberAnswerVo.setMemberAnswerId(aiMemberAnswer.getId()); apiMemberAnswerVo.setName(aiProduct.getName()); apiMemberAnswerVo.setQuestionCnt(aiMemberAnswer.getQuestionCnt()); apiMemberAnswerVo.setDoneCnt(aiMemberAnswer.getDoneCnt()); @@ -115,6 +190,21 @@ apiMemberAnswerVo.setProductQuestionId(aiProductQuestion.getId()); apiMemberAnswerVo.setTitle(aiProductQuestion.getTitle()); apiMemberAnswerVo.setDifficulty(aiProductQuestion.getDifficulty()); + + //初始化答题记录 + 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); + aiMemberAnswerItemService.save(aiMemberAnswerItem); + apiMemberAnswerVo.setMemberAnswerState(aiMemberAnswerItem.getMemberAnswerState()); + apiMemberAnswerVo.setMemberAnswerItemId(aiMemberAnswerItem.getId()); List<ApiMemberAnswerItemVo> answerList = new ArrayList<>(); LambdaQueryWrapper<AiProductQuestionItem> productQuestionItemLambdaQueryWrapper = Wrappers.lambdaQuery(AiProductQuestionItem.class); @@ -156,24 +246,19 @@ String productQuestionItemId = dto.getId(); String productQuestionId = dto.getProductQuestionId(); String memberAnswerId = dto.getMemberAnswerId(); + String memberAnswerItemId = dto.getMemberAnswerItemId(); AiMemberAnswer aiMemberAnswer = this.getById(memberAnswerId); if(ObjectUtil.isNull(aiMemberAnswer)){ - throw new RuntimeException("答题记录不存在"); + throw new FebsException("答题记录不存在"); } - Date createdTime = new Date(); - AiMemberAnswerItem aiMemberAnswerItem = new AiMemberAnswerItem(); - aiMemberAnswerItem.setId(UUID.getSimpleUUIDString()); - aiMemberAnswerItem.setCreatedTime(createdTime); - aiMemberAnswerItem.setAnswerId(aiMemberAnswer.getId()); - aiMemberAnswerItem.setProductId(aiMemberAnswer.getProductId()); - aiMemberAnswerItem.setMemberId(memberUuid); - aiMemberAnswerItem.setProductQuestionId(productQuestionId); + Date nowTime = new Date(); + String companyId = aiMemberAnswer.getCompanyId(); + AiMemberAnswerItem aiMemberAnswerItem = aiMemberAnswerItemService.getById(memberAnswerItemId); + aiMemberAnswerItem.setUpdatedTime(nowTime); AiProductQuestion aiProductQuestion = aiProductQuestionService.getById(productQuestionId); - aiMemberAnswerItem.setTitle(aiProductQuestion.getTitle()); - aiMemberAnswerItem.setDifficulty(aiProductQuestion.getDifficulty()); LambdaQueryWrapper<AiProductQuestionItem> productQuestionItemLambdaQueryWrapper = Wrappers.lambdaQuery(AiProductQuestionItem.class); productQuestionItemLambdaQueryWrapper.eq(AiProductQuestionItem::getProductQuestionId,aiProductQuestion.getId()); @@ -184,6 +269,9 @@ aiMemberAnswerItem.setAnswer(aiProductQuestionItem.getId()); aiMemberAnswerItem.setCorrectAnswer(aiProductQuestionItem.getCorrectAnswer()); aiMemberAnswerItem.setAnswerAnalysis(aiProductQuestionItem.getAnswerAnalysis()); + + apiQuestionItemInfoVo.setAnswerID(aiProductQuestionItem.getId()); + apiQuestionItemInfoVo.setAnswer(aiProductQuestionItem.getAnswer()); } aiMemberAnswerItem.setMemberAnswerQuestionId(productQuestionItemId); aiMemberAnswerItem.setMemberAnswerState( @@ -191,19 +279,23 @@ ); if (aiMemberAnswerItem.getMemberAnswerState() == 2){ aiMemberAnswerItem.setIsCollected(1); + }else{ + aiMemberAnswerItem.setIsCollected(0); } - aiMemberAnswerItemService.save(aiMemberAnswerItem); + aiMemberAnswerItem.setCompanyId(companyId); + aiMemberAnswerItemService.updateById(aiMemberAnswerItem); aiMemberAnswer.setDoneCnt(aiMemberAnswer.getDoneCnt() + 1); if (aiMemberAnswerItem.getMemberAnswerState() == 1){ aiMemberAnswer.setCorrectCnt(aiMemberAnswer.getCorrectCnt() + 1); } - aiMemberAnswer.setUpdatedTime(createdTime); - this.updateById(aiMemberAnswer); + aiMemberAnswer.setUpdatedTime(nowTime); + aiMemberAnswerMapper.updateById(aiMemberAnswer); - apiQuestionItemInfoVo.setAnswer(aiMemberAnswerItem.getAnswer()); apiQuestionItemInfoVo.setAnswerAnalysis(aiMemberAnswerItem.getAnswerAnalysis()); apiQuestionItemInfoVo.setMemberAnswerState(aiMemberAnswerItem.getMemberAnswerState()); + apiQuestionItemInfoVo.setQuestionCnt(aiMemberAnswer.getQuestionCnt()); + apiQuestionItemInfoVo.setDoneCnt(aiMemberAnswer.getDoneCnt()); return new FebsResponse().success().data(apiQuestionItemInfoVo); } @@ -228,6 +320,15 @@ long between = DateUtil.between(createdTime, updatedTime, DateUnit.MINUTE); apiMemberAnswerInsureVo.setUseTime(between); + apiMemberAnswerInsureVo.setProductId(aiMemberAnswer.getProductId()); + + aiMemberAnswerMapper.update(null, + Wrappers.lambdaUpdate(AiMemberAnswer.class) + .set(AiMemberAnswer::getUpdatedTime, new Date()) + .set(AiMemberAnswer::getState, 1) + .set(AiMemberAnswer::getScore, percentage.intValue()) + .eq(AiMemberAnswer::getId, memberAnswerId) + ); return new FebsResponse().success().data(apiMemberAnswerInsureVo); } @@ -235,14 +336,13 @@ public FebsResponse previous(ApiMemberAnswerPreviousDto dto) { String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); - ApiMemberAnswerPreviousVo apiMemberAnswerPreviousVo = new ApiMemberAnswerPreviousVo(); // 创建分页对象,传入当前页和每页大小 Page<ApiMemberAnswerPreviousVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); Page<ApiMemberAnswerPreviousVo> pageListByQuery = aiMemberAnswerItemService.getPageListByQuery(page, dto); List<ApiMemberAnswerPreviousVo> records = pageListByQuery.getRecords(); if (CollUtil.isNotEmpty(records)){ - apiMemberAnswerPreviousVo = records.get(0); + ApiMemberAnswerPreviousVo apiMemberAnswerPreviousVo = records.get(0); String memberAnswerId = apiMemberAnswerPreviousVo.getMemberAnswerId(); AiMemberAnswer aiMemberAnswer = this.getById(memberAnswerId); @@ -250,6 +350,7 @@ AiProduct aiProduct = aiProductService.getById(productId); apiMemberAnswerPreviousVo.setName(aiProduct.getName()); apiMemberAnswerPreviousVo.setQuestionCnt(aiMemberAnswer.getQuestionCnt()); + apiMemberAnswerPreviousVo.setDoneCnt(aiMemberAnswer.getDoneCnt()); String productQuestionId = apiMemberAnswerPreviousVo.getProductQuestionId(); AiProductQuestion aiProductQuestion = aiProductQuestionService.getById(productQuestionId); @@ -273,6 +374,36 @@ apiMemberAnswerPreviousVo.setAnswerList(answerList); } } - return new FebsResponse().success().data(apiMemberAnswerPreviousVo); + return new FebsResponse().success().data(pageListByQuery); + } + + @Override + public FebsResponse wrongPage(ApiMemberAnswerWrongPageDto dto) { + + + String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); + dto.setMemberUuid(memberUuid); + return aiMemberAnswerItemService.wrongPage(dto); + } + + @Override + public FebsResponse myWork(ApiMemberProductWorkPageDto dto) { + String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); + dto.setMemberUuid(memberUuid); + // 创建分页对象,传入当前页和每页大小 + Page<ApiMemberProductWorkVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); + Page<ApiMemberProductWorkVo> pageListByQuery = this.getBaseMapper().getPageMyWorkListByQuery(page, dto); + + return new FebsResponse().success().data(pageListByQuery); + } + + @Override + public void updateMemberAnswerUpdateTime(String memberAnswerId, Date updateTime) { + aiMemberAnswerMapper.update( + null, + Wrappers.lambdaUpdate(AiMemberAnswer.class) + .set(AiMemberAnswer::getUpdatedTime,updateTime) + .eq(AiMemberAnswer::getId,memberAnswerId) + ); } } -- Gitblit v1.9.1