From feedd62ec46b9faada80505387526acf914cf4c5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期日, 11 十月 2026 22:49:44 +0800
Subject: [PATCH] 海西州-同仁堂 1.添加操作日志生成

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java                        |    7 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java                                      |    7 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java                                            |    9 +
 yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java                                               |    7 
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/CrmInvoiceServiceImpl.java                                         |    7 
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java                                       |    8 +
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java                     |   14 +
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/LogRecordConstants.java                                                      |   17 ++
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java                                            |    8 +
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java                                    |    3 
 yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/util/OperateLogUtils.java         |   68 ++++++++
 yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java |   21 ++
 yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/enums/LogRecordConstants.java                                                      |   23 ++
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/enums/LogRecordConstants.java                                                      |   29 +++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryServiceImpl.java                                |    7 
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/supplier/SrmSupplierServiceImpl.java                                       |    8 +
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeContractServiceImpl.java                               |    8 +
 yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/unit/MdmUnitMeasureServiceImpl.java                                        |    7 
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java                                       |    7 
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java                                          |    9 +
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java                                  |    9 +
 yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java             |   17 ++
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java                                |    9 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java                                            |    9 +
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java                                            |    8 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java                                          |    9 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/metering/MesDvMeteringServiceImpl.java                                  |    9 +
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/LogRecordConstants.java                                                |   14 +
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java                                       |   23 --
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java                                       |    6 
 yudao-server/src/main/resources/application-hm.yaml                                                                                           |    2 
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java                                                      |    8 
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/enums/LogRecordConstants.java                                                      |    5 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/LogRecordConstants.java                                                      |   54 ++++++
 34 files changed, 434 insertions(+), 22 deletions(-)

diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java
index fbe74bf..43af899 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java
@@ -60,11 +60,30 @@
     public static void fillModuleFields(OperateLogCreateReqDTO reqDTO, LogRecord logRecord) {
         reqDTO.setType(logRecord.getType()); // 澶фā鍧楃被鍨嬶紝渚嬪锛欳RM 瀹㈡埛
         reqDTO.setSubType(logRecord.getSubType());// 鎿嶄綔鍚嶇О锛屼緥濡傦細杞Щ瀹㈡埛
-        reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 涓氬姟缂栧彿锛屼緥濡傦細瀹㈡埛缂栧彿
+        reqDTO.setBizId(parseBizId(logRecord.getBizNo())); // 涓氬姟缂栧彿锛屼緥濡傦細瀹㈡埛缂栧彿
         reqDTO.setAction(logRecord.getAction());// 鎿嶄綔鍐呭锛屼緥濡傦細淇敼缂栧彿涓� 1 鐨勭敤鎴蜂俊鎭紝灏嗘�у埆浠庣敺鏀规垚濂筹紝灏嗗鍚嶄粠瓒呯骇绠$悊鍛樻敼鎴愭簮鐮併��
         reqDTO.setExtra(logRecord.getExtra()); // 鎷撳睍瀛楁锛屾湁浜涘鏉傜殑涓氬姟锛岄渶瑕佽褰曚竴浜涘瓧娈� ( JSON 鏍煎紡 )锛屼緥濡傝锛岃褰曡鍗曠紪鍙凤紝{ orderId: "1"}
     }
 
