feat(ai): 新增AI陪练分页查询功能
- 在AiMemberService中添加talkPage方法及对应实现
- 新增ApiMemberTalkPageDto和ApiMemberTalkPageVo数据传输对象
- 扩展AiMemberTalkMapper支持分页查询接口及XML映射
- 更新AiMemberTalkService接口与实现类以支持新分页逻辑
- 在ApiController中增加/talkPage接口并配置Swagger文档
- 为answerPage方法添加company_id过滤条件以增强数据隔离
- 优化分页查询逻辑,统一使用Page对象处理分页数据
9 files modified
2 files added
| | |
| | | return aiMemberService.practice(dto); |
| | | } |
| | | |
| | | @ApiOperation(value = "Ai陪练分页查询", notes = "Ai陪练分页查询") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiMemberTalkPageVo.class) |
| | | }) |
| | | @PostMapping(value = "/talkPage") |
| | | public FebsResponse talkPage(@RequestBody @Validated ApiMemberTalkPageDto dto) { |
| | | |
| | | return aiMemberService.talkPage(dto); |
| | | } |
| | | |
| | | @ApiOperation(value = "题目练习分页查询", notes = "题目练习分页查询") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiMemberAnswerPageVo.class) |
| | |
| | | package cc.mrbird.febs.ai.mapper; |
| | | |
| | | import cc.mrbird.febs.ai.entity.AiMemberTalk; |
| | | import cc.mrbird.febs.ai.req.member.ApiMemberTalkPageDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkListDto; |
| | | import cc.mrbird.febs.ai.res.member.ApiMemberTalkPageVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkListVo; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | |
| | | public interface AiMemberTalkMapper extends BaseMapper<AiMemberTalk> { |
| | | |
| | | IPage<ApiMemberTalkListVo> getPageByDto(Page<ApiMemberTalkListVo> page, @Param("record")ApiMemberTalkListDto dto); |
| | | |
| | | Page<ApiMemberTalkPageVo> getTalkPage(Page<ApiMemberTalkPageVo> page, @Param("record")ApiMemberTalkPageDto dto); |
| | | } |
| | |
| | | @ApiModelProperty(value = "会员ID", example = "10") |
| | | private String memberUuid; |
| | | |
| | | @ApiModelProperty(hidden = true) |
| | | private String companyId; |
| | | |
| | | } |
| New file |
| | |
| | | package cc.mrbird.febs.ai.req.member; |
| | | |
| | | 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 = "ApiMemberTalkPageDto", description = "参数") |
| | | public class ApiMemberTalkPageDto { |
| | | |
| | | @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 memberUuid; |
| | | |
| | | @ApiModelProperty(hidden = true) |
| | | private String companyId; |
| | | } |
| New file |
| | |
| | | package cc.mrbird.febs.ai.res.member; |
| | | |
| | | 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 = "ApiMemberTalkPageVo", description = "参数") |
| | | public class ApiMemberTalkPageVo { |
| | | |
| | | @ApiModelProperty(value = "答题ID") |
| | | private String id; |
| | | |
| | | @ApiModelProperty(value = "时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date createdTime; |
| | | |
| | | @ApiModelProperty(value = "名称") |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "目标") |
| | | private String target; |
| | | } |
| | |
| | | |
| | | FebsResponse study(ApiMemberTeamStudyDto dto); |
| | | |
| | | FebsResponse talkPage(ApiMemberTalkPageDto dto); |
| | | |
| | | FebsResponse answerPage(ApiMemberAnswerPageDto dto); |
| | | |
| | | FebsResponse answerInfo(ApiMemberAnswerInfoDto dto); |
| | |
| | | package cc.mrbird.febs.ai.service; |
| | | |
| | | import cc.mrbird.febs.ai.entity.AiMemberTalk; |
| | | import cc.mrbird.febs.ai.req.member.ApiMemberTalkPageDto; |
| | | 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.member.ApiMemberTalkPageVo; |
| | | 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.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import reactor.core.publisher.Flux; |
| | | |
| | |
| | | List<AiMemberTalk> getListByCompanyIdAndMemberUuid(String companyId, String memberUuid); |
| | | |
| | | IPage<ApiMemberTalkListVo> getPageByDto(ApiMemberTalkListDto dto); |
| | | |
| | | Page<ApiMemberTalkPageVo> getTalkPage(Page<ApiMemberTalkPageVo> page, ApiMemberTalkPageDto dto); |
| | | } |
| | |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse talkPage(ApiMemberTalkPageDto dto) { |
| | | |
| | | String companyId = LoginUserUtil.getLoginUser().getCompanyId(); |
| | | dto.setCompanyId(companyId); |
| | | // 创建分页对象,传入当前页和每页大小 |
| | | Page<ApiMemberTalkPageVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); |
| | | Page<ApiMemberTalkPageVo> pages = aiMemberTalkService.getTalkPage(page, dto); |
| | | |
| | | return new FebsResponse().success().data(pages); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse answerPage(ApiMemberAnswerPageDto dto) { |
| | | |
| | | String companyId = LoginUserUtil.getLoginUser().getCompanyId(); |
| | | dto.setCompanyId(companyId); |
| | | // 创建分页对象,传入当前页和每页大小 |
| | | Page<ApiMemberAnswerPageVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); |
| | | Page<ApiMemberAnswerPageVo> aiMemberAnswerPage = aiMemberAnswerService.getAnswerPage(page, dto); |
| | | Page<ApiMemberAnswerPageVo> pages = aiMemberAnswerService.getAnswerPage(page, dto); |
| | | |
| | | return new FebsResponse().success().data(aiMemberAnswerPage); |
| | | return new FebsResponse().success().data(pages); |
| | | } |
| | | |
| | | @Override |
| | |
| | | import cc.mrbird.febs.ai.mapper.AiMemberTalkMapper; |
| | | import cc.mrbird.febs.ai.req.ai.AiMessage; |
| | | import cc.mrbird.febs.ai.req.ai.AiRequest; |
| | | import cc.mrbird.febs.ai.req.member.ApiMemberTalkPageDto; |
| | | 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.member.ApiMemberTalkPageVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkListVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkReloadVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkVo; |
| | |
| | | return aiMemberTalkMapper.getPageByDto(page, dto); |
| | | } |
| | | |
| | | @Override |
| | | public Page<ApiMemberTalkPageVo> getTalkPage(Page<ApiMemberTalkPageVo> page, ApiMemberTalkPageDto dto) { |
| | | return aiMemberTalkMapper.getTalkPage(page, dto); |
| | | } |
| | | |
| | | } |
| | |
| | | left join ai_product b on a.product_id = b.id and b.state = 1 |
| | | where a.member_id = #{record.memberUuid} |
| | | and a.state = 1 |
| | | and a.company_id = #{record.companyId} |
| | | group by a.product_id |
| | | order by a.CREATED_TIME desc |
| | | </select> |
| | |
| | | order by a.CREATED_TIME desc |
| | | </select> |
| | | |
| | | <select id="getTalkPage" resultType="cc.mrbird.febs.ai.res.member.ApiMemberTalkPageVo"> |
| | | select |
| | | a.ID as id, |
| | | b.name as name, |
| | | b.target as target, |
| | | 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.company_id = #{record.companyId} |
| | | and a.state = 1 |
| | | </where> |
| | | order by a.CREATED_TIME desc |
| | | </select> |
| | | |
| | | </mapper> |