PostgreSQL数据库函数,实现一个可根据职位角色配置节点,包含多级审批功能,审批过程中有会审、或审

news/2024/10/30 13:37:18/

PostgreSQL数据库函数,实现一个可根据职位角色配置节点,包含多级审批功能,审批过程中有会审、或审

在开始实现之前,我们需要定义一些概念和规则:

  1. 审批流程是由若干个审批节点(Approval Node)组成的,每个节点代表一个审批环节。
  2. 每个审批节点包含一个节点ID,一个节点名称,以及一个可选的节点描述。
  3. 审批流程还包括一个开始节点和一个结束节点,它们不需要配置具体的审批人。
  4. 一个审批节点可以有多个后续节点,表示审批通过之后,流程会继续走向这些后续节点中的一个。
  5. 每个审批节点都需要配置一个审批规则,这个规则用于决定流程如何继续,可以是会审、或审或者单人审批。
  6. 审批规则的具体定义会在后文中给出。
  7. 审批记录会被记录在一个单独的审批记录表中,每条记录包含审批节点ID、审批人、审批时间、以及审批结果。

有了以上的规则和概念,我们就可以开始设计审批流程的数据库表和函数了。以下是一个可能的实现方案:

首先,我们需要创建一个审批节点表(ApprovalNode),用于存储所有的审批节点信息。

CREATE TABLE ApprovalNode (id SERIAL PRIMARY KEY,name TEXT NOT NULL,description TEXT,rule TEXT NOT NULL,next_node_ids INTEGER[]
);

其中,rule字段代表审批规则,它可以取以下三种值之一:

  1. “ALL”: 会审规则。表示所有节点都需要审批通过才能继续流程。
  2. “ANY”: 或审规则。表示所有节点中有至少一个节点审批通过就可以继续流程。
  3. “SINGLE”: 单人审批规则。表示只需要当前节点的一个审批人审批通过就可以继续流程。

next_node_ids表示下一个节点的ID,对于审批流程中的最后一个节点,这个字段为空。

接下来,我们需要创建一个审批记录表(ApprovalRecord),用于记录所有的审批记录信息。

CREATE TABLE ApprovalRecord (id SERIAL PRIMARY KEY,node_id INTEGER NOT NULL,approver TEXT NOT NULL,approved_at TIMESTAMP NOT NULL,approved_result BOOLEAN NOT NULL
);

其中,node_id表示审批节点的ID,approver表示审批人的名称,approved_at表示审批通过的时间,approved_result表示审批是否通过。

接着,我们需要创建一个函数来查询指定节点的所有后续节点ID。

CREATE FUNCTION getNextNodes(node_id INTEGER)RETURNS SETOF INTEGERAS $$BEGINRETURN QUERY SELECT unnest(next_node_ids)FROM ApprovalNodeWHERE id = node_id;END;$$LANGUAGE plpgsql;

这个函数的作用是查询给定节点的所有后续节点ID。

接下来,我们需要创建一个函数来判断指定节点是否可以通过审批。

CREATE FUNCTION canApprove(node_id INTEGER)RETURNS BOOLEANAS $$DECLARErule_text TEXT;approvers TEXT[];approved_count INTEGER;total_count INTEGER;BEGIN-- 查询节点的审批规则和后续节点IDSELECT rule, ARRAY(SELECT unnest(approver_list)FROM ApprovalNode JOIN ApprovalRecord ON ApprovalNode.id = node_idWHERE ApprovalNode.rule = 'SINGLE' AND ApprovalRecord.approved_result = true), (SELECT COUNT(DISTINCT approver)FROM ApprovalRecordWHERE node_id = node_id AND approved_result = true), (CASEWHEN (SELECT rule FROM ApprovalNode WHERE id = node_id) = 'ALL' THEN (SELECT COUNT(DISTINCT approver)FROM ApprovalRecordWHERE node_id = node_id)ELSE (SELECT COUNT(*)FROM ApprovalNodeWHERE id = ANY(next_node_ids))END)INTO rule_text, approvers, approved_count, total_countFROM ApprovalNodeWHERE id = node_id;-- 判断审批规则IF rule_text = 'ALL' AND approved_count < total_count THENRETURN FALSE;ELSIF rule_text = 'SINGLE' AND approved_count = 1 THENRETURN TRUE;ELSIF rule_text = 'ANY' AND approved_count > 0 THENRETURN TRUE;END IF;-- 如果需要会审,则检查是否所有已有的审批人都通过了审批IF rule_text = 'ALL' THENSELECT array_agg(DISTINCT approver)INTO approversFROM ApprovalRecordWHERE node_id = node_id AND approved_result = true;END IF;-- 如果还有未审批通过的审批人,则返回FALSEIF approved_count < total_count AND NOT all(i IN approvers FOR j IN approver_list WHEN i = j) THENRETURN FALSE;END IF;RETURN TRUE;END;$$LANGUAGE plpgsql;

