| | |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; |
| | | 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; |
| | |
| | | @Resource |
| | | private CrmBusinessMapper businessMapper; |
| | | |
| | | @Resource |
| | | private CrmCustomerMapper customerMapper; |
| | | |
| | | @Before("@annotation(crmPermission)") |
| | | public void doBefore(JoinPoint joinPoint, CrmPermission crmPermission) { |
| | | // 1.1 获取相关属性值 |
| | |
| | | if (CrmPermissionUtils.isCrmAdmin()) { |
| | | return; |
| | | } |
| | | // 公海允许查看有负责人的客户;只授予读取权限,不影响写入、转移或领取权限。 |
| | | if (CrmBizTypeEnum.CRM_CUSTOMER.getType().equals(bizType) |
| | | && CrmPermissionLevelEnum.isRead(permissionLevel) && isPublicPoolVisible(bizType, bizId)) { |
| | | return; |
| | | } |
| | | // 特殊:没有数据权限的情况,针对 READ 的特殊处理 |
| | | if (CollUtil.isEmpty(bizPermissions)) { |
| | | // 1.1 公海数据,如果没有团队成员,大家也应该有 READ 权限才对 |
| | | if (CrmPermissionLevelEnum.isRead(permissionLevel)) { |
| | | if (CrmPermissionLevelEnum.isRead(permissionLevel) && isPublicPoolVisible(bizType, bizId)) { |
| | | return; |
| | | } |
| | | // 没有数据权限的情况下超出了读权限直接报错,避免后面校验空指针 |
| | | throw exception(CRM_PERMISSION_DENIED, CrmBizTypeEnum.getNameByType(bizType)); |
| | | } else { // 1.2 有数据权限但是没有负责人的情况 |
| | | if (!anyMatch(bizPermissions, item -> CrmPermissionLevelEnum.isOwner(item.getLevel())) |
| | | && CrmPermissionLevelEnum.isRead(permissionLevel)) { |
| | | && CrmPermissionLevelEnum.isRead(permissionLevel) && isPublicPoolVisible(bizType, bizId)) { |
| | | return; |
| | | } |
| | | } |
| | |
| | | throw exception(CRM_PERMISSION_DENIED, CrmBizTypeEnum.getNameByType(bizType)); |
| | | } |
| | | |
| | | /** |
| | | * 商机特殊权限校验:检查用户是否有该商机所属客户的团队权限 |
| | | * |
| | | * @param businessId 商机编号 |
| | | * @param userId 用户编号 |
| | | * @param permissionLevel 需要的权限级别 |
| | | * @return 是否有权限 |
| | | */ |
| | | /** 取消客户公海可见度后,不再授予公共读取权限。 */ |
| | | private boolean isPublicPoolVisible(Integer bizType, Long bizId) { |
| | | if (!CrmBizTypeEnum.CRM_CUSTOMER.getType().equals(bizType)) { |
| | | return true; |
| | | } |
| | | var customer = customerMapper.selectById(bizId); |
| | | return customer != null && !Boolean.FALSE.equals(customer.getAutoPoolEnabled()); |
| | | } |
| | | |
| | | /** 商机特殊权限校验:检查用户是否有该商机所属客户的团队权限。 */ |
| | | private boolean validateBusinessCustomerPermission(Long businessId, Long userId, Integer permissionLevel) { |
| | | // 获取商机的客户ID |
| | | CrmBusinessDO business = businessMapper.selectById(businessId); |
| | |
| | | CrmBizTypeEnum.CRM_CUSTOMER.getType(), Collections.singleton(business.getCustomerId())); |
| | | if (CollUtil.isEmpty(customerPermissions)) { |
| | | // 客户公海数据,READ 权限放行 |
| | | return CrmPermissionLevelEnum.isRead(permissionLevel); |
| | | return CrmPermissionLevelEnum.isRead(permissionLevel) |
| | | && isPublicPoolVisible(CrmBizTypeEnum.CRM_CUSTOMER.getType(), business.getCustomerId()); |
| | | } |
| | | // 检查用户是否有客户团队的权限 |
| | | CrmPermissionDO userCustomerPermission = CollUtil.findOne(customerPermissions, |