feat(ai): 添加问答记录详情分页查询功能
- 在 AiTalkItemMapper 中添加 getPageListByQuery 方法,用于查询问答记录详情- 在 AiTalkItemService 中添加 historyPage 方法,处理分页查询请求
- 在 AiTalkService 中添加 historyPage 方法,用于调用 AiTalkItemService 的分页查询功能
- 在 ApiAiTalkController 中添加 historyPage 接口,提供问答记录详情分页查询的 API
- 新增 ApiTalkItemPageDto 和 ApiTalkItemPageVo 类,用于分页查询的参数和结果封装
7 files modified
2 files added
| | |
| | | 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; |
| | |
| | | return aiTalkService.talkOpen(dto); |
| | | } |
| | | |
| | | @ApiOperation(value = "用户AI问答记录分页查询", notes = "用户AI问答记录分页查询") |
| | | @ApiOperation(value = "问答记录分页查询", notes = "问答记录分页查询") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiTalkPageVo.class) |
| | | }) |
| | |
| | | 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), |
| | |
| | | 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); |
| | | |
| | | } |
New file |
| | |
| | | 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; |
| | | } |
New file |
| | |
| | | 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; |
| | | } |
| | |
| | | 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; |
| | | |
| | |
| | | |
| | | void add(String id, int code, String context, String memberUuid, DateTime date); |
| | | |
| | | FebsResponse historyPage(ApiTalkItemPageDto dto); |
| | | } |
| | |
| | | |
| | | 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; |
| | |
| | | Flux<FebsResponse> answerStream(String question); |
| | | |
| | | FebsResponse talkList(ApiTalkPageDto dto); |
| | | |
| | | FebsResponse historyPage(ApiTalkItemPageDto dto); |
| | | } |
| | |
| | | |
| | | 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; |
| | |
| | | @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(); |
| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | return new FebsResponse().success().data(pageListByQuery); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse historyPage(ApiTalkItemPageDto dto) { |
| | | String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); |
| | | dto.setMemberUuid(memberUuid); |
| | | return aiTalkItemService.historyPage(dto); |
| | | } |
| | | |
| | | } |
| | |
| | | <?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 < #{record.talkItemId} |
| | | </if> |
| | | </if> |
| | | </where> |
| | | order by a.CREATED_TIME desc |
| | | </select> |
| | | </mapper> |