package cc.mrbird.febs.ai.service.impl; import cc.mrbird.febs.ai.entity.*; import cc.mrbird.febs.ai.mapper.AiMemberMapper; import cc.mrbird.febs.ai.req.member.ApiMemberTeamPageDto; import cc.mrbird.febs.ai.req.member.ApiMemberTeamPracticeDto; import cc.mrbird.febs.ai.req.member.ApiMemberTeamStudyDto; import cc.mrbird.febs.ai.res.member.ApiMemberTeamPageVo; import cc.mrbird.febs.ai.res.member.ApiMemberTeamPracticeVo; import cc.mrbird.febs.ai.res.member.ApiMemberTeamStudyVo; import cc.mrbird.febs.ai.res.productPoint.ApiProductPointListVo; import cc.mrbird.febs.ai.service.*; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; /** * @author Administrator */ @Slf4j @Service @RequiredArgsConstructor public class AiMemberServiceImpl extends ServiceImpl implements AiMemberService { private final AiMemberMapper aiMemberMapper; private final MallMemberMapper mallMemberMapper; private final AiMemberTalkService aiMemberTalkService; private final AiMemberAnswerService aiMemberAnswerService; private final AiMemberPointService aiMemberPointService; private final AiProductService aiProductService; private final AiProductPointService aiProductPointService; @Override public AiMember getById(String id) { return aiMemberMapper.selectById( id); } @Override public FebsResponse myTeam(ApiMemberTeamPageDto dto) { List objects = new ArrayList<>(); String companyId = LoginUserUtil.getLoginUser().getCompanyId(); String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); Integer checkOrder = LoginUserUtil.getLoginUser().getCheckOrder(); if (1 != checkOrder){ throw new FebsException("非管理员,无权限查看"); } // 创建分页对象,传入当前页和每页大小 Page page = new Page<>(dto.getPageNow(), dto.getPageSize()); LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(AiMember.class); queryWrapper.eq(AiMember::getCompanyId, companyId); Page pageListByQuery = aiMemberMapper.selectPage(page, queryWrapper); List records = pageListByQuery.getRecords(); if (CollUtil.isNotEmpty( records)){ objects = buildMemberPages(memberUuid,companyId,records,objects); } return new FebsResponse().success().data(objects); } private List buildMemberPages(String memberUuid, String companyId, List records, List objects) { /** * 获取用户信息 */ //stream流操作records,获取全部的id Set memberIds = records.stream().map(AiMember::getId).collect(Collectors.toSet()); List mallMembers = mallMemberMapper.selectList( Wrappers.lambdaQuery(MallMember.class) .select(MallMember::getMemberUuid, MallMember::getName, MallMember::getRealName) .in(MallMember::getMemberUuid, memberIds) .eq(MallMember::getCompanyId, companyId) ); //Stream流操作mallMembers,获取一个map的对象 Map mallMemberMap = mallMembers.stream().collect(Collectors.toMap(MallMember::getMemberUuid, mallMember -> mallMember)); /** * 获取用户练习次数 * ai陪练 * ai答题 */ List aiMemberTalks = aiMemberTalkService.getListByCompanyId(companyId); //stream流操作aiMemberTalks,获取一个Map的对象,integer代表按照memberId分组的数量 Map memberIdToCntMapTalk = aiMemberTalks.stream() .collect(Collectors.groupingBy( AiMemberTalk::getMemberId, Collectors.summingInt(t -> 1) )); List aiMemberAnswers = aiMemberAnswerService.getListByCompanyId(companyId); //stream流操作aiMemberAnswers,获取一个Map的对象,integer代表按照memberId分组的数量 Map memberIdToCntMapAnswer = aiMemberAnswers.stream() .collect(Collectors.groupingBy( AiMemberAnswer::getMemberId, Collectors.summingInt(a -> 1) )); /** * 用户学习总时长 */ List aiMemberPoints = aiMemberPointService.getListByCompanyId(companyId); Map memberStudyTimeMap = aiMemberPoints.stream().collect(Collectors.groupingBy( AiMemberPoint::getMemberId, Collectors.summingInt(AiMemberPoint::getTotalTime) )); for (AiMember aiMember : records){ String aiMemberId = aiMember.getId(); ApiMemberTeamPageVo apiMemberTeamPageVo = new ApiMemberTeamPageVo(); apiMemberTeamPageVo.setType(0); apiMemberTeamPageVo.setMemberUuid(aiMemberId); if (memberUuid.equals(aiMemberId)){ apiMemberTeamPageVo.setType(1); } //判断mallMemberMap中是否存在该会员 apiMemberTeamPageVo.setNickName(mallMemberMap.containsKey(aiMemberId) ? mallMemberMap.get(aiMemberId).getName() : ""); apiMemberTeamPageVo.setMemberName(mallMemberMap.containsKey(aiMemberId) ? mallMemberMap.get(aiMemberId).getName() : ""); Integer practiceCnt = 0; if (memberIdToCntMapTalk.containsKey(aiMemberId)){ practiceCnt = memberIdToCntMapTalk.get(aiMemberId); } if (memberIdToCntMapAnswer.containsKey(aiMemberId)){ practiceCnt = memberIdToCntMapAnswer.get(aiMemberId) + practiceCnt; } apiMemberTeamPageVo.setPracticeCnt(practiceCnt); Integer studyTime = 0; if (memberStudyTimeMap.containsKey(aiMemberId)){ studyTime = memberStudyTimeMap.get(aiMemberId); } apiMemberTeamPageVo.setStudyTime(DateUtil.secondToTime(studyTime)); objects.add(apiMemberTeamPageVo); } return objects; } @Override public FebsResponse practice(ApiMemberTeamPracticeDto dto) { List vos = new ArrayList<>(); String companyId = LoginUserUtil.getLoginUser().getCompanyId(); String memberUuid = dto.getMemberUuid(); List aiMemberTalks = aiMemberTalkService.getListByCompanyIdAndMemberUuid(companyId, memberUuid); Map> aiMemberTalkMap = new HashMap<>(); if (CollUtil.isNotEmpty(aiMemberTalks)){ //stream操作aiMemberTalks,返回一个根据productId分组的集合 aiMemberTalkMap = aiMemberTalks.stream().collect(Collectors.groupingBy(AiMemberTalk::getProductId)); } List aiMemberAnswers = aiMemberAnswerService.getListByCompanyIdAndMemberUuid(companyId, memberUuid); Map> aiMemberAnswerMap = new HashMap<>(); if (CollUtil.isNotEmpty(aiMemberAnswers)){ aiMemberAnswerMap = aiMemberAnswers.stream().collect(Collectors.groupingBy(AiMemberAnswer::getProductId)); } // 获取aiMemberTalkMap和aiMemberAnswerMap的全部的key,并且去重 Set productIds = new HashSet<>(); if (aiMemberTalkMap != null) { productIds.addAll(aiMemberTalkMap.keySet()); } if (aiMemberAnswerMap != null) { productIds.addAll(aiMemberAnswerMap.keySet()); } if (CollUtil.isEmpty(productIds)){ return new FebsResponse().success().data(vos); } List aiProducts = aiProductService.getProductListByQuery( Wrappers.lambdaQuery(AiProduct.class) .select(AiProduct::getId,AiProduct::getName, AiProduct::getTarget) .in(AiProduct::getId, productIds) ); if (CollUtil.isEmpty(aiProducts)){ return new FebsResponse().success().data(vos); } for (AiProduct aiProduct : aiProducts){ String productId = aiProduct.getId(); ApiMemberTeamPracticeVo vo = new ApiMemberTeamPracticeVo(); vo.setName(aiProduct.getName()); vo.setTarget(aiProduct.getTarget()); Integer answerCnt = 0; if (aiMemberAnswerMap.containsKey(productId)){ answerCnt = aiMemberAnswerMap.get(productId).size(); } vo.setAnswerCnt(answerCnt); Integer talkCnt = 0; if (aiMemberTalkMap.containsKey(productId)){ talkCnt = aiMemberTalkMap.get(productId).size(); } vo.setTalkCnt(talkCnt); vos.add( vo); } return new FebsResponse().success().data(vos); } @Override public FebsResponse study(ApiMemberTeamStudyDto dto) { List vos = new ArrayList<>(); String companyId = LoginUserUtil.getLoginUser().getCompanyId(); String memberUuid = dto.getMemberUuid(); List aiMemberPoints = aiMemberPointService.getListByCompanyIdAndMemberUuid(companyId, memberUuid); if (CollUtil.isEmpty(aiMemberPoints)){ return new FebsResponse().success().data(vos); } Map aiMemberPointMap = new HashMap<>(); if (CollUtil.isNotEmpty(aiMemberPoints)){ aiMemberPoints.forEach(aiMemberPoint -> aiMemberPointMap.put(aiMemberPoint.getProductPointId(),aiMemberPoint)); } //stream流操作aiMemberPoints,返回一个productPointId的set集合 Set productPointIdSet = aiMemberPoints.stream().map(AiMemberPoint::getProductPointId).collect(Collectors.toSet()); List aiProductPoints = aiProductPointService.getBaseMapper().selectList( Wrappers.lambdaQuery(AiProductPoint.class) .select(AiProductPoint::getId,AiProductPoint::getTitle) .in(AiProductPoint::getId, productPointIdSet) ); if (CollUtil.isEmpty(aiProductPoints)){ return new FebsResponse().success().data(vos); } for (AiProductPoint aiProductPoint : aiProductPoints){ ApiMemberTeamStudyVo vo = new ApiMemberTeamStudyVo(); vo.setTitle(aiProductPoint.getTitle()); Integer totalTime = 0; if (aiMemberPointMap.containsKey(aiProductPoint.getId())){ totalTime = aiMemberPointMap.get(aiProductPoint.getId()).getTotalTime(); } vo.setTotalTime(DateUtil.secondToTime(totalTime)); vos.add(vo); } return new FebsResponse().success().data(vos); } }