| | |
| | | package cc.mrbird.febs.ai.service.impl; |
| | | |
| | | import cc.mrbird.febs.ai.entity.AiMemberTalk; |
| | | import cc.mrbird.febs.ai.entity.AiMemberTalkItem; |
| | | import cc.mrbird.febs.ai.entity.AiProductRoleLink; |
| | | import cc.mrbird.febs.ai.mapper.AiMemberTalkMapper; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkAnswerDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkDto; |
| | | import cc.mrbird.febs.ai.res.ai.AiResponse; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkVo; |
| | | import cc.mrbird.febs.ai.service.AiMemberTalkItemService; |
| | | import cc.mrbird.febs.ai.service.AiMemberTalkService; |
| | | import cc.mrbird.febs.ai.service.AiProductRoleLinkService; |
| | | import cc.mrbird.febs.ai.service.AiService; |
| | | import cc.mrbird.febs.ai.utils.UUID; |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.common.utils.LoginUserUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | 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; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.List; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * AI用户对话训练记录 Service实现类 |
| | |
| | | public class AiMemberTalkServiceImpl extends ServiceImpl<AiMemberTalkMapper, AiMemberTalk> implements AiMemberTalkService { |
| | | |
| | | private final AiMemberTalkMapper aiMemberTalkMapper; |
| | | private final AiProductRoleLinkService aiProductRoleLinkService; |
| | | private final AiMemberTalkItemService aiMemberTalkItemService; |
| | | private final AiService aiService; |
| | | |
| | | |
| | | @Override |
| | | public AiMemberTalk getById(String id) { |
| | | return this.getById(id); |
| | | return aiMemberTalkMapper.selectById( id); |
| | | } |
| | | |
| | | @Override |
| | | public List<AiMemberTalk> getByMemberId(String memberId) { |
| | | LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(AiMemberTalk::getMemberId, memberId); |
| | | queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime); |
| | | return this.list(queryWrapper); |
| | | } |
| | | public FebsResponse start(ApiMemberTalkDto dto) { |
| | | |
| | | @Override |
| | | public List<AiMemberTalk> getByProductId(String productId) { |
| | | LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(AiMemberTalk::getProductId, productId); |
| | | queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime); |
| | | return this.list(queryWrapper); |
| | | } |
| | | String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); |
| | | String productId = dto.getId(); |
| | | |
| | | @Override |
| | | public List<AiMemberTalk> getByProductRoleId(String productRoleId) { |
| | | LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(AiMemberTalk::getProductRoleId, productRoleId); |
| | | queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime); |
| | | return this.list(queryWrapper); |
| | | } |
| | | |
| | | @Override |
| | | public List<AiMemberTalk> getByCompanyId(String companyId) { |
| | | LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(AiMemberTalk::getCompanyId, companyId); |
| | | queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime); |
| | | return this.list(queryWrapper); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean saveTalk(AiMemberTalk aiMemberTalk) { |
| | | try { |
| | | return this.save(aiMemberTalk); |
| | | } catch (Exception e) { |
| | | log.error("保存对话记录失败: ", e); |
| | | return false; |
| | | LambdaQueryWrapper<AiProductRoleLink> productLinkQuery = Wrappers.lambdaQuery(AiProductRoleLink.class); |
| | | productLinkQuery.eq(AiProductRoleLink::getProductId,productId); |
| | | productLinkQuery.last("limit 1"); |
| | | AiProductRoleLink aiProductRoleLink = aiProductRoleLinkService.getByQuery(productLinkQuery); |
| | | if(ObjectUtil.isNull(aiProductRoleLink)){ |
| | | throw new RuntimeException("产品AI陪练不存在"); |
| | | } |
| | | |
| | | Date nowTime = new Date(); |
| | | LambdaQueryWrapper<AiMemberTalk> query = Wrappers.lambdaQuery(AiMemberTalk.class); |
| | | query.eq(AiMemberTalk::getMemberId,memberUuid); |
| | | query.eq(AiMemberTalk::getProductId,productId); |
| | | query.last("limit 1"); |
| | | AiMemberTalk aiMemberTalk = this.getByQuery(query); |
| | | if (ObjectUtil.isNull(aiMemberTalk)){ |
| | | aiMemberTalk = this.add(memberUuid,productId,nowTime); |
| | | } |
| | | |
| | | AiResponse aiResponse = aiService.start(aiProductRoleLink.getProductRoleId(),"开始出题"); |
| | | if(aiResponse.getCode().equals("200")){ |
| | | aiMemberTalkItemService.add(memberUuid,aiMemberTalk.getId(),1,aiResponse.getResContext(),nowTime); |
| | | this.updateTimeUpdate(nowTime,aiMemberTalk.getId()); |
| | | }else{ |
| | | throw new RuntimeException(aiResponse.getDescription()); |
| | | } |
| | | ApiMemberTalkVo apiMemberTalkVo = new ApiMemberTalkVo(); |
| | | apiMemberTalkVo.setMemberTalkId(aiMemberTalk.getId()); |
| | | apiMemberTalkVo.setType(1); |
| | | apiMemberTalkVo.setContext(aiResponse.getResContext()); |
| | | |
| | | return new FebsResponse().success().data(apiMemberTalkVo); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean saveBatchTalks(List<AiMemberTalk> talks) { |
| | | try { |
| | | return this.saveBatch(talks); |
| | | } catch (Exception e) { |
| | | log.error("批量保存对话记录失败: ", e); |
| | | return false; |
| | | } |
| | | public AiMemberTalk getByQuery(LambdaQueryWrapper<AiMemberTalk> query) { |
| | | return aiMemberTalkMapper.selectOne( query); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean updateTalk(AiMemberTalk aiMemberTalk) { |
| | | try { |
| | | return this.updateById(aiMemberTalk); |
| | | } catch (Exception e) { |
| | | log.error("更新对话记录失败: ", e); |
| | | return false; |
| | | public void updateTimeUpdate(Date nowTime, String id) { |
| | | aiMemberTalkMapper.update( |
| | | null, |
| | | Wrappers.lambdaUpdate(AiMemberTalk.class) |
| | | .set(AiMemberTalk::getUpdatedTime,nowTime) |
| | | .eq(AiMemberTalk::getId,id)); |
| | | } |
| | | |
| | | |
| | | public static final String ANSWER_FORMAT = "{}/n回答:{}/n请根据回答给出以下四个方面的总结,这个四个方面分别是亮点、建议、参考答案和核心知识点回顾。重点:四个方面的总结都是必须要有内容。"; |
| | | @Override |
| | | public FebsResponse answer(ApiMemberTalkAnswerDto dto) { |
| | | String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); |
| | | String memberTalkId = dto.getId(); |
| | | AiMemberTalk aiMemberTalk = this.getById(memberTalkId); |
| | | if (ObjectUtil.isNull(aiMemberTalk)){ |
| | | throw new RuntimeException("产品AI陪练对话不存在"); |
| | | } |
| | | |
| | | LambdaQueryWrapper<AiProductRoleLink> productLinkQuery = Wrappers.lambdaQuery(AiProductRoleLink.class); |
| | | productLinkQuery.eq(AiProductRoleLink::getProductId,aiMemberTalk.getProductId()); |
| | | productLinkQuery.last("limit 1"); |
| | | AiProductRoleLink aiProductRoleLink = aiProductRoleLinkService.getByQuery(productLinkQuery); |
| | | if(ObjectUtil.isNull(aiProductRoleLink)){ |
| | | throw new RuntimeException("产品AI陪练不存在"); |
| | | } |
| | | |
| | | String reqContext = dto.getReqContext(); |
| | | |
| | | LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery = Wrappers.lambdaQuery(AiMemberTalkItem.class); |
| | | memberTalkItemQuery.eq(AiMemberTalkItem::getMemberId,memberUuid); |
| | | memberTalkItemQuery.eq(AiMemberTalkItem::getMemberTalkId,memberTalkId); |
| | | memberTalkItemQuery.eq(AiMemberTalkItem::getType,1); |
| | | memberTalkItemQuery.orderByDesc(AiMemberTalkItem::getCreatedTime); |
| | | memberTalkItemQuery.last("limit 1"); |
| | | AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.getByQuery(memberTalkItemQuery); |
| | | aiMemberTalkItemService.add(memberUuid,aiMemberTalk.getId(),2,reqContext,new Date()); |
| | | |
| | | String format = StrUtil.format(ANSWER_FORMAT, aiMemberTalkItem.getContext(), reqContext); |
| | | log.info("format:{}",format); |
| | | AiResponse aiResponse = aiService.start(aiProductRoleLink.getProductRoleId(), format); |
| | | if(aiResponse.getCode().equals("200")){ |
| | | Date nowTime = new Date(); |
| | | aiMemberTalkItemService.add(memberUuid,aiMemberTalk.getId(),3,aiResponse.getResContext(),nowTime); |
| | | this.updateTimeUpdate(nowTime,aiMemberTalk.getId()); |
| | | }else{ |
| | | throw new RuntimeException(aiResponse.getDescription()); |
| | | } |
| | | ApiMemberTalkVo apiMemberTalkVo = new ApiMemberTalkVo(); |
| | | apiMemberTalkVo.setMemberTalkId(aiMemberTalk.getId()); |
| | | apiMemberTalkVo.setType(1); |
| | | apiMemberTalkVo.setContext(aiResponse.getResContext()); |
| | | |
| | | return new FebsResponse().success().data(apiMemberTalkVo); |
| | | } |
| | | |
| | | @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<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(AiMemberTalk::getMemberId, memberId); |
| | | return this.remove(queryWrapper); |
| | | } catch (Exception e) { |
| | | log.error("根据用户ID删除对话记录失败: ", e); |
| | | return false; |
| | | } |
| | | public AiMemberTalk add(String memberUuid, String productId, Date nowTime) { |
| | | AiMemberTalk aiMemberTalk = new AiMemberTalk(); |
| | | aiMemberTalk.setId(UUID.getSimpleUUIDString()); |
| | | aiMemberTalk.setCreatedTime(nowTime); |
| | | aiMemberTalk.setMemberId(memberUuid); |
| | | aiMemberTalk.setProductId(productId); |
| | | aiMemberTalkMapper.insert(aiMemberTalk); |
| | | return aiMemberTalk; |
| | | } |
| | | } |