crm:完善一些遗留的 TODO

This commit is contained in:
puhui999 2023-12-23 20:10:40 +08:00
parent a05d3bc1d1
commit e8ade5f1fe
6 changed files with 68 additions and 52 deletions

View File

@ -129,6 +129,10 @@ public class OperateLogV2Aspect {
if (EXTRA.get() != null && EXTRA.get().get(ENABLE) != null) { if (EXTRA.get() != null && EXTRA.get().get(ENABLE) != null) {
return; return;
} }
if (CONTENT.get() == null) { // 没有值说明没有日志需要记录
return;
}
// 真正记录操作日志 // 真正记录操作日志
this.log0(joinPoint, operation, startTime, result, exception); this.log0(joinPoint, operation, startTime, result, exception);
} catch (Throwable ex) { } catch (Throwable ex) {
@ -146,7 +150,7 @@ public class OperateLogV2Aspect {
// 补充用户信息 // 补充用户信息
fillUserFields(reqDTO); fillUserFields(reqDTO);
// 补全模块信息 // 补全模块信息
fillModuleFields(reqDTO, joinPoint, operation); fillModuleFields(reqDTO, operation);
// 补全请求信息 // 补全请求信息
fillRequestFields(reqDTO); fillRequestFields(reqDTO);
// 补全方法信息 // 补全方法信息
@ -161,7 +165,7 @@ public class OperateLogV2Aspect {
reqDTO.setUserType(WebFrameworkUtils.getLoginUserType()); reqDTO.setUserType(WebFrameworkUtils.getLoginUserType());
} }
private static void fillModuleFields(OperateLogV2CreateReqDTO reqDTO, ProceedingJoinPoint joinPoint, Operation operation) { private static void fillModuleFields(OperateLogV2CreateReqDTO reqDTO, Operation operation) {
LogRecord logRecord = CONTENT.get(); LogRecord logRecord = CONTENT.get();
reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 操作模块业务编号 reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 操作模块业务编号
reqDTO.setContent(logRecord.getAction());// 例如说修改编号为 1 的用户信息将性别从男改成女将姓名从芋道改成源码 reqDTO.setContent(logRecord.getAction());// 例如说修改编号为 1 的用户信息将性别从男改成女将姓名从芋道改成源码

View File

@ -3,16 +3,14 @@ package cn.iocoder.yudao.module.crm.framework.permission.core.aop;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionRoleCodeEnum;
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission; import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionUtils;
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.JoinPoint;
@ -52,7 +50,7 @@ public class CrmPermissionAspect {
Integer permissionLevel = crmPermission.level().getLevel(); // 需要的权限级别 Integer permissionLevel = crmPermission.level().getLevel(); // 需要的权限级别
// 1.1 如果是超级管理员则直接通过 // 1.1 如果是超级管理员则直接通过
if (validateAdminUser(getUserId())) { if (CrmPermissionUtils.validateAdminUser()) {
return; return;
} }
// 1.2 获取数据权限 // 1.2 获取数据权限
@ -120,29 +118,4 @@ public class CrmPermissionAspect {
return SpringExpressionUtils.parseExpressions(joinPoint, expressionStrings); return SpringExpressionUtils.parseExpressions(joinPoint, expressionStrings);
} }
/**
* 校验用户是否是 CRM 管理员
*
* @param userId 用户编号
* @return /
*/
private static boolean validateAdminUser(Long userId) {
return SingletonManager.getPermissionApi().hasAnyRoles(userId, CrmPermissionRoleCodeEnum.CRM_ADMIN.getCode());
}
/**
* 静态内部类实现单例获取
*
* @author HUIHUI
*/
private static class SingletonManager {
private static final PermissionApi PERMISSION_API = SpringUtil.getBean(PermissionApi.class);
public static PermissionApi getPermissionApi() {
return PERMISSION_API;
}
}
} }

View File

@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.crm.framework.permission.core.util;
import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionRoleCodeEnum;
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
/**
* 数据权限工具类
*
* @author HUIHUI
*/
public class CrmPermissionUtils {
/**
* 校验用户是否是 CRM 管理员
*
* @return /
*/
public static boolean validateAdminUser() {
return SingletonManager.getPermissionApi().hasAnyRoles(getUserId(), CrmPermissionRoleCodeEnum.CRM_ADMIN.getCode());
}
/**
* 获得用户编号
*
* @return 用户编号
*/
private static Long getUserId() {
return WebFrameworkUtils.getLoginUserId();
}
/**
* 静态内部类实现单例获取
*
* @author HUIHUI
*/
private static class SingletonManager {
private static final PermissionApi PERMISSION_API = SpringUtil.getBean(PermissionApi.class);
public static PermissionApi getPermissionApi() {
return PERMISSION_API;
}
}
}

View File

@ -53,6 +53,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@LogRecord(type = CRM_CUSTOMER, bizNo = "{{#customerId}}", success = "创建了客户")
public Long createCustomer(CrmCustomerCreateReqVO createReqVO, Long userId) { public Long createCustomer(CrmCustomerCreateReqVO createReqVO, Long userId) {
// 插入 // 插入
CrmCustomerDO customer = CrmCustomerConvert.INSTANCE.convert(createReqVO); CrmCustomerDO customer = CrmCustomerConvert.INSTANCE.convert(createReqVO);
@ -61,6 +62,9 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
// 创建数据权限 // 创建数据权限
crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()) crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType())
.setBizId(customer.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人 .setBizId(customer.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人
// 添加日志上下文所需
LogRecordContext.putVariable("customerId", customer.getId());
return customer.getId(); return customer.getId();
} }
@ -85,6 +89,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@LogRecord(type = CRM_CUSTOMER, bizNo = "{{#id}}", success = "删除了客户")
@CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
public void deleteCustomer(Long id) { public void deleteCustomer(Long id) {
// 校验存在 // 校验存在
@ -152,6 +157,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
} }
@Override @Override
@LogRecord(type = CRM_CUSTOMER, bizNo = "{{#updateReqVO.id}}", success = "锁定了客户")
public void lockCustomer(CrmCustomerUpdateReqVO updateReqVO) { public void lockCustomer(CrmCustomerUpdateReqVO updateReqVO) {
// 校验存在 // 校验存在
validateCustomerExists(updateReqVO.getId()); validateCustomerExists(updateReqVO.getId());
@ -165,6 +171,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@LogRecord(type = CRM_CUSTOMER, bizNo = "{{#id}}", success = "将客户放入了公海")
@CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
public void putCustomerPool(Long id) { public void putCustomerPool(Long id) {
// 1. 校验存在 // 1. 校验存在

View File

@ -8,6 +8,7 @@ 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.dal.mysql.permission.CrmPermissionMapper;
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionUtils;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@ -89,8 +90,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
CrmPermissionDO oldPermission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId( CrmPermissionDO oldPermission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(
transferReqBO.getBizType(), transferReqBO.getBizId(), transferReqBO.getUserId()); transferReqBO.getBizType(), transferReqBO.getBizId(), transferReqBO.getUserId());
String bizTypeName = CrmBizTypeEnum.getNameByType(transferReqBO.getBizType()); String bizTypeName = CrmBizTypeEnum.getNameByType(transferReqBO.getBizType());
// TODO 校验是否为超级管理员 || 1 if (oldPermission == null || !isOwner(oldPermission.getLevel()) || !CrmPermissionUtils.validateAdminUser()) {
if (oldPermission == null || !isOwner(oldPermission.getLevel())) {
throw exception(CRM_PERMISSION_DENIED, bizTypeName); throw exception(CRM_PERMISSION_DENIED, bizTypeName);
} }
// 1.1 校验转移对象是否已经是该负责人 // 1.1 校验转移对象是否已经是该负责人

View File

@ -7,8 +7,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum; import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionRoleCodeEnum; import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionUtils;
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
@ -41,7 +40,7 @@ public class CrmQueryWrapperUtils {
Long userId, Integer sceneType, Boolean pool) { Long userId, Integer sceneType, Boolean pool) {
final String ownerUserIdField = SingletonManager.getMybatisPlusJoinProperties().getTableAlias() + ".owner_user_id"; final String ownerUserIdField = SingletonManager.getMybatisPlusJoinProperties().getTableAlias() + ".owner_user_id";
// 1. 构建数据权限连表条件 // 1. 构建数据权限连表条件
if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE) && ObjUtil.notEqual(pool, Boolean.TRUE)) { // 管理员公海不需要数据权限 if (ObjUtil.notEqual(CrmPermissionUtils.validateAdminUser(), Boolean.TRUE) && ObjUtil.notEqual(pool, Boolean.TRUE)) { // 管理员公海不需要数据权限
query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType) query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType)
.eq(CrmPermissionDO::getBizId, bizId) // 只能使用 SFunction 如果传 id 解析出来的 sql 不对 .eq(CrmPermissionDO::getBizId, bizId) // 只能使用 SFunction 如果传 id 解析出来的 sql 不对
.eq(CrmPermissionDO::getUserId, userId)); .eq(CrmPermissionDO::getUserId, userId));
@ -82,7 +81,7 @@ public class CrmQueryWrapperUtils {
* @param userId 用户编号 * @param userId 用户编号
*/ */
public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, Integer bizType, Collection<Long> bizIds, Long userId) { public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, Integer bizType, Collection<Long> bizIds, Long userId) {
if (ObjUtil.equal(validateAdminUser(userId), Boolean.TRUE)) {// 管理员不需要数据权限 if (ObjUtil.equal(CrmPermissionUtils.validateAdminUser(), Boolean.TRUE)) {// 管理员不需要数据权限
return; return;
} }
@ -91,16 +90,6 @@ public class CrmQueryWrapperUtils {
.in(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId)); .in(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId));
} }
/**
* 校验用户是否是 CRM 管理员
*
* @param userId 用户编号
* @return /
*/
private static boolean validateAdminUser(Long userId) {
return SingletonManager.getPermissionApi().hasAnyRoles(userId, CrmPermissionRoleCodeEnum.CRM_ADMIN.getCode());
}
/** /**
* 静态内部类实现单例获取 * 静态内部类实现单例获取
* *
@ -109,17 +98,12 @@ public class CrmQueryWrapperUtils {
private static class SingletonManager { private static class SingletonManager {
private static final AdminUserApi ADMIN_USER_API = SpringUtil.getBean(AdminUserApi.class); private static final AdminUserApi ADMIN_USER_API = SpringUtil.getBean(AdminUserApi.class);
private static final PermissionApi PERMISSION_API = SpringUtil.getBean(PermissionApi.class);
private static final MybatisPlusJoinProperties MYBATIS_PLUS_JOIN_PROPERTIES = SpringUtil.getBean(MybatisPlusJoinProperties.class); private static final MybatisPlusJoinProperties MYBATIS_PLUS_JOIN_PROPERTIES = SpringUtil.getBean(MybatisPlusJoinProperties.class);
public static AdminUserApi getAdminUserApi() { public static AdminUserApi getAdminUserApi() {
return ADMIN_USER_API; return ADMIN_USER_API;
} }
public static PermissionApi getPermissionApi() {
return PERMISSION_API;
}
public static MybatisPlusJoinProperties getMybatisPlusJoinProperties() { public static MybatisPlusJoinProperties getMybatisPlusJoinProperties() {
return MYBATIS_PLUS_JOIN_PROPERTIES; return MYBATIS_PLUS_JOIN_PROPERTIES;
} }