Commit e6eaa3a24af92e5a96d2b3169c7896d3b2cdda3c

Authored by puhui999
1 parent 19c9b6ae

完善 CRM-数据权限校验方式

Showing 40 changed files with 399 additions and 392 deletions
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
... ... @@ -11,17 +11,12 @@ public interface ErrorCodeConstants {
11 11  
12 12 // ========== 合同管理 1-020-000-000 ==========
13 13 ErrorCode CONTRACT_NOT_EXISTS = new ErrorCode(1_020_000_000, "合同不存在");
14   - ErrorCode CONTRACT_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_000_001, "合同转移失败,原因:没有转移权限"); // TODO @puhui999:这个搞成 “合同操作失败,原因:没有权限”
15   - ErrorCode CONTRACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_000_002, "合同转移失败,原因:负责人不存在");
16 14  
17 15 // ========== 线索管理 1-020-001-000 ==========
18 16 ErrorCode CLUE_NOT_EXISTS = new ErrorCode(1_020_001_000, "线索不存在");
19 17  
20 18 // ========== 商机管理 1-020-002-000 ==========
21 19 ErrorCode BUSINESS_NOT_EXISTS = new ErrorCode(1_020_002_000, "商机不存在");
22   - ErrorCode BUSINESS_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_002_001, "商机操作失败,原因:没有权限");
23   - ErrorCode BUSINESS_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_002_002, "商机操作失败,原因:负责人不存在");
24   - ErrorCode BUSINESS_TRANSFER_FAIL_OWNER_USER_EXISTS = new ErrorCode(1_020_002_003, "商机操作失败,原因:转移对象已经是该负责人");
25 20  
26 21 // TODO @lilleo:商机状态、商机类型,都单独错误码段
27 22  
... ... @@ -30,8 +25,6 @@ public interface ErrorCodeConstants {
30 25  
31 26 // ========== 联系人管理 1-020-003-000 ==========
32 27 ErrorCode CONTACT_NOT_EXISTS = new ErrorCode(1_020_003_000, "联系人不存在");
33   - ErrorCode CONTACT_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_003_001, "联系人转移失败,原因:没有转移权限"); // TODO @puhui999:这个搞成 “联系人操作失败,原因:没有权限”
34   - ErrorCode CONTACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_003_002, "联系人转移失败,原因:负责人不存在");
35 28  
36 29 // TODO @liuhongfeng:错误码分段;
37 30 ErrorCode RECEIVABLE_NOT_EXISTS = new ErrorCode(1_030_000_001, "回款管理不存在");
... ... @@ -43,5 +36,9 @@ public interface ErrorCodeConstants {
43 36  
44 37 // ========== 客户管理 1_020_007_000 ==========
45 38 ErrorCode CRM_PERMISSION_NOT_EXISTS = new ErrorCode(1_020_007_000, "数据权限不存在");
  39 + ErrorCode CRM_PERMISSION_DENIED = new ErrorCode(1_020_007_001, "{}操作失败,原因:没有权限");
  40 + ErrorCode CRM_PERMISSION_MODEL_NOT_EXISTS = new ErrorCode(1_020_007_002, "{}不存在");
  41 + ErrorCode CRM_PERMISSION_MODEL_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS = new ErrorCode(1_020_007_003, "{}操作失败,原因:负责人不存在");
  42 + ErrorCode CRM_PERMISSION_MODEL_TRANSFER_FAIL_OWNER_USER_EXISTS = new ErrorCode(1_020_007_004, "{}操作失败,原因:转移对象已经是该负责人");
46 43  
47 44 }
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/PermissionTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.enums.common;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +@Getter
  10 +@AllArgsConstructor
  11 +public enum PermissionTypeEnum implements IntArrayValuable {
  12 +
  13 + READONLY(1, "只读"),
  14 + READ_AND_WRITE(2, "读写");
  15 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PermissionTypeEnum::getType).toArray();
  16 +
  17 + /**
  18 + * 类型
  19 + */
  20 + private final Integer type;
  21 + /**
  22 + * 类型名
  23 + */
  24 + private final String name;
  25 +
  26 + @Override
  27 + public int[] array() {
  28 + return ARRAYS;
  29 + }
  30 +
  31 +}
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/TransferTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.enums.common;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +/**
  10 + * Crm 负责人转移后原负责人的处理方式
  11 + *
  12 + * @author HUIHUI
  13 + */
  14 +@Getter
  15 +@AllArgsConstructor
  16 +public enum TransferTypeEnum implements IntArrayValuable {
  17 +
  18 + REMOVE(1, "移除"),
  19 + TEAM(2, "转为团队成员");
  20 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TransferTypeEnum::getType).toArray();
  21 +
  22 + /**
  23 + * 类型
  24 + */
  25 + private final Integer type;
  26 + /**
  27 + * 类型名
  28 + */
  29 + private final String name;
  30 +
  31 + @Override
  32 + public int[] array() {
  33 + return ARRAYS;
  34 + }
  35 +
  36 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.business;
