|
|
@@ -3,6 +3,7 @@ package com.fs.course.service.impl;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.fs.common.utils.DateUtils;
|
|
|
+import com.fs.common.utils.DictUtils;
|
|
|
import com.fs.common.utils.PubFun;
|
|
|
import com.fs.company.domain.Company;
|
|
|
import com.fs.company.domain.CompanyUser;
|
|
|
@@ -15,10 +16,12 @@ import com.fs.course.mapper.FsCourseWatchLogMapper;
|
|
|
import com.fs.course.mapper.FsUserCompanyBindMapper;
|
|
|
import com.fs.course.mapper.FsUserCourseMapper;
|
|
|
import com.fs.course.service.IFsUserCompanyBindService;
|
|
|
+import com.fs.course.service.IUserProjectRepeatMaintainService;
|
|
|
import com.fs.course.support.CourseProjectEquivalence;
|
|
|
import com.fs.course.vo.CourseProgressResultVO;
|
|
|
import com.fs.course.vo.RelatedSalesResultVO;
|
|
|
import com.fs.course.vo.RepeatCourseHistoryVO;
|
|
|
+import com.fs.course.vo.RepeatProjectResultVO;
|
|
|
import com.fs.course.vo.UserWatchLogListVo;
|
|
|
import com.fs.his.mapper.FsUserMapper;
|
|
|
import com.fs.qw.domain.QwCompany;
|
|
|
@@ -37,12 +40,9 @@ import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
-import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
-import java.util.Objects;
|
|
|
-import java.util.Set;
|
|
|
-import java.util.stream.Collectors;
|
|
|
+import java.util.TreeSet;
|
|
|
|
|
|
/**
|
|
|
* 用户客服关联Service业务层处理
|
|
|
@@ -56,6 +56,7 @@ import java.util.stream.Collectors;
|
|
|
public class FsUserCompanyBindServiceImpl extends ServiceImpl<FsUserCompanyBindMapper, FsUserCompanyBind> implements IFsUserCompanyBindService {
|
|
|
|
|
|
private final CompanyUserMapper companyUserMapper;
|
|
|
+ private final IUserProjectRepeatMaintainService userProjectRepeatMaintainService;
|
|
|
private FsUserMapper fsUserMapper;
|
|
|
private FsCourseWatchLogMapper fsCourseWatchLogMapper;
|
|
|
private QwExternalContactMapper qwExternalContactMapper;
|
|
|
@@ -166,7 +167,7 @@ public class FsUserCompanyBindServiceImpl extends ServiceImpl<FsUserCompanyBindM
|
|
|
}
|
|
|
}
|
|
|
if (qwExternalContact.getUserRepeat() == 0 && project != 0
|
|
|
- && isRepeatWatchByProject(fsUserId, project, qwUserId)) {
|
|
|
+ && userProjectRepeatMaintainService.isRepeatByProject(fsUserId, project)) {
|
|
|
qwExternalContact.setUserRepeat(1);
|
|
|
qwExternalContactMapper.updateById(qwExternalContact);
|
|
|
}
|
|
|
@@ -198,6 +199,7 @@ public class FsUserCompanyBindServiceImpl extends ServiceImpl<FsUserCompanyBindM
|
|
|
}
|
|
|
try {
|
|
|
save(bind);
|
|
|
+ userProjectRepeatMaintainService.maintain(fsUserId, project, qwUserId, companyId);
|
|
|
} catch (Exception e) {
|
|
|
log.error("添加重粉失败", e);
|
|
|
}
|
|
|
@@ -239,6 +241,7 @@ public class FsUserCompanyBindServiceImpl extends ServiceImpl<FsUserCompanyBindM
|
|
|
one.setUpdateTime(new Date());
|
|
|
try {
|
|
|
save(one);
|
|
|
+ userProjectRepeatMaintainService.maintain(fsUserId, course.getProject(), qwUserId, one.getCompanyId());
|
|
|
} catch (Exception e) {
|
|
|
log.error("添加重粉失败", e);
|
|
|
}
|
|
|
@@ -254,6 +257,10 @@ public class FsUserCompanyBindServiceImpl extends ServiceImpl<FsUserCompanyBindM
|
|
|
if(param.getExternalUserId() == null && param.getFsUserId() == null){
|
|
|
return Collections.emptyList();
|
|
|
}
|
|
|
+ if (param.getProjectId() != null && param.getProjectId() != 0) {
|
|
|
+ param.setEquivalentProjectIds(
|
|
|
+ CourseProjectEquivalence.equivalentProjectIds(param.getProjectId().longValue()));
|
|
|
+ }
|
|
|
List<UserWatchLogListVo> list = baseMapper.getWatchLogList(param);
|
|
|
// 权限判断:如果传了companyId,对无权限的主体脱敏
|
|
|
if (param.getCompanyId() != null && list != null) {
|
|
|
@@ -289,7 +296,8 @@ public class FsUserCompanyBindServiceImpl extends ServiceImpl<FsUserCompanyBindM
|
|
|
vo.setAvatar(contact.getAvatar());
|
|
|
vo.setRemark(contact.getRemark());
|
|
|
}
|
|
|
- vo.setUserRepeat(isUserRepeatByProject(fsUserId) ? 1 : 0);
|
|
|
+ vo.setUserRepeat(userProjectRepeatMaintainService.isRepeatInAnyProject(fsUserId) ? 1 : 0);
|
|
|
+ vo.setProjectList(buildUserProjectList(fsUserId));
|
|
|
|
|
|
// 2. 查询关联销售(单条SQL + GROUP BY 优化)
|
|
|
List<RelatedSalesResultVO> salesResults = baseMapper.getRelatedSalesByFsUserId(fsUserId);
|
|
|
@@ -318,6 +326,7 @@ public class FsUserCompanyBindServiceImpl extends ServiceImpl<FsUserCompanyBindM
|
|
|
RepeatCourseHistoryVO.CourseProgressVO cp = new RepeatCourseHistoryVO.CourseProgressVO();
|
|
|
cp.setCourseId(c.getCourseId());
|
|
|
cp.setCourseName(c.getCourseName());
|
|
|
+ cp.setProjectId(c.getProjectId());
|
|
|
cp.setTotalCount(c.getTotalCount() != null ? c.getTotalCount() : 0);
|
|
|
cp.setWatchedCount(c.getWatchedCount() != null ? c.getWatchedCount() : 0);
|
|
|
// 计算百分比
|
|
|
@@ -367,41 +376,40 @@ public class FsUserCompanyBindServiceImpl extends ServiceImpl<FsUserCompanyBindM
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 按项目判重:同一项目(含等价项目)下存在至少两个不同企微销售则视为看课重粉。
|
|
|
+ * 构建客户企微发课看过的项目列表:等价项目(如百膳食养/安康食养)分项展示,重粉项目标记 isRepeat=1。
|
|
|
*/
|
|
|
- private boolean isUserRepeatByProject(Long fsUserId) {
|
|
|
- List<FsUserCompanyBind> binds = baseMapper.selectList(
|
|
|
- new QueryWrapper<FsUserCompanyBind>()
|
|
|
- .eq("fs_user_id", fsUserId)
|
|
|
- .isNotNull("project_id")
|
|
|
- .ne("project_id", 0)
|
|
|
- .isNotNull("qw_user_id"));
|
|
|
- if (binds.isEmpty()) {
|
|
|
- return false;
|
|
|
+ private List<RepeatCourseHistoryVO.RepeatProjectVO> buildUserProjectList(Long fsUserId) {
|
|
|
+ List<RepeatProjectResultVO> watched = baseMapper.getUserWatchedProjectsByFsUserId(fsUserId);
|
|
|
+ Map<Long, String> nameMap = new HashMap<>();
|
|
|
+ TreeSet<Long> projectIds = new TreeSet<>();
|
|
|
+ if (watched != null) {
|
|
|
+ for (RepeatProjectResultVO item : watched) {
|
|
|
+ if (item.getProjectId() == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ projectIds.add(item.getProjectId());
|
|
|
+ if (item.getProjectName() != null) {
|
|
|
+ nameMap.put(item.getProjectId(), item.getProjectName());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- Map<String, Set<Long>> groupToQwUsers = new HashMap<>();
|
|
|
- for (FsUserCompanyBind bind : binds) {
|
|
|
- String groupKey = CourseProjectEquivalence.equivalentProjectIds(bind.getProjectId())
|
|
|
- .stream().sorted().map(String::valueOf).collect(Collectors.joining(","));
|
|
|
- groupToQwUsers.computeIfAbsent(groupKey, k -> new HashSet<>()).add(bind.getQwUserId());
|
|
|
+ // 等价项目组 1/28:只要看过其中任一,两个项目名都展示
|
|
|
+ if (projectIds.contains(1L) || projectIds.contains(28L)) {
|
|
|
+ projectIds.add(1L);
|
|
|
+ projectIds.add(28L);
|
|
|
}
|
|
|
- return groupToQwUsers.values().stream().anyMatch(qwUserIds -> qwUserIds.size() >= 2);
|
|
|
- }
|
|
|
-
|
|
|
- private boolean isRepeatWatchByProject(Long fsUserId, Long projectId, Long currentQwUserId) {
|
|
|
- List<Long> equivalentProjectIds = CourseProjectEquivalence.equivalentProjectIds(projectId);
|
|
|
- List<FsUserCompanyBind> binds = baseMapper.selectList(
|
|
|
- new QueryWrapper<FsUserCompanyBind>()
|
|
|
- .eq("fs_user_id", fsUserId)
|
|
|
- .in("project_id", equivalentProjectIds)
|
|
|
- .isNotNull("qw_user_id"));
|
|
|
- Set<Long> qwUserIds = binds.stream()
|
|
|
- .map(FsUserCompanyBind::getQwUserId)
|
|
|
- .filter(Objects::nonNull)
|
|
|
- .collect(Collectors.toSet());
|
|
|
- if (currentQwUserId != null) {
|
|
|
- qwUserIds.add(currentQwUserId);
|
|
|
+ List<RepeatCourseHistoryVO.RepeatProjectVO> list = new ArrayList<>();
|
|
|
+ for (Long projectId : projectIds) {
|
|
|
+ RepeatCourseHistoryVO.RepeatProjectVO vo = new RepeatCourseHistoryVO.RepeatProjectVO();
|
|
|
+ vo.setProjectId(projectId);
|
|
|
+ String projectName = nameMap.get(projectId);
|
|
|
+ if (projectName == null) {
|
|
|
+ projectName = DictUtils.getDictLabel("sys_course_project", String.valueOf(projectId));
|
|
|
+ }
|
|
|
+ vo.setProjectName(projectName);
|
|
|
+ vo.setIsRepeat(userProjectRepeatMaintainService.isRepeatByProject(fsUserId, projectId) ? 1 : 0);
|
|
|
+ list.add(vo);
|
|
|
}
|
|
|
- return qwUserIds.size() >= 2;
|
|
|
+ return list;
|
|
|
}
|
|
|
}
|