From de4559337b49fd140aff8a45377ee6ae173b654e Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 25 Aug 2025 16:19:46 +0800
Subject: [PATCH] feat(ai): 添加问答记录详情分页查询功能

---
 src/main/java/cc/mrbird/febs/ai/req/talk/ApiTalkItemPageDto.java         |   33 +++++++++++
 src/main/resources/mapper/modules/AiTalkItemMapper.xml                   |   20 ++++++
 src/main/java/cc/mrbird/febs/ai/res/talk/ApiTalkItemPageVo.java          |   47 +++++++++++++++
 src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkItemServiceImpl.java  |   15 +++++
 src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java |   14 ++++
 src/main/java/cc/mrbird/febs/ai/mapper/AiTalkItemMapper.java             |    7 ++
 src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkServiceImpl.java      |    8 ++
 src/main/java/cc/mrbird/febs/ai/service/AiTalkItemService.java           |    3 +
 src/main/java/cc/mrbird/febs/ai/service/AiTalkService.java               |    3 +
 9 files changed, 149 insertions(+), 1 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java b/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
index a8d47bd..10d9e8a 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
@@ -4,10 +4,12 @@
 import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkDto;
 import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto;
 import cc.mrbird.febs.ai.req.talk.ApiTalkDto;
+import cc.mrbird.febs.ai.req.talk.ApiTalkItemPageDto;
 import cc.mrbird.febs.ai.req.talk.ApiTalkPageDto;
 import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo;
 import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVo;
 import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkVo;
+import cc.mrbird.febs.ai.res.talk.ApiTalkItemPageVo;
 import cc.mrbird.febs.ai.res.talk.ApiTalkPageVo;
 import cc.mrbird.febs.ai.res.talk.ApiTalkVo;
 import cc.mrbird.febs.ai.service.AiMemberTalkService;
@@ -46,7 +48,7 @@
         return aiTalkService.talkOpen(dto);
     }
 
-    @ApiOperation(value = "用户AI问答记录分页查询", notes = "用户AI问答记录分页查询")
+    @ApiOperation(value = "问答记录分页查询", notes = "问答记录分页查询")
     @ApiResponses({
             @ApiResponse(code = 200, message = "success", response = ApiTalkPageVo.class)
     })
@@ -56,6 +58,16 @@
         return aiTalkService.talkList(dto);
     }
 
