| 2026-01-13 | Administrator | ![]() |
| 2026-01-13 | Administrator | ![]() |
| 2026-01-13 | Administrator | ![]() |
| 2026-01-13 | Administrator | ![]() |
| 2026-01-13 | Administrator | ![]() |
| 2026-01-13 | Administrator | ![]() |
| 2026-01-13 | Administrator | ![]() |
| 2026-01-13 | Administrator | ![]() |
| 2026-01-13 | Administrator | ![]() |
| 2026-01-13 | Administrator | ![]() |
| 2026-01-13 | Administrator | ![]() |
src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java
@@ -99,6 +99,16 @@ return aiMemberService.studyList(dto); } @ApiOperation(value = "学习成果-排行版", notes = "学习成果-排行版") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiCompanyStudyRecordVo.class) }) @PostMapping(value = "/studyRecordList") public FebsResponse studyRecordList(@RequestBody @Validated ApiCompanyStudyRecordDto dto) { return aiMemberService.studyRecordList(dto); } @ApiOperation(value = "学习成果-题目正确率", notes = "学习成果-题目正确率") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiCompanyStudyPercentVo.class) src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerMapper.java
@@ -2,8 +2,10 @@ import cc.mrbird.febs.ai.entity.AiMemberAnswer; import cc.mrbird.febs.ai.req.member.ApiCompanyStudyDto; import cc.mrbird.febs.ai.req.member.ApiCompanyStudyRecordDto; import cc.mrbird.febs.ai.req.member.ApiMemberAnswerPageDto; import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberProductWorkPageDto; import cc.mrbird.febs.ai.res.member.ApiCompanyStudyRecordVo; import cc.mrbird.febs.ai.res.member.ApiCompanyStudyVo; import cc.mrbird.febs.ai.res.member.ApiMemberAnswerPageVo; import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberProductWorkVo; @@ -25,4 +27,6 @@ Page<ApiMemberAnswerPageVo> getAnswerPage(Page<ApiMemberAnswerPageVo> page, @Param("record")ApiMemberAnswerPageDto dto); IPage<ApiCompanyStudyVo> selectProductListPage(Page<ApiCompanyStudyVo> page, @Param("record")ApiCompanyStudyDto dto); IPage<ApiCompanyStudyRecordVo> getStudyRecordList(Page<ApiCompanyStudyRecordVo> page, @Param("record")ApiCompanyStudyRecordDto dto); } src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyRecordDto.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 = "ApiCompanyStudyRecordDto", description = "参数") public class ApiCompanyStudyRecordDto { @NotNull(message = "页码不能为空") @ApiModelProperty(value = "页码", example = "1") private Integer pageNow; @NotNull(message = "每页数量不能为空") @ApiModelProperty(value = "每页数量", example = "10") private Integer pageSize; @NotBlank(message = "产品ID不能为空") @ApiModelProperty(value = "产品ID") private String productId; @ApiModelProperty(value = "公司ID") private String companyId; } src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyRecordVo.java
New file @@ -0,0 +1,19 @@ package cc.mrbird.febs.ai.res.member; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiCompanyStudyRecordVo", description = "参数") public class ApiCompanyStudyRecordVo { @ApiModelProperty(value = "微信名") private String nickName; @ApiModelProperty(value = "用户姓名") private String memberName; @ApiModelProperty(value = "评分") private Integer score; } src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
@@ -2,8 +2,10 @@ import cc.mrbird.febs.ai.entity.AiMemberAnswer; import cc.mrbird.febs.ai.req.member.ApiCompanyStudyDto; import cc.mrbird.febs.ai.req.member.ApiCompanyStudyRecordDto; import cc.mrbird.febs.ai.req.member.ApiMemberAnswerPageDto; import cc.mrbird.febs.ai.req.memberAnswer.*; import cc.mrbird.febs.ai.res.member.ApiCompanyStudyRecordVo; import cc.mrbird.febs.ai.res.member.ApiCompanyStudyVo; import cc.mrbird.febs.ai.res.member.ApiMemberAnswerPageVo; import cc.mrbird.febs.common.entity.FebsResponse; @@ -14,6 +16,7 @@ import java.util.Date; import java.util.List; import java.util.Set; /** * AI用户答题记录 Service接口 @@ -50,4 +53,8 @@ Page<ApiMemberAnswerPageVo> getAnswerPage(Page<ApiMemberAnswerPageVo> page, ApiMemberAnswerPageDto dto); IPage<ApiCompanyStudyVo> selectListPage(ApiCompanyStudyDto dto, Page<ApiCompanyStudyVo> page); IPage<ApiCompanyStudyRecordVo> getStudyRecordList(Page<ApiCompanyStudyRecordVo> page, ApiCompanyStudyRecordDto dto); List<AiMemberAnswer> getIdListByCompanyIdAndProductId(String companyId, Set<String> collect); } src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java
@@ -26,4 +26,6 @@ FebsResponse studyPercentList(ApiCompanyStudyPercentDto dto); FebsResponse studyInfoList(ApiCompanyStudyInfoDto dto); FebsResponse studyRecordList(ApiCompanyStudyRecordDto dto); } src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java
@@ -4,8 +4,10 @@ import cc.mrbird.febs.ai.enumerates.AiTypeEnum; import cc.mrbird.febs.ai.mapper.AiMemberAnswerMapper; import cc.mrbird.febs.ai.req.member.ApiCompanyStudyDto; import cc.mrbird.febs.ai.req.member.ApiCompanyStudyRecordDto; import cc.mrbird.febs.ai.req.member.ApiMemberAnswerPageDto; import cc.mrbird.febs.ai.req.memberAnswer.*; import cc.mrbird.febs.ai.res.member.ApiCompanyStudyRecordVo; import cc.mrbird.febs.ai.res.member.ApiCompanyStudyVo; import cc.mrbird.febs.ai.res.member.ApiMemberAnswerPageVo; import cc.mrbird.febs.ai.res.memberAnswer.*; @@ -463,4 +465,20 @@ public IPage<ApiCompanyStudyVo> selectListPage(ApiCompanyStudyDto dto, Page<ApiCompanyStudyVo> page) { return aiMemberAnswerMapper.selectProductListPage(page,dto); } @Override public IPage<ApiCompanyStudyRecordVo> getStudyRecordList(Page<ApiCompanyStudyRecordVo> page, ApiCompanyStudyRecordDto dto) { return aiMemberAnswerMapper.getStudyRecordList(page,dto); } @Override public List<AiMemberAnswer> getIdListByCompanyIdAndProductId(String companyId, Set<String> collect) { return aiMemberAnswerMapper.selectList( Wrappers.lambdaQuery(AiMemberAnswer.class) .select(AiMemberAnswer::getId,AiMemberAnswer::getProductId) .eq(AiMemberAnswer::getCompanyId, companyId) .in(AiMemberAnswer::getProductId, collect) .eq(AiMemberAnswer::getState, AiTypeEnum.AI_MEMBER_ANSWER_STATE_DONE.getCode()) ); } } src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
@@ -132,7 +132,7 @@ //判断mallMemberMap中是否存在该会员 apiMemberTeamPageVo.setNickName(mallMemberMap.containsKey(aiMemberId) ? mallMemberMap.get(aiMemberId).getName() : ""); apiMemberTeamPageVo.setMemberName(mallMemberMap.containsKey(aiMemberId) ? mallMemberMap.get(aiMemberId).getName() : ""); apiMemberTeamPageVo.setMemberName(mallMemberMap.containsKey(aiMemberId) ? mallMemberMap.get(aiMemberId).getRealName() : ""); Integer practiceCnt = 0; if (memberIdToCntMapTalk.containsKey(aiMemberId)){ practiceCnt = memberIdToCntMapTalk.get(aiMemberId); @@ -378,7 +378,6 @@ @Override public FebsResponse studyList(ApiCompanyStudyDto dto) { List<ApiCompanyStudyVo> objects = new ArrayList<>(); String companyId = LoginUserUtil.getLoginUser().getCompanyId(); String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); @@ -393,6 +392,23 @@ // 创建分页对象,传入当前页和每页大小 Page<ApiCompanyStudyVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); IPage<ApiCompanyStudyVo> result = aiMemberAnswerService.selectListPage(dto, page); List<ApiCompanyStudyVo> records = result.getRecords(); if (CollUtil.isNotEmpty(records)){ //stream流获取re cords集合中的元素productId的set集合 Set<String> collect = records.stream().map(ApiCompanyStudyVo::getProductId).collect(Collectors.toSet()); List<AiMemberAnswer> list = aiMemberAnswerService.getIdListByCompanyIdAndProductId(companyId, collect); if (CollUtil.isNotEmpty(list)){ //利用stream流,操作集合list,返回一个map对象,key为productId,value为按照productId分组的集合的大小,默认值为0 Map<String, Long> memberAnswerItemCountMap = list.stream().collect(Collectors.groupingBy( AiMemberAnswer::getProductId, Collectors.counting() )); for ( ApiCompanyStudyVo record : records){ record.setPracticeCnt(memberAnswerItemCountMap.getOrDefault(record.getProductId(), 0L).intValue()); } } } return new FebsResponse().success().data(result); } @@ -432,6 +448,7 @@ LambdaQueryWrapper<AiMemberAnswerItem> memberAnswerItemLambdaQueryWrapper = Wrappers.lambdaQuery(AiMemberAnswerItem.class); memberAnswerItemLambdaQueryWrapper.in(AiMemberAnswerItem::getMemberAnswerQuestionId,questionItemIdSet); memberAnswerItemLambdaQueryWrapper.eq(AiMemberAnswerItem::getCompanyId,companyId); memberAnswerItemLambdaQueryWrapper.isNotNull(AiMemberAnswerItem::getAnswer); List<AiMemberAnswerItem> memberAnswerItemList = aiMemberAnswerItemService.getListByQuery(memberAnswerItemLambdaQueryWrapper); //利用stream流,操作集合memberAnswerItemList,返回一个map对象,key为memberAnswerQuestionId,value为按照memberAnswerQuestionId分组的集合的大小,默认值为0 Map<String, Long> memberAnswerItemCountMap = @@ -479,29 +496,48 @@ LambdaQueryWrapper<AiMemberAnswerItem> memberAnswerItemLambdaQueryWrapper = Wrappers.lambdaQuery(AiMemberAnswerItem.class); memberAnswerItemLambdaQueryWrapper.eq(AiMemberAnswerItem::getProductQuestionId,productQuestionId); memberAnswerItemLambdaQueryWrapper.eq(AiMemberAnswerItem::getCompanyId,companyId); memberAnswerItemLambdaQueryWrapper.isNotNull(AiMemberAnswerItem::getAnswer); List<AiMemberAnswerItem> memberAnswerItemList = aiMemberAnswerItemService.getListByQuery(memberAnswerItemLambdaQueryWrapper); if ( CollUtil.isEmpty(memberAnswerItemList)){ return new FebsResponse().success().data(objects); } LambdaQueryWrapper<AiProductQuestionItem> answerQuery = Wrappers.lambdaQuery(AiProductQuestionItem.class); answerQuery.select( AiProductQuestionItem::getId,AiProductQuestionItem::getAnswer); answerQuery.eq(AiProductQuestionItem::getProductQuestionId,productQuestionId); answerQuery.eq(AiProductQuestionItem::getCompanyId,companyId); List<AiProductQuestionItem> answerQueryList = aiProductQuestionItemService.getListByQuery(answerQuery); Map<String, AiProductQuestionItem> answerMap = answerQueryList.stream().collect(Collectors.toMap(AiProductQuestionItem::getId, aiProductQuestionItem -> aiProductQuestionItem)); Set<String> memberIdSet = memberAnswerItemList.stream().map(AiMemberAnswerItem::getMemberId).collect(Collectors.toSet()); List<MallMember> mallMembers = mallMemberMapper.selectList( Wrappers.lambdaQuery(MallMember.class) .select(MallMember::getMemberUuid, MallMember::getName, MallMember::getRealName) .in(MallMember::getMemberUuid, memberIdSet) .eq(MallMember::getCompanyId, companyId) ); //Stream流操作mallMembers,获取一个map<memberUuid,mallMember>的对象 Map<String, MallMember> mallMemberMap = mallMembers.stream().collect(Collectors.toMap(MallMember::getMemberUuid, mallMember -> mallMember)); for (AiMemberAnswerItem memberAnswerItem : memberAnswerItemList){ ApiCompanyStudyInfoVo vo = new ApiCompanyStudyInfoVo(); vo.setMemberName(mallMemberMap.get(memberAnswerItem.getMemberId()).getName()); vo.setNickName(mallMemberMap.get(memberAnswerItem.getMemberId()).getRealName()); vo.setMemberName(mallMemberMap.get(memberAnswerItem.getMemberId()).getRealName()); vo.setNickName(mallMemberMap.get(memberAnswerItem.getMemberId()).getName()); vo.setMemberAnswerState(memberAnswerItem.getMemberAnswerState()); vo.setAnswer( memberAnswerItem.getAnswer()); vo.setAnswer(answerMap.get(memberAnswerItem.getMemberAnswerQuestionId()).getAnswer()); objects.add(vo); } return new FebsResponse().success().data(objects); } @Override public FebsResponse studyRecordList(ApiCompanyStudyRecordDto dto) { String companyId = LoginUserUtil.getLoginUser().getCompanyId(); dto.setCompanyId( companyId); // 创建分页对象,传入当前页和每页大小 Page<ApiCompanyStudyRecordVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); IPage<ApiCompanyStudyRecordVo> result = aiMemberAnswerService.getStudyRecordList(page,dto); return new FebsResponse().success().data(result); } } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -3,6 +3,7 @@ import cc.mrbird.febs.ai.entity.AiCompany; import cc.mrbird.febs.ai.entity.AiCompanyMemberApply; import cc.mrbird.febs.ai.entity.AiMember; import cc.mrbird.febs.ai.enumerates.AiCommonEnum; import cc.mrbird.febs.ai.mapper.AiCompanyMapper; import cc.mrbird.febs.ai.mapper.AiCompanyMemberApplyMapper; import cc.mrbird.febs.ai.mapper.AiMemberMapper; src/main/resources/application-test.yml
@@ -2,7 +2,7 @@ datasource: dynamic: # 是否开启 SQL日志输出,生产环境建议关闭,有性能损耗 p6spy: false p6spy: true hikari: connection-timeout: 30000 max-lifetime: 1800000 src/main/resources/mapper/modules/AiMemberAnswerMapper.xml
@@ -52,11 +52,26 @@ a.target as target from ai_member_answer b left join ai_product a on b.product_id = a.id and a.state = 1 where b.member_id = #{record.memberUuid} and b.company_id = #{record.companyId} where b.company_id = #{record.companyId} and b.state = 1 group by b.product_id order by b.CREATED_TIME desc </select> <select id="getStudyRecordList" resultType="cc.mrbird.febs.ai.res.member.ApiCompanyStudyRecordVo"> select a.name as nickName, a.real_name as memberName, b.score as score from ai_member_answer b left join mall_member a on b.member_id = a.member_uuid where b.product_id = #{record.productId} and b.company_id = #{record.companyId} and b.state = 1 order by b.score desc </select> </mapper>