Sfoglia il codice sorgente

Merge branch 'feature/0812_opt' of http://git.dayaedu.com/yonge/cooleshow into feature/0812_opt

liujc 10 mesi fa
parent
commit
ef8bd1abde
23 ha cambiato i file con 431 aggiunte e 26 eliminazioni
  1. 6 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/EmployeeController.java
  2. 12 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/StudentController.java
  3. 12 3
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java
  4. 12 3
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java
  5. 12 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/StudentController.java
  6. 19 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/TeacherController.java
  7. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherDao.java
  8. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/EmployeeSearch.java
  9. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java
  10. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  11. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  12. 6 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/ImGroupCoreService.java
  13. 55 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/impl/ImGroupCoreServiceImpl.java
  14. 32 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/EmployeeServiceImpl.java
  15. 51 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  16. 88 15
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  17. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java
  18. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentVo.java
  19. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java
  20. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java
  21. 4 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  22. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  23. 21 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml

+ 6 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/EmployeeController.java

@@ -39,6 +39,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.validation.Valid;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 @RequestMapping("${app-config.url.admin:}/employee")
 @Api(tags = "员工管理")
@@ -142,6 +143,11 @@ public class EmployeeController extends BaseController {
                     employeeVo.getUsername(),
                     employeeVo.getAvatar()
                 );
+
+                // 设置客服标记
+                if (Objects.isNull(employeeVo.getCustomerService())) {
+                    employeeVo.setCustomerService(false);
+                }
                 // 获取IMToken
                 employeeVo.setImToken(register.getImToken());
                 // 获取IM用户ID

+ 12 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/StudentController.java

@@ -103,6 +103,18 @@ public class StudentController extends BaseController {
         return succeed(studentService.queryUserInfo(user));
     }
 
