mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 02:38:43 +08:00 
			
		
		
		
	!907 CRM: 根据 review 完善数据权限
Merge pull request !907 from puhui999/develop
This commit is contained in:
		| @@ -66,13 +66,13 @@ public class CrmBusinessSaveReqVO { | ||||
|     private Long contactId; // 使用场景,在【联系人详情】添加商机时,如果需要关联两者,需要传递 contactId 字段 | ||||
|  | ||||
|     @Schema(description = "产品列表") | ||||
|     private List<Product> products; | ||||
|     private List<BusinessProduct> businessProducts; | ||||
|  | ||||
|     @Schema(description = "产品列表") | ||||
|     @Data | ||||
|     @NoArgsConstructor | ||||
|     @AllArgsConstructor | ||||
|     public static class Product { | ||||
|     public static class BusinessProduct { | ||||
|  | ||||
|         @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529") | ||||
|         @NotNull(message = "产品编号不能为空") | ||||
|   | ||||
| @@ -13,10 +13,9 @@ import lombok.NoArgsConstructor; | ||||
| @AllArgsConstructor | ||||
| public class CrmBusinessTransferReqVO { | ||||
|  | ||||
|     // TODO @puhui999:这里最好还是用 id 哈,主要还是在 Business 业务里 | ||||
|     @Schema(description = "商机编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") | ||||
|     @NotNull(message = "商机编号不能为空") | ||||
|     private Long bizId; | ||||
|     private Long id; | ||||
|  | ||||
|     /** | ||||
|      * 新负责人的用户编号 | ||||
|   | ||||
| @@ -12,7 +12,7 @@ public class CrmClueTransferReqVO { | ||||
|  | ||||
|     @Schema(description = "线索编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") | ||||
|     @NotNull(message = "线索编号不能为空") | ||||
|     private Long bizId; | ||||
|     private Long id; | ||||
|  | ||||
|     @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") | ||||
|     @NotNull(message = "新负责人的用户编号不能为空") | ||||
|   | ||||
| @@ -16,7 +16,7 @@ public class CrmContactTransferReqVO { | ||||
|  | ||||
|     @Schema(description = "联系人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") | ||||
|     @NotNull(message = "联系人编号不能为空") | ||||
|     private Long bizId; | ||||
|     private Long id; | ||||
|  | ||||
|     /** | ||||
|      * 新负责人的用户编号 | ||||
|   | ||||
| @@ -17,7 +17,7 @@ public class CrmContractTransferReqVO { | ||||
|  | ||||
|     @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") | ||||
|     @NotNull(message = "联系人编号不能为空") | ||||
|     private Long bizId; | ||||
|     private Long id; | ||||
|  | ||||
|     @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") | ||||
|     @NotNull(message = "新负责人的用户编号不能为空") | ||||
|   | ||||
| @@ -13,7 +13,7 @@ public class CrmCustomerTransferReqVO { | ||||
|  | ||||
|     @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") | ||||
|     @NotNull(message = "客户编号不能为空") | ||||
|     private Long bizId; | ||||
|     private Long id; | ||||
|  | ||||
|     /** | ||||
|      * 新负责人的用户编号 | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.permission; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.extra.spring.SpringUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | ||||
| @@ -56,63 +57,20 @@ public class CrmPermissionController { | ||||
|     @Resource | ||||
|     private CrmPermissionService permissionService; | ||||
|     @Resource | ||||
|     private CrmContactService contactService; | ||||
|     @Resource | ||||
|     private CrmBusinessService businessService; | ||||
|     @Resource | ||||
|     private CrmContractService contractService; | ||||
|     @Resource | ||||
|     private AdminUserApi adminUserApi; | ||||
|     @Resource | ||||
|     private DeptApi deptApi; | ||||
|     @Resource | ||||
|     private PostApi postApi; | ||||
|  | ||||
|     // TODO @puhui999:是不是还是叫 create 好点哈。 | ||||
|     @PostMapping("/create") | ||||
|     @Operation(summary = "创建数据权限") | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @PreAuthorize("@ss.hasPermission('crm:permission:create')") | ||||
|     @CrmPermission(bizTypeValue = "#reqVO.bizType", bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) | ||||
|     public CommonResult<Boolean> savePermission(@Valid @RequestBody CrmPermissionSaveReqVO reqVO) { | ||||
|         permissionService.createPermission(BeanUtils.toBean(reqVO, CrmPermissionCreateReqBO.class)); | ||||
|         // 处理【同时添加至】的权限 | ||||
|         if (CollUtil.isNotEmpty(reqVO.getToBizTypes())) { | ||||
|             createBizTypePermissions(reqVO); | ||||
|         } | ||||
|     public CommonResult<Boolean> create(@Valid @RequestBody CrmPermissionSaveReqVO reqVO) { | ||||
|         permissionService.createPermission(reqVO, getLoginUserId()); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     private void createBizTypePermissions(CrmPermissionSaveReqVO reqVO) { | ||||
|         List<CrmPermissionCreateReqBO> createPermissions = new ArrayList<>(); | ||||
|         // TODO @puhui999:需要考虑,被添加人,是不是应该有对应的权限了; | ||||
|         if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_CONTACT.getType())) { | ||||
|             List<CrmContactDO> contactList = contactService.getContactListByCustomerIdOwnerUserId(reqVO.getBizId(), getLoginUserId()); | ||||
|             contactList.forEach(item -> { | ||||
|                 createPermissions.add(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CONTACT.getType()) | ||||
|                         .setBizId(item.getId()).setUserId(reqVO.getUserId()).setLevel(reqVO.getLevel())); | ||||
|             }); | ||||
|         } | ||||
|         if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_BUSINESS.getType())) { | ||||
|             List<CrmBusinessDO> businessList = businessService.getBusinessListByCustomerIdOwnerUserId(reqVO.getBizId(), getLoginUserId()); | ||||
|             businessList.forEach(item -> { | ||||
|                 createPermissions.add(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()) | ||||
|                         .setBizId(item.getId()).setUserId(reqVO.getUserId()).setLevel(reqVO.getLevel())); | ||||
|             }); | ||||
|         } | ||||
|         if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_CONTRACT.getType())) { | ||||
|             List<CrmContractDO> contractList = contractService.getContractListByCustomerIdOwnerUserId(reqVO.getBizId(), getLoginUserId()); | ||||
|             contractList.forEach(item -> { | ||||
|                 createPermissions.add(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()) | ||||
|                         .setBizId(item.getId()).setUserId(reqVO.getUserId()).setLevel(reqVO.getLevel())); | ||||
|             }); | ||||
|         } | ||||
|         if (CollUtil.isEmpty(createPermissions)) { | ||||
|             return; | ||||
|         } | ||||
|         permissionService.createPermissionBatch(createPermissions); | ||||
|     } | ||||
|  | ||||
|     @PutMapping("/update") | ||||
|     @Operation(summary = "编辑数据权限") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:permission:update')") | ||||
|   | ||||
| @@ -74,10 +74,7 @@ public interface CrmContactMapper extends BaseMapperX<CrmContactDO> { | ||||
|     } | ||||
|  | ||||
|     default List<CrmContactDO> selectListByCustomerIdOwnerUserId(Long customerId, Long ownerUserId) { | ||||
|         // TODO @puhui999:父类有 selectList,查询 2 个字段的简化方法哈,可以用下 | ||||
|         return selectList(new LambdaQueryWrapperX<CrmContactDO>() | ||||
|                 .eq(CrmContactDO::getCustomerId, customerId) | ||||
|                 .eq(CrmContactDO::getOwnerUserId, ownerUserId)); | ||||
|         return selectList(CrmContactDO::getCustomerId, customerId, CrmContactDO::getOwnerUserId, ownerUserId); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -53,9 +53,11 @@ public interface CrmPermissionMapper extends BaseMapperX<CrmPermissionDO> { | ||||
|                 CrmPermissionDO::getUserId, userId); | ||||
|     } | ||||
|  | ||||
|     default CrmPermissionDO selectByBizIdAndUserId(Long bizId, Long userId) { | ||||
|         return selectOne(CrmPermissionDO::getBizId, bizId, | ||||
|                 CrmPermissionDO::getUserId, userId); | ||||
|     default CrmPermissionDO selectByBizAndUserId(Integer bizType, Long bizId, Long userId) { | ||||
|         return selectOne(new LambdaQueryWrapperX<CrmPermissionDO>() | ||||
|                 .eq(CrmPermissionDO::getBizType, bizType) | ||||
|                 .eq(CrmPermissionDO::getBizId, bizId) | ||||
|                 .eq(CrmPermissionDO::getUserId, userId)); | ||||
|     } | ||||
|  | ||||
|     default int deletePermission(Integer bizType, Long bizId) { | ||||
|   | ||||
| @@ -8,9 +8,7 @@ import org.springframework.stereotype.Service; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * Excel 所属地区列下拉数据源获取接口实现类 | ||||
|  * | ||||
|  * // TODO @puhui999:类名叫:地区下拉框数据源的 {@link ExcelColumnSelectFunction} 实现类,这样看起来会更简洁一点哈 | ||||
|  * 地区下拉框数据源的 {@link ExcelColumnSelectFunction} 实现类 | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
|   | ||||
| @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.crm.service.business; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.collection.ListUtil; | ||||
| import cn.hutool.extra.spring.SpringUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| @@ -24,7 +23,6 @@ import cn.iocoder.yudao.module.crm.service.contact.CrmContactBusinessService; | ||||
| import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; | ||||
| import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerServiceImpl; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; | ||||
| @@ -90,7 +88,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { | ||||
|             success = CRM_BUSINESS_CREATE_SUCCESS) | ||||
|     public Long createBusiness(CrmBusinessSaveReqVO createReqVO, Long userId) { | ||||
|         // 1.1 校验产品项的有效性 | ||||
|         List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(createReqVO.getProducts()); | ||||
|         List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(createReqVO.getBusinessProducts()); | ||||
|         // 1.2 校验关联字段 | ||||
|         validateRelationDataExists(createReqVO); | ||||
|  | ||||
| @@ -131,7 +129,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { | ||||
|         // 1.1 校验存在 | ||||
|         CrmBusinessDO oldBusiness = validateBusinessExists(updateReqVO.getId()); | ||||
|         // 1.2 校验产品项的有效性 | ||||
|         List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(updateReqVO.getProducts()); | ||||
|         List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(updateReqVO.getBusinessProducts()); | ||||
|         // 1.3 校验关联字段 | ||||
|         validateRelationDataExists(updateReqVO); | ||||
|  | ||||
| @@ -204,9 +202,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private List<CrmBusinessProductDO> validateBusinessProducts(List<CrmBusinessSaveReqVO.Product> list) { | ||||
|     private List<CrmBusinessProductDO> validateBusinessProducts(List<CrmBusinessSaveReqVO.BusinessProduct> list) { | ||||
|         // 1. 校验产品存在 | ||||
|         productService.validProductList(convertSet(list, CrmBusinessSaveReqVO.Product::getProductId)); | ||||
|         productService.validProductList(convertSet(list, CrmBusinessSaveReqVO.BusinessProduct::getProductId)); | ||||
|         // 2. 转化为 CrmBusinessProductDO 列表 | ||||
|         return convertList(list, o -> BeanUtils.toBean(o, CrmBusinessProductDO.class, | ||||
|                 item -> item.setTotalPrice(MoneyUtils.priceMultiply(item.getBusinessPrice(), item.getCount())))); | ||||
| @@ -294,18 +292,18 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @LogRecord(type = CRM_BUSINESS_TYPE, subType = CRM_BUSINESS_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.bizId}}", | ||||
|     @LogRecord(type = CRM_BUSINESS_TYPE, subType = CRM_BUSINESS_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}", | ||||
|             success = CRM_BUSINESS_TRANSFER_SUCCESS) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER) | ||||
|     public void transferBusiness(CrmBusinessTransferReqVO reqVO, Long userId) { | ||||
|         // 1 校验商机是否存在 | ||||
|         CrmBusinessDO business = validateBusinessExists(reqVO.getBizId()); | ||||
|         CrmBusinessDO business = validateBusinessExists(reqVO.getId()); | ||||
|  | ||||
|         // 2.1 数据权限转移 | ||||
|         permissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_BUSINESS.getType(), | ||||
|                 reqVO.getBizId(), reqVO.getNewOwnerUserId(), CrmPermissionLevelEnum.OWNER.getLevel())); | ||||
|                 reqVO.getId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); | ||||
|         // 2.2 设置新的负责人 | ||||
|         businessMapper.updateOwnerUserIdById(reqVO.getBizId(), reqVO.getNewOwnerUserId()); | ||||
|         businessMapper.updateOwnerUserIdById(reqVO.getId(), reqVO.getNewOwnerUserId()); | ||||
|  | ||||
|         // 记录操作日志上下文 | ||||
|         LogRecordContext.putVariable("business", business); | ||||
|   | ||||
| @@ -159,18 +159,18 @@ public class CrmClueServiceImpl implements CrmClueService { | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @LogRecord(type = CRM_CLUE_TYPE, subType = CRM_CLUE_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.bizId}}", | ||||
|     @LogRecord(type = CRM_CLUE_TYPE, subType = CRM_CLUE_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}", | ||||
|             success = CRM_CLUE_TRANSFER_SUCCESS) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_CLUE, bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_CLUE, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER) | ||||
|     public void transferClue(CrmClueTransferReqVO reqVO, Long userId) { | ||||
|         // 1 校验线索是否存在 | ||||
|         CrmClueDO clue = validateClueExists(reqVO.getBizId()); | ||||
|         CrmClueDO clue = validateClueExists(reqVO.getId()); | ||||
|  | ||||
|         // 2.1 数据权限转移 | ||||
|         crmPermissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CLUE.getType(), | ||||
|                         reqVO.getBizId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); | ||||
|                         reqVO.getId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); | ||||
|         // 2.2 设置新的负责人 | ||||
|         clueMapper.updateById(new CrmClueDO().setId(reqVO.getBizId()).setOwnerUserId(reqVO.getNewOwnerUserId())); | ||||
|         clueMapper.updateById(new CrmClueDO().setId(reqVO.getId()).setOwnerUserId(reqVO.getNewOwnerUserId())); | ||||
|  | ||||
|         // 3. 记录转移日志 | ||||
|         LogRecordContext.putVariable("clue", clue); | ||||
|   | ||||
| @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.crm.service.contact; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.collection.ListUtil; | ||||
| import cn.hutool.extra.spring.SpringUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessReqVO; | ||||
| @@ -18,7 +17,6 @@ import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPerm | ||||
| import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; | ||||
| import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerServiceImpl; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; | ||||
| @@ -179,18 +177,18 @@ public class CrmContactServiceImpl implements CrmContactService { | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @LogRecord(type = CRM_CONTACT_TYPE, subType = CRM_CONTACT_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.bizId}}", | ||||
|     @LogRecord(type = CRM_CONTACT_TYPE, subType = CRM_CONTACT_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}", | ||||
|             success = CRM_CONTACT_TRANSFER_SUCCESS) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACT, bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACT, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER) | ||||
|     public void transferContact(CrmContactTransferReqVO reqVO, Long userId) { | ||||
|         // 1 校验联系人是否存在 | ||||
|         CrmContactDO contact = validateContactExists(reqVO.getBizId()); | ||||
|         CrmContactDO contact = validateContactExists(reqVO.getId()); | ||||
|  | ||||
|         // 2.1 数据权限转移 | ||||
|         permissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CONTACT.getType(), | ||||
|                 reqVO.getBizId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); | ||||
|                 reqVO.getId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); | ||||
|         // 2.2 设置新的负责人 | ||||
|         contactMapper.updateById(new CrmContactDO().setId(reqVO.getBizId()).setOwnerUserId(reqVO.getNewOwnerUserId())); | ||||
|         contactMapper.updateById(new CrmContactDO().setId(reqVO.getId()).setOwnerUserId(reqVO.getNewOwnerUserId())); | ||||
|  | ||||
|         // 3. 记录转移日志 | ||||
|         LogRecordContext.putVariable("contact", contact); | ||||
|   | ||||
| @@ -252,18 +252,18 @@ public class CrmContractServiceImpl implements CrmContractService { | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @LogRecord(type = CRM_CONTRACT_TYPE, subType = CRM_CONTRACT_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.bizId}}", | ||||
|     @LogRecord(type = CRM_CONTRACT_TYPE, subType = CRM_CONTRACT_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}", | ||||
|             success = CRM_CONTRACT_TRANSFER_SUCCESS) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER) | ||||
|     public void transferContract(CrmContractTransferReqVO reqVO, Long userId) { | ||||
|         // 1. 校验合同是否存在 | ||||
|         CrmContractDO contract = validateContractExists(reqVO.getBizId()); | ||||
|         CrmContractDO contract = validateContractExists(reqVO.getId()); | ||||
|  | ||||
|         // 2.1 数据权限转移 | ||||
|         crmPermissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CONTRACT.getType(), | ||||
|                 reqVO.getBizId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); | ||||
|                 reqVO.getId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); | ||||
|         // 2.2 设置负责人 | ||||
|         contractMapper.updateById(new CrmContractDO().setId(reqVO.getBizId()).setOwnerUserId(reqVO.getNewOwnerUserId())); | ||||
|         contractMapper.updateById(new CrmContractDO().setId(reqVO.getId()).setOwnerUserId(reqVO.getNewOwnerUserId())); | ||||
|  | ||||
|         // 3. 记录转移日志 | ||||
|         LogRecordContext.putVariable("contract", contract); | ||||
|   | ||||
| @@ -199,19 +199,19 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.bizId}}", | ||||
|     @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_TRANSFER_SUB_TYPE, bizNo = "{{#reqVO.id}}", | ||||
|             success = CRM_CUSTOMER_TRANSFER_SUCCESS) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER) | ||||
|     public void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId) { | ||||
|         // 1.1 校验客户是否存在 | ||||
|         CrmCustomerDO customer = validateCustomerExists(reqVO.getBizId()); | ||||
|         CrmCustomerDO customer = validateCustomerExists(reqVO.getId()); | ||||
|         // 1.2 校验拥有客户是否到达上限 | ||||
|         validateCustomerExceedOwnerLimit(reqVO.getNewOwnerUserId(), 1); | ||||
|         // 2.1 数据权限转移 | ||||
|         permissionService.transferPermission(new CrmPermissionTransferReqBO(userId, CrmBizTypeEnum.CRM_CUSTOMER.getType(), | ||||
|                 reqVO.getBizId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); | ||||
|                 reqVO.getId(), reqVO.getNewOwnerUserId(), reqVO.getOldOwnerPermissionLevel())); | ||||
|         // 2.2 转移后重新设置负责人 | ||||
|         customerMapper.updateById(new CrmCustomerDO().setId(reqVO.getBizId()) | ||||
|         customerMapper.updateById(new CrmCustomerDO().setId(reqVO.getId()) | ||||
|                 .setOwnerUserId(reqVO.getNewOwnerUserId()).setOwnerTime(LocalDateTime.now())); | ||||
|  | ||||
|         // 2.3 同时转移 | ||||
| @@ -231,21 +231,21 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||||
|      */ | ||||
|     private void transfer(CrmCustomerTransferReqVO reqVO, Long userId) { | ||||
|         if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_CONTACT.getType())) { | ||||
|             List<CrmContactDO> contactList = contactService.getContactListByCustomerIdOwnerUserId(reqVO.getBizId(), userId); | ||||
|             List<CrmContactDO> contactList = contactService.getContactListByCustomerIdOwnerUserId(reqVO.getId(), userId); | ||||
|             contactList.forEach(item -> { | ||||
|                 contactService.transferContact(new CrmContactTransferReqVO(item.getId(), reqVO.getNewOwnerUserId(), | ||||
|                         reqVO.getOldOwnerPermissionLevel()), userId); | ||||
|             }); | ||||
|         } | ||||
|         if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_BUSINESS.getType())) { | ||||
|             List<CrmBusinessDO> businessList = businessService.getBusinessListByCustomerIdOwnerUserId(reqVO.getBizId(), userId); | ||||
|             List<CrmBusinessDO> businessList = businessService.getBusinessListByCustomerIdOwnerUserId(reqVO.getId(), userId); | ||||
|             businessList.forEach(item -> { | ||||
|                 businessService.transferBusiness(new CrmBusinessTransferReqVO(item.getId(), reqVO.getNewOwnerUserId(), | ||||
|                         reqVO.getOldOwnerPermissionLevel()), userId); | ||||
|             }); | ||||
|         } | ||||
|         if (reqVO.getToBizTypes().contains(CrmBizTypeEnum.CRM_CONTRACT.getType())) { | ||||
|             List<CrmContractDO> contractList = contractService.getContractListByCustomerIdOwnerUserId(reqVO.getBizId(), userId); | ||||
|             List<CrmContractDO> contractList = contractService.getContractListByCustomerIdOwnerUserId(reqVO.getId(), userId); | ||||
|             contractList.forEach(item -> { | ||||
|                 contractService.transferContract(new CrmContractTransferReqVO(item.getId(), reqVO.getNewOwnerUserId(), | ||||
|                         reqVO.getOldOwnerPermissionLevel()), userId); | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.permission; | ||||
|  | ||||
|  | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; | ||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||||
| @@ -19,6 +20,14 @@ import java.util.List; | ||||
|  */ | ||||
| public interface CrmPermissionService { | ||||
|  | ||||
|     /** | ||||
|      * 创建数据权限 | ||||
|      * | ||||
|      * @param reqVO  创建信息 | ||||
|      * @param userId 用户编号 | ||||
|      */ | ||||
|     void createPermission(CrmPermissionSaveReqVO reqVO, Long userId); | ||||
|  | ||||
|     /** | ||||
|      * 创建数据权限 | ||||
|      * | ||||
| @@ -111,10 +120,10 @@ public interface CrmPermissionService { | ||||
|     /** | ||||
|      * 校验是否有指定数据的操作权限 | ||||
|      * | ||||
|      * @param bizType   数据类型,关联 {@link CrmBizTypeEnum} | ||||
|      * @param bizId     数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId() | ||||
|      * @param userId    用户编号 | ||||
|      * @param level 权限级别 | ||||
|      * @param bizType 数据类型,关联 {@link CrmBizTypeEnum} | ||||
|      * @param bizId   数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId() | ||||
|      * @param userId  用户编号 | ||||
|      * @param level   权限级别 | ||||
|      * @return 是否有权限 | ||||
|      */ | ||||
|     boolean hasPermission(Integer bizType, Long bizId, Long userId, CrmPermissionLevelEnum level); | ||||
|   | ||||
| @@ -4,28 +4,34 @@ import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.util.ObjUtil; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper; | ||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||||
| import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; | ||||
| import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission; | ||||
| import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; | ||||
| import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; | ||||
| import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; | ||||
| import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils; | ||||
| import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||||
| import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.springframework.transaction.annotation.Transactional; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
| import java.util.*; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch; | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; | ||||
| import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; | ||||
| import static cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum.isOwner; | ||||
|  | ||||
| @@ -40,13 +46,124 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { | ||||
|  | ||||
|     @Resource | ||||
|     private CrmPermissionMapper permissionMapper; | ||||
|  | ||||
|     @Resource | ||||
|     @Lazy // 解决依赖循环 | ||||
|     private CrmContactService contactService; | ||||
|     @Resource | ||||
|     @Lazy // 解决依赖循环 | ||||
|     private CrmBusinessService businessService; | ||||
|     @Resource | ||||
|     @Lazy // 解决依赖循环 | ||||
|     private CrmContractService contractService; | ||||
|     @Resource | ||||
|     private AdminUserApi adminUserApi; | ||||
|  | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @CrmPermission(bizTypeValue = "#reqVO.bizType", bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) | ||||
|     public void createPermission(CrmPermissionSaveReqVO reqVO, Long userId) { | ||||
|         // 创建数据权限 | ||||
|         createPermission0(BeanUtils.toBean(reqVO, CrmPermissionCreateReqBO.class)); | ||||
|  | ||||
|         // 处理【同时添加至】的权限 | ||||
|         if (CollUtil.isEmpty(reqVO.getToBizTypes())) { | ||||
|             return; | ||||
|         } | ||||
|         List<CrmPermissionCreateReqBO> createPermissions = new ArrayList<>(); | ||||
|         createContactPermissions(reqVO, userId, createPermissions); | ||||
|         createBusinessPermissions(reqVO, userId, createPermissions); | ||||
|         createContractPermissions(reqVO, userId, createPermissions); | ||||
|         if (CollUtil.isEmpty(createPermissions)) { | ||||
|             return; | ||||
|         } | ||||
|         createPermissionBatch(createPermissions); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 处理同时添加至联系人 | ||||
|      * | ||||
|      * @param reqVO             请求 | ||||
|      * @param userId            操作人 | ||||
|      * @param createPermissions 待添加权限列表 | ||||
|      */ | ||||
|     private void createContactPermissions(CrmPermissionSaveReqVO reqVO, Long userId, List<CrmPermissionCreateReqBO> createPermissions) { | ||||
|         // 1. 校验是否被同时添加 | ||||
|         Integer type = CrmBizTypeEnum.CRM_CONTACT.getType(); | ||||
|         if (!reqVO.getToBizTypes().contains(type)) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // 2.1 添加数据权限 | ||||
|         List<CrmContactDO> contactList = contactService.getContactListByCustomerIdOwnerUserId(reqVO.getBizId(), userId); | ||||
|         contactList.forEach(item -> { | ||||
|             createBizTypePermissions(reqVO, type, item.getId(), item.getName(), createPermissions); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 处理同时添加至商机 | ||||
|      * | ||||
|      * @param reqVO             请求 | ||||
|      * @param userId            操作人 | ||||
|      * @param createPermissions 待添加权限列表 | ||||
|      */ | ||||
|     private void createBusinessPermissions(CrmPermissionSaveReqVO reqVO, Long userId, List<CrmPermissionCreateReqBO> createPermissions) { | ||||
|         // 1. 校验是否被同时添加 | ||||
|         Integer type = CrmBizTypeEnum.CRM_BUSINESS.getType(); | ||||
|         if (!reqVO.getToBizTypes().contains(type)) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // 2.1 添加数据权限 | ||||
|         List<CrmBusinessDO> businessList = businessService.getBusinessListByCustomerIdOwnerUserId(reqVO.getBizId(), userId); | ||||
|         businessList.forEach(item -> { | ||||
|             createBizTypePermissions(reqVO, type, item.getId(), item.getName(), createPermissions); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 处理同时添加至合同 | ||||
|      * | ||||
|      * @param reqVO             请求 | ||||
|      * @param userId            操作人 | ||||
|      * @param createPermissions 待添加权限列表 | ||||
|      */ | ||||
|     private void createContractPermissions(CrmPermissionSaveReqVO reqVO, Long userId, List<CrmPermissionCreateReqBO> createPermissions) { | ||||
|         // 1. 校验是否被同时添加 | ||||
|         Integer type = CrmBizTypeEnum.CRM_CONTRACT.getType(); | ||||
|         if (!reqVO.getToBizTypes().contains(type)) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // 2.1 添加数据权限 | ||||
|         List<CrmContractDO> contractList = contractService.getContractListByCustomerIdOwnerUserId(reqVO.getBizId(), userId); | ||||
|         contractList.forEach(item -> { | ||||
|             createBizTypePermissions(reqVO, type, item.getId(), item.getName(), createPermissions); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     private void createBizTypePermissions(CrmPermissionSaveReqVO reqVO, Integer type, Long bizId, String name, | ||||
|                                           List<CrmPermissionCreateReqBO> createPermissions) { | ||||
|         AdminUserRespDTO user = adminUserApi.getUser(reqVO.getUserId()); | ||||
|         // 1. 需要考虑,被添加人,是不是应该有对应的权限了; | ||||
|         CrmPermissionDO permission = hasAnyPermission(type, bizId, reqVO.getUserId()); | ||||
|         if (ObjUtil.isNotNull(permission)) { | ||||
|             throw exception(CRM_PERMISSION_CREATE_FAIL_EXISTS, user.getNickname(), CrmBizTypeEnum.getNameByType(type), | ||||
|                     name, CrmPermissionLevelEnum.getNameByLevel(permission.getLevel())); | ||||
|         } | ||||
|         // 2. 添加数据权限 | ||||
|         createPermissions.add(new CrmPermissionCreateReqBO().setBizType(type) | ||||
|                 .setBizId(bizId).setUserId(reqVO.getUserId()).setLevel(reqVO.getLevel())); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     public Long createPermission(CrmPermissionCreateReqBO createReqBO) { | ||||
|         return createPermission0(createReqBO); | ||||
|     } | ||||
|  | ||||
|     private Long createPermission0(CrmPermissionCreateReqBO createReqBO) { | ||||
|         validatePermissionNotExists(Collections.singletonList(createReqBO)); | ||||
|         // 1. 校验用户是否存在 | ||||
|         adminUserApi.validateUserList(Collections.singletonList(createReqBO.getUserId())); | ||||
| @@ -170,7 +287,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { | ||||
|             throw exception(CRM_PERMISSION_DELETE_FAIL); | ||||
|         } | ||||
|         // 校验操作人是否为负责人 | ||||
|         CrmPermissionDO permission = permissionMapper.selectByBizIdAndUserId(permissions.get(0).getBizId(), userId); | ||||
|         CrmPermissionDO permission = permissionMapper.selectByBizAndUserId(permissions.get(0).getBizType(), permissions.get(0).getBizId(), userId); | ||||
|         if (permission == null) { | ||||
|             throw exception(CRM_PERMISSION_DELETE_DENIED); | ||||
|         } | ||||
| @@ -220,4 +337,9 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { | ||||
|                 ObjUtil.equal(permission.getUserId(), userId) && ObjUtil.equal(permission.getLevel(), level.getLevel())); | ||||
|     } | ||||
|  | ||||
|     public CrmPermissionDO hasAnyPermission(Integer bizType, Long bizId, Long userId) { | ||||
|         List<CrmPermissionDO> permissionList = permissionMapper.selectByBizTypeAndBizId(bizType, bizId); | ||||
|         return findFirst(permissionList, permission -> ObjUtil.equal(permission.getUserId(), userId)); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 芋道源码
					芋道源码