刘光辉
2 小时以前 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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?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.DmsWenjianDayinTaizhangMapper">
    <resultMap id="LedgerRow" type="java.util.LinkedHashMap" autoMapping="false">
        <result column="f_id" property="f_id"/>
        <result column="laiyuan_leixing" property="laiyuan_leixing"/>
        <result column="laiyuan_danju_id" property="laiyuan_danju_id"/>
        <result column="laiyuan_mingxi_id" property="laiyuan_mingxi_id"/>
        <result column="wenjian_id" property="wenjian_id"/>
        <result column="wenjian_mingcheng" property="wenjian_mingcheng"/>
        <result column="wenjian_bianhao" property="wenjian_bianhao"/>
        <result column="banbenhao" property="banbenhao"/>
        <result column="shenhe_wancheng_riqi" property="shenhe_wancheng_riqi"/>
        <result column="peixun_wancheng_riqi" property="peixun_wancheng_riqi"/>
        <result column="shengxiao_riqi" property="shengxiao_riqi"/>
        <result column="jieshou_bumen_id" property="jieshou_bumen_id"/>
        <result column="shifou_shoukong" property="shifou_shoukong"/>
        <result column="jieshou_bumen" property="jieshou_bumen"/>
        <result column="dayin_fenshu" property="dayin_fenshu"/>
        <result column="yidayin_fenshu" property="yidayin_fenshu"/>
        <result column="weidayin_fenshu" property="weidayin_fenshu"/>
        <result column="beizhu_shuoming" property="beizhu_shuoming"/>
        <result column="biz_status" property="biz_status"/>
        <result column="biz_status_mingcheng" property="biz_status_mingcheng"/>
        <result column="f_creator_time" property="f_creator_time"/>
    </resultMap>
    <resultMap id="CountRow" type="java.util.HashMap" autoMapping="false">
        <result column="total" property="total" javaType="java.lang.Long"/>
    </resultMap>
 
    <!-- Each branch owns its task matching rules; grants are resolved by the permission service. -->
    <sql id="DirectoryTaskVisibility">
        EXISTS (
            SELECT 1
            FROM public.dms_wenjian_ziyuan z
            JOIN permission_folders f ON f.id = z.wenjian_mulu_id
            WHERE z.f_tenant_id = t.f_tenant_id AND z.f_id = t.wenjian_id
              AND z.f_delete_mark IS NULL
        )
    </sql>
 
    <sql id="ApplicantTaskVisibility">
        (t.laiyuan_leixing = 'wenjian_dayin' AND EXISTS (
            SELECT 1
            FROM public.dms_wenjian_dayin_shenqing a
            JOIN public.dms_wenjian_dayin_shenqing_zixiang d
              ON d.f_tenant_id = a.f_tenant_id AND d.f_foreign_id = a.f_id
             AND d.f_id = t.laiyuan_mingxi_id AND d.f_delete_mark IS NULL
            JOIN public.dms_wenjian_banben v
              ON v.f_tenant_id = d.f_tenant_id AND v.f_id = d.banben_id
             AND v.wenjian_id = d.wenjian_id AND v.banbenhao = d.banben_hao
             AND v.f_delete_mark IS NULL
            JOIN permission_versions p ON p.id = v.wenjian_zhongxin_banben_id
            JOIN public.dms_wenjian_ziyuan z
              ON z.f_tenant_id = t.f_tenant_id AND z.f_id = t.wenjian_id
             AND z.f_delete_mark IS NULL
            WHERE a.f_tenant_id = t.f_tenant_id AND a.f_id = t.laiyuan_danju_id
              AND a.f_delete_mark IS NULL AND a.shenqing_ren = #{q.userId}
              AND a.f_flow_state = #{q.approvedFlowState}
              AND d.wenjian_id = t.wenjian_id AND d.banben_hao = t.banbenhao
        ))
    </sql>
 
    <!-- READ exclusions also deny PRINT, as in DmsPermissionDecisionService.
         Resolve the task's business version, not the resource's latest version. -->
    <sql id="TaskReadExclusion">
        NOT EXISTS (
            SELECT 1
            FROM public.dms_wenjian_banben v
            JOIN public.dms_access_exclusions e
              ON e.tenant_id = v.f_tenant_id
             AND ((e.resource_type = 'DOCUMENT'
                   AND e.resource_id::text = v.wenjian_zhongxin_wenjian_id)
               OR (e.resource_type = 'FILE_VERSION'
                   AND e.resource_id::text = v.wenjian_zhongxin_banben_id))
            WHERE v.f_tenant_id = t.f_tenant_id AND v.wenjian_id = t.wenjian_id
              AND v.banbenhao = t.banbenhao AND v.f_delete_mark IS NULL
              AND e.user_id = #{q.userId} AND e.action_code = 'READ'
              AND e.revoked_at IS NULL AND e.valid_from &lt;= CURRENT_TIMESTAMP
              AND (e.valid_to IS NULL OR CURRENT_TIMESTAMP &lt; e.valid_to)
        )
    </sql>
 
    <sql id="VisibleTasks">
        WITH permission_folders AS (
            SELECT jsonb_array_elements_text(CAST(#{q.folderIdsJson} AS jsonb)) AS id
        ), permission_versions AS (
            SELECT jsonb_array_elements_text(CAST(#{q.workflowPrintVersionIdsJson} AS jsonb)) AS id
        ),
        visible_tasks AS (
            SELECT t.*, o.f_full_name AS jieshou_bumen
            FROM public.dms_wenjian_dayin_renwu t
            LEFT JOIN public.base_organize o ON o.f_tenant_id = t.f_tenant_id
                AND o.f_id = t.jieshou_bumen_id AND o.f_delete_mark IS NULL
            WHERE t.f_tenant_id = #{q.tenantId} AND t.f_delete_mark IS NULL
              AND t.biz_status IN ('daidayin', 'bufendayin')
            <if test="q.taskId != null">AND t.f_id = #{q.taskId}</if>
            <if test="q.search != null and q.search != ''">
              AND (t.wenjian_mingcheng ILIKE CONCAT('%', #{q.search}, '%')
                OR t.wenjian_bianhao ILIKE CONCAT('%', #{q.search}, '%')
                OR o.f_full_name ILIKE CONCAT('%', #{q.search}, '%'))
            </if>
              AND (<include refid="DirectoryTaskVisibility"/>
                   OR <include refid="ApplicantTaskVisibility"/>)
              AND <include refid="TaskReadExclusion"/>
        )
    </sql>
 
    <select id="selectCount" resultMap="CountRow">
        <include refid="VisibleTasks"/>
        SELECT COUNT(*) AS total FROM visible_tasks
    </select>
 
    <select id="selectPage" resultMap="LedgerRow">
        <include refid="VisibleTasks"/>
        SELECT t.f_id, t.laiyuan_leixing, t.laiyuan_danju_id, t.laiyuan_mingxi_id,
               t.wenjian_id, t.wenjian_mingcheng, t.wenjian_bianhao, t.banbenhao,
               t.shenhe_wancheng_riqi, t.peixun_wancheng_riqi, t.shengxiao_riqi,
               t.jieshou_bumen_id, t.shifou_shoukong, t.jieshou_bumen, t.dayin_fenshu,
               printed.copies AS yidayin_fenshu,
               GREATEST(t.dayin_fenshu - printed.copies, 0) AS weidayin_fenshu,
               t.beizhu_shuoming, t.biz_status,
               CASE t.biz_status WHEN 'daidayin' THEN '待打印'
                   WHEN 'bufendayin' THEN '部分打印' END AS biz_status_mingcheng,
               t.f_creator_time
        FROM (
            SELECT * FROM visible_tasks
            ORDER BY f_creator_time DESC NULLS LAST, f_id DESC
            OFFSET #{q.offset} LIMIT #{q.limit}
        ) t
        CROSS JOIN LATERAL (
            SELECT COUNT(*)::integer AS copies FROM public.dms_wenjian_dayin_jilu p
            WHERE p.f_tenant_id = t.f_tenant_id AND p.dayin_renwu_id = t.f_id
 
        ) printed
        ORDER BY t.f_creator_time DESC NULLS LAST, t.f_id DESC
    </select>
</mapper>