+    @ApiOperation(value = "设置系统默认客服")
+    @GetMapping("/updateUserCustomerService")
+    public HttpResponseResult<String> updateUserCustomerService() {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        return succeed(studentService.updateUserCustomerService(user));
+    }
+
     @ApiOperation(value = "设置声部")
     @GetMapping("/setSubject")
     public HttpResponseResult setSubject(@ApiParam(value = "声部主键集合", required = true) @RequestParam("subjectIds") String subjectIds) {

+ 12 - 3
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java

@@ -32,14 +32,11 @@ import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -90,6 +87,18 @@ public class TeacherController extends BaseController {
         return teacherService.queryUserInfo(user.getId());
     }
 
+    @ApiOperation(value = "设置系统默认客服")
+    @GetMapping("/updateUserCustomerService")
+    public HttpResponseResult<String> updateUserCustomerService() {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        return succeed(teacherService.updateUserCustomerService(user.getId()));
+    }
+
 
     /**
      * 查询单条

+ 12 - 3
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java

@@ -12,10 +12,8 @@ import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
 import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.service.OssFileService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
 import com.yonge.cooleshow.biz.dal.service.TenantAlbumPurchaseService;
 import com.yonge.cooleshow.biz.dal.service.TenantGroupAlbumService;
@@ -57,7 +55,6 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -307,4 +304,16 @@ public class StudentController extends BaseController {
         }
         return succeed(studentService.queryUserInfo(user));
     }
+
+    @ApiOperation(value = "设置系统默认客服")
+    @GetMapping("/updateUserCustomerService")
+    public HttpResponseResult<String> updateUserCustomerService() {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        return succeed(studentService.updateUserCustomerService(user));
+    }
 }

+ 12 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/StudentController.java

@@ -65,6 +65,18 @@ public class StudentController extends BaseController {
         return succeed(studentService.queryUserInfo(user));
     }
 
+    @ApiOperation(value = "设置系统默认客服")
+    @GetMapping("/updateUserCustomerService")
+    public HttpResponseResult<String> updateUserCustomerService() {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        return succeed(studentService.updateUserCustomerService(user));
+    }
+
     @ApiOperation(value = "设置声部")
     @GetMapping("/setSubject")
     public HttpResponseResult setSubject(@ApiParam(value = "声部主键集合", required = true) @RequestParam("subjectIds") String subjectIds) {

+ 19 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/TeacherController.java

@@ -1,6 +1,8 @@
 package com.yonge.cooleshow.website.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.service.StudentStarService;
@@ -20,6 +22,8 @@ import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -38,12 +42,27 @@ public class TeacherController extends BaseController {
     @Resource
     private SysUserService sysUserService;
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
     @ApiOperation(value = "我的-查询教师基本信息")
     @GetMapping("/queryUserInfo")
     public HttpResponseResult<TeacherHomeVo> queryUserInfo() {
         return teacherService.queryUserInfo(sysUserService.getUserId());
     }
 
+    @ApiOperation(value = "设置系统默认客服")
+    @GetMapping("/updateUserCustomerService")
+    public HttpResponseResult<String> updateUserCustomerService() {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        return succeed(teacherService.updateUserCustomerService(user.getId()));
+    }
+
     @ApiOperation(value = "开通直播")
     @GetMapping("/openLive")
     public HttpResponseResult<Boolean> openLive() {

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherDao.java

@@ -120,4 +120,16 @@ public interface TeacherDao extends BaseMapper<Teacher> {
     Teacher getCustomerServiceByFriendLeast();
 
     List<TeacherWrapper.TeacherFriend> getCustomerServiceFriendNums();
+
+    /**
+     * 查询系统客服列表
+     * @return List<Teacher>
+     */
+    List<Teacher> selectCustomerServiceV2();
+
+    /**
+     * 客服好友数量统计
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> countCustomerServiceMemberNum();
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/EmployeeSearch.java

@@ -42,6 +42,9 @@ public class EmployeeSearch extends QueryInfo{
     @ApiModelProperty("用户状态")
     private String userStatus;
 
+    @ApiModelProperty("是否客服")
+    private Boolean customerService;
+
     public String getSearch() {
         return search;
     }
@@ -111,4 +114,12 @@ public class EmployeeSearch extends QueryInfo{
 	public void setUserStatus(String userStatus) {
 		this.userStatus = userStatus;
 	}
+
+    public Boolean getCustomerService() {
+        return customerService;
+    }
+
+    public void setCustomerService(Boolean customerService) {
+        this.customerService = customerService;
+    }
 }

+ 0 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.yonge.cooleshow.common.enums.ESettlementFrom;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java

@@ -134,4 +134,10 @@ public interface StudentService extends IService<Student> {
 
     Map<Long,Student> getMapByIds(List<Long> userIds);
 
+    /**
+     * 设置系统默认客服
+     * @param user 用户信息
+     * @return String
+     */
+    String updateUserCustomerService(SysUser user);
 }

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

@@ -13,6 +13,7 @@ import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -191,4 +192,23 @@ public interface TeacherService extends IService<Teacher> {
     List<Teacher> getCustomerService();
 
     void updateLock(SysUser sysUser, Long teacherId);
+
+    /**
+     * 系统默认客服用户
+     * @return List<Teacher>
+     */
+    List<Teacher> getCustomerServiceV2();
+
+    /**
+     * 查询客服好友数量
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> getCustomerServiceMemberNums();
+
+    /**
+     * 更新用户客服
+     * @param userId 用户ID
+     * @return String
+     */
+    String updateUserCustomerService(Long userId);
 }

+ 6 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/ImGroupCoreService.java

@@ -1,14 +1,12 @@
 package com.yonge.cooleshow.biz.dal.service.im;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberAuditWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
-import org.apache.poi.ss.formula.functions.T;
 
 import java.util.List;
 
@@ -197,4 +195,10 @@ public interface ImGroupCoreService {
     IPage<ImGroupMemberWrapper.ImGroupMember> imGroupMemberPage(IPage<ImGroupMemberWrapper.ImGroupMember> page, ImGroupMemberWrapper.ImGroupMemberQuery query);
 
     void groupMemberRole(ImGroupMemberWrapper.GroupMemberRole member);
+
+    /**
+     * 获取系统随机默认客服
+     * @return String
+     */
+    String getSysRandomCustomerService();
 }

