云
昨天 a87fcc60346dfc799bd3c2cddc7acfffb105cb61
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/aop/CrmPermissionAspect.java
@@ -8,6 +8,7 @@
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;
@@ -49,6 +50,9 @@
    @Resource
    private CrmBusinessMapper businessMapper;
    @Resource
    private CrmCustomerMapper customerMapper;
    @Before("@annotation(crmPermission)")
    public void doBefore(JoinPoint joinPoint, CrmPermission crmPermission) {
        // 1.1 获取相关属性值
@@ -82,14 +86,14 @@
        // 特殊:没有数据权限的情况,针对 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;
            }
        }
@@ -132,14 +136,16 @@
        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);
@@ -151,7 +157,8 @@
                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,