diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml
index 00ac14356..da0c4e735 100644
--- a/yudao-dependencies/pom.xml
+++ b/yudao-dependencies/pom.xml
@@ -62,6 +62,7 @@
0.1.55
2.9.1
2.7.0
+ 3.0.6
3.5.0
4.11.0
@@ -99,6 +100,17 @@
yudao-spring-boot-starter-biz-operatelog
${revision}
+
+ io.github.mouzt
+ bizlog-sdk
+ ${bizlog-sdk.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
cn.iocoder.boot
yudao-spring-boot-starter-biz-dict
diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java
new file mode 100644
index 000000000..909a0d34a
--- /dev/null
+++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java
@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.crm.enums;
+
+/**
+ * CRM 操作日志枚举
+ *
+ * @author HUIHUI
+ */
+public interface LogRecordConstants {
+
+ String WHO = "【{getAdminUserById{#userId}}】";
+
+ //======================= 客户转移操作日志 =======================
+
+ String TRANSFER_CUSTOMER_LOG_TYPE = "客户转移";
+ String TRANSFER_CUSTOMER_LOG_SUCCESS = WHO + "把客户【{{#crmCustomer.name}}】负责人【{getAdminUserById{#crmCustomer.ownerUserId}}】转移给了【{getAdminUserById{#reqVO.newOwnerUserId}}】";
+ String TRANSFER_CUSTOMER_LOG_FAIL = "";
+
+}
diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.http b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.http
index f6ecb473b..770171d57 100644
--- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.http
+++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.http
@@ -1,6 +1,13 @@
-### 请求 /update
-GET {{baseUrl}}/crm/customer/page?pageNo=1&pageSize=10&name="张三"
+### 请求 /transfer
+PUT {{baseUrl}}/crm/customer/transfer
+Content-Type: application/json
Authorization: Bearer {{token}}
tenant-id: {{adminTenentId}}
+{
+ "id": 11,
+ "newOwnerUserId": 127,
+ "oldOwnerPermissionLevel": 2
+}
+
diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
index f06e26e4a..e29da139e 100644
--- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
+++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
@@ -17,14 +17,14 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
import org.mapstruct.ap.internal.util.Collections;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
-import jakarta.annotation.Resource;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.Valid;
import java.io.IOException;
import java.util.List;
import java.util.Map;
diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
index fd1009255..402cbcb31 100644
--- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
+++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
@@ -9,12 +9,15 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerUpdat
import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert;
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper;
+import cn.iocoder.yudao.module.crm.enums.LogRecordConstants;
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import com.mzt.logapi.context.LogRecordContext;
+import com.mzt.logapi.starter.annotation.LogRecord;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -126,11 +129,14 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
@Override
@Transactional(rollbackFor = Exception.class)
+ @LogRecord(success = LogRecordConstants.TRANSFER_CUSTOMER_LOG_SUCCESS,
+ type = LogRecordConstants.TRANSFER_CUSTOMER_LOG_TYPE, bizNo = "{{#reqVO.id}}")
@CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER)
public void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId) {
// 1. 校验客户是否存在
validateCustomer(reqVO.getId());
+ LogRecordContext.putVariable("crmCustomer", customerMapper.selectById(reqVO.getId()));
// 2.1 数据权限转移
crmPermissionService.transferPermission(
CrmCustomerConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()));
diff --git a/yudao-module-system/yudao-module-system-api/pom.xml b/yudao-module-system/yudao-module-system-api/pom.xml
index 655db05a7..416413cd6 100644
--- a/yudao-module-system/yudao-module-system-api/pom.xml
+++ b/yudao-module-system/yudao-module-system-api/pom.xml
@@ -22,6 +22,13 @@
yudao-common
+
+
+
+ io.github.mouzt
+ bizlog-sdk
+
+
org.springframework.boot
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogV2DO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogV2DO.java
new file mode 100644
index 000000000..3473954a7
--- /dev/null
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogV2DO.java
@@ -0,0 +1,144 @@
+package cn.iocoder.yudao.module.system.dal.dataobject.logger;
+
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * 操作日志表
+ *
+ * @author 芋道源码
+ */
+@TableName(value = "system_operate_log_v2", autoResultMap = true)
+@KeySequence("system_operate_log_seq_v2") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class OperateLogV2DO extends BaseDO {
+
+ /**
+ * {@link #javaMethodArgs} 的最大长度
+ */
+ public static final Integer JAVA_METHOD_ARGS_MAX_LENGTH = 8000;
+
+ /**
+ * {@link #resultData} 的最大长度
+ */
+ public static final Integer RESULT_MAX_LENGTH = 4000;
+
+ /**
+ * 日志主键
+ */
+ @TableId
+ private Long id;
+ /**
+ * 链路追踪编号
+ *
+ * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。
+ */
+ private String traceId;
+ /**
+ * 用户编号
+ *
+ * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性
+ */
+ private Long userId;
+ /**
+ * 用户类型
+ *
+ * 关联 {@link UserTypeEnum}
+ */
+ private Integer userType;
+ /**
+ * 操作模块
+ */
+ private String module;
+ /**
+ * 操作名
+ */
+ private String name;
+ /**
+ * 操作分类
+ *
+ * 枚举 {@link OperateTypeEnum}
+ */
+ private Integer type;
+ /**
+ * 操作内容,记录整个操作的明细
+ * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。
+ */
+ private String content;
+ /**
+ * 拓展字段,有些复杂的业务,需要记录一些字段
+ * 例如说,记录订单编号,则可以添加 key 为 "orderId",value 为订单编号
+ */
+ @TableField(typeHandler = JacksonTypeHandler.class)
+ private Map exts;
+
+ /**
+ * 请求方法名
+ */
+ private String requestMethod;
+ /**
+ * 请求地址
+ */
+ private String requestUrl;
+ /**
+ * 用户 IP
+ */
+ private String userIp;
+ /**
+ * 浏览器 UA
+ */
+ private String userAgent;
+
+ /**
+ * Java 方法名
+ */
+ private String javaMethod;
+ /**
+ * Java 方法的参数
+ *
+ * 实际格式为 Map
+ * 不使用 @TableField(typeHandler = FastjsonTypeHandler.class) 注解的原因是,数据库存储有长度限制,会进行裁剪,会导致 JSON 反序列化失败
+ * 其中,key 为参数名,value 为参数值
+ */
+ private String javaMethodArgs;
+ /**
+ * 开始时间
+ */
+ private LocalDateTime startTime;
+ /**
+ * 执行时长,单位:毫秒
+ */
+ private Integer duration;
+ /**
+ * 结果码
+ *
+ * 目前使用的 {@link CommonResult#getCode()} 属性
+ */
+ private Integer resultCode;
+ /**
+ * 结果提示
+ *
+ * 目前使用的 {@link CommonResult#getMsg()} 属性
+ */
+ private String resultMsg;
+ /**
+ * 结果数据
+ *
+ * 如果是对象,则使用 JSON 格式化
+ */
+ private String resultData;
+
+}
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogV2Mapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogV2Mapper.java
new file mode 100644
index 000000000..e778320a7
--- /dev/null
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogV2Mapper.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.system.dal.mysql.logger;
+
+import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
+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.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collection;
+
+@Mapper
+public interface OperateLogV2Mapper extends BaseMapperX {
+
+ default PageResult selectPage(OperateLogPageReqVO reqVO, Collection userIds) {
+ LambdaQueryWrapperX query = new LambdaQueryWrapperX()
+ .likeIfPresent(OperateLogV2DO::getModule, reqVO.getModule())
+ .inIfPresent(OperateLogV2DO::getUserId, userIds)
+ .eqIfPresent(OperateLogV2DO::getType, reqVO.getType())
+ .betweenIfPresent(OperateLogV2DO::getStartTime, reqVO.getStartTime());
+ if (Boolean.TRUE.equals(reqVO.getSuccess())) {
+ query.eq(OperateLogV2DO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode());
+ } else if (Boolean.FALSE.equals(reqVO.getSuccess())) {
+ query.gt(OperateLogV2DO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode());
+ }
+ query.orderByDesc(OperateLogV2DO::getId); // 降序
+ return selectPage(reqVO, query);
+ }
+
+}
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/config/YudaoOperateLogV2Configuration.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/config/YudaoOperateLogV2Configuration.java
new file mode 100644
index 000000000..04fbdefea
--- /dev/null
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/config/YudaoOperateLogV2Configuration.java
@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.system.framework.bizlog.config;
+
+import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
+import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.framework.bizlog.service.AdminUserParseFunction;
+import cn.iocoder.yudao.module.system.framework.bizlog.service.ILogRecordServiceImpl;
+import com.mzt.logapi.beans.Operator;
+import com.mzt.logapi.service.IOperatorGetService;
+import com.mzt.logapi.starter.annotation.EnableLogRecord;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Optional;
+
+
+/**
+ * 使用 @Configuration 是因为 mzt-biz-log 的配置类是 @Configuration 的
+ *
+ * @author HUIHUI
+ */
+@Configuration(proxyBeanMethods = false)
+@EnableLogRecord(tenant = "${yudao.info.base-package}")
+@Slf4j
+public class YudaoOperateLogV2Configuration {
+
+ //======================= mzt-biz-log =======================
+
+ @Bean
+ public ILogRecordServiceImpl iLogRecordServiceImpl(OperateLogApi operateLogApi) {
+ log.info("ILogRecordServiceImpl 初始化");
+ return new ILogRecordServiceImpl(operateLogApi);
+ }
+
+ @Bean
+ public IOperatorGetService operatorGetLoginUserIdService() {
+ // 获取操作用户编号
+ return () -> Optional.of(WebFrameworkUtils.getLoginUserId())
+ .map(a -> {
+ Operator operator = new Operator();
+ operator.setOperatorId(a.toString());
+ return operator;
+ })
+ .orElseThrow(() -> new IllegalArgumentException("user is null"));
+ }
+
+ @Bean
+ public AdminUserParseFunction adminUserParseFunction(AdminUserApi adminUserApi) {
+ return new AdminUserParseFunction(adminUserApi);
+ }
+
+}
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/package-info.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/package-info.java
new file mode 100644
index 000000000..c96f3a0c1
--- /dev/null
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/package-info.java
@@ -0,0 +1 @@
+package cn.iocoder.yudao.module.system.framework.bizlog;
\ No newline at end of file
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/service/AdminUserParseFunction.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/service/AdminUserParseFunction.java
new file mode 100644
index 000000000..d29e3bac1
--- /dev/null
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/service/AdminUserParseFunction.java
@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.system.framework.bizlog.service;
+
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.mzt.logapi.service.IParseFunction;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 自定义函数-通过用户编号获取用户信息
+ *
+ * @author HUIHUI
+ */
+@Slf4j
+@RequiredArgsConstructor
+public class AdminUserParseFunction implements IParseFunction {
+
+ private final AdminUserApi adminUserApi;
+
+ @Override
+ public boolean executeBefore() {
+ return true;
+ }
+
+ @Override
+ public String functionName() {
+ return "getAdminUserById";
+ }
+
+ @Override
+ public String apply(Object value) {
+ if (value == null) {
+ log.warn("(getAdminUserById) 解析异常参数为 null");
+ return "";
+ }
+ if (StrUtil.isEmpty(value.toString())) {
+ log.warn("(getAdminUserById) 解析异常参数为空");
+ return "";
+ }
+
+ // 获取用户信息
+ AdminUserRespDTO user = adminUserApi.getUser(Long.parseLong(value.toString()));
+ if (user == null) {
+ log.warn("(getAdminUserById) 获取用户信息失败,参数为:{}", value);
+ return "";
+ }
+ // 返回格式 芋道源码(13888888888)
+ String nickname = user.getNickname();
+ if (ObjUtil.isNotEmpty(user.getMobile())) {
+ return nickname.concat("(").concat(user.getMobile()).concat(")");
+ }
+ return nickname;
+ }
+}
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/service/ILogRecordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/service/ILogRecordServiceImpl.java
new file mode 100644
index 000000000..2e2c4b5bd
--- /dev/null
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/service/ILogRecordServiceImpl.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.system.framework.bizlog.service;
+
+import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
+import com.mzt.logapi.beans.LogRecord;
+import com.mzt.logapi.service.ILogRecordService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 操作日志 ILogRecordService 实现类
+ *
+ * 基于 {@link OperateLogApi} 实现,记录操作日志
+ *
+ * @author HUIHUI
+ */
+@Slf4j
+@RequiredArgsConstructor
+public class ILogRecordServiceImpl implements ILogRecordService {
+
+ private final OperateLogApi operateLogApi;
+
+ @Override
+ public void record(LogRecord logRecord) {
+ log.info("【logRecord】log={}", logRecord);
+ }
+
+ @Override
+ public List queryLog(String bizNo, String type) {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List queryLogByBizNo(String bizNo, String type, String subType) {
+ return Collections.emptyList();
+ }
+}
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogService.java
index 89e562c65..9aada4999 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogService.java
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogService.java
@@ -19,6 +19,13 @@ public interface OperateLogService {
*/
void createOperateLog(OperateLogCreateReqDTO createReqDTO);
+ /**
+ * 记录操作日志 V2
+ *
+ * @param createReqDTO 操作日志请求
+ */
+ void createOperateLogV2(OperateLogCreateReqDTO createReqDTO);
+
/**
* 获得操作日志分页列表
*
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java
index 0181e3081..32f68a3b1 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java
@@ -8,14 +8,16 @@ import cn.iocoder.yudao.framework.common.util.string.StrUtils;
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogV2Mapper;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
+import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
-import jakarta.annotation.Resource;
import java.util.Collection;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -34,6 +36,8 @@ public class OperateLogServiceImpl implements OperateLogService {
@Resource
private OperateLogMapper operateLogMapper;
+ @Resource
+ private OperateLogV2Mapper operateLogV2Mapper;
@Resource
private AdminUserService userService;
@@ -46,6 +50,14 @@ public class OperateLogServiceImpl implements OperateLogService {
operateLogMapper.insert(log);
}
+ @Override
+ public void createOperateLogV2(OperateLogCreateReqDTO createReqDTO) {
+ OperateLogV2DO log = BeanUtils.toBean(createReqDTO, OperateLogV2DO.class);
+ log.setJavaMethodArgs(StrUtils.maxLength(log.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH));
+ log.setResultData(StrUtils.maxLength(log.getResultData(), RESULT_MAX_LENGTH));
+ operateLogV2Mapper.insert(log);
+ }
+
@Override
public PageResult getOperateLogPage(OperateLogPageReqVO pageReqVO) {
// 处理基于用户昵称的查询