Commit 794649ea8a55741e43c1e2ac15a687607c7360e9
1 parent
f4c92089
CRM-数据权限:完善团队成员相关操作
Showing
7 changed files
with
103 additions
and
40 deletions
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java
| ... | ... | @@ -28,17 +28,16 @@ import org.springframework.web.bind.annotation.*; |
| 28 | 28 | |
| 29 | 29 | import javax.annotation.Resource; |
| 30 | 30 | import javax.validation.Valid; |
| 31 | -import java.util.Collections; | |
| 32 | -import java.util.List; | |
| 33 | -import java.util.Map; | |
| 34 | -import java.util.Set; | |
| 31 | +import java.util.*; | |
| 35 | 32 | import java.util.function.Predicate; |
| 36 | 33 | import java.util.stream.Collectors; |
| 37 | 34 | |
| 35 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | |
| 38 | 36 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 39 | 37 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch; |
| 40 | 38 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 41 | 39 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| 40 | +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_PERMISSION_NOT_EXISTS; | |
| 42 | 41 | |
| 43 | 42 | @Tag(name = "管理后台 - CRM 数据权限(数据团队成员操作)") |
| 44 | 43 | @RestController |
| ... | ... | @@ -85,12 +84,12 @@ public class CrmPermissionController { |
| 85 | 84 | } |
| 86 | 85 | |
| 87 | 86 | @PutMapping("/update") |
| 88 | - @Operation(summary = "编辑团队成员") | |
| 87 | + @Operation(summary = "编辑团队成员权限") | |
| 89 | 88 | @PreAuthorize("@ss.hasPermission('crm:permission:update')") |
| 90 | 89 | @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#updateReqVO.bizType", bizId = "#updateReqVO.bizId" |
| 91 | - , level = CrmPermissionLevelEnum.WRITE) | |
| 90 | + , level = CrmPermissionLevelEnum.OWNER) | |
| 92 | 91 | public CommonResult<Boolean> updatePermission(@Valid @RequestBody CrmPermissionUpdateReqVO updateReqVO) { |
| 93 | - permissionService.updatePermission(CrmPermissionConvert.INSTANCE.convert(updateReqVO)); | |
| 92 | + permissionService.updatePermission(updateReqVO); | |
| 94 | 93 | return success(true); |
| 95 | 94 | } |
| 96 | 95 | |
| ... | ... | @@ -99,15 +98,33 @@ public class CrmPermissionController { |
| 99 | 98 | @Parameters({ |
| 100 | 99 | @Parameter(name = "bizType", description = "CRM 类型", required = true, example = "2"), |
| 101 | 100 | @Parameter(name = "bizId", description = "CRM 类型数据编号", required = true, example = "1024"), |
| 102 | - @Parameter(name = "id", description = "团队成员编号", required = true, example = "1024") | |
| 101 | + @Parameter(name = "ids", description = "团队成员编号", required = true, example = "1024") | |
| 103 | 102 | }) |
| 104 | 103 | @PreAuthorize("@ss.hasPermission('crm:permission:delete')") |
| 105 | 104 | @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#bizType", bizId = "#bizId" |
| 106 | - , level = CrmPermissionLevelEnum.OWNER) | |
| 105 | + , level = CrmPermissionLevelEnum.OWNER) // 为了校验权限请求必须带上 bizType 和 bizId | |
| 107 | 106 | public CommonResult<Boolean> deletePermission(@RequestParam("bizType") Integer bizType, |
| 108 | 107 | @RequestParam("bizId") Long bizId, |
| 109 | - @RequestParam("id") Long id) { | |
| 110 | - permissionService.deletePermission(id); | |
| 108 | + @RequestParam("ids") Collection<Long> ids) { | |
| 109 | + permissionService.deletePermission(ids); | |
| 110 | + return success(true); | |
| 111 | + } | |
| 112 | + | |
| 113 | + @DeleteMapping("/quit-team") | |
| 114 | + @Operation(summary = "退出团队") | |
| 115 | + @Parameters({ | |
| 116 | + @Parameter(name = "id", description = "团队成员编号", required = true, example = "1024") | |
| 117 | + }) | |
| 118 | + @PreAuthorize("@ss.hasPermission('crm:permission:delete')") | |
| 119 | + public CommonResult<Boolean> deletePermission(@RequestParam("id") Long id) { | |
| 120 | + // 校验数据存在且是自己 | |
| 121 | + CrmPermissionDO permission = permissionService.getPermissionByIdAndUserId(id, getLoginUserId()); | |
| 122 | + if (permission == null) { | |
| 123 | + throw exception(CRM_PERMISSION_NOT_EXISTS); | |
| 124 | + } | |
| 125 | + | |
| 126 | + // 删除 | |
| 127 | + permissionService.deletePermission(Collections.singletonList(id)); | |
| 111 | 128 | return success(true); |
| 112 | 129 | } |
| 113 | 130 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionRespVO.java
| ... | ... | @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.permission.vo; |
| 3 | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | 4 | import lombok.Data; |
| 5 | 5 | |
| 6 | +import java.time.LocalDateTime; | |
| 6 | 7 | import java.util.Set; |
| 7 | 8 | |
| 8 | 9 | @Schema(description = "管理后台 - CRM 数据权限(团队成员) Response VO") |
| ... | ... | @@ -21,4 +22,7 @@ public class CrmPermissionRespVO extends CrmPermissionBaseVO { |
| 21 | 22 | @Schema(description = "岗位名称数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[BOOS,经理]") |
| 22 | 23 | private Set<String> postNames; |
| 23 | 24 | |
| 25 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-01-01 00:00:00") | |
| 26 | + private LocalDateTime createTime; | |
| 27 | + | |
| 24 | 28 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionUpdateReqVO.java
| 1 | 1 | package cn.iocoder.yudao.module.crm.controller.admin.permission.vo; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | +import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; | |
| 5 | +import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; | |
| 3 | 6 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | 7 | import lombok.Data; |
| 5 | -import lombok.EqualsAndHashCode; | |
| 6 | -import lombok.ToString; | |
| 7 | 8 | |
| 8 | 9 | import javax.validation.constraints.NotNull; |
| 10 | +import java.util.List; | |
| 9 | 11 | |
| 10 | 12 | @Schema(description = "管理后台 - CRM 数据权限更新 Request VO") |
| 11 | 13 | @Data |
| 12 | -@EqualsAndHashCode(callSuper = true) | |
| 13 | -@ToString(callSuper = true) | |
| 14 | -public class CrmPermissionUpdateReqVO extends CrmPermissionBaseVO { | |
| 14 | +public class CrmPermissionUpdateReqVO { | |
| 15 | 15 | |
| 16 | - @Schema(description = "数据权限编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | |
| 17 | - @NotNull(message = "数据权限编号不能为空") | |
| 18 | - private Long id; | |
| 16 | + @Schema(description = "数据权限编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2]") | |
| 17 | + @NotNull(message = "数据权限编号列表不能为空") | |
| 18 | + private List<Long> ids; | |
| 19 | 19 | |
| 20 | - // TODO @puhui999:是不是只更新 permission??? 是的 | |
| 20 | + @Schema(description = "Crm 类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | |
| 21 | + @InEnum(CrmBizTypeEnum.class) | |
| 22 | + @NotNull(message = "Crm 类型不能为空") | |
| 23 | + private Integer bizType; | |
| 24 | + | |
| 25 | + @Schema(description = "Crm 类型数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 26 | + @NotNull(message = "Crm 类型数据编号不能为空") | |
| 27 | + private Long bizId; | |
| 28 | + | |
| 29 | + @Schema(description = "权限级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | |
| 30 | + @InEnum(CrmPermissionLevelEnum.class) | |
| 31 | + @NotNull(message = "权限级别不能为空") | |
| 32 | + private Integer level; | |
| 21 | 33 | |
| 22 | 34 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java
| ... | ... | @@ -15,6 +15,7 @@ import com.google.common.collect.Multimaps; |
| 15 | 15 | import org.mapstruct.Mapper; |
| 16 | 16 | import org.mapstruct.factory.Mappers; |
| 17 | 17 | |
| 18 | +import java.util.ArrayList; | |
| 18 | 19 | import java.util.List; |
| 19 | 20 | import java.util.Map; |
| 20 | 21 | |
| ... | ... | @@ -54,4 +55,12 @@ public interface CrmPermissionConvert { |
| 54 | 55 | }); |
| 55 | 56 | } |
| 56 | 57 | |
| 58 | + default List<CrmPermissionDO> convertList(CrmPermissionUpdateReqVO updateReqVO) { | |
| 59 | + List<CrmPermissionDO> permissions = new ArrayList<>(); | |
| 60 | + updateReqVO.getIds().forEach(id -> { | |
| 61 | + permissions.add(new CrmPermissionDO().setId(id).setLevel(updateReqVO.getLevel())); | |
| 62 | + }); | |
| 63 | + return permissions; | |
| 64 | + } | |
| 65 | + | |
| 57 | 66 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java
| ... | ... | @@ -42,4 +42,9 @@ public interface CrmPermissionMapper extends BaseMapperX<CrmPermissionDO> { |
| 42 | 42 | .eq(CrmPermissionDO::getLevel, level)); |
| 43 | 43 | } |
| 44 | 44 | |
| 45 | + default CrmPermissionDO selectByIdAndUserId(Long id, Long userId) { | |
| 46 | + return selectOne(new LambdaQueryWrapperX<CrmPermissionDO>() | |
| 47 | + .eq(CrmPermissionDO::getId, id).eq(CrmPermissionDO::getUserId, userId)); | |
| 48 | + } | |
| 49 | + | |
| 45 | 50 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java
| 1 | 1 | package cn.iocoder.yudao.module.crm.service.permission; |
| 2 | 2 | |
| 3 | 3 | |
| 4 | +import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO; | |
| 4 | 5 | import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; |
| 5 | 6 | import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; |
| 6 | 7 | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; |
| 7 | 8 | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; |
| 8 | -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO; | |
| 9 | 9 | |
| 10 | 10 | import javax.validation.Valid; |
| 11 | 11 | import java.util.Collection; |
| ... | ... | @@ -29,16 +29,16 @@ public interface CrmPermissionService { |
| 29 | 29 | /** |
| 30 | 30 | * 更新数据权限 |
| 31 | 31 | * |
| 32 | - * @param updateBO 更新信息 | |
| 32 | + * @param updateReqVO 更新信息 | |
| 33 | 33 | */ |
| 34 | - void updatePermission(@Valid CrmPermissionUpdateReqBO updateBO); | |
| 34 | + void updatePermission(CrmPermissionUpdateReqVO updateReqVO); | |
| 35 | 35 | |
| 36 | 36 | /** |
| 37 | 37 | * 删除数据权限 |
| 38 | 38 | * |
| 39 | - * @param id 编号 | |
| 39 | + * @param ids 编号 | |
| 40 | 40 | */ |
| 41 | - void deletePermission(Long id); | |
| 41 | + void deletePermission(Collection<Long> ids); | |
| 42 | 42 | |
| 43 | 43 | /** |
| 44 | 44 | * 获取用户数据权限通过 数据类型 x 某个数据 x 用户编号 |
| ... | ... | @@ -51,6 +51,15 @@ public interface CrmPermissionService { |
| 51 | 51 | CrmPermissionDO getPermissionByBizTypeAndBizIdAndUserId(Integer bizType, Long bizId, Long userId); |
| 52 | 52 | |
| 53 | 53 | /** |
| 54 | + * 获取用户数据权限通过 权限编号 x 用户编号 | |
| 55 | + * | |
| 56 | + * @param id 权限编号 | |
| 57 | + * @param userId 用户编号 | |
| 58 | + * @return 数据权限 | |
| 59 | + */ | |
| 60 | + CrmPermissionDO getPermissionByIdAndUserId(Long id, Long userId); | |
| 61 | + | |
| 62 | + /** | |
| 54 | 63 | * 获取数据权限列表,通过 数据类型 x 某个数据 |
| 55 | 64 | * |
| 56 | 65 | * @param bizType 数据类型,关联 {@link CrmBizTypeEnum} | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
| ... | ... | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.service.permission; |
| 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.controller.admin.permission.vo.CrmPermissionUpdateReqVO; | |
| 5 | 6 | import cn.iocoder.yudao.module.crm.convert.permission.CrmPermissionConvert; |
| 6 | 7 | import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; |
| 7 | 8 | import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper; |
| ... | ... | @@ -9,7 +10,6 @@ import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; |
| 9 | 10 | import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; |
| 10 | 11 | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; |
| 11 | 12 | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; |
| 12 | -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO; | |
| 13 | 13 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| 14 | 14 | import org.springframework.stereotype.Service; |
| 15 | 15 | import org.springframework.transaction.annotation.Transactional; |
| ... | ... | @@ -53,25 +53,22 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { |
| 53 | 53 | |
| 54 | 54 | @Override |
| 55 | 55 | @Transactional(rollbackFor = Exception.class) |
| 56 | - public void updatePermission(CrmPermissionUpdateReqBO updateBO) { | |
| 57 | - // 1.1 校验用户是否存在 | |
| 58 | - adminUserApi.validateUserList(Collections.singletonList(updateBO.getUserId())); | |
| 59 | - // 1.2 校验存在 | |
| 60 | - validateCrmPermissionExists(updateBO.getId()); | |
| 61 | - | |
| 62 | - // 2. 更新操作 | |
| 63 | - CrmPermissionDO updateDO = CrmPermissionConvert.INSTANCE.convert(updateBO); | |
| 64 | - crmPermissionMapper.updateById(updateDO); | |
| 56 | + public void updatePermission(CrmPermissionUpdateReqVO updateReqVO) { | |
| 57 | + // 校验存在 | |
| 58 | + validateCrmPermissionExists(updateReqVO.getIds()); | |
| 59 | + | |
| 60 | + List<CrmPermissionDO> updateDO = CrmPermissionConvert.INSTANCE.convertList(updateReqVO); | |
| 61 | + crmPermissionMapper.updateBatch(updateDO); | |
| 65 | 62 | } |
| 66 | 63 | |
| 67 | 64 | @Override |
| 68 | 65 | @Transactional(rollbackFor = Exception.class) |
| 69 | - public void deletePermission(Long id) { | |
| 66 | + public void deletePermission(Collection<Long> ids) { | |
| 70 | 67 | // 校验存在 |
| 71 | - validateCrmPermissionExists(id); | |
| 68 | + validateCrmPermissionExists(ids); | |
| 72 | 69 | |
| 73 | 70 | // 删除 |
| 74 | - crmPermissionMapper.deleteById(id); | |
| 71 | + crmPermissionMapper.deleteBatchIds(ids); | |
| 75 | 72 | } |
| 76 | 73 | |
| 77 | 74 | @Override |
| ... | ... | @@ -80,6 +77,11 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { |
| 80 | 77 | } |
| 81 | 78 | |
| 82 | 79 | @Override |
| 80 | + public CrmPermissionDO getPermissionByIdAndUserId(Long id, Long userId) { | |
| 81 | + return crmPermissionMapper.selectByIdAndUserId(id, userId); | |
| 82 | + } | |
| 83 | + | |
| 84 | + @Override | |
| 83 | 85 | public List<CrmPermissionDO> getPermissionByBizTypeAndBizId(Integer bizType, Long bizId) { |
| 84 | 86 | return crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId); |
| 85 | 87 | } |
| ... | ... | @@ -89,13 +91,16 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { |
| 89 | 91 | return crmPermissionMapper.selectListByBizTypeAndBizIdsAndLevel(bizType, bizIds, level); |
| 90 | 92 | } |
| 91 | 93 | |
| 92 | - private void validateCrmPermissionExists(Long id) { | |
| 93 | - if (crmPermissionMapper.selectById(id) == null) { | |
| 94 | + private void validateCrmPermissionExists(Collection<Long> ids) { | |
| 95 | + List<CrmPermissionDO> permissionList = crmPermissionMapper.selectBatchIds(ids); | |
| 96 | + // 校验存在 | |
| 97 | + if (ObjUtil.notEqual(permissionList.size(), ids.size())) { | |
| 94 | 98 | throw exception(CRM_PERMISSION_NOT_EXISTS); |
| 95 | 99 | } |
| 96 | 100 | } |
| 97 | 101 | |
| 98 | 102 | @Override |
| 103 | + @Transactional(rollbackFor = Exception.class) | |
| 99 | 104 | public void transferPermission(CrmPermissionTransferReqBO transferReqBO) { |
| 100 | 105 | // 1. 校验数据权限-是否是负责人,只有负责人才可以转移 |
| 101 | 106 | CrmPermissionDO oldPermission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(transferReqBO.getBizType(), |
| ... | ... | @@ -142,6 +147,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { |
| 142 | 147 | } |
| 143 | 148 | |
| 144 | 149 | @Override |
| 150 | + @Transactional(rollbackFor = Exception.class) | |
| 145 | 151 | public void receiveBiz(Integer bizType, Long bizId, Long userId) { |
| 146 | 152 | CrmPermissionDO permission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(bizType, bizId, CrmPermissionDO.POOL_USER_ID); |
| 147 | 153 | if (permission == null) { // 不存在则模块数据也不存在 |
| ... | ... | @@ -152,6 +158,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { |
| 152 | 158 | } |
| 153 | 159 | |
| 154 | 160 | @Override |
| 161 | + @Transactional(rollbackFor = Exception.class) | |
| 155 | 162 | public void putPool(Integer bizType, Long bizId, Long userId) { |
| 156 | 163 | CrmPermissionDO permission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(bizType, bizId, userId); |
| 157 | 164 | if (permission == null) { // 不存在则模块数据也不存在 | ... | ... |