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-dms/jnpf-dms-biz/src/main/java/jnpf/dmsMapper/DmsAccessExclusionMapper.java |  105 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 105 insertions(+), 0 deletions(-)

diff --git a/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsMapper/DmsAccessExclusionMapper.java b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsMapper/DmsAccessExclusionMapper.java
new file mode 100644
index 0000000..e4d3c61
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsMapper/DmsAccessExclusionMapper.java
@@ -0,0 +1,105 @@
+package jnpf.dmsMapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import jnpf.dmsEntity.permission.entity.DmsAccessExclusionEntity;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+@Mapper
+public interface DmsAccessExclusionMapper extends BaseMapper<DmsAccessExclusionEntity> {
+    String COLUMNS = "id, tenant_id, resource_type, resource_id, user_id, action_code, source_type, "
+            + "source_id, valid_from, valid_to, exclude_reason, excluded_by_type, excluded_by_id, "
+            + "revoked_at, revoked_by_type, revoked_by_id, revoke_reason, revision, created_at, updated_at";
+
+    @Select("SELECT 1 FROM (SELECT pg_advisory_xact_lock(hashtextextended(#{tenantId} || ':' "
+            + "|| #{sourceType} || ':' || #{sourceId}, 0))) advisory_lock")
+    Integer lockSource(@Param("tenantId") String tenantId,
+                       @Param("sourceType") String sourceType,
+                       @Param("sourceId") String sourceId);
+
+    @Select("SELECT " + COLUMNS + " FROM public.dms_access_exclusions "
+            + "WHERE tenant_id = #{tenantId} AND source_type = #{sourceType} "
+            + "AND source_id = #{sourceId} ORDER BY id")
+    List<DmsAccessExclusionEntity> selectBySource(@Param("tenantId") String tenantId,
+                                                   @Param("sourceType") String sourceType,
+                                                   @Param("sourceId") String sourceId);
+
+    @Insert({"<script>",
+            "INSERT INTO public.dms_access_exclusions (id, tenant_id, resource_type, resource_id, user_id,",
+            "action_code, source_type, source_id, valid_from, valid_to, exclude_reason, excluded_by_type,",
+            "excluded_by_id) VALUES",
+            "<foreach collection='items' item='item' separator=','>",
+            "(uuidv7(), #{item.tenantId}, #{item.resourceType}, #{item.resourceId}, #{item.userId},",
+            "#{item.actionCode}, #{item.sourceType}, #{item.sourceId}, #{item.validFrom}, #{item.validTo},",
+            "#{item.excludeReason}, #{item.excludedByType}, #{item.excludedById})",
+            "</foreach>",
+            "</script>"})
+    int insertBatch(@Param("items") List<DmsAccessExclusionEntity> items);
+
+    @Select({"<script>",
+            "SELECT ", COLUMNS, " FROM public.dms_access_exclusions",
+            "WHERE tenant_id = #{tenantId} AND id IN",
+            "<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach>",
+            "ORDER BY id FOR UPDATE",
+            "</script>"})
+    List<DmsAccessExclusionEntity> selectByTenantAndIdsForUpdate(@Param("tenantId") String tenantId,
+                                                                  @Param("ids") List<UUID> ids);
+
+    @Select({"<script>",
+            "SELECT ", COLUMNS, " FROM public.dms_access_exclusions",
+            "WHERE tenant_id = #{tenantId} AND id IN",
+            "<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach>",
+            "ORDER BY id",
+            "</script>"})
+    List<DmsAccessExclusionEntity> selectByTenantAndIds(@Param("tenantId") String tenantId,
+                                                         @Param("ids") List<UUID> ids);
+
+    @Update({"<script>",
+            "UPDATE public.dms_access_exclusions SET revoked_at = CURRENT_TIMESTAMP,",
+            "revoked_by_type = #{actorType}, revoked_by_id = #{actorId}, revoke_reason = #{reason},",
+            "revision = revision + 1 WHERE tenant_id = #{tenantId} AND revoked_at IS NULL AND id IN",
+            "<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach>",
+            "</script>"})
+    int revokeBatch(@Param("tenantId") String tenantId,
+                    @Param("ids") List<UUID> ids,
+                    @Param("actorType") String actorType,
+                    @Param("actorId") String actorId,
+                    @Param("reason") String reason);
+
+    @Select({"<script>",
+            "SELECT ", COLUMNS, " FROM public.dms_access_exclusions",
+            "WHERE tenant_id = #{tenantId}",
+            "<if test='resourceId != null'>AND resource_id = #{resourceId}</if>",
+            "<if test='userId != null and userId != \"\"'>AND user_id = #{userId}</if>",
+            "<if test='cursorTime != null'>",
+            "AND (created_at, id) &lt; (#{cursorTime}, #{cursorId})",
+            "</if>",
+            "ORDER BY created_at DESC, id DESC LIMIT #{limit}",
+            "</script>"})
+    List<DmsAccessExclusionEntity> selectPage(@Param("tenantId") String tenantId,
+                                               @Param("resourceId") UUID resourceId,
+                                               @Param("userId") String userId,
+                                               @Param("cursorTime") Date cursorTime,
+                                               @Param("cursorId") UUID cursorId,
+                                               @Param("limit") int limit);
+
+    @Select({"<script>",
+            "SELECT ", COLUMNS, " FROM public.dms_access_exclusions",
+            "WHERE tenant_id = #{tenantId} AND user_id = #{userId} AND action_code = 'READ'",
+            "AND revoked_at IS NULL AND valid_from &lt;= CURRENT_TIMESTAMP",
+            "AND (valid_to IS NULL OR CURRENT_TIMESTAMP &lt; valid_to)",
+            "AND resource_id IN",
+            "<foreach collection='resourceIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>",
+            "ORDER BY resource_type, resource_id, created_at, id",
+            "</script>"})
+    List<DmsAccessExclusionEntity> selectActiveForResourceIds(@Param("tenantId") String tenantId,
+                                                               @Param("userId") String userId,
+                                                               @Param("resourceIds") List<UUID> resourceIds);
+}

--
Gitblit v1.8.0