Quellcode durchsuchen

feat:客服管理、sop发课逻辑

caoliqin vor 2 Wochen
Ursprung
Commit
07f44589de

+ 18 - 5
fs-admin/src/main/java/com/fs/app/controller/AppCustomerRoleMemberController.java

@@ -1,6 +1,7 @@
 package com.fs.app.controller;
 
 import com.fs.app.cusrole.domain.AppCustomerRoleMember;
+import com.fs.app.cusrole.dto.AppCustomerRoleMemberDTO;
 import com.fs.app.cusrole.service.IAppCustomerRoleMemberService;
 import com.fs.app.cusrole.vo.AppCustomerRoleMemberVO;
 import com.fs.common.annotation.Log;
@@ -50,8 +51,14 @@ public class AppCustomerRoleMemberController extends BaseController {
     @PreAuthorize("@ss.hasPermi('app:cusrolemember:add')")
     @Log(title = "app-客服", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody AppCustomerRoleMember appCustomerRoleMember) {
-        return toAjax(appCustomerRoleMemberService.insertAppCustomerRoleMember(appCustomerRoleMember));
+    public AjaxResult add(@RequestBody AppCustomerRoleMemberDTO dto) {
+        AppCustomerRoleMember member = new AppCustomerRoleMember();
+        member.setId(dto.getCompanyUserId());
+        member.setMemberName(dto.getCompanyUserName());
+        member.setAppCustomerId(dto.getAppCustomerId());
+        member.setAvatar(dto.getAvatar());
+        member.setRemark(dto.getRemark());
+        return toAjax(appCustomerRoleMemberService.insertAppCustomerRoleMember(member));
     }
 
     /**
@@ -60,8 +67,15 @@ public class AppCustomerRoleMemberController extends BaseController {
     @PreAuthorize("@ss.hasPermi('app:cusrolemember:edit')")
     @Log(title = "app-客服", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody AppCustomerRoleMember appCustomerRoleMember) {
-        return toAjax(appCustomerRoleMemberService.updateAppCustomerRoleMember(appCustomerRoleMember));
+    public AjaxResult edit(@RequestBody AppCustomerRoleMemberDTO dto) {
+        AppCustomerRoleMember member = new AppCustomerRoleMember();
+        member.setRoleMemberId(dto.getRoleMemberId());
+        member.setId(dto.getCompanyUserId());
+        member.setMemberName(dto.getCompanyUserName());
+        member.setAppCustomerId(dto.getAppCustomerId());
+        member.setAvatar(dto.getAvatar());
+        member.setRemark(dto.getRemark());
+        return toAjax(appCustomerRoleMemberService.updateAppCustomerRoleMember(member));
     }
 
     /**
@@ -73,5 +87,4 @@ public class AppCustomerRoleMemberController extends BaseController {
     public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(appCustomerRoleMemberService.deleteAppCustomerRoleMemberByIds(ids));
     }
-
 }

+ 3 - 29
fs-service/src/main/java/com/fs/app/cusrole/domain/AppCustomerRoleMember.java

@@ -11,53 +11,28 @@ import java.util.Date;
 @Data
 public class AppCustomerRoleMember {
 
-    /**
-     * 物理主键:也是组内具体客服id,默认的一条等于客服组的id,根据客服组扩容策略,每次累加1
-     * 客服组扩容策略:由于一个客服只能添加5000(后续也可能调整)个用户,
-     * 但是要对于客户来说是无感的,所以添加客户是,除了id不一样,其余头像,名称等都一样,
-     * 都延用客服组的信息,这里为了方便,会把组的信息同步给每个组员,
-     * 也为了以后可能每个组员需要区别化配置,把名称,头像等信息字段都同步
-     */
     @TableId(type = IdType.AUTO)
+    private Long roleMemberId;
+
+    @Excel(name = "销售用户id")
     private Long id;
 
-    /**
-     * 客服组id
-     */
     @Excel(name = "客服组id")
     private Long appCustomerId;
 
-    /**
-     * 组成员名称
-     */
     @Excel(name = "组成员名称")
     private String memberName;
 
-    /**
-     * 组内成员编号,每个组都是从1开始递增的
-     */
     private Long memberNo;
 
-    /**
-     * 头像
-     */
     @Excel(name = "头像")
     private String avatar;
 
-    /**
-     * 备注
-     */
     private String remark;
 
-    /**
-     * 对应ai的配置信息主键
-     */
     @Excel(name = "对应ai的配置信息主键")
     private Long appFastgptRoleId;
 
-    /**
-     * 是否删除,0-未删除,1-已删除
-     */
     @Excel(name = "是否删除,0-未删除,1-已删除")
     private Integer isDelete;
 
@@ -68,5 +43,4 @@ public class AppCustomerRoleMember {
     //客服组内每个成员最大添加客户数
     @TableField(exist = false)
     private Integer memberMaxFriendCount;
-
 }

+ 19 - 0
fs-service/src/main/java/com/fs/app/cusrole/dto/AppCustomerRoleMemberDTO.java

@@ -0,0 +1,19 @@
+package com.fs.app.cusrole.dto;
+
+import lombok.Data;
+
+@Data
+public class AppCustomerRoleMemberDTO {
+
+    private Long roleMemberId;
+
+    private Long companyUserId;
+
+    private String companyUserName;
+
+    private Long appCustomerId;
+
+    private String avatar;
+
+    private String remark;
+}

+ 6 - 4
fs-service/src/main/java/com/fs/app/cusrole/mapper/AppCustomerRoleMemberMapper.java

@@ -17,10 +17,12 @@ import java.util.List;
 @Mapper
 public interface AppCustomerRoleMemberMapper extends BaseMapper<AppCustomerRoleMember> {
     /**
-     * 查询app-客服组-组员信息
-     *
-     * @param id app-客服组-组员信息主键
-     * @return app-客服组-组员信息
+     * 根据 role_member_id 查询
+     */
+    AppCustomerRoleMember selectAppCustomerRoleMemberByRoleMemberId(Long roleMemberId);
+
+    /**
+     * 根据 id 字段(销售用户id)查询
      */
     AppCustomerRoleMember selectAppCustomerRoleMemberById(Long id);
 

+ 3 - 3
fs-service/src/main/java/com/fs/app/cusrole/service/IAppCustomerRoleMemberService.java

@@ -16,7 +16,7 @@ public interface IAppCustomerRoleMemberService extends IService<AppCustomerRoleM
     /**
      * 查询app-客服组-组员信息
      *
-     * @param id app-客服组-组员信息主键
+     * @param id 销售用户id
      * @return app-客服组-组员信息
      */
     AppCustomerRoleMember selectAppCustomerRoleMemberById(Long id);
@@ -48,7 +48,7 @@ public interface IAppCustomerRoleMemberService extends IService<AppCustomerRoleM
     /**
      * 批量删除app-客服组-组员信息
      *
-     * @param ids 需要删除的app-客服组-组员信息主键集合
+     * @param ids 需要删除的 role_member_id 集合
      * @return 结果
      */
     int deleteAppCustomerRoleMemberByIds(Long[] ids);
@@ -56,7 +56,7 @@ public interface IAppCustomerRoleMemberService extends IService<AppCustomerRoleM
     /**
      * 删除app-客服组-组员信息信息
      *
-     * @param id app-客服组-组员信息主键
+     * @param id role_member_id
      * @return 结果
      */
     int deleteAppCustomerRoleMemberById(Long id);

+ 29 - 6
fs-service/src/main/java/com/fs/app/cusrole/service/impl/AppCustomerRoleMemberServiceImpl.java

@@ -6,6 +6,7 @@ import com.fs.app.cusrole.domain.AppCustomerRoleMember;
 import com.fs.app.cusrole.vo.AppCustomerRoleMemberVO;
 import com.fs.app.cusrole.mapper.AppCustomerRoleMemberMapper;
 import com.fs.app.cusrole.service.IAppCustomerRoleMemberService;
+import com.fs.common.exception.ServiceException;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
@@ -23,7 +24,7 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
     /**
      * 查询app-客服组-组员信息
      *
-     * @param id app-客服组-组员信息主键
+     * @param id 销售用户id
      * @return app-客服组-组员信息
      */
     @Override
@@ -50,6 +51,7 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
      */
     @Override
     public int insertAppCustomerRoleMember(AppCustomerRoleMember appCustomerRoleMember) {
+        validateCompanyUserNotBound(appCustomerRoleMember.getId(), null);
         if (appCustomerRoleMember.getMemberNo() == null && appCustomerRoleMember.getAppCustomerId() != null) {
             appCustomerRoleMember.setMemberNo(resolveNextMemberNo(appCustomerRoleMember.getAppCustomerId()));
         }
@@ -70,8 +72,9 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
      */
     @Override
     public int updateAppCustomerRoleMember(AppCustomerRoleMember appCustomerRoleMember) {
-        if (appCustomerRoleMember.getId() != null) {
-            AppCustomerRoleMember existing = baseMapper.selectAppCustomerRoleMemberById(appCustomerRoleMember.getId());
+        validateCompanyUserNotBound(appCustomerRoleMember.getId(), appCustomerRoleMember.getRoleMemberId());
+        if (appCustomerRoleMember.getRoleMemberId() != null) {
+            AppCustomerRoleMember existing = baseMapper.selectAppCustomerRoleMemberByRoleMemberId(appCustomerRoleMember.getRoleMemberId());
             if (existing != null && appCustomerRoleMember.getAppCustomerId() != null
                     && !appCustomerRoleMember.getAppCustomerId().equals(existing.getAppCustomerId())) {
                 appCustomerRoleMember.setMemberNo(resolveNextMemberNo(appCustomerRoleMember.getAppCustomerId()));
@@ -84,7 +87,7 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
     /**
      * 批量删除app-客服组-组员信息(逻辑删除)
      *
-     * @param ids 需要删除的app-客服组-组员信息主键
+     * @param ids 需要删除的 role_member_id
      * @return 结果
      */
     @Override
@@ -93,7 +96,7 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
         Date now = DateUtils.getNowDate();
         for (Long id : ids) {
             AppCustomerRoleMember member = new AppCustomerRoleMember();
-            member.setId(id);
+            member.setRoleMemberId(id);
             member.setIsDelete(1);
             member.setUpdateTime(now);
             count += baseMapper.updateAppCustomerRoleMember(member);
@@ -104,7 +107,7 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
     /**
      * 删除app-客服组-组员信息信息
      *
-     * @param id app-客服组-组员信息主键
+     * @param id role_member_id
      * @return 结果
      */
     @Override
@@ -117,6 +120,26 @@ public class AppCustomerRoleMemberServiceImpl extends ServiceImpl<AppCustomerRol
         return baseMapper.getMaxByCustomerGroupId(customerGroupId);
     }
 
+    /**
+     * 校验销售用户是否已被其他客服绑定
+     *
+     * @param companyUserId 销售用户id
+     * @param excludeRoleMemberId 修改时排除当前记录
+     */
+    private void validateCompanyUserNotBound(Long companyUserId, Long excludeRoleMemberId) {
+        if (companyUserId == null) {
+            return;
+        }
+        long boundCount = lambdaQuery()
+                .eq(AppCustomerRoleMember::getId, companyUserId)
+                .eq(AppCustomerRoleMember::getIsDelete, 0)
+                .ne(excludeRoleMemberId != null, AppCustomerRoleMember::getRoleMemberId, excludeRoleMemberId)
+                .count();
+        if (boundCount > 0) {
+            throw new ServiceException("该销售用户已被其他客服绑定");
+        }
+    }
+
     /**
      * 查询某客服组内最大的客服组内成员编号
      * @param appCustomerId 发送的客服组id

+ 5 - 5
fs-service/src/main/java/com/fs/app/cusrole/vo/AppCustomerRoleMemberVO.java

@@ -11,11 +11,13 @@ import java.util.Date;
 @Data
 public class AppCustomerRoleMemberVO {
 
-    private Long id;
+    private Long roleMemberId;
 
-    private Long appCustomerId;
+    private Long companyUserId;
+
+    private String companyUserName;
 
-    private String memberName;
+    private Long appCustomerId;
 
     private Long memberNo;
 
@@ -33,7 +35,5 @@ public class AppCustomerRoleMemberVO {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
 
-    /** 客服组名称 */
     private String roleName;
-
 }

+ 3 - 1
fs-service/src/main/java/com/fs/app/sop/service/impl/AppSopUserLogServiceImpl.java

@@ -431,7 +431,9 @@ public class AppSopUserLogServiceImpl extends ServiceImpl<AppSopUserLogMapper, A
         sopLink.setQwUserId(userLogsInfo.getAppCustomerId());
         AppCustomerRoleMember roleMember = this.appCustomerRoleMemberService.lambdaQuery()
                 .eq(AppCustomerRoleMember::getIsDelete, 0)
-                .eq(AppCustomerRoleMember::getId, userLogsInfo.getAppCustomerId())
+                .eq(AppCustomerRoleMember::getAppCustomerId, userLogsInfo.getAppCustomerId())
+                .orderByDesc(AppCustomerRoleMember::getRoleMemberId)
+                .last("LIMIT 1")
                 .one();
         sopLink.setQwUserName(roleMember.getMemberName());
         sopLink.setVideoTitle(ObjectUtil.isNotEmpty(contentInfo.getLinkDescribe()) ? contentInfo.getLinkDescribe() : contentInfo.getLinkTitle());

+ 19 - 9
fs-service/src/main/resources/mapper/app/AppCustomerRoleMemberMapper.xml

@@ -5,6 +5,7 @@
 <mapper namespace="com.fs.app.cusrole.mapper.AppCustomerRoleMemberMapper">
 
     <resultMap type="AppCustomerRoleMember" id="AppCustomerRoleMemberResult">
+        <result property="roleMemberId"    column="role_member_id"    />
         <result property="id"    column="id"    />
         <result property="appCustomerId"    column="app_customer_id"    />
         <result property="memberName"    column="member_name"    />
@@ -18,14 +19,15 @@
     </resultMap>
 
     <sql id="selectAppCustomerRoleMemberVo">
-        select id, app_customer_id, member_name, member_no, avatar, remark, app_fastgpt_role_id, is_delete, create_time, update_time from app_customer_role_member
+        select role_member_id, id, app_customer_id, member_name, member_no, avatar, remark, app_fastgpt_role_id, is_delete, create_time, update_time from app_customer_role_member
     </sql>
 
     <select id="selectAppCustomerRoleMemberList" parameterType="AppCustomerRoleMember" resultType="com.fs.app.cusrole.vo.AppCustomerRoleMemberVO">
         select
-            m.id,
+            m.role_member_id as roleMemberId,
+            m.id as companyUserId,
+            m.member_name as companyUserName,
             m.app_customer_id as appCustomerId,
-            m.member_name as memberName,
             m.member_no as memberNo,
             m.avatar,
             m.remark,
@@ -46,14 +48,20 @@
         order by m.create_time desc
     </select>
 
+    <select id="selectAppCustomerRoleMemberByRoleMemberId" parameterType="Long" resultMap="AppCustomerRoleMemberResult">
+        <include refid="selectAppCustomerRoleMemberVo"/>
+        where role_member_id = #{roleMemberId}
+    </select>
+
     <select id="selectAppCustomerRoleMemberById" parameterType="Long" resultMap="AppCustomerRoleMemberResult">
         <include refid="selectAppCustomerRoleMemberVo"/>
         where id = #{id}
     </select>
 
-    <insert id="insertAppCustomerRoleMember" parameterType="AppCustomerRoleMember" useGeneratedKeys="true" keyProperty="id">
+    <insert id="insertAppCustomerRoleMember" parameterType="AppCustomerRoleMember" useGeneratedKeys="true" keyProperty="roleMemberId">
         insert into app_customer_role_member
         <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
             <if test="appCustomerId != null">app_customer_id,</if>
             <if test="memberName != null and memberName != ''">member_name,</if>
             <if test="memberNo != null">member_no,</if>
@@ -65,6 +73,7 @@
             <if test="updateTime != null">update_time,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
             <if test="appCustomerId != null">#{appCustomerId},</if>
             <if test="memberName != null and memberName != ''">#{memberName},</if>
             <if test="memberNo != null">#{memberNo},</if>
@@ -80,6 +89,7 @@
     <update id="updateAppCustomerRoleMember" parameterType="AppCustomerRoleMember">
         update app_customer_role_member
         <trim prefix="SET" suffixOverrides=",">
+            <if test="id != null">id = #{id},</if>
             <if test="appCustomerId != null">app_customer_id = #{appCustomerId},</if>
             <if test="memberName != null and memberName != ''">member_name = #{memberName},</if>
             <if test="memberNo != null">member_no = #{memberNo},</if>
@@ -90,15 +100,15 @@
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
         </trim>
-        where id = #{id}
+        where role_member_id = #{roleMemberId}
     </update>
 
     <delete id="deleteAppCustomerRoleMemberById" parameterType="Long">
-        delete from app_customer_role_member where id = #{id}
+        delete from app_customer_role_member where role_member_id = #{id}
     </delete>
 
     <delete id="deleteAppCustomerRoleMemberByIds" parameterType="String">
-        delete from app_customer_role_member where id in
+        delete from app_customer_role_member where role_member_id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>
@@ -112,8 +122,8 @@
             app_customer_role_member mem
         INNER JOIN app_customer_role acr ON acr.is_delete = 0 AND acr.id = mem.app_customer_id
         WHERE
-            mem.id = (
-                SELECT MAX(id) FROM app_customer_role_member WHERE app_customer_id = #{customerGroupId}
+            mem.role_member_id = (
+                SELECT MAX(role_member_id) FROM app_customer_role_member WHERE app_customer_id = #{customerGroupId}
             )
     </select>