刘光辉
2 小时以前 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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
<?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.dmsBusinessOccupancy.BusinessFileOccupancyMapper">
    <resultMap id="Occupancy" type="jnpf.dmsBusinessOccupancy.BusinessFileOccupancy">
        <id column="f_id" property="id"/>
        <result column="f_tenant_id" property="tenantId"/>
        <result column="wenjian_bianhao" property="fileNumber"/>
        <result column="yewu_leixing" property="operation"/>
        <result column="yewu_lian_id" property="chainId"/>
        <result column="shenqing_id" property="applicationId"/>
        <result column="liucheng_renwu_id" property="workflowTaskId"/>
        <result column="wenjian_id" property="fileId"/>
        <result column="mubiao_banben_id" property="businessVersionId"/>
        <result column="zhongxin_banben_id" property="centerVersionId"/>
        <result column="shenhe_id" property="auditId"/>
        <result column="shenhe_renwu_id" property="auditTaskId"/>
        <result column="zhan_yong_jieduan" property="stage"/>
        <result column="zhan_yong_shijian" property="acquiredAt"/>
        <result column="shi_fang_shijian" property="releasedAt"/>
        <result column="shi_fang_yuanyin" property="releaseReason"/>
    </resultMap>
    <resultMap id="NumberValue" type="java.lang.String"><result column="file_number"/></resultMap>
    <!-- Shared with the number-name picker and callback. b is an issued-number row. -->
    <sql id="numberAlreadyUsed">
        (EXISTS (SELECT 1 FROM public.dms_wenjian_ziyuan r WHERE r.f_tenant_id=b.f_tenant_id
            AND (r.wenjian_bianhao_id=b.f_id OR r.wenjian_bianhao=b.wenjian_bianhao))
        OR EXISTS (SELECT 1 FROM public.dms_wenjian_xinzeng_shenhe a WHERE a.f_tenant_id=b.f_tenant_id
            AND (a.wenjian_bianhao_id=b.f_id OR a.wenjian_bianhao=b.wenjian_bianhao)
            AND (a.f_delete_mark IS NULL OR a.f_delete_mark &lt;&gt; 1))
        OR EXISTS (SELECT 1 FROM public.dms_documents d WHERE d.tenant_id=b.f_tenant_id
            AND d.document_no=b.wenjian_bianhao))
    </sql>
    <select id="lockIssuedNumber" resultMap="NumberValue" useCache="false" flushCache="true">
        SELECT wenjian_bianhao AS file_number FROM public.dms_wenjian_bianhao
        WHERE f_tenant_id=#{tenantId} AND f_id=#{numberId} AND biz_status='using'
          AND (f_delete_mark IS NULL OR f_delete_mark &lt;&gt; 1) FOR UPDATE
    </select>
    <select id="creationNumberReady" resultMap="BooleanValue" useCache="false" flushCache="true">
        SELECT EXISTS (SELECT 1 FROM public.dms_wenjian_bianhao b
            WHERE b.f_tenant_id=#{tenantId} AND b.f_id=#{numberId}
              AND (#{fileName}::text IS NULL OR b.dangqian_wenjian_mingcheng=#{fileName})
              AND NOT EXISTS (SELECT 1 FROM public.dms_wenjian_mingcheng_biangeng_shenqing c
                WHERE c.f_tenant_id=b.f_tenant_id AND c.bianhao_id=b.f_id
                  AND (c.f_delete_mark IS NULL OR c.f_delete_mark &lt;&gt; 1)
                  AND (c.f_flow_state IN (-2,1,5,6,8,9,10)
                    OR (c.f_flow_state=2 AND (c.yuan_mingcheng_banben IS NULL
                        OR COALESCE(b.mingcheng_banben,1)&lt;=c.yuan_mingcheng_banben))))) AS value
    </select>
    <select id="creationNumbers" resultMap="NumberValue" useCache="false" flushCache="true">
        SELECT wenjian_bianhao AS file_number FROM public.dms_wenjian_xinzeng_shenhe
        WHERE f_tenant_id=#{tenantId} AND f_id=#{auditId} AND f_delete_mark IS NULL
        UNION ALL
        SELECT fujian_bianhao AS file_number FROM public.dms_wenjian_xinzeng_shenhe_jilu_mingxi
        WHERE f_tenant_id=#{tenantId} AND f_foreign_id=#{auditId} AND f_delete_mark IS NULL
    </select>
    <select id="centerFileNumber" resultMap="NumberValue" useCache="false" flushCache="true">
        SELECT d.document_no AS file_number FROM public.dms_version_states v
        JOIN public.dms_documents d ON d.tenant_id=v.tenant_id AND d.id=v.document_id
        WHERE v.tenant_id=#{tenantId} AND v.file_version_id::text=#{centerVersionId}
    </select>
    <select id="creationNumberUsed" resultMap="BooleanValue" useCache="false" flushCache="true">
        SELECT (EXISTS (SELECT 1 FROM public.dms_wenjian_ziyuan
            WHERE f_tenant_id=#{tenantId} AND wenjian_bianhao=#{fileNumber} AND f_delete_mark IS NULL)
            OR EXISTS (SELECT 1 FROM public.dms_documents
            WHERE tenant_id=#{tenantId} AND document_no=#{fileNumber})) AS value
    </select>
    <!-- Generic center activation must not bypass a resource's approved-batch projection. -->
    <select id="hasBusinessDocument" resultMap="BooleanValue" useCache="false" flushCache="true">
        SELECT EXISTS (SELECT 1 FROM public.dms_version_states s
            JOIN public.dms_documents d ON d.tenant_id=s.tenant_id AND d.id=s.document_id
            JOIN public.dms_wenjian_ziyuan r ON r.f_tenant_id=d.tenant_id
                AND (r.wenjian_zhongxin_wenjian_id=d.id::text OR r.wenjian_bianhao=d.document_no)
            WHERE s.tenant_id=#{tenantId} AND s.file_version_id::text=#{centerVersionId}) AS value
    </select>
    <select id="hasBusinessNumber" resultMap="BooleanValue" useCache="false" flushCache="true">
        SELECT EXISTS (SELECT 1 FROM public.dms_wenjian_ziyuan
            WHERE f_tenant_id=#{tenantId} AND wenjian_bianhao=#{fileNumber}) AS value
    </select>
    <select id="creationReceipts" resultMap="Occupancy" useCache="false" flushCache="true">
        SELECT o.* FROM public.dms_wenjian_xinzeng_shenhe a
        JOIN public.dms_wenjian_yewu_zhan_yong o ON o.f_tenant_id=a.f_tenant_id
            AND o.shenqing_id=a.f_id AND o.liucheng_renwu_id=a.f_flow_task_id
            AND o.yewu_lian_id=a.f_flow_task_id AND o.yewu_leixing='CREATE'
        WHERE a.f_tenant_id=#{tenantId} AND a.f_id=#{auditId} AND a.f_delete_mark IS NULL
        ORDER BY o.wenjian_bianhao
    </select>
    <resultMap id="RevisionSource" type="jnpf.dmsBusinessOccupancy.BusinessRevisionSource">
        <id column="detail_id" property="detailId"/>
        <result column="application_id" property="applicationId"/>
        <result column="task_id" property="taskId"/>
        <result column="file_id" property="fileId"/>
        <result column="business_version_id" property="businessVersionId"/>
        <result column="audit_id" property="auditId"/>
        <result column="audit_task_id" property="auditTaskId"/>
        <result column="change" property="change"/>
    </resultMap>
    <select id="revisionSource" resultMap="RevisionSource" useCache="false" flushCache="true">
        SELECT d.f_id detail_id,m.f_id application_id,m.f_flow_task_id task_id,
               d.wenjian_id file_id,d.yuan_wenjian_banben_id business_version_id
        FROM public.dms_wenjian_xiuding_shenqing_zixiang d
        JOIN public.dms_wenjian_xiuding_shenqing m ON m.f_tenant_id=d.f_tenant_id
          AND m.f_id=d.f_foreign_id AND m.f_delete_mark IS NULL AND m.f_flow_state=2
        WHERE d.f_tenant_id=#{tenantId} AND d.f_id=#{detailId} AND d.f_delete_mark IS NULL
    </select>
    <select id="revisionAudit" resultMap="RevisionSource" useCache="false" flushCache="true">
        SELECT f_id audit_id,f_flow_task_id audit_task_id,xiuding_shenqing_zixiang_id detail_id,
               biangeng_fangshi AS change
        FROM public.dms_wenjian_xiuding_shenhe
        WHERE f_tenant_id=#{tenantId} AND f_id=#{auditId} AND f_delete_mark IS NULL
    </select>
    <resultMap id="RevisionRecord" type="jnpf.dmsBusinessOccupancy.BusinessRevisionRecord">
        <result column="jilu_wenjian_id" property="fileId"/>
        <result column="yuan_wenjian_banben_id" property="businessVersionId"/>
        <result column="fujian_bianhao" property="fileNumber"/>
        <result column="biangeng_fangshi" property="change"/>
    </resultMap>
    <select id="revisionRecords" resultMap="RevisionRecord" useCache="false" flushCache="true">
        SELECT jilu_wenjian_id,yuan_wenjian_banben_id,fujian_bianhao,biangeng_fangshi
        FROM public.dms_wenjian_xiuding_shenhe_jilu_mingxi
        WHERE f_tenant_id=#{tenantId} AND f_foreign_id=#{auditId} AND f_delete_mark IS NULL ORDER BY f_id
    </select>
    <resultMap id="FileIdValue" type="java.lang.String"><result column="file_id"/></resultMap>
    <select id="revisionRelatedRecords" resultMap="FileIdValue" useCache="false" flushCache="true">
        SELECT guanlian_wenjian_id AS file_id FROM public.dms_wenjian_guanxi
        WHERE f_tenant_id=#{tenantId} AND zhu_wenjian_id=#{fileId} AND guanxi_leixing='jilu'
          AND biz_status='effective' AND f_delete_mark IS NULL ORDER BY f_id
    </select>
    <select id="boundAudit" resultMap="Occupancy" useCache="false" flushCache="true">
        SELECT * FROM public.dms_wenjian_yewu_zhan_yong
        WHERE f_tenant_id=#{tenantId} AND shenhe_id=#{auditId} AND shenhe_renwu_id=#{taskId}
    </select>
    <select id="lockEndedRevisionAudit" resultMap="TaskId" useCache="false" flushCache="true">
        SELECT t.f_id task_id FROM public.dms_wenjian_xiuding_shenhe a
        JOIN public.workflow_task t ON t.f_tenant_id=a.f_tenant_id AND t.f_id=a.f_flow_task_id
          AND (t.f_flow_id=a.f_flow_id OR t.f_template_id=a.f_flow_id)
          AND t.f_delete_mark IS NULL AND t.f_end_time IS NOT NULL
          AND t.f_status IN (3,4,7) AND a.f_flow_state=t.f_status
        WHERE a.f_tenant_id=#{tenantId} AND a.f_id=#{auditId} AND a.f_flow_task_id=#{taskId}
          AND a.f_delete_mark IS NULL FOR UPDATE OF t
    </select>
    <update id="bindRevisionAudit">
        UPDATE public.dms_wenjian_yewu_zhan_yong
        SET shenhe_id=#{auditId},shenhe_renwu_id=#{taskId},zhan_yong_jieduan=#{stage}
        WHERE f_tenant_id=#{row.tenantId} AND f_id=#{row.id} AND shi_fang_shijian IS NULL
          AND shenhe_id IS NOT DISTINCT FROM #{row.auditId}
          AND shenhe_renwu_id IS NOT DISTINCT FROM #{row.auditTaskId}
    </update>
    <sql id="NativeApplications">
        SELECT 'CREATE' operation,f_id,f_tenant_id,f_flow_task_id,f_flow_id,f_flow_state FROM public.dms_wenjian_xinzeng_shenhe WHERE f_delete_mark IS NULL
        UNION ALL
        SELECT 'CREATE' operation,f_id,f_tenant_id,f_flow_task_id,f_flow_id,f_flow_state FROM public.dms_wenjian_xiuding_shenhe WHERE f_delete_mark IS NULL
        UNION ALL
        SELECT 'REVISION' operation,f_id,f_tenant_id,f_flow_task_id,f_flow_id,f_flow_state FROM public.dms_wenjian_xiuding_shenhe WHERE f_delete_mark IS NULL
        UNION ALL
        SELECT 'REVISION' operation,f_id,f_tenant_id,f_flow_task_id,f_flow_id,f_flow_state FROM public.dms_wenjian_xiuding_shenqing WHERE f_delete_mark IS NULL
        UNION ALL
        SELECT 'REVOCATION' operation,f_id,f_tenant_id,f_flow_task_id,f_flow_id,f_flow_state FROM public.dms_wenjian_chexiao_tiyi WHERE f_delete_mark IS NULL
        UNION ALL
        SELECT 'INVALIDATION' operation,f_id,f_tenant_id,f_flow_task_id,f_flow_id,f_flow_state FROM public.dms_wenjian_shixiao_shenqing WHERE f_delete_mark IS NULL
        UNION ALL
        SELECT 'EXTENSION' operation,f_id,f_tenant_id,f_flow_task_id,f_flow_id,f_flow_state FROM public.wenjian_fushen_yanqi_shenqing WHERE f_delete_mark IS NULL
    </sql>
    <sql id="EndedEvidence">
        JOIN (<include refid="NativeApplications"/>) a ON a.f_tenant_id=o.f_tenant_id
            AND a.f_id=o.shenqing_id AND a.f_flow_task_id=o.liucheng_renwu_id AND a.operation=o.yewu_leixing
        JOIN public.workflow_task t ON t.f_tenant_id=a.f_tenant_id AND t.f_id=a.f_flow_task_id
            AND (t.f_flow_id=a.f_flow_id OR t.f_template_id=a.f_flow_id)
            AND t.f_delete_mark IS NULL AND t.f_end_time IS NOT NULL
            AND t.f_status IN (3,4,7) AND a.f_flow_state=t.f_status
    </sql>
    <select id="terminationCandidates" resultMap="Occupancy" useCache="false" flushCache="true">
        SELECT o.* FROM public.dms_wenjian_yewu_zhan_yong o <include refid="EndedEvidence"/>
        WHERE o.shi_fang_shijian IS NULL
        <if test="afterId != null">AND o.f_id &gt; #{afterId}</if>
        ORDER BY o.f_id LIMIT #{limit}
    </select>
    <resultMap id="TaskId" type="java.lang.String"><result column="task_id"/></resultMap>
    <select id="lockEndedTask" resultMap="TaskId" useCache="false" flushCache="true">
        SELECT t.f_id AS task_id FROM public.dms_wenjian_yewu_zhan_yong o <include refid="EndedEvidence"/>
        WHERE o.f_tenant_id=#{row.tenantId} AND o.f_id=#{row.id} AND o.yewu_lian_id=#{row.chainId}
          AND o.shi_fang_shijian IS NULL FOR UPDATE OF t
    </select>
    <resultMap id="FileTarget" type="jnpf.dmsBusinessOccupancy.BusinessFileTarget">
        <id column="file_id" property="fileId"/>
        <result column="file_number" property="fileNumber"/>
        <result column="business_version_id" property="businessVersionId"/>
        <result column="center_version_id" property="centerVersionId"/>
        <result column="document_id" property="documentId"/>
    </resultMap>
    <resultMap id="BooleanValue" type="java.lang.Boolean"><result column="value"/></resultMap>
    <select id="hasCurrentBusinessReference" resultMap="BooleanValue" flushCache="true" useCache="false">
        SELECT EXISTS (
            SELECT 1 FROM public.dms_wenjian_ziyuan r
            LEFT JOIN public.dms_wenjian_banben b ON b.f_tenant_id=r.f_tenant_id
                AND b.f_id=r.dangqian_banben_id AND b.f_delete_mark IS NULL
            WHERE r.f_tenant_id=#{tenantId} AND r.f_delete_mark IS NULL
              AND (r.wenjian_zhongxin_banben_id=#{centerVersionId}
                   OR b.wenjian_zhongxin_banben_id=#{centerVersionId})
        ) AS value
    </select>
    <!-- No state/date rule here: the original expiry service remains authoritative. -->
    <select id="expiryTargets" resultMap="FileTarget" flushCache="true" useCache="false">
        SELECT r.wenjian_bianhao AS file_number,r.f_id AS file_id,
               r.dangqian_banben_id AS business_version_id,
               r.wenjian_zhongxin_banben_id AS center_version_id,
               r.wenjian_zhongxin_wenjian_id AS document_id
        FROM public.dms_wenjian_ziyuan r
        JOIN public.dms_wenjian_banben b ON b.f_tenant_id=r.f_tenant_id
            AND b.wenjian_id=r.f_id AND b.f_id=r.dangqian_banben_id AND b.f_delete_mark IS NULL
            AND b.wenjian_zhongxin_banben_id=r.wenjian_zhongxin_banben_id
            AND b.wenjian_zhongxin_wenjian_id=r.wenjian_zhongxin_wenjian_id
        WHERE r.f_tenant_id=#{tenantId} AND r.f_delete_mark IS NULL
            AND r.wenjian_zhongxin_banben_id=#{centerVersionId}
    </select>
    <select id="chainOccupancies" resultMap="Occupancy" flushCache="true" useCache="false">
        SELECT * FROM public.dms_wenjian_yewu_zhan_yong
        WHERE f_tenant_id=#{tenantId} AND yewu_lian_id=#{chainId}
        ORDER BY wenjian_bianhao
    </select>
    <select id="fileTargets" resultMap="FileTarget" flushCache="true" useCache="false">
        SELECT r.wenjian_bianhao AS file_number,r.f_id AS file_id,
            r.dangqian_banben_id AS business_version_id,
            r.wenjian_zhongxin_banben_id AS center_version_id,
            r.wenjian_zhongxin_wenjian_id AS document_id
        FROM public.dms_wenjian_ziyuan r WHERE r.f_tenant_id=#{tenantId} AND r.f_delete_mark IS NULL
          AND r.f_id IN
          <foreach collection="fileIds" item="fileId" open="(" separator="," close=")">#{fileId}</foreach>
        ORDER BY r.wenjian_bianhao,r.f_id
    </select>
    <resultMap id="LockResult" type="java.lang.Boolean"><result column="acquired"/></resultMap>
    <!-- Nonblocking transaction-level locks: callers retry; no workflow-long connection locks. -->
    <select id="tryLock" resultMap="LockResult" flushCache="true" useCache="false">
        SELECT pg_try_advisory_xact_lock(#{key}) AS acquired
    </select>
    <select id="active" resultMap="Occupancy" flushCache="true" useCache="false">
        SELECT * FROM public.dms_wenjian_yewu_zhan_yong
        WHERE f_tenant_id=#{tenantId} AND wenjian_bianhao=#{fileNumber} AND shi_fang_shijian IS NULL
    </select>
    <select id="chain" resultMap="Occupancy" flushCache="true" useCache="false">
        SELECT * FROM public.dms_wenjian_yewu_zhan_yong
        WHERE f_tenant_id=#{tenantId} AND wenjian_bianhao=#{fileNumber} AND yewu_lian_id=#{chainId}
    </select>
    <insert id="insert">
        INSERT INTO public.dms_wenjian_yewu_zhan_yong
            (f_id,f_tenant_id,wenjian_bianhao,yewu_leixing,yewu_lian_id,shenqing_id,liucheng_renwu_id,
             wenjian_id,mubiao_banben_id,zhongxin_banben_id,zhan_yong_jieduan)
        VALUES (#{row.id},#{row.tenantId},#{row.fileNumber},#{row.operation},#{row.chainId},
                #{row.applicationId},#{row.workflowTaskId},#{row.fileId},#{row.businessVersionId},
                #{row.centerVersionId},#{row.stage})
        ON CONFLICT DO NOTHING
    </insert>
    <update id="release">
        UPDATE public.dms_wenjian_yewu_zhan_yong
        SET shi_fang_shijian=statement_timestamp(),shi_fang_yuanyin=#{reason}
        WHERE f_tenant_id=#{tenantId} AND wenjian_bianhao=#{fileNumber} AND yewu_lian_id=#{chainId}
          AND f_id=#{occupancyId} AND shi_fang_shijian IS NULL
    </update>
    <update id="advance">
        UPDATE public.dms_wenjian_yewu_zhan_yong SET zhan_yong_jieduan=#{nextStage}
        WHERE f_tenant_id=#{tenantId} AND wenjian_bianhao=#{fileNumber} AND yewu_lian_id=#{chainId}
          AND f_id=#{occupancyId} AND shi_fang_shijian IS NULL AND zhan_yong_jieduan=#{expectedStage}
    </update>
    <resultMap id="EligibilityFacts" type="jnpf.dmsBusinessOccupancy.BusinessFileEligibilityFacts">
        <result column="file_count" property="fileCount"/>
        <result column="file_id" property="fileId"/>
        <result column="business_version_id" property="businessVersionId"/>
        <result column="center_version_id" property="centerVersionId"/>
        <result column="effective" property="effective"/>
        <result column="effective_version_count" property="effectiveVersionCount"/>
        <result column="pending_version" property="pendingVersion"/>
        <result column="revocation_blocking" property="revocationBlocking"/>
        <result column="revocation_unknown" property="revocationUnknown"/>
        <result column="occupied" property="occupied"/>
    </resultMap>
    <!-- One DB snapshot; exact tenant + number. No dependency on center or old revision occupancies. -->
    <select id="eligibilityFacts" resultMap="EligibilityFacts" flushCache="true" useCache="false">
        SELECT COALESCE(f.file_count,0) AS file_count,f.file_id,f.business_version_id,f.center_version_id,
               COALESCE(f.effective,false) AS effective,COALESCE(f.effective_version_count,0) AS effective_version_count,
               COALESCE(f.pending_version,false) AS pending_version,
               COALESCE(f.revocation_blocking,false) AS revocation_blocking,
               COALESCE(f.revocation_unknown,false) AS revocation_unknown,
               EXISTS (SELECT 1 FROM public.dms_wenjian_yewu_zhan_yong o
                   WHERE o.f_tenant_id=#{tenantId} AND o.wenjian_bianhao=#{fileNumber}
                     AND o.shi_fang_shijian IS NULL) AS occupied
        FROM (SELECT 1) single_row
        LEFT JOIN public.dms_wenjian_yewu_zhunru f
          ON f.f_tenant_id=#{tenantId} AND f.wenjian_bianhao=#{fileNumber}
    </select>
</mapper>