<?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 <= CURRENT_TIMESTAMP
|
AND (e.valid_to IS NULL OR CURRENT_TIMESTAMP < 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>
|