刘光辉
4 小时以前 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
<?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 &lt;&gt; COALESCE(d.f_version, 0)
               OR (NOT r.tingzhi_zhongshi AND r.changshi_cishu &lt; #{maxAttempts}
                   AND r.xiaci_changshi_shijian &lt;= 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 &lt;&gt; EXCLUDED.yuandan_banben
           OR (NOT r.tingzhi_zhongshi AND r.changshi_cishu &lt; #{maxAttempts}
               AND r.xiaci_changshi_shijian &lt;= 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>