| | |
| | | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; |
| | | import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum; |
| | | import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; |
| | | import cn.iocoder.yudao.module.hrm.api.handover.HrmUserHandoverApi; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum; |
| | | import com.baomidou.mybatisplus.core.toolkit.support.SFunction; |
| | | import com.github.yulichang.autoconfigure.MybatisPlusJoinProperties; |
| | | import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.util.HashSet; |
| | | import java.util.LinkedHashSet; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | |
| | | * |
| | | * @author HUIHUI |
| | | */ |
| | | @Slf4j |
| | | public class CrmPermissionUtils { |
| | | |
| | | /** 超级管理员查看客户时不受公海可见度开关影响。 */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 获得"我负责的数据"对应的用户编号集合:本人 + 已将数据交接给我的离职用户 |
| | | * |
| | | * 离职交接完成后,交接人需要能看到离职人名下的数据,因此这里通过 HrmUserHandoverApi 扩展。 |
| | | * |
| | | * @param userId 当前用户编号 |
| | | * @return 用户编号集合,至少包含本人 |
| | | */ |
| | | public static Set<Long> getOwnerUserIds(Long userId) { |
| | | Set<Long> ownerUserIds = new LinkedHashSet<>(); |
| | | if (userId == null) { |
| | | return ownerUserIds; |
| | | } |
| | | ownerUserIds.add(userId); |
| | | try { |
| | | HrmUserHandoverApi handoverApi = SpringUtil.getBean(HrmUserHandoverApi.class); |
| | | Set<Long> handoverUserIds = handoverApi.expandUserIds(new HashSet<>(ownerUserIds)); |
| | | if (CollUtil.isNotEmpty(handoverUserIds)) { |
| | | ownerUserIds.addAll(handoverUserIds); |
| | | } |
| | | } catch (Exception ex) { |
| | | // HRM 模块未部署时降级为只看本人数据,不影响 CRM 正常使用 |
| | | log.warn("[getOwnerUserIds][扩展交接用户失败,userIds({}) 仅按本人数据查询]", userId, ex); |
| | | } |
| | | return ownerUserIds; |
| | | } |
| | | |
| | | /** |
| | | * 追加"我负责的数据"的过滤条件,支持离职交接后的数据可见性扩展 |
| | | */ |
| | | private static <T extends MPJLambdaWrapper<?>> void appendOwnerUserCondition(T query, String ownerUserIdField, Long userId) { |
| | | Set<Long> ownerUserIds = getOwnerUserIds(userId); |
| | | if (ownerUserIds.size() <= 1) { |
| | | query.eq(ownerUserIdField, userId); |
| | | } else { |
| | | query.in(ownerUserIdField, ownerUserIds); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 构造 CRM 数据类型数据【分页】查询条件 |
| | | * |
| | | * @param query 连表查询对象 |
| | |
| | | Long userId, Integer sceneType) { |
| | | MybatisPlusJoinProperties mybatisPlusJoinProperties = SpringUtil.getBean(MybatisPlusJoinProperties.class); |
| | | final String ownerUserIdField = mybatisPlusJoinProperties.getTableAlias() + ".owner_user_id"; |
| | | // 场景一:我负责的数据 |
| | | // 场景一:我负责的数据(含离职交接给我的数据) |
| | | if (CrmSceneTypeEnum.isOwner(sceneType)) { |
| | | query.eq(ownerUserIdField, userId); |
| | | appendOwnerUserCondition(query, ownerUserIdField, userId); |
| | | } |
| | | // 场景二:我参与的数据(我有读或写权限,并且不是负责人) |
| | | if (CrmSceneTypeEnum.isInvolved(sceneType)) { |
| | |
| | | if (isCrmAdmin() || hasCustomerViewAllPermission()) { |
| | | return; // 跳过过滤,查看全部 |
| | | } |
| | | // 无权限则降级为"我负责的" |
| | | query.eq(ownerUserIdField, userId); |
| | | // 无权限则降级为"我负责的"(含离职交接给我的数据) |
| | | appendOwnerUserCondition(query, ownerUserIdField, userId); |
| | | } |
| | | } |
| | | |