刘光辉
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
<?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.dmsMapper.DmsInvalidationMapper">
    <resultMap id="Target" type="jnpf.dmsEntity.center.DmsInvalidationTarget">
        <result column="document_id" property="documentId" typeHandler="jnpf.dmsDatabase.DmsUuidTypeHandler"/>
        <result column="file_version_id" property="fileVersionId" typeHandler="jnpf.dmsDatabase.DmsUuidTypeHandler"/>
        <result column="effective_from" property="effectiveFrom"/>
    </resultMap>
    <resultMap id="AlreadyIneffective" type="java.lang.Boolean">
        <constructor><arg column="already_ineffective" javaType="java.lang.Boolean"/></constructor>
    </resultMap>
    <!-- Exact current projection only: a superseded source is not an ineffective current file.
         Locks remain held until the caller has completed the task and released its own occupancy. -->
    <select id="alreadyIneffective" resultMap="AlreadyIneffective" flushCache="true" useCache="false">
        WITH target AS (
            SELECT s.lifecycle_status,s.effective_to,r.biz_status AS resource_status,
                   r.jinyong_laiyuan,v.biz_status AS version_status,d.access_status
            FROM public.dms_wenjian_ziyuan r
            JOIN public.dms_wenjian_banben v ON v.f_tenant_id=r.f_tenant_id
                AND v.f_id=r.dangqian_banben_id AND v.wenjian_id=r.f_id AND v.f_delete_mark IS NULL
            JOIN public.dms_documents d ON d.tenant_id=r.f_tenant_id
                AND d.id::text=r.wenjian_zhongxin_wenjian_id AND d.main_document_id IS NULL
            JOIN public.dms_version_states s ON s.tenant_id=d.tenant_id AND s.document_id=d.id
                AND s.file_version_id::text=r.wenjian_zhongxin_banben_id
            JOIN public.dms_file_versions fv ON fv.tenant_id=s.tenant_id AND fv.document_id=s.document_id
                AND fv.id=s.file_version_id
            WHERE r.f_tenant_id=#{row.tenantId} AND r.f_id=#{row.fileId} AND r.f_delete_mark IS NULL
                AND v.f_id=#{row.businessVersionId}
                AND d.id=#{row.documentId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
                AND s.file_version_id=#{row.fileVersionId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
                AND v.wenjian_zhongxin_wenjian_id=d.id::text
                AND v.wenjian_zhongxin_banben_id=s.file_version_id::text
                AND s.approved_at IS NOT NULL AND s.effective_from &lt;= #{at}
                AND NOT EXISTS (SELECT 1 FROM public.dms_file_versions newer
                    WHERE newer.tenant_id=fv.tenant_id AND newer.document_id=fv.document_id
                    AND newer.version_no&gt;fv.version_no)
                AND NOT EXISTS (SELECT 1 FROM public.dms_version_states other
                    WHERE other.tenant_id=s.tenant_id AND other.document_id=s.document_id
                    AND other.file_version_id&lt;&gt;s.file_version_id AND other.lifecycle_status='EFFECTIVE')
            FOR UPDATE OF r,v,d,s
        )
        SELECT CASE WHEN count(*)&lt;&gt;1 THEN NULL
            WHEN bool_and(lifecycle_status='EFFECTIVE' AND (effective_to IS NULL OR effective_to&gt;#{at})
                AND resource_status='effective' AND version_status='effective' AND access_status='enabled') THEN false
            WHEN COALESCE(bool_and(
            (lifecycle_status='EFFECTIVE' AND effective_to &lt;= #{at}
                AND resource_status='effective' AND version_status='effective' AND access_status='enabled')
            OR (lifecycle_status='EXPIRED' AND effective_to &lt;= #{at}
                AND resource_status='disabled' AND version_status='expired' AND jinyong_laiyuan='yidaoqi')
            OR (lifecycle_status='INVALIDATED' AND resource_status='disabled'
                AND version_status='invalidated' AND jinyong_laiyuan='yishixiao' AND access_status='disable')
            OR (lifecycle_status='REVOKED' AND resource_status='disabled'
                AND version_status='revoked' AND jinyong_laiyuan='yichexiao' AND access_status='disable')
        ),false) THEN true ELSE NULL END AS already_ineffective FROM target
    </select>
    <select id="lockRequest" resultMap="jnpf.dmsMapper.DmsApprovedDisableMapper.Request">
        SELECT <include refid="jnpf.dmsMapper.DmsApprovedDisableMapper.Columns"/>
        FROM <include refid="jnpf.dmsMapper.DmsApprovedDisableMapper.JoinedItems"/>
        WHERE i.tenant_id=#{command.tenantId} AND i.id=#{command.requestId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
          AND i.change_type='INVALIDATE' AND b.audit_type='shixiao_shenqing'
        FOR UPDATE OF b,i
    </select>
    <select id="executionTime" resultType="java.util.Date">
        SELECT date_trunc('milliseconds', CURRENT_TIMESTAMP)
    </select>
    <select id="validLease" resultType="boolean">
        SELECT EXISTS (SELECT 1 FROM public.dms_approved_file_batches b
          WHERE b.tenant_id=#{row.tenantId} AND b.id=#{row.batchId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler} AND b.lease_token=#{token}
            AND b.lease_until &gt; clock_timestamp() AND b.approved_at &lt;= CURRENT_TIMESTAMP
            AND #{row.scheduledAt} &lt;= CURRENT_TIMESTAMP)
    </select>
    <select id="approvedSource" resultType="boolean">
        WITH approved AS (SELECT c.f_id FROM public.dms_wenjian_shixiao_shenqing m
          JOIN public.dms_wenjian_shixiao_shenqing_zixiang c
            ON c.f_tenant_id=m.f_tenant_id AND c.f_foreign_id=m.f_id
          JOIN public.workflow_task t ON t.f_tenant_id=m.f_tenant_id AND t.f_id=m.f_flow_task_id
          JOIN public.dms_file_operation_occupancies o ON o.tenant_id=m.f_tenant_id
            AND o.task_id=m.f_flow_task_id AND o.application_id=m.f_id AND o.file_id=c.wenjian_id
            AND o.operation='yishixiao' AND o.active=true
          WHERE m.f_tenant_id=#{row.tenantId} AND m.f_id=#{row.applicationId}
            AND m.f_flow_task_id=#{row.taskId} AND m.f_flow_id=#{row.flowId}
            AND m.f_flow_state=2 AND m.f_delete_mark IS NULL
            AND c.f_id=#{row.sourceRowId} AND c.f_delete_mark IS NULL
            AND c.wenjian_id=#{row.fileId} AND c.wenjian_banben_id=#{row.businessVersionId}
            AND c.laiyuan_wenjian_id IS NOT DISTINCT FROM #{row.sourceFileId}
            AND c.laiyuan_wenjian_banben_id IS NOT DISTINCT FROM #{row.sourceVersionId}
            AND c.shixiao_shengxiao_shijian IS NOT DISTINCT FROM #{row.requestedAt}
            AND c.shixiao_zhixing_shijian IS NULL
            AND o.folder_id=CAST(#{row.documentId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler} AS text)
            AND t.f_status=2 AND t.f_end_time=#{row.approvedAt} AND t.f_delete_mark IS NULL
            AND (t.f_flow_id=#{row.flowId} OR t.f_template_id=#{row.flowId})
            AND NOT EXISTS (SELECT 1 FROM public.dms_file_operation_occupancies other
              WHERE other.tenant_id=o.tenant_id AND other.file_id=o.file_id AND other.active=true AND other.task_id&lt;&gt;o.task_id)
          LIMIT 2 FOR UPDATE OF m,c,t,o NOWAIT) SELECT count(*)=1 FROM approved
    </select>
    <sql id="Directory">d.tenant_id=#{command.tenantId}
        AND (d.id=#{command.mainDocumentId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler} OR d.main_document_id=#{command.mainDocumentId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler})</sql>
    <select id="lockDocuments" resultType="java.util.UUID">
        SELECT d.id FROM public.dms_documents d WHERE <include refid="Directory"/>
        ORDER BY d.id LIMIT 1001 FOR UPDATE NOWAIT
    </select>
    <select id="validDirectory" resultType="boolean">
        SELECT EXISTS (SELECT 1 FROM public.dms_documents d
          WHERE d.tenant_id=#{command.tenantId} AND d.id=#{command.mainDocumentId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler} AND d.main_document_id IS NULL)
          AND NOT EXISTS (SELECT 1 FROM public.dms_documents d WHERE <include refid="Directory"/>
            AND d.access_status &lt;&gt; 'enabled')
    </select>
    <select id="hasPendingVersions" resultType="boolean">
        SELECT EXISTS (SELECT 1 FROM public.dms_documents d
          JOIN public.dms_version_states s ON s.tenant_id=d.tenant_id AND s.document_id=d.id
          WHERE <include refid="Directory"/> AND s.lifecycle_status IN ('PENDING_APPROVAL','PENDING_EFFECTIVE'))
          OR EXISTS (SELECT 1 FROM public.dms_documents d
            JOIN public.dms_approved_file_items i ON i.tenant_id=d.tenant_id AND i.document_id=d.id
            JOIN public.dms_approved_file_batches b ON b.tenant_id=i.tenant_id AND b.id=i.batch_id
            WHERE <include refid="Directory"/> AND i.change_type IN ('CREATE','REVISE','REUSE','RETIRE')
              AND b.status &lt;&gt; 'APPLIED')
    </select>
    <select id="currentTargets" resultMap="Target">
        SELECT s.document_id,s.file_version_id,s.effective_from FROM public.dms_documents d
          JOIN public.dms_version_states s ON s.tenant_id=d.tenant_id AND s.document_id=d.id
        WHERE <include refid="Directory"/> AND s.lifecycle_status='EFFECTIVE'
          AND s.effective_from &lt;= CURRENT_TIMESTAMP
          AND (s.effective_to IS NULL OR s.effective_to &gt; CURRENT_TIMESTAMP)
        ORDER BY d.id LIMIT 1001
    </select>
    <update id="invalidateVersion">
        UPDATE public.dms_version_states SET lifecycle_status='INVALIDATED',effective_to=#{at},
          status_reason='失效申请 ' || CAST(#{command.requestId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler} AS text),
          status_changed_by=#{command.actorId},revision=revision+1
        WHERE tenant_id=#{command.tenantId} AND document_id=#{target.documentId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
          AND file_version_id=#{target.fileVersionId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler} AND lifecycle_status='EFFECTIVE'
          AND approved_at IS NOT NULL AND effective_from &lt; #{at}
          AND (effective_to IS NULL OR effective_to &gt; CURRENT_TIMESTAMP)
    </update>
    <update id="markDocuments">
        UPDATE public.dms_documents d SET access_status='disable',disable_reason='yishixiao',
          disabled_at=#{at},disable_request_id=#{command.requestId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
        WHERE <include refid="Directory"/> AND access_status='enabled'
    </update>
    <update id="disableResource">
        UPDATE public.dms_wenjian_ziyuan SET biz_status='disabled',jinyong_laiyuan='yishixiao',
          youxiao_qi_zhi=CAST(#{at} AS timestamptz) AT TIME ZONE 'Asia/Shanghai',
          f_last_modify_user_id=#{row.actorId},f_last_modify_time=CAST(#{at} AS timestamptz) AT TIME ZONE 'Asia/Shanghai'
        WHERE f_tenant_id=#{row.tenantId} AND f_id=#{resource.id}
          AND dangqian_banben_id=#{resource.currentVersionId} AND biz_status='effective' AND f_delete_mark IS NULL
    </update>
    <update id="invalidateBusinessVersion">
        UPDATE public.dms_wenjian_banben SET biz_status='invalidated',shixiao_zhixing_shijian=#{at},
          f_last_modify_user_id=#{row.actorId},f_last_modify_time=CAST(#{at} AS timestamptz) AT TIME ZONE 'Asia/Shanghai'
        WHERE f_tenant_id=#{row.tenantId} AND f_id=#{resource.currentVersionId} AND wenjian_id=#{resource.id}
          AND wenjian_zhongxin_banben_id=#{resource.centerVersionId} AND biz_status='effective' AND f_delete_mark IS NULL
    </update>
    <update id="recordExecution">
        UPDATE public.dms_wenjian_shixiao_shenqing_zixiang
        SET shixiao_zhixing_shijian=#{at}
        WHERE f_tenant_id=#{row.tenantId} AND f_id=#{row.sourceRowId} AND f_foreign_id=#{row.applicationId}
          AND wenjian_id=#{row.fileId} AND wenjian_banben_id=#{row.businessVersionId}
          AND f_delete_mark IS NULL AND shixiao_zhixing_shijian IS NULL
    </update>
    <update id="complete">
        UPDATE public.dms_approved_file_items i SET status='APPLIED',executed_at=#{at}
        WHERE i.tenant_id=#{row.tenantId} AND i.id=#{row.id,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler} AND i.status='WAITING'
          AND i.change_type='INVALIDATE' AND i.scheduled_at &lt;= #{at}
          AND EXISTS (SELECT 1 FROM public.dms_approved_file_batches b
            WHERE b.tenant_id=i.tenant_id AND b.id=i.batch_id AND b.lease_token=#{token}
              AND b.lease_until &gt; clock_timestamp())
    </update>
    <select id="ticketReadable" resultType="boolean">
        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
          WHERE s.tenant_id=#{tenantId} AND s.file_version_id=#{versionId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
          <choose><when test="historical">
            AND (s.lifecycle_status IN ('EFFECTIVE','SUPERSEDED','EXPIRED','REVOKED','OBSOLETE')
              OR (s.lifecycle_status='INVALIDATED' AND s.approved_at IS NOT NULL))
          </when><otherwise>
            AND s.lifecycle_status='EFFECTIVE' AND s.effective_from &lt;= CURRENT_TIMESTAMP
            AND (s.effective_to IS NULL OR s.effective_to &gt; CURRENT_TIMESTAMP)
            AND d.access_status='enabled'
            AND NOT EXISTS (SELECT 1 FROM public.dms_documents parent WHERE parent.tenant_id=d.tenant_id
                AND parent.id=d.main_document_id AND parent.access_status&lt;&gt;'enabled')
          </otherwise></choose>)
    </select>
</mapper>