Commit e8ade5f1fe36f1a7102822b5ed3e7b2444711174

Authored by puhui999
1 parent a05d3bc1

crm:完善一些遗留的 TODO

yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelogv2/core/aop/OperateLogV2Aspect.java
@@ -129,6 +129,10 @@ public class OperateLogV2Aspect { @@ -129,6 +129,10 @@ public class OperateLogV2Aspect {
129 if (EXTRA.get() != null && EXTRA.get().get(ENABLE) != null) { 129 if (EXTRA.get() != null && EXTRA.get().get(ENABLE) != null) {
130 return; 130 return;
131 } 131 }
  132 + if (CONTENT.get() == null) { // 没有值说明没有日志需要记录
  133 + return;
  134 + }
  135 +
132 // 真正记录操作日志 136 // 真正记录操作日志
133 this.log0(joinPoint, operation, startTime, result, exception); 137 this.log0(joinPoint, operation, startTime, result, exception);
134 } catch (Throwable ex) { 138 } catch (Throwable ex) {
@@ -146,7 +150,7 @@ public class OperateLogV2Aspect { @@ -146,7 +150,7 @@ public class OperateLogV2Aspect {
146 // 补充用户信息 150 // 补充用户信息
147 fillUserFields(reqDTO); 151 fillUserFields(reqDTO);
148 // 补全模块信息 152 // 补全模块信息
149 - fillModuleFields(reqDTO, joinPoint, operation); 153 + fillModuleFields(reqDTO, operation);
150 // 补全请求信息 154 // 补全请求信息
151 fillRequestFields(reqDTO); 155 fillRequestFields(reqDTO);
152 // 补全方法信息 156 // 补全方法信息
@@ -161,7 +165,7 @@ public class OperateLogV2Aspect { @@ -161,7 +165,7 @@ public class OperateLogV2Aspect {
161 reqDTO.setUserType(WebFrameworkUtils.getLoginUserType()); 165 reqDTO.setUserType(WebFrameworkUtils.getLoginUserType());
162 } 166 }
163 167
164 - private static void fillModuleFields(OperateLogV2CreateReqDTO reqDTO, ProceedingJoinPoint joinPoint, Operation operation) { 168 + private static void fillModuleFields(OperateLogV2CreateReqDTO reqDTO, Operation operation) {
165 LogRecord logRecord = CONTENT.get(); 169 LogRecord logRecord = CONTENT.get();
166 reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 操作模块业务编号 170 reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 操作模块业务编号
167 reqDTO.setContent(logRecord.getAction());// 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。 171 reqDTO.setContent(logRecord.getAction());// 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/aop/CrmPermissionAspect.java
@@ -3,16 +3,14 @@ package cn.iocoder.yudao.module.crm.framework.permission.core.aop; @@ -3,16 +3,14 @@ package cn.iocoder.yudao.module.crm.framework.permission.core.aop;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjUtil; 4 import cn.hutool.core.util.ObjUtil;
5 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
6 -import cn.hutool.extra.spring.SpringUtil;  
7 import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; 6 import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils;
8 import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; 7 import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
9 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; 8 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
10 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; 9 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
11 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; 10 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
12 -import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionRoleCodeEnum;  
13 import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission; 11 import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
  12 +import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionUtils;
14 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; 13 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
15 -import cn.iocoder.yudao.module.system.api.permission.PermissionApi;  
16 import jakarta.annotation.Resource; 14 import jakarta.annotation.Resource;
17 import lombok.extern.slf4j.Slf4j; 15 import lombok.extern.slf4j.Slf4j;
18 import org.aspectj.lang.JoinPoint; 16 import org.aspectj.lang.JoinPoint;
@@ -52,7 +50,7 @@ public class CrmPermissionAspect { @@ -52,7 +50,7 @@ public class CrmPermissionAspect {
52 Integer permissionLevel = crmPermission.level().getLevel(); // 需要的权限级别 50 Integer permissionLevel = crmPermission.level().getLevel(); // 需要的权限级别
53 51
54 // 1.1 如果是超级管理员则直接通过 52 // 1.1 如果是超级管理员则直接通过
55 - if (validateAdminUser(getUserId())) { 53 + if (CrmPermissionUtils.validateAdminUser()) {
56 return; 54 return;
57 } 55 }
58 // 1.2 获取数据权限 56 // 1.2 获取数据权限
@@ -120,29 +118,4 @@ public class CrmPermissionAspect { @@ -120,29 +118,4 @@ public class CrmPermissionAspect {
120 return SpringExpressionUtils.parseExpressions(joinPoint, expressionStrings); 118 return SpringExpressionUtils.parseExpressions(joinPoint, expressionStrings);
121 } 119 }
122 120
123 - /**  
124 - * 校验用户是否是 CRM 管理员  
125 - *  
126 - * @param userId 用户编号  
127 - * @return 是/否  
128 - */  
129 - private static boolean validateAdminUser(Long userId) {  
130 - return SingletonManager.getPermissionApi().hasAnyRoles(userId, CrmPermissionRoleCodeEnum.CRM_ADMIN.getCode());  
131 - }  
132 -  
133 - /**  
134 - * 静态内部类实现单例获取  
135 - *  
136 - * @author HUIHUI  
137 - */  
138 - private static class SingletonManager {  
139 -  
140 - private static final PermissionApi PERMISSION_API = SpringUtil.getBean(PermissionApi.class);  
141 -  
142 - public static PermissionApi getPermissionApi() {  
143 - return PERMISSION_API;  
144 - }  
145 -  
146 - }  
147 -  
148 } 121 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/util/CrmPermissionUtils.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.framework.permission.core.util;
  2 +
  3 +import cn.hutool.extra.spring.SpringUtil;
  4 +import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
  5 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionRoleCodeEnum;
  6 +import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
  7 +
  8 +/**
  9 + * 数据权限工具类
  10 + *
  11 + * @author HUIHUI
  12 + */
  13 +public class CrmPermissionUtils {
  14 +
  15 + /**
  16 + * 校验用户是否是 CRM 管理员
  17 + *
  18 + * @return 是/否
  19 + */
  20 + public static boolean validateAdminUser() {
  21 + return SingletonManager.getPermissionApi().hasAnyRoles(getUserId(), CrmPermissionRoleCodeEnum.CRM_ADMIN.getCode());
  22 + }
  23 +
  24 + /**
  25 + * 获得用户编号
  26 + *
  27 + * @return 用户编号
  28 + */
  29 + private static Long getUserId() {
  30 + return WebFrameworkUtils.getLoginUserId();
  31 + }
  32 +
  33 + /**
  34 + * 静态内部类实现单例获取
  35 + *
  36 + * @author HUIHUI
  37 + */
  38 + private static class SingletonManager {
  39 +
  40 + private static final PermissionApi PERMISSION_API = SpringUtil.getBean(PermissionApi.class);
  41 +
  42 + public static PermissionApi getPermissionApi() {
  43 + return PERMISSION_API;
  44 + }
  45 +
  46 + }
  47 +
  48 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
@@ -53,6 +53,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @@ -53,6 +53,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
53 53
54 @Override 54 @Override
55 @Transactional(rollbackFor = Exception.class) 55 @Transactional(rollbackFor = Exception.class)
  56 + @LogRecord(type = CRM_CUSTOMER, bizNo = "{{#customerId}}", success = "创建了客户")
56 public Long createCustomer(CrmCustomerCreateReqVO createReqVO, Long userId) { 57 public Long createCustomer(CrmCustomerCreateReqVO createReqVO, Long userId) {
57 // 插入 58 // 插入
58 CrmCustomerDO customer = CrmCustomerConvert.INSTANCE.convert(createReqVO); 59 CrmCustomerDO customer = CrmCustomerConvert.INSTANCE.convert(createReqVO);
@@ -61,6 +62,9 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @@ -61,6 +62,9 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
61 // 创建数据权限 62 // 创建数据权限
62 crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()) 63 crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType())
63 .setBizId(customer.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人 64 .setBizId(customer.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人
  65 +
  66 + // 添加日志上下文所需
  67 + LogRecordContext.putVariable("customerId", customer.getId());
64 return customer.getId(); 68 return customer.getId();
65 } 69 }
66 70
@@ -85,6 +89,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @@ -85,6 +89,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
85 89
86 @Override 90 @Override
87 @Transactional(rollbackFor = Exception.class) 91 @Transactional(rollbackFor = Exception.class)
  92 + @LogRecord(type = CRM_CUSTOMER, bizNo = "{{#id}}", success = "删除了客户")
88 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) 93 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
89 public void deleteCustomer(Long id) { 94 public void deleteCustomer(Long id) {
90 // 校验存在 95 // 校验存在
@@ -152,6 +157,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @@ -152,6 +157,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
152 } 157 }
153 158
154 @Override 159 @Override
  160 + @LogRecord(type = CRM_CUSTOMER, bizNo = "{{#updateReqVO.id}}", success = "锁定了客户")
155 public void lockCustomer(CrmCustomerUpdateReqVO updateReqVO) { 161 public void lockCustomer(CrmCustomerUpdateReqVO updateReqVO) {
156 // 校验存在 162 // 校验存在
157 validateCustomerExists(updateReqVO.getId()); 163 validateCustomerExists(updateReqVO.getId());
@@ -165,6 +171,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @@ -165,6 +171,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
165 171
166 @Override 172 @Override
167 @Transactional(rollbackFor = Exception.class) 173 @Transactional(rollbackFor = Exception.class)
  174 + @LogRecord(type = CRM_CUSTOMER, bizNo = "{{#id}}", success = "将客户放入了公海")
168 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) 175 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
169 public void putCustomerPool(Long id) { 176 public void putCustomerPool(Long id) {
170 // 1. 校验存在 177 // 1. 校验存在
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
8 import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper; 8 import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper;
9 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; 9 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
10 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; 10 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
  11 +import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionUtils;
11 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; 12 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
12 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; 13 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
13 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 14 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -89,8 +90,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { @@ -89,8 +90,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
89 CrmPermissionDO oldPermission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId( 90 CrmPermissionDO oldPermission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(
90 transferReqBO.getBizType(), transferReqBO.getBizId(), transferReqBO.getUserId()); 91 transferReqBO.getBizType(), transferReqBO.getBizId(), transferReqBO.getUserId());
91 String bizTypeName = CrmBizTypeEnum.getNameByType(transferReqBO.getBizType()); 92 String bizTypeName = CrmBizTypeEnum.getNameByType(transferReqBO.getBizType());
92 - // TODO 校验是否为超级管理员 || 1  
93 - if (oldPermission == null || !isOwner(oldPermission.getLevel())) { 93 + if (oldPermission == null || !isOwner(oldPermission.getLevel()) || !CrmPermissionUtils.validateAdminUser()) {
94 throw exception(CRM_PERMISSION_DENIED, bizTypeName); 94 throw exception(CRM_PERMISSION_DENIED, bizTypeName);
95 } 95 }
96 // 1.1 校验转移对象是否已经是该负责人 96 // 1.1 校验转移对象是否已经是该负责人
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmQueryWrapperUtils.java
@@ -7,8 +7,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; @@ -7,8 +7,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
7 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; 7 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
8 import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum; 8 import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
9 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; 9 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
10 -import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionRoleCodeEnum;  
11 -import cn.iocoder.yudao.module.system.api.permission.PermissionApi; 10 +import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionUtils;
12 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 11 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
13 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 12 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
14 import com.baomidou.mybatisplus.core.toolkit.support.SFunction; 13 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
@@ -41,7 +40,7 @@ public class CrmQueryWrapperUtils { @@ -41,7 +40,7 @@ public class CrmQueryWrapperUtils {
41 Long userId, Integer sceneType, Boolean pool) { 40 Long userId, Integer sceneType, Boolean pool) {
42 final String ownerUserIdField = SingletonManager.getMybatisPlusJoinProperties().getTableAlias() + ".owner_user_id"; 41 final String ownerUserIdField = SingletonManager.getMybatisPlusJoinProperties().getTableAlias() + ".owner_user_id";
43 // 1. 构建数据权限连表条件 42 // 1. 构建数据权限连表条件
44 - if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE) && ObjUtil.notEqual(pool, Boolean.TRUE)) { // 管理员,公海不需要数据权限 43 + if (ObjUtil.notEqual(CrmPermissionUtils.validateAdminUser(), Boolean.TRUE) && ObjUtil.notEqual(pool, Boolean.TRUE)) { // 管理员,公海不需要数据权限
45 query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType) 44 query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType)
46 .eq(CrmPermissionDO::getBizId, bizId) // 只能使用 SFunction 如果传 id 解析出来的 sql 不对 45 .eq(CrmPermissionDO::getBizId, bizId) // 只能使用 SFunction 如果传 id 解析出来的 sql 不对
47 .eq(CrmPermissionDO::getUserId, userId)); 46 .eq(CrmPermissionDO::getUserId, userId));
@@ -82,7 +81,7 @@ public class CrmQueryWrapperUtils { @@ -82,7 +81,7 @@ public class CrmQueryWrapperUtils {
82 * @param userId 用户编号 81 * @param userId 用户编号
83 */ 82 */
84 public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, Integer bizType, Collection<Long> bizIds, Long userId) { 83 public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, Integer bizType, Collection<Long> bizIds, Long userId) {
85 - if (ObjUtil.equal(validateAdminUser(userId), Boolean.TRUE)) {// 管理员不需要数据权限 84 + if (ObjUtil.equal(CrmPermissionUtils.validateAdminUser(), Boolean.TRUE)) {// 管理员不需要数据权限
86 return; 85 return;
87 } 86 }
88 87
@@ -92,16 +91,6 @@ public class CrmQueryWrapperUtils { @@ -92,16 +91,6 @@ public class CrmQueryWrapperUtils {
92 } 91 }
93 92
94 /** 93 /**
95 - * 校验用户是否是 CRM 管理员  
96 - *  
97 - * @param userId 用户编号  
98 - * @return 是/否  
99 - */  
100 - private static boolean validateAdminUser(Long userId) {  
101 - return SingletonManager.getPermissionApi().hasAnyRoles(userId, CrmPermissionRoleCodeEnum.CRM_ADMIN.getCode());  
102 - }  
103 -  
104 - /**  
105 * 静态内部类实现单例获取 94 * 静态内部类实现单例获取
106 * 95 *
107 * @author HUIHUI 96 * @author HUIHUI
@@ -109,17 +98,12 @@ public class CrmQueryWrapperUtils { @@ -109,17 +98,12 @@ public class CrmQueryWrapperUtils {
109 private static class SingletonManager { 98 private static class SingletonManager {
110 99
111 private static final AdminUserApi ADMIN_USER_API = SpringUtil.getBean(AdminUserApi.class); 100 private static final AdminUserApi ADMIN_USER_API = SpringUtil.getBean(AdminUserApi.class);
112 - private static final PermissionApi PERMISSION_API = SpringUtil.getBean(PermissionApi.class);  
113 private static final MybatisPlusJoinProperties MYBATIS_PLUS_JOIN_PROPERTIES = SpringUtil.getBean(MybatisPlusJoinProperties.class); 101 private static final MybatisPlusJoinProperties MYBATIS_PLUS_JOIN_PROPERTIES = SpringUtil.getBean(MybatisPlusJoinProperties.class);
114 102
115 public static AdminUserApi getAdminUserApi() { 103 public static AdminUserApi getAdminUserApi() {
116 return ADMIN_USER_API; 104 return ADMIN_USER_API;
117 } 105 }
118 106
119 - public static PermissionApi getPermissionApi() {  
120 - return PERMISSION_API;  
121 - }  
122 -  
123 public static MybatisPlusJoinProperties getMybatisPlusJoinProperties() { 107 public static MybatisPlusJoinProperties getMybatisPlusJoinProperties() {
124 return MYBATIS_PLUS_JOIN_PROPERTIES; 108 return MYBATIS_PLUS_JOIN_PROPERTIES;
125 } 109 }