+    @ApiOperation(value = "问答记录详情分页查询", notes = "问答记录详情分页查询")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiTalkItemPageVo.class)
+    })
+    @PostMapping(value = "/historyPage")
+    public FebsResponse historyPage(@RequestBody @Validated ApiTalkItemPageDto dto) {
+
+        return aiTalkService.historyPage(dto);
+    }
+
     @ApiOperation("提问AI(流式)")
     @ApiResponses({
             @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVo.class),
diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiTalkItemMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiTalkItemMapper.java
index 01533d2..7db45b4 100644
--- a/src/main/java/cc/mrbird/febs/ai/mapper/AiTalkItemMapper.java
+++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiTalkItemMapper.java
@@ -1,7 +1,14 @@
 package cc.mrbird.febs.ai.mapper;
 
 import cc.mrbird.febs.ai.entity.AiTalkItem;
+import cc.mrbird.febs.ai.req.talk.ApiTalkItemPageDto;
+import cc.mrbird.febs.ai.res.talk.ApiTalkItemPageVo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 
 public interface AiTalkItemMapper extends BaseMapper<AiTalkItem> {
+
+    Page<ApiTalkItemPageVo> getPageListByQuery(Page<ApiTalkItemPageVo> page, @Param("record")ApiTalkItemPageDto dto);
+
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/req/talk/ApiTalkItemPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/talk/ApiTalkItemPageDto.java
new file mode 100644
index 0000000..3ee37a7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/talk/ApiTalkItemPageDto.java
@@ -0,0 +1,33 @@
+package cc.mrbird.febs.ai.req.talk;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiTalkItemPageDto", description = "参数")
+public class ApiTalkItemPageDto {
+
+    @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 talkId;
+
+    @ApiModelProperty(value = "消息ID")
+    private String talkItemId;
+
+    @ApiModelProperty(hidden = true)
+    private String memberUuid;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/talk/ApiTalkItemPageVo.java b/src/main/java/cc/mrbird/febs/ai/res/talk/ApiTalkItemPageVo.java
new file mode 100644
index 0000000..fa8ad5e
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/talk/ApiTalkItemPageVo.java
@@ -0,0 +1,47 @@
+package cc.mrbird.febs.ai.res.talk;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiTalkItemPageVo", description = "参数")
+public class ApiTalkItemPageVo {
+    /**
+     * 用户对话ID (UUID)
+     */
+
+    @ApiModelProperty(value = "会话ID")
+    private String talkId;
+
+    /**
+     * 用户消息ID (UUID)
+     */
+
+    @ApiModelProperty(value = "消息ID")
+    private String talkItemId;
+
+    /**
+     * 类型 1-AI提问 2-用户回答 3-AI分析结果
+     */
+
+    @ApiModelProperty(value = "类型 1-用户提问 2-AI回答")
+    private Integer type;
+
+    /**
+     * 内容
+     */
+
+    @ApiModelProperty(value = "内容(文本格式)")
+    private String context;
+
+    @ApiModelProperty(value = "时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiTalkItemService.java b/src/main/java/cc/mrbird/febs/ai/service/AiTalkItemService.java
index 229f2b6..3162531 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiTalkItemService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiTalkItemService.java
@@ -1,6 +1,8 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiTalkItem;
+import cc.mrbird.febs.ai.req.talk.ApiTalkItemPageDto;
+import cc.mrbird.febs.common.entity.FebsResponse;
 import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -8,4 +10,5 @@
 
     void add(String id, int code, String context, String memberUuid, DateTime date);
 
+    FebsResponse historyPage(ApiTalkItemPageDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiTalkService.java b/src/main/java/cc/mrbird/febs/ai/service/AiTalkService.java
index d89047d..f6dc5f9 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiTalkService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiTalkService.java
@@ -2,6 +2,7 @@
 
 import cc.mrbird.febs.ai.entity.AiTalk;
 import cc.mrbird.febs.ai.req.talk.ApiTalkDto;
+import cc.mrbird.febs.ai.req.talk.ApiTalkItemPageDto;
 import cc.mrbird.febs.ai.req.talk.ApiTalkPageDto;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -18,4 +19,6 @@
     Flux<FebsResponse> answerStream(String question);
 
     FebsResponse talkList(ApiTalkPageDto dto);
+
+    FebsResponse historyPage(ApiTalkItemPageDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkItemServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkItemServiceImpl.java
index 7a4a121..7197ab6 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkItemServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkItemServiceImpl.java
@@ -2,9 +2,14 @@
 
 import cc.mrbird.febs.ai.entity.AiTalkItem;
 import cc.mrbird.febs.ai.mapper.AiTalkItemMapper;
+import cc.mrbird.febs.ai.req.talk.ApiTalkItemPageDto;
+import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo;
+import cc.mrbird.febs.ai.res.talk.ApiTalkItemPageVo;
 import cc.mrbird.febs.ai.service.AiTalkItemService;
 import cc.mrbird.febs.ai.utils.UUID;
+import cc.mrbird.febs.common.entity.FebsResponse;
 import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -14,6 +19,8 @@
 @Service
 @RequiredArgsConstructor
 public class AiTalkItemServiceImpl extends ServiceImpl<AiTalkItemMapper, AiTalkItem> implements AiTalkItemService {
+
+    private final AiTalkItemMapper aiTalkItemMapper;
     @Override
     public void add(String id, int code, String context, String memberUuid, DateTime date) {
         AiTalkItem aiTalkItem = new AiTalkItem();
@@ -25,4 +32,12 @@
         aiTalkItem.setContext(context);
         this.baseMapper.insert(aiTalkItem);
     }
+
+    @Override
+    public FebsResponse historyPage(ApiTalkItemPageDto dto) {
+        // 创建分页对象,传入当前页和每页大小
+        Page<ApiTalkItemPageVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+        Page<ApiTalkItemPageVo> pageListByQuery = aiTalkItemMapper.getPageListByQuery(page, dto);
+        return new FebsResponse().success().data(pageListByQuery);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkServiceImpl.java
index 9410135..539dbac 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkServiceImpl.java
@@ -3,6 +3,7 @@
 import cc.mrbird.febs.ai.entity.AiTalk;
 import cc.mrbird.febs.ai.mapper.AiTalkMapper;
 import cc.mrbird.febs.ai.req.talk.ApiTalkDto;
+import cc.mrbird.febs.ai.req.talk.ApiTalkItemPageDto;
 import cc.mrbird.febs.ai.req.talk.ApiTalkPageDto;
 import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberProductWorkVo;
 import cc.mrbird.febs.ai.res.talk.ApiTalkPageVo;
@@ -80,4 +81,11 @@
         return new FebsResponse().success().data(pageListByQuery);
     }
 
+    @Override
+    public FebsResponse historyPage(ApiTalkItemPageDto dto) {
+        String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+        dto.setMemberUuid(memberUuid);
+        return aiTalkItemService.historyPage(dto);
+    }
+
 }
diff --git a/src/main/resources/mapper/modules/AiTalkItemMapper.xml b/src/main/resources/mapper/modules/AiTalkItemMapper.xml
index e6ad3c7..dcc9a23 100644
--- a/src/main/resources/mapper/modules/AiTalkItemMapper.xml
+++ b/src/main/resources/mapper/modules/AiTalkItemMapper.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.AiTalkItemMapper">
+
+    <select id="getPageListByQuery" resultType="cc.mrbird.febs.ai.res.talk.ApiTalkItemPageVo">
+        select
+        a.ID as talkItemId,
+        a.member_talk_id as talkId,
+        a.type as type,
+        a.context as context,
+        a.CREATED_TIME as createdTime
+        from ai_talk_item a
+        <where>
+            and a.member_id = #{record.memberUuid}
+            and a.talk_id = #{record.talkId}
+            <if test="record != null">
+                <if test="record.talkItemId != null">
+                    and a.id &lt; #{record.talkItemId}
+                </if>
+            </if>
+        </where>
+        order by a.CREATED_TIME desc
+    </select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1