From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-biz-common/jnpf-biz-common-audit/src/main/resources/mapper/AuditEventMapper.xml |  136 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 136 insertions(+), 0 deletions(-)

diff --git a/jnpf-biz-common/jnpf-biz-common-audit/src/main/resources/mapper/AuditEventMapper.xml b/jnpf-biz-common/jnpf-biz-common-audit/src/main/resources/mapper/AuditEventMapper.xml
new file mode 100644
index 0000000..17cb379
--- /dev/null
+++ b/jnpf-biz-common/jnpf-biz-common-audit/src/main/resources/mapper/AuditEventMapper.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="jnpf.bizcommon.audit.mapper.AuditEventMapper">
+
+    <!-- 鑷畾涔� SQL 涓嶈鍙� MyBatis-Plus @TableField锛屽繀椤绘樉寮忔槧灏勪笅鍒掔嚎鍒楀悕銆� -->
+    <resultMap id="AuditEventResultMap" type="jnpf.bizcommon.audit.entity.AuditEventEntity">
+        <id column="id" property="id"/>
+        <result column="client_event_id" property="clientEventId"/>
+        <result column="operation_id" property="operationId"/>
+        <result column="event_time" property="eventTime"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="operator_id" property="operatorId"/>
+        <result column="operator_name" property="operatorName"/>
+        <result column="operator_org_id" property="operatorOrgId"/>
+        <result column="app_name" property="appName"/>
+        <result column="biz_module" property="bizModule"/>
+        <result column="ip" property="ip"/>
+        <result column="ip_region" property="ipRegion"/>
+        <result column="browser" property="browser"/>
+        <result column="os" property="os"/>
+        <result column="request_uri" property="requestUri"/>
+        <result column="event_type" property="eventType"/>
+        <result column="event_category" property="eventCategory"/>
+        <result column="action_code" property="actionCode"/>
+        <result column="action_label" property="actionLabel"/>
+        <result column="source_layer" property="sourceLayer"/>
+        <result column="target_table" property="targetTable"/>
+        <result column="target_id" property="targetId"/>
+        <result column="biz_type" property="bizType"/>
+        <result column="biz_code" property="bizCode"/>
+        <result column="field_diffs" property="fieldDiffs"/>
+        <result column="extra" property="extra"/>
+        <result column="data_snapshot" property="dataSnapshot"/>
+        <result column="reason" property="reason"/>
+        <result column="record_title" property="recordTitle"/>
+        <result column="entry_type" property="entryType"/>
+        <result column="entry_id" property="entryId"/>
+        <result column="entry_name" property="entryName"/>
+        <result column="prev_hash" property="prevHash"/>
+        <result column="created_at" property="createdAt"/>
+    </resultMap>
+
+    <insert id="insertIgnore" parameterType="jnpf.bizcommon.audit.entity.AuditEventEntity">
+        INSERT INTO audit_events (client_event_id, operation_id, event_time, tenant_id,
+            operator_id, operator_name, operator_org_id, app_name, biz_module,
+            ip, ip_region, browser, os, request_uri,
+            event_type, event_category, action_code, action_label, source_layer,
+            target_table, target_id, biz_type, biz_code,
+            field_diffs, extra, data_snapshot, reason,
+            record_title, entry_type, entry_id, entry_name, prev_hash)
+        VALUES (#{clientEventId}, #{operationId}, #{eventTime}, #{tenantId},
+            #{operatorId}, #{operatorName}, #{operatorOrgId}, #{appName}, #{bizModule},
+            #{ip}, #{ipRegion}, #{browser}, #{os}, #{requestUri},
+            #{eventType}, #{eventCategory}, #{actionCode}, #{actionLabel}, #{sourceLayer},
+            #{targetTable}, #{targetId}, #{bizType}, #{bizCode},
+            #{fieldDiffs}, #{extra}, #{dataSnapshot}, #{reason},
+            #{recordTitle}, #{entryType}, #{entryId}, #{entryName}, #{prevHash})
+        ON CONFLICT DO NOTHING
+    </insert>
+
+    <select id="selectByOperationCategoryForUpdate" resultMap="AuditEventResultMap">
+        SELECT id, client_event_id, operation_id, event_time, tenant_id,
+               operator_id, operator_name, operator_org_id, app_name, biz_module,
+               ip, ip_region, browser, os, request_uri,
+               event_type, event_category, action_code, action_label, source_layer,
+               target_table, target_id, biz_type, biz_code,
+               field_diffs, extra, data_snapshot, reason,
+               record_title, entry_type, entry_id, entry_name, prev_hash, created_at
+          FROM audit_events
+         WHERE operation_id = #{operationId}
+           AND event_category = #{eventCategory}
+         FOR UPDATE
+    </select>
+
+    <update id="updateMerged" parameterType="jnpf.bizcommon.audit.entity.AuditEventEntity">
+        UPDATE audit_events
+           SET event_time = #{eventTime}, tenant_id = #{tenantId},
+               operator_id = #{operatorId}, operator_name = #{operatorName},
+               operator_org_id = #{operatorOrgId}, app_name = #{appName},
+               biz_module = #{bizModule}, ip = #{ip}, ip_region = #{ipRegion},
+               browser = #{browser}, os = #{os}, request_uri = #{requestUri},
+               event_type = #{eventType}, action_code = #{actionCode},
+               action_label = #{actionLabel}, source_layer = #{sourceLayer},
+               target_table = #{targetTable}, target_id = #{targetId},
+               biz_type = #{bizType}, biz_code = #{bizCode},
+               field_diffs = #{fieldDiffs}, extra = #{extra},
+               data_snapshot = #{dataSnapshot}, reason = #{reason},
+               record_title = #{recordTitle}, entry_type = #{entryType},
+               entry_id = #{entryId}, entry_name = #{entryName}, prev_hash = #{prevHash}
+         WHERE id = #{id}
+    </update>
+
+    <!-- 宸茶杩囩鍚嶄簨浠剁殑 signId锛圓1-b锛�2026-08-03锛孋odex 缁堝 High鈶級銆�
+         璧� idx_audit_events_target (target_table, target_id)鈥斺�攖arget_table 鏄墠瀵煎垪锛�
+         鑰岀鍚嶄簨浠剁殑 target_table 鎭掍负绛惧悕鍑瘉琛ㄣ�乼arget_id 鎭掍负 signId锛屾晠 IN 鐩存帴鎵撳湪绱㈠紩涓娿��
+
+         **鎺掗櫎鏈 operation_id**锛歁Q 閲嶆姇閫掍細璁╁悓涓�鏉′簨浠惰娑堣垂涓ゆ锛屾壒閲忓満鏅笅 N 鏉′簨浠�
+         杩樺叡浜悓涓�涓� batchOpId銆備笉鎺掗櫎鐨勮瘽锛屽悓涓�娆℃搷浣滆嚜宸卞垰鍐欎笅鐨勭鍚嶄簨浠朵細鎶婅嚜宸卞垽鎴愬巻鍙诧紝
+         鍒ゅ畾灏变笉鍐嶅銆屽悓涓�娆℃搷浣溿�嶄繚鎸佺ǔ瀹氥�俹peration_id 鍙负 NULL锛堟棫鏁版嵁锛夛紝鏄惧紡鏀捐銆�
+
+         **涓嶆寜 tenant_id 鏀剁獎**锛歴ignId 鏄洩鑺� id銆佸叏灞�鍞竴锛屽涓�涓潯浠跺彧浼氬湪绉熸埛鍒楁紓绉绘椂
+         鎶娿�岃杩囥�嶈鍒ゆ垚銆屾病璁拌繃銆嶏紝鑰岄偅涓柟鍚戠殑璇垽浼氶噸鍙戜竴鏉″巻鍙茬鍚嶄簨浠垛�斺�旀鏄闃茬殑銆� -->
+    <!-- 馃敶 鍒ゆ嵁蹇呴』鍚屾椂閽夋 action_code **涓� source_layer**锛�2026-08-03 Codex 缁堝缂洪櫡 2锛夈��
+         `event_type='E_SIGNATURE' + target_table='lims_sign'` 杩欎釜缁勫悎涓嬪疄娴嬫湁涓変釜灞傘�佸洓绉嶅姩浣滐細
+             source_layer=0 action_code=SIGN       83 鏉�  鈫� 鍙湁杩欎竴绫绘槸鏈垽瀹氱殑瀵硅薄
+             source_layer=2 action_code=SIGN        8 鏉�
+             source_layer=2 action_code=SIGN_FAIL   2 鏉�
+             source_layer=3 action_code=SIGN_USED   8 鏉�
+         鍙瓫 event_type 浼氭妸鍚� 18 鏉′篃绠楁垚銆屽眰 0 璁拌繃浜嗐�嶏紝浜庢槸鐪熷疄鐨勫鏍哥鍚嶈鍒ゆ垚鍘嗗彶銆�
+         鏈 SIGN 浜嬩欢琚姂鍒躲��**鍏夊姞 action_code='SIGN' 杩樹笉澶�**鈥斺�斿眰 2 涔熷啓杩欎釜鍔ㄤ綔鐮侊紝
+         鎵�浠� source_layer 涓�骞堕拤浣忋��
+         绉熸埛鏀剁獎锛堢己闄� 5锛夛細lims_sign 涓婚敭鏄� (f_id, f_tenant_id)锛宖_id 鍗曞垪鍞竴**涓嶆槸**
+         鏁版嵁搴撲笉鍙橀噺锛岃法绉熸埛鎾炶溅鏃朵細鎶婂埆浜虹鎴疯杩囩殑绛惧悕绠楁垚鏈鎴风殑鍘嗗彶銆�
+         **鎭掓敹绐勶紝娌℃湁銆岀己甯椂鏀捐銆嶇殑閫冮��**锛�2026-08-05 Codex 澶嶅 Medium鈶級锛氳皟鐢ㄦ柟鐨�
+         AuditCtx.tenantId 鍒濆�煎氨鏄� AuditApiConsts.DEFAULT_TENANT_ID銆乤pplyTenant 鍙湪鎷垮埌
+         闈炵┖鐧藉�兼椂鎵嶈鐩栵紝**姘镐笉涓� null**鈥斺�斿師鍏堥偅涓� `#{tenantId} IS NULL OR` 鍓嶅崐姘歌繙涓嶆垚绔嬶紝
+         鏄粠鏈敓鏁堣繃鐨勬浠g爜锛岃繛甯﹂偅娈点�岀己甯椂涓嶆敹绐勩�嶇殑娉ㄩ噴涔熷湪鎻忚堪涓�涓笉瀛樺湪鐨勮涓恒��
+         鑰屽啓鍏ヤ晶鐨勭鍚嶄簨浠跺悓鏍疯惤 ctx.tenantId锛堣 listener 鐨� .tenantId(ctx.tenantId)锛夛紝
+         涓や晶鍚屾簮锛屾亽鏀剁獎涓嶄細婕忔煡鑷繁鍐欎笅鐨勯偅浜涜銆� -->
+    <select id="selectRecordedSignIds" resultType="java.lang.String">
+        SELECT DISTINCT target_id FROM audit_events
+         WHERE target_table = #{signTable}
+           AND event_type = #{eventType}
+           AND action_code = #{actionCode}
+           AND source_layer = #{sourceLayer}
+           AND target_id IN
+        <foreach collection="signIds" item="signId" open="(" separator="," close=")">
+            #{signId}
+        </foreach>
+           AND (operation_id IS NULL OR operation_id &lt;&gt; #{operationId})
+           AND tenant_id = #{tenantId}
+    </select>
+
+</mapper>

--
Gitblit v1.8.0