2 2  
3   -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 5 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
... ... @@ -8,7 +7,6 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
8 7 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*;
9 8 import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
10 9 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
11   -import cn.iocoder.yudao.module.crm.framework.utils.CrmPermissionUtils;
12 10 import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
13 11 import io.swagger.v3.oas.annotations.Operation;
14 12 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -40,7 +38,7 @@ public class CrmBusinessController {
40 38 @Operation(summary = "创建商机")
41 39 @PreAuthorize("@ss.hasPermission('crm:business:create')")
42 40 public CommonResult<Long> createBusiness(@Valid @RequestBody CrmBusinessCreateReqVO createReqVO) {
43   - return success(businessService.createBusiness(createReqVO));
  41 + return success(businessService.createBusiness(createReqVO, getLoginUserId()));
44 42 }
45 43  
46 44 @PutMapping("/update")
... ... @@ -65,7 +63,6 @@ public class CrmBusinessController {
65 63 @Parameter(name = "id", description = "编号", required = true, example = "1024")
66 64 @PreAuthorize("@ss.hasPermission('crm:business:query')")
67 65 public CommonResult<CrmBusinessRespVO> getBusiness(@RequestParam("id") Long id) {
68   - CrmPermissionUtils.setCrmTransferInfo(getLoginUserId(), UserTypeEnum.ADMIN.getValue());
69 66 CrmBusinessDO business = businessService.getBusiness(id);
70 67 return success(CrmBusinessConvert.INSTANCE.convert(business));
71 68 }
... ... @@ -95,7 +92,6 @@ public class CrmBusinessController {
95 92 @Operation(summary = "商机转移")
96 93 @PreAuthorize("@ss.hasPermission('crm:business:update')")
97 94 public CommonResult<Boolean> transfer(@Valid @RequestBody CrmTransferBusinessReqVO reqVO) {
98   - CrmPermissionUtils.setCrmTransferInfo(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO);
99 95 businessService.businessTransfer(reqVO, getLoginUserId());
100 96 return success(true);
101 97 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmTransferBusinessReqVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.business.vo;
2 2  
3   -import cn.iocoder.yudao.module.crm.framework.vo.CrmTransferBaseVO;
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.crm.enums.common.PermissionTypeEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.common.TransferTypeEnum;
4 6 import io.swagger.v3.oas.annotations.media.Schema;
5 7 import lombok.Data;
6 8  
  9 +import javax.validation.constraints.NotNull;
  10 +
7 11 @Schema(description = "管理后台 - 商机转移 Request VO")
8 12 @Data
9   -public class CrmTransferBusinessReqVO extends CrmTransferBaseVO {
  13 +public class CrmTransferBusinessReqVO {
  14 +
  15 + @Schema(description = "商机编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
  16 + @NotNull(message = "联系人编号不能为空")
  17 + private Long id;
  18 +
  19 + @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
  20 + @NotNull(message = "新负责人的用户编号不能为空")
  21 + private Long ownerUserId;
  22 +
  23 + @Schema(description = "原负责人移除方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
  24 + @InEnum(TransferTypeEnum.class)
  25 + @NotNull(message = "原负责人移除方式不能为空")
  26 + private Integer transferType;
  27 +
  28 + @Schema(description = "权限类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
  29 + @InEnum(PermissionTypeEnum.class)
  30 + @NotNull(message = "权限类型不能为空")
  31 + private Integer permissionType;
  32 +
10 33  
11 34 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueBaseVO.java
... ... @@ -42,10 +42,6 @@ public class CrmClueBaseVO {
42 42 @Schema(description = "地址", example = "北京市海淀区")
43 43 private String address;
44 44  
45   - @Schema(description = "负责人的用户编号", example = "27199")
46   - @NotNull(message = "负责人不能为空")
47   - private Long ownerUserId;
48   -
49 45 @Schema(description = "最后跟进时间")
50 46 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
51 47 private LocalDateTime contactLastTime;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java
... ... @@ -39,7 +39,7 @@ public class ContactController {
39 39 @Operation(summary = "创建crm联系人")
40 40 @PreAuthorize("@ss.hasPermission('crm:contact:create')")
41 41 public CommonResult<Long> createContact(@Valid @RequestBody ContactCreateReqVO createReqVO) {
42   - return success(contactService.createContact(createReqVO));
  42 + return success(contactService.createContact(createReqVO, getLoginUserId()));
43 43 }
44 44  
45 45 @PutMapping("/update")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactCreateReqVO.java
... ... @@ -5,18 +5,10 @@ import lombok.Data;
5 5 import lombok.EqualsAndHashCode;
6 6 import lombok.ToString;
7 7  
8   -import java.util.Set;
9   -
10 8 @Schema(description = "管理后台 - crm联系人创建 Request VO")
11 9 @Data
12 10 @EqualsAndHashCode(callSuper = true)
13 11 @ToString(callSuper = true)
14 12 public class ContactCreateReqVO extends ContactBaseVO {
15 13  
16   - @Schema(description = "只读权限的用户编号数组")
17   - private Set<Long> roUserIds;
18   -
19   - @Schema(description = "读写权限的用户编号数组")
20   - private Set<Long> rwUserIds;
21   -
22 14 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java
... ... @@ -17,4 +17,12 @@ public class CrmContactTransferReqVO {
17 17 @NotNull(message = "新负责人的用户编号不能为空")
18 18 private Long ownerUserId;
19 19  
  20 + @Schema(description = "原负责人移除方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
  21 + @NotNull(message = "原负责人移除方式不能为空")
  22 + private Integer transferType;
  23 +
  24 + @Schema(description = "权限类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
  25 + @NotNull(message = "权限类型不能为空")
  26 + private Integer permissionType;
  27 +
20 28 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/ContractController.java
... ... @@ -38,7 +38,7 @@ public class ContractController {
38 38 @Operation(summary = "创建合同")
39 39 @PreAuthorize("@ss.hasPermission('crm:contract:create')")
40 40 public CommonResult<Long> createContract(@Valid @RequestBody ContractCreateReqVO createReqVO) {
41   - return success(contractService.createContract(createReqVO));
  41 + return success(contractService.createContract(createReqVO, getLoginUserId()));
42 42 }
43 43  
44 44 @PutMapping("/update")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java
... ... @@ -3,11 +3,13 @@ package cn.iocoder.yudao.module.crm.convert.business;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*;
5 5 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
  6 +import cn.iocoder.yudao.module.crm.service.permission.bo.TransferCrmPermissionBO;
6 7 import org.mapstruct.Mapper;
  8 +import org.mapstruct.Mapping;
  9 +import org.mapstruct.Mappings;
7 10 import org.mapstruct.factory.Mappers;
8 11  
9 12 import java.util.List;
10   -import java.util.Set;
11 13  
12 14 /**
13 15 * 商机 Convert
... ... @@ -29,13 +31,10 @@ public interface CrmBusinessConvert {
29 31  
30 32 List<CrmBusinessExcelVO> convertList02(List<CrmBusinessDO> list);
31 33  
32   - default CrmBusinessDO convert(CrmBusinessDO business, CrmTransferBusinessReqVO reqVO, Long userId) {
33   - Set<Long> rwUserIds = business.getRwUserIds();
34   - rwUserIds.remove(userId);
35   - rwUserIds.add(reqVO.getOwnerUserId()); // 读写权限加入新的负责人
36   - // TODO @puhui999:对原负责人,加个类似的处理:移除、转化为团队成员(只读、读写)
37   - return new CrmBusinessDO().setId(business.getId()).setOwnerUserId(reqVO.getOwnerUserId()) // 设置新负责人
38   - .setRwUserIds(rwUserIds);
39   - }
  34 + @Mappings({
  35 + @Mapping(target = "userId", source = "userId"),
  36 + @Mapping(target = "crmDataId", source = "reqVO.id")
  37 + })
  38 + TransferCrmPermissionBO convert(CrmTransferBusinessReqVO reqVO, Long userId);
40 39  
41 40 }
... ...
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 cn.hutool.core.util.ObjUtil;
4 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;
  6 +import cn.iocoder.yudao.module.crm.service.permission.bo.TransferCrmPermissionBO;
7 7 import org.mapstruct.Mapper;
  8 +import org.mapstruct.Mapping;
  9 +import org.mapstruct.Mappings;
8 10 import org.mapstruct.factory.Mappers;
9 11  
10 12 import java.util.List;
11   -import java.util.Set;
12 13  
13 14 /**
14 15 * crm联系人 Convert
... ... @@ -32,13 +33,10 @@ public interface ContactConvert {
32 33  
33 34 List<ContactExcelVO> convertList02(List<ContactDO> list);
34 35  
35   - // TODO @puhui999:参考 CrmBusinessConvert 的修改建议
36   - default ContactDO convert(ContactDO contact, CrmContactTransferReqVO reqVO, Long userId) {
37   - Set<Long> rwUserIds = contact.getRwUserIds();
38   - rwUserIds.removeIf(item -> ObjUtil.equal(item, userId)); // 移除老负责人
39   - rwUserIds.add(reqVO.getOwnerUserId()); // 读写权限加入新的负人
40   - return new ContactDO().setId(contact.getId()).setOwnerUserId(reqVO.getOwnerUserId()) // 设置新负责人
41   - .setRwUserIds(rwUserIds);
42   - }
  36 + @Mappings({
  37 + @Mapping(target = "userId", source = "userId"),
  38 + @Mapping(target = "crmDataId", source = "reqVO.id")
  39 + })
  40 + TransferCrmPermissionBO convert(CrmContactTransferReqVO reqVO, Long userId);
43 41  
44 42 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contract/ContractConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.contract;
2 2  
3   -import cn.hutool.core.util.ObjUtil;
4 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 4 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*;
6 5 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO;
  6 +import cn.iocoder.yudao.module.crm.service.permission.bo.TransferCrmPermissionBO;
7 7 import org.mapstruct.Mapper;
  8 +import org.mapstruct.Mapping;
  9 +import org.mapstruct.Mappings;
8 10 import org.mapstruct.factory.Mappers;
9 11  
10 12 import java.util.List;
11   -import java.util.Set;
12 13  
13 14 /**
14 15 * 合同 Convert
... ... @@ -32,13 +33,10 @@ public interface ContractConvert {
32 33  
33 34 List<ContractExcelVO> convertList02(List<ContractDO> list);
34 35  
35   - // TODO @puhui999:参考 CrmBusinessConvert 的修改建议
36   - default ContractDO convert(ContractDO contract, CrmContractTransferReqVO reqVO, Long userId) {
37   - Set<Long> rwUserIds = contract.getRwUserIds();
38   - rwUserIds.removeIf(item -> ObjUtil.equal(item, userId)); // 移除老负责人
39   - rwUserIds.add(reqVO.getOwnerUserId()); // 读写权限加入新的负人
40   - return (ContractDO) new ContractDO().setId(contract.getId()).setOwnerUserId(reqVO.getOwnerUserId()) // 设置新负责人
41   - .setRwUserIds(rwUserIds);
42   - }
  36 + @Mappings({
  37 + @Mapping(target = "userId", source = "userId"),
  38 + @Mapping(target = "crmDataId", source = "reqVO.id")
  39 + })
  40 + TransferCrmPermissionBO convert(CrmContractTransferReqVO reqVO, Long userId);
43 41  
44 42 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java
1 1 package cn.iocoder.yudao.module.crm.dal.dataobject.business;
2 2  
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
3 4 import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO;
4 5 import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO;
5   -import cn.iocoder.yudao.module.crm.framework.dataobject.CrmPermissionBaseDO;
6 6 import com.baomidou.mybatisplus.annotation.KeySequence;
7 7 import com.baomidou.mybatisplus.annotation.TableId;
8 8 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -23,7 +23,7 @@ import java.time.LocalDateTime;
23 23 @Builder
24 24 @NoArgsConstructor
25 25 @AllArgsConstructor
26   -public class CrmBusinessDO extends CrmPermissionBaseDO {
  26 +public class CrmBusinessDO extends BaseDO {
27 27  
28 28 /**
29 29 * 主键
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/clue/CrmClueDO.java
... ... @@ -65,12 +65,6 @@ public class CrmClueDO extends BaseDO {
65 65 */
66 66 private String address;
67 67 /**
68   - * 负责人的用户编号
69   - *
70   - * 关联 AdminUserDO 的 id 字段
71   - */
72   - private Long ownerUserId;
73   - /**
74 68 * 最后跟进时间 TODO 添加跟进记录时更新该值
75 69 */
76 70 private LocalDateTime contactLastTime;
... ...
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   -import cn.iocoder.yudao.module.crm.framework.dataobject.CrmPermissionBaseDO;
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import com.baomidou.mybatisplus.annotation.KeySequence;
5 5 import com.baomidou.mybatisplus.annotation.TableId;
6 6 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -21,7 +21,7 @@ import java.time.LocalDateTime;
21 21 @Builder
22 22 @NoArgsConstructor
23 23 @AllArgsConstructor
24   -public class ContactDO extends CrmPermissionBaseDO {
  24 +public class ContactDO extends BaseDO {
25 25  
26 26 /**
27 27 * 主键
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/ContractDO.java
1 1 package cn.iocoder.yudao.module.crm.dal.dataobject.contract;
2 2  
3   -import cn.iocoder.yudao.module.crm.framework.dataobject.CrmPermissionBaseDO;
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import com.baomidou.mybatisplus.annotation.KeySequence;
5 5 import com.baomidou.mybatisplus.annotation.TableId;
6 6 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -21,7 +21,7 @@ import java.time.LocalDateTime;
21 21 @Builder
22 22 @NoArgsConstructor
23 23 @AllArgsConstructor
24   -public class ContractDO extends CrmPermissionBaseDO {
  24 +public class ContractDO extends BaseDO {
25 25  
26 26 /**
27 27 * 合同编号
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerDO.java
1 1 package cn.iocoder.yudao.module.crm.dal.dataobject.customer;
2 2  
3   -import cn.iocoder.yudao.module.crm.framework.dataobject.CrmPermissionBaseDO;
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import com.baomidou.mybatisplus.annotation.KeySequence;
5 5 import com.baomidou.mybatisplus.annotation.TableId;
6 6 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -23,7 +23,7 @@ import java.time.LocalDateTime;
23 23 @Builder
24 24 @NoArgsConstructor
25 25 @AllArgsConstructor
26   -public class CrmCustomerDO extends CrmPermissionBaseDO {
  26 +public class CrmCustomerDO extends BaseDO {
27 27  
28 28 /**
29 29 * 编号
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java
... ... @@ -36,9 +36,9 @@ public class CrmPermissionDO extends BaseDO {
36 36 */
37 37 private Integer crmType;
38 38 /**
39   - * 数据编号 关联 {@link CrmEnum} 对应模块 DO#id
  39 + * 数据编号 关联 {@link CrmEnum} 对应模块 DO#getId()
40 40 */
41   - private Integer crmDataId;
  41 + private Long crmDataId;
42 42 /**
43 43 * 负责人的用户编号 关联 AdminUser#id
44 44 */
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java
... ... @@ -36,10 +36,7 @@ public interface CrmBusinessMapper extends BaseMapperX&lt;CrmBusinessDO&gt; {
36 36 .eqIfPresent(CrmBusinessDO::getDiscountPercent, reqVO.getDiscountPercent())
37 37 .eqIfPresent(CrmBusinessDO::getProductPrice, reqVO.getProductPrice())
38 38 .eqIfPresent(CrmBusinessDO::getRemark, reqVO.getRemark())
39   - .eqIfPresent(CrmBusinessDO::getOwnerUserId, reqVO.getOwnerUserId())
40 39 .betweenIfPresent(CrmBusinessDO::getCreateTime, reqVO.getCreateTime())
41   - .eqIfPresent(CrmBusinessDO::getRoUserIds, reqVO.getRoUserIds())
42   - .eqIfPresent(CrmBusinessDO::getRwUserIds, reqVO.getRwUserIds())
43 40 .eqIfPresent(CrmBusinessDO::getEndStatus, reqVO.getEndStatus())
44 41 .eqIfPresent(CrmBusinessDO::getEndRemark, reqVO.getEndRemark())
45 42 .betweenIfPresent(CrmBusinessDO::getContactLastTime, reqVO.getContactLastTime())
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java
1 1 package cn.iocoder.yudao.module.crm.dal.mysql.permission;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
4 5 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
5 6 import org.apache.ibatis.annotations.Mapper;
6 7  
... ... @@ -11,4 +12,10 @@ import org.apache.ibatis.annotations.Mapper;
11 12 */
12 13 @Mapper
13 14 public interface CrmPermissionMapper extends BaseMapperX<CrmPermissionDO> {
  15 +
  16 + default CrmPermissionDO selectByCrmTypeAndCrmDataId(Integer crmType, Long crmDataId) {
  17 + return selectOne(new LambdaQueryWrapperX<CrmPermissionDO>()
  18 + .eq(CrmPermissionDO::getCrmType, crmType).eq(CrmPermissionDO::getCrmDataId, crmDataId));
  19 + }
  20 +
14 21 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java
... ... @@ -2,19 +2,11 @@ package cn.iocoder.yudao.module.crm.framework.core.aop;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.ObjUtil;
5   -import cn.iocoder.yudao.framework.common.core.KeyValue;
6   -import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
7   -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
8   -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO;
9   -import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
  5 +import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
10 7 import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
11   -import cn.iocoder.yudao.module.crm.framework.enums.CrmEnum;
12 8 import cn.iocoder.yudao.module.crm.framework.enums.OperationTypeEnum;
13   -import cn.iocoder.yudao.module.crm.framework.vo.CrmTransferBaseVO;
14   -import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
15   -import cn.iocoder.yudao.module.crm.service.contact.ContactService;
16   -import cn.iocoder.yudao.module.crm.service.contract.ContractService;
17   -import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
  9 +import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
18 10 import lombok.extern.slf4j.Slf4j;
19 11 import org.aspectj.lang.JoinPoint;
20 12 import org.aspectj.lang.annotation.Aspect;
... ... @@ -22,11 +14,11 @@ import org.aspectj.lang.annotation.Before;
22 14 import org.springframework.stereotype.Component;
23 15  
24 16 import javax.annotation.Resource;
25   -import java.util.Collection;
26 17  
27 18 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
28 19 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
29   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
  20 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_PERMISSION_DENIED;
  21 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_PERMISSION_MODEL_NOT_EXISTS;
30 22  
31 23 /**
32 24 * Crm 数据权限校验 AOP 切面
... ... @@ -38,48 +30,16 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
38 30 @Slf4j
39 31 public class CrmPermissionAspect {
40 32  
41   - /**
42   - * 用户编号
43   - */
44   - private static final ThreadLocal<Long> USER_ID = new ThreadLocal<>();
45   - /**
46   - * 用户类型
47   - */
48   - private static final ThreadLocal<Integer> USER_TYPE = new ThreadLocal<>();
49   - /**
50   - * 操作数据编号
51   - */
52   - private static final ThreadLocal<Long> DATA_ID = new ThreadLocal<>();
53   - /**
54   - * Crm 转换数据 VO 数据
55   - */
56   - private static final ThreadLocal<CrmTransferBaseVO> CRM_TRANSFER_VO = new ThreadLocal<>();
57   -
58 33 @Resource
59   - private CrmBusinessService crmBusinessService;
60   - @Resource
61   - private ContactService contactService;
62   - @Resource
63   - private ContractService contractService;
64   - @Resource
65   - private CrmCustomerService crmCustomerService;
66   -
67   - public static void setCrmTransferInfo(Long userId, Integer userType, Object crmTransferBaseVO) {
68   - USER_ID.set(userId);
69   - USER_TYPE.set(userType);
70   - CRM_TRANSFER_VO.set((CrmTransferBaseVO) crmTransferBaseVO);
71   - }
  34 + private CrmPermissionService crmPermissionService;
72 35  
73   - public static void setCrmTransferInfo(Long userId, Integer userType) {
74   - USER_ID.set(userId);
75   - USER_TYPE.set(userType);
76   - }
77   -
78   - private static void clear() {
79   - USER_ID.remove();
80   - USER_TYPE.remove();
81   - DATA_ID.remove();
82   - CRM_TRANSFER_VO.remove();
  36 + /**
  37 + * 获得用户编号
  38 + *
  39 + * @return 用户编号
  40 + */
  41 + private static Long getUserId() {
  42 + return WebFrameworkUtils.getLoginUserId();
83 43 }
84 44  
85 45 @Before("@annotation(crmPermission)")
... ... @@ -87,78 +47,46 @@ public class CrmPermissionAspect {
87 47 try {
88 48 Integer crmType = crmPermission.crmType().getType();
89 49 Integer operationType = crmPermission.operationType().getType();
90   - Long id = DATA_ID.get();// 获取操作数据的编号
91   - KeyValue<Collection<Long>, Collection<Long>> keyValue = new KeyValue<>(); // 数据权限 key 只读,value 读写
92   - // 客户
93   - if (ObjUtil.equal(crmType, CrmEnum.CRM_CUSTOMER.getType())) {
94   - CrmCustomerDO customer = crmCustomerService.getCustomer(id);
95   - if (customer == null) {
96   - throw exception(CUSTOMER_NOT_EXISTS);
97   - }
98   - // 如果是自己则直接过
99   - if (ObjUtil.equal(customer.getOwnerUserId(), USER_ID.get())) {
100   - return;
101   - }
102   - new KeyValue<>(customer.getRoUserIds(), customer.getRwUserIds());
  50 + Long id = (Long) joinPoint.getArgs()[0];// 获取操作数据的编号
  51 +
  52 + // 1. 获取数据权限
  53 + CrmPermissionDO permission = crmPermissionService.getCrmPermissionByCrmTypeAndCrmDataId(crmType, id);
  54 + if (permission == null) {
  55 + // 不存在说明数据也不存在
  56 + throw exception(CRM_PERMISSION_MODEL_NOT_EXISTS, crmPermission.crmType().getName());
103 57 }
104   - // 联系人
105   - if (ObjUtil.equal(crmType, CrmEnum.CRM_CONTACTS.getType())) {
106   - ContactDO contact = contactService.getContact(id);
107   - if (contact == null) {
108   - throw exception(CONTACT_NOT_EXISTS);
109   - }
110   - // 如果是自己则直接过
111   - if (ObjUtil.equal(contact.getOwnerUserId(), USER_ID.get())) {
112   - return;
113   - }
114   - new KeyValue<>(contact.getRoUserIds(), contact.getRwUserIds());
  58 + // 1.2. 校验是否为公海数据
  59 + if (permission.getOwnerUserId() == null) {
  60 + return;
115 61 }
116   - // 商机
117   - if (ObjUtil.equal(crmType, CrmEnum.CRM_BUSINESS.getType())) {
118   - CrmBusinessDO business = crmBusinessService.getBusiness(id);
119   - if (business == null) {
120   - throw exception(BUSINESS_NOT_EXISTS);
121   - }
122   - // 如果是自己则直接过
123   - if (ObjUtil.equal(business.getOwnerUserId(), USER_ID.get())) {
124   - return;
125   - }
126   - new KeyValue<>(business.getRoUserIds(), business.getRwUserIds());
127   - }
128   - // 合同
129   - if (ObjUtil.equal(crmType, CrmEnum.CRM_CONTRACT.getType())) {
130   - ContractDO contract = contractService.getContract(id);
131   - if (contract == null) {
132   - throw exception(CONTRACT_NOT_EXISTS);
133   - }
134   - // 如果是自己则直接过
135   - if (ObjUtil.equal(contract.getOwnerUserId(), USER_ID.get())) {
136   - return;
137   - }
138   - new KeyValue<>(contract.getRoUserIds(), contract.getRwUserIds());
  62 + // 1.3. 校验当前负责人是不是自己
  63 + if (ObjUtil.equal(permission.getOwnerUserId(), getUserId())) {
  64 + return;
139 65 }
140   - // 1. 校验是否有读权限
  66 + // 1.4 TODO 校验是否为超级管理员
  67 +
  68 + // 2. 校验是否有读权限
141 69 if (OperationTypeEnum.isRead(operationType)) {
142 70 // 校验该数据当前用户是否可读
143   - boolean isRead = CollUtil.contains(keyValue.getKey(), item -> ObjUtil.equal(id, USER_ID.get()))
144   - || CollUtil.contains(keyValue.getValue(), item -> ObjUtil.equal(id, USER_ID.get()));
  71 + boolean isRead = CollUtil.contains(permission.getRoUserIds(), item -> ObjUtil.equal(item, getUserId()))
  72 + || CollUtil.contains(permission.getRwUserIds(), item -> ObjUtil.equal(item, getUserId()));
145 73 if (isRead) {
146 74 return;
147 75 }
148   - throw exception(CONTRACT_NOT_EXISTS);
149 76 }
150   - // 2. 校验是否有编辑权限
  77 +
  78 + // 3. 校验是否有编辑权限
151 79 if (OperationTypeEnum.isEdit(operationType)) {
152 80 // 校验该数据当前用户是否可读写
153   - if (CollUtil.contains(keyValue.getValue(), item -> ObjUtil.equal(id, USER_ID.get()))) {
  81 + if (CollUtil.contains(permission.getRwUserIds(), item -> ObjUtil.equal(item, getUserId()))) {
154 82 return;
155 83 }
156   - throw exception(CONTRACT_NOT_EXISTS);
157 84 }
  85 +
  86 + // 4. 没通过结束,报错 {}操作失败,原因:没有权限
  87 + throw exception(CRM_PERMISSION_DENIED, crmPermission.crmType().getName());
158 88 } catch (Exception ex) {
159 89 log.error("[doBefore][crmPermission({}) 数据校验错误]", toJsonString(crmPermission), ex);
160   - } finally {
161   - clear();
162 90 }
163 91 }
164 92  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/dataobject/CrmPermissionBaseDO.java deleted
1   -package cn.iocoder.yudao.module.crm.framework.dataobject;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4   -import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler;
5   -import com.baomidou.mybatisplus.annotation.TableField;
6   -import lombok.Data;
7   -import lombok.EqualsAndHashCode;
8   -import lombok.ToString;
9   -
10   -import java.util.Set;
11   -
12   -/**
13   - * crm 数据权限基础实体对象
14   - *
15   - * @author HUIHUI
16   - */
17   -@Data
18   -@EqualsAndHashCode(callSuper = true)
19   -@ToString(callSuper = true)
20   -public class CrmPermissionBaseDO extends BaseDO {
21   -
22   - /**
23   - * 负责人的用户编号 关联 AdminUser#id
24   - */
25   - private Long ownerUserId;
26   - /**
27   - * 只读权限的用户编号数组
28   - */
29   - @TableField(typeHandler = JsonLongSetTypeHandler.class)
30   - private Set<Long> roUserIds;
31   - /**
32   - * 读写权限的用户编号数组
33   - */
34   - @TableField(typeHandler = JsonLongSetTypeHandler.class)
35   - private Set<Long> rwUserIds;
36   -
37   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmEnum.java
1 1 package cn.iocoder.yudao.module.crm.framework.enums;
2 2  
  3 +import cn.hutool.core.util.ObjUtil;
3 4 import lombok.Getter;
4 5 import lombok.RequiredArgsConstructor;
5 6  
... ... @@ -15,12 +16,8 @@ public enum CrmEnum {
15 16 CRM_LEADS(1, "线索"),
16 17 CRM_CUSTOMER(2, "客户"),
17 18 CRM_CONTACTS(3, "联系人"),
18   - CRM_PRODUCT(4, "产品"),
19 19 CRM_BUSINESS(5, "商机"),
20   - CRM_CONTRACT(6, "合同"),
21   - CRM_RECEIVABLES(7, "回款"),
22   - CRM_RECEIVABLES_PLAN(8, "回款计划"),
23   - CRM_CUSTOMER_POOL(9, "客户公海");
  20 + CRM_CONTRACT(6, "合同");
24 21  
25 22 /**
26 23 * 类型
... ... @@ -31,4 +28,13 @@ public enum CrmEnum {
31 28 */
32 29 private final String name;
33 30  
  31 + public static String getNameByType(Integer type) {
  32 + for (CrmEnum crmEnum : CrmEnum.values()) {
  33 + if (ObjUtil.equal(crmEnum.type, type)) {
  34 + return crmEnum.name;
  35 + }
  36 + }
  37 + return "";
  38 + }
  39 +
34 40 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/OperationTypeEnum.java
... ... @@ -15,8 +15,7 @@ public enum OperationTypeEnum {
15 15  
16 16 DELETE(1, "删除"),
17 17 UPDATE(2, "修改"),
18   - READ(3, "查询"),
19   - TRANSFER(4, "转移");
  18 + READ(3, "查询");
20 19  
21 20 /**
22 21 * 类型
... ... @@ -33,7 +32,7 @@ public enum OperationTypeEnum {
33 32 }
34 33  
35 34 public static boolean isEdit(Integer type) {
36   - return ObjUtil.equal(type, UPDATE.getType()) || ObjUtil.equal(type, DELETE.getType()) || ObjUtil.equal(type, TRANSFER.getType());
  35 + return ObjUtil.equal(type, UPDATE.getType()) || ObjUtil.equal(type, DELETE.getType());
37 36 }
38 37  
39 38 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/utils/CrmPermissionUtils.java deleted
1   -package cn.iocoder.yudao.module.crm.framework.utils;
2   -
3   -import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.util.ObjUtil;
5   -import cn.iocoder.yudao.module.crm.framework.core.aop.CrmPermissionAspect;
6   -
7   -import java.util.Collection;
8   -
9   -/**
10   - * 数据读写权限校验工具类
11   - *
12   - * @author HUIHUI
13   - */
14   -public class CrmPermissionUtils {
15   -
16   - // TODO @puhui999:负责人是单独的字段哈;
17   - // TODO @puhui999:额外校验,如果是管理员,可以查看所有;看着要做成有状态的了,可能要搞个 CrmPermissionService 咧;
18   -
19   - /**
20   - * 判断当前数据对用户来说是否是只读的
21   - *
22   - * @param roUserIds 当前操作数据的只读权限的用户编号数组
23   - * @param userId 当前操作数据的用户编号
24   - * @return boolean 是/否
25   - */
26   - public static boolean isReadOnly(Collection<Long> roUserIds, Long userId) {
27   - return CollUtil.contains(roUserIds, id -> ObjUtil.equal(id, userId));
28   - }
29   -
30   - /**
31   - * 判断当前数据对用户来说是否是可读写的
32   - *
33   - * @param rwUserIds 当前操作数据的读写权限的用户编号数组
34   - * @param userId 当前操作数据的用户编号
35   - * @return boolean 是/否
36   - */
37   - public static boolean isReadAndWrite(Collection<Long> rwUserIds, Long userId) {
38   - return CollUtil.contains(rwUserIds, id -> ObjUtil.equal(id, userId));
39   - }
40   -
41   - public static void setCrmTransferInfo(Long userId, Integer userType, Object crmTransferBaseVO) {
42   - CrmPermissionAspect.setCrmTransferInfo(userId, userType, crmTransferBaseVO);
43   - }
44   -
45   - public static void setCrmTransferInfo(Long userId, Integer userType) {
46   - CrmPermissionAspect.setCrmTransferInfo(userId, userType);
47   - }
48   -
49   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/vo/CrmTransferBaseVO.java deleted
1   -package cn.iocoder.yudao.module.crm.framework.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -import javax.validation.constraints.NotNull;
7   -
8   -/**
9   - * Crm 数据转移 Base VO,提供给转移的子 VO 使用
10   - *
11   - * @author HUIHUI
12   - */
13   -@Data
14   -public class CrmTransferBaseVO {
15   -
16   - @Schema(description = "商机编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
17   - @NotNull(message = "联系人编号不能为空")
18   - private Long id;
19   -
20   - @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
21   - @NotNull(message = "新负责人的用户编号不能为空")
22   - private Long ownerUserId;
23   -
24   - @Schema(description = "原负责人移除方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
25   - @NotNull(message = "原负责人移除方式不能为空")
26   - private Integer transferType;
27   -
28   - @Schema(description = "权限类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
29   - @NotNull(message = "权限类型不能为空")
30   - private Integer permissionType;
31   -
32   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java
... ... @@ -19,9 +19,10 @@ public interface CrmBusinessService {
19 19 * 创建商机
20 20 *
21 21 * @param createReqVO 创建信息
  22 + * @param userId 用户编号
22 23 * @return 编号
23 24 */
24   - Long createBusiness(@Valid CrmBusinessCreateReqVO createReqVO);
  25 + Long createBusiness(@Valid CrmBusinessCreateReqVO createReqVO, Long userId);
25 26  
26 27 /**
27 28 * 更新商机
... ... @@ -76,5 +77,5 @@ public interface CrmBusinessService {
76 77 * @param userId 用户编号
77 78 */
78 79 void businessTransfer(CrmTransferBusinessReqVO reqVO, Long userId);
79   -
  80 +
80 81 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.crm.service.business;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.collection.ListUtil;
5   -import cn.hutool.core.util.ObjUtil;
6 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 6 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*;
8 7 import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
... ... @@ -11,9 +10,11 @@ import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper;
11 10 import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
12 11 import cn.iocoder.yudao.module.crm.framework.enums.CrmEnum;
13 12 import cn.iocoder.yudao.module.crm.framework.enums.OperationTypeEnum;
  13 +import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
  14 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
14 15 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
15   -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
16 16 import org.springframework.stereotype.Service;
  17 +import org.springframework.transaction.annotation.Transactional;
17 18 import org.springframework.validation.annotation.Validated;
18 19  
19 20 import javax.annotation.Resource;
... ... @@ -21,7 +22,7 @@ import java.util.Collection;
21 22 import java.util.List;
22 23  
23 24 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
24   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
  25 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_NOT_EXISTS;
25 26  
26 27 /**
27 28 * 商机 Service 实现类
... ... @@ -37,17 +38,27 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
37 38  
38 39 @Resource
39 40 private AdminUserApi adminUserApi;
  41 + @Resource
  42 + private CrmPermissionService crmPermissionService;
40 43  
41 44 @Override
42   - public Long createBusiness(CrmBusinessCreateReqVO createReqVO) {
  45 + @Transactional(rollbackFor = Exception.class)
  46 + public Long createBusiness(CrmBusinessCreateReqVO createReqVO, Long userId) {
43 47 // 插入
44 48 CrmBusinessDO business = CrmBusinessConvert.INSTANCE.convert(createReqVO);
45 49 businessMapper.insert(business);
  50 +
  51 + // 创建数据权限
  52 + crmPermissionService.createCrmPermission(new CrmPermissionCreateBO().setCrmType(CrmEnum.CRM_BUSINESS.getType())
  53 + .setCrmDataId(business.getId()).setOwnerUserId(userId)); // 设置当前操作的人为负责人
  54 +
46 55 // 返回
47 56 return business.getId();
48 57 }
49 58  
50 59 @Override
  60 + @Transactional(rollbackFor = Exception.class)
  61 + @CrmPermission(crmType = CrmEnum.CRM_BUSINESS, operationType = OperationTypeEnum.UPDATE)
51 62 public void updateBusiness(CrmBusinessUpdateReqVO updateReqVO) {
52 63 // 校验存在
53 64 validateBusinessExists(updateReqVO.getId());
... ... @@ -57,6 +68,8 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
57 68 }
58 69  
59 70 @Override
  71 + @Transactional(rollbackFor = Exception.class)
  72 + @CrmPermission(crmType = CrmEnum.CRM_BUSINESS, operationType = OperationTypeEnum.DELETE)
60 73 public void deleteBusiness(Long id) {
61 74 // 校验存在
62 75 validateBusinessExists(id);
... ... @@ -97,25 +110,15 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
97 110 }
98 111  
99 112 @Override
100   - @CrmPermission(crmType = CrmEnum.CRM_BUSINESS, operationType = OperationTypeEnum.TRANSFER)
  113 + @Transactional(rollbackFor = Exception.class)
101 114 public void businessTransfer(CrmTransferBusinessReqVO reqVO, Long userId) {
102   - // 1.1 校验商机是否存在
103   - CrmBusinessDO business = getBusiness(reqVO.getId());
104   - // 1.3 校验转移对象是否已经是该负责人
105   - if (ObjUtil.equal(business.getOwnerUserId(), reqVO.getOwnerUserId())) {
106   - throw exception(BUSINESS_TRANSFER_FAIL_OWNER_USER_EXISTS);
107   - }
108   - // 1.4 校验新负责人是否存在
109   - AdminUserRespDTO user = adminUserApi.getUser(reqVO.getOwnerUserId());
110   - if (user == null) {
111   - throw exception(BUSINESS_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS);
112   - }
  115 + // 1 校验商机是否存在
  116 + validateBusinessExists(reqVO.getId());
113 117  
114   - // 2. 更新新的负责人
115   - CrmBusinessDO updateBusiness = CrmBusinessConvert.INSTANCE.convert(business, reqVO, userId);
116   - businessMapper.updateById(updateBusiness);
  118 + // 2. 数据权限转移
  119 + crmPermissionService.transferCrmPermission(
  120 + CrmBusinessConvert.INSTANCE.convert(reqVO, userId).setCrmType(CrmEnum.CRM_BUSINESS.getType()));
117 121  
118   - // 3. TODO 记录商机转移日志
119 122 }
120 123  
121 124 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java
... ... @@ -19,9 +19,10 @@ public interface ContactService {
19 19 * 创建crm联系人
20 20 *
21 21 * @param createReqVO 创建信息
  22 + * @param userId 用户编号
22 23 * @return 编号
23 24 */
24   - Long createContact(@Valid ContactCreateReqVO createReqVO);
  25 + Long createContact(@Valid ContactCreateReqVO createReqVO, Long userId);
25 26  
26 27 /**
27 28 * 更新crm联系人
... ... @@ -76,5 +77,5 @@ public interface ContactService {
76 77 * @param userId 用户编号
77 78 */
78 79 void contactTransfer(CrmContactTransferReqVO reqVO, Long userId);
79   -
  80 +
80 81 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java
... ... @@ -7,9 +7,13 @@ import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
7 7 import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert;
8 8 import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
9 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;
  10 +import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
  11 +import cn.iocoder.yudao.module.crm.framework.enums.CrmEnum;
  12 +import cn.iocoder.yudao.module.crm.framework.enums.OperationTypeEnum;
  13 +import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
  14 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
12 15 import org.springframework.stereotype.Service;
  16 +import org.springframework.transaction.annotation.Transactional;
13 17 import org.springframework.validation.annotation.Validated;
14 18  
15 19 import javax.annotation.Resource;
... ... @@ -17,8 +21,7 @@ import java.util.Collection;
17 21 import java.util.List;
18 22  
19 23 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
20   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
21   -import static cn.iocoder.yudao.module.crm.framework.utils.CrmPermissionUtils.isReadAndWrite;
  24 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTACT_NOT_EXISTS;
22 25  
23 26 /**
24 27 * crm联系人 Service 实现类
... ... @@ -33,19 +36,26 @@ public class ContactServiceImpl implements ContactService {
33 36 private ContactMapper contactMapper;
34 37  
35 38 @Resource
36   - private AdminUserApi adminUserApi;
  39 + private CrmPermissionService crmPermissionService;
37 40  
38 41 @Override
39   - public Long createContact(ContactCreateReqVO createReqVO) {
  42 + public Long createContact(ContactCreateReqVO createReqVO, Long userId) {
40 43 // TODO @customerId:需要校验存在
41 44 // 插入
42 45 ContactDO contact = ContactConvert.INSTANCE.convert(createReqVO);
43 46 contactMapper.insert(contact);
  47 +
  48 + // 创建数据权限
  49 + crmPermissionService.createCrmPermission(new CrmPermissionCreateBO().setCrmType(CrmEnum.CRM_BUSINESS.getType())
  50 + .setCrmDataId(contact.getId()).setOwnerUserId(userId)); // 设置当前操作的人为负责人
  51 +
44 52 // 返回
45 53 return contact.getId();
46 54 }
47 55  
48 56 @Override
  57 + @Transactional(rollbackFor = Exception.class)
  58 + @CrmPermission(crmType = CrmEnum.CRM_CONTACTS, operationType = OperationTypeEnum.UPDATE)
49 59 public void updateContact(ContactUpdateReqVO updateReqVO) {
50 60 // 校验存在
51 61 validateContactExists(updateReqVO.getId());
... ... @@ -57,6 +67,8 @@ public class ContactServiceImpl implements ContactService {
57 67 }
58 68  
59 69 @Override
  70 + @Transactional(rollbackFor = Exception.class)
  71 + @CrmPermission(crmType = CrmEnum.CRM_CONTACTS, operationType = OperationTypeEnum.DELETE)
60 72 public void deleteContact(Long id) {
61 73 // 校验存在
62 74 validateContactExists(id);
... ... @@ -73,6 +85,7 @@ public class ContactServiceImpl implements ContactService {
73 85 }
74 86  
75 87 @Override
  88 + @CrmPermission(crmType = CrmEnum.CRM_CONTACTS, operationType = OperationTypeEnum.READ)
76 89 public ContactDO getContact(Long id) {
77 90 return contactMapper.selectById(id);
78 91 }
... ... @@ -95,26 +108,14 @@ public class ContactServiceImpl implements ContactService {
95 108 return contactMapper.selectList(exportReqVO);
96 109 }
97 110  
98   - // TODO @puhui999:参考 CrmBusinessServiceImpl 修改建议
99 111 @Override
100 112 public void contactTransfer(CrmContactTransferReqVO reqVO, Long userId) {
101   - // 1. 校验联系人是否存在
102   - ContactDO contact = validateContactExists(reqVO.getId());
103   - // 1.2. 校验用户是否拥有读写权限
104   - if (!isReadAndWrite(contact.getRwUserIds(), userId)) {
105   - throw exception(CONTACT_TRANSFER_FAIL_PERMISSION_DENIED);
106   - }
107   - // 2. 校验新负责人是否存在
108   - AdminUserRespDTO user = adminUserApi.getUser(reqVO.getOwnerUserId());
109   - if (user == null) {
110   - throw exception(CONTACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS);
111   - }
112   -
113   - // 3. 更新新的负责人
114   - ContactDO updateContact = ContactConvert.INSTANCE.convert(contact, reqVO, userId);
115   - contactMapper.updateById(updateContact);
  113 + // 1 校验联系人是否存在
  114 + validateContactExists(reqVO.getId());
116 115  
117   - // 4. TODO 记录联系人转移日志
  116 + // 2. 数据权限转移
  117 + crmPermissionService.transferCrmPermission(
  118 + ContactConvert.INSTANCE.convert(reqVO, userId).setCrmType(CrmEnum.CRM_CONTACTS.getType()));
118 119  
119 120 }
120 121  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractService.java
... ... @@ -19,9 +19,10 @@ public interface ContractService {
19 19 * 创建合同
20 20 *
21 21 * @param createReqVO 创建信息
  22 + * @param userId 用户编号
22 23 * @return 编号
23 24 */
24   - Long createContract(@Valid ContractCreateReqVO createReqVO);
  25 + Long createContract(@Valid ContractCreateReqVO createReqVO, Long userId);
25 26  
26 27 /**
27 28 * 更新合同
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java
... ... @@ -10,9 +10,10 @@ import cn.iocoder.yudao.module.crm.dal.mysql.contract.ContractMapper;
10 10 import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
11 11 import cn.iocoder.yudao.module.crm.framework.enums.CrmEnum;
12 12 import cn.iocoder.yudao.module.crm.framework.enums.OperationTypeEnum;
13   -import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
14   -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  13 +import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
  14 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
15 15 import org.springframework.stereotype.Service;
  16 +import org.springframework.transaction.annotation.Transactional;
16 17 import org.springframework.validation.annotation.Validated;
17 18  
18 19 import javax.annotation.Resource;
... ... @@ -20,8 +21,7 @@ import java.util.Collection;
20 21 import java.util.List;
21 22  
22 23 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
23   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
24   -import static cn.iocoder.yudao.module.crm.framework.utils.CrmPermissionUtils.isReadAndWrite;
  24 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTRACT_NOT_EXISTS;
25 25  
26 26 /**
27 27 * 合同 Service 实现类
... ... @@ -36,18 +36,25 @@ public class ContractServiceImpl implements ContractService {
36 36 private ContractMapper contractMapper;
37 37  
38 38 @Resource
39   - private AdminUserApi adminUserApi;
  39 + private CrmPermissionService crmPermissionService;
40 40  
41 41 @Override
42   - public Long createContract(ContractCreateReqVO createReqVO) {
  42 + public Long createContract(ContractCreateReqVO createReqVO, Long userId) {
43 43 // 插入
44 44 ContractDO contract = ContractConvert.INSTANCE.convert(createReqVO);
45 45 contractMapper.insert(contract);
  46 +
  47 + // 创建数据权限
  48 + crmPermissionService.createCrmPermission(new CrmPermissionCreateBO().setCrmType(CrmEnum.CRM_CONTRACT.getType())
  49 + .setCrmDataId(contract.getId()).setOwnerUserId(userId)); // 设置当前操作的人为负责人
  50 +
46 51 // 返回
47 52 return contract.getId();
48 53 }
49 54  
50 55 @Override
  56 + @Transactional(rollbackFor = Exception.class)
  57 + @CrmPermission(crmType = CrmEnum.CRM_CONTRACT, operationType = OperationTypeEnum.DELETE)
51 58 public void updateContract(ContractUpdateReqVO updateReqVO) {
52 59 // 校验存在
53 60 validateContractExists(updateReqVO.getId());
... ... @@ -57,6 +64,8 @@ public class ContractServiceImpl implements ContractService {
57 64 }
58 65  
59 66 @Override
  67 + @Transactional(rollbackFor = Exception.class)
  68 + @CrmPermission(crmType = CrmEnum.CRM_CONTRACT, operationType = OperationTypeEnum.DELETE)
60 69 public void deleteContract(Long id) {
61 70 // 校验存在
62 71 validateContractExists(id);
... ... @@ -73,6 +82,7 @@ public class ContractServiceImpl implements ContractService {
73 82 }
74 83  
75 84 @Override
  85 + @CrmPermission(crmType = CrmEnum.CRM_CONTRACT, operationType = OperationTypeEnum.READ)
76 86 public ContractDO getContract(Long id) {
77 87 return contractMapper.selectById(id);
78 88 }
... ... @@ -95,27 +105,15 @@ public class ContractServiceImpl implements ContractService {
95 105 return contractMapper.selectList(exportReqVO);
96 106 }
97 107  
98   - // TODO @puhui999:参考 CrmBusinessServiceImpl 修改建议
99 108 @Override
100   - @CrmPermission(crmType = CrmEnum.CRM_CONTRACT, operationType = OperationTypeEnum.TRANSFER)
  109 + @Transactional(rollbackFor = Exception.class)
101 110 public void contractTransfer(CrmContractTransferReqVO reqVO, Long userId) {
102   - // 1. 校验合同是否存在
103   - ContractDO contract = validateContractExists(reqVO.getId());
104   - // 1.2. 校验用户是否拥有读写权限
105   - if (!isReadAndWrite(contract.getRwUserIds(), userId)) {
106   - throw exception(CONTRACT_TRANSFER_FAIL_PERMISSION_DENIED);
107   - }
108   - // 2. 校验新负责人是否存在
109   - AdminUserRespDTO user = adminUserApi.getUser(reqVO.getOwnerUserId());
110   - if (user == null) {
111   - throw exception(CONTRACT_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS);
112   - }
113   -
114   - // 3. 更新新的负责人
115   - ContractDO updateContract = ContractConvert.INSTANCE.convert(contract, reqVO, userId);
116   - contractMapper.updateById(updateContract);
  111 + // 1 校验合同是否存在
  112 + validateContractExists(reqVO.getId());
117 113  
118   - // 4. TODO 记录合同转移日志
  114 + // 2. 数据权限转移
  115 + crmPermissionService.transferCrmPermission(
  116 + ContractConvert.INSTANCE.convert(reqVO, userId).setCrmType(CrmEnum.CRM_CONTRACT.getType()));
119 117  
120 118 }
121 119  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java
... ... @@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.crm.service.permission;
2 2  
3 3  
4 4 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
  5 +import cn.iocoder.yudao.module.crm.framework.enums.CrmEnum;
5 6 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
6 7 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateBO;
  8 +import cn.iocoder.yudao.module.crm.service.permission.bo.TransferCrmPermissionBO;
7 9  
8 10 import javax.validation.Valid;
9 11  
... ... @@ -39,9 +41,17 @@ public interface CrmPermissionService {
39 41 /**
40 42 * 获得数据权限
41 43 *
42   - * @param id 编号
  44 + * @param crmType 数据类型 关联 {@link CrmEnum}
  45 + * @param crmDataId 数据编号 关联 {@link CrmEnum} 对应模块 DO#getId()
43 46 * @return 数据权限
44 47 */
45   - CrmPermissionDO getCrmPermission(Long id);
  48 + CrmPermissionDO getCrmPermissionByCrmTypeAndCrmDataId(Integer crmType, Long crmDataId);
  49 +
  50 + /**
  51 + * 数据权限转移
  52 + *
  53 + * @param transferCrmPermissionBO 数据权限转移请求
  54 + */
  55 + void transferCrmPermission(@Valid TransferCrmPermissionBO transferCrmPermissionBO);
46 56  
47 57 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
1 1 package cn.iocoder.yudao.module.crm.service.permission;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjUtil;
3 5 import cn.iocoder.yudao.module.crm.convert.permission.CrmPermissionConvert;
4 6 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
5 7 import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper;
  8 +import cn.iocoder.yudao.module.crm.enums.common.PermissionTypeEnum;
  9 +import cn.iocoder.yudao.module.crm.enums.common.TransferTypeEnum;
  10 +import cn.iocoder.yudao.module.crm.framework.enums.CrmEnum;
6 11 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
7 12 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateBO;
  13 +import cn.iocoder.yudao.module.crm.service.permission.bo.TransferCrmPermissionBO;
  14 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  15 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
8 16 import org.springframework.stereotype.Service;
9 17 import org.springframework.transaction.annotation.Transactional;
10 18 import org.springframework.validation.annotation.Validated;
11 19  
12 20 import javax.annotation.Resource;
  21 +import java.util.Set;
13 22  
14 23 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
15   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_PERMISSION_NOT_EXISTS;
  24 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
16 25  
17 26 /**
18 27 * crm 数据权限 Service 接口实现类
... ... @@ -26,6 +35,8 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
26 35 @Resource
27 36 private CrmPermissionMapper crmPermissionMapper;
28 37  
  38 + @Resource
  39 + private AdminUserApi adminUserApi;
29 40  
30 41 @Override
31 42 @Transactional(rollbackFor = Exception.class)
... ... @@ -59,8 +70,52 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
59 70 }
60 71  
61 72 @Override
62   - public CrmPermissionDO getCrmPermission(Long id) {
63   - return crmPermissionMapper.selectById(id);
  73 + public CrmPermissionDO getCrmPermissionByCrmTypeAndCrmDataId(Integer crmType, Long crmDataId) {
  74 + return crmPermissionMapper.selectByCrmTypeAndCrmDataId(crmType, crmDataId);
  75 + }
  76 +
  77 + @Override
  78 + public void transferCrmPermission(TransferCrmPermissionBO transferCrmPermissionBO) {
  79 + // 1 校验商机是否存在
  80 + CrmPermissionDO permission = getCrmPermissionByCrmTypeAndCrmDataId(transferCrmPermissionBO.getCrmType(),
  81 + transferCrmPermissionBO.getCrmDataId());
  82 + String crmName = CrmEnum.getNameByType(transferCrmPermissionBO.getCrmType());
  83 + if (permission == null) {
  84 + throw exception(CRM_PERMISSION_MODEL_NOT_EXISTS, crmName);
  85 + }
  86 + // 1.2 校验转移对象是否已经是该负责人
  87 + if (ObjUtil.equal(permission.getOwnerUserId(), permission.getOwnerUserId())) {
  88 + throw exception(CRM_PERMISSION_MODEL_TRANSFER_FAIL_OWNER_USER_NOT_EXISTS, crmName);
  89 + }
  90 + // 1.3 校验新负责人是否存在
  91 + AdminUserRespDTO user = adminUserApi.getUser(permission.getOwnerUserId());
  92 + if (user == null) {
  93 + throw exception(CRM_PERMISSION_MODEL_TRANSFER_FAIL_OWNER_USER_EXISTS, crmName);
  94 + }
  95 + // TODO 校验是否为超级管理员 || 1.4
  96 + // 1.4 校验是否有写权限
  97 + if (!CollUtil.contains(permission.getRwUserIds(), id -> ObjUtil.equal(id, transferCrmPermissionBO.getUserId()))) {
  98 + throw exception(CRM_PERMISSION_DENIED, crmName);
  99 + }
  100 +
  101 + // 2 权限转移
  102 + CrmPermissionDO updateCrmPermission = new CrmPermissionDO().setId(permission.getId())
  103 + .setOwnerUserId(transferCrmPermissionBO.getOwnerUserId());
  104 + if (ObjUtil.equal(TransferTypeEnum.TEAM.getType(), transferCrmPermissionBO.getTransferType())) {
  105 + if (ObjUtil.equal(PermissionTypeEnum.READONLY.getType(), transferCrmPermissionBO.getPermissionType())) {
  106 + Set<Long> roUserIds = permission.getRoUserIds();
  107 + roUserIds.add(permission.getOwnerUserId()); // 老负责人加入团队有只读权限
  108 + updateCrmPermission.setRoUserIds(roUserIds);
  109 + }
  110 + if (ObjUtil.equal(PermissionTypeEnum.READ_AND_WRITE.getType(), transferCrmPermissionBO.getPermissionType())) {
  111 + Set<Long> rwUserIds = permission.getRwUserIds();
  112 + rwUserIds.add(permission.getOwnerUserId()); // 老负责人加入团队有读写权限
  113 + updateCrmPermission.setRoUserIds(rwUserIds);
  114 + }
  115 + }
  116 + crmPermissionMapper.updateById(updateCrmPermission);
  117 +
  118 + // 3. TODO 记录机转移日志
64 119 }
65 120  
66 121 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionCreateBO.java
... ... @@ -23,7 +23,7 @@ public class CrmPermissionCreateBO {
23 23 * 数据编号 关联 {@link CrmEnum} 对应模块 DO#getId()
24 24 */
25 25 @NotNull(message = "Crm 数据编号不能为空")
26   - private Integer crmDataId;
  26 + private Long crmDataId;
27 27 /**
28 28 * 负责人的用户编号 关联 AdminUser#id, null 则为公海数据
29 29 */
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionUpdateBO.java
... ... @@ -30,7 +30,7 @@ public class CrmPermissionUpdateBO {
30 30 * 数据编号 关联 {@link CrmEnum} 对应模块 DO#getId()
31 31 */
32 32 @NotNull(message = "Crm 数据编号不能为空")
33   - private Integer crmDataId;
  33 + private Long crmDataId;
34 34 /**
35 35 * 负责人的用户编号 关联 AdminUser#id, null 则为公海数据
36 36 */
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/TransferCrmPermissionBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.permission.bo;
  2 +
  3 +import cn.iocoder.yudao.module.crm.enums.common.PermissionTypeEnum;
  4 +import cn.iocoder.yudao.module.crm.enums.common.TransferTypeEnum;
  5 +import cn.iocoder.yudao.module.crm.framework.enums.CrmEnum;
  6 +import lombok.Data;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +/**
  11 + * 数据权限转移 BO
  12 + *
  13 + * @author HUIHUI
  14 + */
  15 +@Data
  16 +public class TransferCrmPermissionBO {
  17 +
  18 + @NotNull(message = "用户编号不能为空")
  19 + private Long userId;
  20 +
  21 + /**
  22 + * Crm 类型 关联 {@link CrmEnum}
  23 + */
  24 + @NotNull(message = "Crm 类型不能为空")
  25 + private Integer crmType;
  26 +
  27 + /**
  28 + * 数据编号 关联 {@link CrmEnum} 对应模块 DO#getId()
  29 + */
  30 + @NotNull(message = "Crm 数据编号不能为空")
  31 + private Long crmDataId;
  32 +
  33 + @NotNull(message = "新负责人的用户编号不能为空")
  34 + private Long ownerUserId;
  35 +
  36 + /**
  37 + * 原负责人移除方式, 关联 {@link TransferTypeEnum}
  38 + */
  39 + @NotNull(message = "原负责人移除方式不能为空")
  40 + private Integer transferType;
  41 +
  42 + /**
  43 + * 权限类型, 关联 {@link PermissionTypeEnum}
  44 + */
  45 + @NotNull(message = "权限类型不能为空")
  46 + private Integer permissionType;
  47 +
  48 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImplTest.java
... ... @@ -15,6 +15,7 @@ import java.util.List;
15 15  
16 16 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
17 17 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  18 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
18 19 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
19 20 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
20 21 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
... ... @@ -42,7 +43,7 @@ public class CrmBusinessServiceImplTest extends BaseDbUnitTest {
42 43 CrmBusinessCreateReqVO reqVO = randomPojo(CrmBusinessCreateReqVO.class);
43 44  
44 45 // 调用
45   - Long businessId = businessService.createBusiness(reqVO);
  46 + Long businessId = businessService.createBusiness(reqVO, getLoginUserId());
46 47 // 断言
47 48 assertNotNull(businessId);
48 49 // 校验记录的属性是否正确
... ...
yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImplTest.java
... ... @@ -17,6 +17,7 @@ import java.util.List;
17 17  
18 18 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
19 19 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  20 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
20 21 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
21 22 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
22 23 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
... ... @@ -44,7 +45,7 @@ public class ContractServiceImplTest extends BaseDbUnitTest {
44 45 ContractCreateReqVO reqVO = randomPojo(ContractCreateReqVO.class);
45 46  
46 47 // 调用
47   - Long contractId = contractService.createContract(reqVO);
  48 + Long contractId = contractService.createContract(reqVO, getLoginUserId());
48 49 // 断言
49 50 assertNotNull(contractId);
50 51 // 校验记录的属性是否正确
... ...