Commit e4d3175f06ef278e8abd536fa793a28862421198
1 parent
23df8633
CRM-数据权限:完善 review 提到的问题
Showing
31 changed files
with
169 additions
and
123 deletions
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java
| ... | ... | @@ -22,7 +22,8 @@ public enum CrmBizTypeEnum implements IntArrayValuable { |
| 22 | 22 | CRM_CONTACT(3, "联系人"), |
| 23 | 23 | CRM_BUSINESS(4, "商机"), |
| 24 | 24 | CRM_CONTRACT(5, "合同"), |
| 25 | - CRM_PRODUCT(6, "产品") | |
| 25 | + CRM_PRODUCT(6, "产品"), | |
| 26 | + CRM_RECEIVABLE(7, "回款") | |
| 26 | 27 | ; |
| 27 | 28 | |
| 28 | 29 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmBizTypeEnum::getType).toArray(); | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java
| ... | ... | @@ -122,7 +122,7 @@ public class CrmBusinessController { |
| 122 | 122 | @Operation(summary = "获得商机分页,基于指定客户") |
| 123 | 123 | public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPageByCustomer(@Valid CrmBusinessPageReqVO pageReqVO) { |
| 124 | 124 | Assert.notNull(pageReqVO.getCustomerId(), "客户编号不能为空"); |
| 125 | - PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPageByCustomer(pageReqVO, getLoginUserId()); | |
| 125 | + PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPageByCustomerId(pageReqVO); | |
| 126 | 126 | // 处理客户名称回显 |
| 127 | 127 | // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈; |
| 128 | 128 | Set<Long> customerIds = pageResult.getList().stream() | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java
| ... | ... | @@ -24,7 +24,4 @@ public class CrmBusinessPageReqVO extends PageParam { |
| 24 | 24 | @InEnum(CrmSceneTypeEnum.class) |
| 25 | 25 | private Integer sceneType; // 场景类型,为 null 时则表示全部 |
| 26 | 26 | |
| 27 | - @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") | |
| 28 | - private Boolean pool; // null 则表示为不是公海数据 | |
| 29 | - | |
| 30 | 27 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java
| ... | ... | @@ -125,7 +125,7 @@ public class CrmContactController { |
| 125 | 125 | @Operation(summary = "获得联系人分页,基于指定客户") |
| 126 | 126 | public CommonResult<PageResult<CrmContactRespVO>> getContactPageByCustomer(@Valid CrmContactPageReqVO pageVO) { |
| 127 | 127 | Assert.notNull(pageVO.getCustomerId(), "客户编号不能为空"); |
| 128 | - PageResult<CrmContactDO> pageResult = contactService.getContactPageByCustomerId(pageVO, getLoginUserId()); | |
| 128 | + PageResult<CrmContactDO> pageResult = contactService.getContactPageByCustomerId(pageVO); | |
| 129 | 129 | return success(convertDetailContactPage(pageResult)); |
| 130 | 130 | } |
| 131 | 131 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactPageReqVO.java
| ... | ... | @@ -39,7 +39,4 @@ public class CrmContactPageReqVO extends PageParam { |
| 39 | 39 | @InEnum(CrmSceneTypeEnum.class) |
| 40 | 40 | private Integer sceneType; // 场景类型,为 null 时则表示全部 |
| 41 | 41 | |
| 42 | - @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") | |
| 43 | - private Boolean pool; // null 则表示为不是公海数据 | |
| 44 | - | |
| 45 | 42 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java
| ... | ... | @@ -95,7 +95,7 @@ public class CrmContractController { |
| 95 | 95 | @Operation(summary = "获得联系人分页,基于指定客户") |
| 96 | 96 | public CommonResult<PageResult<ContractRespVO>> getContractPageByCustomer(@Valid CrmContractPageReqVO pageVO) { |
| 97 | 97 | Assert.notNull(pageVO.getCustomerId(), "客户编号不能为空"); |
| 98 | - PageResult<CrmContractDO> pageResult = contractService.getContractPageByCustomer(pageVO, getLoginUserId()); | |
| 98 | + PageResult<CrmContractDO> pageResult = contractService.getContractPageByCustomerId(pageVO); | |
| 99 | 99 | return success(convertDetailContractPage(pageResult)); |
| 100 | 100 | } |
| 101 | 101 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractPageReqVO.java
| ... | ... | @@ -30,7 +30,4 @@ public class CrmContractPageReqVO extends PageParam { |
| 30 | 30 | @InEnum(CrmSceneTypeEnum.class) |
| 31 | 31 | private Integer sceneType; // 场景类型,为 null 时则表示全部 |
| 32 | 32 | |
| 33 | - @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") | |
| 34 | - private Boolean pool; // null 则表示为不是公海数据 TODO @puhui999:合同没有公海。目前只有【客户】【线索】有公海,其它都没 | |
| 35 | - | |
| 36 | 33 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/CrmReceivableController.java
| ... | ... | @@ -36,6 +36,7 @@ import java.util.Map; |
| 36 | 36 | import java.util.stream.Stream; |
| 37 | 37 | |
| 38 | 38 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 39 | +import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE; | |
| 39 | 40 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap; |
| 40 | 41 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 41 | 42 | import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; |
| ... | ... | @@ -94,7 +95,7 @@ public class CrmReceivableController { |
| 94 | 95 | @Operation(summary = "获得回款分页") |
| 95 | 96 | @PreAuthorize("@ss.hasPermission('crm:receivable:query')") |
| 96 | 97 | public CommonResult<PageResult<CrmReceivableRespVO>> getReceivablePage(@Valid CrmReceivablePageReqVO pageReqVO) { |
| 97 | - PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(pageReqVO); | |
| 98 | + PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(pageReqVO, getLoginUserId()); | |
| 98 | 99 | return success(convertDetailReceivablePage(pageResult)); |
| 99 | 100 | } |
| 100 | 101 | |
| ... | ... | @@ -102,7 +103,7 @@ public class CrmReceivableController { |
| 102 | 103 | @Operation(summary = "获得回款分页,基于指定客户") |
| 103 | 104 | public CommonResult<PageResult<CrmReceivableRespVO>> getReceivablePageByCustomer(@Valid CrmReceivablePageReqVO pageReqVO) { |
| 104 | 105 | Assert.notNull(pageReqVO.getCustomerId(), "客户编号不能为空"); |
| 105 | - PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePageByCustomer(pageReqVO); | |
| 106 | + PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePageByCustomerId(pageReqVO); | |
| 106 | 107 | return success(convertDetailReceivablePage(pageResult)); |
| 107 | 108 | } |
| 108 | 109 | |
| ... | ... | @@ -113,7 +114,8 @@ public class CrmReceivableController { |
| 113 | 114 | @OperateLog(type = EXPORT) |
| 114 | 115 | public void exportReceivableExcel(@Valid CrmReceivablePageReqVO exportReqVO, |
| 115 | 116 | HttpServletResponse response) throws IOException { |
| 116 | - PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(exportReqVO); | |
| 117 | + exportReqVO.setPageSize(PAGE_SIZE_NONE); | |
| 118 | + PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(exportReqVO, getLoginUserId()); | |
| 117 | 119 | // 导出 Excel |
| 118 | 120 | ExcelUtils.write(response, "回款.xls", "数据", CrmReceivableRespVO.class, |
| 119 | 121 | convertDetailReceivablePage(pageResult).getList()); | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanPageReqVO.java
| ... | ... | @@ -25,7 +25,4 @@ public class CrmReceivablePlanPageReqVO extends PageParam { |
| 25 | 25 | @InEnum(CrmSceneTypeEnum.class) |
| 26 | 26 | private Integer sceneType; // 场景类型,为 null 时则表示全部 |
| 27 | 27 | |
| 28 | - @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") | |
| 29 | - private Boolean pool; // null 则表示为不是公海数据 | |
| 30 | - | |
| 31 | 28 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivablePageReqVO.java
| ... | ... | @@ -27,7 +27,4 @@ public class CrmReceivablePageReqVO extends PageParam { |
| 27 | 27 | @InEnum(CrmSceneTypeEnum.class) |
| 28 | 28 | private Integer sceneType; // 场景类型,为 null 时则表示全部 |
| 29 | 29 | |
| 30 | - @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") | |
| 31 | - private Boolean pool; // null 则表示为不是公海数据 | |
| 32 | - | |
| 33 | 30 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java
| ... | ... | @@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferRe |
| 9 | 9 | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| 10 | 10 | import org.mapstruct.Mapper; |
| 11 | 11 | import org.mapstruct.Mapping; |
| 12 | -import org.mapstruct.Mappings; | |
| 13 | 12 | import org.mapstruct.factory.Mappers; |
| 14 | 13 | |
| 15 | 14 | import java.util.List; |
| ... | ... | @@ -48,10 +47,7 @@ public interface ContactConvert { |
| 48 | 47 | |
| 49 | 48 | List<CrmContactSimpleRespVO> convertAllList(List<CrmContactDO> list); |
| 50 | 49 | |
| 51 | - @Mappings({ | |
| 52 | - @Mapping(target = "bizId", source = "reqVO.id"), | |
| 53 | - @Mapping(target = "newOwnerUserId", source = "reqVO.id") | |
| 54 | - }) | |
| 50 | + @Mapping(target = "bizId", source = "reqVO.id") | |
| 55 | 51 | CrmPermissionTransferReqBO convert(CrmContactTransferReqVO reqVO, Long userId); |
| 56 | 52 | |
| 57 | 53 | /** | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contract/ContractConvert.java
| ... | ... | @@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferRe |
| 8 | 8 | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| 9 | 9 | import org.mapstruct.Mapper; |
| 10 | 10 | import org.mapstruct.Mapping; |
| 11 | -import org.mapstruct.Mappings; | |
| 12 | 11 | import org.mapstruct.factory.Mappers; |
| 13 | 12 | |
| 14 | 13 | import java.util.List; |
| ... | ... | @@ -39,10 +38,7 @@ public interface ContractConvert { |
| 39 | 38 | |
| 40 | 39 | List<CrmContractExcelVO> convertList02(List<CrmContractDO> list); |
| 41 | 40 | |
| 42 | - @Mappings({ | |
| 43 | - @Mapping(target = "bizId", source = "reqVO.id"), | |
| 44 | - @Mapping(target = "newOwnerUserId", source = "reqVO.id") | |
| 45 | - }) | |
| 41 | + @Mapping(target = "bizId", source = "reqVO.id") | |
| 46 | 42 | CrmPermissionTransferReqBO convert(CrmContractTransferReqVO reqVO, Long userId); |
| 47 | 43 | |
| 48 | 44 | default PageResult<ContractRespVO> convertPage(PageResult<CrmContractDO> pageResult, Map<Long, AdminUserRespDTO> userMap, | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java
| ... | ... | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.dal.mysql.business; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | |
| 5 | 6 | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; |
| 6 | 7 | import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO; |
| 7 | 8 | import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; |
| ... | ... | @@ -27,14 +28,20 @@ public interface CrmBusinessMapper extends BaseMapperX<CrmBusinessDO> { |
| 27 | 28 | .set(CrmBusinessDO::getOwnerUserId, ownerUserId)); |
| 28 | 29 | } |
| 29 | 30 | |
| 31 | + default PageResult<CrmBusinessDO> selectPageByCustomerId(CrmBusinessPageReqVO pageReqVO) { | |
| 32 | + return selectPage(pageReqVO, new LambdaQueryWrapperX<CrmBusinessDO>() | |
| 33 | + .eq(CrmBusinessDO::getCustomerId, pageReqVO.getCustomerId()) // 指定客户编号 | |
| 34 | + .likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName()) | |
| 35 | + .orderByDesc(CrmBusinessDO::getId)); | |
| 36 | + } | |
| 37 | + | |
| 30 | 38 | default PageResult<CrmBusinessDO> selectPage(CrmBusinessPageReqVO pageReqVO, Long userId) { |
| 31 | 39 | MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>(); |
| 32 | 40 | // 拼接数据权限的查询条件 |
| 33 | - CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), CrmBusinessDO::getId, | |
| 34 | - userId, pageReqVO.getSceneType(), pageReqVO.getPool()); | |
| 41 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), CrmBusinessDO::getId, | |
| 42 | + userId, pageReqVO.getSceneType(), Boolean.FALSE); | |
| 35 | 43 | // 拼接自身的查询条件 |
| 36 | 44 | query.selectAll(CrmBusinessDO.class) |
| 37 | - .eqIfPresent(CrmBusinessDO::getCustomerId, pageReqVO.getCustomerId()) // 指定客户编号 | |
| 38 | 45 | .likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName()) |
| 39 | 46 | .orderByDesc(CrmBusinessDO::getId); |
| 40 | 47 | return selectJoinPage(pageReqVO, CrmBusinessDO.class, query); |
| ... | ... | @@ -43,7 +50,7 @@ public interface CrmBusinessMapper extends BaseMapperX<CrmBusinessDO> { |
| 43 | 50 | default List<CrmBusinessDO> selectBatchIds(Collection<Long> ids, Long userId) { |
| 44 | 51 | MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>(); |
| 45 | 52 | // 拼接数据权限的查询条件 |
| 46 | - CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), ids, userId); | |
| 53 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), ids, userId); | |
| 47 | 54 | return selectJoinList(CrmBusinessDO.class, query); |
| 48 | 55 | } |
| 49 | 56 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/CrmClueMapper.java
| ... | ... | @@ -30,7 +30,7 @@ public interface CrmClueMapper extends BaseMapperX<CrmClueDO> { |
| 30 | 30 | default PageResult<CrmClueDO> selectPage(CrmCluePageReqVO pageReqVO, Long userId) { |
| 31 | 31 | MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>(); |
| 32 | 32 | // 拼接数据权限的查询条件 |
| 33 | - CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_LEADS.getType(), CrmClueDO::getId, | |
| 33 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_LEADS.getType(), CrmClueDO::getId, | |
| 34 | 34 | userId, pageReqVO.getSceneType(), pageReqVO.getPool()); |
| 35 | 35 | // 拼接自身的查询条件 |
| 36 | 36 | query.selectAll(CrmClueDO.class) |
| ... | ... | @@ -44,7 +44,7 @@ public interface CrmClueMapper extends BaseMapperX<CrmClueDO> { |
| 44 | 44 | default List<CrmClueDO> selectBatchIds(Collection<Long> ids, Long userId) { |
| 45 | 45 | MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>(); |
| 46 | 46 | // 拼接数据权限的查询条件 |
| 47 | - CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_LEADS.getType(), ids, userId); | |
| 47 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_LEADS.getType(), ids, userId); | |
| 48 | 48 | return selectJoinList(CrmClueDO.class, query); |
| 49 | 49 | } |
| 50 | 50 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java
| ... | ... | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.dal.mysql.contact; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | |
| 5 | 6 | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; |
| 6 | 7 | import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO; |
| 7 | 8 | import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO; |
| ... | ... | @@ -27,14 +28,25 @@ public interface CrmContactMapper extends BaseMapperX<CrmContactDO> { |
| 27 | 28 | .set(CrmContactDO::getOwnerUserId, ownerUserId)); |
| 28 | 29 | } |
| 29 | 30 | |
| 31 | + default PageResult<CrmContactDO> selectPageByCustomerId(CrmContactPageReqVO pageVO) { | |
| 32 | + return selectPage(pageVO, new LambdaQueryWrapperX<CrmContactDO>() | |
| 33 | + .eq(CrmContactDO::getCustomerId, pageVO.getCustomerId()) // 指定客户编号 | |
| 34 | + .likeIfPresent(CrmContactDO::getName, pageVO.getName()) | |
| 35 | + .eqIfPresent(CrmContactDO::getMobile, pageVO.getMobile()) | |
| 36 | + .eqIfPresent(CrmContactDO::getTelephone, pageVO.getTelephone()) | |
| 37 | + .eqIfPresent(CrmContactDO::getEmail, pageVO.getEmail()) | |
| 38 | + .eqIfPresent(CrmContactDO::getQq, pageVO.getQq()) | |
| 39 | + .eqIfPresent(CrmContactDO::getWechat, pageVO.getWechat()) | |
| 40 | + .orderByDesc(CrmContactDO::getId)); | |
| 41 | + } | |
| 42 | + | |
| 30 | 43 | default PageResult<CrmContactDO> selectPage(CrmContactPageReqVO pageReqVO, Long userId) { |
| 31 | 44 | MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>(); |
| 32 | 45 | // 拼接数据权限的查询条件 |
| 33 | - CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_CONTACT.getType(), CrmContactDO::getId, | |
| 34 | - userId, pageReqVO.getSceneType(), pageReqVO.getPool()); | |
| 46 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(), CrmContactDO::getId, | |
| 47 | + userId, pageReqVO.getSceneType(), Boolean.FALSE); | |
| 35 | 48 | // 拼接自身的查询条件 |
| 36 | 49 | query.selectAll(CrmContactDO.class) |
| 37 | - .eqIfPresent(CrmContactDO::getCustomerId, pageReqVO.getCustomerId()) // 指定客户编号 | |
| 38 | 50 | .likeIfPresent(CrmContactDO::getName, pageReqVO.getName()) |
| 39 | 51 | .eqIfPresent(CrmContactDO::getMobile, pageReqVO.getMobile()) |
| 40 | 52 | .eqIfPresent(CrmContactDO::getTelephone, pageReqVO.getTelephone()) |
| ... | ... | @@ -48,7 +60,7 @@ public interface CrmContactMapper extends BaseMapperX<CrmContactDO> { |
| 48 | 60 | default List<CrmContactDO> selectBatchIds(Collection<Long> ids, Long userId) { |
| 49 | 61 | MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>(); |
| 50 | 62 | // 拼接数据权限的查询条件 |
| 51 | - CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId); | |
| 63 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId); | |
| 52 | 64 | return selectJoinList(CrmContactDO.class, query); |
| 53 | 65 | } |
| 54 | 66 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
| ... | ... | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.dal.mysql.contract; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | |
| 5 | 6 | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; |
| 6 | 7 | import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO; |
| 7 | 8 | import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; |
| ... | ... | @@ -27,13 +28,22 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> { |
| 27 | 28 | .set(CrmContractDO::getOwnerUserId, ownerUserId)); |
| 28 | 29 | } |
| 29 | 30 | |
| 31 | + default PageResult<CrmContractDO> selectPageByCustomerId(CrmContractPageReqVO pageReqVO) { | |
| 32 | + return selectPage(pageReqVO, new LambdaQueryWrapperX<CrmContractDO>() | |
| 33 | + .eq(CrmContractDO::getCustomerId, pageReqVO.getCustomerId()) | |
| 34 | + .likeIfPresent(CrmContractDO::getNo, pageReqVO.getNo()) | |
| 35 | + .likeIfPresent(CrmContractDO::getName, pageReqVO.getName()) | |
| 36 | + .eqIfPresent(CrmContractDO::getCustomerId, pageReqVO.getCustomerId()) | |
| 37 | + .eqIfPresent(CrmContractDO::getBusinessId, pageReqVO.getBusinessId()) | |
| 38 | + .orderByDesc(CrmContractDO::getId)); | |
| 39 | + } | |
| 40 | + | |
| 30 | 41 | default PageResult<CrmContractDO> selectPage(CrmContractPageReqVO pageReqVO, Long userId) { |
| 31 | 42 | MPJLambdaWrapperX<CrmContractDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>(); |
| 32 | 43 | // 构建数据权限连表条件 |
| 33 | - CrmQueryWrapperUtils.builderPageQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), CrmContractDO::getId, | |
| 34 | - userId, pageReqVO.getSceneType(), pageReqVO.getPool()); | |
| 44 | + CrmQueryWrapperUtils.appendPermissionCondition(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), CrmContractDO::getId, | |
| 45 | + userId, pageReqVO.getSceneType(), Boolean.FALSE); | |
| 35 | 46 | mpjLambdaWrapperX.selectAll(CrmContractDO.class) |
| 36 | - .eqIfPresent(CrmContractDO::getCustomerId, pageReqVO.getCustomerId()) | |
| 37 | 47 | .likeIfPresent(CrmContractDO::getNo, pageReqVO.getNo()) |
| 38 | 48 | .likeIfPresent(CrmContractDO::getName, pageReqVO.getName()) |
| 39 | 49 | .eqIfPresent(CrmContractDO::getCustomerId, pageReqVO.getCustomerId()) |
| ... | ... | @@ -45,7 +55,7 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> { |
| 45 | 55 | default List<CrmContractDO> selectBatchIds(Collection<Long> ids, Long userId) { |
| 46 | 56 | MPJLambdaWrapperX<CrmContractDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>(); |
| 47 | 57 | // 构建数据权限连表条件 |
| 48 | - CrmQueryWrapperUtils.builderListQueryBatch(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId); | |
| 58 | + CrmQueryWrapperUtils.appendPermissionCondition(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId); | |
| 49 | 59 | return selectJoinList(CrmContractDO.class, mpjLambdaWrapperX); |
| 50 | 60 | } |
| 51 | 61 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java
| ... | ... | @@ -30,7 +30,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { |
| 30 | 30 | default PageResult<CrmCustomerDO> selectPage(CrmCustomerPageReqVO pageReqVO, Long userId) { |
| 31 | 31 | MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>(); |
| 32 | 32 | // 拼接数据权限的查询条件 |
| 33 | - CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), CrmCustomerDO::getId, | |
| 33 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), CrmCustomerDO::getId, | |
| 34 | 34 | userId, pageReqVO.getSceneType(), pageReqVO.getPool()); |
| 35 | 35 | // 拼接自身的查询条件 |
| 36 | 36 | query.selectAll(CrmCustomerDO.class) |
| ... | ... | @@ -45,7 +45,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { |
| 45 | 45 | default List<CrmCustomerDO> selectBatchIds(Collection<Long> ids, Long userId) { |
| 46 | 46 | MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>(); |
| 47 | 47 | // 拼接数据权限的查询条件 |
| 48 | - CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, userId); | |
| 48 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, userId); | |
| 49 | 49 | return selectJoinList(CrmCustomerDO.class, query); |
| 50 | 50 | } |
| 51 | 51 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java
| ... | ... | @@ -46,4 +46,10 @@ public interface CrmPermissionMapper extends BaseMapperX<CrmPermissionDO> { |
| 46 | 46 | .eq(CrmPermissionDO::getId, id).eq(CrmPermissionDO::getUserId, userId)); |
| 47 | 47 | } |
| 48 | 48 | |
| 49 | + default int deletePermission(Integer bizType, Long bizId) { | |
| 50 | + return delete(new LambdaQueryWrapperX<CrmPermissionDO>() | |
| 51 | + .eq(CrmPermissionDO::getBizType, bizType) | |
| 52 | + .eq(CrmPermissionDO::getBizId, bizId)); | |
| 53 | + } | |
| 54 | + | |
| 49 | 55 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java
| ... | ... | @@ -3,10 +3,17 @@ package cn.iocoder.yudao.module.crm.dal.mysql.receivable; |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | 5 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 6 | +import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; | |
| 6 | 7 | import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivablePageReqVO; |
| 7 | 8 | import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO; |
| 9 | +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | |
| 10 | +import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils; | |
| 11 | +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | |
| 8 | 12 | import org.apache.ibatis.annotations.Mapper; |
| 9 | 13 | |
| 14 | +import java.util.Collection; | |
| 15 | +import java.util.List; | |
| 16 | + | |
| 10 | 17 | /** |
| 11 | 18 | * 回款 Mapper |
| 12 | 19 | * |
| ... | ... | @@ -15,15 +22,13 @@ import org.apache.ibatis.annotations.Mapper; |
| 15 | 22 | @Mapper |
| 16 | 23 | public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> { |
| 17 | 24 | |
| 18 | - default PageResult<CrmReceivableDO> selectPage(CrmReceivablePageReqVO reqVO) { | |
| 19 | - return selectPage(reqVO, new LambdaQueryWrapperX<CrmReceivableDO>() | |
| 20 | - .eqIfPresent(CrmReceivableDO::getNo, reqVO.getNo()) | |
| 21 | - .eqIfPresent(CrmReceivableDO::getPlanId, reqVO.getPlanId()) | |
| 22 | - .eqIfPresent(CrmReceivableDO::getCustomerId, reqVO.getCustomerId()) | |
| 23 | - .orderByDesc(CrmReceivableDO::getId)); | |
| 25 | + default int updateOwnerUserIdById(Long id, Long ownerUserId) { | |
| 26 | + return update(new LambdaUpdateWrapper<CrmReceivableDO>() | |
| 27 | + .eq(CrmReceivableDO::getId, id) | |
| 28 | + .set(CrmReceivableDO::getOwnerUserId, ownerUserId)); | |
| 24 | 29 | } |
| 25 | 30 | |
| 26 | - default PageResult<CrmReceivableDO> selectPageByCustomer(CrmReceivablePageReqVO reqVO) { | |
| 31 | + default PageResult<CrmReceivableDO> selectPageByCustomerId(CrmReceivablePageReqVO reqVO) { | |
| 27 | 32 | return selectPage(reqVO, new LambdaQueryWrapperX<CrmReceivableDO>() |
| 28 | 33 | .eq(CrmReceivableDO::getCustomerId, reqVO.getCustomerId()) // 必须传递 |
| 29 | 34 | .eqIfPresent(CrmReceivableDO::getNo, reqVO.getNo()) |
| ... | ... | @@ -31,4 +36,24 @@ public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> { |
| 31 | 36 | .orderByDesc(CrmReceivableDO::getId)); |
| 32 | 37 | } |
| 33 | 38 | |
| 39 | + default PageResult<CrmReceivableDO> selectPage(CrmReceivablePageReqVO pageReqVO, Long userId) { | |
| 40 | + MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>(); | |
| 41 | + // 拼接数据权限的查询条件 | |
| 42 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(), CrmReceivableDO::getId, | |
| 43 | + userId, pageReqVO.getSceneType(), Boolean.FALSE); | |
| 44 | + // 拼接自身的查询条件 | |
| 45 | + query.selectAll(CrmReceivableDO.class) | |
| 46 | + .eqIfPresent(CrmReceivableDO::getNo, pageReqVO.getNo()) | |
| 47 | + .eqIfPresent(CrmReceivableDO::getPlanId, pageReqVO.getPlanId()) | |
| 48 | + .orderByDesc(CrmReceivableDO::getId); | |
| 49 | + return selectJoinPage(pageReqVO, CrmReceivableDO.class, query); | |
| 50 | + } | |
| 51 | + | |
| 52 | + default List<CrmReceivableDO> selectBatchIds(Collection<Long> ids, Long userId) { | |
| 53 | + MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>(); | |
| 54 | + // 拼接数据权限的查询条件 | |
| 55 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(), ids, userId); | |
| 56 | + return selectJoinList(CrmReceivableDO.class, query); | |
| 57 | + } | |
| 58 | + | |
| 34 | 59 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java
| ... | ... | @@ -75,10 +75,9 @@ public interface CrmBusinessService { |
| 75 | 75 | * 数据权限:基于 {@link CrmCustomerDO} 读取 |
| 76 | 76 | * |
| 77 | 77 | * @param pageReqVO 分页查询 |
| 78 | - * @param userId 用户编号 | |
| 79 | 78 | * @return 联系人分页 |
| 80 | 79 | */ |
| 81 | - PageResult<CrmBusinessDO> getBusinessPageByCustomer(CrmBusinessPageReqVO pageReqVO, Long userId); | |
| 80 | + PageResult<CrmBusinessDO> getBusinessPageByCustomerId(CrmBusinessPageReqVO pageReqVO); | |
| 82 | 81 | |
| 83 | 82 | /** |
| 84 | 83 | * 商机转移 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
| ... | ... | @@ -111,11 +111,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { |
| 111 | 111 | } |
| 112 | 112 | |
| 113 | 113 | @Override |
| 114 | - public PageResult<CrmBusinessDO> getBusinessPageByCustomer(CrmBusinessPageReqVO pageReqVO, Long userId) { | |
| 115 | - // 校验客户存在 TODO @puhui999:这里不校验 | |
| 116 | - customerService.validateCustomer(pageReqVO.getCustomerId()); | |
| 117 | - // TODO @puhui999:感觉这里貌似不太复用用 selectPage,因为他可能没商机权限,只是因为能看 customer,所以可以看到列表 | |
| 118 | - return businessMapper.selectPage(pageReqVO, userId); | |
| 114 | + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageReqVO.customerId", level = CrmPermissionLevelEnum.READ) | |
| 115 | + public PageResult<CrmBusinessDO> getBusinessPageByCustomerId(CrmBusinessPageReqVO pageReqVO) { | |
| 116 | + return businessMapper.selectPageByCustomerId(pageReqVO); | |
| 119 | 117 | } |
| 120 | 118 | |
| 121 | 119 | @Override |
| ... | ... | @@ -127,7 +125,6 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { |
| 127 | 125 | // 2.1 数据权限转移 |
| 128 | 126 | crmPermissionService.transferPermission( |
| 129 | 127 | CrmBusinessConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType())); |
| 130 | - | |
| 131 | 128 | // 2.2 设置新的负责人 |
| 132 | 129 | businessMapper.updateOwnerUserIdById(reqVO.getId(), reqVO.getNewOwnerUserId()); |
| 133 | 130 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java
| ... | ... | @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactCreateR |
| 5 | 5 | import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO; |
| 6 | 6 | import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactUpdateReqVO; |
| 7 | 7 | import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO; |
| 8 | +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | |
| 8 | 9 | import jakarta.validation.Valid; |
| 9 | 10 | |
| 10 | 11 | import java.util.Collection; |
| ... | ... | @@ -71,12 +72,11 @@ public interface CrmContactService { |
| 71 | 72 | /** |
| 72 | 73 | * 获得联系人分页 |
| 73 | 74 | * |
| 74 | - * 数据权限:基于 {@link CrmContactDO} | |
| 75 | + * 数据权限:基于 {@link CrmCustomerDO} | |
| 75 | 76 | * |
| 76 | 77 | * @param pageVO 分页查询 |
| 77 | - * @param userId 用户编号 | |
| 78 | 78 | * @return 联系人分页 |
| 79 | 79 | */ |
| 80 | - PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO, Long userId); | |
| 80 | + PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO); | |
| 81 | 81 | |
| 82 | 82 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java
| ... | ... | @@ -134,11 +134,9 @@ public class CrmContactServiceImpl implements CrmContactService { |
| 134 | 134 | } |
| 135 | 135 | |
| 136 | 136 | @Override |
| 137 | - public PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO, Long userId) { | |
| 138 | - // 校验用户存在 | |
| 139 | - customerService.validateCustomer(pageVO.getCustomerId()); | |
| 140 | - // TODO @puhui999:getBusinessPageByCustomer 同理 | |
| 141 | - return contactMapper.selectPage(pageVO, userId); | |
| 137 | + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageVO.customerId", level = CrmPermissionLevelEnum.READ) | |
| 138 | + public PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO) { | |
| 139 | + return contactMapper.selectPageByCustomerId(pageVO); | |
| 142 | 140 | } |
| 143 | 141 | |
| 144 | 142 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java
| ... | ... | @@ -75,12 +75,9 @@ public interface CrmContractService { |
| 75 | 75 | * 数据权限:基于 {@link CrmCustomerDO} 读取 |
| 76 | 76 | * |
| 77 | 77 | * @param pageReqVO 分页查询 |
| 78 | - * @param userId 用户编号 | |
| 79 | 78 | * @return 联系人分页 |
| 80 | 79 | */ |
| 81 | - default PageResult<CrmContractDO> getContractPageByCustomer(CrmContractPageReqVO pageReqVO, Long userId) { | |
| 82 | - return getContractPage(pageReqVO, userId); | |
| 83 | - } | |
| 80 | + PageResult<CrmContractDO> getContractPageByCustomerId(CrmContractPageReqVO pageReqVO); | |
| 84 | 81 | |
| 85 | 82 | /** |
| 86 | 83 | * 合同转移 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
| ... | ... | @@ -105,6 +105,12 @@ public class CrmContractServiceImpl implements CrmContractService { |
| 105 | 105 | } |
| 106 | 106 | |
| 107 | 107 | @Override |
| 108 | + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageReqVO.customerId", level = CrmPermissionLevelEnum.READ) | |
| 109 | + public PageResult<CrmContractDO> getContractPageByCustomerId(CrmContractPageReqVO pageReqVO) { | |
| 110 | + return contractMapper.selectPageByCustomerId(pageReqVO); | |
| 111 | + } | |
| 112 | + | |
| 113 | + @Override | |
| 108 | 114 | @Transactional(rollbackFor = Exception.class) |
| 109 | 115 | public void transferContract(CrmContractTransferReqVO reqVO, Long userId) { |
| 110 | 116 | // 1. 校验合同是否存在 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
| ... | ... | @@ -114,7 +114,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { |
| 114 | 114 | */ |
| 115 | 115 | @Override |
| 116 | 116 | public void validateCustomer(Long customerId) { |
| 117 | - // TODO puhui999: 不返回客户不走校验应该可行 | |
| 118 | 117 | // 校验客户是否存在 |
| 119 | 118 | if (customerId == null) { |
| 120 | 119 | throw exception(CUSTOMER_NOT_EXISTS); | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
| ... | ... | @@ -139,14 +139,11 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { |
| 139 | 139 | |
| 140 | 140 | @Override |
| 141 | 141 | public void deletePermission(Integer bizType, Long bizId) { |
| 142 | - // TODO @puhui999:这种直接写条件删除;不需要先查询,再删除 | |
| 143 | - List<CrmPermissionDO> permissionList = crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId); | |
| 144 | - if (CollUtil.isEmpty(permissionList)) { | |
| 145 | - return; | |
| 146 | - } | |
| 147 | - | |
| 148 | 142 | // 删除数据权限 |
| 149 | - crmPermissionMapper.deleteBatchIds(convertSet(permissionList, CrmPermissionDO::getId)); | |
| 143 | + int deletedCol = crmPermissionMapper.deletePermission(bizType, bizId); | |
| 144 | + if (deletedCol == 0) { | |
| 145 | + throw exception(CRM_PERMISSION_NOT_EXISTS); | |
| 146 | + } | |
| 150 | 147 | } |
| 151 | 148 | |
| 152 | 149 | @Override | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableService.java
| ... | ... | @@ -6,8 +6,8 @@ import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.Crm |
| 6 | 6 | import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableUpdateReqVO; |
| 7 | 7 | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; |
| 8 | 8 | import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO; |
| 9 | - | |
| 10 | 9 | import jakarta.validation.Valid; |
| 10 | + | |
| 11 | 11 | import java.util.Collection; |
| 12 | 12 | import java.util.List; |
| 13 | 13 | |
| ... | ... | @@ -62,9 +62,10 @@ public interface CrmReceivableService { |
| 62 | 62 | * 数据权限:基于 {@link CrmReceivableDO} 读取 |
| 63 | 63 | * |
| 64 | 64 | * @param pageReqVO 分页查询 |
| 65 | + * @param userId 用户编号 | |
| 65 | 66 | * @return 回款分页 |
| 66 | 67 | */ |
| 67 | - PageResult<CrmReceivableDO> getReceivablePage(CrmReceivablePageReqVO pageReqVO); | |
| 68 | + PageResult<CrmReceivableDO> getReceivablePage(CrmReceivablePageReqVO pageReqVO, Long userId); | |
| 68 | 69 | |
| 69 | 70 | /** |
| 70 | 71 | * 获得回款分页,基于指定客户 |
| ... | ... | @@ -74,6 +75,6 @@ public interface CrmReceivableService { |
| 74 | 75 | * @param pageReqVO 分页查询 |
| 75 | 76 | * @return 回款分页 |
| 76 | 77 | */ |
| 77 | - PageResult<CrmReceivableDO> getReceivablePageByCustomer(CrmReceivablePageReqVO pageReqVO); | |
| 78 | + PageResult<CrmReceivableDO> getReceivablePageByCustomerId(CrmReceivablePageReqVO pageReqVO); | |
| 78 | 79 | |
| 79 | 80 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java
| ... | ... | @@ -20,10 +20,10 @@ import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; |
| 20 | 20 | import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; |
| 21 | 21 | import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; |
| 22 | 22 | import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; |
| 23 | +import jakarta.annotation.Resource; | |
| 23 | 24 | import org.springframework.stereotype.Service; |
| 24 | 25 | import org.springframework.validation.annotation.Validated; |
| 25 | 26 | |
| 26 | -import jakarta.annotation.Resource; | |
| 27 | 27 | import java.util.Collection; |
| 28 | 28 | import java.util.List; |
| 29 | 29 | |
| ... | ... | @@ -129,16 +129,15 @@ public class CrmReceivableServiceImpl implements CrmReceivableService { |
| 129 | 129 | return receivableMapper.selectBatchIds(ids); |
| 130 | 130 | } |
| 131 | 131 | |
| 132 | - // TODO @芋艿:数据权限 | |
| 133 | 132 | @Override |
| 134 | - public PageResult<CrmReceivableDO> getReceivablePage(CrmReceivablePageReqVO pageReqVO) { | |
| 135 | - return receivableMapper.selectPage(pageReqVO); | |
| 133 | + public PageResult<CrmReceivableDO> getReceivablePage(CrmReceivablePageReqVO pageReqVO, Long userId) { | |
| 134 | + return receivableMapper.selectPage(pageReqVO, userId); | |
| 136 | 135 | } |
| 137 | 136 | |
| 138 | 137 | @Override |
| 139 | 138 | @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageReqVO.customerId", level = CrmPermissionLevelEnum.READ) |
| 140 | - public PageResult<CrmReceivableDO> getReceivablePageByCustomer(CrmReceivablePageReqVO pageReqVO) { | |
| 141 | - return receivableMapper.selectPageByCustomer(pageReqVO); | |
| 139 | + public PageResult<CrmReceivableDO> getReceivablePageByCustomerId(CrmReceivablePageReqVO pageReqVO) { | |
| 140 | + return receivableMapper.selectPageByCustomerId(pageReqVO); | |
| 142 | 141 | } |
| 143 | 142 | |
| 144 | 143 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmQueryWrapperUtils.java
| ... | ... | @@ -6,6 +6,7 @@ import cn.hutool.extra.spring.SpringUtil; |
| 6 | 6 | import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; |
| 7 | 7 | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; |
| 8 | 8 | import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum; |
| 9 | +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; | |
| 9 | 10 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| 10 | 11 | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| 11 | 12 | import com.baomidou.mybatisplus.core.toolkit.support.SFunction; |
| ... | ... | @@ -17,7 +18,7 @@ import java.util.List; |
| 17 | 18 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 18 | 19 | |
| 19 | 20 | /** |
| 20 | - * CRM 分页查询工具类 | |
| 21 | + * CRM 查询工具类 | |
| 21 | 22 | * |
| 22 | 23 | * @author HUIHUI |
| 23 | 24 | */ |
| ... | ... | @@ -26,17 +27,16 @@ public class CrmQueryWrapperUtils { |
| 26 | 27 | /** |
| 27 | 28 | * 构造 CRM 数据类型数据分页查询条件 |
| 28 | 29 | * |
| 29 | - * @param query 连表查询对象 | |
| 30 | - * @param bizType 数据类型 {@link CrmBizTypeEnum} | |
| 31 | - * @param bizId 数据编号 | |
| 32 | - * @param userId 用户编号 | |
| 33 | - * @param sceneType 场景类型 | |
| 34 | - * @param pool 公海 | |
| 30 | + * @param query 连表查询对象 | |
| 31 | + * @param bizType 数据类型 {@link CrmBizTypeEnum} | |
| 32 | + * @param bizId 数据编号 | |
| 33 | + * @param userId 用户编号 | |
| 34 | + * @param sceneType 场景类型 | |
| 35 | + * @param pool 公海 | |
| 35 | 36 | */ |
| 36 | - // TODO @puhui999:bizId 直接传递会不会简单点 | |
| 37 | - // TODO @puhui999:builderPageQuery 应该不仅仅适合于分页查询,应该适用于所有的查询;可以改成 appendPermissionCondition | |
| 38 | - public static <T extends MPJLambdaWrapper<?>, S> void builderPageQuery(T query, Integer bizType, SFunction<S, ?> bizId, | |
| 39 | - Long userId, Integer sceneType, Boolean pool) { | |
| 37 | + // TODO @puhui999:bizId 直接传递会不会简单点 回复:还是需要 SFunction 因为分页连表时不知道 bizId 是多少 | |
| 38 | + public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId, | |
| 39 | + Long userId, Integer sceneType, Boolean pool) { | |
| 40 | 40 | // 1. 构建数据权限连表条件 |
| 41 | 41 | if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE)) { // 管理员不需要数据权限 |
| 42 | 42 | query.innerJoin(CrmPermissionDO.class, on -> |
| ... | ... | @@ -48,9 +48,13 @@ public class CrmQueryWrapperUtils { |
| 48 | 48 | query.eq("owner_user_id", userId); |
| 49 | 49 | } |
| 50 | 50 | // 2.2 场景二:我参与的数据 |
| 51 | - // TODO @puhui999:参与,指的是有读写权限噢;可以把 1. 的合并到 2.2 里;因为 2.1 不需要; | |
| 52 | 51 | if (CrmSceneTypeEnum.isInvolved(sceneType)) { |
| 53 | - query.ne("owner_user_id", userId); | |
| 52 | + query | |
| 53 | + .ne("owner_user_id", userId) | |
| 54 | + .and(q -> q.eq(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel()) | |
| 55 | + .or() | |
| 56 | + .eq(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.WRITE.getLevel())); | |
| 57 | + | |
| 54 | 58 | } |
| 55 | 59 | // 2.3 场景三:下属负责的数据 |
| 56 | 60 | if (CrmSceneTypeEnum.isSubordinate(sceneType)) { |
| ... | ... | @@ -61,7 +65,7 @@ public class CrmQueryWrapperUtils { |
| 61 | 65 | } |
| 62 | 66 | } |
| 63 | 67 | |
| 64 | - // 2. 拼接公海的查询条件 | |
| 68 | + // 3. 拼接公海的查询条件 | |
| 65 | 69 | if (ObjUtil.equal(pool, Boolean.TRUE)) { // 情况一:公海 |
| 66 | 70 | query.isNull("owner_user_id"); |
| 67 | 71 | } else { // 情况二:不是公海 |
| ... | ... | @@ -72,28 +76,27 @@ public class CrmQueryWrapperUtils { |
| 72 | 76 | /** |
| 73 | 77 | * 构造 CRM 数据类型批量数据查询条件 |
| 74 | 78 | * |
| 75 | - * @param query 连表查询对象 | |
| 76 | - * @param bizType 数据类型 {@link CrmBizTypeEnum} | |
| 77 | - * @param bizIds 数据编号 | |
| 78 | - * @param userId 用户编号 | |
| 79 | + * @param query 连表查询对象 | |
| 80 | + * @param bizType 数据类型 {@link CrmBizTypeEnum} | |
| 81 | + * @param bizIds 数据编号 | |
| 82 | + * @param userId 用户编号 | |
| 79 | 83 | */ |
| 80 | - // TODO @puhui999:可以改成 appendPermissionCondition | |
| 81 | - // TODO @puhui999:S 是不是可以删除 | |
| 82 | - public static <T extends MPJLambdaWrapper<?>, S> void builderListQueryBatch(T query, Integer bizType, Collection<Long> bizIds, Long userId) { | |
| 83 | - // TODO @puhui999:这里先 if return 简单点 | |
| 84 | - if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE)) { // 管理员不需要数据权限 | |
| 85 | - query.innerJoin(CrmPermissionDO.class, on -> | |
| 86 | - on.eq(CrmPermissionDO::getBizType, bizType).in(CrmPermissionDO::getBizId, bizIds) | |
| 87 | - .in(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId)); | |
| 84 | + public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, Integer bizType, Collection<Long> bizIds, Long userId) { | |
| 85 | + if (ObjUtil.equal(validateAdminUser(userId), Boolean.TRUE)) {// 管理员不需要数据权限 | |
| 86 | + return; | |
| 88 | 87 | } |
| 88 | + | |
| 89 | + query.innerJoin(CrmPermissionDO.class, on -> | |
| 90 | + on.eq(CrmPermissionDO::getBizType, bizType).in(CrmPermissionDO::getBizId, bizIds) | |
| 91 | + .in(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId)); | |
| 89 | 92 | } |
| 90 | 93 | |
| 91 | - // TODO @puhui999:需要加个变量,不用每次都拿哈; | |
| 92 | 94 | private static AdminUserApi getAdminUserApi() { |
| 93 | - return SpringUtil.getBean(AdminUserApi.class); | |
| 95 | + return AdminUserApiHolder.ADMIN_USER_API; | |
| 94 | 96 | } |
| 95 | 97 | |
| 96 | 98 | // TODO @puhui999:需要实现; |
| 99 | + | |
| 97 | 100 | /** |
| 98 | 101 | * 校验用户是否是管理员 |
| 99 | 102 | * |
| ... | ... | @@ -104,4 +107,15 @@ public class CrmQueryWrapperUtils { |
| 104 | 107 | return false; |
| 105 | 108 | } |
| 106 | 109 | |
| 110 | + /** | |
| 111 | + * 静态内部类实现 AdminUserApi 单例获取 | |
| 112 | + * | |
| 113 | + * @author HUIHUI | |
| 114 | + */ | |
| 115 | + private static class AdminUserApiHolder { | |
| 116 | + | |
| 117 | + private static final AdminUserApi ADMIN_USER_API = SpringUtil.getBean(AdminUserApi.class); | |
| 118 | + | |
| 119 | + } | |
| 120 | + | |
| 107 | 121 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/receivable/CrmCrmReceivableServiceImplTest.java
| ... | ... | @@ -7,12 +7,11 @@ import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.Crm |
| 7 | 7 | import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableUpdateReqVO; |
| 8 | 8 | import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO; |
| 9 | 9 | import cn.iocoder.yudao.module.crm.dal.mysql.receivable.CrmReceivableMapper; |
| 10 | +import jakarta.annotation.Resource; | |
| 10 | 11 | import org.junit.jupiter.api.Disabled; |
| 11 | 12 | import org.junit.jupiter.api.Test; |
| 12 | 13 | import org.springframework.context.annotation.Import; |
| 13 | 14 | |
| 14 | -import jakarta.annotation.Resource; | |
| 15 | - | |
| 16 | 15 | import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; |
| 17 | 16 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; |
| 18 | 17 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; |
| ... | ... | @@ -133,7 +132,7 @@ public class CrmCrmReceivableServiceImplTest extends BaseDbUnitTest { |
| 133 | 132 | reqVO.setCustomerId(null); |
| 134 | 133 | |
| 135 | 134 | // 调用 |
| 136 | - PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(reqVO); | |
| 135 | + PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(reqVO, 1L); | |
| 137 | 136 | // 断言 |
| 138 | 137 | assertEquals(1, pageResult.getTotal()); |
| 139 | 138 | assertEquals(1, pageResult.getList().size()); | ... | ... |