yuanliang 1 سال پیش
والد
کامیت
2bccd064ce

+ 13 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -355,4 +355,17 @@ public class TeacherController extends BaseController {
         imGroupService.setTeacherFansGroup();
         return succeed();
     }
+
+    /**
+     * 老师账号冻结/解冻
+     */
+    @PostMapping("/updateLock/{teacherId}")
+    @ApiOperation(value = "老师账号冻结/解冻")
+    @PreAuthorize("@pcs.hasPermissions('teacher/updateLock')")
+    public HttpResponseResult updateLock(@PathVariable("teacherId") Long teacherId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        teacherService.updateLock(sysUser, teacherId);
+        return succeed();
+    }
+
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImUserFriendDao.java

@@ -23,5 +23,7 @@ public interface ImUserFriendDao extends BaseMapper<ImUserFriend> {
 
     void delStudentFriendByTenantId(@Param("tenantId") Long tenantId,@Param("userId") Long userId ,
                                     @Param("clientType") String clientType);
+
+    List<ImUserFriend> queryExistCustomerServiceFriend(@Param("userIds") String userIds, @Param("clientType") String clientType);
 }
 

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImUserFriendService.java

@@ -53,6 +53,8 @@ public interface ImUserFriendService extends IService<ImUserFriend> {
      */
     Integer registerUserBindCustomerService(Long userId, List<Long> friendIds, ClientEnum clientType);
 
+    void sendCustomerServiceAddFriendMessage(Long customerServiceId, String sendTitle, String sendMessage, List<Long> friendIds, ClientEnum friendType);
+
     /**
      * 发送系统客服消息
      * @param sender 发送者

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
@@ -188,4 +189,6 @@ public interface TeacherService extends IService<Teacher> {
     Map<Long, Teacher> getMapByIds(List<Long> teacherIds);
 
     List<Teacher> getCustomerService();
+
+    void updateLock(SysUser sysUser, Long teacherId);
 }

+ 57 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java

@@ -1,7 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.alipay.api.domain.SystemParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -12,8 +11,6 @@ import com.microsvc.toolkit.middleware.im.impl.TencentCloudImPlugin;
 import com.microsvc.toolkit.middleware.im.message.ETencentMessage;
 import com.microsvc.toolkit.middleware.im.message.MessageWrapper;
 import com.microsvc.toolkit.middleware.im.message.TencentRequest;
-import com.yonge.cooleshow.api.feign.StudentFeignService;
-import com.yonge.cooleshow.api.feign.TeacherFeignService;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.config.CustomerServiceConfig;
@@ -43,9 +40,7 @@ import com.yonge.toolset.base.util.ImUtil;
 import io.rong.messages.BaseMessage;
 import io.rong.messages.ImgMessage;
 import io.rong.messages.TxtMessage;
-import io.rong.models.message.PrivateMessage;
 import io.rong.models.message.PushExt;
-import io.rong.models.response.ResponseResult;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -54,13 +49,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -379,6 +372,63 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     }
 
     /**
+     * 与客服建立好友关系时,客服给好友发送消息
+     */
+    @Override
+    public void sendCustomerServiceAddFriendMessage(Long customerServiceId, String sendTitle, String sendMessage, List<Long> friendIds, ClientEnum friendType) {
+
+        if (customerServiceId == null || CollectionUtils.isEmpty(friendIds)) {
+            return;
+        }
+
+        try {
+            if (StringUtils.isEmpty(sendMessage)) {
+                sendMessage = MK.IM_SYS_FRIEND;
+            }
+
+            if (StringUtils.isEmpty(sendTitle)) {
+                sendTitle = MK.IM_SYS_TITLE;
+            }
+
+            // 拓展消息
+            PushExt pushExt = PushExt.build(sendTitle, 1,
+                    new PushExt.HW("channelId", "NORMAL"), new PushExt.VIVO("1"),
+                    new PushExt.APNs("", ""),
+                    new PushExt.OPPO(""));
+
+
+            List<String> targetIds = friendIds.stream().map(n -> imGroupService.getImUserId(n, friendType)).collect(Collectors.toList());
+            MessageWrapper.PrivateMessage build = MessageWrapper.PrivateMessage.builder()
+                    .senderId(imGroupService.getImUserId(customerServiceId.toString(), ClientEnum.TEACHER.getCode()))
+                    .targetIds(targetIds)
+                    //.objectName(txtMessage.getType())
+                    //.rongCloueMessage(txtMessage)
+                    .pushExt(JSON.toJSONString(pushExt))
+                    .includeSender(0)
+                    .build();
+
+
+            if (TencentCloudImPlugin.PLUGIN_NAME.equals(imPluginContext.defaultService())) {
+                // 腾讯IM消息
+                TencentRequest.MessageBody message = TencentRequest.MessageBody.builder()
+                        .msgType(ETencentMessage.TIMTextElem.name())
+                        .msgContent(TencentRequest.TextMessageBody.builder().text(sendMessage).build())
+                        .build();
+
+                Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build.objectName(message.getMsgType()).tencentMessage(message));
+                log.info("registerUserBindCustomerService GROUP tencentCloud senderId={}, ret={}", build.getSenderId(), ret);
+            } else {
+                // 融云IM消息
+                TxtMessage message = new TxtMessage(sendMessage, "");
+                Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build.objectName(message.getType()).rongCloueMessage(message));
+                log.info("registerUserBindCustomerService GROUP rongCloud senderId={}, ret={}", build.getSenderId(), ret);
+            }
+        } catch (Exception e) {
+            log.error("registerUserBindCustomerService userId={}", customerServiceId, e);
+        }
+    }
+
+    /**
      * 发送系统客服消息
      *
      * @param sender 发送者

+ 173 - 84
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java

@@ -68,6 +68,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;
@@ -631,6 +632,11 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 }
             }
         } else {
+            // 客服状态变更,移交好友信息
+            List<TeacherWrapper.CustomerServiceSendMsg2User> customerServiceSendMsg2User = new ArrayList<>();
+            if (Boolean.TRUE.equals(teacher.getCustomerService()) && Boolean.FALSE.equals(teacherSubmitReq.getCustomerService())) {
+                customerServiceSendMsg2User.addAll(transferFriend(teacher.getUserId(), true));
+            }
             // 如果机构解绑,更新机构ID为-1
             if (Boolean.TRUE.equals(teacherSubmitReq.getBindTenant())) {
                 teacherSubmitReq.setTenantId(-1L);
@@ -651,11 +657,6 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 updateTenant(updateTenant, teacherSubmitReq.getUpdateBy());
             }
 
-            // 客服状态变更,移交好友信息
-            if (Boolean.TRUE.equals(teacher.getCustomerService()) && Boolean.FALSE.equals(teacherSubmitReq.getCustomerService())) {
-                transferFriend(teacher.getUserId());
-            }
-
             teacher.setUpdateTime(new Date());
             teacher = getTeacherDetil(teacher, teacherSubmitReq);
             if (null == teacher.getEntryAuthDate() || null == teacher.getMusicianDate()) {
@@ -668,106 +669,169 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             // 老师头像
             teacher.setAvatar(Optional.ofNullable(teacherSubmitReq.getAvatar()).orElse(teacher.getAvatar()));
             baseMapper.updateById(teacher);
+
+
+            // 交接后的客服发送消息
+            if (Boolean.TRUE.equals(teacher.getCustomerService()) && 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 void transferFriend(Long userId) {
-        // 群里的好友保留
-        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)
-                    .eq(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Member)
-                    .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()));
-        }
-
+    private List<TeacherWrapper.CustomerServiceSendMsg2User> transferFriend(Long userId, boolean saveGroupFriend) {
+        List<TeacherWrapper.CustomerServiceSendMsg2User> result = new ArrayList<>();
+        // 所有的好友
         List<ImUserFriend> friendList = imUserFriendService.lambdaQuery()
                 .eq(ImUserFriend::getUserId, userId)
                 .eq(ImUserFriend::getClientType, ClientEnum.TEACHER)
                 .list();
+        if (friendList.isEmpty()) { // 没有好友
+            return result;
+        }
 
-        friendList.removeIf(n -> {
-            if (ClientEnum.STUDENT.equals(n.getClientType())) {
-                return savedStudentIdList.contains(n.getFriendId());
-            }
-            if (ClientEnum.TEACHER.equals(n.getClientType())) {
-                return savedTeacherIdList.contains(n.getFriendId());
+        List<ImUserFriend> removeFriendList = friendList;
+        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()));
             }
-            return false;
+
+            // 删除的好友
+            removeFriendList = friendList.stream().filter(n -> {
+                if (ClientEnum.STUDENT.equals(n.getFriendType())) {
+                    return !savedStudentIdList.contains(n.getFriendId());
+                }
+                if (ClientEnum.TEACHER.equals(n.getFriendType())) {
+                    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 (friendList.isEmpty()) { // 没有好友
-            return;
-        }
-        List<Long> customerIdList = getCustomerService().stream().map(Teacher::getUserId).collect(Collectors.toList());
-        customerIdList.removeIf(n -> n.equals(userId));
-        if (customerIdList.isEmpty()) { // 没有客服
-            return;
-        }
+
+        List<TeacherWrapper.TeacherFriend> customerServiceFriendNums = this.getBaseMapper().getCustomerServiceFriendNums();
+        customerServiceFriendNums.removeIf(n -> n.getTeacherId().equals(userId));
+        List<Long> customerIdList = customerServiceFriendNums.stream().map(TeacherWrapper.TeacherFriend::getTeacherId).collect(Collectors.toList());
         List<ImUserFriend> userFriendList = friendList.stream()
                 .filter(n -> !ClientEnum.TEACHER.equals(n.getFriendType()) || !customerIdList.contains(n.getFriendId()))
                 .collect(Collectors.toList());
         if (userFriendList.isEmpty()) { // 除去客服好友,没有其他好友
-            return;
+            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<TeacherWrapper.TeacherFriend> customerServiceFriendNums = this.getBaseMapper().getCustomerServiceFriendNums();
-        if (customerServiceFriendNums.size() == 1) { // 只有一个客服
-            List<ImUserFriend> teacherFriends = userFriendList.stream().filter(n -> ClientEnum.TEACHER.equals(n.getClientType())).collect(Collectors.toList());
-            if (!teacherFriends.isEmpty()) {
-                List<Long> friendIds = teacherFriends.stream().map(ImUserFriend::getFriendId).collect(Collectors.toList());
-                imUserFriendService.saveUserTeacherFriend(customerServiceFriendNums.get(0).getTeacherId(), new HashSet<>(friendIds));
-            }
-            List<ImUserFriend> studentFriends = userFriendList.stream().filter(n -> ClientEnum.STUDENT.equals(n.getClientType())).collect(Collectors.toList());
-            if (!studentFriends.isEmpty()) {
-                List<Long> friendIds = studentFriends.stream().map(ImUserFriend::getFriendId).collect(Collectors.toList());
-                imUserFriendService.saveUserFriend(customerServiceFriendNums.get(0).getTeacherId(), new HashSet<>(friendIds));
-            }
-        } else {
-            Map<Long, Set<Long>> teacherFriends = new LinkedHashMap<>();
-            Map<Long, Set<Long>> studentFriends = new LinkedHashMap<>();
-            for (ImUserFriend imUserFriend : userFriendList) {
-                TeacherWrapper.TeacherFriend teacherFriend = customerServiceFriendNums.get(0);
-                if (ClientEnum.TEACHER.equals(imUserFriend.getClientType())) {
-                    Set<Long> set = teacherFriends.getOrDefault(teacherFriend.getTeacherId(), new HashSet<>());
-                    set.add(imUserFriend.getFriendId());
-                    teacherFriends.put(teacherFriend.getTeacherId(), set);
-                } else if (ClientEnum.STUDENT.equals(imUserFriend.getClientType())) {
-                    Set<Long> set = studentFriends.getOrDefault(teacherFriend.getTeacherId(), new HashSet<>());
-                    set.add(imUserFriend.getFriendId());
-                    studentFriends.put(teacherFriend.getTeacherId(), set);
-                }
-                teacherFriend.setFriendNums(teacherFriend.getFriendNums() + 1);
-                Collections.sort(customerServiceFriendNums);
-            }
+        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()));
+        }
 
-            teacherFriends.forEach((key, value) -> imUserFriendService.saveUserTeacherFriend(key, value));
-            studentFriends.forEach((key, value) -> imUserFriendService.saveUserFriend(key, value));
+        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;
     }
 
     /***
@@ -1408,4 +1472,29 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 .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);
+    }
 }

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java

@@ -366,6 +366,28 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             int num = DateUtil.daysBetween(new Date(), userVip.getSvipEndDate()) +1;
             userVip.setSvipEndDays(Math.max(num, 0));
         }
+
+        // 设置会员过期时间
+        EVipType expireVipType = userVip.getExpireVipType();
+        List<VipCardRecordWrapper.UserVipInfo> userVipInfos = this.baseMapper.queryUserVipInfo(Collections.singletonList(userId), clientEnum.getCode());
+        if(!userVipInfos.isEmpty()){
+            VipCardRecordWrapper.UserVipInfo userVipInfo = userVipInfos.get(0);
+            Date date = new Date();
+            if (EVipType.VIP.equals(expireVipType) || EVipType.ALL_VIP.equals(expireVipType)) {
+                Date vipEndTime = userVipInfo.getVipEndTime();
+                if (vipEndTime != null && vipEndTime.before(date)) {
+                    double days = Math.ceil((date.getTime() - vipEndTime.getTime()) * 1.0D / (24 * 60 * 60 * 1000));
+                    userVip.setVipExpireDays((int) days);
+                }
+            }
+            if (EVipType.SVIP.equals(expireVipType) || EVipType.ALL_VIP.equals(expireVipType)) {
+                Date svipEndTime = userVipInfo.getSvipEndTime();
+                if (svipEndTime != null && svipEndTime.before(date)) {
+                    double days = Math.ceil((date.getTime() - svipEndTime.getTime()) * 1.0D / (24 * 60 * 60 * 1000));
+                    userVip.setSvipExpireDays((int) days);
+                }
+            }
+        }
         return userVip;
     }
 

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/VipCardRecordWrapper.java

@@ -39,6 +39,12 @@ public class VipCardRecordWrapper {
 
         @ApiModelProperty(value = "svip剩余天数")
         private Integer svipEndDays =0;
+
+        @ApiModelProperty("vip失效天数")
+        private Integer vipExpireDays;
+
+        @ApiModelProperty("Svip失效天数")
+        private Integer svipExpireDays;
     }
 
     @ApiModel("添加/扣减会员")

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java

@@ -172,4 +172,23 @@ public class TeacherWrapper {
             return friendNums.compareTo(o.getFriendNums());
         }
     }
+
+
+    /**
+     * 客服发送消息的对象列表
+     */
+    @Data
+    public static class CustomerServiceSendMsg2User {
+
+        @ApiModelProperty("客服ID")
+        private Long customerId;
+
+        @ApiModelProperty("老师好友")
+        private List<Long> teacherIds = new ArrayList<>();
+
+
+        @ApiModelProperty("学生好友")
+        private List<Long> studentIds = new ArrayList<>();
+
+    }
 }

+ 13 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImUserFriendMapper.xml

@@ -45,4 +45,17 @@
         WHERE (t1.user_id_ = #{userId} and t1.client_type_ = #{clientType} and t2.tenant_id_ = #{tenantId})
            OR (t1.friend_id_ = #{userId} and t1.friend_type_ = #{clientType} and t3.tenant_id_ = #{tenantId})
     </delete>
+
+    <select id="queryExistCustomerServiceFriend" resultMap="BaseResultMap">
+        select distinct t.*
+        from im_user_friend t
+                 left join teacher te on t.friend_id_ = te.user_id_ and te.customer_service_ = 1 and te.lock_flag_ = 0
+                 left join sys_user su on te.user_id_ = su.id_
+        where t.friend_type_ = 'TEACHER'
+          and find_in_set(t.user_id_, #{userIds})
+          and t.client_type_ = #{clientType}
+          and su.del_flag_ = 0
+          and su.lock_flag_ = 0
+          and te.user_id_ is not null
+    </select>
 </mapper>