刘光辉
昨天 bb638871a7fb692d80f1b7a758f991dc0879002c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package jnpf.dmsMapper;
 
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import jnpf.dmsEntity.permission.entity.DmsPermissionResourceEntity;
import jnpf.dmsEntity.permission.vo.DmsPermissionResourceVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
 
import java.util.Date;
import java.util.List;
import java.util.UUID;
 
@Mapper
public interface DmsPermissionResourceMapper extends BaseMapper<DmsPermissionResourceEntity> {
    String RESOURCE_VIEW_SQL = "SELECT r.id, r.resource_type, "
            + "CASE r.resource_type WHEN 'FOLDER' THEN f.parent_id WHEN 'DOCUMENT' THEN d.folder_id "
            + "WHEN 'FILE_VERSION' THEN v.document_id END AS parent_id, "
            + "CASE r.resource_type WHEN 'FOLDER' THEN f.name WHEN 'DOCUMENT' THEN d.name "
            + "WHEN 'FILE_VERSION' THEN v.file_name END AS name, "
            + "CASE r.resource_type WHEN 'DOCUMENT' THEN d.id "
            + "WHEN 'FILE_VERSION' THEN v.document_id END AS document_id, "
            + "COALESCE(d.name, version_document.name) AS document_name, "
            + "COALESCE(d.document_no, version_document.document_no) AS document_no, "
            + "COALESCE(v.version_no, current_version.version_no) AS version_no, "
            + "COALESCE(v.version_label, current_version.version_label) AS version_label, "
            + "COALESCE(v.file_name, current_version.file_name) AS file_name, "
            + "COALESCE(v.mime_type, current_version.mime_type) AS mime_type, "
            + "COALESCE(v.size_bytes, current_version.size_bytes) AS size_bytes, "
            + "COALESCE(v.checksum_sha256, current_version.checksum_sha256) AS checksum_sha256, "
            + "COALESCE(version_state.lifecycle_status, current_state.lifecycle_status) AS lifecycle_status, "
            + "COALESCE(version_state.effective_from, current_state.effective_from) AS effective_from, "
            + "COALESCE(version_state.effective_to, current_state.effective_to) AS effective_to, "
            + "r.source_type, r.source_id, CASE r.resource_type "
            + "WHEN 'FOLDER' THEN f.created_at WHEN 'DOCUMENT' THEN current_version.created_at "
            + "WHEN 'FILE_VERSION' THEN v.created_at ELSE r.created_at END AS created_at "
            + "FROM public.dms_permission_resources r "
            + "LEFT JOIN public.dms_folders f ON r.resource_type = 'FOLDER' "
            + "AND f.tenant_id = r.tenant_id AND f.id = r.id "
            + "LEFT JOIN public.dms_documents d ON r.resource_type = 'DOCUMENT' "
            + "AND d.tenant_id = r.tenant_id AND d.id = r.id "
            + "LEFT JOIN public.dms_file_versions v ON r.resource_type = 'FILE_VERSION' "
            + "AND v.tenant_id = r.tenant_id AND v.id = r.id "
            + "LEFT JOIN public.dms_documents version_document ON r.resource_type = 'FILE_VERSION' "
            + "AND version_document.tenant_id = v.tenant_id AND version_document.id = v.document_id "
            + "LEFT JOIN public.dms_version_states current_state ON r.resource_type = 'DOCUMENT' "
            + "AND current_state.tenant_id = r.tenant_id AND current_state.document_id = r.id "
            + "AND current_state.lifecycle_status = 'EFFECTIVE' "
            + "AND CURRENT_TIMESTAMP >= current_state.effective_from "
            + "AND (current_state.effective_to IS NULL OR current_state.effective_to > CURRENT_TIMESTAMP) "
            + "LEFT JOIN public.dms_file_versions current_version ON current_version.tenant_id = current_state.tenant_id "
            + "AND current_version.document_id = current_state.document_id "
            + "AND current_version.id = current_state.file_version_id "
            + "LEFT JOIN public.dms_version_states version_state ON r.resource_type = 'FILE_VERSION' "
            + "AND version_state.tenant_id = v.tenant_id AND version_state.document_id = v.document_id "
            + "AND version_state.file_version_id = v.id ";
 
    @Select("SELECT uuidv7()")
    UUID nextUuidV7();
 
    @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 id, tenant_id, resource_type, source_type, source_id, registered_by, created_at "
            + "FROM public.dms_permission_resources WHERE tenant_id = #{tenantId} AND id = #{id}")
    DmsPermissionResourceEntity selectByTenantAndId(@Param("tenantId") String tenantId,
                                                     @Param("id") UUID id);
 
    @Select("SELECT id, tenant_id, resource_type, source_type, source_id, registered_by, created_at "
            + "FROM public.dms_permission_resources WHERE tenant_id = #{tenantId} "
            + "AND source_type = #{sourceType} AND source_id = #{sourceId}")
    DmsPermissionResourceEntity selectBySource(@Param("tenantId") String tenantId,
                                                @Param("sourceType") String sourceType,
                                                @Param("sourceId") String sourceId);
 
    @Select({"<script>",
            "SELECT id, tenant_id, resource_type, source_type, source_id, registered_by, created_at",
            "FROM public.dms_permission_resources WHERE tenant_id = #{tenantId} AND id IN",
            "<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach>",
            "</script>"})
    List<DmsPermissionResourceEntity> selectByTenantAndIds(@Param("tenantId") String tenantId,
                                                            @Param("ids") List<UUID> ids);
 
    @Select(RESOURCE_VIEW_SQL + "WHERE r.tenant_id = #{tenantId} AND r.id = #{id}")
    DmsPermissionResourceVO selectView(@Param("tenantId") String tenantId, @Param("id") UUID id);
 
    @Select({"<script>", RESOURCE_VIEW_SQL,
            "WHERE r.tenant_id = #{tenantId}",
            "<if test='resourceType != null and resourceType != \"\"'>",
            "AND r.resource_type = #{resourceType}",
            "</if>",
            "<if test='cursorTime != null'>",
            "AND (r.created_at, r.id) &lt; (#{cursorTime}, #{cursorId})",
            "</if>",
            "ORDER BY r.created_at DESC, r.id DESC LIMIT #{limit}",
            "</script>"})
    List<DmsPermissionResourceVO> selectPage(@Param("tenantId") String tenantId,
                                              @Param("resourceType") String resourceType,
                                              @Param("cursorTime") Date cursorTime,
                                              @Param("cursorId") UUID cursorId,
                                              @Param("limit") int limit);
 
    @Select({"<script>", RESOURCE_VIEW_SQL,
            "WHERE r.tenant_id = #{tenantId}",
            "<choose>",
            "<when test='parentId == null'>",
            "AND r.resource_type = 'FOLDER' AND f.parent_id IS NULL",
            "</when>",
            "<otherwise>",
            "AND ((r.resource_type = 'FOLDER' AND f.parent_id = #{parentId})",
            "OR (r.resource_type = 'DOCUMENT' AND d.folder_id = #{parentId})",
            "OR (r.resource_type = 'FILE_VERSION' AND v.document_id = #{parentId}))",
            "</otherwise>",
            "</choose>",
            "ORDER BY r.resource_type, name, r.id LIMIT #{limit}",
            "</script>"})
    List<DmsPermissionResourceVO> selectChildren(@Param("tenantId") String tenantId,
                                                  @Param("parentId") UUID parentId,
                                                  @Param("limit") int limit);
 
}