9 files modified
2 files added
157 ■■■■■ 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/AiMemberAnswerMapper.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyRecordDto.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyRecordVo.java 19 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java 7 ●●●●● 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/impl/AiMemberAnswerServiceImpl.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java 48 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 1 ●●●● patch | view | raw | blame | history
src/main/resources/application-test.yml 2 ●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/AiMemberAnswerMapper.xml 19 ●●●● patch | view | raw | blame | history
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>