发票审批工作流当前步骤查询适配OptionalReview规则的方案咨询
发票审核工作流当前步骤查询方案
核心判定逻辑
先明确每个审批节点(按Invoice、Line、ApprovalSeq三个字段分组)的通过规则:
- 优先过滤掉节点内
OptionalReviewer = 'Y'的可选审核人记录,该类记录不影响节点是否通过的判定 - 剩余的必填审核人记录如果全部
ApprovedYN = 'Y',则节点审批通过,进入下一节点 - 特殊适配:如果节点内全为可选审核人(过滤后无必填记录),则只要存在至少1条
ApprovedYN = 'Y'的记录,就判定节点通过
实现SQL(标准SQL语法,兼容绝大多数数据库)
WITH node_pass_flag AS ( SELECT Invoice, Line, ApprovalSeq, -- 标记节点是否通过:1=通过,0=未通过 CASE WHEN -- 所有必填审核人全部通过 SUM(CASE WHEN OptionalReviewer = 'N' AND ApprovedYN = 'N' THEN 1 ELSE 0 END) = 0 AND -- 存在必填审核人 或 全可选时至少有1人通过 (COUNT(CASE WHEN OptionalReviewer = 'N' THEN 1 END) > 0 OR SUM(CASE WHEN ApprovedYN = 'Y' THEN 1 ELSE 0 END) >= 1) THEN 1 ELSE 0 END AS is_pass FROM invoice_approval GROUP BY Invoice, Line, ApprovalSeq ), current_min_node AS ( -- 找到每张发票行最小的未通过审批节点 SELECT Invoice, Line, MIN(ApprovalSeq) AS current_approval_seq FROM node_pass_flag WHERE is_pass = 0 GROUP BY Invoice, Line ) -- 取出当前节点下待审批的必填审核人记录 SELECT a.* FROM invoice_approval a INNER JOIN current_min_node c ON a.Invoice = c.Invoice AND a.Line = c.Line AND a.ApprovalSeq = c.current_approval_seq WHERE a.OptionalReviewer = 'N' AND a.ApprovedYN = 'N' ORDER BY a.Invoice, a.Line, a.ApprovalSeq;
场景适配验证
- 场景1:节点1存在2个必填审核人未审批,判定为未通过,是最小未通过节点,返回对应2条记录,符合预期
- 场景2:节点1全为可选审核人且存在通过记录,判定为通过;节点2存在必填审核人未审批,判定为未通过,返回对应1条记录,符合预期
- 场景3:节点1必填审核人全部通过,判定为通过;节点2存在必填审核人未审批,判定为未通过,返回对应1条记录,符合预期
内容的提问来源于stack exchange,提问作者hjReads
相关产品推荐
相关产品推荐

