CRM-商机:完善获取权限过滤后的分页数据

This commit is contained in:
puhui999 2023-11-01 11:28:05 +08:00
parent 91dd61edc0
commit 7a8ffd9ccb
14 changed files with 98 additions and 26 deletions

View File

@ -71,8 +71,7 @@ public class CrmBusinessController {
@Operation(summary = "获得商机分页")
@PreAuthorize("@ss.hasPermission('crm:business:query')")
public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPage(@Valid CrmBusinessPageReqVO pageVO) {
PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(pageVO);
PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(pageVO, getLoginUserId());
return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult));
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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<CrmBusinessDO> {
default PageResult<CrmBusinessDO> selectPage(CrmBusinessPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<CrmBusinessDO>()
default List<CrmBusinessDO> selectList(CrmBusinessPageReqVO reqVO, Collection<Long> ids) {
return selectList(new LambdaQueryWrapperX<CrmBusinessDO>()
.in(CrmBusinessDO::getId, ids)
.likeIfPresent(CrmBusinessDO::getName, reqVO.getName())
.orderByDesc(CrmBusinessDO::getId));
}

View File

@ -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<CrmPermissionDO> {
.eq(CrmPermissionDO::getUserId, userId));
}
default PageResult<CrmPermissionDO> selectPage(CrmPermissionPageReqBO pageReqBO) {
return selectPage(pageReqBO, new LambdaQueryWrapperX<CrmPermissionDO>()
.eq(CrmPermissionDO::getBizType, pageReqBO.getBizType())
.eq(CrmPermissionDO::getUserId, pageReqBO.getUserId())); // 只要是团队成员都有读取的权限
}
}

View File

@ -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())) { // 校验当前用户是否有读权限

View File

@ -58,9 +58,10 @@ public interface CrmBusinessService {
* 获得商机分页
*
* @param pageReqVO 分页查询
* @param userId 用户编号
* @return 商机分页
*/
PageResult<CrmBusinessDO> getBusinessPage(CrmBusinessPageReqVO pageReqVO);
PageResult<CrmBusinessDO> getBusinessPage(CrmBusinessPageReqVO pageReqVO, Long userId);
/**
* 获得商机列表, 用于 Excel 导出

View File

@ -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<CrmBusinessDO> getBusinessPage(CrmBusinessPageReqVO pageReqVO) {
return businessMapper.selectPage(pageReqVO);
public PageResult<CrmBusinessDO> getBusinessPage(CrmBusinessPageReqVO pageReqVO, Long userId) {
// 1. 获取当前用户能看的分页数据
PageResult<CrmPermissionDO> permissionPage = crmPermissionService.getPermissionPage(
CrmBusinessConvert.INSTANCE.convert(pageReqVO).setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()).setUserId(userId));
Set<Long> ids = convertSet(permissionPage.getList(), CrmPermissionDO::getBizId);
if (CollUtil.isEmpty(ids)) { // 没得说明没有什么给他看的
return PageResult.empty();
}
// 2. 获取商机分页数据
List<CrmBusinessDO> 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 记录转移日志

View File

@ -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 记录转移日志

View File

@ -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 记录转移日志

View File

@ -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 记录转移日志

View File

@ -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<CrmPermissionDO> getPermissionByBizTypeAndBizId(Integer bizType, Long bizId);
/**
* 获取数据权限列表通过 数据类型 x 用户编号
*
* @param bizType 数据类型关联 {@link CrmBizTypeEnum}
* @param userId 用户编号
* @return Crm 数据权限列表
*/
List<CrmPermissionDO> getPermissionByBizTypeAndUserId(Integer bizType, Long userId);
/**
* 数据权限转移
*
* @param crmTransferPermissionReqBO 数据权限转移请求
*/
void transferCrmPermission(@Valid CrmTransferPermissionReqBO crmTransferPermissionReqBO);
void transferPermission(@Valid CrmTransferPermissionReqBO crmTransferPermissionReqBO);
/**
* 获取数据权限分页数据
*
* @param pageReqBO 分页请求
* @return 数据权限分页数据
*/
PageResult<CrmPermissionDO> getPermissionPage(CrmPermissionPageReqBO pageReqBO);
}

View File

@ -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<CrmPermissionDO> getPermissionPage(CrmPermissionPageReqBO pageReqBO) {
return crmPermissionMapper.selectPage(pageReqBO);
}
}

View File

@ -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;
}