Commit 36a76c5ce63e8988e3c086cdb90d1a3080b0e254

Authored by puhui999
1 parent d9f6fb24

CRM-联系人:新增联系人转移接口

yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
... ... @@ -12,6 +12,7 @@ public interface ErrorCodeConstants {
12 12 // ========== 合同管理 1-020-000-000 ==========
13 13 ErrorCode CONTRACT_NOT_EXISTS = new ErrorCode(1_020_000_000, "合同不存在");
14 14 ErrorCode CONTRACT_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_000_001, "合同转移失败,原因:没有转移权限");
  15 + ErrorCode CONTRACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_000_002, "合同转移失败,原因:负责人不存在");
15 16  
16 17 // ========== 线索管理 1-020-001-000 ==========
17 18 ErrorCode CLUE_NOT_EXISTS = new ErrorCode(1_020_001_000, "线索不存在");
... ... @@ -26,6 +27,8 @@ public interface ErrorCodeConstants {
26 27  
27 28 // ========== 联系人管理 1-020-003-000 ==========
28 29 ErrorCode CONTACT_NOT_EXISTS = new ErrorCode(1_020_003_000, "联系人不存在");
  30 + ErrorCode CONTACT_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_003_001, "联系人转移失败,原因:没有转移权限");
  31 + ErrorCode CONTACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_003_002, "联系人转移失败,原因:负责人不存在");
29 32  
30 33 // TODO @liuhongfeng:错误码分段;
31 34 ErrorCode RECEIVABLE_NOT_EXISTS = new ErrorCode(1_030_000_001, "回款管理不存在");
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.contact;
2 2  
3   -import org.springframework.web.bind.annotation.*;
4   -import javax.annotation.Resource;
5   -import org.springframework.validation.annotation.Validated;
6   -import org.springframework.security.access.prepost.PreAuthorize;
7   -import io.swagger.v3.oas.annotations.tags.Tag;
8   -import io.swagger.v3.oas.annotations.Parameter;
9   -import io.swagger.v3.oas.annotations.Operation;
10   -
11   -import javax.validation.constraints.*;
12   -import javax.validation.*;
13   -import javax.servlet.http.*;
14   -import java.util.*;
15   -import java.io.IOException;
16   -
17   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
18 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
19   -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
20   -
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
21 5 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
22   -
23 6 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
24   -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
25   -
26 7 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
27   -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
28 8 import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert;
  9 +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
29 10 import cn.iocoder.yudao.module.crm.service.contact.ContactService;
  11 +import io.swagger.v3.oas.annotations.Operation;
  12 +import io.swagger.v3.oas.annotations.Parameter;
  13 +import io.swagger.v3.oas.annotations.tags.Tag;
  14 +import org.springframework.security.access.prepost.PreAuthorize;
  15 +import org.springframework.validation.annotation.Validated;
  16 +import org.springframework.web.bind.annotation.*;
  17 +
  18 +import javax.annotation.Resource;
  19 +import javax.servlet.http.HttpServletResponse;
  20 +import javax.validation.Valid;
  21 +import java.io.IOException;
  22 +import java.util.Collection;
  23 +import java.util.List;
  24 +
  25 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  26 +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
  27 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
30 28  
31 29 @Tag(name = "管理后台 - crm联系人")
32 30 @RestController
... ... @@ -99,4 +97,12 @@ public class ContactController {
99 97 ExcelUtils.write(response, "crm联系人.xls", "数据", ContactExcelVO.class, datas);
100 98 }
101 99  
  100 + @PutMapping("/transfer")
  101 + @Operation(summary = "联系人转移")
  102 + @PreAuthorize("@ss.hasPermission('crm:contact:update')")
  103 + public CommonResult<Boolean> transfer(@Valid @RequestBody CrmContactTransferReqVO reqVO) {
  104 + contactService.contactTransfer(reqVO, getLoginUserId());
  105 + return success(true);
  106 + }
  107 +