+    /**
+     * 瑙f瀽涓氬姟缂栧彿銆傛壒閲忓鍏ョ瓑鍦烘櫙娌℃湁鍗曚竴涓氬姟缂栧彿锛堟敞瑙g殑 bizNo 娌″~鎴栧~浜嗛潪鏁板瓧锛夛紝
+     * 杩欓噷鐢� 0 鍏滃簳鈥斺�斾笉鑳借 parseLong 鎶涘紓甯革紝鍚﹀垯 {@link #record} 鐨� catch 浼氭妸鏁存潯鏃ュ織闈欓粯鍚炴帀
+     *
+     * @param bizNo 涓氬姟缂栧彿瀛楃涓�
+     * @return 涓氬姟缂栧彿锛岃В鏋愬け璐ユ椂涓� 0
+     */
+    private static long parseBizId(String bizNo) {
+        if (bizNo == null || bizNo.isBlank()) {
+            return 0L;
+        }
+        try {
+            return Long.parseLong(bizNo.trim());
+        } catch (NumberFormatException ex) {
+            log.warn("[parseBizId][涓氬姟缂栧彿({}) 涓嶆槸鏁板瓧锛岀敤 0 鍏滃簳]", bizNo);
+            return 0L;
+        }
+    }
+
     private static void fillRequestFields(OperateLogCreateReqDTO reqDTO) {
         // 鑾峰緱 Request 瀵硅薄
         HttpServletRequest request = ServletUtils.getRequest();
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/util/OperateLogUtils.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/util/OperateLogUtils.java
new file mode 100644
index 0000000..30d5537
--- /dev/null
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/util/OperateLogUtils.java
@@ -0,0 +1,68 @@
+package cn.iocoder.yudao.framework.operatelog.core.util;
+
+import com.mzt.logapi.context.LogRecordContext;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * 鎿嶄綔鏃ュ織鐨勫伐鍏风被
+ *
+ * 涓昏瑙e喅銆屽鍏ャ�嶈繖绫绘壒閲忔搷浣滅殑鏃ュ織鏂囨锛氫竴娆″鍏ュ彧鍐欎竴鏉℃眹鎬绘棩蹇楋紝
+ * 鑰屼笉鏄�愯鍐欙紙涓�娆″鍏ュ嚑鐧捐灏辨槸鍑犵櫨鏉℃棩蹇楋紝鏃ュ織椤典細娌℃硶鐪嬶級銆�
+ *
+ * 鐢ㄦ硶锛氬湪瀵煎叆鏂规硶杩斿洖鍓嶈皟鐢� {@link #putImportSummary}锛屾敞瑙f枃妗堥噷寮曠敤 {{#importSummary}}锛�
+ * <pre>
+ * &#64;LogRecord(type = XXX_TYPE, subType = XXX_IMPORT_SUB_TYPE, bizNo = "0", success = XXX_IMPORT_SUCCESS)
+ * public XxxImportRespVO importXxxList(...) {
+ *     ...
+ *     OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
+ *     return respVO;
+ * }
+ * </pre>
+ *
+ * 娉ㄦ剰锛氭敞瑙g殑 bizNo 蹇呴』缁欐暟瀛楋紙瀵煎叆娌℃湁鍗曚竴涓氬姟缂栧彿锛岀粺涓�濉� "0"锛夈��
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public class OperateLogUtils {
+
+    /**
+     * 瀵煎叆姹囨�绘枃妗堝湪 {@link LogRecordContext} 閲岀殑鍙橀噺鍚嶏紝瀵瑰簲娉ㄨВ鏂囨鐨� {{#importSummary}}
+     */
+    public static final String IMPORT_SUMMARY = "importSummary";
+
+    /**
+     * 璁板綍瀵煎叆缁撴灉鐨勬眹鎬诲彉閲忥紙鏂板/鏇存柊/澶辫触鏉℃暟锛夛紝鐩存帴浼犲悇妯″潡瀵煎叆 RespVO 鐨勫瓧娈�
+     *
+     * 鍚勬ā鍧楃殑瀵煎叆缁撴灉瀛楁褰㈡�佷笉缁熶竴锛氭垚鍔熺殑涓�鑸槸 Collection锛坈reateUsernames / createList /
+     * createCustomerNames 鈥︼級锛屽け璐ョ殑鍒欏鏄� Map锛坒ailureList / failureDeptNames锛宬ey 涓哄悕绉版垨琛屽彿锛夛紝
+     * 涓旀湁鐨勬ā鍧楁病鏈夈�屾洿鏂般�嶈繖涓�鍒楋紙builder 鏈祴鍊兼椂涓� null锛夈�傛墍浠ヨ繖閲岀粺涓�鎸夈�岄泦鍚� / Map / 鏁板瓧 / null銆�
+     * 鍙栨潯鏁帮紝鍙栦笉鍒版寜 0 澶勭悊鈥斺�旂粺璁″け璐ヤ笉鑳借鏁存潯瀵煎叆鏃ュ織涓㈡帀銆�
+     *
+     * @param createResult  鏂板鎴愬姛鐨勯泦鍚堬紙鎴栨潯鏁帮級
+     * @param updateResult  鏇存柊鎴愬姛鐨勯泦鍚堬紙鎴栨潯鏁帮級锛屾病鏈夊垯浼� null
+     * @param failureResult 澶辫触鐨勯泦鍚� / Map锛堟垨鏉℃暟锛�
+     */
+    public static void putImportSummary(Object createResult, Object updateResult, Object failureResult) {
+        LogRecordContext.putVariable(IMPORT_SUMMARY, "鏂板 " + size(createResult) + " 鏉°�佹洿鏂� "
+                + size(updateResult) + " 鏉°�佸け璐� " + size(failureResult) + " 鏉�");
+    }
+
+    private static int size(Object result) {
+        if (result == null) {
+            return 0;
+        }
+        if (result instanceof Collection) {
+            return ((Collection<?>) result).size();
+        }
+        if (result instanceof Map) {
+            return ((Map<?, ?>) result).size();
+        }
+        if (result instanceof Number) {
+            return ((Number) result).intValue();
+        }
+        return 0;
+    }
+
+}
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java
index 063b3cb..aac943e 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java
@@ -49,7 +49,22 @@
 @Slf4j
 public class ApiAccessLogFilter extends ApiRequestFilter {
 
-    private static final String[] SANITIZE_KEYS = new String[]{"password", "token", "accessToken", "refreshToken"};
+    /**
+     * 鏁忔劅瀛楁鍚嶅垪琛細璇锋眰鍙傛暟 / 璇锋眰浣撻噷鍛戒腑杩欎簺 key 鐨勫瓧娈碉紝涓嶄細鍐欏叆璁块棶鏃ュ織
+     *
+     * 杩欓噷鏄�屽叏閲忓厹搴曘�嶅悕鍗曪紝瑕嗙洊鍚勬ā鍧楀懡鍚嶄笉缁熶竴鐨勫瘑鐮佷笌瀵嗛挜瀛楁锛�
+     * 1. 瀵嗙爜锛歱assword銆乷ldPassword / newPassword / confirmPassword锛堟敼鍚嶅満鏅紝绮剧‘鍖归厤 "password" 鍛戒笉涓級
+     * 2. 浠ょ墝锛歵oken銆乤ccessToken / access_token銆乺efreshToken / refresh_token锛圤Auth2 鐨� refresh_token 璧� query 鍙傛暟锛�
+     *    鏄笅鍒掔嚎鍛藉悕锛屼笌鍘熸湁鐨勯┘宄� refreshToken 涓嶆槸鍚屼竴涓� key锛�
+     * 3. 瀵嗛挜锛歴ecret銆乧lientSecret / client_secret銆乤piKey / apiSecret锛圓I銆佺煭淇★級銆乤ccessKey锛堝璞″瓨鍌級銆乸rivateKey
+     *
+     * 涓埆鎺ュ彛鐨勬晱鎰� key 涓庢甯镐笟鍔″瓧娈甸噸鍚嶏紙渚嬪鐭俊楠岃瘉鐮� code銆佷笟鍔″崟鎹紪鐮侊級锛屼笉鑳芥斁杩涜繖浠藉叏灞�鍚嶅崟锛�
+     * 鐢卞搴旀帴鍙h嚜琛岀敤 @ApiAccessLog(sanitizeKeys = ...) 鎸囧畾銆�
+     */
+    private static final String[] SANITIZE_KEYS = new String[]{
+            "password", "oldPassword", "newPassword", "confirmPassword",
+            "token", "accessToken", "access_token", "refreshToken", "refresh_token",
+            "secret", "clientSecret", "client_secret", "apiKey", "apiSecret", "accessKey", "privateKey"};
 
     private final String applicationName;
 
diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java
index 4d1ba00..b50bf45 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java
@@ -41,8 +41,8 @@
     String CRM_CUSTOMER_POOL_SUCCESS = "灏嗗鎴枫�恵{#customerName}}銆戞斁鍏ヤ簡鍏捣";
     String CRM_CUSTOMER_RECEIVE_SUB_TYPE = "{{#ownerUserName != null ? '鍒嗛厤瀹㈡埛' : '棰嗗彇瀹㈡埛'}}";
     String CRM_CUSTOMER_RECEIVE_SUCCESS = "{{#ownerUserName != null ? '灏嗗鎴枫��' + #customer.name + '銆戝垎閰嶇粰銆�' + #ownerUserName + '銆�' : '棰嗗彇瀹㈡埛銆�' + #customer.name + '銆�'}}";
-    String CRM_CUSTOMER_IMPORT_SUB_TYPE = "{{#isUpdate ? '瀵煎叆骞舵洿鏂板鎴�' : '瀵煎叆瀹㈡埛'}}";
-    String CRM_CUSTOMER_IMPORT_SUCCESS = "{{#isUpdate ? '瀵煎叆骞舵洿鏂颁簡瀹㈡埛銆�'+ #customer.name +'銆�' : '瀵煎叆浜嗗鎴枫��'+ #customer.name +'銆�'}}";
+    String CRM_CUSTOMER_IMPORT_SUB_TYPE = "瀵煎叆瀹㈡埛";
+    String CRM_CUSTOMER_IMPORT_SUCCESS = "瀵煎叆浜嗗鎴凤細{{#importSummary}}";
     String CRM_CUSTOMER_UPDATE_DEAL_STATUS_SUB_TYPE = "鏇存柊瀹㈡埛鎴愪氦鐘舵��";
     String CRM_CUSTOMER_UPDATE_DEAL_STATUS_SUCCESS = "鏇存柊浜嗗鎴枫�恵{#customerName}}銆戠殑鎴愪氦鐘舵�佷负銆恵{#dealStatus ? '宸叉垚浜�' : '鏈垚浜�'}}銆�";
     String CRM_CUSTOMER_FOLLOW_UP_SUB_TYPE = "瀹㈡埛璺熻繘";
@@ -117,6 +117,8 @@
     String CRM_CONTRACT_SUBMIT_SUCCESS = "鎻愪氦鍚堝悓銆恵{#contractName}}銆戝鎵规垚鍔�";
     String CRM_CONTRACT_FOLLOW_UP_SUB_TYPE = "鍚堝悓璺熻繘";
     String CRM_CONTRACT_FOLLOW_UP_SUCCESS = "鍚堝悓璺熻繘銆恵{#contractName}}銆�";
+    String CRM_CONTRACT_IMPORT_SUB_TYPE = "瀵煎叆鍚堝悓";
+    String CRM_CONTRACT_IMPORT_SUCCESS = "瀵煎叆浜嗗悎鍚岋細{{#importSummary}}";
 
     // ======================= CRM_PRODUCT 浜у搧 =======================
 
@@ -171,5 +173,7 @@
     String CRM_INVOICE_DELETE_SUCCESS = "鍒犻櫎浜嗗悎鍚屻�恵getContractById{#invoice.contractId}}銆戠殑缂栧彿涓恒�恵{#invoice.no}}銆戠殑寮�绁�";
     String CRM_INVOICE_SUBMIT_SUB_TYPE = "鎻愪氦寮�绁ㄥ鎵�";
     String CRM_INVOICE_SUBMIT_SUCCESS = "鎻愪氦缂栧彿涓恒�恵{#invoiceNo}}銆戠殑寮�绁ㄥ鎵规垚鍔�";
+    String CRM_INVOICE_IMPORT_SUB_TYPE = "瀵煎叆寮�绁�";
+    String CRM_INVOICE_IMPORT_SUCCESS = "瀵煎叆浜嗗紑绁細{{#importSummary}}";
 
 }
diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
index 4852463..ab35cf8 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -10,6 +10,7 @@
 import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
@@ -272,6 +273,8 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = CRM_CONTRACT_TYPE, subType = CRM_CONTRACT_IMPORT_SUB_TYPE, bizNo = "0",
+            success = CRM_CONTRACT_IMPORT_SUCCESS)
     public CrmContractImportRespVO importContractList(List<CrmContractImportExcelVO> importList) {
         CrmContractImportRespVO respVO = CrmContractImportRespVO.builder()
                 .createList(new ArrayList<>())
@@ -279,6 +282,8 @@
                 .failureList(new LinkedHashMap<>())
                 .build();
         if (CollUtil.isEmpty(importList)) {
+            // 绌烘枃浠朵篃瑕佺粰鏃ュ織鏂囨鍏滃簳锛岄伩鍏� {{#importSummary}} 鍙栦笉鍒板��
+            OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
             return respVO;
         }
 
@@ -317,6 +322,8 @@
                 respVO.getFailureList().put(label, resolveImportErrorMessage(ex));
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
index 756a962..226ea05 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
@@ -9,6 +9,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessTransferReqVO;
 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactTransferReqVO;
 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractTransferReqVO;
@@ -291,6 +292,8 @@
     }
 
     @Override
+    @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_IMPORT_SUB_TYPE, bizNo = "0",
+            success = CRM_CUSTOMER_IMPORT_SUCCESS)
     public CrmCustomerImportRespVO importCustomerList(List<CrmCustomerImportExcelVO> importCustomers,
                                                       CrmCustomerImportReqVO importReqVO) {
         // 鏍¢獙闈炵┖
@@ -322,8 +325,6 @@
                     permissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType())
                             .setBizId(customer.getId()).setUserId(importReqVO.getOwnerUserId()).setLevel(CrmPermissionLevelEnum.OWNER.getLevel()));
                 }
