刘光辉
5 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
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 DOCUMENT_DIRECTORY_NAME = "COALESCE((SELECT initial_version.file_name "
            + "FROM public.dms_file_versions initial_version "
            + "WHERE initial_version.tenant_id = d.tenant_id AND initial_version.document_id = d.id "
            + "ORDER BY initial_version.version_no, initial_version.id LIMIT 1), d.name)";
 
    String RESOURCE_VIEW_SELECT_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 "
            + DOCUMENT_DIRECTORY_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, "
            + "CASE WHEN r.resource_type = 'DOCUMENT' THEN " + DOCUMENT_DIRECTORY_NAME
            + " ELSE version_document.name END AS document_name, "
            + "COALESCE(d.document_no, version_document.document_no) AS document_no, "
            + "COALESCE(d.document_type, version_document.document_type) AS document_type, "
            + "COALESCE(d.responsible_dept_id, version_document.responsible_dept_id) AS responsible_dept_id, "
            + "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(v.prepared_by, current_version.prepared_by) AS prepared_by, "
            + "COALESCE(v.prepared_on, current_version.prepared_on) AS prepared_on, "
            + "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, "
            + "COALESCE(version_state.review_cycle_months, current_state.review_cycle_months) AS review_cycle_months, "
            + "COALESCE(version_state.last_reviewed_on, current_state.last_reviewed_on) AS last_reviewed_on, "
            + "COALESCE(version_state.next_review_on, current_state.next_review_on) AS next_review_on, "
            + "CASE WHEN r.resource_type = 'FOLDER' THEN f.sort_code END AS sort_code, "
            + "CASE WHEN r.resource_type = 'FOLDER' THEN f.revision END AS revision, "
            + "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 ";
 
    String RESOURCE_VIEW_FROM_SQL = "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 ";
 
    String RESOURCE_VIEW_SQL = RESOURCE_VIEW_SELECT_SQL + RESOURCE_VIEW_FROM_SQL;
 
    String FILE_SEARCH_SCOPE = "WITH RECURSIVE search_folders(id) AS ( "
            + "<choose><when test='parentId != null'> "
            + "SELECT f.id FROM public.dms_folders f WHERE f.tenant_id = #{tenantId} "
            + "AND f.id = #{parentId} AND f.f_delete_mark IS NULL "
            + "</when><otherwise>SELECT NULL::UUID WHERE FALSE</otherwise></choose> "
            + "UNION ALL SELECT child.id FROM search_folders parent "
            + "JOIN public.dms_folders child ON child.tenant_id = #{tenantId} "
            + "AND child.parent_id = parent.id AND child.f_delete_mark IS NULL) ";
 
    String FILE_SEARCH_MATCH = "AND ("
            + "STRPOS(LOWER(COALESCE(v.file_name, '')), LOWER(#{keyword})) &gt; 0 "
            + "OR STRPOS(LOWER(COALESCE(version_document.name, '')), LOWER(#{keyword})) &gt; 0 "
            + "OR STRPOS(LOWER(COALESCE(version_document.document_no, '')), LOWER(#{keyword})) &gt; 0) ";
 
    @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} "
            + "AND (r.resource_type != 'FOLDER' OR f.f_delete_mark IS NULL)")
    DmsPermissionResourceVO selectView(@Param("tenantId") String tenantId, @Param("id") UUID id);
 
    @Select({"<script>", RESOURCE_VIEW_SQL,
            "WHERE r.tenant_id = #{tenantId}",
            "AND (r.resource_type != 'FOLDER' OR f.f_delete_mark IS NULL)",
            "<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}",
            "AND (r.resource_type != 'FOLDER' OR f.f_delete_mark IS NULL)",
            "<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 CASE r.resource_type WHEN 'FOLDER' THEN 0 WHEN 'DOCUMENT' THEN 1 ELSE 2 END,",
            "CASE WHEN r.resource_type = 'FOLDER' THEN f.sort_code END, name, r.id LIMIT #{limit}",
            "</script>"})
    List<DmsPermissionResourceVO> selectChildren(@Param("tenantId") String tenantId,
                                                  @Param("parentId") UUID parentId,
                                                  @Param("limit") int limit);
 
    @Select({"<script>", FILE_SEARCH_SCOPE, RESOURCE_VIEW_SQL,
            "WHERE r.tenant_id = #{tenantId} AND r.resource_type = 'FILE_VERSION'",
            "<if test='parentId != null'>",
            "AND (v.document_id = #{parentId}",
            "OR version_document.folder_id IN (SELECT id FROM search_folders))",
            "</if>",
            FILE_SEARCH_MATCH,
            "ORDER BY v.file_name, v.id LIMIT #{limit}",
            "</script>"})
    List<DmsPermissionResourceVO> searchFiles(@Param("tenantId") String tenantId,
                                              @Param("parentId") UUID parentId,
                                              @Param("keyword") String keyword,
                                              @Param("limit") int limit);
 
}