Administrator
2025-10-21 78045ae6ac90cf5559922bca10f7f6e84fef5ff7
feat(ai): 新增AI陪练分页查询功能

- 在AiMemberService中添加talkPage方法及对应实现
- 新增ApiMemberTalkPageDto和ApiMemberTalkPageVo数据传输对象
- 扩展AiMemberTalkMapper支持分页查询接口及XML映射
- 更新AiMemberTalkService接口与实现类以支持新分页逻辑
- 在ApiController中增加/talkPage接口并配置Swagger文档
- 为answerPage方法添加company_id过滤条件以增强数据隔离
- 优化分页查询逻辑,统一使用Page对象处理分页数据
9 files modified
2 files added
119 ■■■■■ changed files
src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/mapper/AiMemberTalkMapper.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberAnswerPageDto.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTalkPageDto.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTalkPageVo.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java 18 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java 7 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/AiMemberAnswerMapper.xml 1 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/AiMemberTalkMapper.xml 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java
@@ -49,6 +49,16 @@
        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)
src/main/java/cc/mrbird/febs/ai/mapper/AiMemberTalkMapper.java
@@ -1,7 +1,9 @@
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;
@@ -17,4 +19,6 @@
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);
}
src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberAnswerPageDto.java
@@ -23,4 +23,7 @@
    @ApiModelProperty(value = "会员ID", example = "10")
    private String memberUuid;
    @ApiModelProperty(hidden = true)
    private String companyId;
}
src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTalkPageDto.java
New file
@@ -0,0 +1,27 @@
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;
}
src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTalkPageVo.java
New file
@@ -0,0 +1,26 @@
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;
}
src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java
@@ -15,6 +15,8 @@
    FebsResponse study(ApiMemberTeamStudyDto dto);
    FebsResponse talkPage(ApiMemberTalkPageDto dto);
    FebsResponse answerPage(ApiMemberAnswerPageDto dto);
    FebsResponse answerInfo(ApiMemberAnswerInfoDto dto);
src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java
@@ -1,14 +1,17 @@
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;
@@ -50,4 +53,6 @@
    List<AiMemberTalk> getListByCompanyIdAndMemberUuid(String companyId, String memberUuid);
    IPage<ApiMemberTalkListVo> getPageByDto(ApiMemberTalkListDto dto);
    Page<ApiMemberTalkPageVo> getTalkPage(Page<ApiMemberTalkPageVo> page, ApiMemberTalkPageDto dto);
}
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
@@ -287,13 +287,27 @@
    }
    @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
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java
@@ -7,9 +7,11 @@
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;
@@ -327,4 +329,9 @@
        return aiMemberTalkMapper.getPageByDto(page, dto);
    }
    @Override
    public Page<ApiMemberTalkPageVo> getTalkPage(Page<ApiMemberTalkPageVo> page, ApiMemberTalkPageDto dto) {
        return aiMemberTalkMapper.getTalkPage(page, dto);
    }
}
src/main/resources/mapper/modules/AiMemberAnswerMapper.xml
@@ -38,6 +38,7 @@
        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>
src/main/resources/mapper/modules/AiMemberTalkMapper.xml
@@ -17,4 +17,20 @@
        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>