这个函数的作用是判断指定节点是否可以通过审批。具体实现细节可以参考代码中的注释。

最后,我们需要创建一个函数来记录审批记录。

CREATE FUNCTION addApprovalRecord(node_id INTEGER, approver TEXT, approved_result BOOLEAN)RETURNS VOIDAS $$BEGININSERT INTO ApprovalRecord(node_id, approver, approved_at, approved_result)VALUES(node_id, approver, NOW(), approved_result);END;$$LANGUAGE plpgsql;

这个函数的作用是记录审批记录信息。

至此,我们已经完成了审批流程的数据库表和函数的设计。在实际使用中,我们可以编写一个类似于控制器的程序来调用这些函数,从而控制审批流程的执行。具体的实现方式会根据具体的需求而有所不同。


http://www.ppmy.cn/news/341945.html

相关文章

一种简单的文本监督语义分割框架

文章目录 A Simple Framework for Text-Supervised Semantic Segmentation摘要本文方法动机Locality-Driven Alignment&#xff08;LoDA&#xff09;SimSeg Framework 实验结果 A Simple Framework for Text-Supervised Semantic Segmentation 摘要 文本监督语义分割是一个新…

SQL语句中EXISTS的详细用法大全

SQL语句中EXISTS的详细用法大全 前言一、建表1.在MySQL数据库建表语句2.在ORACLE数据库建表语句 二、在SELECT语句中使用EXISTS1.在SQL中使用EXISTS2.在SQL中使用NOT EXISTS3.在SQL中使用多个NOT EXISTS4.在SQL中使用多个EXISTS5.在SQL中使用NOT EXISTS和EXISTS 三、在DELETE语…

Arcgis根据经纬度获得点的地理信息/行政区划信息

步骤可以总结为&#xff1a; 导入shp文件&#xff08;面数据&#xff0c;也就是行政区划的依据&#xff09; 导入栅格数据 将栅格数据落入到坐标系中 将导入的栅格点导出为shp图层 栅格点与面数据连接对齐 导出结果 1、导入shp文件&#xff08;面数据&#xff0c;也就是行…

Oracle表分区知识整理

一、 Oracle表分区的概念 Oracle 分区功能可以提高许多应用程序的可管理性、性能与可用性。通过分区功能&#xff0c;可以将表、索引和索引组织表进一步细分为段&#xff0c;从而能够更精确地管理和访问这些数据库对象。Oracle 提供了种类繁多的分区方案以满足每种业务要求。 …

oracle表分区

一、 Oracle表分区的概念 Oracle 分区功能可以提高许多应用程序的可管理性、性能与可用性。通过分区功能&#xff0c;可以将表、索引和索引组织表进一步细分为段&#xff0c;从而能够更精确地管理和访问这些数据库对象。Oracle 提供了种类繁多的分区方案以满足每种业务要求。 …

逐浪软件六周年大型有奖征文启动

原文&#xff1a;http://zoomla.cn/Article/news/1294.shtml 07.jpg(27.29 K) 2011-2-26 10:25:23 从相识&#xff0c; 到相知&#xff0c; 到相爱。逐浪软件六年的历程&#xff0c; 是不断跋涉与践行大道的历程。 Zoomla!这个响亮的字符&#xff0c; 始终刻在每一个逐浪人的心…

redhat 7 手册

序 1994年&#xff0c;Young和Mark Ewing创建了Red Hat公司&#xff0c;并创造了全球使用最广泛的Red Hat Linux套件&#xff0c;为Linux的普及立下了汗马功劳&#xff0c;笔者也是跟随着Red Hat的带领下走进Linux世界的。Red Hat取得了辉煌的成绩&#xff0c;甚至许多Linux发行…

刚买的win8.1电脑 求常用的软件推荐?

知乎链接 回到了学校&#xff0c;因为学习工作&#xff0c;还是换回了win8.1 with update 3&#xff0c;然后更新一下&#xff0c;分享一下自己使用到的软件 -------------------------------------11:08 2015/3/16更新------------------------------------------- 1、浏览器…