+ 55 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/impl/ImGroupCoreServiceImpl.java

@@ -7,15 +7,18 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.dayaedu.cbs.common.enums.EClientType;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.microsvc.toolkit.common.tools.ThreadPool;
 import com.microsvc.toolkit.middleware.im.ImPluginContext;
 import com.microsvc.toolkit.middleware.im.ImPluginService;
 import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.microsvc.toolkit.middleware.im.properties.ImConfigProperties;
+import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMemberAudit;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.AuditStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
@@ -25,6 +28,7 @@ import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberAuditWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
@@ -61,6 +65,9 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
     @Autowired
     private SysUserService sysUserService;
 
+    @Autowired
+    private TeacherDao teacherDao;
+
     private static final String IM_USER_ID_SPLIT = "_";
 
 
@@ -1047,4 +1054,52 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
             }
         }
     }
+
+    /**
+     * 获取系统随机默认客服
+     *
+     * @return String
+     */
+    @Override
+    public String getSysRandomCustomerService() {
+
+        // 获取系统客服列表
+        List<Teacher> teachers = teacherDao.selectCustomerServiceV2();
+        if (CollectionUtils.isEmpty(teachers)) {
+            return "";
+        }
+
+        // IM客服ID列表
+        List<String> customerServiceIds = teachers.stream()
+            .map(Teacher::getImCustomerId)
+            .map(x -> {
+                String[] splits = x.split("_");
+                return getImUserId(splits[0], splits[1]);
+            }).collect(Collectors.toList());
+
+        // 获取客服关联用户数量
+        Map<String, Integer> collect = teacherDao.countCustomerServiceMemberNum().stream()
+            .collect(Collectors.toMap(StatGroupWrapper::getGid, StatGroupWrapper::getTotal, (o, n) -> n));
+
+        Map<String, Integer> customerServiceMap = Maps.newHashMap();
+        for (String item : customerServiceIds) {
+            customerServiceMap.put(item, collect.getOrDefault(item, 0));
+        }
+
+        // 按客服好友数量分组
+        Map<Integer, List<String>> group = customerServiceMap.entrySet().stream()
+            .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
+
+        // 客服好友数按升序排序,获取一个客服
+        List<String> customerServiceList = group.entrySet().stream()
+            .sorted(Comparator.comparingInt(Map.Entry::getKey))
+            .map(Map.Entry::getValue)
+            .findFirst().orElse(Lists.newArrayList());
+
+        if (CollectionUtils.isEmpty(customerServiceList)) {
+            return "";
+        }
+        // 获取一个客服
+        return customerServiceList.get(0);
+    }
 }

+ 32 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/EmployeeServiceImpl.java

@@ -7,14 +7,20 @@ import com.yonge.cooleshow.biz.dal.dao.EmployeeDao;
 import com.yonge.cooleshow.biz.dal.dto.EmployeeDto;
 import com.yonge.cooleshow.biz.dal.dto.search.EmployeeSearch;
 import com.yonge.cooleshow.biz.dal.entity.Employee;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.EmployeeService;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.vo.EmployeeVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.SysUserType;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
 import org.apache.commons.lang3.StringUtils;
@@ -39,6 +45,12 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Long, Employee> impleme
     @Autowired
     private ImGroupCoreService imGroupCoreService;
 
