瀏覽代碼

23:新增功能--客户群转接

Long 3 天之前
父節點
當前提交
e7f50e4ffc
共有 18 個文件被更改,包括 682 次插入83 次删除
  1. 68 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwGroupChatTransferController.java
  2. 28 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwGroupChatTransferLogController.java
  3. 78 0
      fs-service/src/main/java/com/fs/qw/domain/QwGroupChatTransferLog.java
  4. 7 0
      fs-service/src/main/java/com/fs/qw/mapper/QwGroupChatMapper.java
  5. 18 0
      fs-service/src/main/java/com/fs/qw/mapper/QwGroupChatTransferLogMapper.java
  6. 25 0
      fs-service/src/main/java/com/fs/qw/param/ChatParam.java
  7. 5 0
      fs-service/src/main/java/com/fs/qw/param/QwGroupChatParam.java
  8. 15 0
      fs-service/src/main/java/com/fs/qw/param/QwGroupChatTransferLogParam.java
  9. 29 0
      fs-service/src/main/java/com/fs/qw/param/TransferChatParam.java
  10. 21 0
      fs-service/src/main/java/com/fs/qw/result/ResultMessage.java
  11. 22 0
      fs-service/src/main/java/com/fs/qw/service/IQwGroupChatService.java
  12. 18 0
      fs-service/src/main/java/com/fs/qw/service/IQwGroupChatTransferLogService.java
  13. 156 83
      fs-service/src/main/java/com/fs/qw/service/impl/QwGroupChatServiceImpl.java
  14. 29 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwGroupChatTransferLogServiceImpl.java
  15. 51 0
      fs-service/src/main/java/com/fs/qw/vo/QwGroupChatTransferLogVO.java
  16. 47 0
      fs-service/src/main/java/com/fs/qw/vo/QwGroupChatTransferVO.java
  17. 32 0
      fs-service/src/main/resources/mapper/qw/QwGroupChatMapper.xml
  18. 33 0
      fs-service/src/main/resources/mapper/qw/QwGroupChatTransferLogMapper.xml

+ 68 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwGroupChatTransferController.java

