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 <> #{operationId})
+ AND tenant_id = #{tenantId}
+ </select>
+
+</mapper>
--
Gitblit v1.8.0