【同步】BOOT 和 CLOUD 的功能(CRM 数据权限)
parent
5858aac8c3
commit
a4ff54c148
|
@ -383,6 +383,12 @@ public class GlobalExceptionHandler {
|
||||||
return CommonResult.error(NOT_IMPLEMENTED.getCode(),
|
return CommonResult.error(NOT_IMPLEMENTED.getCode(),
|
||||||
"[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]");
|
"[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]");
|
||||||
}
|
}
|
||||||
|
// 9. IOT 物联网
|
||||||
|
if (message.contains("iot_")) {
|
||||||
|
log.error("[IOT 物联网 yudao-module-iot - 表结构未导入][参考 https://doc.iocoder.cn/iot/build/ 开启]");
|
||||||
|
return CommonResult.error(NOT_IMPLEMENTED.getCode(),
|
||||||
|
"[IOT 物联网 yudao-module-iot - 表结构未导入][参考 https://doc.iocoder.cn/iot/build/ 开启]");
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,8 @@ public class BannerApplicationRunner implements ApplicationRunner {
|
||||||
System.out.println("[支付系统 yudao-module-pay - 教程][参考 https://doc.iocoder.cn/pay/build/ 开启]");
|
System.out.println("[支付系统 yudao-module-pay - 教程][参考 https://doc.iocoder.cn/pay/build/ 开启]");
|
||||||
// AI 大模型
|
// AI 大模型
|
||||||
System.out.println("[AI 大模型 yudao-module-ai - 教程][参考 https://cloud.iocoder.cn/ai/build/ 开启]");
|
System.out.println("[AI 大模型 yudao-module-ai - 教程][参考 https://cloud.iocoder.cn/ai/build/ 开启]");
|
||||||
|
// IOT 物联网
|
||||||
|
System.out.println("[IOT 物联网 yudao-module-iot - 教程][参考 https://doc.iocoder.cn/iot/build/ 开启]");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,9 +30,6 @@ public class CrmCluePageReqVO extends PageParam {
|
||||||
@InEnum(CrmSceneTypeEnum.class)
|
@InEnum(CrmSceneTypeEnum.class)
|
||||||
private Integer sceneType; // 场景类型,为 null 时则表示全部
|
private Integer sceneType; // 场景类型,为 null 时则表示全部
|
||||||
|
|
||||||
@Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
|
|
||||||
private Boolean pool; // null 则表示为不是公海数据
|
|
||||||
|
|
||||||
@Schema(description = "所属行业", example = "1")
|
@Schema(description = "所属行业", example = "1")
|
||||||
private Integer industryId;
|
private Integer industryId;
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ public interface CrmBusinessMapper extends BaseMapperX<CrmBusinessDO> {
|
||||||
MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 拼接数据权限的查询条件
|
// 拼接数据权限的查询条件
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(),
|
||||||
CrmBusinessDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
|
CrmBusinessDO::getId, userId, pageReqVO.getSceneType());
|
||||||
// 拼接自身的查询条件
|
// 拼接自身的查询条件
|
||||||
query.selectAll(CrmBusinessDO.class)
|
query.selectAll(CrmBusinessDO.class)
|
||||||
.likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName())
|
.likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName())
|
||||||
|
|
|
@ -10,9 +10,6 @@ import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
|
||||||
import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
|
import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 线索 Mapper
|
* 线索 Mapper
|
||||||
*
|
*
|
||||||
|
@ -25,7 +22,7 @@ public interface CrmClueMapper extends BaseMapperX<CrmClueDO> {
|
||||||
MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 拼接数据权限的查询条件
|
// 拼接数据权限的查询条件
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(),
|
||||||
CrmClueDO::getId, userId, pageReqVO.getSceneType(), pageReqVO.getPool());
|
CrmClueDO::getId, userId, pageReqVO.getSceneType());
|
||||||
// 拼接自身的查询条件
|
// 拼接自身的查询条件
|
||||||
query.selectAll(CrmClueDO.class)
|
query.selectAll(CrmClueDO.class)
|
||||||
.likeIfPresent(CrmClueDO::getName, pageReqVO.getName())
|
.likeIfPresent(CrmClueDO::getName, pageReqVO.getName())
|
||||||
|
@ -40,20 +37,11 @@ public interface CrmClueMapper extends BaseMapperX<CrmClueDO> {
|
||||||
return selectJoinPage(pageReqVO, CrmClueDO.class, query);
|
return selectJoinPage(pageReqVO, CrmClueDO.class, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
default List<CrmClueDO> selectBatchIds(Collection<Long> ids, Long userId) {
|
|
||||||
MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
|
|
||||||
// 拼接数据权限的查询条件
|
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(), ids, userId);
|
|
||||||
query.selectAll(CrmClueDO.class).in(CrmClueDO::getId, ids).orderByDesc(CrmClueDO::getId);
|
|
||||||
// 拼接自身的查询条件
|
|
||||||
return selectJoinList(CrmClueDO.class, query);
|
|
||||||
}
|
|
||||||
|
|
||||||
default Long selectCountByFollow(Long userId) {
|
default Long selectCountByFollow(Long userId) {
|
||||||
MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 我负责的 + 非公海
|
// 我负责的 + 非公海
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(),
|
||||||
CrmClueDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
|
CrmClueDO::getId, userId, CrmSceneTypeEnum.OWNER.getType());
|
||||||
// 未跟进 + 未转化
|
// 未跟进 + 未转化
|
||||||
query.eq(CrmClueDO::getFollowUpStatus, false)
|
query.eq(CrmClueDO::getFollowUpStatus, false)
|
||||||
.eq(CrmClueDO::getTransformStatus, false);
|
.eq(CrmClueDO::getTransformStatus, false);
|
||||||
|
|
|
@ -56,7 +56,7 @@ public interface CrmContactMapper extends BaseMapperX<CrmContactDO> {
|
||||||
MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 拼接数据权限的查询条件
|
// 拼接数据权限的查询条件
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(),
|
||||||
CrmContactDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
|
CrmContactDO::getId, userId, pageReqVO.getSceneType());
|
||||||
// 拼接自身的查询条件
|
// 拼接自身的查询条件
|
||||||
query.selectAll(CrmContactDO.class)
|
query.selectAll(CrmContactDO.class)
|
||||||
.likeIfPresent(CrmContactDO::getName, pageReqVO.getName())
|
.likeIfPresent(CrmContactDO::getName, pageReqVO.getName())
|
||||||
|
|
|
@ -15,7 +15,6 @@ import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -54,7 +53,7 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
|
||||||
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 拼接数据权限的查询条件
|
// 拼接数据权限的查询条件
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
|
||||||
CrmContractDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
|
CrmContractDO::getId, userId, pageReqVO.getSceneType());
|
||||||
// 拼接自身的查询条件
|
// 拼接自身的查询条件
|
||||||
query.selectAll(CrmContractDO.class)
|
query.selectAll(CrmContractDO.class)
|
||||||
.likeIfPresent(CrmContractDO::getNo, pageReqVO.getNo())
|
.likeIfPresent(CrmContractDO::getNo, pageReqVO.getNo())
|
||||||
|
@ -77,15 +76,6 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
|
||||||
return selectJoinPage(pageReqVO, CrmContractDO.class, query);
|
return selectJoinPage(pageReqVO, CrmContractDO.class, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
default List<CrmContractDO> selectBatchIds(Collection<Long> ids, Long userId) {
|
|
||||||
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
|
|
||||||
// 构建数据权限连表条件
|
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), ids, userId);
|
|
||||||
// 拼接自身的查询条件
|
|
||||||
query.selectAll(CrmContractDO.class).in(CrmContractDO::getId, ids).orderByDesc(CrmContractDO::getId);
|
|
||||||
return selectJoinList(CrmContractDO.class, query);
|
|
||||||
}
|
|
||||||
|
|
||||||
default Long selectCountByContactId(Long contactId) {
|
default Long selectCountByContactId(Long contactId) {
|
||||||
return selectCount(CrmContractDO::getSignContactId, contactId);
|
return selectCount(CrmContractDO::getSignContactId, contactId);
|
||||||
}
|
}
|
||||||
|
@ -98,7 +88,7 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
|
||||||
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 我负责的 + 非公海
|
// 我负责的 + 非公海
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
|
||||||
CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
|
CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType());
|
||||||
// 未审核
|
// 未审核
|
||||||
query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus());
|
query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus());
|
||||||
return selectCount(query);
|
return selectCount(query);
|
||||||
|
@ -108,7 +98,7 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
|
||||||
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 我负责的 + 非公海
|
// 我负责的 + 非公海
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
|
||||||
CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
|
CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType());
|
||||||
// 即将到期
|
// 即将到期
|
||||||
LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
|
LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
|
||||||
LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
|
LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
|
||||||
|
|
|
@ -20,7 +20,6 @@ import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -52,8 +51,12 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
|
||||||
default PageResult<CrmCustomerDO> selectPage(CrmCustomerPageReqVO pageReqVO, Long ownerUserId) {
|
default PageResult<CrmCustomerDO> selectPage(CrmCustomerPageReqVO pageReqVO, Long ownerUserId) {
|
||||||
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 拼接数据权限的查询条件
|
// 拼接数据权限的查询条件
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
|
if (Boolean.TRUE.equals(pageReqVO.getPool())) {
|
||||||
CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType(), pageReqVO.getPool());
|
query.isNull(CrmCustomerDO::getOwnerUserId);
|
||||||
|
} else {
|
||||||
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
|
||||||
|
CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType());
|
||||||
|
}
|
||||||
// 拼接自身的查询条件
|
// 拼接自身的查询条件
|
||||||
query.selectAll(CrmCustomerDO.class)
|
query.selectAll(CrmCustomerDO.class)
|
||||||
.likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName())
|
.likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName())
|
||||||
|
@ -81,15 +84,6 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
|
||||||
return selectJoinPage(pageReqVO, CrmCustomerDO.class, query);
|
return selectJoinPage(pageReqVO, CrmCustomerDO.class, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
default List<CrmCustomerDO> selectBatchIds(Collection<Long> ids, Long ownerUserId) {
|
|
||||||
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
|
|
||||||
// 拼接数据权限的查询条件
|
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, ownerUserId);
|
|
||||||
// 拼接自身的查询条件
|
|
||||||
query.selectAll(CrmCustomerDO.class).in(CrmCustomerDO::getId, ids).orderByDesc(CrmCustomerDO::getId);
|
|
||||||
return selectJoinList(CrmCustomerDO.class, query);
|
|
||||||
}
|
|
||||||
|
|
||||||
default CrmCustomerDO selectByCustomerName(String name) {
|
default CrmCustomerDO selectByCustomerName(String name) {
|
||||||
return selectOne(CrmCustomerDO::getName, name);
|
return selectOne(CrmCustomerDO::getName, name);
|
||||||
}
|
}
|
||||||
|
@ -102,9 +96,9 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
|
||||||
}
|
}
|
||||||
|
|
||||||
default Long selectPutPoolRemindCustomerCount(CrmCustomerPageReqVO pageReqVO,
|
default Long selectPutPoolRemindCustomerCount(CrmCustomerPageReqVO pageReqVO,
|
||||||
CrmCustomerPoolConfigDO poolConfigDO,
|
CrmCustomerPoolConfigDO poolConfig,
|
||||||
Long userId) {
|
Long userId) {
|
||||||
final MPJLambdaWrapperX<CrmCustomerDO> query = buildPutPoolRemindCustomerQuery(pageReqVO, poolConfigDO, userId);
|
final MPJLambdaWrapperX<CrmCustomerDO> query = buildPutPoolRemindCustomerQuery(pageReqVO, poolConfig, userId);
|
||||||
return selectCount(query);
|
return selectCount(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +108,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
|
||||||
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 拼接数据权限的查询条件
|
// 拼接数据权限的查询条件
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
|
||||||
CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType(), null);
|
CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType());
|
||||||
|
|
||||||
// 未锁定 + 未成交
|
// 未锁定 + 未成交
|
||||||
query.eq(CrmCustomerDO::getLockStatus, false).eq(CrmCustomerDO::getDealStatus, false);
|
query.eq(CrmCustomerDO::getLockStatus, false).eq(CrmCustomerDO::getDealStatus, false);
|
||||||
|
@ -168,7 +162,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
|
||||||
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 我负责的 + 非公海
|
// 我负责的 + 非公海
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
|
||||||
CrmCustomerDO::getId, ownerUserId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
|
CrmCustomerDO::getId, ownerUserId, CrmSceneTypeEnum.OWNER.getType());
|
||||||
// 今天需联系
|
// 今天需联系
|
||||||
LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
|
LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
|
||||||
LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
|
LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
|
||||||
|
@ -180,7 +174,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
|
||||||
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 我负责的 + 非公海
|
// 我负责的 + 非公海
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
|
||||||
CrmCustomerDO::getId, ownerUserId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
|
CrmCustomerDO::getId, ownerUserId, CrmSceneTypeEnum.OWNER.getType());
|
||||||
// 未跟进
|
// 未跟进
|
||||||
query.eq(CrmClueDO::getFollowUpStatus, false);
|
query.eq(CrmClueDO::getFollowUpStatus, false);
|
||||||
return selectCount(query);
|
return selectCount(query);
|
||||||
|
|
|
@ -48,7 +48,7 @@ public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> {
|
||||||
MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 拼接数据权限的查询条件
|
// 拼接数据权限的查询条件
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(),
|
||||||
CrmReceivableDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
|
CrmReceivableDO::getId, userId, pageReqVO.getSceneType());
|
||||||
// 拼接自身的查询条件
|
// 拼接自身的查询条件
|
||||||
query.selectAll(CrmReceivableDO.class)
|
query.selectAll(CrmReceivableDO.class)
|
||||||
.eqIfPresent(CrmReceivableDO::getNo, pageReqVO.getNo())
|
.eqIfPresent(CrmReceivableDO::getNo, pageReqVO.getNo())
|
||||||
|
@ -59,20 +59,11 @@ public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> {
|
||||||
return selectJoinPage(pageReqVO, CrmReceivableDO.class, query);
|
return selectJoinPage(pageReqVO, CrmReceivableDO.class, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
default List<CrmReceivableDO> selectBatchIds(Collection<Long> ids, Long userId) {
|
|
||||||
MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
|
|
||||||
// 拼接数据权限的查询条件
|
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(), ids, userId);
|
|
||||||
// 拼接自身的查询条件
|
|
||||||
query.selectAll(CrmReceivableDO.class).in(CrmReceivableDO::getId, ids).orderByDesc(CrmReceivableDO::getId);
|
|
||||||
return selectJoinList(CrmReceivableDO.class, query);
|
|
||||||
}
|
|
||||||
|
|
||||||
default Long selectCountByAudit(Long userId) {
|
default Long selectCountByAudit(Long userId) {
|
||||||
MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 我负责的 + 非公海
|
// 我负责的 + 非公海
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(),
|
||||||
CrmReceivableDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
|
CrmReceivableDO::getId, userId, CrmSceneTypeEnum.OWNER.getType());
|
||||||
// 未审核
|
// 未审核
|
||||||
query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus());
|
query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus());
|
||||||
return selectCount(query);
|
return selectCount(query);
|
||||||
|
|
|
@ -13,8 +13,6 @@ import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,7 +46,7 @@ public interface CrmReceivablePlanMapper extends BaseMapperX<CrmReceivablePlanDO
|
||||||
MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 拼接数据权限的查询条件
|
// 拼接数据权限的查询条件
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(),
|
||||||
CrmReceivablePlanDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
|
CrmReceivablePlanDO::getId, userId, pageReqVO.getSceneType());
|
||||||
// 拼接自身的查询条件
|
// 拼接自身的查询条件
|
||||||
query.selectAll(CrmReceivablePlanDO.class)
|
query.selectAll(CrmReceivablePlanDO.class)
|
||||||
.eqIfPresent(CrmReceivablePlanDO::getCustomerId, pageReqVO.getCustomerId())
|
.eqIfPresent(CrmReceivablePlanDO::getCustomerId, pageReqVO.getCustomerId())
|
||||||
|
@ -74,20 +72,11 @@ public interface CrmReceivablePlanMapper extends BaseMapperX<CrmReceivablePlanDO
|
||||||
return selectJoinPage(pageReqVO, CrmReceivablePlanDO.class, query);
|
return selectJoinPage(pageReqVO, CrmReceivablePlanDO.class, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
default List<CrmReceivablePlanDO> selectBatchIds(Collection<Long> ids, Long userId) {
|
|
||||||
MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>();
|
|
||||||
// 拼接数据权限的查询条件
|
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(), ids, userId);
|
|
||||||
// 拼接自身的查询条件
|
|
||||||
query.selectAll(CrmReceivablePlanDO.class).in(CrmReceivablePlanDO::getId, ids).orderByDesc(CrmReceivablePlanDO::getId);
|
|
||||||
return selectJoinList(CrmReceivablePlanDO.class, query);
|
|
||||||
}
|
|
||||||
|
|
||||||
default Long selectReceivablePlanCountByRemind(Long userId) {
|
default Long selectReceivablePlanCountByRemind(Long userId) {
|
||||||
MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>();
|
MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>();
|
||||||
// 我负责的 + 非公海
|
// 我负责的 + 非公海
|
||||||
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(),
|
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(),
|
||||||
CrmReceivablePlanDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
|
CrmReceivablePlanDO::getId, userId, CrmSceneTypeEnum.OWNER.getType());
|
||||||
// 未回款 + 已逾期 + 今天开始提醒
|
// 未回款 + 已逾期 + 今天开始提醒
|
||||||
LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
|
LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
|
||||||
query.isNull(CrmReceivablePlanDO::getReceivableId) // 未回款
|
query.isNull(CrmReceivablePlanDO::getReceivableId) // 未回款
|
||||||
|
|
|
@ -130,9 +130,9 @@ public interface CrmStatisticsCustomerMapper {
|
||||||
List<CrmStatisticsPoolSummaryByDateRespVO> voList = new ArrayList<>();
|
List<CrmStatisticsPoolSummaryByDateRespVO> voList = new ArrayList<>();
|
||||||
while (currrentDate.isBefore(endDate)) {
|
while (currrentDate.isBefore(endDate)) {
|
||||||
voList.add(new CrmStatisticsPoolSummaryByDateRespVO()
|
voList.add(new CrmStatisticsPoolSummaryByDateRespVO()
|
||||||
.setTime(LocalDateTimeUtil.format(currrentDate, "yyyy-MM-dd"))
|
.setTime(LocalDateTimeUtil.format(currrentDate, "yyyy-MM-dd"))
|
||||||
.setCustomerPutCount(RandomUtil.randomInt(0, 10))
|
.setCustomerPutCount(RandomUtil.randomInt(0, 10))
|
||||||
.setCustomerTakeCount(RandomUtil.randomInt(0, 10)));
|
.setCustomerTakeCount(RandomUtil.randomInt(0, 10)));
|
||||||
currrentDate = currrentDate.plusDays(1);
|
currrentDate = currrentDate.plusDays(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,10 +159,10 @@ public interface CrmStatisticsCustomerMapper {
|
||||||
// TODO: @芋艿 模拟数据, 需要增加 crm_owner_record 表
|
// TODO: @芋艿 模拟数据, 需要增加 crm_owner_record 表
|
||||||
default List<CrmStatisticsPoolSummaryByUserRespVO> selectPoolCustomerPutCountByUser(CrmStatisticsCustomerReqVO reqVO) {
|
default List<CrmStatisticsPoolSummaryByUserRespVO> selectPoolCustomerPutCountByUser(CrmStatisticsCustomerReqVO reqVO) {
|
||||||
return convertList(reqVO.getUserIds(), userId ->
|
return convertList(reqVO.getUserIds(), userId ->
|
||||||
(CrmStatisticsPoolSummaryByUserRespVO) new CrmStatisticsPoolSummaryByUserRespVO()
|
(CrmStatisticsPoolSummaryByUserRespVO) new CrmStatisticsPoolSummaryByUserRespVO()
|
||||||
.setCustomerPutCount(RandomUtil.randomInt(0, 10))
|
.setCustomerPutCount(RandomUtil.randomInt(0, 10))
|
||||||
.setCustomerTakeCount(RandomUtil.randomInt(0, 10))
|
.setCustomerTakeCount(RandomUtil.randomInt(0, 10))
|
||||||
.setOwnerUserId(userId));
|
.setOwnerUserId(userId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -11,6 +11,8 @@ 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.framework.permission.core.annotations.CrmPermission;
|
||||||
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
||||||
import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
|
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 jakarta.annotation.Resource;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.aspectj.lang.JoinPoint;
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
@ -38,6 +40,9 @@ public class CrmPermissionAspect {
|
||||||
@Resource
|
@Resource
|
||||||
private CrmPermissionService crmPermissionService;
|
private CrmPermissionService crmPermissionService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AdminUserApi adminUserApi;
|
||||||
|
|
||||||
@Before("@annotation(crmPermission)")
|
@Before("@annotation(crmPermission)")
|
||||||
public void doBefore(JoinPoint joinPoint, CrmPermission crmPermission) {
|
public void doBefore(JoinPoint joinPoint, CrmPermission crmPermission) {
|
||||||
// 1.1 获取相关属性值
|
// 1.1 获取相关属性值
|
||||||
|
@ -65,48 +70,75 @@ public class CrmPermissionAspect {
|
||||||
if (CrmPermissionUtils.isCrmAdmin()) {
|
if (CrmPermissionUtils.isCrmAdmin()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 1.1 没有数据权限的情况
|
// 特殊:没有数据权限的情况,针对 READ 的特殊处理
|
||||||
if (CollUtil.isEmpty(bizPermissions)) {
|
if (CollUtil.isEmpty(bizPermissions)) {
|
||||||
// 公海数据如果没有团队成员大家也因该有读权限才对
|
// 1.1 公海数据,如果没有团队成员,大家也应该有 READ 权限才对
|
||||||
if (CrmPermissionLevelEnum.isRead(permissionLevel)) {
|
if (CrmPermissionLevelEnum.isRead(permissionLevel)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 没有数据权限的情况下超出了读权限直接报错,避免后面校验空指针
|
// 没有数据权限的情况下超出了读权限直接报错,避免后面校验空指针
|
||||||
throw exception(CRM_PERMISSION_DENIED, CrmBizTypeEnum.getNameByType(bizType));
|
throw exception(CRM_PERMISSION_DENIED, CrmBizTypeEnum.getNameByType(bizType));
|
||||||
} else { // 1.2 有数据权限但是没有负责人的情况
|
} else { // 1.2 有数据权限但是没有负责人的情况
|
||||||
if (!anyMatch(bizPermissions, item -> CrmPermissionLevelEnum.isOwner(item.getLevel()))) {
|
if (!anyMatch(bizPermissions, item -> CrmPermissionLevelEnum.isOwner(item.getLevel()))
|
||||||
if (CrmPermissionLevelEnum.isRead(permissionLevel)) {
|
&& CrmPermissionLevelEnum.isRead(permissionLevel)) {
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2.1 情况一:如果自己是负责人,则默认有所有权限
|
// 2. 只考虑自的身权限
|
||||||
CrmPermissionDO userPermission = CollUtil.findOne(bizPermissions, permission -> ObjUtil.equal(permission.getUserId(), getUserId()));
|
Long userId = getUserId();
|
||||||
|
CrmPermissionDO userPermission = CollUtil.findOne(bizPermissions, permission -> ObjUtil.equal(permission.getUserId(), userId));
|
||||||
if (userPermission != null) {
|
if (userPermission != null) {
|
||||||
if (CrmPermissionLevelEnum.isOwner(userPermission.getLevel())) {
|
if (isUserPermissionValid(userPermission, permissionLevel)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 2.2 情况二:校验自己是否有读权限
|
}
|
||||||
if (CrmPermissionLevelEnum.isRead(permissionLevel)) {
|
|
||||||
if (CrmPermissionLevelEnum.isRead(userPermission.getLevel()) // 校验当前用户是否有读权限
|
// 3. 考虑下级的权限
|
||||||
|| CrmPermissionLevelEnum.isWrite(userPermission.getLevel())) { // 校验当前用户是否有写权限
|
List<AdminUserRespDTO> subordinateUserIds = adminUserApi.getUserListBySubordinate(userId).getCheckedData();
|
||||||
return;
|
for (Long subordinateUserId : convertSet(subordinateUserIds, AdminUserRespDTO::getId)) {
|
||||||
}
|
CrmPermissionDO subordinatePermission = CollUtil.findOne(bizPermissions,
|
||||||
}
|
permission -> ObjUtil.equal(permission.getUserId(), subordinateUserId));
|
||||||
// 2.3 情况三:校验自己是否有写权限
|
if (subordinatePermission != null && isUserPermissionValid(subordinatePermission, permissionLevel)) {
|
||||||
if (CrmPermissionLevelEnum.isWrite(permissionLevel)) {
|
return;
|
||||||
if (CrmPermissionLevelEnum.isWrite(userPermission.getLevel())) { // 校验当前用户是否有写权限
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 2.4 没有权限,抛出异常
|
|
||||||
|
// 4. 没有权限,抛出异常
|
||||||
log.info("[doBefore][userId({}) 要求权限({}) 实际权限({}) 数据校验错误]", // 打个 info 日志,方便后续排查问题、审计
|
log.info("[doBefore][userId({}) 要求权限({}) 实际权限({}) 数据校验错误]", // 打个 info 日志,方便后续排查问题、审计
|
||||||
getUserId(), permissionLevel, toJsonString(userPermission));
|
userId, permissionLevel, toJsonString(userPermission));
|
||||||
throw exception(CRM_PERMISSION_DENIED, CrmBizTypeEnum.getNameByType(bizType));
|
throw exception(CRM_PERMISSION_DENIED, CrmBizTypeEnum.getNameByType(bizType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验用户权限是否有效
|
||||||
|
*
|
||||||
|
* @param userPermission 用户拥有的权限
|
||||||
|
* @param permissionLevel 需要的权限级别
|
||||||
|
* @return 是否有效
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("RedundantIfStatement")
|
||||||
|
private boolean isUserPermissionValid(CrmPermissionDO userPermission, Integer permissionLevel) {
|
||||||
|
// 2.1 情况一:如果自己是负责人,则默认有所有权限
|
||||||
|
if (CrmPermissionLevelEnum.isOwner(userPermission.getLevel())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// 2.2 情况二:校验自己是否有读权限
|
||||||
|
if (CrmPermissionLevelEnum.isRead(permissionLevel)) {
|
||||||
|
if (CrmPermissionLevelEnum.isRead(userPermission.getLevel()) // 校验当前用户是否有读权限
|
||||||
|
|| CrmPermissionLevelEnum.isWrite(userPermission.getLevel())) { // 校验当前用户是否有写权限
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 2.3 情况三:校验自己是否有写权限
|
||||||
|
if (CrmPermissionLevelEnum.isWrite(permissionLevel)) {
|
||||||
|
if (CrmPermissionLevelEnum.isWrite(userPermission.getLevel())) { // 校验当前用户是否有写权限
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得用户编号
|
* 获得用户编号
|
||||||
*
|
*
|
||||||
|
|
|
@ -8,8 +8,6 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 线索 Service 接口
|
* 线索 Service 接口
|
||||||
|
@ -57,14 +55,6 @@ public interface CrmClueService {
|
||||||
*/
|
*/
|
||||||
CrmClueDO getClue(Long id);
|
CrmClueDO getClue(Long id);
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得线索列表
|
|
||||||
*
|
|
||||||
* @param ids 编号
|
|
||||||
* @return 线索列表
|
|
||||||
*/
|
|
||||||
List<CrmClueDO> getClueList(Collection<Long> ids, Long userId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得线索分页
|
* 获得线索分页
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package cn.iocoder.yudao.module.crm.service.clue;
|
package cn.iocoder.yudao.module.crm.service.clue;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.collection.ListUtil;
|
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
|
@ -32,7 +31,6 @@ import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@ -114,7 +112,7 @@ public class CrmClueServiceImpl implements CrmClueService {
|
||||||
private void validateRelationDataExists(CrmClueSaveReqVO reqVO) {
|
private void validateRelationDataExists(CrmClueSaveReqVO reqVO) {
|
||||||
// 校验负责人
|
// 校验负责人
|
||||||
if (Objects.nonNull(reqVO.getOwnerUserId()) &&
|
if (Objects.nonNull(reqVO.getOwnerUserId()) &&
|
||||||
Objects.isNull(adminUserApi.getUser(reqVO.getOwnerUserId()).getCheckedData())) {
|
Objects.isNull(adminUserApi.getUser(reqVO.getOwnerUserId()))) {
|
||||||
throw exception(USER_NOT_EXISTS);
|
throw exception(USER_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -220,14 +218,6 @@ public class CrmClueServiceImpl implements CrmClueService {
|
||||||
return clueMapper.selectById(id);
|
return clueMapper.selectById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<CrmClueDO> getClueList(Collection<Long> ids, Long userId) {
|
|
||||||
if (CollUtil.isEmpty(ids)) {
|
|
||||||
return ListUtil.empty();
|
|
||||||
}
|
|
||||||
return clueMapper.selectBatchIds(ids, userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<CrmClueDO> getCluePage(CrmCluePageReqVO pageReqVO, Long userId) {
|
public PageResult<CrmClueDO> getCluePage(CrmCluePageReqVO pageReqVO, Long userId) {
|
||||||
return clueMapper.selectPage(pageReqVO, userId);
|
return clueMapper.selectPage(pageReqVO, userId);
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package cn.iocoder.yudao.module.crm.util;
|
package cn.iocoder.yudao.module.crm.util;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.ObjUtil;
|
|
||||||
import cn.hutool.extra.spring.SpringUtil;
|
import cn.hutool.extra.spring.SpringUtil;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
|
||||||
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
|
@ -15,7 +14,6 @@ import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||||
import com.github.yulichang.autoconfigure.MybatisPlusJoinProperties;
|
import com.github.yulichang.autoconfigure.MybatisPlusJoinProperties;
|
||||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||||
|
@ -39,37 +37,33 @@ public class CrmPermissionUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造 CRM 数据类型数据分页查询条件
|
* 构造 CRM 数据类型数据【分页】查询条件
|
||||||
*
|
*
|
||||||
* @param query 连表查询对象
|
* @param query 连表查询对象
|
||||||
* @param bizType 数据类型 {@link CrmBizTypeEnum}
|
* @param bizType 数据类型 {@link CrmBizTypeEnum}
|
||||||
* @param bizId 数据编号
|
* @param bizId 数据编号
|
||||||
* @param userId 用户编号
|
* @param userId 用户编号
|
||||||
* @param sceneType 场景类型
|
* @param sceneType 场景类型
|
||||||
* @param pool 公海
|
|
||||||
*/
|
*/
|
||||||
public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId,
|
public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId,
|
||||||
Long userId, Integer sceneType, Boolean pool) {
|
Long userId, Integer sceneType) {
|
||||||
MybatisPlusJoinProperties mybatisPlusJoinProperties = SpringUtil.getBean(MybatisPlusJoinProperties.class);
|
MybatisPlusJoinProperties mybatisPlusJoinProperties = SpringUtil.getBean(MybatisPlusJoinProperties.class);
|
||||||
final String ownerUserIdField = mybatisPlusJoinProperties.getTableAlias() + ".owner_user_id";
|
final String ownerUserIdField = mybatisPlusJoinProperties.getTableAlias() + ".owner_user_id";
|
||||||
// 1. 构建数据权限连表条件
|
// 场景一:我负责的数据
|
||||||
if (!CrmPermissionUtils.isCrmAdmin() && ObjUtil.notEqual(pool, Boolean.TRUE)) { // 管理员,公海不需要数据权限
|
|
||||||
query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType)
|
|
||||||
.eq(CrmPermissionDO::getBizId, bizId) // 只能使用 SFunction 如果传 id 解析出来的 sql 不对
|
|
||||||
.eq(CrmPermissionDO::getUserId, userId));
|
|
||||||
}
|
|
||||||
// 2.1 场景一:我负责的数据
|
|
||||||
if (CrmSceneTypeEnum.isOwner(sceneType)) {
|
if (CrmSceneTypeEnum.isOwner(sceneType)) {
|
||||||
query.eq(ownerUserIdField, userId);
|
query.eq(ownerUserIdField, userId);
|
||||||
}
|
}
|
||||||
// 2.2 场景二:我参与的数据
|
// 场景二:我参与的数据(我有读或写权限,并且不是负责人)
|
||||||
if (CrmSceneTypeEnum.isInvolved(sceneType)) {
|
if (CrmSceneTypeEnum.isInvolved(sceneType)) {
|
||||||
|
if (CrmPermissionUtils.isCrmAdmin()) { // 特殊逻辑:如果是超管,直接查询所有,不过滤数据权限
|
||||||
|
return;
|
||||||
|
}
|
||||||
query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType)
|
query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType)
|
||||||
.eq(CrmPermissionDO::getBizId, bizId)
|
.eq(CrmPermissionDO::getBizId, bizId)
|
||||||
.in(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel(), CrmPermissionLevelEnum.WRITE.getLevel()));
|
.in(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel(), CrmPermissionLevelEnum.WRITE.getLevel()));
|
||||||
query.ne(ownerUserIdField, userId);
|
query.ne(ownerUserIdField, userId);
|
||||||
}
|
}
|
||||||
// 2.3 场景三:下属负责的数据
|
// 场景三:下属负责的数据(下属是负责人)
|
||||||
if (CrmSceneTypeEnum.isSubordinate(sceneType)) {
|
if (CrmSceneTypeEnum.isSubordinate(sceneType)) {
|
||||||
AdminUserApi adminUserApi = SpringUtil.getBean(AdminUserApi.class);
|
AdminUserApi adminUserApi = SpringUtil.getBean(AdminUserApi.class);
|
||||||
List<AdminUserRespDTO> subordinateUsers = adminUserApi.getUserListBySubordinate(userId).getCheckedData();
|
List<AdminUserRespDTO> subordinateUsers = adminUserApi.getUserListBySubordinate(userId).getCheckedData();
|
||||||
|
@ -79,30 +73,6 @@ public class CrmPermissionUtils {
|
||||||
query.in(ownerUserIdField, convertSet(subordinateUsers, AdminUserRespDTO::getId));
|
query.in(ownerUserIdField, convertSet(subordinateUsers, AdminUserRespDTO::getId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. 拼接公海的查询条件
|
|
||||||
if (ObjUtil.equal(pool, Boolean.TRUE)) { // 情况一:公海
|
|
||||||
query.isNull(ownerUserIdField);
|
|
||||||
} else { // 情况二:不是公海
|
|
||||||
query.isNotNull(ownerUserIdField);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 构造 CRM 数据类型批量数据查询条件
|
|
||||||
*
|
|
||||||
* @param query 连表查询对象
|
|
||||||
* @param bizType 数据类型 {@link CrmBizTypeEnum}
|
|
||||||
* @param bizIds 数据编号
|
|
||||||
* @param userId 用户编号
|
|
||||||
*/
|
|
||||||
public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, Integer bizType, Collection<Long> bizIds, Long userId) {
|
|
||||||
if (isCrmAdmin()) {// 管理员不需要数据权限
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
query.innerJoin(CrmPermissionDO.class, on ->
|
|
||||||
on.eq(CrmPermissionDO::getBizType, bizType).in(CrmPermissionDO::getBizId, bizIds)
|
|
||||||
.eq(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue