From b91286e6ced34f4a87b655b8bfd91ac6a4d82107 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 20 Oct 2025 11:11:44 +0800
Subject: [PATCH] feat(ai): 添加企业成员申请功能 - 创建企业成员申请实体类 AiCompanyMemberApply - 定义成员ID、企业编码、企业名称和状态字段 - 实现 MyBatis-Plus 的 BaseMapper 接口 - 配置对应的 XML 映射文件 - 提供 IService 服务接口及其实现类 - 支持企业成员绑定审核流程的状态管理
---
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 209 insertions(+), 21 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
index f09837b..5dc5c78 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
@@ -1,17 +1,23 @@
package cc.mrbird.febs.ai.service.impl;
-import cc.mrbird.febs.ai.entity.AiMember;
-import cc.mrbird.febs.ai.entity.AiMemberTalk;
+import cc.mrbird.febs.ai.entity.*;
+import cc.mrbird.febs.ai.enumerates.AiTypeEnum;
import cc.mrbird.febs.ai.mapper.AiMemberMapper;
-import cc.mrbird.febs.ai.req.member.ApiMemberPageDto;
-import cc.mrbird.febs.ai.res.member.ApiMemberPageVo;
-import cc.mrbird.febs.ai.service.AiMemberService;
-import cc.mrbird.febs.ai.service.AiMemberTalkService;
+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;
@@ -20,10 +26,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -37,16 +40,25 @@
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(ApiMemberPageDto dto) {
- List<ApiMemberPageVo> objects = new ArrayList<>();
+ public FebsResponse myTeam(ApiMemberTeamPageDto dto) {
+ List<ApiMemberTeamPageVo> 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<AiMember> page = new Page<>(dto.getPageNow(), dto.getPageSize());
@@ -56,12 +68,12 @@
Page<AiMember> pageListByQuery = aiMemberMapper.selectPage(page, queryWrapper);
List<AiMember> records = pageListByQuery.getRecords();
if (CollUtil.isNotEmpty( records)){
- objects = buildMemberPages(companyId,records,objects);
+ objects = buildMemberPages(memberUuid,companyId,records,objects);
}
return new FebsResponse().success().data(objects);
}
- private List<ApiMemberPageVo> buildMemberPages(String companyId,List<AiMember> records,List<ApiMemberPageVo> objects) {
+ private List<ApiMemberTeamPageVo> buildMemberPages(String memberUuid, String companyId, List<AiMember> records, List<ApiMemberTeamPageVo> objects) {
/**
* 获取用户信息
*/
@@ -78,24 +90,200 @@
Map<String, MallMember> mallMemberMap = mallMembers.stream().collect(Collectors.toMap(MallMember::getMemberUuid, mallMember -> mallMember));
/**
- * 获取用户联系次数
+ * 获取用户练习次数
* ai陪练
* ai答题
*/
List<AiMemberTalk> aiMemberTalks = aiMemberTalkService.getListByCompanyId(companyId);
- //Stream流操作aiMemberTalks,获取一个map<memberUuid,aiMemberTalk>的对象
+ //stream流操作aiMemberTalks,获取一个Map<memberId,Integer>的对象,integer代表按照memberId分组的数量
+ Map<String, Integer> memberIdToCntMapTalk = aiMemberTalks.stream()
+ .collect(Collectors.groupingBy(
+ AiMemberTalk::getMemberId,
+ Collectors.summingInt(t -> 1)
+ ));
+
+ List<AiMemberAnswer> aiMemberAnswers = aiMemberAnswerService.getListByCompanyId(companyId);
+ //stream流操作aiMemberAnswers,获取一个Map<memberId,Integer>的对象,integer代表按照memberId分组的数量
+ Map<String, Integer> memberIdToCntMapAnswer = aiMemberAnswers.stream()
+ .collect(Collectors.groupingBy(
+ AiMemberAnswer::getMemberId,
+ Collectors.summingInt(a -> 1)
+ ));
+ /**
+ * 用户学习总时长
+ */
+ List<AiMemberPoint> aiMemberPoints = aiMemberPointService.getListByCompanyId(companyId);
+ Map<String, Integer> memberStudyTimeMap = aiMemberPoints.stream().collect(Collectors.groupingBy(
+ AiMemberPoint::getMemberId,
+ Collectors.summingInt(AiMemberPoint::getTotalTime)
+ ));
for (AiMember aiMember : records){
- ApiMemberPageVo apiMemberPageVo = new ApiMemberPageVo();
- apiMemberPageVo.setMemberUuid(aiMember.getId());
+ String aiMemberId = aiMember.getId();
+ ApiMemberTeamPageVo apiMemberTeamPageVo = new ApiMemberTeamPageVo();
+ apiMemberTeamPageVo.setType(0);
+ apiMemberTeamPageVo.setMemberUuid(aiMemberId);
+ if (memberUuid.equals(aiMemberId)){
+ apiMemberTeamPageVo.setType(1);
+ }
//判断mallMemberMap中是否存在该会员
- apiMemberPageVo.setMemberName(mallMemberMap.containsKey(aiMember.getId()) ? mallMemberMap.get(aiMember.getId()).getName() : "");
- apiMemberPageVo.setNickName(mallMemberMap.containsKey(aiMember.getId()) ? mallMemberMap.get(aiMember.getId()).getName() : "");
+ 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);
- objects.add(apiMemberPageVo);
+ 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<ApiMemberTeamPracticeVo> vos = new ArrayList<>();
+
+ String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+ String memberUuid = dto.getMemberUuid();
+
+ // 创建分页对象,传入当前页和每页大小
+ Page<AiMemberTalk> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+ LambdaQueryWrapper<AiMemberTalk> queryWrapper = Wrappers.lambdaQuery(AiMemberTalk.class);
+ queryWrapper.eq(AiMemberTalk::getCompanyId, companyId);
+ queryWrapper.eq(AiMemberTalk::getMemberId, memberUuid);
+ queryWrapper.eq(AiMemberTalk::getState, AiTypeEnum.AI_MEMBER_TALK_STATE_DONE.getCode());
+ Page<AiMemberTalk> pageListByQuery = aiMemberTalkService.getBaseMapper().selectPage(page, queryWrapper);
+ List<AiMemberTalk> aiMemberTalks = pageListByQuery.getRecords();
+
+// List<AiMemberTalk> aiMemberTalks = aiMemberTalkService.getListByCompanyIdAndMemberUuid(companyId, memberUuid);
+
+ Map<String, List<AiMemberTalk>> aiMemberTalkMap = new HashMap<>();
+ if (CollUtil.isNotEmpty(aiMemberTalks)){
+ //stream操作aiMemberTalks,返回一个根据productId分组的集合
+ aiMemberTalkMap = aiMemberTalks.stream().collect(Collectors.groupingBy(AiMemberTalk::getProductId));
+ }
+
+ List<AiMemberAnswer> aiMemberAnswers = aiMemberAnswerService.getListByCompanyIdAndMemberUuid(companyId, memberUuid);
+ Map<String, List<AiMemberAnswer>> aiMemberAnswerMap = new HashMap<>();
+ if (CollUtil.isNotEmpty(aiMemberAnswers)){
+ aiMemberAnswerMap = aiMemberAnswers.stream().collect(Collectors.groupingBy(AiMemberAnswer::getProductId));
+ }
+
+ // 获取aiMemberTalkMap和aiMemberAnswerMap的全部的key,并且去重
+ Set<String> 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<AiProduct> 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<ApiMemberTeamStudyVo> vos = new ArrayList<>();
+
+ String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+ String memberUuid = dto.getMemberUuid();
+
+
+
+ // 创建分页对象,传入当前页和每页大小
+ Page<AiMemberPoint> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+ LambdaQueryWrapper<AiMemberPoint> queryWrapper = Wrappers.lambdaQuery(AiMemberPoint.class);
+ queryWrapper.eq(AiMemberPoint::getCompanyId, companyId);
+ queryWrapper.eq(AiMemberPoint::getMemberId, memberUuid);
+ Page<AiMemberPoint> pageListByQuery = aiMemberPointService.getBaseMapper().selectPage(page, queryWrapper);
+ List<AiMemberPoint> aiMemberPoints = pageListByQuery.getRecords();
+
+// List<AiMemberPoint> aiMemberPoints = aiMemberPointService.getListByCompanyIdAndMemberUuid(companyId, memberUuid);
+ if (CollUtil.isEmpty(aiMemberPoints)){
+ return new FebsResponse().success().data(vos);
+ }
+ Map<String, List<AiMemberPoint>> aiMemberPointMap = new HashMap<>();
+ if (CollUtil.isNotEmpty(aiMemberPoints)){
+ //stream操作aiMemberPoints,返回一个Map<productPointId,List<AiMemberPoint>>
+ aiMemberPointMap = aiMemberPoints.stream().collect(Collectors.groupingBy(AiMemberPoint::getProductPointId));
+ }
+
+ //stream流操作aiMemberPoints,返回一个productPointId的set集合
+ Set<String> productPointIdSet = aiMemberPoints.stream().map(AiMemberPoint::getProductPointId).collect(Collectors.toSet());
+
+ List<AiProductPoint> 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())){
+ List<AiMemberPoint> memberPoints = aiMemberPointMap.get(aiProductPoint.getId());
+ for (AiMemberPoint memberPoint : memberPoints){
+ totalTime += memberPoint.getTotalTime();
+ }
+ }
+ vo.setTotalTime(DateUtil.secondToTime(totalTime));
+
+ vos.add(vo);
+ }
+
+ return new FebsResponse().success().data(vos);
+ }
}
--
Gitblit v1.9.1