Administrator
2025-08-25 de4559337b49fd140aff8a45377ee6ae173b654e
feat(ai): 添加问答记录详情分页查询功能

- 在 AiTalkItemMapper 中添加 getPageListByQuery 方法,用于查询问答记录详情- 在 AiTalkItemService 中添加 historyPage 方法,处理分页查询请求
- 在 AiTalkService 中添加 historyPage 方法,用于调用 AiTalkItemService 的分页查询功能
- 在 ApiAiTalkController 中添加 historyPage 接口,提供问答记录详情分页查询的 API
- 新增 ApiTalkItemPageDto 和 ApiTalkItemPageVo 类,用于分页查询的参数和结果封装
7 files modified
2 files added
150 ■■■■■ changed files
src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/mapper/AiTalkItemMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/req/talk/ApiTalkItemPageDto.java 33 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/res/talk/ApiTalkItemPageVo.java 47 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/AiTalkItemService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/AiTalkService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkItemServiceImpl.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiTalkServiceImpl.java 8 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/AiTalkItemMapper.xml 20 ●●●●● patch | view | raw | blame | history
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),
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);
}
src/main/java/cc/mrbird/febs/ai/req/talk/ApiTalkItemPageDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/ai/res/talk/ApiTalkItemPageVo.java
New file
@@ -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;
}
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);
}
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);
}
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);
    }
}
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);
    }
}
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>