Selaa lähdekoodia

fix 员工支持客服身份

Eric 10 kuukautta sitten
vanhempi
commit
341c254795

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

@@ -1,15 +1,19 @@
 package com.yonge.cooleshow.admin.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 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.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
 import com.yonge.cooleshow.biz.dal.service.EmployeeService;
+import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.vo.EmployeeVo;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
@@ -47,6 +51,9 @@ public class EmployeeController extends BaseController {
     @Autowired
     private EmployeeDao employeeDao;
 
+    @Autowired
+    private ImGroupCoreService imGroupCoreService;
+
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入student")
     @ApiImplicitParams({
@@ -128,6 +135,19 @@ public class EmployeeController extends BaseController {
             employeeVo.setRoleIds(employeeDao.queryUserRole(sysUser.getId()));
             employeeVo.setSysUser(sysUser);
 
+            try {
+                ImGroupWrapper.ImUserInfo register = imGroupCoreService.register(
+                    employeeVo.getUserId().toString(),
+                    ClientEnum.SYSTEM.getCode(),
+                    employeeVo.getUsername(),
+                    employeeVo.getAvatar()
+                );
+
+                employeeVo.setImToken(register.getImToken());
+            } catch (Exception e) {
+                throw new BizException("获取IMToken失败");
+            }
+
             BeanUtils.copyProperties(sysUser, employeeVo, "gender");
             employeeVo.setGender(GenderEnum.valueOf(sysUser.getGender()));
             return succeed(employeeVo);

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/EmployeeDto.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.entity.Employee;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
@@ -38,6 +39,10 @@ public class EmployeeDto extends Employee{
     @ApiModelProperty(value = "角色id列表")
     private List<Long> roleIds;
 
+    @ApiModelProperty("是否是客服")
+    @TableField(value = "customer_service_")
+    private Boolean customerService;
+
     public String getUsername() {
         return username;
     }
@@ -86,4 +91,13 @@ public class EmployeeDto extends Employee{
         this.entryDate = entryDate;
     }
 
+    @Override
+    public Boolean getCustomerService() {
+        return customerService;
+    }
+
+    @Override
+    public void setCustomerService(Boolean customerService) {
+        this.customerService = customerService;
+    }
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Employee.java

@@ -65,6 +65,10 @@ public class Employee implements Serializable {
 	@TableField(value = "lock_flag_")
 	private UserLockFlag lockFlag;
 
+	@ApiModelProperty("是否是客服")
+	@TableField(value = "customer_service_")
+	private Boolean customerService;
+
 	public Long getUserId() {
 		return userId;
 	}
@@ -168,4 +172,12 @@ public class Employee implements Serializable {
 	public void setLockFlag(UserLockFlag lockFlag) {
 		this.lockFlag = lockFlag;
 	}
+
+	public Boolean getCustomerService() {
+		return customerService;
+	}
+
+	public void setCustomerService(Boolean customerService) {
+		this.customerService = customerService;
+	}
 }

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

@@ -116,6 +116,10 @@ public class Student implements Serializable {
     @TableField(value = "customer_id_")
     private Long customerId;
 
+    @ApiModelProperty("专属IM客服ID")
+    @TableField(value = "im_customer_id_")
+    private String imCustomerId;
+
     public Long getTenantId() {
         return tenantId;
     }
@@ -243,4 +247,20 @@ public class Student implements Serializable {
     public void setAvatar(String avatar) {
         this.avatar = avatar;
     }
+
+    public Long getCustomerId() {
+        return customerId;
+    }
+
+    public void setCustomerId(Long customerId) {
+        this.customerId = customerId;
+    }
+
+    public String getImCustomerId() {
+        return imCustomerId;
+    }
+
+    public void setImCustomerId(String imCustomerId) {
+        this.imCustomerId = imCustomerId;
+    }
 }

+ 28 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Teacher.java

@@ -259,6 +259,10 @@ public class Teacher implements Serializable {
     @TableField(value = "customer_id_")
     private Long customerId;
 
+    @ApiModelProperty("专属IM客服ID")
+    @TableField(value = "im_customer_id_")
+    private String imCustomerId;
+
     public ESettlementFrom getSettlementFrom() {
         return settlementFrom;
     }
@@ -579,4 +583,28 @@ public class Teacher implements Serializable {
     public void setEvaluateTime(Long evaluateTime) {
         this.evaluateTime = evaluateTime;
     }
+
+    public Boolean getCustomerService() {
+        return customerService;
+    }
+
+    public void setCustomerService(Boolean customerService) {
+        this.customerService = customerService;
+    }
+
+    public Long getCustomerId() {
+        return customerId;
+    }
+
+    public void setCustomerId(Long customerId) {
+        this.customerId = customerId;
+    }
+
+    public String getImCustomerId() {
+        return imCustomerId;
+    }
+
+    public void setImCustomerId(String imCustomerId) {
+        this.imCustomerId = imCustomerId;
+    }
 }

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

@@ -1,18 +1,21 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
-import java.util.Date;
-import java.util.List;
-
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.entity.SysRole;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.common.constant.SysConfigConstant;
-import com.yonge.cooleshow.common.enums.SysUserType;
+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.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.EmployeeService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+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.toolset.mybatis.dal.BaseDAO;
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -21,11 +24,9 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.yonge.cooleshow.auth.api.entity.SysRole;
-import com.yonge.cooleshow.biz.dal.dao.EmployeeDao;
-import com.yonge.cooleshow.biz.dal.entity.Employee;
-import com.yonge.cooleshow.biz.dal.service.EmployeeService;
-import com.yonge.toolset.mybatis.dal.BaseDAO;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
 
 @Service
 public class EmployeeServiceImpl extends BaseServiceImpl<Long, Employee> implements EmployeeService {
@@ -35,6 +36,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Long, Employee> impleme
     @Autowired
     private SysConfigService sysConfigService;
 
+    @Autowired
+    private ImGroupCoreService imGroupCoreService;
+
     @Override
     public BaseDAO<Long, Employee> getDAO() {
         return employeeDao;
@@ -92,6 +96,13 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Long, Employee> impleme
         //新增员工表
         param.setUserId(sysUser.getId());
         employeeDao.insert(param);
+
+        // 员工设置为客服时,同步IM账号到三方
+        if (Optional.ofNullable(param.getCustomerService()).orElse(false)) {
+            imGroupCoreService.register(String.valueOf(param.getUserId()), ClientEnum.SYSTEM.getCode(),
+                param.getUsername(), sysUser.getAvatar());
+        }
+
         return HttpResponseResult.succeed(param);
     }
 
@@ -115,6 +126,17 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Long, Employee> impleme
         employeeDao.batchAddEmployeeRole(employee.getUserId(), param.getRoleIds());
 
         employeeDao.update(param);
+
+        // 员工设置为客服时,同步IM账号到三方
+        if (Optional.ofNullable(param.getCustomerService()).orElse(false)) {
+            imGroupCoreService.register(String.valueOf(param.getUserId()), ClientEnum.SYSTEM.getCode(),
+                param.getUsername(), sysUser.getAvatar());
+        } else {
+            // 员工设置为非客服时,删除IM账号
+            if (Optional.ofNullable(employee.getCustomerService()).orElse(false)) {
+                // TODO: 由客服身份变为非客户时,需要删除之前关联的IM账号,同时交接为其他客服
+            }
+        }
         return HttpResponseResult.succeed(param);
     }
 

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

@@ -39,6 +39,9 @@ public class EmployeeVo extends Employee {
     @ApiModelProperty(value = "用户状态 NORMAL-正常   LOCKED-冻结  CLOSED-关闭")
     private UserStatusEnum userStatus;
 
+    @ApiModelProperty(value = "imToken")
+    private String imToken;
+
     public String getUsername() {
         return username;
     }
@@ -115,4 +118,12 @@ public class EmployeeVo extends Employee {
 	public void setUserStatus(UserStatusEnum userStatus) {
 		this.userStatus = userStatus;
 	}
+
+    public String getImToken() {
+        return imToken;
+    }
+
+    public void setImToken(String imToken) {
+        this.imToken = imToken;
+    }
 }

+ 5 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/EmployeeMapper.xml

@@ -188,9 +188,9 @@
             keyProperty="id">
         INSERT INTO employee
         (user_id_,job_nature_,is_probation_period_,education_background_,graduate_school_,technical_titles_,
-        entry_date_,update_time_,create_time_,introduction_,demission_date_,contact_address_)
+        entry_date_,update_time_,create_time_,introduction_,demission_date_,contact_address_,customer_service_)
         VALUES(#{userId},#{jobNature},#{isProbationPeriod},#{educationBackground},#{graduateSchool},
-        #{technicalTitles},#{entryDate},now(),now(),#{introduction},#{demissionDate},#{contactAddress})
+        #{technicalTitles},#{entryDate},now(),now(),#{introduction},#{demissionDate},#{contactAddress},#{customerService})
     </insert>
 
     <update id="update" parameterType="com.yonge.cooleshow.biz.dal.entity.Employee">
@@ -229,6 +229,9 @@
             <if test="lockFlag != null">
                 lock_flag_ = #{lockFlag},
             </if>
+            <if test="customerService != null">
+                customer_service_ = #{customerService},
+            </if>
         </set>
         WHERE user_id_ = #{userId}
     </update>