<?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 <> 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 <> 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 <> 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)<=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 > #{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>
|