From 2be073dedb043f63700484fab18e4a0ffe1d5e09 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Wed, 13 Aug 2025 10:12:49 +0800 Subject: [PATCH] feat(ai): 添加对话记录分页查询功能 --- src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java | 13 ++++ src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java | 4 + src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkVo.java | 2 src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java | 3 + src/main/java/cc/mrbird/febs/ai/res/ai/Report.java | 8 +- src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java | 26 ++++++-- src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkController.java | 14 ++++ src/main/java/cc/mrbird/febs/ai/mapper/AiMemberTalkItemMapper.java | 5 + src/main/java/cc/mrbird/febs/ai/req/memberTalk/ApiMemberTalkItemPageDto.java | 34 +++++++++++ src/main/resources/mapper/modules/AiMemberTalkItemMapper.xml | 20 ++++++ src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkItemVo.java | 43 ++++++++++++++ 11 files changed, 160 insertions(+), 12 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkController.java index ca256ba..a2d4df5 100644 --- a/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkController.java +++ b/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkController.java @@ -2,6 +2,8 @@ import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkAnswerDto; import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkDto; +import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; +import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo; import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkVo; import cc.mrbird.febs.ai.service.AiMemberTalkService; import cc.mrbird.febs.common.entity.FebsResponse; @@ -15,7 +17,9 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; +import javax.servlet.http.HttpServletRequest; import java.io.IOException; +import java.util.List; /** * @author Administrator @@ -52,6 +56,16 @@ return aiMemberTalkService.answer(dto); } + @ApiOperation(value = "对话记录分页查询", notes = "对话记录分页查询") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = ApiMemberTalkItemVo.class) + }) + @PostMapping(value = "/historyPage") + public FebsResponse historyPage(@RequestBody @Validated ApiMemberTalkItemPageDto dto) { + + return aiMemberTalkService.historyPage(dto); + } + @PostMapping("/start-stream") @ApiOperation("开始AI对话(流式)") @ApiResponses({ diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberTalkItemMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberTalkItemMapper.java index e960267..44461f2 100644 --- a/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberTalkItemMapper.java +++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberTalkItemMapper.java @@ -1,7 +1,11 @@ package cc.mrbird.febs.ai.mapper; import cc.mrbird.febs.ai.entity.AiMemberTalkItem; +import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; +import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo; +import cc.mrbird.febs.ai.res.product.ApiProductVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; /** * AI用户对话训练记录子表 Mapper接口 @@ -11,4 +15,5 @@ */ public interface AiMemberTalkItemMapper extends BaseMapper<AiMemberTalkItem> { + Page<ApiMemberTalkItemVo> getPageListByQuery(Page<ApiMemberTalkItemVo> page, ApiMemberTalkItemPageDto dto); } diff --git a/src/main/java/cc/mrbird/febs/ai/req/memberTalk/ApiMemberTalkItemPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/memberTalk/ApiMemberTalkItemPageDto.java new file mode 100644 index 0000000..4d322d4 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/req/memberTalk/ApiMemberTalkItemPageDto.java @@ -0,0 +1,34 @@ +package cc.mrbird.febs.ai.req.memberTalk; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiMemberTalkDto", description = "参数") +public class ApiMemberTalkItemPageDto { + + @NotNull(message = "页码不能为空") + @ApiModelProperty(value = "页码", example = "1") + private Integer pageNow; + + @NotNull(message = "每页数量不能为空") + @ApiModelProperty(value = "每页数量", example = "10") + private Integer pageSize; + + @NotNull(message = "会话ID不能为空") + @ApiModelProperty(value = "会话ID", example = "1") + private String memberTalkId; + + @ApiModelProperty(value = "消息ID") + private String memberTalkItemId; + + @ApiModelProperty(hidden = true) + private String memberUuid; + +} diff --git a/src/main/java/cc/mrbird/febs/ai/res/ai/Report.java b/src/main/java/cc/mrbird/febs/ai/res/ai/Report.java index f073ac1..2ce4d17 100644 --- a/src/main/java/cc/mrbird/febs/ai/res/ai/Report.java +++ b/src/main/java/cc/mrbird/febs/ai/res/ai/Report.java @@ -15,10 +15,10 @@ public class Report { - - @ApiModelProperty(value = "雷达图表数据") - @JsonProperty("radar_data") - private RadarData radarData; +// +// @ApiModelProperty(value = "雷达图表数据") +// @JsonProperty("radar_data") +// private RadarData radarData; @ApiModelProperty(value = "雷达图表数据集合") @JsonProperty("radar_data_items") diff --git a/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkItemVo.java b/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkItemVo.java new file mode 100644 index 0000000..2fa2d27 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkItemVo.java @@ -0,0 +1,43 @@ +package cc.mrbird.febs.ai.res.memberTalk; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiMemberTalkItemVo", description = "参数") +public class ApiMemberTalkItemVo { + + /** + * 用户对话ID (UUID) + */ + + @ApiModelProperty(value = "会话ID") + private String memberTalkId; + + /** + * 用户消息ID (UUID) + */ + + @ApiModelProperty(value = "消息ID") + private String memberTalkItemId; + + /** + * 类型 1-AI提问 2-用户回答 3-AI分析结果 + */ + + @ApiModelProperty(value = "类型 1-AI提问 2-用户回答 3-AI分析结果") + private Integer type; + + /** + * 内容 + */ + + @ApiModelProperty(value = "内容(文本格式)") + private String context; + + +} diff --git a/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkVo.java b/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkVo.java index 7966519..7a46eb3 100644 --- a/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkVo.java +++ b/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkVo.java @@ -34,6 +34,6 @@ private String context; @ApiModelProperty(value = "内容亮点、建议、参考答案、核心知识点雷达图表数据(数据对象)") - private Report report; + private String report; } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java index c3a151e..4da6a08 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java @@ -1,6 +1,8 @@ package cc.mrbird.febs.ai.service; import cc.mrbird.febs.ai.entity.AiMemberTalkItem; +import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; +import cc.mrbird.febs.common.entity.FebsResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; @@ -19,4 +21,6 @@ void add(String memberUuid, String id, int type, String resContext, Date createdTime); AiMemberTalkItem getByQuery(LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery); + + FebsResponse historyPage(ApiMemberTalkItemPageDto dto); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java index f533640..1d1502a 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java @@ -3,6 +3,7 @@ import cc.mrbird.febs.ai.entity.AiMemberTalk; import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkAnswerDto; import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkDto; +import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; import cc.mrbird.febs.ai.res.ai.AiResponse; import cc.mrbird.febs.common.entity.FebsResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -33,4 +34,6 @@ FebsResponse answer(ApiMemberTalkAnswerDto dto); AiMemberTalk add(String memberUuid, String productId, Date nowTime); + + FebsResponse historyPage(ApiMemberTalkItemPageDto dto); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java index c3dc6d5..0b4a3a0 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java @@ -2,9 +2,14 @@ import cc.mrbird.febs.ai.entity.AiMemberTalkItem; import cc.mrbird.febs.ai.mapper.AiMemberTalkItemMapper; +import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; +import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo; +import cc.mrbird.febs.ai.res.product.ApiProductVo; import cc.mrbird.febs.ai.service.AiMemberTalkItemService; import cc.mrbird.febs.ai.utils.UUID; +import cc.mrbird.febs.common.entity.FebsResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -44,4 +49,12 @@ public AiMemberTalkItem getByQuery(LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery) { return aiMemberTalkItemMapper.selectOne(memberTalkItemQuery); } + + @Override + public FebsResponse historyPage(ApiMemberTalkItemPageDto dto) { + // 创建分页对象,传入当前页和每页大小 + Page<ApiMemberTalkItemVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); + Page<ApiMemberTalkItemVo> pageListByQuery = aiMemberTalkItemMapper.getPageListByQuery(page, dto); + return new FebsResponse().success().data(pageListByQuery); + } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java index db3d4ba..96ceed5 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java @@ -7,8 +7,11 @@ import cc.mrbird.febs.ai.req.ai.AiRequest; import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkAnswerDto; import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkDto; +import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; import cc.mrbird.febs.ai.res.ai.AiResponse; +import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo; import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkVo; +import cc.mrbird.febs.ai.res.product.ApiProductVo; import cc.mrbird.febs.ai.service.AiMemberTalkItemService; import cc.mrbird.febs.ai.service.AiMemberTalkService; import cc.mrbird.febs.ai.service.AiProductRoleLinkService; @@ -19,8 +22,10 @@ import cc.mrbird.febs.common.utils.LoginUserUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; 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; @@ -86,8 +91,6 @@ apiMemberTalkVo.setMemberTalkId(aiMemberTalk.getId()); apiMemberTalkVo.setType(1); apiMemberTalkVo.setContext(aiResponse.getResContext()); - apiMemberTalkVo.setReport(aiResponse.getReport()); - return new FebsResponse().success().data(apiMemberTalkVo); } @@ -207,11 +210,13 @@ String format = StrUtil.format(ANSWER_FORMAT, aiMemberTalkItem.getContext(), reqContext); log.info("format:{}",format); - AiResponse aiResponse = aiService.start(aiProductRoleLink.getProductRoleId(), format); -// AiResponse aiResponse = aiService.start(aiProductRoleLink.getProductRoleId(), reqContext); +// AiResponse aiResponse = aiService.start(aiProductRoleLink.getProductRoleId(), format); + AiResponse aiResponse = aiService.start(aiProductRoleLink.getProductRoleId(), reqContext); + String context = null; if(aiResponse.getCode().equals("200")){ Date nowTime = new Date(); - aiMemberTalkItemService.add(memberUuid,aiMemberTalk.getId(),3,aiResponse.getResContext(),nowTime); + context = String.valueOf(JSONUtil.parse(aiResponse.getReport())); + aiMemberTalkItemService.add(memberUuid,aiMemberTalk.getId(),3, context,nowTime); this.updateTimeUpdate(nowTime,aiMemberTalk.getId()); }else{ throw new FebsException(aiResponse.getDescription()); @@ -219,8 +224,7 @@ ApiMemberTalkVo apiMemberTalkVo = new ApiMemberTalkVo(); apiMemberTalkVo.setMemberTalkId(aiMemberTalk.getId()); apiMemberTalkVo.setType(3); - apiMemberTalkVo.setContext(aiResponse.getResContext()); - apiMemberTalkVo.setReport(aiResponse.getReport()); + apiMemberTalkVo.setContext(context); return new FebsResponse().success().data(apiMemberTalkVo); } @Override @@ -233,4 +237,12 @@ aiMemberTalkMapper.insert(aiMemberTalk); return aiMemberTalk; } + + @Override + public FebsResponse historyPage(ApiMemberTalkItemPageDto dto) { + + String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); + dto.setMemberUuid(memberUuid); + return aiMemberTalkItemService.historyPage(dto); + } } diff --git a/src/main/resources/mapper/modules/AiMemberTalkItemMapper.xml b/src/main/resources/mapper/modules/AiMemberTalkItemMapper.xml index d171a0d..fa5ca59 100644 --- a/src/main/resources/mapper/modules/AiMemberTalkItemMapper.xml +++ b/src/main/resources/mapper/modules/AiMemberTalkItemMapper.xml @@ -1,4 +1,24 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="cc.mrbird.febs.ai.mapper.AiMemberTalkItemMapper"> + + + <select id="getPageListByQuery" resultType="cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo"> + select + a.ID as memberTalkItemId, + a.member_talk_id as memberTalkId, + a.type as type, + a.context as context + from ai_member_talk_item a + <where> + and a.member_id = #{record.memberUuid} + and a.member_talk_id = #{record.memberTalkId} + <if test="record != null"> + <if test="record.memberTalkItemId != null"> + and a.id < #{record.memberTalkItemId} + </if> + </if> + </where> + order by a.CREATED_TIME desc + </select> </mapper> \ No newline at end of file -- Gitblit v1.9.1