<?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.DmsBupinghengRetryMapper">
|
<resultMap id="RetryMap" type="jnpf.dmsEntity.fenfa.DmsBupinghengRetry" autoMapping="false">
|
<id column="dengji_id" property="documentId"/>
|
<result column="f_tenant_id" property="tenantId"/>
|
<result column="yuandan_banben" property="version"/>
|
<result column="changshi_cishu" property="attempts"/>
|
</resultMap>
|
<!-- 原生无流程登记单:完整登记信息和签名随确定按钮保存。空白/未签单据不进入补偿。 -->
|
<sql id="eligible">
|
d.f_delete_mark IS NULL AND d.zhixing_shijian IS NULL
|
AND NULLIF(btrim(d.f_tenant_id), '') IS NOT NULL
|
AND NULLIF(btrim(d.biz_sign), '') IS NOT NULL
|
AND NULLIF(btrim(d.dengji_ren_id), '') IS NOT NULL
|
AND d.dengji_shijian IS NOT NULL
|
AND NULLIF(btrim(d.f_flow_id), '') IS NULL
|
AND NULLIF(btrim(d.f_flow_task_id), '') IS NULL
|
AND NOT EXISTS (SELECT 1 FROM dms_wenjian_bupingheng_dengji_zixiang reprint
|
WHERE reprint.f_tenant_id = d.f_tenant_id AND reprint.f_foreign_id = d.f_id
|
AND reprint.f_delete_mark IS NULL AND reprint.cuoshi = 'cuoshi3')
|
AND EXISTS (SELECT 1 FROM dms_wenjian_bupingheng_dengji_zixiang i
|
WHERE i.f_tenant_id = d.f_tenant_id AND i.f_foreign_id = d.f_id AND i.f_delete_mark IS NULL)
|
</sql>
|
<select id="selectPending" resultMap="RetryMap">
|
SELECT d.f_id AS dengji_id, d.f_tenant_id, COALESCE(d.f_version, 0) AS yuandan_banben,
|
COALESCE(r.changshi_cishu, 0) AS changshi_cishu
|
FROM dms_wenjian_bupingheng_dengji d
|
LEFT JOIN dms_wenjian_bupingheng_buchang r ON r.f_tenant_id = d.f_tenant_id AND r.dengji_id = d.f_id
|
WHERE <include refid="eligible"/>
|
AND (r.dengji_id IS NULL OR r.yuandan_banben <> COALESCE(d.f_version, 0)
|
OR (NOT r.tingzhi_zhongshi AND r.changshi_cishu < #{maxAttempts}
|
AND r.xiaci_changshi_shijian <= CURRENT_TIMESTAMP))
|
ORDER BY COALESCE(r.xiaci_changshi_shijian, d.dengji_shijian), d.f_tenant_id, d.f_id
|
LIMIT #{batchSize}
|
</select>
|
<!-- 单条语句领取并持久化15分钟租约;多实例抢同一单只允许一个成功。 -->
|
<insert id="claim">
|
INSERT INTO dms_wenjian_bupingheng_buchang AS r
|
(f_tenant_id, dengji_id, yuandan_banben, changshi_cishu, xiaci_changshi_shijian,
|
tingzhi_zhongshi, zhanyong_biaoshi, zuihou_cuowu)
|
SELECT d.f_tenant_id, d.f_id, COALESCE(d.f_version, 0), 1,
|
CURRENT_TIMESTAMP + INTERVAL '15 minutes', FALSE, #{token}, NULL
|
FROM dms_wenjian_bupingheng_dengji d
|
WHERE d.f_tenant_id = #{task.tenantId} AND d.f_id = #{task.documentId}
|
AND COALESCE(d.f_version, 0) = #{task.version} AND <include refid="eligible"/>
|
ON CONFLICT (f_tenant_id, dengji_id) DO UPDATE SET
|
yuandan_banben = EXCLUDED.yuandan_banben,
|
changshi_cishu = CASE WHEN r.yuandan_banben = EXCLUDED.yuandan_banben THEN r.changshi_cishu + 1 ELSE 1 END,
|
xiaci_changshi_shijian = EXCLUDED.xiaci_changshi_shijian,
|
tingzhi_zhongshi = FALSE, zhanyong_biaoshi = EXCLUDED.zhanyong_biaoshi, zuihou_cuowu = NULL
|
WHERE r.yuandan_banben <> EXCLUDED.yuandan_banben
|
OR (NOT r.tingzhi_zhongshi AND r.changshi_cishu < #{maxAttempts}
|
AND r.xiaci_changshi_shijian <= CURRENT_TIMESTAMP)
|
</insert>
|
<select id="selectClaim" resultMap="RetryMap">
|
SELECT f_tenant_id, dengji_id, yuandan_banben, changshi_cishu
|
FROM dms_wenjian_bupingheng_buchang
|
WHERE f_tenant_id = #{task.tenantId} AND dengji_id = #{task.documentId} AND zhanyong_biaoshi = #{token}
|
</select>
|
<update id="finish">
|
UPDATE dms_wenjian_bupingheng_buchang
|
SET tingzhi_zhongshi = #{stop}, zuihou_cuowu = #{error}, zhanyong_biaoshi = NULL,
|
xiaci_changshi_shijian = CURRENT_TIMESTAMP + (#{delaySeconds} * INTERVAL '1 second')
|
WHERE f_tenant_id = #{task.tenantId} AND dengji_id = #{task.documentId}
|
AND yuandan_banben = #{task.version} AND zhanyong_biaoshi = #{token}
|
</update>
|
</mapper>
|