-                // 1.3 璁板綍鎿嶄綔鏃ュ織
-                getSelf().importCustomerLog(customer, false);
                 return;
             }
 
@@ -338,23 +339,11 @@
                     .setId(existCustomer.getId());
             customerMapper.updateById(updateCustomer);
             respVO.getUpdateCustomerNames().add(importCustomer.getName());
-            // 2.2 璁板綍鎿嶄綔鏃ュ織
-            getSelf().importCustomerLog(updateCustomer, true);
         });
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateCustomerNames(), respVO.getUpdateCustomerNames(),
+                respVO.getFailureCustomerNames());
         return respVO;
-    }
-
-    /**
-     * 璁板綍瀵煎叆瀹㈡埛鏃剁殑鎿嶄綔鏃ュ織
-     *
-     * @param customer 瀹㈡埛淇℃伅
-     * @param isUpdate 鏄惁鏇存柊锛泃rue - 鏇存柊锛宖alse - 鏂板
-     */
-    @LogRecord(type = CRM_CUSTOMER_TYPE, subType = CRM_CUSTOMER_IMPORT_SUB_TYPE, bizNo = "{{#customer.id}}",
-            success = CRM_CUSTOMER_IMPORT_SUCCESS)
-    public void importCustomerLog(CrmCustomerDO customer, boolean isUpdate) {
-        LogRecordContext.putVariable("customer", customer);
-        LogRecordContext.putVariable("isUpdate", isUpdate);
     }
 
     // ==================== 鍏捣鐩稿叧鎿嶄綔 ====================
diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/CrmInvoiceServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/CrmInvoiceServiceImpl.java
index a59c979..fdc085b 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/CrmInvoiceServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/CrmInvoiceServiceImpl.java
@@ -11,6 +11,7 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 import cn.iocoder.yudao.module.crm.controller.admin.invoice.vo.invoice.CrmInvoiceImportExcelVO;
@@ -131,12 +132,16 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = CRM_INVOICE_TYPE, subType = CRM_INVOICE_IMPORT_SUB_TYPE, bizNo = "0",
+            success = CRM_INVOICE_IMPORT_SUCCESS)
     public CrmInvoiceImportRespVO importInvoiceList(List<CrmInvoiceImportExcelVO> importList) {
         CrmInvoiceImportRespVO respVO = CrmInvoiceImportRespVO.builder()
                 .createList(new ArrayList<>())
                 .failureList(new LinkedHashMap<>())
                 .build();
         if (CollUtil.isEmpty(importList)) {
+            // 绌烘枃浠朵篃瑕佺粰鏃ュ織鏂囨鍏滃簳锛岄伩鍏� {{#importSummary}} 鍙栦笉鍒板��
+            OperateLogUtils.putImportSummary(respVO.getCreateList(), null, respVO.getFailureList());
             return respVO;
         }
 
@@ -160,6 +165,8 @@
                 respVO.getFailureList().put(label, resolveImportErrorMessage(ex));
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤锛堝紑绁ㄥ鍏ユ棤銆屾洿鏂般�嶅垎鏀紝鏁呬紶 null锛�
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), null, respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/LogRecordConstants.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/LogRecordConstants.java
index 751ef8b..f5ddb16 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/LogRecordConstants.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/LogRecordConstants.java
@@ -8,5 +8,22 @@
  */
 public interface LogRecordConstants {
 
+    // ======================= ERP_SALE_ORDER 閿�鍞鍗� =======================
+
+    String ERP_SALE_ORDER_TYPE = "ERP 閿�鍞鍗�";
+    String ERP_SALE_ORDER_IMPORT_SUB_TYPE = "瀵煎叆閿�鍞鍗�";
+    String ERP_SALE_ORDER_IMPORT_SUCCESS = "瀵煎叆浜嗛攢鍞鍗曪細{{#importSummary}}";
+
+    // ======================= ERP_PURCHASE_ORDER 閲囪喘璁㈠崟 =======================
+
+    String ERP_PURCHASE_ORDER_TYPE = "ERP 閲囪喘璁㈠崟";
+    String ERP_PURCHASE_ORDER_IMPORT_SUB_TYPE = "瀵煎叆閲囪喘璁㈠崟";
+    String ERP_PURCHASE_ORDER_IMPORT_SUCCESS = "瀵煎叆浜嗛噰璐鍗曪細{{#importSummary}}";
+
+    // ======================= ERP_PURCHASE_REQUEST 閲囪喘鐢宠 =======================
+
+    String ERP_PURCHASE_REQUEST_TYPE = "ERP 閲囪喘鐢宠";
+    String ERP_PURCHASE_REQUEST_IMPORT_SUB_TYPE = "瀵煎叆閲囪喘鐢宠";
+    String ERP_PURCHASE_REQUEST_IMPORT_SUCCESS = "瀵煎叆浜嗛噰璐敵璇凤細{{#importSummary}}";
 
 }
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
index 4b51cfc..10cef64 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
@@ -7,6 +7,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
@@ -36,6 +37,7 @@
 import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
 import cn.iocoder.yudao.module.mes.api.arrivalnotice.MesArrivalNoticeApi;
 import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.flowable.engine.repository.ProcessDefinition;
