Commit 3707662187c718f53ad969e1b876168e1f06b1c2

Authored by YunaiV
1 parent d430063e

📈 CRM:code review 数据权限

Showing 15 changed files with 26 additions and 325 deletions
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
... ... @@ -72,7 +72,4 @@ public interface ErrorCodeConstants {
72 72 // ========== 客户公海规则设置 1_020_012_000 ==========
73 73 ErrorCode CUSTOMER_LIMIT_CONFIG_NOT_EXISTS = new ErrorCode(1_020_012_000, "客户限制配置不存在");
74 74  
75   - // ========== 关注的数据 1_020_013_000 ==========
76   - ErrorCode CRM_CONCERNED_NOT_EXISTS = new ErrorCode(1_020_013_000, "关注数据不存在");
77   -
78 75 }
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneEnum.java
... ... @@ -7,6 +7,7 @@ import lombok.Getter;
7 7  
8 8 import java.util.Arrays;
9 9  
  10 +// TODO @puhui999:这个枚举,要不改成 CrmSceneTypeEnum
10 11 /**
11 12 * CRM 列表检索场景
12 13 *
... ... @@ -18,6 +19,7 @@ public enum CrmSceneEnum implements IntArrayValuable {
18 19  
19 20 OWNER(1, "我负责的"),
20 21 FOLLOW(2, "我关注的"),
  22 + // TODO @puhui999:还有一个我参与的
21 23 SUBORDINATE(3, "下属负责的");
22 24  
23 25 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmSceneEnum::getType).toArray();
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
... ... @@ -139,24 +139,6 @@ public class CrmCustomerController {
139 139 return success(true);
140 140 }
141 141  
142   - @PutMapping("/concern")
143   - @Operation(summary = "关注客户")
144   - @Parameter(name = "ids", description = "编号", required = true, example = "[1024]")
145   - @PreAuthorize("@ss.hasPermission('crm:customer:update')")
146   - public CommonResult<Boolean> concernCustomer(@RequestParam("ids") List<Long> ids) {
147   - customerService.concernCustomer(ids, getLoginUserId());
148   - return success(true);
149   - }
150   -
151   - @PutMapping("/cancel-concern")
152   - @Operation(summary = "取消关注客户")
153   - @Parameter(name = "ids", description = "编号", required = true, example = "[1024]")
154   - @PreAuthorize("@ss.hasPermission('crm:customer:update')")
155   - public CommonResult<Boolean> cancelConcernCustomer(@RequestParam("ids") List<Long> ids) {
156   - customerService.cancelConcernCustomer(ids, getLoginUserId());
157   - return success(true);
158   - }
159   -
160 142 // ==================== 公海相关操作 ====================
161 143  
162 144 @PutMapping("/put-pool")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/concerned/CrmConcernedDO.java deleted
1   -package cn.iocoder.yudao.module.crm.dal.dataobject.concerned;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4   -import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
5   -import com.baomidou.mybatisplus.annotation.KeySequence;
6   -import com.baomidou.mybatisplus.annotation.TableId;
7   -import com.baomidou.mybatisplus.annotation.TableName;
8   -import lombok.*;
9   -
10   -/**
11   - * CRM 关注的数据 DO
12   - *
13   - * @author HUIHUI
14   - */
15   -@TableName("crm_concerned")
16   -@KeySequence("crm_concerned_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
17   -@Data
18   -@EqualsAndHashCode(callSuper = true)
19   -@ToString(callSuper = true)
20   -@Builder
21   -@NoArgsConstructor
22   -@AllArgsConstructor
23   -public class CrmConcernedDO extends BaseDO {
24   -
25   - /**
26   - * 编号,主键自增
27   - */
28   - @TableId
29   - private Long id;
30   -
31   - /**
32   - * 数据类型
33   - *
34   - * 枚举 {@link CrmBizTypeEnum}
35   - */
36   - private Integer bizType;
37   - /**
38   - * 数据编号
39   - *
40   - * 关联 {@link CrmBizTypeEnum} 对应模块 DO 的 id 字段
41   - */
42   - private Long bizId;
43   -
44   - /**
45   - * 用户编号
46   - *
47   - * 关联 AdminUser 的 id 字段
48   - */
49   - private Long userId;
50   -
51   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/concerned/CrmConcernedMapper.java deleted
1   -package cn.iocoder.yudao.module.crm.dal.mysql.concerned;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4   -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5   -import cn.iocoder.yudao.module.crm.dal.dataobject.concerned.CrmConcernedDO;
6   -import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
7   -import org.apache.ibatis.annotations.Mapper;
8   -
9   -import java.util.Collection;
10   -import java.util.List;
11   -
12   -/**
13   - * CRM 关注的数据 Mapper
14   - *
15   - * @author HUIHUI
16   - */
17   -@Mapper
18   -public interface CrmConcernedMapper extends BaseMapperX<CrmConcernedDO> {
19   -
20   - /**
21   - * 查询用户关注的数据
22   - *
23   - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
24   - * @param bizIds 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
25   - * @param userId 用户编号
26   - * @return 关注的数据
27   - */
28   - default List<CrmConcernedDO> selectList(Integer bizType, Collection<Long> bizIds, Long userId) {
29   - return selectList(new LambdaQueryWrapperX<CrmConcernedDO>()
30   - .eq(CrmConcernedDO::getBizType, bizType)
31   - .in(CrmConcernedDO::getBizId, bizIds)
32   - .eq(CrmConcernedDO::getUserId, userId));
33   - }
34   -
35   -}
36 0 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java
... ... @@ -45,14 +45,14 @@ public interface CrmCustomerMapper extends BaseMapperX&lt;CrmCustomerDO&gt; {
45 45 // 构建数据权限连表条件
46 46 CrmQueryPageUtils.builderQuery(mpjLambdaWrapperX, pageReqVO, userId,
47 47 CrmBizTypeEnum.CRM_CUSTOMER.getType(), CrmCustomerDO::getId, subordinateIds, isAdmin);
48   - mpjLambdaWrapperX
49   - .selectAll(CrmCustomerDO.class)
  48 + mpjLambdaWrapperX.selectAll(CrmCustomerDO.class)
50 49 .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName())
51 50 .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile())
52 51 .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId())
53 52 .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel())
54 53 .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource());
55 54 // 特殊:不分页,直接查询全部
  55 + // TODO @puhui999:下面这个,封装一个方法;从 56 到 61 这里哈;
