<?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 <= #{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>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<>s.file_version_id AND other.lifecycle_status='EFFECTIVE')
|
FOR UPDATE OF r,v,d,s
|
)
|
SELECT CASE WHEN count(*)<>1 THEN NULL
|
WHEN bool_and(lifecycle_status='EFFECTIVE' AND (effective_to IS NULL OR effective_to>#{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 <= #{at}
|
AND resource_status='effective' AND version_status='effective' AND access_status='enabled')
|
OR (lifecycle_status='EXPIRED' AND effective_to <= #{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 > clock_timestamp() AND b.approved_at <= CURRENT_TIMESTAMP
|
AND #{row.scheduledAt} <= 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<>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 <> '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 <> '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 <= CURRENT_TIMESTAMP
|
AND (s.effective_to IS NULL OR s.effective_to > 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 < #{at}
|
AND (effective_to IS NULL OR effective_to > 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 <= #{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 > 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 <= CURRENT_TIMESTAMP
|
AND (s.effective_to IS NULL OR s.effective_to > 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<>'enabled')
|
</otherwise></choose>)
|
</select>
|
</mapper>
|