diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java index eb83fa743..c1ccaf9b7 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java @@ -71,8 +71,7 @@ public class CrmBusinessController { @Operation(summary = "获得商机分页") @PreAuthorize("@ss.hasPermission('crm:business:query')") public CommonResult> getBusinessPage(@Valid CrmBusinessPageReqVO pageVO) { - PageResult pageResult = businessService.getBusinessPage(pageVO); - + PageResult pageResult = businessService.getBusinessPage(pageVO, getLoginUserId()); return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult)); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java index 3c27c0ce3..9e23c793a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.crm.convert.business; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionPageReqBO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmTransferPermissionReqBO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -37,4 +38,6 @@ public interface CrmBusinessConvert { }) CrmTransferPermissionReqBO convert(CrmBusinessTransferReqVO reqVO, Long userId); + CrmPermissionPageReqBO convert(CrmBusinessPageReqVO pageReqVO); + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java index 2601b5d09..bcd12e213 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java @@ -23,6 +23,12 @@ import lombok.*; @AllArgsConstructor public class CrmPermissionDO extends BaseDO { + /** + * 当数据变为公海数据时,也就是数据团队成员中没有负责人的时候,将原本的负责人 userId 设置为 POOL_USER_ID 方便查询公海数据。 + * 也就是说每条数据到最后都有一个负责人,如果有人领取则 userId 为领取人 + */ + public static final Long POOL_USER_ID = 0L; + /** * ID */ @@ -38,12 +44,12 @@ public class CrmPermissionDO extends BaseDO { private Long bizId; /** * 团队成员,关联 AdminUser#id + * 如果为公海数据的话会干掉此数据的负责人后设置为 {@link #POOL_USER_ID},领取人则上位负责人 + * 例:客户放入公海后会干掉团队成员中的负责人,而其他团队成员则不受影响 */ private Long userId; /** * 权限级别,关联 {@link CrmPermissionLevelEnum} - * 如果为公海数据的话会干掉此数据的负责人,领取人则上位负责人 - * 例:客户放入公海后会干掉团队成员中的负责人,而其他团队成员则不受影响 */ private Integer permissionLevel; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java index 5df94c0fa..0ae83c236 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.crm.dal.mysql.business; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessExportReqVO; @@ -8,6 +7,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessPageR import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; import java.util.List; /** @@ -18,8 +18,9 @@ import java.util.List; @Mapper public interface CrmBusinessMapper extends BaseMapperX { - default PageResult selectPage(CrmBusinessPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() + default List selectList(CrmBusinessPageReqVO reqVO, Collection ids) { + return selectList(new LambdaQueryWrapperX() + .in(CrmBusinessDO::getId, ids) .likeIfPresent(CrmBusinessDO::getName, reqVO.getName()) .orderByDesc(CrmBusinessDO::getId)); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java index c2db6acbf..45c28fb4c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java @@ -1,9 +1,11 @@ package cn.iocoder.yudao.module.crm.dal.mysql.permission; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionPageReqBO; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -57,4 +59,10 @@ public interface CrmPermissionMapper extends BaseMapperX { .eq(CrmPermissionDO::getUserId, userId)); } + default PageResult selectPage(CrmPermissionPageReqBO pageReqBO) { + return selectPage(pageReqBO, new LambdaQueryWrapperX() + .eq(CrmPermissionDO::getBizType, pageReqBO.getBizType()) + .eq(CrmPermissionDO::getUserId, pageReqBO.getUserId())); // 只要是团队成员都有读取的权限 + } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java index ee921d2c7..bb1d25b59 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java @@ -81,7 +81,8 @@ public class CrmPermissionAspect { } if (isRead(permissionLevel)) { // 读权限 // 如果没有数据权限或没有负责人则表示此记录为公海数据所有人都有只读权限可以领取成为负责人(团队成员领取的) - if (CollUtil.isEmpty(bizPermissions) || !CollUtil.anyMatch(bizPermissions, item -> isOwner(item.getPermissionLevel()))) { + if (CollUtil.isEmpty(bizPermissions) || CollUtil.anyMatch(bizPermissions, + item -> ObjUtil.equal(item.getUserId(), CrmPermissionDO.POOL_USER_ID))) { // 详见 CrmPermissionDO.POOL_USER_ID 注释 return; } if (isRead(userPermission.getPermissionLevel())) { // 校验当前用户是否有读权限 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java index aeee4b426..ec5dbe1d4 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java @@ -58,9 +58,10 @@ public interface CrmBusinessService { * 获得商机分页 * * @param pageReqVO 分页查询 + * @param userId 用户编号 * @return 商机分页 */ - PageResult getBusinessPage(CrmBusinessPageReqVO pageReqVO); + PageResult getBusinessPage(CrmBusinessPageReqVO pageReqVO, Long userId); /** * 获得商机列表, 用于 Excel 导出 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java index b3e1b9790..c4dc4441c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*; import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert; 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.framework.core.annotations.CrmPermission; import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; @@ -19,8 +20,10 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Collection; import java.util.List; +import java.util.Set; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_NOT_EXISTS; /** @@ -98,8 +101,18 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { } @Override - public PageResult getBusinessPage(CrmBusinessPageReqVO pageReqVO) { - return businessMapper.selectPage(pageReqVO); + public PageResult getBusinessPage(CrmBusinessPageReqVO pageReqVO, Long userId) { + // 1. 获取当前用户能看的分页数据 + PageResult permissionPage = crmPermissionService.getPermissionPage( + CrmBusinessConvert.INSTANCE.convert(pageReqVO).setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()).setUserId(userId)); + Set ids = convertSet(permissionPage.getList(), CrmPermissionDO::getBizId); + if (CollUtil.isEmpty(ids)) { // 没得说明没有什么给他看的 + return PageResult.empty(); + } + + // 2. 获取商机分页数据 + List businessList = businessMapper.selectList(pageReqVO, ids); + return new PageResult<>(businessList, (long) businessList.size()); } @Override @@ -114,7 +127,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { validateBusinessExists(reqVO.getId()); // 2. 数据权限转移 - crmPermissionService.transferCrmPermission( + crmPermissionService.transferPermission( CrmBusinessConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType())); // 3. TODO 记录转移日志 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java index 550829fbe..dafebb598 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java @@ -115,7 +115,7 @@ public class ContactServiceImpl implements ContactService { validateContactExists(reqVO.getId()); // 2. 数据权限转移 - crmPermissionService.transferCrmPermission( + crmPermissionService.transferPermission( ContactConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CONTACTS.getType())); // 3. TODO 记录转移日志 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java index c4b144462..523470cd8 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java @@ -113,7 +113,7 @@ public class ContractServiceImpl implements ContractService { validateContractExists(reqVO.getId()); // 2. 数据权限转移 - crmPermissionService.transferCrmPermission( + crmPermissionService.transferPermission( ContractConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType())); // 3. TODO 记录转移日志 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java index 87d23a25f..e77ceb042 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java @@ -136,7 +136,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { validateCustomer(reqVO.getId()); // 2. 数据权限转移 - crmPermissionService.transferCrmPermission( + crmPermissionService.transferPermission( CrmCustomerConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType())); // 3. TODO 记录转移日志 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java index 5e2daef08..59d160773 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java @@ -1,9 +1,11 @@ package cn.iocoder.yudao.module.crm.service.permission; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionPageReqBO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmTransferPermissionReqBO; @@ -58,20 +60,19 @@ public interface CrmPermissionService { */ List getPermissionByBizTypeAndBizId(Integer bizType, Long bizId); - /** - * 获取数据权限列表,通过 数据类型 x 用户编号 - * - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum} - * @param userId 用户编号 - * @return Crm 数据权限列表 - */ - List getPermissionByBizTypeAndUserId(Integer bizType, Long userId); - /** * 数据权限转移 * * @param crmTransferPermissionReqBO 数据权限转移请求 */ - void transferCrmPermission(@Valid CrmTransferPermissionReqBO crmTransferPermissionReqBO); + void transferPermission(@Valid CrmTransferPermissionReqBO crmTransferPermissionReqBO); + + /** + * 获取数据权限分页数据 + * + * @param pageReqBO 分页请求 + * @return 数据权限分页数据 + */ + PageResult getPermissionPage(CrmPermissionPageReqBO pageReqBO); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java index 8d4047741..25fa5c849 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java @@ -2,12 +2,14 @@ package cn.iocoder.yudao.module.crm.service.permission; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.convert.permission.CrmPermissionConvert; 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.framework.enums.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionPageReqBO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmTransferPermissionReqBO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; @@ -86,7 +88,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { @Override - public void transferCrmPermission(CrmTransferPermissionReqBO transferReqBO) { + public void transferPermission(CrmTransferPermissionReqBO transferReqBO) { // 1. 校验数据权限-是否是负责人,只有负责人才可以转移 CrmPermissionDO oldPermission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(transferReqBO.getBizType(), transferReqBO.getBizId(), transferReqBO.getUserId()); @@ -131,4 +133,9 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { crmPermissionMapper.deleteById(oldPermission.getId()); // 移除 } + @Override + public PageResult getPermissionPage(CrmPermissionPageReqBO pageReqBO) { + return crmPermissionMapper.selectPage(pageReqBO); + } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionPageReqBO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionPageReqBO.java new file mode 100644 index 000000000..736171c1e --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionPageReqBO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.crm.service.permission.bo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - CRM 数据权限分页 Request BO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CrmPermissionPageReqBO extends PageParam { + + /** + * 当前登录用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + + /** + * Crm 类型 + */ + @NotNull(message = "Crm 类型不能为空") + @InEnum(CrmBizTypeEnum.class) + private Integer bizType; + +}