56 56 if (PageParam.PAGE_SIZE_NONE.equals(pageReqVO.getPageNo())) {
57 57 List<CrmCustomerDO> list = selectJoinList(CrmCustomerDO.class, mpjLambdaWrapperX);
58 58 return new PageResult<>(list, (long) list.size());
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/vo/CrmBasePageReqVO.java
... ... @@ -13,9 +13,7 @@ import lombok.EqualsAndHashCode;
13 13 public class CrmBasePageReqVO extends PageParam {
14 14  
15 15 /**
16   - * 场景类型, 为 null 时则表示全部
17   - *
18   - * 关联 {@link CrmSceneEnum}
  16 + * 场景类型,为 null 时则表示全部
19 17 */
20 18 @Schema(description = "场景类型", example = "1")
21 19 @InEnum(CrmSceneEnum.class)
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/concerned/CrmConcernedService.java deleted
1   -package cn.iocoder.yudao.module.crm.service.concerned;
2   -
3   -import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
4   -import cn.iocoder.yudao.module.crm.service.concerned.bo.CrmConcernedCreateReqBO;
5   -
6   -import javax.validation.Valid;
7   -import java.util.Collection;
8   -
9   -/**
10   - * CRM 关注的数据 Service 接口
11   - *
12   - * @author HUIHUI
13   - */
14   -public interface CrmConcernedService {
15   -
16   - /**
17   - * 创建关注数据
18   - *
19   - * @param createReqBO 创建请求
20   - * @return 编号
21   - */
22   - Long createConcerned(@Valid CrmConcernedCreateReqBO createReqBO);
23   -
24   - /**
25   - * 批量创建关注数据
26   - *
27   - * @param createReqBO 创建请求
28   - */
29   - void createConcernedBatch(@Valid Collection<CrmConcernedCreateReqBO> createReqBO);
30   -
31   - /**
32   - * 删除关注数据
33   - *
34   - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
35   - * @param bizIds 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
36   - * @param userId 用户编号
37   - */
38   - void deleteConcerned(Integer bizType, Collection<Long> bizIds, Long userId);
39   -
40   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/concerned/CrmConcernedServiceImpl.java deleted
1   -package cn.iocoder.yudao.module.crm.service.concerned;
2   -
3   -import cn.hutool.core.util.ObjUtil;
4   -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5   -import cn.iocoder.yudao.module.crm.dal.dataobject.concerned.CrmConcernedDO;
6   -import cn.iocoder.yudao.module.crm.dal.mysql.concerned.CrmConcernedMapper;
7   -import cn.iocoder.yudao.module.crm.service.concerned.bo.CrmConcernedCreateReqBO;
8   -import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
9   -import org.springframework.stereotype.Service;
10   -import org.springframework.transaction.annotation.Transactional;
11   -import org.springframework.validation.annotation.Validated;
12   -
13   -import javax.annotation.Resource;
14   -import java.util.Collection;
15   -import java.util.Collections;
16   -import java.util.List;
17   -
18   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
19   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
20   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
21   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_CONCERNED_NOT_EXISTS;
22   -
23   -/**
24   - * CRM 关注的数据 Service 接口实现类
25   - *
26   - * @author HUIHUI
27   - */
28   -@Service
29   -@Validated
30   -public class CrmConcernedServiceImpl implements CrmConcernedService {
31   -
32   - @Resource
33   - private CrmConcernedMapper concernedMapper;
34   - @Resource
35   - private AdminUserApi adminUserApi;
36   -
37   - @Override
38   - @Transactional(rollbackFor = Exception.class)
39   - public Long createConcerned(CrmConcernedCreateReqBO createReqBO) {
40   - // 1. 校验用户是否存在
41   - adminUserApi.validateUserList(Collections.singletonList(createReqBO.getUserId()));
42   -
43   - // 2. 创建
44   - CrmConcernedDO concerned = BeanUtils.toBean(createReqBO, CrmConcernedDO.class);
45   - concernedMapper.insert(concerned);
46   - return concerned.getId();
47   - }
48   -
49   - @Override
50   - public void createConcernedBatch(Collection<CrmConcernedCreateReqBO> createReqBO) {
51   - // 1. 校验用户是否存在
52   - adminUserApi.validateUserList(convertSet(createReqBO, CrmConcernedCreateReqBO::getUserId));
53   -
54   - // 2. 创建
55   - List<CrmConcernedDO> concernedList = convertList(createReqBO, item -> BeanUtils.toBean(item, CrmConcernedDO.class));
56   - concernedMapper.insertBatch(concernedList);
57   - }
58   -
59   - @Override
60   - public void deleteConcerned(Integer bizType, Collection<Long> bizIds, Long userId) {
61   - // 1. 查询关注数据
62   - List<CrmConcernedDO> concernedList = concernedMapper.selectList(bizType, bizIds, userId);
63   - if (ObjUtil.notEqual(bizIds.size(), concernedList.size())) {
64   - throw exception(CRM_CONCERNED_NOT_EXISTS);
65   - }
66   -
67   - // 2. 删除
68   - concernedMapper.deleteBatchIds(convertList(concernedList, CrmConcernedDO::getId));
69   - }
70   -
71   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/concerned/bo/CrmConcernedCreateReqBO.java deleted
1   -package cn.iocoder.yudao.module.crm.service.concerned.bo;
2   -
3   -import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
5   -import lombok.Data;
6   -
7   -import javax.validation.constraints.NotNull;
8   -
9   -/**
10   - * CRM 关注的数据 Create Req BO
11   - *
12   - * @author HUIHUI
13   - */
14   -@Data
15   -public class CrmConcernedCreateReqBO {
16   -
17   - /**
18   - * 当前登录用户编号
19   - */
20   - @NotNull(message = "用户编号不能为空")
21   - private Long userId;
22   -
23   - /**
24   - * Crm 类型
25   - */
26   - @NotNull(message = "Crm 类型不能为空")
27   - @InEnum(CrmBizTypeEnum.class)
28   - private Integer bizType;
29   - /**
30   - * 数据编号
31   - */
32   - @NotNull(message = "Crm 数据编号不能为空")
33   - private Long bizId;
34   -
35   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java
... ... @@ -90,22 +90,6 @@ public interface CrmCustomerService {
90 90 */
91 91 void lockCustomer(@Valid CrmCustomerUpdateReqVO updateReqVO);
92 92  
93   - /**
94   - * 关注客户
95   - *
96   - * @param ids 客户编号
97   - * @param userId 用户编号
98   - */
99   - void concernCustomer(List<Long> ids, Long userId);
100   -
101   - /**
102   - * 取消关注客户
103   - *
104   - * @param ids 客户编号
105   - * @param userId 用户编号
106   - */
107   - void cancelConcernCustomer(List<Long> ids, Long userId);
108   -
109 93 // ==================== 公海相关操作 ====================
110 94  
111 95 /**
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
1 1 package cn.iocoder.yudao.module.crm.service.customer;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.util.ObjUtil;
5 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 5 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerCreateReqVO;
8 6 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO;
9 7 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO;
... ... @@ -14,8 +12,6 @@ import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper;
14 12 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
15 13 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
16 14 import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
17   -import cn.iocoder.yudao.module.crm.service.concerned.CrmConcernedService;
18   -import cn.iocoder.yudao.module.crm.service.concerned.bo.CrmConcernedCreateReqBO;
19 15 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
20 16 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
21 17 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
... ... @@ -27,7 +23,6 @@ import javax.annotation.Resource;
27 23 import java.util.*;
28 24  
29 25 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
30   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
31 26 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
32 27 import static java.util.Collections.singletonList;
33 28  
... ... @@ -47,9 +42,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
47 42 private CrmPermissionService crmPermissionService;
48 43  
49 44 @Resource
50   - private CrmConcernedService crmConcernedService;
51   -
52   - @Resource
53 45 private AdminUserApi adminUserApi;
54 46  
55 47 @Override
... ... @@ -156,33 +148,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
156 148 }
157 149  
158 150 @Override
159   - public void concernCustomer(List<Long> ids, Long userId) {
160   - // 1. 校验客户是否存在
161   - validateCustomerExists(ids);
162   -
163   - // 2. 创建关注
164   - List<CrmConcernedCreateReqBO> createReqBOs = BeanUtils.toBean(convertList(ids, id -> new CrmConcernedCreateReqBO()
165   - .setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()).setBizId(id).setUserId(userId)), CrmConcernedCreateReqBO.class);
166   - crmConcernedService.createConcernedBatch(createReqBOs);
167   - }
168   -
169   - @Override
170   - public void cancelConcernCustomer(List<Long> ids, Long userId) {
171   - // 1. 校验客户是否存在
172   - validateCustomerExists(ids);
173   -
174   - // 2. 取消关注
175   - crmConcernedService.deleteConcerned(CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, userId);
176   - }
177   -
178   - private void validateCustomerExists(List<Long> ids) {
179   - List<CrmCustomerDO> customerList = customerMapper.selectBatchIds(ids);
180   - if (ObjUtil.notEqual(ids.size(), customerList.size())) {
181   - throw exception(CUSTOMER_NOT_EXISTS);
182   - }
183   - }
184   -
185   - @Override
186 151 @Transactional(rollbackFor = Exception.class)
187 152 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
188 153 public void putCustomerPool(Long id) {
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmQueryPageUtils.java
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.crm.util;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.ObjUtil;
5   -import cn.iocoder.yudao.module.crm.dal.dataobject.concerned.CrmConcernedDO;
6 5 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
7 6 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
8 7 import cn.iocoder.yudao.module.crm.enums.common.CrmSceneEnum;
... ... @@ -20,8 +19,9 @@ import java.util.Collection;
20 19 */
21 20 public class CrmQueryPageUtils {
22 21  
  22 + // TODO @puhui999:是不是弱化 CrmBasePageReqVO,把 sceneType 作为参数传入。默认其实 pool 不一定要传递的
23 23 /**
24   - * 构造 crm 数据类型数据分页查询条件
  24 + * 构造 CRM 数据类型数据分页查询条件
25 25 *
26 26 * @param queryMapper 连表查询对象
27 27 * @param reqVO 查询条件
... ... @@ -30,31 +30,34 @@ public class CrmQueryPageUtils {
30 30 * @param bizId 数据编号
31 31 * @param subordinateIds 下属用户编号,可为空
32 32 */
33   - public static <T extends MPJLambdaWrapper<?>, V extends CrmBasePageReqVO, S> void builderQuery(T queryMapper, V reqVO, Long userId,
34   - Integer bizType, SFunction<S, ?> bizId,
35   - @Nullable Collection<Long> subordinateIds,
36   - Boolean isAdmin) {
37   - // 构建数据权限连表条件
  33 + public static <T extends MPJLambdaWrapper<?>, V extends CrmBasePageReqVO, S> void builderQuery(
  34 + T queryMapper, V reqVO, Long userId,
  35 + Integer bizType, SFunction<S, ?> bizId,
  36 + @Nullable Collection<Long> subordinateIds, // TODO @puhui999:subordinateIds 可以优化成 subordinateUserIds
  37 + Boolean isAdmin) {
  38 + // TODO @puhui999:是不是特殊处理,让这个 util 有状态,这样 isAdmin 直接从这里读取;subordinateIds 也是;这样,可以简化参数;
  39 + // 1. 构建数据权限连表条件
38 40 if (ObjUtil.notEqual(isAdmin, Boolean.TRUE)) { // 管理员不需要数据权限
39 41 queryMapper.innerJoin(CrmPermissionDO.class, on ->
40 42 on.eq(CrmPermissionDO::getBizType, bizType).eq(CrmPermissionDO::getBizId, bizId)
41 43 .eq(CrmPermissionDO::getUserId, userId));
42 44 }
  45 + // 2. 拼接公海的查询条件
43 46 if (ObjUtil.equal(reqVO.getPool(), Boolean.TRUE)) { // 情况一:公海
44 47 queryMapper.isNull("owner_user_id");
45 48 } else { // 情况二:不是公海
46 49 queryMapper.isNotNull("owner_user_id");
47 50 }
48   - // 场景数据过滤
  51 + // 3. 拼接场景的查询条件
  52 + // TODO @puhui999::1 处的数据权限,应该和 3 处的场景是结合的?
  53 + // null 时:一种处理
  54 + // 1:一种条件;
  55 + // 2:一种条件;
  56 + // 3:一种条件;
49 57 if (CrmSceneEnum.isOwner(reqVO.getSceneType())) { // 场景一:我负责的数据
50 58 queryMapper.eq("owner_user_id", userId);
51 59 }
52   - if (CrmSceneEnum.isFollow(reqVO.getSceneType())) { // 场景二:我关注的数据
53   - queryMapper.innerJoin(CrmConcernedDO.class, on ->
54   - on.eq(CrmConcernedDO::getBizType, bizType).eq(CrmConcernedDO::getBizId, bizId)
55   - .eq(CrmConcernedDO::getUserId, userId));
56   - }
57   - // TODO puhui999: 这里有一个疑问:如果下属负责的数据权限中没有自己的话还能看吗?
  60 + // TODO puhui999: 这里有一个疑问:如果下属负责的数据权限中没有自己的话还能看吗?回复:不能
58 61 if (CrmSceneEnum.isSubordinate(reqVO.getSceneType()) && CollUtil.isNotEmpty(subordinateIds)) { // 场景三:下属负责的数据
59 62 queryMapper.in("owner_user_id", subordinateIds);
60 63 }
... ...
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java
... ... @@ -23,6 +23,7 @@ public interface AdminUserApi {
23 23 */
24 24 AdminUserRespDTO getUser(Long id);
25 25  
  26 + // TODO @puhui999:这里返回 List<AdminUserRespDTO> 方法名可以改成 getUserListBySubordinate
26 27 /**
27 28 * 通过用户 ID 查询用户下属
28 29 *
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java
1 1 package cn.iocoder.yudao.module.system.api.user;
2 2  
3   -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
4 3 import cn.hutool.core.util.ObjUtil;
  4 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 5 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
6   -import cn.iocoder.yudao.module.system.convert.user.UserConvert;
7 6 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
8 7 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
9 8 import cn.iocoder.yudao.module.system.service.dept.DeptService;
... ... @@ -46,6 +45,8 @@ public class AdminUserApiImpl implements AdminUserApi {
46 45  
47 46 Set<Long> subordinateIds = null; // 下属用户编号
48 47 DeptDO dept = deptService.getDept(user.getDeptId());
  48 + // TODO @puhui999:需要递归查询到子部门;并且要排除到自己噢。
  49 + // TODO @puhui999:保持 if return 原则,这里其实要判断不等于,则返回 null;最好返回 空集合,上面也是
49 50 if (ObjUtil.equal(dept.getLeaderUserId(), id)) { // 校验是否是该部门的负责人
50 51 List<AdminUserDO> users = userService.getUserListByDeptIds(Collections.singletonList(dept.getId()));
51 52 subordinateIds = convertSet(users, AdminUserDO::getId);
... ...