+    @Autowired
+    private TeacherService teacherService;
+
+    @Autowired
+    private StudentService studentService;
+
     @Override
     public BaseDAO<Long, Employee> getDAO() {
         return employeeDao;
@@ -133,8 +145,26 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Long, Employee> impleme
                 param.getUsername(), sysUser.getAvatar());
         } else {
             // 员工设置为非客服时,删除IM账号
-            if (Optional.ofNullable(employee.getCustomerService()).orElse(false)) {
-                // TODO: 由客服身份变为非客户时,需要删除之前关联的IM账号,同时交接为其他客服
+            if (Optional.ofNullable(employee.getCustomerService()).orElse(false)
+                || sysUser.getLockFlag().equals(YesOrNoEnum.YES.getCode())
+                || employee.getLockFlag() == UserLockFlag.LOCKED) {
+
+                String imCustomerServiceId = imGroupCoreService.getImUserId(String.valueOf(param.getUserId()),
+                    ClientEnum.SYSTEM.getCode());
+
+                // 更新老师表的客服ID
+                teacherService.lambdaUpdate()
+                    .eq(Teacher::getImCustomerId, imCustomerServiceId)
+                    .set(Teacher::getCustomerId, null)
+                    .set(Teacher::getImCustomerId, "")
+                    .update();
+
+                // 更新学生表的客服ID
+                studentService.lambdaUpdate()
+                    .eq(Student::getImCustomerId, imCustomerServiceId)
+                    .set(Student::getCustomerId, null)
+                    .set(Student::getImCustomerId, "")
+                    .update();
             }
         }
         return HttpResponseResult.succeed(param);

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

@@ -39,6 +39,7 @@ import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
+import com.yonge.cooleshow.common.enums.UserStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
@@ -147,6 +148,20 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             VipCardRecordWrapper.UserVipInfo vipType = curVipMap.getOrDefault(userId, new VipCardRecordWrapper.UserVipInfo());
             detail.setMembershipEndTime(vipType.getCurrentVipSvipEndTime());
             detail.setVipType(vipType.getCurrentVipType());
+
+            // 系统客服数量
+            detail.setCustomerServiceNum(teacherDao.selectCustomerServiceV2().size());
+
+            // 设置老师帐号状态
+            if(detail.getDelFlag() == YesOrNoEnum.YES){
+                detail.setUserStatus(UserStatusEnum.CLOSED);
+            }else{
+                if(detail.getLockFlag() == UserLockFlag.LOCKED){
+                    detail.setUserStatus(UserStatusEnum.LOCKED);
+                }else{
+                    detail.setUserStatus(UserStatusEnum.NORMAL);
+                }
+            }
         }
         return detail;
     }
@@ -1049,4 +1064,40 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         bindRecord.setBindTime(new Date());
         userTenantBindRecordMapper.add(bindRecord);
     }
+
+    /**
+     * 设置系统默认客服
+     *
+     * @param user 用户信息
+     * @return String
+     */
+    @Override
+    public String updateUserCustomerService(SysUser user) {
+
+        StudentVo detail = detail(user.getId());
+        if (Objects.isNull(detail)) {
+            throw new BizException("学生信息不存在");
+        }
+
+        // 学生已绑定客服,直接近回
+        if (StringUtils.isNotBlank(detail.getImCustomerId())) {
+            return detail.getImCustomerId();
+        }
+
+        // 随机分配系统客服
+        String imCustomerServiceId = imGroupCoreService.getSysRandomCustomerService();
+        if (StringUtils.isBlank(imCustomerServiceId)) {
+            throw new BizException("系统客服不存在");
+        }
+        String customerServiceId = imGroupCoreService.analysisImUserId(imCustomerServiceId);
+
+        // 更新用户绑定客服
+        lambdaUpdate()
+            .eq(Student::getUserId, user.getId())
+            .set(Student::getCustomerId, customerServiceId)
+            .set(Student::getImCustomerId, imCustomerServiceId)
+            .update();
+
+        return imCustomerServiceId;
+    }
 }

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

@@ -11,7 +11,6 @@ import com.google.common.collect.Lists;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.config.CustomerServiceConfig;
 import com.yonge.cooleshow.biz.dal.dao.EmployeeDao;
 import com.yonge.cooleshow.biz.dal.dao.StudentStarDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
@@ -184,9 +183,6 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     private RealnameAuthenticationPlugin realnameAuthenticationPlugin;
 
     @Autowired
-    private CustomerServiceConfig customerServiceConfig;
-
-    @Autowired
     private SysUserMapper sysUserMapper;
 
     @Autowired
@@ -251,6 +247,10 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 detail.setUserStatus(UserStatusEnum.NORMAL);
             }
         }
+
+        // 系统客服数量
+        detail.setCustomerServiceNum(baseMapper.selectCustomerServiceV2().size());
+
         return detail;
     }
 
@@ -654,14 +654,18 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         } else {
             // 客服状态变更,移交好友信息
             Boolean customerService = teacher.getCustomerService();
-            List<TeacherWrapper.CustomerServiceSendMsg2User> customerServiceSendMsg2User = new ArrayList<>();
+            //List<TeacherWrapper.CustomerServiceSendMsg2User> customerServiceSendMsg2User = new ArrayList<>();
             if (Boolean.TRUE.equals(customerService) && Boolean.FALSE.equals(teacherSubmitReq.getCustomerService())) {
-                customerServiceSendMsg2User.addAll(transferFriendV2(teacher.getUserId(), true));
+                //customerServiceSendMsg2User.addAll(transferFriendV2(teacher.getUserId(), true));
+
+                // 清除客服绑定关系
                 clearUserCustomerRelation(teacherSubmitReq.getUserId());
+
+                // 重置客服关系
                 this.update(null, new UpdateWrapper<Teacher>().lambda()
                         .set(Teacher::getCustomerId, null)
+                        .set(Teacher::getImCustomerId, "")
                         .eq(Teacher::getUserId, teacherSubmitReq.getUserId()));
-                teacher.setCustomerId(null);
             }
             // 如果机构解绑,更新机构ID为-1
             if (Boolean.TRUE.equals(teacherSubmitReq.getBindTenant())) {
@@ -698,7 +702,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
 
             // 交接后的客服发送消息
-            if (Boolean.TRUE.equals(customerService) && Boolean.FALSE.equals(teacherSubmitReq.getCustomerService())) {
+            /*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) {
@@ -707,7 +711,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                     imUserFriendService.sendCustomerServiceAddFriendMessage(serviceSendMsg2User.getCustomerId(), customerTitle, customerMessage, serviceSendMsg2User.getStudentIds(),
                             ClientEnum.STUDENT);
                 }
-            }
+            }*/
 
         }
 
@@ -716,11 +720,19 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
     // 清除专属客服信息
     private void clearUserCustomerRelation(Long userId) {
+
+        String imCustomerServiceId = imGroupCoreService.getImUserId(String.valueOf(userId), ClientEnum.TEACHER.getCode());
+
+        // 重置老师关联客服绑定
         this.update(null, new UpdateWrapper<Teacher>().lambda()
-                .eq(Teacher::getCustomerId, userId)
+                .eq(Teacher::getImCustomerId, imCustomerServiceId)
+                .set(Teacher::getImCustomerId, "")
                 .set(Teacher::getCustomerId, null));
+
+        // 重置学生关联客服绑定
         studentService.update(null, new UpdateWrapper<Student>().lambda()
-                .eq(Student::getCustomerId, userId)
+                .eq(Student::getImCustomerId, imCustomerServiceId)
+                .set(Student::getImCustomerId, imCustomerServiceId)
                 .set(Student::getCustomerId, null));
     }
 
@@ -1522,22 +1534,83 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
         // 冻结客服,移交好友给其他客服
         if (UserLockFlag.NORMAL.equals(teacher.getLockFlag()) && Boolean.TRUE.equals(customerService)) {
-            List<TeacherWrapper.CustomerServiceSendMsg2User> customerServiceSendMsg2User = transferFriendV2(teacherId, false);
+            // List<TeacherWrapper.CustomerServiceSendMsg2User> customerServiceSendMsg2User = transferFriendV2(teacherId, false);
+
+            // 清除客服绑定关系
             clearUserCustomerRelation(teacherId);
+
+            // 重置数据
             this.update(null, new UpdateWrapper<Teacher>().lambda()
                     .set(Teacher::getCustomerId, null)
+                    .set(Teacher::getImCustomerId, "")
                     .eq(Teacher::getUserId, teacherId));
-            teacher.setCustomerId(null);
-            for (TeacherWrapper.CustomerServiceSendMsg2User serviceSendMsg2User : customerServiceSendMsg2User) {
+
+            /*for (TeacherWrapper.CustomerServiceSendMsg2User serviceSendMsg2User : customerServiceSendMsg2User) {
                 String customerMessage = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG);
                 String customerTitle = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG_TITLE);
                 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);
     }
+
+    /**
+     * 系统默认客服用户
+     *
+     * @return List<Teacher>
+     */
+    @Override
+    public List<Teacher> getCustomerServiceV2() {
+        return baseMapper.selectCustomerServiceV2();
+    }
+
+    /**
+     * 查询客服好友数量
+     *
+     * @return List<StatGroupWrapper>
+     */
+    @Override
+    public List<StatGroupWrapper> getCustomerServiceMemberNums() {
+        return baseMapper.countCustomerServiceMemberNum();
+    }
+
+    /**
+     * 更新用户客服
+     *
+     * @param userId 用户ID
+     * @return String
+     */
+    @Override
+    public String updateUserCustomerService(Long userId) {
+
+        TeacherVo teacher = detail(userId);
+        if (Objects.isNull(teacher)) {
+            throw new BizException("老师不存在");
+        }
+
+        // 学生已绑定客服,直接近回
+        if (StringUtils.isNotBlank(teacher.getImCustomerId())) {
+            return teacher.getImCustomerId();
+        }
+
+        // 随机分配系统客服
+        String imCustomerServiceId = imGroupCoreService.getSysRandomCustomerService();
+        if (StringUtils.isBlank(imCustomerServiceId)) {
+            throw new BizException("系统客服不存在");
+        }
+        String customerServiceId = imGroupCoreService.analysisImUserId(imCustomerServiceId);
+
+        // 更新用户绑定客服
+        lambdaUpdate()
+            .eq(Teacher::getUserId, userId)
+            .set(Teacher::getCustomerId, customerServiceId)
+            .set(Teacher::getImCustomerId, imCustomerServiceId)
+            .update();
+
+        return imCustomerServiceId;
+    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java

@@ -97,6 +97,9 @@ public class StudentHomeVo extends Student {
     @ApiModelProperty(value = "机构小组名称")
     private String tenantGroupName;
 
+    @ApiModelProperty("客服数量")
+    private Integer customerServiceNum;
+
     public YesOrNoEnum getTenantAlbumFlag() {
         return tenantAlbumFlag;
     }
@@ -302,4 +305,12 @@ public class StudentHomeVo extends Student {
     public void setImToken(String imToken) {
         this.imToken = imToken;
     }
+
+    public Integer getCustomerServiceNum() {
+        return customerServiceNum;
+    }
+
+    public void setCustomerServiceNum(Integer customerServiceNum) {
+        this.customerServiceNum = customerServiceNum;
+    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentVo.java

@@ -100,6 +100,9 @@ public class StudentVo extends Student {
     @ApiModelProperty(value = "会员结束时间字符传")
     private String membershipEndTimeStr;
 
+    @ApiModelProperty("客服数量")
+    private Integer customerServiceNum;
+
     public YesOrNoEnum getDelFlag() {
         return delFlag;
     }
@@ -238,4 +241,12 @@ public class StudentVo extends Student {
         }
         return "";
     }
+
+    public Integer getCustomerServiceNum() {
+        return customerServiceNum;
+    }
+
+    public void setCustomerServiceNum(Integer customerServiceNum) {
+        this.customerServiceNum = customerServiceNum;
+    }
 }

+ 18 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java

@@ -106,6 +106,8 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     @ApiModelProperty("是否是客服")
     private Boolean customerService;
 
+    @ApiModelProperty("客服数量")
+    private Integer customerServiceNum;
 
     public String getTenantName() {
         return tenantName;
@@ -383,4 +385,20 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     public void setTenantAlbumStatus(Integer tenantAlbumStatus) {
         this.tenantAlbumStatus = tenantAlbumStatus;
     }
+
+    public Boolean getCustomerService() {
+        return customerService;
+    }
+
+    public void setCustomerService(Boolean customerService) {
+        this.customerService = customerService;
+    }
+
+    public Integer getCustomerServiceNum() {
+        return customerServiceNum;
+    }
+
+    public void setCustomerServiceNum(Integer customerServiceNum) {
+        this.customerServiceNum = customerServiceNum;
+    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java

@@ -128,6 +128,9 @@ public class TeacherVo extends Teacher {
     @ApiModelProperty(value = "会员结束时间字符传")
     private String membershipEndTimeStr;
 
+    @ApiModelProperty("客服数量")
+    private Integer customerServiceNum;
+
     public YesOrNoEnum getDelFlag() {
         return delFlag;
     }
@@ -399,4 +402,12 @@ public class TeacherVo extends Teacher {
         }
         return "";
     }
+
+    public Integer getCustomerServiceNum() {
+        return customerServiceNum;
+    }
+
+    public void setCustomerServiceNum(Integer customerServiceNum) {
+        this.customerServiceNum = customerServiceNum;
+    }
 }

+ 4 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/EmployeeMapper.xml

@@ -60,6 +60,7 @@
         , t.introduction_ as "introduction"
         , t.demission_date_ as "demissionDate"
         , t.contact_address_ as "contactAddress"
+        , t.customer_service_ as "customerService"
     </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.EmployeeVo">
@@ -106,6 +107,9 @@
             <if test="null != param.delFlag">
                 and u.del_flag_ = #{param.delFlag}
             </if>
+            <if test="param.customerService != null">
+                AND t.customer_service_ = #{param.customerService}
+            </if>
         </where>
     </select>
 

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -37,6 +37,7 @@
         , t.tenant_group_id_ as `tenantGroupId`
         , t.im_device_id_ as imDeviceId
         , t.customer_id_ as customerId
+        , t.im_customer_id_ AS imCustomerId
         </sql>
     <update id="setSubject">
         update student set subject_id_ = #{subjectIds},update_time_ = now() where user_id_ = #{id}

+ 21 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -95,6 +95,7 @@
         , t.im_device_id_ as imDeviceId
         , t.customer_service_ as customerService
         , t.customer_id_ as customerId
+        , t.im_customer_id_ AS imCustomerId
     </sql>
 
     <!-- 分页查询 -->
@@ -478,4 +479,24 @@
         group by te.user_id_
         order by friendNums
     </select>
+
+    <!--系统客服列表-->
+    <select id="selectCustomerServiceV2" resultType="com.yonge.cooleshow.biz.dal.entity.Teacher">
+        SELECT t.im_customer_id_ AS imCustomerId FROM (
+          SELECT CONCAT(t1.user_id_, '_TEACHER') AS im_customer_id_ FROM teacher t1 LEFT JOIN sys_user t2 ON t1.user_id_ = t2.id_ WHERE t1.customer_service_ = 1 AND t1.lock_flag_ = 0  AND t2.lock_flag_ = 0
+          UNION ALL
+          SELECT CONCAT(t1.user_id_, '_SYSTEM') AS im_customer_id_ FROM employee t1 LEFT JOIN sys_user t2 ON t1.user_id_ = t2.id_ WHERE t1.customer_service_ = 1 AND t1.lock_flag_ = 0 AND t2.lock_flag_ = 0
+        ) t
+    </select>
+
+    <!--系统客服好友统计-->
+    <select id="countCustomerServiceMemberNum"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t.im_customer_id_ AS gid, COUNT(t.user_id_) AS total FROM (
+             SELECT t1.im_customer_id_, t1.user_id_ FROM teacher t1 WHERE t1.im_customer_id_ != '' AND t1.customer_service_ = 0
+             UNION ALL
+             SELECT t1.im_customer_id_, t1.user_id_ FROM student t1 WHERE t1.im_customer_id_ != ''
+         ) t GROUP BY t.im_customer_id_
+    </select>
+
 </mapper>