From a34b9a6418a8874dc0851cb4e19d189339dd5133 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Mon, 04 Aug 2025 15:23:35 +0800 Subject: [PATCH] feat(ai): 添加 AI 用户答题功能 --- src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java | 157 ++++++++++++++------------------------------------- 1 files changed, 44 insertions(+), 113 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 9a4d288..ede9b9c 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 @@ -1,9 +1,22 @@ package cc.mrbird.febs.ai.service.impl; import cc.mrbird.febs.ai.entity.AiMemberAnswer; +import cc.mrbird.febs.ai.entity.AiMemberAnswerItem; +import cc.mrbird.febs.ai.entity.AiProduct; +import cc.mrbird.febs.ai.entity.AiProductQuestion; import cc.mrbird.febs.ai.mapper.AiMemberAnswerMapper; +import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerDto; +import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerVo; +import cc.mrbird.febs.ai.service.AiMemberAnswerItemService; import cc.mrbird.febs.ai.service.AiMemberAnswerService; +import cc.mrbird.febs.ai.service.AiProductQuestionService; +import cc.mrbird.febs.ai.service.AiProductService; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.utils.LoginUserUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -24,125 +37,43 @@ public class AiMemberAnswerServiceImpl extends ServiceImpl<AiMemberAnswerMapper, AiMemberAnswer> implements AiMemberAnswerService { private final AiMemberAnswerMapper aiMemberAnswerMapper; + private final AiMemberAnswerItemService aiMemberAnswerItemService; + private final AiProductService aiProductService; + private final AiProductQuestionService aiProductQuestionService; + @Override - public AiMemberAnswer getById(String id) { - return this.getById(id); - } + public FebsResponse startAnswer(ApiMemberAnswerDto dto) { + String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); - @Override - public List<AiMemberAnswer> getByMemberId(String memberId) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getMemberId, memberId); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByProductId(String productId) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getProductId, productId); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getCompanyId, companyId); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByState(Integer state) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getState, state); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByMemberIdAndState(String memberId, Integer state) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getMemberId, memberId); - queryWrapper.eq(AiMemberAnswer::getState, state); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByCompanyIdAndMemberId(String companyId, String memberId) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getCompanyId, companyId); - queryWrapper.eq(AiMemberAnswer::getMemberId, memberId); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByScoreRange(Integer minScore, Integer maxScore) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.ge(AiMemberAnswer::getScore, minScore); - queryWrapper.le(AiMemberAnswer::getScore, maxScore); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveAnswer(AiMemberAnswer aiMemberAnswer) { - try { - return this.save(aiMemberAnswer); - } catch (Exception e) { - log.error("保存答题记录失败: ", e); - return false; + String productId = dto.getId(); + AiProduct aiProduct = aiProductService.getById(productId); + if(ObjectUtil.isNull(aiProduct)){ + throw new RuntimeException("产品不存在"); } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchAnswers(List<AiMemberAnswer> answers) { - try { - return this.saveBatch(answers); - } catch (Exception e) { - log.error("批量保存答题记录失败: ", e); - return false; + //验证产品分类下是否有题目 + 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("产品没有题目"); } - } + ApiMemberAnswerVo apiMemberAnswerVo = new ApiMemberAnswerVo(); + AiMemberAnswer aiMemberAnswer = new AiMemberAnswer(); + aiMemberAnswer.setProductId(aiProduct.getId()); + aiMemberAnswer.setMemberId(memberUuid); + aiMemberAnswer.setQuestionCnt(aiProduct.getQuestionCount()); + aiMemberAnswer.setScore(0); + aiMemberAnswer.setCorrectCnt(0); + aiMemberAnswer.setState(0); + aiMemberAnswerMapper.insert(aiMemberAnswer); - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateAnswer(AiMemberAnswer aiMemberAnswer) { - try { - return this.updateById(aiMemberAnswer); - } catch (Exception e) { - log.error("更新答题记录失败: ", e); - return false; - } - } +// apiMemberAnswerVo.setTitle(); - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除答题记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByMemberId(String memberId) { - try { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getMemberId, memberId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据用户ID删除答题记录失败: ", e); - return false; - } + return new FebsResponse().success().data(apiMemberAnswerVo); } } -- Gitblit v1.9.1