@@ -54,6 +56,7 @@
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.erp.enums.LogRecordConstants.*;
 
 /**
  * ERP 閲囪喘璁㈠崟 Service 瀹炵幇绫�
@@ -177,6 +180,8 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = ERP_PURCHASE_ORDER_TYPE, subType = ERP_PURCHASE_ORDER_IMPORT_SUB_TYPE, bizNo = "0",
+            success = ERP_PURCHASE_ORDER_IMPORT_SUCCESS)
     public ErpPurchaseOrderImportRespVO importPurchaseOrderList(List<ErpPurchaseOrderImportExcelVO> importList,
                                                                Boolean directApprove) {
         ErpPurchaseOrderImportRespVO respVO = ErpPurchaseOrderImportRespVO.builder()
@@ -185,6 +190,8 @@
                 .failureList(new LinkedHashMap<>())
                 .build();
         if (CollUtil.isEmpty(importList)) {
+            // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+            OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
             return respVO;
         }
 
@@ -226,6 +233,8 @@
                 respVO.getFailureList().put(label, resolveImportErrorMessage(ex));
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
index 54d6447..96eb059 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
@@ -6,6 +6,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
@@ -36,6 +37,7 @@
 import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.flowable.engine.repository.ProcessDefinition;
@@ -52,6 +54,7 @@
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
 import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.erp.enums.LogRecordConstants.*;
 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 /**
@@ -167,6 +170,8 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = ERP_PURCHASE_REQUEST_TYPE, subType = ERP_PURCHASE_REQUEST_IMPORT_SUB_TYPE, bizNo = "0",
+            success = ERP_PURCHASE_REQUEST_IMPORT_SUCCESS)
     public ErpPurchaseRequestImportRespVO importPurchaseRequestList(List<ErpPurchaseRequestImportExcelVO> importList) {
         ErpPurchaseRequestImportRespVO respVO = ErpPurchaseRequestImportRespVO.builder()
                 .createList(new ArrayList<>())
@@ -174,6 +179,8 @@
                 .failureList(new LinkedHashMap<>())
                 .build();
         if (CollUtil.isEmpty(importList)) {
+            // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+            OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
             return respVO;
         }
 
@@ -215,6 +222,8 @@
                 respVO.getFailureList().put(label, resolveImportErrorMessage(ex));
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
index 18985aa..5208739 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
@@ -7,6 +7,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
@@ -36,6 +37,7 @@
 import cn.iocoder.yudao.module.mes.api.mps.dto.MesProMpsRespDTO;
 import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.flowable.engine.repository.ProcessDefinition;
 import lombok.extern.slf4j.Slf4j;
@@ -59,6 +61,7 @@
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
 import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.erp.enums.LogRecordConstants.*;
 
 /**
  * ERP 閿�鍞鍗� Service 瀹炵幇绫�
@@ -190,6 +193,8 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = ERP_SALE_ORDER_TYPE, subType = ERP_SALE_ORDER_IMPORT_SUB_TYPE, bizNo = "0",
+            success = ERP_SALE_ORDER_IMPORT_SUCCESS)
     public ErpSaleOrderImportRespVO importSaleOrderList(List<ErpSaleOrderImportExcelVO> importList) {
         ErpSaleOrderImportRespVO respVO = ErpSaleOrderImportRespVO.builder()
                 .createList(new ArrayList<>())
@@ -197,6 +202,8 @@
                 .failureList(new LinkedHashMap<>())
                 .build();
         if (CollUtil.isEmpty(importList)) {
+            // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+            OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
             return respVO;
         }
 
@@ -235,6 +242,8 @@
                 respVO.getFailureList().put(label, resolveImportErrorMessage(ex));
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java
index 22cae5c..3d677dc 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java
@@ -7,6 +7,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordImportExcelVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordImportReqVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordPageReqVO;
@@ -19,6 +20,7 @@
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -38,6 +40,7 @@
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_NOT_EXISTS;
+import static cn.iocoder.yudao.module.hrm.enums.LogRecordConstants.*;
 
 @Tag(name = "绠$悊鍚庡彴 - HRM 鑰冨嫟璁板綍")
 @RestController
@@ -204,12 +207,18 @@
     @PostMapping("/import")
     @Operation(summary = "瀵煎叆鑰冨嫟璁板綍")
     @PreAuthorize("@ss.hasPermission('hrm:attendance-record:import')")
+    @LogRecord(type = HRM_ATTENDANCE_RECORD_TYPE, subType = HRM_ATTENDANCE_RECORD_IMPORT_SUB_TYPE, bizNo = "0",
+            success = HRM_ATTENDANCE_RECORD_IMPORT_SUCCESS)
     public CommonResult<String> importExcel(@Valid HrmAttendanceRecordImportReqVO importReqVO) throws IOException {
         List<HrmAttendanceRecordImportExcelVO> list = ExcelUtils.read(importReqVO.getFile(), HrmAttendanceRecordImportExcelVO.class);
         if (CollUtil.isEmpty(list)) {
+            // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+            OperateLogUtils.putImportSummary(0, null, null);
             return success("娌℃湁鍙鍏ョ殑鏁版嵁");
         }
         int successCount = 0;
+        int createCount = 0; // 鏂板鐨勮褰曟暟
+        int updateCount = 0; // 鏇存柊鐨勮褰曟暟锛堜粎鍕鹃�夈�屾敮鎸佹洿鏂般�嶆椂鎵嶄細璧版洿鏂帮級
         Set<String> missingNames = new LinkedHashSet<>();
         Set<String> duplicateNames = new LinkedHashSet<>();
         Set<String> invalidRows = new LinkedHashSet<>();
@@ -255,6 +264,7 @@
                         .location(item.getLocation()).remark(item.getRemark())
                         .dataSource(2).build();
                 attendanceRecordService.createImportedRecord(record);
+                createCount++;
             } else if (Boolean.TRUE.equals(importReqVO.getUpdateSupport())) {
                 record.setClockInTime(item.getClockInTime());
                 record.setClockOutTime(item.getClockOutTime());
@@ -263,6 +273,7 @@
                 record.setLocation(item.getLocation());
                 record.setRemark(item.getRemark());
                 attendanceRecordService.updateImportedRecord(record);
+                updateCount++;
             }
             successCount++;
         }
@@ -276,6 +287,9 @@
         if (!invalidRows.isEmpty()) {
             msg.append("锛涗互涓嬭褰曟暟鎹笉瀹屾暣锛屾湭鑳藉鍏ワ細").append(String.join("銆�", invalidRows));
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(createCount, updateCount,
+                missingNames.size() + duplicateNames.size() + invalidRows.size());
         return success(msg.toString());
     }
 
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/enums/LogRecordConstants.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/enums/LogRecordConstants.java
new file mode 100644
index 0000000..0b13598
--- /dev/null
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/enums/LogRecordConstants.java
@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.hrm.enums;
+
+/**
+ * Hrm 鎿嶄綔鏃ュ織鏋氫妇
+ * 鐩殑锛氱粺涓�绠$悊锛屼篃鍑忓皯 Service 閲屽悇绉嶁�滃鏉傗�濆瓧绗︿覆
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public interface LogRecordConstants {
+
+    // ======================= HRM_ATTENDANCE_RECORD 鑰冨嫟璁板綍 =======================
+
+    String HRM_ATTENDANCE_RECORD_TYPE = "HRM 鑰冨嫟璁板綍";
+    String HRM_ATTENDANCE_RECORD_IMPORT_SUB_TYPE = "瀵煎叆鑰冨嫟璁板綍";
+    String HRM_ATTENDANCE_RECORD_IMPORT_SUCCESS = "瀵煎叆浜嗚�冨嫟璁板綍锛歿{#importSummary}}";
+
+    // ======================= HRM_EMPLOYEE 鍛樺伐 =======================
+
+    String HRM_EMPLOYEE_TYPE = "HRM 鍛樺伐";
+    String HRM_EMPLOYEE_IMPORT_SUB_TYPE = "瀵煎叆鍛樺伐";
+    String HRM_EMPLOYEE_IMPORT_SUCCESS = "瀵煎叆浜嗗憳宸ワ細{{#importSummary}}";
+
+    // ======================= HRM_EMPLOYEE_CONTRACT 鍛樺伐鍚堝悓 =======================
+
+    String HRM_EMPLOYEE_CONTRACT_TYPE = "HRM 鍛樺伐鍚堝悓";
+    String HRM_EMPLOYEE_CONTRACT_IMPORT_SUB_TYPE = "瀵煎叆鍛樺伐鍚堝悓";
+    String HRM_EMPLOYEE_CONTRACT_IMPORT_SUCCESS = "瀵煎叆浜嗗憳宸ュ悎鍚岋細{{#importSummary}}";
+
+}
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeContractServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeContractServiceImpl.java
index 80cb347..2e95548 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeContractServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeContractServiceImpl.java
@@ -5,6 +5,7 @@
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractPageReqVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractRespVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractSaveReqVO;
@@ -20,6 +21,7 @@
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -38,6 +40,7 @@
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.hrm.enums.LogRecordConstants.*;
 
 /**
  * 鍛樺伐鍚堝悓 Service 瀹炵幇绫�
@@ -332,6 +335,8 @@
     }
 
     @Override
+    @LogRecord(type = HRM_EMPLOYEE_CONTRACT_TYPE, subType = HRM_EMPLOYEE_CONTRACT_IMPORT_SUB_TYPE, bizNo = "0",
+            success = HRM_EMPLOYEE_CONTRACT_IMPORT_SUCCESS)
     public HrmEmployeeContractImportRespVO importContractList(List<HrmEmployeeContractImportExcelVO> importContracts,
                                                               HrmEmployeeContractImportReqVO importReqVO) {
         // 1. 杩囨护鍛樺伐濮撳悕涓虹┖鐨勮
@@ -381,6 +386,9 @@
                 respVO.getFailureNames().put(name, ex.getMessage());
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateNames(), respVO.getUpdateNames(),
+                respVO.getFailureNames());
         return respVO;
     }
 
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
index eefe7a7..f03a1c0 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
@@ -6,6 +6,7 @@
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEducationSaveReqVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEmergencyContactSaveReqVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeImportExcelVO;
@@ -34,6 +35,7 @@
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdateReqDTO;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -54,6 +56,7 @@
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
 import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.hrm.enums.LogRecordConstants.*;
 
 /**
  * 鍛樺伐淇℃伅 Service 瀹炵幇绫�
@@ -381,6 +384,8 @@
     }
 
     @Override
+    @LogRecord(type = HRM_EMPLOYEE_TYPE, subType = HRM_EMPLOYEE_IMPORT_SUB_TYPE, bizNo = "0",
+            success = HRM_EMPLOYEE_IMPORT_SUCCESS)
     public HrmEmployeeImportRespVO importEmployeeList(List<HrmEmployeeImportExcelVO> importEmployees,
                                                       HrmEmployeeImportReqVO importReqVO) {
         // 1. 鏍¢獙闈炵┖
@@ -430,6 +435,9 @@
                 respVO.getFailureNames().put(name, ex.getMessage());
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateNames(), respVO.getUpdateNames(),
+                respVO.getFailureNames());
         return respVO;
     }
 
diff --git a/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/enums/LogRecordConstants.java b/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/enums/LogRecordConstants.java
new file mode 100644
index 0000000..b6f32c8
--- /dev/null
+++ b/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/enums/LogRecordConstants.java
@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.mdm.enums;
+
+/**
+ * MDM 鎿嶄綔鏃ュ織鏋氫妇
+ * 鐩殑锛氱粺涓�绠$悊锛屼篃鍑忓皯 Service 閲屽悇绉嶁�滃鏉傗�濆瓧绗︿覆
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public interface LogRecordConstants {
+
+    // ======================= MDM_ITEM 鐗╂枡 =======================
+
+    String MDM_ITEM_TYPE = "MDM 鐗╂枡";
+    String MDM_ITEM_IMPORT_SUB_TYPE = "瀵煎叆鐗╂枡";
+    String MDM_ITEM_IMPORT_SUCCESS = "瀵煎叆浜嗙墿鏂欙細{{#importSummary}}";
+
+    // ======================= MDM_UNIT_MEASURE 璁¢噺鍗曚綅 =======================
+
+    String MDM_UNIT_MEASURE_TYPE = "MDM 璁¢噺鍗曚綅";
+    String MDM_UNIT_MEASURE_IMPORT_SUB_TYPE = "瀵煎叆璁¢噺鍗曚綅";
+    String MDM_UNIT_MEASURE_IMPORT_SUCCESS = "瀵煎叆浜嗚閲忓崟浣嶏細{{#importSummary}}";
+
+}
diff --git a/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java b/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
index c3bc416..e1c5a82 100644
--- a/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
+++ b/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
@@ -7,6 +7,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportExcelVO;
 import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportRespVO;
 import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO;
@@ -26,6 +27,7 @@
 import cn.iocoder.yudao.module.mes.api.item.dto.MesMdItemSyncReqDTO;
 import cn.iocoder.yudao.module.mes.api.item.dto.MesMdItemTypeRespDTO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -39,6 +41,7 @@
 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.mdm.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.mdm.enums.LogRecordConstants.*;
 
 /**
  * MDM 鐗╂枡涓绘暟鎹� Service 瀹炵幇绫�
@@ -431,6 +434,8 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = MDM_ITEM_TYPE, subType = MDM_ITEM_IMPORT_SUB_TYPE, bizNo = "0",
+            success = MDM_ITEM_IMPORT_SUCCESS)
     public MdmItemImportRespVO importItemList(List<MdmItemImportExcelVO> importList, Boolean isUpdateSupport) {
         if (CollUtil.isEmpty(importList)) {
             throw exception(MDM_ITEM_IMPORT_LIST_IS_EMPTY);
@@ -547,6 +552,8 @@
                 respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), reason == null ? "瀵煎叆澶辫触" : reason);
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/unit/MdmUnitMeasureServiceImpl.java b/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/unit/MdmUnitMeasureServiceImpl.java
index 8660a6a..3c76993 100644
--- a/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/unit/MdmUnitMeasureServiceImpl.java
+++ b/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/unit/MdmUnitMeasureServiceImpl.java
@@ -5,6 +5,7 @@
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportExcelVO;
 import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportRespVO;
 import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO;
@@ -12,6 +13,7 @@
 import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO;
 import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper;
 import cn.iocoder.yudao.module.mdm.dal.mysql.unit.MdmUnitMeasureMapper;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -21,6 +23,7 @@
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.mdm.enums.LogRecordConstants.*;
 
 /**
  * MDM 璁¢噺鍗曚綅 Service 瀹炵幇绫�
@@ -130,6 +133,8 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = MDM_UNIT_MEASURE_TYPE, subType = MDM_UNIT_MEASURE_IMPORT_SUB_TYPE, bizNo = "0",
+            success = MDM_UNIT_MEASURE_IMPORT_SUCCESS)
     public MdmUnitMeasureImportRespVO importUnitMeasureList(List<MdmUnitMeasureImportExcelVO> importList, Boolean isUpdateSupport) {
         if (CollUtil.isEmpty(importList)) {
             throw exception(MDM_UNIT_MEASURE_IMPORT_LIST_IS_EMPTY);
@@ -194,6 +199,8 @@
                 importedCodeIdMap.put(importVO.getCode(), newObj.getId());
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/LogRecordConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/LogRecordConstants.java
new file mode 100644
index 0000000..f8fb8c4
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/LogRecordConstants.java
@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.mes.enums;
+
+/**
+ * MES 鎿嶄綔鏃ュ織鏋氫妇
+ * 鐩殑锛氱粺涓�绠$悊锛屼篃鍑忓皯 Service 閲屽悇绉嶁�滃鏉傗�濆瓧绗︿覆
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public interface LogRecordConstants {
+
+    // ======================= MES_WM_MATERIAL_STOCK 鐗╂枡搴撳瓨 =======================
+
+    String MES_WM_MATERIAL_STOCK_TYPE = "MES 鐗╂枡搴撳瓨";
+    String MES_WM_MATERIAL_STOCK_IMPORT_SUB_TYPE = "瀵煎叆鐗╂枡搴撳瓨";
+    String MES_WM_MATERIAL_STOCK_IMPORT_SUCCESS = "瀵煎叆浜嗙墿鏂欏簱瀛橈細{{#importSummary}}";
+
+    // ======================= MES_DV_METERING 浠〃 =======================
+
+    String MES_DV_METERING_TYPE = "MES 浠〃";
+    String MES_DV_METERING_IMPORT_SUB_TYPE = "瀵煎叆浠〃";
+    String MES_DV_METERING_IMPORT_SUCCESS = "瀵煎叆浜嗕华琛細{{#importSummary}}";
+
+    // ======================= MES_DV_MACHINERY 璁惧 =======================
+
+    String MES_DV_MACHINERY_TYPE = "MES 璁惧";
+    String MES_DV_MACHINERY_IMPORT_SUB_TYPE = "瀵煎叆璁惧";
+    String MES_DV_MACHINERY_IMPORT_SUCCESS = "瀵煎叆浜嗚澶囷細{{#importSummary}}";
+
+    // ======================= MES_MD_ITEM_TYPE 鐗╂枡鍒嗙被 =======================
+
+    // 鍓嶇紑閲岀殑 ITEM_TYPE 鏄笟鍔″璞″悕锛堢墿鏂欑被鍨嬶級鐨勪竴閮ㄥ垎锛屾墍浠ュ父閲忓悕浠� _TYPE_TYPE 缁撳熬锛屼笉鏄瑪璇�
+    String MES_MD_ITEM_TYPE_TYPE = "MES 鐗╂枡鍒嗙被";
+    String MES_MD_ITEM_TYPE_IMPORT_SUB_TYPE = "瀵煎叆鐗╂枡鍒嗙被";
+    String MES_MD_ITEM_TYPE_IMPORT_SUCCESS = "瀵煎叆浜嗙墿鏂欏垎绫伙細{{#importSummary}}";
+
+    // ======================= MES_QC_IPQC 杩囩▼妫�楠屽崟 =======================
+
+    String MES_QC_IPQC_TYPE = "MES 杩囩▼妫�楠屽崟";
+    String MES_QC_IPQC_IMPORT_SUB_TYPE = "瀵煎叆杩囩▼妫�楠屽崟";
+    String MES_QC_IPQC_IMPORT_SUCCESS = "瀵煎叆浜嗚繃绋嬫楠屽崟锛歿{#importSummary}}";
+
+    // ======================= MES_QC_IQC 鏉ユ枡妫�楠屽崟 =======================
+
+    String MES_QC_IQC_TYPE = "MES 鏉ユ枡妫�楠屽崟";
+    String MES_QC_IQC_IMPORT_SUB_TYPE = "瀵煎叆鏉ユ枡妫�楠屽崟";
+    String MES_QC_IQC_IMPORT_SUCCESS = "瀵煎叆浜嗘潵鏂欐楠屽崟锛歿{#importSummary}}";
+
+    // ======================= MES_QC_OQC 鍑鸿揣妫�楠屽崟 =======================
+
+    String MES_QC_OQC_TYPE = "MES 鍑鸿揣妫�楠屽崟";
+    String MES_QC_OQC_IMPORT_SUB_TYPE = "瀵煎叆鍑鸿揣妫�楠屽崟";
+    String MES_QC_OQC_IMPORT_SUCCESS = "瀵煎叆浜嗗嚭璐ф楠屽崟锛歿{#importSummary}}";
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryServiceImpl.java
index 35ded24..bb3c226 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryServiceImpl.java
@@ -6,6 +6,7 @@
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.MesDvMachineryImportExcelVO;
 import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.MesDvMachineryImportRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.MesDvMachineryPageReqVO;
@@ -21,6 +22,7 @@
 import cn.iocoder.yudao.module.mes.service.dv.repair.MesDvRepairService;
 import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkshopService;
 import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -34,6 +36,7 @@
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.mes.enums.LogRecordConstants.*;
 
 /**
  * MES 璁惧鍙拌处 Service 瀹炵幇绫�
@@ -197,6 +200,8 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = MES_DV_MACHINERY_TYPE, subType = MES_DV_MACHINERY_IMPORT_SUB_TYPE, bizNo = "0",
+            success = MES_DV_MACHINERY_IMPORT_SUCCESS)
     public MesDvMachineryImportRespVO importMachineryList(List<MesDvMachineryImportExcelVO> importMachineryList,
                                                           boolean updateSupport) {
         // 1. 鍙傛暟鏍¢獙
@@ -298,6 +303,8 @@
                 respVO.getFailureCodes().put(key, "璁惧缂栫爜宸插瓨鍦�");
             }
         });
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateCodes(), respVO.getUpdateCodes(), respVO.getFailureCodes());
         return respVO;
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/metering/MesDvMeteringServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/metering/MesDvMeteringServiceImpl.java
index d7e0633..02691c2 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/metering/MesDvMeteringServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/metering/MesDvMeteringServiceImpl.java
@@ -10,6 +10,7 @@
 import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
 import cn.iocoder.yudao.module.mes.controller.admin.dv.metering.vo.MesDvMeteringPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.dv.metering.vo.MesDvMeteringSaveReqVO;
@@ -17,6 +18,7 @@
 import cn.iocoder.yudao.module.mes.dal.mysql.dv.metering.MesDvMeteringMapper;
 import cn.iocoder.yudao.module.mes.service.dv.meteringcheck.MesDvMeteringCheckService;
 import cn.hutool.core.util.StrUtil;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -36,6 +38,7 @@
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.DV_METERING_CODE_DUPLICATE;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.DV_METERING_HAS_CHECK_RECORD;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.DV_METERING_NOT_EXISTS;
+import static cn.iocoder.yudao.module.mes.enums.LogRecordConstants.*;
 
 /**
  * MES 璁¢噺鍣ㄥ叿 Service 瀹炵幇绫�
@@ -83,6 +86,8 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = MES_DV_METERING_TYPE, subType = MES_DV_METERING_IMPORT_SUB_TYPE, bizNo = "0",
+            success = MES_DV_METERING_IMPORT_SUCCESS)
     public MesDvMeteringImportRespVO importMeteringList(List<MesDvMeteringImportExcelVO> importList) {
         MesDvMeteringImportRespVO respVO = MesDvMeteringImportRespVO.builder()
                 .createList(new ArrayList<>())
@@ -90,6 +95,8 @@
                 .failureList(new LinkedHashMap<>())
                 .build();
         if (CollUtil.isEmpty(importList)) {
+            // 绌烘枃浠朵篃瑕佺粰鏃ュ織鏂囨鍏滃簳锛岄伩鍏� {{#importSummary}} 鍙栦笉鍒板��
+            OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
             return respVO;
         }
 
@@ -122,6 +129,8 @@
                 respVO.getFailureList().put(label, resolveImportErrorMessage(ex));
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java
index 9d51f7c..1fcd864 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java
@@ -5,6 +5,7 @@
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.mdm.api.category.MdmItemCategoryApi;
 import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO;
 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportExcelVO;
@@ -13,6 +14,7 @@
 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemTypeMapper;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -22,6 +24,7 @@
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.mes.enums.LogRecordConstants.*;
 
 /**
  * MES 鐗╂枡浜у搧鍒嗙被 Service 瀹炵幇绫�
@@ -235,6 +238,8 @@
 
     @Override
     @org.springframework.transaction.annotation.Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = MES_MD_ITEM_TYPE_TYPE, subType = MES_MD_ITEM_TYPE_IMPORT_SUB_TYPE, bizNo = "0",
+            success = MES_MD_ITEM_TYPE_IMPORT_SUCCESS)
     public MesMdItemTypeImportRespVO importItemTypeList(List<MesMdItemTypeImportExcelVO> importList, Boolean isUpdateSupport) {
         if (CollUtil.isEmpty(importList)) {
             throw exception(MD_ITEM_TYPE_IMPORT_LIST_IS_EMPTY);
@@ -303,6 +308,8 @@
                 importedCodeIdMap.put(importVO.getCode(), newObj.getId());
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java
index 748207d..ae2dedb 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java
@@ -9,6 +9,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcImportExcelVO;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcSaveReqVO;
@@ -44,6 +45,7 @@
 import cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService;
 import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Lazy;
@@ -62,6 +64,7 @@
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.mes.enums.LogRecordConstants.*;
 
 /**
  * MES 杩囩▼妫�楠屽崟锛圛PQC锛� Service 瀹炵幇绫�
@@ -472,10 +475,14 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = MES_QC_IPQC_TYPE, subType = MES_QC_IPQC_IMPORT_SUB_TYPE, bizNo = "0",
+            success = MES_QC_IPQC_IMPORT_SUCCESS)
     public MesQcImportRespVO importIpqcList(List<MesQcIpqcImportExcelVO> importList) {
         MesQcImportRespVO respVO = MesQcImportRespVO.builder()
                 .createList(new ArrayList<>()).failureList(new LinkedHashMap<>()).build();
         if (CollUtil.isEmpty(importList)) {
+            // 绌烘枃浠朵篃瑕佺粰鏃ュ織鏂囨鍏滃簳锛岄伩鍏� {{#importSummary}} 鍙栦笉鍒板��
+            OperateLogUtils.putImportSummary(respVO.getCreateList(), null, respVO.getFailureList());
             return respVO;
         }
         qcImportHelper.startImport();
@@ -499,6 +506,8 @@
                 respVO.getFailureList().put(label, MesQcImportHelper.resolveImportErrorMessage(ex));
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), null, respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
index 353da9a..b62ec2d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
@@ -6,6 +6,7 @@
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.hutool.core.util.ObjectUtil;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcImportExcelVO;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcPageReqVO;
@@ -35,6 +36,7 @@
 import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
 import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -49,6 +51,7 @@
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.mes.enums.LogRecordConstants.*;
 
 /**
  * MES 鏉ユ枡妫�楠屽崟锛圛QC锛� Service 瀹炵幇绫�
@@ -437,10 +440,14 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = MES_QC_IQC_TYPE, subType = MES_QC_IQC_IMPORT_SUB_TYPE, bizNo = "0",
+            success = MES_QC_IQC_IMPORT_SUCCESS)
     public MesQcImportRespVO importIqcList(List<MesQcIqcImportExcelVO> importList) {
         MesQcImportRespVO respVO = MesQcImportRespVO.builder()
                 .createList(new ArrayList<>()).failureList(new LinkedHashMap<>()).build();
         if (CollUtil.isEmpty(importList)) {
+            // 绌烘枃浠朵篃瑕佺粰鏃ュ織鏂囨鍏滃簳锛岄伩鍏� {{#importSummary}} 鍙栦笉鍒板��
+            OperateLogUtils.putImportSummary(respVO.getCreateList(), null, respVO.getFailureList());
             return respVO;
         }
         qcImportHelper.startImport();
@@ -464,6 +471,8 @@
                 respVO.getFailureList().put(label, MesQcImportHelper.resolveImportErrorMessage(ex));
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), null, respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
index 0f21b7d..91c41ed 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
@@ -6,6 +6,7 @@
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.oqc.vo.MesQcOqcImportExcelVO;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.oqc.vo.MesQcOqcPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.oqc.vo.MesQcOqcSaveReqVO;
@@ -34,6 +35,7 @@
 import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
 import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -51,6 +53,7 @@
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.mes.enums.LogRecordConstants.*;
 
 /**
  * MES 鍑鸿揣妫�楠屽崟锛圤QC锛� Service 瀹炵幇绫�
@@ -413,10 +416,14 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = MES_QC_OQC_TYPE, subType = MES_QC_OQC_IMPORT_SUB_TYPE, bizNo = "0",
+            success = MES_QC_OQC_IMPORT_SUCCESS)
     public MesQcImportRespVO importOqcList(List<MesQcOqcImportExcelVO> importList) {
         MesQcImportRespVO respVO = MesQcImportRespVO.builder()
                 .createList(new ArrayList<>()).failureList(new LinkedHashMap<>()).build();
         if (CollUtil.isEmpty(importList)) {
+            // 绌烘枃浠朵篃瑕佺粰鏃ュ織鏂囨鍏滃簳锛岄伩鍏� {{#importSummary}} 鍙栦笉鍒板��
+            OperateLogUtils.putImportSummary(respVO.getCreateList(), null, respVO.getFailureList());
             return respVO;
         }
         qcImportHelper.startImport();
@@ -440,6 +447,8 @@
                 respVO.getFailureList().put(label, MesQcImportHelper.resolveImportErrorMessage(ex));
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), null, respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
index cccd0c3..d4a42da 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
@@ -8,6 +8,7 @@
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockAdjustReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockImportExcelVO;
@@ -40,6 +41,7 @@
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -57,6 +59,7 @@
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.mes.enums.LogRecordConstants.*;
 
 /**
  * MES 搴撳瓨鍙拌处 Service 瀹炵幇绫�
@@ -593,6 +596,8 @@
     }
 
     @Override
+    @LogRecord(type = MES_WM_MATERIAL_STOCK_TYPE, subType = MES_WM_MATERIAL_STOCK_IMPORT_SUB_TYPE, bizNo = "0",
+            success = MES_WM_MATERIAL_STOCK_IMPORT_SUCCESS)
     public MesWmMaterialStockImportRespVO importMaterialStockList(List<MesWmMaterialStockImportExcelVO> importList) {
         // 鎿嶄綔绫诲瀷鍙栧�硷細澧炲姞 / 鍑忓皯 / 瑕嗙洊
         final String OP_ADD = "澧炲姞";
@@ -755,6 +760,8 @@
                 respVO.getFailureNames().put(key, ex.getMessage());
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateNames(), respVO.getUpdateNames(), respVO.getFailureNames());
         return respVO;
     }
 
diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/enums/LogRecordConstants.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/enums/LogRecordConstants.java
index 6d6cb50..d637064 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/enums/LogRecordConstants.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/enums/LogRecordConstants.java
@@ -42,4 +42,9 @@
     String LOG_AWARD_ORDER_SUB_TYPE = "鐢熸垚閲囪喘璁㈠崟";
     String LOG_AWARD_ORDER_SUCCESS = "瀹氭爣璁板綍鐢熸垚浜嗛噰璐鍗�";
 
+    // ======================= SRM_SUPPLIER 渚涘簲鍟� =======================
+    String LOG_SUPPLIER_TYPE = "SRM 渚涘簲鍟�";
+    String LOG_SUPPLIER_IMPORT_SUB_TYPE = "瀵煎叆渚涘簲鍟�";
+    String LOG_SUPPLIER_IMPORT_SUCCESS = "瀵煎叆浜嗕緵搴斿晢锛歿{#importSummary}}";
+
 }
diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/supplier/SrmSupplierServiceImpl.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/supplier/SrmSupplierServiceImpl.java
index 129d4fa..5cc8fc5 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/supplier/SrmSupplierServiceImpl.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/supplier/SrmSupplierServiceImpl.java
@@ -8,6 +8,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.srm.controller.admin.supplier.vo.SrmSupplierImportExcelVO;
 import cn.iocoder.yudao.module.srm.controller.admin.supplier.vo.SrmSupplierImportRespVO;
 import cn.iocoder.yudao.module.srm.controller.admin.supplier.vo.SrmSupplierPageReqVO;
@@ -23,6 +24,7 @@
 import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderBidMapper;
 import cn.iocoder.yudao.module.srm.enums.ErrorCodeConstants;
 import cn.iocoder.yudao.module.srm.enums.SupplierTypeEnum;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
@@ -35,6 +37,8 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+
+import static cn.iocoder.yudao.module.srm.enums.LogRecordConstants.*;
 
 @Service
 @Validated
@@ -111,6 +115,8 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = LOG_SUPPLIER_TYPE, subType = LOG_SUPPLIER_IMPORT_SUB_TYPE, bizNo = "0",
+            success = LOG_SUPPLIER_IMPORT_SUCCESS)
     public SrmSupplierImportRespVO importSupplierList(List<SrmSupplierImportExcelVO> importList, Boolean updateSupport) {
         if (CollUtil.isEmpty(importList)) {
             throw ServiceExceptionUtil.exception(ErrorCodeConstants.SUPPLIER_IMPORT_LIST_IS_EMPTY);
@@ -149,6 +155,8 @@
                 respVO.getFailureList().put(name, reason == null ? "瀵煎叆澶辫触" : reason);
             }
         }
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
         return respVO;
     }
 
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java
index 974585a..888c91f 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java
@@ -2,6 +2,7 @@
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
@@ -129,6 +130,7 @@
     @PostMapping("/sms-login")
     @PermitAll
     @Operation(summary = "浣跨敤鐭俊楠岃瘉鐮佺櫥褰�")
+    @ApiAccessLog(sanitizeKeys = {"code"}) // 楠岃瘉鐮佹湰韬氨鏄櫥褰曞嚟璇侊紝涓嶈兘鍐欒繘璁块棶鏃ュ織
     // 鍙寜闇�寮�鍚檺娴侊細https://github.com/YunaiV/ruoyi-vue-pro/issues/851
     // @RateLimiter(time = 60, count = 6, keyResolver = ExpressionRateLimiterKeyResolver.class, keyArg = "#reqVO.mobile")
     public CommonResult<AuthLoginRespVO> smsLogin(@RequestBody @Valid AuthSmsLoginReqVO reqVO) {
@@ -146,6 +148,7 @@
     @PostMapping("/reset-password")
     @PermitAll
     @Operation(summary = "閲嶇疆瀵嗙爜")
+    @ApiAccessLog(sanitizeKeys = {"code"}) // 楠岃瘉鐮佺瓑浠蜂簬閲嶇疆瀵嗙爜鐨勫嚟璇侊紝涓嶈兘鍐欒繘璁块棶鏃ュ織
     public CommonResult<Boolean> resetPassword(@RequestBody @Valid AuthResetPasswordReqVO reqVO) {
         authService.resetPassword(reqVO);
         return success(true);
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/LogRecordConstants.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/LogRecordConstants.java
index 8dd10cd..3de35da 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/LogRecordConstants.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/enums/LogRecordConstants.java
@@ -19,6 +19,8 @@
     String SYSTEM_USER_DELETE_SUCCESS = "鍒犻櫎浜嗙敤鎴枫�恵{#user.nickname}}銆�";
     String SYSTEM_USER_UPDATE_PASSWORD_SUB_TYPE = "閲嶇疆鐢ㄦ埛瀵嗙爜";
     String SYSTEM_USER_UPDATE_PASSWORD_SUCCESS = "灏嗙敤鎴枫�恵{#user.nickname}}銆戠殑瀵嗙爜浠庛�恵{#user.password}}銆戦噸缃负銆恵{#newPassword}}銆�";
+    String SYSTEM_USER_IMPORT_SUB_TYPE = "瀵煎叆鐢ㄦ埛";
+    String SYSTEM_USER_IMPORT_SUCCESS = "瀵煎叆浜嗙敤鎴凤細{{#importSummary}}";
 
     // ======================= SYSTEM_ROLE 瑙掕壊 =======================
 
@@ -30,4 +32,16 @@
     String SYSTEM_ROLE_DELETE_SUB_TYPE = "鍒犻櫎瑙掕壊";
     String SYSTEM_ROLE_DELETE_SUCCESS = "鍒犻櫎浜嗚鑹层�恵{#role.name}}銆�";
 
+    // ======================= SYSTEM_POST 宀椾綅 =======================
+
+    String SYSTEM_POST_TYPE = "SYSTEM 宀椾綅";
+    String SYSTEM_POST_IMPORT_SUB_TYPE = "瀵煎叆宀椾綅";
+    String SYSTEM_POST_IMPORT_SUCCESS = "瀵煎叆浜嗗矖浣嶏細{{#importSummary}}";
+
+    // ======================= SYSTEM_DEPT 閮ㄩ棬 =======================
+
+    String SYSTEM_DEPT_TYPE = "SYSTEM 閮ㄩ棬";
+    String SYSTEM_DEPT_IMPORT_SUB_TYPE = "瀵煎叆閮ㄩ棬";
+    String SYSTEM_DEPT_IMPORT_SUCCESS = "瀵煎叆浜嗛儴闂細{{#importSummary}}";
+
 }
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java
index 79da07a..0938ad4 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java
@@ -14,7 +14,9 @@
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper;
 import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import com.google.common.annotations.VisibleForTesting;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
@@ -27,6 +29,7 @@
 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.system.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*;
 
 /**
  * 閮ㄩ棬 Service 瀹炵幇绫�
@@ -240,6 +243,8 @@
     }
 
     @Override
+    @LogRecord(type = SYSTEM_DEPT_TYPE, subType = SYSTEM_DEPT_IMPORT_SUB_TYPE, bizNo = "0",
+            success = SYSTEM_DEPT_IMPORT_SUCCESS)
     public DeptImportRespVO importDeptList(List<DeptImportExcelVO> importDepts, boolean isUpdateSupport) {
         if (CollUtil.isEmpty(importDepts)) {
             throw exception(DEPT_IMPORT_LIST_IS_EMPTY);
@@ -302,6 +307,9 @@
             fullPathDeptIdMap.put(myFullPath, newDept.getId());
         }
 
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateDeptNames(), respVO.getUpdateDeptNames(),
+                respVO.getFailureDeptNames());
         return respVO;
     }
 
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java
index 79afd74..04ae90f 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java
@@ -20,12 +20,15 @@
 import java.util.LinkedHashMap;
 
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostImportExcelVO;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostImportRespVO;
+import com.mzt.logapi.starter.annotation.LogRecord;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*;
 
 /**
  * 宀椾綅 Service 瀹炵幇绫�
@@ -163,6 +166,8 @@
     }
 
     @Override
+    @LogRecord(type = SYSTEM_POST_TYPE, subType = SYSTEM_POST_IMPORT_SUB_TYPE, bizNo = "0",
+            success = SYSTEM_POST_IMPORT_SUCCESS)
     public PostImportRespVO importPostList(List<PostImportExcelVO> importPosts, boolean isUpdateSupport) {
         if (CollUtil.isEmpty(importPosts)) {
             throw exception(POST_IMPORT_LIST_IS_EMPTY);
@@ -207,6 +212,9 @@
             postMapper.updateById(updatePost);
             respVO.getUpdatePostNames().add(importPost.getName());
         });
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreatePostNames(), respVO.getUpdatePostNames(),
+                respVO.getFailurePostNames());
         return respVO;
     }
 }
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
index be474d2..6099e11 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
@@ -31,6 +31,7 @@
 import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
 import cn.iocoder.yudao.module.system.service.permission.PermissionService;
 import cn.iocoder.yudao.module.system.service.tenant.TenantService;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import com.google.common.annotations.VisibleForTesting;
 import com.mzt.logapi.context.LogRecordContext;
 import com.mzt.logapi.service.impl.DiffParseFunction;
@@ -506,6 +507,8 @@
     }
 
     @Override
+    @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_IMPORT_SUB_TYPE, bizNo = "0",
+            success = SYSTEM_USER_IMPORT_SUCCESS)
     @Transactional(rollbackFor = Exception.class) // 娣诲姞浜嬪姟锛屽紓甯稿垯鍥炴粴鎵�鏈夊鍏�
     public UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport) {
         // 1.1 鍙傛暟鏍¢獙
@@ -559,6 +562,9 @@
             userMapper.updateById(updateUser);
             respVO.getUpdateUsernames().add(importUser.getUsername());
         });
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateUsernames(), respVO.getUpdateUsernames(),
+                respVO.getFailureUsernames());
         return respVO;
     }
 
diff --git a/yudao-server/src/main/resources/application-hm.yaml b/yudao-server/src/main/resources/application-hm.yaml
index c8309b3..742e335 100644
--- a/yudao-server/src/main/resources/application-hm.yaml
+++ b/yudao-server/src/main/resources/application-hm.yaml
@@ -185,7 +185,7 @@
   security:
     mock-enable: true
   access-log: # 璁块棶鏃ュ織鐨勯厤缃」
-    enable: false
+    enable: true # 鎯犵墽寮�鍚細鎵�鏈� /admin-api銆�/app-api 璇锋眰钀� infra_api_access_log锛堝惈鍏ュ弬锛夛紝浣滀负鎿嶄綔鐣欑棔鍏滃簳锛涘瘑鐮�/瀵嗛挜绫诲瓧娈电敱妗嗘灦缁熶竴鑴辨晱锛圓piAccessLogFilter.SANITIZE_KEYS锛夛紝鐭俊楠岃瘉鐮佺瓑涓庝笟鍔″瓧娈甸噸鍚嶇殑 key 鐢辨帴鍙g敤 @ApiAccessLog(sanitizeKeys = ...) 鎸囧畾
   demo: false # 鍏抽棴婕旂ず妯″紡
   storage: # 鏂囦欢涓婁紶閰嶇疆
     path: /data/javaWork/mom/file # 鏂囦欢瀛樺偍鏍圭洰褰�

--
Gitblit v1.9.3