@@ -0,0 +1,68 @@
+package com.fs.company.controller.qw;
+
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.company.domain.CompanyUser;
+import com.fs.framework.security.SecurityUtils;
+import com.fs.qw.param.QwGroupChatParam;
+import com.fs.qw.param.TransferChatParam;
+import com.fs.qw.result.ResultMessage;
+import com.fs.qw.service.IQwGroupChatService;
+import com.fs.qw.vo.QwGroupChatTransferVO;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@RestController
+@RequestMapping("/qw/groupChatTransfer")
+@AllArgsConstructor
+public class QwGroupChatTransferController extends BaseController {
+
+    private final IQwGroupChatService qwGroupChatService;
+
+    @PreAuthorize("@ss.hasPermi('qw:groupChatTransfer:listOnJob')")
+    @GetMapping("/listOnJob")
+    public TableDataInfo listOnJob(QwGroupChatParam qwGroupChat) {
+        startPage();
+        qwGroupChat.setStatusList(Arrays.asList("0", "3"));
+        List<QwGroupChatTransferVO> list = qwGroupChatService.selectQwGroupChatTransferList(qwGroupChat);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('qw:groupChatTransfer:transferOnJob')")
+    @PostMapping("/transferOnJob")
+    public AjaxResult transferOnJob(@RequestBody @Valid TransferChatParam param) {
+        if (param.getChatIds().size() > 100) {
+            return AjaxResult.error("单批次最大转移数为100个");
+        }
+        CompanyUser user = SecurityUtils.getLoginUser().getUser();
+        ResultMessage message = qwGroupChatService.processTransfer(param, user, false);
+        return AjaxResult.success(message.buildResultMessage());
+    }
+
+    @PreAuthorize("@ss.hasPermi('qw:groupChatTransfer:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(QwGroupChatParam qwGroupChat) {
+        startPage();
+        qwGroupChat.setStatusList(Collections.singletonList("1"));
+        List<QwGroupChatTransferVO> list = qwGroupChatService.selectQwGroupChatTransferList(qwGroupChat);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('qw:groupChatTransfer:transfer')")
+    @PostMapping("/transfer")
+    public AjaxResult transfer(@RequestBody @Valid TransferChatParam param) {
+        if (param.getChatIds().size() > 100) {
+            return AjaxResult.error("单批次最大转移数为100个");
+        }
+        CompanyUser user = SecurityUtils.getLoginUser().getUser();
+        ResultMessage message = qwGroupChatService.processTransfer(param, user, true);
+        return AjaxResult.success(message.buildResultMessage());
+    }
+}

+ 28 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwGroupChatTransferLogController.java

@@ -0,0 +1,28 @@
+package com.fs.company.controller.qw;
+
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.qw.param.QwGroupChatTransferLogParam;
+import com.fs.qw.service.IQwGroupChatTransferLogService;
+import com.fs.qw.vo.QwGroupChatTransferLogVO;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/qw/groupChatTransferLog")
+@AllArgsConstructor
+public class QwGroupChatTransferLogController extends BaseController {
+
+    private final IQwGroupChatTransferLogService groupChatTransferLogService;
+
+    @PreAuthorize("@ss.hasPermi('qw:groupChatTransferLog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(QwGroupChatTransferLogParam param) {
+        startPage();
+        List<QwGroupChatTransferLogVO> list = groupChatTransferLogService.selectQwGroupChatTransferVOList(param);
+        return getDataTable(list);
+    }
+}

+ 78 - 0
fs-service/src/main/java/com/fs/qw/domain/QwGroupChatTransferLog.java

@@ -0,0 +1,78 @@
+package com.fs.qw.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@TableName("qw_group_chat_transfer_log")
+public class QwGroupChatTransferLog {
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    /**
+     * 企微主体ID
+     */
+    private String corpId;
+    /**
+     * 转移类型 0:在职继承 1:离职继承
+     */
+    private Integer transferType;
+    /**
+     * 公司ID
+     */
+    private Long companyId;
+    /**
+     * 销售ID
+     */
+    private Long companyUserId;
+    /**
+     * 原归属群主ID
+     */
+    private String oldOwner;
+    /**
+     * 原归属销售ID
+     */
+    private Long oldCompanyUserId;
+    /**
+     * 原归属企微用户ID
+     */
+    private Long oldQwUserId;
+    /**
+     * 原归属企微用户名称
+     */
+    private String oldQwUserName;
+    /**
+     * 接替群主ID
+     */
+    private String newOwner;
+    /**
+     * 接替销售ID
+     */
+    private Long newCompanyUserId;
+    /**
+     * 接替企微用户ID
+     */
+    private Long newQwUserId;
+    /**
+     * 接替企微用户名称
+     */
+    private String newQwUserName;
+    /**
+     * 客户群ID
+     */
+    private String chatId;
+    /**
+     * 客户群名称
+     */
+    private String chatName;
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+}

+ 7 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwGroupChatMapper.java

@@ -3,6 +3,7 @@ package com.fs.qw.mapper;
 import com.fs.qw.domain.QwGroupChat;
 import com.fs.qw.param.QwGroupChatParam;
 import com.fs.qw.vo.QwGroupChatOptionsVO;
+import com.fs.qw.vo.QwGroupChatTransferVO;
 import com.fs.qw.vo.QwGroupChatVO;
 import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Param;
@@ -115,4 +116,10 @@ public interface QwGroupChatMapper
 
     List<QwGroupChat> selectQwGroupChatByChatIds(@Param("ids") String[] ids);
 
+    /**
+     * 查询客户群列表
+     * @param qwGroupChat   参数
+     * @return  list
+     */
+    List<QwGroupChatTransferVO> selectQwGroupChatTransferList(QwGroupChatParam qwGroupChat);
 }

+ 18 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwGroupChatTransferLogMapper.java

@@ -0,0 +1,18 @@
+package com.fs.qw.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.qw.domain.QwGroupChatTransferLog;
+import com.fs.qw.param.QwGroupChatTransferLogParam;
+import com.fs.qw.vo.QwGroupChatTransferLogVO;
+
+import java.util.List;
+
+public interface QwGroupChatTransferLogMapper extends BaseMapper<QwGroupChatTransferLog> {
+
+    /**
+     * 查询客户群转移记录
+     * @param param 参数
+     * @return  list
+     */
+    List<QwGroupChatTransferLogVO> selectQwGroupChatTransferVOList(QwGroupChatTransferLogParam param);
+}

+ 25 - 0
fs-service/src/main/java/com/fs/qw/param/ChatParam.java

@@ -0,0 +1,25 @@
+package com.fs.qw.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class ChatParam {
+    /**
+     * 群聊ID
+     */
+    @NotBlank(message = "客户群不能为空")
+    private String chatId;
+    /**
+     * 群主企微ID
+     */
+    @NotNull(message = "群主企微账户不能为空")
+    private Long qwId;
+    /**
+     * 群主ID
+     */
+    @NotBlank(message = "群主ID不能为空")
+    private String owner;
+}

+ 5 - 0
fs-service/src/main/java/com/fs/qw/param/QwGroupChatParam.java

@@ -3,6 +3,8 @@ package com.fs.qw.param;
 import com.fs.common.annotation.Excel;
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class QwGroupChatParam {
     private static final long serialVersionUID = 1L;
@@ -45,4 +47,7 @@ public class QwGroupChatParam {
 
     private String qwUserList;
 
+    /** 状态集合 */
+    private List<String> statusList;
+
 }

+ 15 - 0
fs-service/src/main/java/com/fs/qw/param/QwGroupChatTransferLogParam.java

@@ -0,0 +1,15 @@
+package com.fs.qw.param;
+
+import lombok.Data;
+
+@Data
+public class QwGroupChatTransferLogParam {
+    /**
+     * 企微主体ID
+     */
+    private String corpId;
+    /**
+     * 群名
+     */
+    private String name;
+}

+ 29 - 0
fs-service/src/main/java/com/fs/qw/param/TransferChatParam.java

@@ -0,0 +1,29 @@
+package com.fs.qw.param;
+
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Data
+public class TransferChatParam {
+    /**
+     * 客户群ID集合
+     */
+    @Valid
+    @NotEmpty(message = "转移客户群不能为空")
+    private List<ChatParam> chatIds;
+    /**
+     * 接替企微用户
+     */
+    @NotNull(message = "接替企微用户不能为空")
+    private Long qwId;
+    /**
+     * 企微主体ID
+     */
+    @NotBlank(message = "企微主体不能为空")
+    private String corpId;
+}

+ 21 - 0
fs-service/src/main/java/com/fs/qw/result/ResultMessage.java

@@ -0,0 +1,21 @@
+package com.fs.qw.result;
+
+
+public class ResultMessage {
+    private int successNum = 0;
+    private int failureNum = 0;
+    private final StringBuilder errorMsg = new StringBuilder();
+
+    public void addSuccess() {
+        successNum++;
+    }
+
+    public void addFailure(String title, String error) {
+        failureNum++;
+        errorMsg.append("<br/>").append(title).append(" 失败:").append(error);
+    }
+
+    public String buildResultMessage() {
+        return "成功" + successNum + " 条,失败" + failureNum + "条。" + errorMsg;
+    }
+}

+ 22 - 0
fs-service/src/main/java/com/fs/qw/service/IQwGroupChatService.java

@@ -1,11 +1,16 @@
 package com.fs.qw.service;
 
 import com.fs.common.core.domain.R;
+import com.fs.company.domain.CompanyUser;
 import com.fs.qw.domain.QwGroupChat;
 import com.fs.qw.param.QwGroupChatParam;
+import com.fs.qw.param.TransferChatParam;
+import com.fs.qw.result.ResultMessage;
 import com.fs.qw.vo.QwGroupChatOptionsVO;
+import com.fs.qw.vo.QwGroupChatTransferVO;
 import com.fs.qw.vo.QwGroupChatVO;
 
+import javax.validation.Valid;
 import java.util.List;
 
 /**
@@ -65,4 +70,21 @@ public interface IQwGroupChatService
     List<QwGroupChatOptionsVO> listAllByQwUserList(String qwUserIds, String corpId);
 
     List<QwGroupChat> selectQwGroupChatByChatIds(String[] ids);
+
+    /**
+     * 查询客户群列表
+     * @param qwGroupChat 参数
+     * @return  list
+     */
+    List<QwGroupChatTransferVO> selectQwGroupChatTransferList(QwGroupChatParam qwGroupChat);
+
+    /**
+     * 分配客户群
+     *
+     * @param param         参数
+     * @param user          当前登录销售
+     * @param isResigned    是否在职人员客户群
+     * @return message
+     */
+    ResultMessage processTransfer(TransferChatParam param, CompanyUser user, boolean isResigned);
 }

+ 18 - 0
fs-service/src/main/java/com/fs/qw/service/IQwGroupChatTransferLogService.java

@@ -0,0 +1,18 @@
+package com.fs.qw.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.qw.domain.QwGroupChatTransferLog;
+import com.fs.qw.param.QwGroupChatTransferLogParam;
+import com.fs.qw.vo.QwGroupChatTransferLogVO;
+
+import java.util.List;
+
+public interface IQwGroupChatTransferLogService extends IService<QwGroupChatTransferLog> {
+
+    /**
+     * 查询客户群转移记录
+     * @param param 参数
+     * @return list
+     */
+    List<QwGroupChatTransferLogVO> selectQwGroupChatTransferVOList(QwGroupChatTransferLogParam param);
+}

+ 156 - 83
fs-service/src/main/java/com/fs/qw/service/impl/QwGroupChatServiceImpl.java

@@ -1,39 +1,33 @@
 package com.fs.qw.service.impl;
 
 import com.fs.common.core.domain.R;
+import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
-import com.fs.company.service.ICompanyConfigService;
-import com.fs.course.service.IFsCourseLinkService;
-import com.fs.qw.domain.QwCompany;
-import com.fs.qw.domain.QwGroupChat;
-import com.fs.qw.domain.QwGroupChatUser;
+import com.fs.company.domain.CompanyUser;
+import com.fs.qw.domain.*;
 import com.fs.qw.mapper.*;
+import com.fs.qw.param.ChatParam;
 import com.fs.qw.param.QwGroupChatParam;
+import com.fs.qw.param.TransferChatParam;
+import com.fs.qw.result.ResultMessage;
 import com.fs.qw.service.*;
 import com.fs.qw.vo.QwGroupChatOptionsVO;
+import com.fs.qw.vo.QwGroupChatTransferVO;
 import com.fs.qw.vo.QwGroupChatVO;
 import com.fs.qwApi.Result.QwGroupChatDetailsResult;
 import com.fs.qwApi.Result.QwGroupChatListResult;
+import com.fs.qwApi.domain.QwGroupChatTransferResult;
+import com.fs.qwApi.param.QwGroupChatTransferParam;
 import com.fs.qwApi.service.QwApiService;
-import com.fs.sop.mapper.QwSopMapper;
-import com.fs.sop.mapper.SopUserLogsInfoMapper;
-import com.fs.sop.service.IQwSopLogsService;
-import com.fs.sop.service.IQwSopService;
-import com.fs.sop.service.ISopUserLogsInfoService;
-import com.fs.sop.service.ISopUserLogsService;
-import com.fs.sop.service.impl.QwSopLogsServiceImpl;
-import com.fs.sop.service.impl.QwSopServiceImpl;
 import com.fs.voice.utils.StringUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 客户群详情Service业务层处理
@@ -44,80 +38,18 @@ import java.util.List;
 @Service
 public class QwGroupChatServiceImpl implements IQwGroupChatService
 {
-    private static final Logger log = LoggerFactory.getLogger(QwGroupChatServiceImpl.class);
     @Autowired
     private QwGroupChatMapper qwGroupChatMapper;
-
     @Autowired
     private QwGroupChatUserMapper qwGroupChatUserMapper;
-
     @Autowired
     private QwApiService qwApiService;
-
-    @Autowired
-    private ICompanyConfigService companyConfigService;
-
-    @Autowired
-    private IFsCourseLinkService iFsCourseLinkService;
-
-    @Autowired
-    IQwExternalContactService qwExternalContactService;
-
-    @Autowired
-    IQwCompanyService iQwCompanyService;
-
-    @Autowired
-    private ISopUserLogsInfoService sopUserLogsInfoService;
-
-    @Autowired
-    private IQwSopService iQwSopService;
-
     @Autowired
-    private IQwSopLogsService iQwSopLogsService;
-
-    @Autowired
-    private IQwGroupMsgService iQwGroupMsgService;
-
-    @Autowired
-    private QwSopLogsServiceImpl qwSopLogsService;
-
-    @Autowired
-    private QwSopServiceImpl qwSopService;
-
-    @Autowired
-    QwAutoTagsMapper qwAutoTagsMapper;
-
-    @Autowired
-    QwCompanyMapper qwCompanyMapper;
-
-    @Autowired
-    private QwSopMapper qwSopMapper;
-
+    private QwCompanyMapper qwCompanyMapper;
     @Autowired
     private QwUserMapper qwUserMapper;
-
-    @Autowired
-    private QwExternalContactMapper qwExternalContactMapper;
     @Autowired
-    private ISopUserLogsService sopUserLogsService;
-
-    @Autowired
-    private ISopUserLogsInfoService iSopUserLogsInfoService;
-
-    @Autowired
-    private QwAppContactWayMapper  qwAppContactWayMapper;
-
-    @Autowired
-    private QwAppContactWayLogsMapper qwAppContactWayLogsMapper;
-
-    @Autowired
-    private IQwExternalErrRetryService errRetryService;
-
-    @Autowired
-    private SopUserLogsInfoMapper sopUserLogsInfoMapper;
-
-//    @Autowired
-//    private IQwGetJsapiTicketService qwGetJsapiTicketService;
+    private IQwGroupChatTransferLogService qwGroupChatTransferLogService;
 
     /**
      * 查询客户群详情
@@ -416,6 +348,15 @@ public class QwGroupChatServiceImpl implements IQwGroupChatService
                     });
 
                 }
+                // 处理离职查询不到详情的情况
+                else {
+                    if (list.getStatus() == 1) {
+                        QwGroupChat qwGroupChatResigned = qwGroupChatMapper.selectQwGroupChatByChatId(list.getChat_id());
+                        qwGroupChatResigned.setUpdateTime(new Date());
+                        qwGroupChatResigned.setStatus(String.valueOf(list.getStatus()));
+                        qwGroupChatMapper.updateQwGroupChat(qwGroupChatResigned);
+                    }
+                }
             }
 
             if (!StringUtil.strIsNullOrEmpty(qwGroupChatListResult.getNext_cursor())){
@@ -440,4 +381,136 @@ public class QwGroupChatServiceImpl implements IQwGroupChatService
         return qwGroupChatMapper.selectQwGroupChatByChatIds(ids);
     }
 
+    /**
+     * 查询客户群列表
+     * @param qwGroupChat 参数
+     * @return  list
+     */
+    @Override
+    public List<QwGroupChatTransferVO> selectQwGroupChatTransferList(QwGroupChatParam qwGroupChat) {
+        return qwGroupChatMapper.selectQwGroupChatTransferList(qwGroupChat);
+    }
+
+    /**
+     * 客户群转移
+     * @param param         参数
+     * @param user          当前销售
+     * @param isResigned    是否转移离职员工客户群
+     * @return  message
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultMessage processTransfer(TransferChatParam param, CompanyUser user, boolean isResigned) {
+        ResultMessage resultMessage = new ResultMessage();
+
+        QwUser qwUser = qwUserMapper.selectQwUserById(param.getQwId());
+        if (Objects.isNull(qwUser)) {
+            throw new CustomException("接替群主不存在");
+        }
+
+        // 准备转移参数
+        QwGroupChatTransferParam transferParam = new QwGroupChatTransferParam();
+        transferParam.setChat_id_list(param.getChatIds().stream()
+                .map(ChatParam::getChatId)
+                .collect(Collectors.toList()));
+        transferParam.setNew_owner(qwUser.getQwUserId());
+
+        // 调用不同的API
+        QwGroupChatTransferResult result = isResigned ?
+                qwApiService.resignedGroupChatTransfer(transferParam, param.getCorpId()) :
+                qwApiService.groupChatTransfer(transferParam, param.getCorpId());
+
+        if (result.getErrcode() != 0) {
+            throw new CustomException(result.getErrmsg());
+        }
+
+        // 处理失败结果
+        result.getFailed_chat_list().forEach(failed -> resultMessage.addFailure(failed.getChat_id(), failed.getErrmsg()));
+
+        // 过滤掉转移失败的群聊
+        List<ChatParam> successChatParams = filterSuccessChats(param.getChatIds(), result.getFailed_chat_list());
+
+        // 处理成功的转移记录
+        processSuccessTransfers(successChatParams, user, qwUser, resultMessage, isResigned);
+
+        return resultMessage;
+    }
+
+    /**
+     * 过滤转移失败客户群
+     * @param chatParams    入参
+     * @param failedChats   失败列表
+     * @return  客户群
+     */
+    private List<ChatParam> filterSuccessChats(List<ChatParam> chatParams, List<QwGroupChatTransferResult.FailedChat> failedChats) {
+        Set<String> failedChatIds = failedChats.stream()
+                .map(QwGroupChatTransferResult.FailedChat::getChat_id)
+                .collect(Collectors.toSet());
+
+        return chatParams.stream()
+                .filter(c -> !failedChatIds.contains(c.getChatId()))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 处理转移成功客户群
+     *
+     * @param successChatParams 转移成功客户群
+     * @param user              当前销售账户
+     * @param newOwner          新群主
+     * @param resultMessage     消息
+     * @param isResigned        是否转移离职员工客户群
+     */
+    private void processSuccessTransfers(List<ChatParam> successChatParams, CompanyUser user, QwUser newOwner, ResultMessage resultMessage, boolean isResigned) {
+        List<QwGroupChatTransferLog> transferLogs = successChatParams.stream()
+                .map(chatParam -> createTransferLog(chatParam, user, newOwner, isResigned))
+                .collect(Collectors.toList());
+
+        if (!transferLogs.isEmpty()) {
+            qwGroupChatTransferLogService.saveBatch(transferLogs);
+            transferLogs.forEach(log -> resultMessage.addSuccess());
+        }
+    }
+
+    /**
+     * 保存转移记录修改群主
+     * @param chatParam  客户群
+     * @param user       当前销售
+     * @param newOwner   新群主
+     * @param isResigned 是否转移离职员工客户群
+     * @return  log
+     */
+    private QwGroupChatTransferLog createTransferLog(ChatParam chatParam, CompanyUser user, QwUser newOwner, boolean isResigned) {
+        QwGroupChat qwGroupChat = qwGroupChatMapper.selectQwGroupChatByChatId(chatParam.getChatId());
+        QwUser oldOwner = qwUserMapper.selectQwUserById(chatParam.getQwId());
+
+        // 更新群主信息
+        qwGroupChat.setOwner(newOwner.getQwUserId());
+        qwGroupChat.setUpdateTime(new Date());
+        if (isResigned) {
+            qwGroupChat.setStatus("3");
+        }
+        qwGroupChatMapper.updateQwGroupChat(qwGroupChat);
+
+        // 创建转移日志
+        QwGroupChatTransferLog transferLog = new QwGroupChatTransferLog();
+        transferLog.setChatName(qwGroupChat.getName());
+        transferLog.setCorpId(qwGroupChat.getCorpId());
+        transferLog.setTransferType(isResigned ? 1 : 0);
+        transferLog.setCompanyId(user.getCompanyId());
+        transferLog.setCompanyUserId(user.getUserId());
+        transferLog.setOldOwner(oldOwner.getQwUserId());
+        transferLog.setOldCompanyUserId(oldOwner.getCompanyUserId());
+        transferLog.setOldQwUserName(oldOwner.getQwUserName());
+        transferLog.setOldQwUserId(oldOwner.getId());
+        transferLog.setNewOwner(newOwner.getQwUserId());
+        transferLog.setNewCompanyUserId(newOwner.getCompanyUserId());
+        transferLog.setNewQwUserName(newOwner.getQwUserName());
+        transferLog.setNewQwUserId(newOwner.getId());
+        transferLog.setChatId(chatParam.getChatId());
+        transferLog.setCreateTime(LocalDateTime.now());
+
+        return transferLog;
+    }
+
 }

+ 29 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwGroupChatTransferLogServiceImpl.java

@@ -0,0 +1,29 @@
+package com.fs.qw.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.qw.domain.QwGroupChatTransferLog;
+import com.fs.qw.mapper.QwGroupChatTransferLogMapper;
+import com.fs.qw.param.QwGroupChatTransferLogParam;
+import com.fs.qw.service.IQwGroupChatTransferLogService;
+import com.fs.qw.vo.QwGroupChatTransferLogVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+
+@Service
+@Slf4j
+public class QwGroupChatTransferLogServiceImpl extends ServiceImpl<QwGroupChatTransferLogMapper, QwGroupChatTransferLog>
+        implements IQwGroupChatTransferLogService {
+
+    /**
+     * 查询客户群转移记录
+     * @param param 参数
+     * @return list
+     */
+    @Override
+    public List<QwGroupChatTransferLogVO> selectQwGroupChatTransferVOList(QwGroupChatTransferLogParam param) {
+        return baseMapper.selectQwGroupChatTransferVOList(param);
+    }
+}

+ 51 - 0
fs-service/src/main/java/com/fs/qw/vo/QwGroupChatTransferLogVO.java

@@ -0,0 +1,51 @@
+package com.fs.qw.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class QwGroupChatTransferLogVO {
+    /**
+     * 主键ID
+     */
+    private Long id;
+    /**
+     * 企微主体
+     */
+    private String corpId;
+    /**
+     * 转移类型 0:在职继承 1:离职继承
+     */
+    private Integer transferType;
+    /**
+     * 群聊名称
+     */
+    private String name;
+    /**
+     * 原群主(后台)
+     */
+    private String oldCompanyUserName;
+    /**
+     * 原群主(企微)
+     */
+    private String oldQwUserName;
+    /**
+     * 新群主(后台)
+     */
+    private String newCompanyUserName;
+    /**
+     * 新群主(企微)
+     */
+    private String newQwUserName;
+    /**
+     * 操作人
+     */
+    private String companyUserName;
+    /**
+     * 转移时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+}

+ 47 - 0
fs-service/src/main/java/com/fs/qw/vo/QwGroupChatTransferVO.java

@@ -0,0 +1,47 @@
+package com.fs.qw.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class QwGroupChatTransferVO {
+    /**
+     * 客户群ID
+     */
+    private String chatId;
+    /**
+     * 客户群名称
+     */
+    private String name;
+    /**
+     * 群主ID
+     */
+    private String owner;
+    /**
+     * 群主销售名称
+     */
+    private String ownerName;
+    /**
+     * 群主企微ID
+     */
+    private String qwId;
+    /**
+     * 群主企微名称
+     */
+    private String qwUserName;
+    /**
+     * 公告
+     */
+    private String notice;
+    /**
+     * 企微主体
+     */
+    private String corpId;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+}

+ 32 - 0
fs-service/src/main/resources/mapper/qw/QwGroupChatMapper.xml

@@ -52,6 +52,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectQwGroupChatByChatIds" resultType="com.fs.qw.domain.QwGroupChat">
         select * from qw_group_chat where chat_id in <foreach collection="ids" open="(" separator="," close=")" item="item">#{item}</foreach>
     </select>
+
+    <select id="selectQwGroupChatTransferList" resultType="com.fs.qw.vo.QwGroupChatTransferVO">
+        select
+            gc.*,
+            qu.id qwId,
+            qu.qw_user_name,
+            cu.nick_name ownerName
+        from qw_group_chat gc
+        left join qw_user qu on qu.qw_user_id = gc.owner and qu.is_del = 0 and qu.corp_id = gc.corp_id
+        left join company_user cu on cu.user_id = qu.company_user_id
+        <where>
+            <if test="corpId != null and corpId != ''">
+                and gc.corp_id = #{corpId}
+            </if>
+            <if test="name != null and name != ''">
+                and gc.name like concat('%', #{name}, '%')
+            </if>
+            <if test="ownerName != null and ownerName != ''">
+                and cu.nick_name like concat('%', #{ownerName}, '%')
+            </if>
+            <if test="qwName != null and qwName != ''">
+                and qu.qw_user_name like concat('%', #{qwName}, '%')
+            </if>
+            <if test="statusList != null and statusList.size() > 0">
+                and gc.status in
+                <foreach collection="statusList" separator="," item="item" open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        order by gc.update_time desc
+    </select>
     <insert id="insertOrUpdateQwGroupChat" parameterType="QwGroupChat">
         insert into qw_group_chat
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 33 - 0
fs-service/src/main/resources/mapper/qw/QwGroupChatTransferLogMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.qw.mapper.QwGroupChatTransferLogMapper">
+
+    <select id="selectQwGroupChatTransferVOList" resultType="com.fs.qw.vo.QwGroupChatTransferLogVO">
+        select
+            tctl.id,
+            tctl.chat_name name,
+            old.nick_name oldCompanyUserName,
+            tctl.old_qw_user_name,
+            new.nick_name newCompanyUserName,
+            tctl.new_qw_user_name,
+            tctl.transfer_type,
+            user.nick_name companyUserName,
+            tctl.corp_id,
+            tctl.create_time
+        from qw_group_chat_transfer_log tctl
+        left join company_user old on old.user_id = tctl.old_company_user_id
+        left join company_user new on new.user_id = tctl.new_company_user_id
+        left join company_user user on user.user_id = tctl.company_user_id
+        <where>
+            <if test="corpId != null and corpId != ''">
+                and tctl.corp_id = #{corpId}
+            </if>
+            <if test="name != null and name != ''">
+                and tctl.chat_name like concat('%', #{name}, '%')
+            </if>
+        </where>
+        order by tctl.create_time desc
+    </select>
+</mapper>