刘光辉
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
69
70
71
72
73
74
75
76
77
<?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.DmsTemplateNotificationMapper">
  <resultMap id="Event" type="jnpf.dmsEntity.storage.DmsTemplateNotification">
    <id column="tenant_id" property="tenantId"/><id column="task_id" property="taskId"/>
    <result column="audit_id" property="auditId"/><result column="template_id" property="templateId"/>
    <result column="document_no" property="documentNo"/><result column="document_name" property="documentName"/>
    <result column="version_label" property="versionLabel"/><result column="actor_id" property="actorId"/>
    <result column="attempts" property="attempts"/><result column="lease_token" property="leaseToken"/>
  </resultMap>
  <resultMap id="Template" type="java.util.LinkedHashMap">
    <id column="f_id" property="id"/><result column="xiaoxi_tixing_bumen" property="departments"/>
    <result column="wenben_mingcheng" property="name"/>
  </resultMap>
  <resultMap id="UserId" type="java.lang.String"><constructor><arg column="f_id" javaType="java.lang.String"/></constructor></resultMap>
  <!-- 审批事实独立于文件登记及未来生效日;只发现当前主文件携带来源的升版。 -->
  <insert id="discover">
    INSERT INTO public.dms_template_upgrade_notifications
      (tenant_id,task_id,audit_id,template_id,document_no,document_name,version_label,actor_id)
    SELECT a.f_tenant_id,a.f_flow_task_id,a.f_id,(CASE WHEN a.wenjian IS JSON ARRAY THEN a.wenjian::jsonb ELSE '[]'::jsonb END)->0->>'laiyuan_muban_id',
           a.wenjian_bianhao,a.wenjian_mingcheng,a.banbenhao,
           COALESCE(NULLIF(t.f_last_modify_user_id,''),t.f_creator_user_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)
    WHERE a.f_delete_mark IS NULL AND a.f_flow_state=2 AND a.biangeng_fangshi='shengji'
      AND t.f_delete_mark IS NULL AND t.f_status=2 AND t.f_end_time IS NOT NULL
      AND CASE WHEN NULLIF(a.wenjian,'') IS NULL THEN false
        ELSE jsonb_typeof((CASE WHEN a.wenjian IS JSON ARRAY THEN a.wenjian::jsonb ELSE '[]'::jsonb END))='array' AND jsonb_array_length((CASE WHEN a.wenjian IS JSON ARRAY THEN a.wenjian::jsonb ELSE '[]'::jsonb END))=1
          AND NULLIF((CASE WHEN a.wenjian IS JSON ARRAY THEN a.wenjian::jsonb ELSE '[]'::jsonb END)->0->>'laiyuan_muban_id','') IS NOT NULL END
      AND NOT EXISTS (SELECT 1 FROM public.dms_template_upgrade_notifications n
        WHERE n.tenant_id=a.f_tenant_id AND n.task_id=a.f_flow_task_id)
    ORDER BY t.f_end_time,a.f_flow_task_id LIMIT 100
    ON CONFLICT (tenant_id,task_id) DO NOTHING
  </insert>
  <select id="pending" resultMap="Event">
    SELECT * FROM public.dms_template_upgrade_notifications WHERE completed_at IS NULL
      AND next_attempt_at &lt;= CURRENT_TIMESTAMP AND (lease_until IS NULL OR lease_until &lt;= CURRENT_TIMESTAMP)
    ORDER BY next_attempt_at,task_id LIMIT 100
  </select>
  <select id="find" resultMap="Event">
    SELECT * FROM public.dms_template_upgrade_notifications WHERE tenant_id=#{tenant} AND task_id=#{task}
  </select>
  <update id="claim">
    UPDATE public.dms_template_upgrade_notifications SET lease_token=#{token},
      lease_until=CURRENT_TIMESTAMP+INTERVAL '5 minutes',attempts=attempts+1
    WHERE tenant_id=#{event.tenantId} AND task_id=#{event.taskId} AND completed_at IS NULL
      AND next_attempt_at &lt;= CURRENT_TIMESTAMP AND (lease_until IS NULL OR lease_until &lt;= CURRENT_TIMESTAMP)
  </update>
  <select id="template" resultMap="Template">
    SELECT f_id,xiaoxi_tixing_bumen,wenben_mingcheng FROM public.dms_wenjian_jilu_muban_guanli
    WHERE f_tenant_id=#{tenant} AND f_id=#{id} AND f_delete_mark IS NULL
  </select>
  <select id="recipients" resultMap="UserId">
    WITH RECURSIVE departments AS (
      SELECT f_id FROM public.base_organize WHERE f_tenant_id=#{tenant} AND f_delete_mark IS NULL
        AND f_id IN <foreach collection="departments" item="id" open="(" separator="," close=")">#{id}</foreach>
      UNION
      SELECT o.f_id FROM public.base_organize o JOIN departments d ON o.f_parent_id=d.f_id
        WHERE o.f_tenant_id=#{tenant} AND o.f_delete_mark IS NULL
    )
    SELECT DISTINCT u.f_id FROM public.base_user u
    WHERE u.f_tenant_id=#{tenant} AND u.f_delete_mark IS NULL AND u.f_enabled_mark=1
      AND (u.f_organize_id IN (SELECT f_id FROM departments) OR EXISTS (
        SELECT 1 FROM public.base_user_relation r WHERE r.f_tenant_id=#{tenant} AND r.f_user_id=u.f_id
          AND r.f_object_type='organize' AND r.f_delete_mark IS NULL
          AND r.f_object_id IN (SELECT f_id FROM departments)))
    ORDER BY u.f_id
  </select>
  <update id="finish">
    UPDATE public.dms_template_upgrade_notifications SET lease_token=NULL,lease_until=NULL,
      last_error=#{error,jdbcType=VARCHAR},outcome=#{outcome,jdbcType=VARCHAR},
      completed_at=CASE WHEN #{error,jdbcType=VARCHAR} IS NULL THEN CURRENT_TIMESTAMP ELSE NULL END,
      next_attempt_at=CURRENT_TIMESTAMP+INTERVAL '1 minute'*LEAST(60,GREATEST(1,attempts))
    WHERE tenant_id=#{event.tenantId} AND task_id=#{event.taskId} AND lease_token=#{token}
  </update>
</mapper>