|
@@ -26,6 +26,7 @@ import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.TeacherTypeEnum;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.im.EImGroupMemberRoleType;
|
|
|
import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
|
|
|
import com.yonge.cooleshow.biz.dal.mapper.UserTenantBindRecordMapper;
|
|
|
import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
|
|
@@ -66,6 +67,7 @@ import com.yonge.cooleshow.common.enums.CacheNameEnum;
|
|
|
import com.yonge.cooleshow.common.enums.ESettlementFrom;
|
|
|
import com.yonge.cooleshow.common.enums.ETenantUnBindAuditStatus;
|
|
|
import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
|
|
|
+import com.yonge.cooleshow.common.enums.UserLockFlag;
|
|
|
import com.yonge.cooleshow.common.enums.YesOrNoEnum;
|
|
|
import com.yonge.toolset.base.exception.BizException;
|
|
|
import com.yonge.toolset.base.util.StringUtil;
|
|
@@ -367,6 +369,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
|
|
|
|
|
|
teacherHomeVo.setDegreeDate(teacher.getDegreeDate());
|
|
|
teacherHomeVo.setTeacherDate(teacher.getTeacherDate());
|
|
|
+ teacherHomeVo.setCustomerService(teacher.getCustomerService());
|
|
|
//身份证号、手机号脱敏
|
|
|
teacherHomeVo.setIdCardNo(ValueUtil.fuzzyIdCard(teacherHomeVo.getIdCardNo()));
|
|
|
// teacherHomeVo.setPhone(ValueUtil.fuzzyMobile(teacherHomeVo.getPhone()));
|
|
@@ -620,18 +623,20 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
|
|
|
sendBindUnBindSMS(teacher.getUserId(), teacherSubmitReq.getPhone(), MessageTypeEnum.TEACHER_BIND_TENANT, teacher.getTenantId());
|
|
|
|
|
|
// 与客服建立好友
|
|
|
- String customerService = customerServiceConfig.getCustomerService();
|
|
|
- if (StringUtils.isNotBlank(customerService)) {
|
|
|
- List<String> phones = Arrays.stream(customerService.split(",")).collect(Collectors.toList());
|
|
|
- Random rand = new Random();
|
|
|
- String mobile = phones.get(rand.nextInt(phones.size()));
|
|
|
- SysUser friend = sysUserMapper.findUserByPhone(mobile);
|
|
|
- if (friend != null) {
|
|
|
+ if (!Boolean.TRUE.equals(teacher.getCustomerService())) {
|
|
|
+ Teacher customerServiceTeacher = getCustomerServiceByFriendLeast();
|
|
|
+ if (customerServiceTeacher != null) {
|
|
|
imUserFriendService.registerUserBindCustomerService(teacher.getUserId(),
|
|
|
- Collections.singletonList(friend.getId()), ClientEnum.TEACHER);
|
|
|
+ Collections.singletonList(customerServiceTeacher.getUserId()), ClientEnum.TEACHER);
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
+ // 客服状态变更,移交好友信息
|
|
|
+ Boolean customerService = teacher.getCustomerService();
|
|
|
+ List<TeacherWrapper.CustomerServiceSendMsg2User> customerServiceSendMsg2User = new ArrayList<>();
|
|
|
+ if (Boolean.TRUE.equals(customerService) && Boolean.FALSE.equals(teacherSubmitReq.getCustomerService())) {
|
|
|
+ customerServiceSendMsg2User.addAll(transferFriend(teacher.getUserId(), true));
|
|
|
+ }
|
|
|
// 如果机构解绑,更新机构ID为-1
|
|
|
if (Boolean.TRUE.equals(teacherSubmitReq.getBindTenant())) {
|
|
|
teacherSubmitReq.setTenantId(-1L);
|
|
@@ -664,11 +669,200 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
|
|
|
// 老师头像
|
|
|
teacher.setAvatar(Optional.ofNullable(teacherSubmitReq.getAvatar()).orElse(teacher.getAvatar()));
|
|
|
baseMapper.updateById(teacher);
|
|
|
+
|
|
|
+
|
|
|
+ // 交接后的客服发送消息
|
|
|
+ if (Boolean.TRUE.equals(customerService) && Boolean.FALSE.equals(teacherSubmitReq.getCustomerService())) {
|
|
|
+ String customerMessage = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG);
|
|
|
+ String customerTitle = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG_TITLE);
|
|
|
+ for (TeacherWrapper.CustomerServiceSendMsg2User serviceSendMsg2User : customerServiceSendMsg2User) {
|
|
|
+ imUserFriendService.sendCustomerServiceAddFriendMessage(serviceSendMsg2User.getCustomerId(), customerTitle, customerMessage, serviceSendMsg2User.getTeacherIds(),
|
|
|
+ ClientEnum.TEACHER);
|
|
|
+ imUserFriendService.sendCustomerServiceAddFriendMessage(serviceSendMsg2User.getCustomerId(), customerTitle, customerMessage, serviceSendMsg2User.getStudentIds(),
|
|
|
+ ClientEnum.STUDENT);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
return teacher;
|
|
|
}
|
|
|
|
|
|
+ // 客服好友移交给其他客服
|
|
|
+ private List<TeacherWrapper.CustomerServiceSendMsg2User> transferFriend(Long userId, boolean saveGroupFriend) {
|
|
|
+ List<TeacherWrapper.CustomerServiceSendMsg2User> result = new ArrayList<>();
|
|
|
+ // 所有的好友
|
|
|
+ List<ImUserFriend> userFriendList = imUserFriendService.lambdaQuery()
|
|
|
+ .eq(ImUserFriend::getUserId, userId)
|
|
|
+ .eq(ImUserFriend::getClientType, ClientEnum.TEACHER)
|
|
|
+ .list();
|
|
|
+
|
|
|
+ // 其他客服
|
|
|
+ List<TeacherWrapper.TeacherFriend> customerServiceFriendNums = this.getBaseMapper().getCustomerServiceFriendNums();
|
|
|
+ customerServiceFriendNums.removeIf(n -> n.getTeacherId().equals(userId));
|
|
|
+ List<Long> customerIds = customerServiceFriendNums.stream().map(TeacherWrapper.TeacherFriend::getTeacherId).collect(Collectors.toList());
|
|
|
+ userFriendList.removeIf(n -> customerIds.contains(n.getFriendId()) && ClientEnum.TEACHER.equals(n.getFriendType()));
|
|
|
+ if (userFriendList.isEmpty()) { // 没有好友
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<ImUserFriend> removeFriendList = userFriendList;
|
|
|
+ if (saveGroupFriend) {
|
|
|
+ // 群里的好友保留
|
|
|
+ List<String> groupIdList = imGroupMemberService.lambdaQuery()
|
|
|
+ .eq(ImGroupMember::getUserId, userId)
|
|
|
+ .eq(ImGroupMember::getIsAdmin, true)
|
|
|
+ .eq(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Owner)
|
|
|
+ .list()
|
|
|
+ .stream()
|
|
|
+ .map(ImGroupMember::getGroupId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ List<Long> savedTeacherIdList = new ArrayList<>();
|
|
|
+ List<Long> savedStudentIdList = new ArrayList<>();
|
|
|
+
|
|
|
+ if (!groupIdList.isEmpty()) {
|
|
|
+ List<ImGroupMember> savedMemberList = imGroupMemberService.lambdaQuery()
|
|
|
+ .in(ImGroupMember::getGroupId, groupIdList)
|
|
|
+ .eq(ImGroupMember::getIsAdmin, false)
|
|
|
+ .ne(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Owner)
|
|
|
+ .list();
|
|
|
+
|
|
|
+ savedTeacherIdList.addAll(savedMemberList.stream()
|
|
|
+ .filter(n -> ImGroupMemberRoleType.TEACHER.equals(n.getRoleType()))
|
|
|
+ .map(ImGroupMember::getUserId)
|
|
|
+ .collect(Collectors.toList()));
|
|
|
+
|
|
|
+ savedStudentIdList.addAll(savedMemberList.stream()
|
|
|
+ .filter(n -> ImGroupMemberRoleType.STUDENT.equals(n.getRoleType()))
|
|
|
+ .map(ImGroupMember::getUserId)
|
|
|
+ .collect(Collectors.toList()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 机构好友保留
|
|
|
+ Teacher teacher = this.getById(userId);
|
|
|
+ List<Long> tenantTeacherIds = new ArrayList<>();
|
|
|
+ List<Long> tenantStudentIds = new ArrayList<>();
|
|
|
+ if (teacher.getTenantId() > 0) {
|
|
|
+ List<Long> teacherIdList = userFriendList.stream().filter(n -> ClientEnum.TEACHER.equals(n.getFriendType())).map(ImUserFriend::getFriendId).collect(Collectors.toList());
|
|
|
+ List<Long> studentIdList = userFriendList.stream().filter(n -> ClientEnum.STUDENT.equals(n.getFriendType())).map(ImUserFriend::getFriendId).collect(Collectors.toList());
|
|
|
+ if (!teacherIdList.isEmpty()) {
|
|
|
+ List<Long> tenantTeacherIdsTemp = this.lambdaQuery().in(Teacher::getUserId, teacherIdList)
|
|
|
+ .eq(Teacher::getTenantId, teacher.getTenantId())
|
|
|
+ .list()
|
|
|
+ .stream().filter(n -> n.getTenantId() > 0).map(Teacher::getUserId).collect(Collectors.toList());
|
|
|
+ tenantTeacherIds.addAll(tenantTeacherIdsTemp);
|
|
|
+ }
|
|
|
+ if (!studentIdList.isEmpty()) {
|
|
|
+ List<Long> tenantStudentIdsTemp = studentService.lambdaQuery().in(Student::getUserId, studentIdList)
|
|
|
+ .eq(Student::getTenantId, teacher.getTenantId())
|
|
|
+ .list()
|
|
|
+ .stream().filter(n -> n.getTenantId() > 0).map(Student::getUserId).collect(Collectors.toList());
|
|
|
+ tenantStudentIds.addAll(tenantStudentIdsTemp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除的好友
|
|
|
+ removeFriendList = userFriendList.stream().filter(n -> {
|
|
|
+ if (ClientEnum.STUDENT.equals(n.getFriendType())) {
|
|
|
+ if (tenantStudentIds.contains(n.getFriendId())) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return !savedStudentIdList.contains(n.getFriendId());
|
|
|
+ }
|
|
|
+ if (ClientEnum.TEACHER.equals(n.getFriendType())) {
|
|
|
+ if (tenantTeacherIds.contains(n.getFriendId())) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return !savedTeacherIdList.contains(n.getFriendId());
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除好友
|
|
|
+ removeFriendList.stream().collect(Collectors.groupingBy(ImUserFriend::getFriendType)).forEach((client, friends) -> {
|
|
|
+ List<Long> friendIds = friends.stream().map(ImUserFriend::getFriendId).collect(Collectors.toList());
|
|
|
+ imUserFriendService.lambdaUpdate()
|
|
|
+ .eq(ImUserFriend::getUserId, userId)
|
|
|
+ .eq(ImUserFriend::getClientType, ClientEnum.TEACHER)
|
|
|
+ .in(ImUserFriend::getFriendId, friendIds)
|
|
|
+ .eq(ImUserFriend::getFriendType, client)
|
|
|
+ .remove();
|
|
|
+
|
|
|
+ imUserFriendService.lambdaUpdate()
|
|
|
+ .eq(ImUserFriend::getFriendId, userId)
|
|
|
+ .eq(ImUserFriend::getFriendType, ClientEnum.TEACHER)
|
|
|
+ .in(ImUserFriend::getUserId, friendIds)
|
|
|
+ .eq(ImUserFriend::getClientType, client)
|
|
|
+ .remove();
|
|
|
+ });
|
|
|
+
|
|
|
+ if (customerIds.isEmpty()) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ // 去除好友里面存在其他客服关系的好友,只有没有客服好友的好友,才需要与客服建立好友关系
|
|
|
+ List<ImUserFriend> teacherFriends = userFriendList.stream().filter(n -> ClientEnum.TEACHER.equals(n.getFriendType())).collect(Collectors.toList());
|
|
|
+ if (!teacherFriends.isEmpty()) {
|
|
|
+ String teacherFriendIds = teacherFriends.stream().map(n -> n.getFriendId().toString()).distinct().collect(Collectors.joining(","));
|
|
|
+ List<Long> existFriendIds = imUserFriendService.getDao().queryExistCustomerServiceFriend(teacherFriendIds, ClientEnum.TEACHER.getCode())
|
|
|
+ .stream()
|
|
|
+ .map(ImUserFriend::getUserId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ userFriendList.removeIf(n -> ClientEnum.TEACHER.equals(n.getFriendType()) && existFriendIds.contains(n.getFriendId()));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<ImUserFriend> studentFriends = userFriendList.stream().filter(n -> ClientEnum.STUDENT.equals(n.getFriendType())).collect(Collectors.toList());
|
|
|
+ if (!studentFriends.isEmpty()) {
|
|
|
+ String studentFriendIds = studentFriends.stream().map(n -> n.getFriendId().toString()).distinct().collect(Collectors.joining(","));
|
|
|
+ List<Long> existFriendIds = imUserFriendService.getDao().queryExistCustomerServiceFriend(studentFriendIds, ClientEnum.STUDENT.getCode())
|
|
|
+ .stream()
|
|
|
+ .map(ImUserFriend::getUserId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ userFriendList.removeIf(n -> ClientEnum.STUDENT.equals(n.getFriendType()) && existFriendIds.contains(n.getFriendId()));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (userFriendList.isEmpty()) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 好友交接
|
|
|
+ Map<Long, Set<Long>> teacherFriendMap = new LinkedHashMap<>();
|
|
|
+ Map<Long, Set<Long>> studentFriendMap = new LinkedHashMap<>();
|
|
|
+ for (ImUserFriend imUserFriend : userFriendList) {
|
|
|
+ TeacherWrapper.TeacherFriend teacherFriend = customerServiceFriendNums.get(0);
|
|
|
+ if (ClientEnum.TEACHER.equals(imUserFriend.getFriendType())) {
|
|
|
+ Set<Long> set = teacherFriendMap.getOrDefault(teacherFriend.getTeacherId(), new HashSet<>());
|
|
|
+ set.add(imUserFriend.getFriendId());
|
|
|
+ teacherFriendMap.put(teacherFriend.getTeacherId(), set);
|
|
|
+ } else if (ClientEnum.STUDENT.equals(imUserFriend.getFriendType())) {
|
|
|
+ Set<Long> set = studentFriendMap.getOrDefault(teacherFriend.getTeacherId(), new HashSet<>());
|
|
|
+ set.add(imUserFriend.getFriendId());
|
|
|
+ studentFriendMap.put(teacherFriend.getTeacherId(), set);
|
|
|
+ }
|
|
|
+ teacherFriend.setFriendNums(teacherFriend.getFriendNums() + 1);
|
|
|
+ Collections.sort(customerServiceFriendNums);
|
|
|
+ }
|
|
|
+
|
|
|
+ teacherFriendMap.forEach((teacherId, teacherIds) -> {
|
|
|
+ imUserFriendService.saveUserTeacherFriend(teacherId, teacherIds);
|
|
|
+ // 发送消息
|
|
|
+ TeacherWrapper.CustomerServiceSendMsg2User customerServiceSendMsg2User = new TeacherWrapper.CustomerServiceSendMsg2User();
|
|
|
+ customerServiceSendMsg2User.setCustomerId(teacherId);
|
|
|
+ customerServiceSendMsg2User.getTeacherIds().addAll(teacherIds);
|
|
|
+ result.add(customerServiceSendMsg2User);
|
|
|
+// imUserFriendService.sendCustomerServiceAddFriendMessage(teacherId, customerTitle, customerMessage, new ArrayList<>(teacherIds), ClientEnum.TEACHER);
|
|
|
+ });
|
|
|
+ studentFriendMap.forEach((teacherId, studentIds) -> {
|
|
|
+ imUserFriendService.saveUserFriend(teacherId, studentIds);
|
|
|
+ TeacherWrapper.CustomerServiceSendMsg2User customerServiceSendMsg2User = new TeacherWrapper.CustomerServiceSendMsg2User();
|
|
|
+ customerServiceSendMsg2User.setCustomerId(teacherId);
|
|
|
+ customerServiceSendMsg2User.getTeacherIds().addAll(studentIds);
|
|
|
+ result.add(customerServiceSendMsg2User);
|
|
|
+// imUserFriendService.sendCustomerServiceAddFriendMessage(teacherId, customerTitle, customerMessage, new ArrayList<>(studentIds), ClientEnum.STUDENT);
|
|
|
+ });
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
/***
|
|
|
* 封装用户信息
|
|
|
* @author liweifan
|
|
@@ -721,6 +915,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
|
|
|
teacher.setSettlementFrom(teacherSubmitReq.getSettlementFrom());
|
|
|
teacher.setTenantId(teacherSubmitReq.getTenantId() == null ? -1L : teacherSubmitReq.getTenantId());
|
|
|
teacher.setAvatar(Optional.ofNullable(teacherSubmitReq.getAvatar()).orElse(teacher.getAvatar()));
|
|
|
+ teacher.setCustomerService(teacherSubmitReq.getCustomerService());
|
|
|
if (StringUtil.isEmpty(teacherSubmitReq.getTeacherType())) {
|
|
|
return teacher;
|
|
|
}
|
|
@@ -1139,7 +1334,10 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
|
|
|
});
|
|
|
}
|
|
|
// 删除好友关系
|
|
|
- imUserFriendService.delStudentFriendByTenantId(teacher.getTenantId(), teacher.getUserId(), ClientEnum.TEACHER.getCode());
|
|
|
+ Boolean customerService = teacher.getCustomerService();
|
|
|
+ if (Boolean.FALSE.equals(customerService)) {
|
|
|
+ imUserFriendService.delStudentFriendByTenantId(teacher.getTenantId(), teacher.getUserId(), ClientEnum.TEACHER.getCode());
|
|
|
+ }
|
|
|
addBindUnBindRecord(teacher.getUserId(), teacher.getTenantId(), false);
|
|
|
SysUser sysUser = sysUserMapper.getByUserId(teacher.getUserId());
|
|
|
sendBindUnBindSMS(teacher.getUserId(), sysUser.getPhone(), MessageTypeEnum.TEACHER_UNBIND_TENANT, teacher.getTenantId());
|
|
@@ -1287,4 +1485,45 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
|
|
|
teacherVo.setVipType(vipType);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取学生好友最少的一个客服
|
|
|
+ * @return 客服
|
|
|
+ */
|
|
|
+ private Teacher getCustomerServiceByFriendLeast() {
|
|
|
+ return this.getBaseMapper().getCustomerServiceByFriendLeast();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Teacher> getCustomerService() {
|
|
|
+ return this.lambdaQuery()
|
|
|
+ .eq(Teacher::getCustomerService, true)
|
|
|
+ .eq(Teacher::getLockFlag, false)
|
|
|
+ .list();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public void updateLock(SysUser sysUser, Long teacherId) {
|
|
|
+ Teacher teacher = this.getById(teacherId);
|
|
|
+ if (teacher == null) {
|
|
|
+ throw new BizException("无效的老师账号");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 冻结客服,移交好友给其他客服
|
|
|
+ Boolean customerService = teacher.getCustomerService();
|
|
|
+ if (UserLockFlag.NORMAL.equals(teacher.getLockFlag()) && Boolean.TRUE.equals(customerService)) {
|
|
|
+ List<TeacherWrapper.CustomerServiceSendMsg2User> customerServiceSendMsg2User = transferFriend(teacherId, false);
|
|
|
+ String customerMessage = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG);
|
|
|
+ String customerTitle = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG_TITLE);
|
|
|
+ for (TeacherWrapper.CustomerServiceSendMsg2User serviceSendMsg2User : customerServiceSendMsg2User) {
|
|
|
+ imUserFriendService.sendCustomerServiceAddFriendMessage(serviceSendMsg2User.getCustomerId(), customerTitle, customerMessage, serviceSendMsg2User.getTeacherIds(),
|
|
|
+ ClientEnum.TEACHER);
|
|
|
+ imUserFriendService.sendCustomerServiceAddFriendMessage(serviceSendMsg2User.getCustomerId(), customerTitle, customerMessage, serviceSendMsg2User.getStudentIds(),
|
|
|
+ ClientEnum.STUDENT);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ teacher.setLockFlag(UserLockFlag.NORMAL.equals(teacher.getLockFlag()) ? UserLockFlag.LOCKED : UserLockFlag.NORMAL);
|
|
|
+ this.updateById(teacher);
|
|
|
+ }
|
|
|
}
|