102 108 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactCreateReqVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2  
3   -import lombok.*;
4   -import java.util.*;
5 3 import io.swagger.v3.oas.annotations.media.Schema;
6   -import javax.validation.constraints.*;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import java.util.Set;
7 9  
8 10 @Schema(description = "管理后台 - crm联系人创建 Request VO")
9 11 @Data
... ... @@ -11,4 +13,10 @@ import javax.validation.constraints.*;
11 13 @ToString(callSuper = true)
12 14 public class ContactCreateReqVO extends ContactBaseVO {
13 15  
  16 + @Schema(description = "只读权限的用户编号数组")
  17 + private Set<Long> roUserIds;
  18 +
  19 + @Schema(description = "读写权限的用户编号数组")
  20 + private Set<Long> rwUserIds;
  21 +
14 22 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactUpdateReqVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.*;
5   -import java.util.*;
6   -import javax.validation.constraints.*;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import java.util.Set;
7 9  
8 10 @Schema(description = "管理后台 - crm联系人更新 Request VO")
9 11 @Data
... ... @@ -14,4 +16,10 @@ public class ContactUpdateReqVO extends ContactBaseVO {
14 16 @Schema(description = "主键", example = "23210")
15 17 private Long id;
16 18  
  19 + @Schema(description = "只读权限的用户编号数组")
  20 + private Set<Long> roUserIds;
  21 +
  22 + @Schema(description = "读写权限的用户编号数组")
  23 + private Set<Long> rwUserIds;
  24 +
17 25 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +@Schema(description = "管理后台 - 联系转移 Request VO")
  9 +@Data
  10 +public class CrmContactTransferReqVO {
  11 +
  12 + @Schema(description = "联系人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
  13 + @NotNull(message = "联系人编号不能为空")
  14 + private Long id;
  15 +
  16 + @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
  17 + @NotNull(message = "新负责人的用户编号不能为空")
  18 + private Long ownerUserId; // 新的负责人
  19 +
  20 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.contact;
2 2  
3   -import java.util.*;
4   -
  3 +import cn.hutool.core.util.ObjUtil;
5 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -
7   -import org.mapstruct.Mapper;
8   -import org.mapstruct.factory.Mappers;
9 5 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
10 6 import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
  7 +import org.mapstruct.Mapper;
  8 +import org.mapstruct.factory.Mappers;
  9 +
  10 +import java.util.List;
  11 +import java.util.Set;
11 12  
12 13 /**
13 14 * crm联系人 Convert
... ... @@ -31,4 +32,12 @@ public interface ContactConvert {
31 32  
32 33 List<ContactExcelVO> convertList02(List<ContactDO> list);
33 34  
  35 + default ContactDO convert(ContactDO contact, CrmContactTransferReqVO reqVO, Long userId) {
  36 + Set<Long> rwUserIds = contact.getRwUserIds();
  37 + rwUserIds.removeIf(item -> ObjUtil.equal(item, userId.toString())); // 移除老负责人
  38 + rwUserIds.add(reqVO.getOwnerUserId()); // 读写权限加入新的负人
  39 + return new ContactDO().setId(contact.getId()).setOwnerUserId(reqVO.getOwnerUserId()) // 设置新负责人
  40 + .setRwUserIds(rwUserIds);
  41 + }
  42 +
34 43 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java
1 1 package cn.iocoder.yudao.module.crm.dal.dataobject.contact;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler;
4 5 import com.baomidou.mybatisplus.annotation.KeySequence;
  6 +import com.baomidou.mybatisplus.annotation.TableField;
5 7 import com.baomidou.mybatisplus.annotation.TableId;
6 8 import com.baomidou.mybatisplus.annotation.TableName;
7 9 import lombok.*;
8 10  
9 11 import java.time.LocalDateTime;
  12 +import java.util.Set;
10 13  
11 14 /**
12 15 * crm 联系人 DO
... ... @@ -77,4 +80,15 @@ public class ContactDO extends BaseDO {
77 80 */
78 81 private LocalDateTime lastTime;
79 82  
  83 + /**
  84 + * 只读权限的用户编号数组
  85 + */
  86 + @TableField(typeHandler = JsonLongSetTypeHandler.class)
  87 + private Set<Long> roUserIds;
  88 + /**
  89 + * 读写权限的用户编号数组
  90 + */
  91 + @TableField(typeHandler = JsonLongSetTypeHandler.class)
  92 + private Set<Long> rwUserIds;
  93 +
80 94 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java
1 1 package cn.iocoder.yudao.module.crm.service.contact;
2 2  
3   -import java.util.*;
4   -import javax.validation.*;
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 4 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
6 5 import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
7   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +
  7 +import javax.validation.Valid;
  8 +import java.util.Collection;
  9 +import java.util.List;
8 10  
9 11 /**
10 12 * crm联系人 Service 接口
... ... @@ -67,4 +69,12 @@ public interface ContactService {
67 69 */
68 70 List<ContactDO> getContactList(ContactExportReqVO exportReqVO);
69 71  
  72 + /**
  73 + * 联系人编号
  74 + *
  75 + * @param reqVO 请求
  76 + * @param userId 用户编号
  77 + */
  78 + void contactTransfer(CrmContactTransferReqVO reqVO, Long userId);
  79 +
70 80 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java
... ... @@ -3,13 +3,12 @@ package cn.iocoder.yudao.module.crm.service.contact;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.collection.ListUtil;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactCreateReqVO;
7   -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactExportReqVO;
8   -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactPageReqVO;
9   -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactUpdateReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
10 7 import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert;
11 8 import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
12 9 import cn.iocoder.yudao.module.crm.dal.mysql.contact.ContactMapper;
  10 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  11 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
13 12 import org.springframework.stereotype.Service;
14 13 import org.springframework.validation.annotation.Validated;
15 14  
... ... @@ -18,7 +17,8 @@ import java.util.Collection;
18 17 import java.util.List;
19 18  
20 19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
21   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTACT_NOT_EXISTS;
  20 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
  21 +import static cn.iocoder.yudao.module.crm.framework.utils.AuthUtil.isReadAndWrite;
22 22  
23 23 /**
24 24 * crm联系人 Service 实现类
... ... @@ -32,6 +32,9 @@ public class ContactServiceImpl implements ContactService {
32 32 @Resource
33 33 private ContactMapper contactMapper;
34 34  
  35 + @Resource
  36 + private AdminUserApi adminUserApi;
  37 +
35 38 @Override
36 39 public Long createContact(ContactCreateReqVO createReqVO) {
37 40 // TODO @customerId:需要校验存在
... ... @@ -61,10 +64,12 @@ public class ContactServiceImpl implements ContactService {
61 64 contactMapper.deleteById(id);
62 65 }
63 66  
64   - private void validateContactExists(Long id) {
65   - if (contactMapper.selectById(id) == null) {
  67 + private ContactDO validateContactExists(Long id) {
  68 + ContactDO contact = contactMapper.selectById(id);
  69 + if (contact == null) {
66 70 throw exception(CONTACT_NOT_EXISTS);
67 71 }
  72 + return contact;
68 73 }
69 74  
70 75 @Override
... ... @@ -90,4 +95,26 @@ public class ContactServiceImpl implements ContactService {
90 95 return contactMapper.selectList(exportReqVO);
91 96 }
92 97  
  98 + @Override
  99 + public void contactTransfer(CrmContactTransferReqVO reqVO, Long userId) {
  100 + // 1. 校验联系人是否存在
  101 + ContactDO contact = validateContactExists(reqVO.getId());
  102 + // 1.2. 校验用户是否拥有读写权限
  103 + if (!isReadAndWrite(contact.getRwUserIds(), userId)) {
  104 + throw exception(CONTACT_TRANSFER_FAIL_PERMISSION_DENIED);
  105 + }
  106 + // 2. 校验新负责人是否存在
  107 + AdminUserRespDTO user = adminUserApi.getUser(reqVO.getOwnerUserId());
  108 + if (user == null) {
  109 + throw exception(CONTACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS);
  110 + }
  111 +
  112 + // 3. 更新新的负责人
  113 + ContactDO updateContract = ContactConvert.INSTANCE.convert(contact, reqVO, userId);
  114 + contactMapper.updateById(updateContract);
  115 +
  116 + // 4. TODO 记录联系人转移日志
  117 +
  118 + }
  119 +
93 120 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java
... ... @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*;
7 7 import cn.iocoder.yudao.module.crm.convert.contract.ContractConvert;
8 8 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO;
9 9 import cn.iocoder.yudao.module.crm.dal.mysql.contract.ContractMapper;
  10 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  11 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
10 12 import org.springframework.stereotype.Service;
11 13 import org.springframework.validation.annotation.Validated;
12 14  
... ... @@ -15,8 +17,7 @@ import java.util.Collection;
15 17 import java.util.List;
16 18  
17 19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
18   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTRACT_NOT_EXISTS;
19   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTRACT_TRANSFER_FAIL_PERMISSION_DENIED;
  20 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
20 21 import static cn.iocoder.yudao.module.crm.framework.utils.AuthUtil.isReadAndWrite;
21 22  
22 23 /**
... ... @@ -31,6 +32,9 @@ public class ContractServiceImpl implements ContractService {
31 32 @Resource
32 33 private ContractMapper contractMapper;
33 34  
  35 + @Resource
  36 + private AdminUserApi adminUserApi;
  37 +
34 38 @Override
35 39 public Long createContract(ContractCreateReqVO createReqVO) {
36 40 // 插入
... ... @@ -96,12 +100,17 @@ public class ContractServiceImpl implements ContractService {
96 100 if (!isReadAndWrite(contract.getRwUserIds(), userId)) {
97 101 throw exception(CONTRACT_TRANSFER_FAIL_PERMISSION_DENIED);
98 102 }
  103 + // 2. 校验新负责人是否存在
  104 + AdminUserRespDTO user = adminUserApi.getUser(reqVO.getOwnerUserId());
  105 + if (user == null) {
  106 + throw exception(CONTRACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS);
  107 + }
99 108  
100   - // 2. 更新新的负责人
  109 + // 3. 更新新的负责人
101 110 ContractDO updateContract = ContractConvert.INSTANCE.convert(contract, reqVO, userId);
102 111 contractMapper.updateById(updateContract);
103 112  
104   - // 3. TODO 记录合同转移日志
  113 + // 4. TODO 记录合同转移日志
105 114  
106 115 }
107 116  
... ...