feat(ai): 新增陪练记录相关接口和分页查询功能
- 添加了获取陪练记录列表的分页查询接口
- 实现了陪练记录答题详情的分页查询接口
- 增加了查看陪练报告内容的接口
- 创建了对应的DTO和VO类用于数据传输
- 在Mapper和Service层添加了分页查询的实现
- 补充了MyBatis XML映射文件中的查询语句
- 控制器层增加了三个新的API端点用于前端调用
11 files modified
6 files added
| | |
| | | package cc.mrbird.febs.ai.controller.memberTalk; |
| | | |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkMemberListDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkReportListDto; |
| | | import cc.mrbird.febs.ai.req.memberTalkStream.*; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkMemberAnswerSavaVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVoOld; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkListDto; |
| | | import cc.mrbird.febs.ai.res.memberTalk.*; |
| | | import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkReloadStreamVo; |
| | | import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkStreamVo; |
| | | import cc.mrbird.febs.ai.service.AiMemberTalkStreamService; |
| | |
| | | return aiMemberTalkStreamService.start(dto); |
| | | } |
| | | |
| | | @ApiOperation(value = "陪练记录", notes = "陪练记录") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiMemberTalkListVo.class) |
| | | }) |
| | | @PostMapping(value = "/talkList") |
| | | public FebsResponse talkList(@RequestBody @Validated ApiMemberTalkListDto dto) { |
| | | |
| | | return aiMemberTalkStreamService.talkList(dto); |
| | | } |
| | | |
| | | @ApiOperation(value = "陪练记录-答题记录", notes = "陪练记录-答题记录") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiTalkMemberListVo.class) |
| | | }) |
| | | @PostMapping(value = "/talkMemberList") |
| | | public FebsResponse talkMemberList(@RequestBody @Validated ApiTalkMemberListDto dto) { |
| | | |
| | | return aiMemberTalkStreamService.talkMemberList(dto); |
| | | } |
| | | |
| | | @ApiOperation(value = "陪练记录-查看报告", notes = "陪练记录-查看报告") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiTalkReportListVo.class) |
| | | }) |
| | | @PostMapping(value = "/talkReportList") |
| | | public FebsResponse talkReportList(@RequestBody @Validated ApiTalkReportListDto dto) { |
| | | |
| | | return aiMemberTalkStreamService.talkReportList(dto); |
| | | } |
| | | |
| | | @ApiOperation(value = "再练一次(重新回答)", notes = "再练一次(重新回答)") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiMemberTalkReloadStreamVo.class) |
| | |
| | | |
| | | import cc.mrbird.febs.ai.entity.AiMemberTalkItem; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkMemberListDto; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiTalkMemberListVo; |
| | | import cc.mrbird.febs.ai.res.product.ApiProductVo; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | |
| | | public interface AiMemberTalkItemMapper extends BaseMapper<AiMemberTalkItem> { |
| | | |
| | | Page<ApiMemberTalkItemVo> getPageListByQuery(Page<ApiMemberTalkItemVo> page, @Param("record") ApiMemberTalkItemPageDto dto); |
| | | |
| | | IPage<ApiTalkMemberListVo> getPageByDto(Page<ApiTalkMemberListVo> page, @Param("record") ApiTalkMemberListDto dto); |
| | | } |
| | |
| | | package cc.mrbird.febs.ai.mapper; |
| | | |
| | | import cc.mrbird.febs.ai.entity.AiMemberTalk; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkListDto; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkListVo; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | /** |
| | | * AI用户对话训练记录 Mapper接口 |
| | |
| | | */ |
| | | public interface AiMemberTalkMapper extends BaseMapper<AiMemberTalk> { |
| | | |
| | | IPage<ApiMemberTalkListVo> getPageByDto(Page<ApiMemberTalkListVo> page, @Param("record")ApiMemberTalkListDto dto); |
| | | } |
| New file |
| | |
| | | package cc.mrbird.febs.ai.req.memberTalk; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.NotNull; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiMemberTalkListDto", description = "参数") |
| | | public class ApiMemberTalkListDto { |
| | | |
| | | @NotNull(message = "页码不能为空") |
| | | @ApiModelProperty(value = "页码", example = "1") |
| | | private Integer pageNow; |
| | | |
| | | @NotNull(message = "每页数量不能为空") |
| | | @ApiModelProperty(value = "每页数量", example = "10") |
| | | private Integer pageSize; |
| | | |
| | | @NotBlank(message = "产品ID不能为空") |
| | | @ApiModelProperty(value = "产品ID", example = "10") |
| | | private String productId; |
| | | |
| | | @NotBlank(message = "会员ID不能为空") |
| | | @ApiModelProperty(value = "会员ID", example = "10") |
| | | private String memberUuid; |
| | | |
| | | } |
| New file |
| | |
| | | package cc.mrbird.febs.ai.req.memberTalk; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.NotNull; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiTalkMemberListDto", description = "参数") |
| | | public class ApiTalkMemberListDto { |
| | | |
| | | |
| | | @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; |
| | | |
| | | @NotBlank(message = "会员ID不能为空") |
| | | @ApiModelProperty(value = "会员ID", example = "10") |
| | | private String memberUuid; |
| | | |
| | | } |
| New file |
| | |
| | | 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; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiTalkReportListDto", description = "参数") |
| | | public class ApiTalkReportListDto { |
| | | |
| | | @NotNull(message = "会话ID不能为空") |
| | | @ApiModelProperty(value = "会话ID", example = "1") |
| | | private String memberTalkId; |
| | | } |
| New file |
| | |
| | | package cc.mrbird.febs.ai.res.memberTalk; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiMemberTalkListVo", description = "参数") |
| | | public class ApiMemberTalkListVo { |
| | | |
| | | @ApiModelProperty(value = "会话ID") |
| | | private String talkId; |
| | | |
| | | @ApiModelProperty(value = "标题") |
| | | private String productName; |
| | | |
| | | @ApiModelProperty(value = "时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date createdTime; |
| | | } |
| New file |
| | |
| | | package cc.mrbird.febs.ai.res.memberTalk; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiTalkMemberListVo", description = "参数") |
| | | public class ApiTalkMemberListVo { |
| | | |
| | | /** |
| | | * 用户对话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; |
| | | } |
| New file |
| | |
| | | package cc.mrbird.febs.ai.res.memberTalk; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiTalkReportListVo", description = "参数") |
| | | public class ApiTalkReportListVo { |
| | | |
| | | @ApiModelProperty(value = "报告") |
| | | private String analysis; |
| | | } |
| | |
| | | import cc.mrbird.febs.ai.entity.AiMemberTalkItem; |
| | | import cc.mrbird.febs.ai.req.ai.AiMessage; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkMemberListDto; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiTalkMemberListVo; |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.mall.vo.MallGoodsListVo; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | |
| | | |
| | | List<AiMessage> getQuestionUpDownContext(String memberTalkId, int code); |
| | | |
| | | IPage<ApiTalkMemberListVo> getPageByDto(ApiTalkMemberListDto dto); |
| | | } |
| | |
| | | |
| | | import cc.mrbird.febs.ai.entity.AiMemberTalk; |
| | | import cc.mrbird.febs.ai.req.memberTalk.*; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkListDto; |
| | | import cc.mrbird.febs.ai.res.ai.AiResponse; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkListVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiTalkMemberListVo; |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import reactor.core.publisher.Flux; |
| | | |
| | |
| | | List<AiMemberTalk> getListByCompanyId(String companyId); |
| | | |
| | | List<AiMemberTalk> getListByCompanyIdAndMemberUuid(String companyId, String memberUuid); |
| | | |
| | | IPage<ApiMemberTalkListVo> getPageByDto(ApiMemberTalkListDto dto); |
| | | } |
| | |
| | | |
| | | import cc.mrbird.febs.ai.entity.AiMemberTalk; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkMemberListDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkReportListDto; |
| | | import cc.mrbird.febs.ai.req.memberTalkStream.*; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkListDto; |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import reactor.core.publisher.Flux; |
| | |
| | | */ |
| | | FebsResponse start(ApiMemberTalkStreamDto dto); |
| | | |
| | | FebsResponse talkList(ApiMemberTalkListDto dto); |
| | | |
| | | FebsResponse talkMemberList(ApiTalkMemberListDto dto); |
| | | |
| | | FebsResponse talkReportList(ApiTalkReportListDto dto); |
| | | |
| | | FebsResponse reload(ApiMemberTalkReloadStreamDto dto); |
| | | |
| | | FebsResponse historyPage(ApiMemberTalkItemPageDto dto); |
| | |
| | | import cc.mrbird.febs.ai.mapper.AiMemberTalkItemMapper; |
| | | import cc.mrbird.febs.ai.req.ai.AiMessage; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkMemberListDto; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiTalkMemberListVo; |
| | | import cc.mrbird.febs.ai.service.AiMemberTalkItemService; |
| | | import cc.mrbird.febs.ai.utils.UUID; |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | |
| | | return aiMessages; |
| | | } |
| | | |
| | | @Override |
| | | public IPage<ApiTalkMemberListVo> getPageByDto(ApiTalkMemberListDto dto) { |
| | | // 创建分页对象,传入当前页和每页大小 |
| | | Page<ApiTalkMemberListVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); |
| | | return aiMemberTalkItemMapper.getPageByDto(page, dto); |
| | | } |
| | | |
| | | } |
| | |
| | | import cc.mrbird.febs.ai.req.ai.AiMessage; |
| | | import cc.mrbird.febs.ai.req.ai.AiRequest; |
| | | import cc.mrbird.febs.ai.req.memberTalk.*; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkListDto; |
| | | import cc.mrbird.febs.ai.res.ai.AiResponse; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkListVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkReloadVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiTalkMemberListVo; |
| | | import cc.mrbird.febs.ai.service.AiMemberTalkItemService; |
| | | import cc.mrbird.febs.ai.service.AiMemberTalkService; |
| | | import cc.mrbird.febs.ai.service.AiProductRoleLinkService; |
| | |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | 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; |
| | |
| | | ); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<ApiMemberTalkListVo> getPageByDto(ApiMemberTalkListDto dto) { |
| | | // 创建分页对象,传入当前页和每页大小 |
| | | Page<ApiMemberTalkListVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); |
| | | return aiMemberTalkMapper.getPageByDto(page, dto); |
| | | } |
| | | |
| | | } |
| | |
| | | import cc.mrbird.febs.ai.enumerates.AiTypeEnum; |
| | | import cc.mrbird.febs.ai.mapper.AiMemberTalkMapper; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkMemberListDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkReportListDto; |
| | | import cc.mrbird.febs.ai.req.memberTalkStream.*; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkListDto; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkMemberAnswerSavaVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiTalkReportListVo; |
| | | import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkReloadStreamVo; |
| | | import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkStreamVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkListVo; |
| | | import cc.mrbird.febs.ai.service.*; |
| | | import cc.mrbird.febs.ai.strategy.LlmStrategyFactory; |
| | | import cc.mrbird.febs.ai.strategy.enumerates.LlmApplicationAppIdEnum; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse talkList(ApiMemberTalkListDto dto) { |
| | | |
| | | return new FebsResponse().success().data(aiMemberTalkService.getPageByDto(dto)); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse talkMemberList(ApiTalkMemberListDto dto) { |
| | | |
| | | return new FebsResponse().success().data(aiMemberTalkItemService.getPageByDto(dto)); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse talkReportList(ApiTalkReportListDto dto) { |
| | | ApiTalkReportListVo apiTalkReportListDto = new ApiTalkReportListVo(); |
| | | |
| | | String memberTalkId = dto.getMemberTalkId(); |
| | | AiMemberTalk byId = aiMemberTalkService.getById(memberTalkId); |
| | | apiTalkReportListDto.setAnalysis(byId.getAnalysis()); |
| | | return new FebsResponse().success().data(apiTalkReportListDto); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse reload(ApiMemberTalkReloadStreamDto dto) { |
| | | |
| | | String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); |
| | |
| | | </where> |
| | | order by a.CREATED_TIME desc |
| | | </select> |
| | | |
| | | |
| | | <select id="getPageByDto" resultType="cc.mrbird.febs.ai.res.memberTalk.ApiTalkMemberListVo"> |
| | | 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} |
| | | </where> |
| | | order by a.CREATED_TIME asc |
| | | </select> |
| | | </mapper> |
| | |
| | | <?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.AiMemberTalkMapper"> |
| | | |
| | | <select id="getPageByDto" resultType="cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkListVo"> |
| | | select |
| | | a.ID as talkId, |
| | | b.name as productName, |
| | | a.CREATED_TIME as createdTime |
| | | from ai_member_talk a |
| | | left join ai_product b on a.product_id = b.id |
| | | <where> |
| | | and a.member_id = #{record.memberUuid} |
| | | and a.product_id = #{record.productId} |
| | | </where> |
| | | order by a.CREATED_TIME desc |
| | | </select> |
| | | |
| | | </mapper> |