PostgreSQL数据库,简单的实现一个可配置节点的审批流,审批过程中包含会审、或审

news/2024/7/9 19:59:15 标签: 数据库, postgresql, 数学建模

PostgreSQL数据库,简单的实现一个可配置节点的审批流,审批过程中包含会审、或审

实现一个可配置节点的审批流需要设计两个表,一个是节点表,一个是连接表。节点表用于保存各个节点的信息,连接表用于保存节点之间的连接关系。

在节点表中,我们需要保存每个节点的ID、节点类型、节点名称以及其他相关信息。节点类型包括会审节点和或审节点,节点名称是可配置的,用于描述节点的用途。其他信息可以根据实际需求进行添加。

在连接表中,我们需要保存每个连接的ID、源节点ID、目标节点ID,以及连接类型。连接类型包括和审和或审,用于描述连接的审批方式。

在查询这些节点和连接信息时,可以使用递归查询来实现。递归查询可以查找所有与节点相关的连接,以及与这些连接相关的节点,直到查询完所有节点为止。在 PostgreSQL 中,递归查询使用 WITH RECURSIVE 关键字实现。

除了以上内容外,还需要设计一个评估函数,用于判断审批流程是否通过,评估函数可以根据具体的审批条件进行自定义。

实现思路如下:

  1. 创建节点表和连接表。
CREATE TABLE node (
    id SERIAL PRIMARY KEY,
    type TEXT NOT NULL,
    name TEXT NOT NULL,
    -- 其他字段可以根据具体需求添加
);

CREATE TABLE connection (
    id SERIAL PRIMARY KEY,
    source_node_id INTEGER NOT NULL,
    target_node_id INTEGER NOT NULL,
    type TEXT NOT NULL,
    FOREIGN KEY (source_node_id) REFERENCES node(id),
    FOREIGN KEY (target_node_id) REFERENCES node(id)
);
  1. 插入节点和连接信息。
-- 插入会审节点
INSERT INTO node (type, name) VALUES ('and', '会审1');
INSERT INTO node (type, name) VALUES ('and', '会审2');

-- 插入或审节点
INSERT INTO node (type, name) VALUES ('or', '或审1');
INSERT INTO node (type, name) VALUES ('or', '或审2');

-- 插入连接信息
INSERT INTO connection (source_node_id, target_node_id, type) VALUES (1, 3, 'and');
INSERT INTO connection (source_node_id, target_node_id, type) VALUES (2, 3, 'and');
INSERT INTO connection (source_node_id, target_node_id, type) VALUES (3, 4, 'or');
  1. 查询节点和连接信息。
WITH RECURSIVE node_path(id, path, depth) AS (
    SELECT id, ARRAY[id], 1
    FROM node WHERE name = '会审1' -- 指定起始节点
    UNION ALL
    SELECT node.id, path || node.id, depth + 1
    FROM node
    JOIN connection ON node.id = connection.target_node_id
    JOIN node_path ON connection.source_node_id = node_path.id AND type = 'and'
    WHERE NOT node.id = ANY(path)
)
SELECT *
FROM node_path
ORDER BY depth, path;

以上查询将返回从起始节点到结束节点的所有路径。在查询进行中,使用连接表中的连接信息来确定下一步是和审还是或审,如果是和审,则查询必须通过当前节点才能继续,如果是或审,则查询只需要通过其中一个子节点就能继续。

  1. 构建评估函数,判断审批流程是否通过。

评估函数可以根据实际场景进行自定义,例如,在会审节点中必须所有子节点都通过才能通过,而在或审节点中只要有一个子节点通过即可通过。函数可以根据节点类型、连接类型以及其他相关信息来进行判断。具体实现略。


http://www.niftyadmin.cn/n/424012.html

相关文章

【前端基础篇】快速学习HTML常用标签和属性

前奏 学习方法: 整体原则:复习、学习、练习、预习 网上找资料找练习作业、整理笔记、反复加强代码训练常用开发工具: Notepad、Editplus、Hbuilder、IntelliJ IDEA、WebStorm常用的浏览器 IE: trident内核 IE浏览器是世界上使用最广泛的浏览…

AntDesign——TableAPI学习

table表格用于展示数据 https://ant.design/components/table-cn#table 1.bordered false不显示每一个小表格的边框,true反之 2.columns 列名及列数据,接受columns数组 2.1 colums中必须声明的属性 title(列标题) dataInde…

js将本地图装换为base64编码

主要代码: // 注意图片的,onload是异步的,如果要封装成工具函数,需要用promise包装一下imgToBase64(url) {return new Promise((resolve, reject) > {const image new Image()image.src urlimage.onload () > {const can…

《高质量C/C++编程》读书笔记四

文章目录 C函数的高级特性函数重载的概念重载的起源重载是如何实现的当心隐式类型转换导致重载函数产生二义性 成员函数的重载、覆盖与隐藏重载与覆盖令人迷惑的隐藏规则隐藏存在的意义 参数的缺省值运算符重载概念不能被重载的运算符 函数内联 C函数的高级特性 对比于 C 语言的…

windows 服务程序和桌面程序集成(五)集成为一个EXE

系列文章目录链接: windows 服务程序和桌面程序集成(一)概念介绍windows 服务程序和桌面程序集成(二)服务程序windows 服务程序和桌面程序集成(三)UDP监控工具windows 服务程序和桌面程序集成&…

【Leetcode】 1071. 字符串的最大公因子

For two strings s and t, we say “t divides s” if and only if s t ... t (i.e., t is concatenated with itself one or more times). Given two strings str1 and str2, return the largest string x such that x divides both str1 and str2. Example 1: Input: s…

ORACLE数据库——SQL语句基础知识点2

ORACLE数据库 SQL语句基础知识点2 适合有SQL基础的人群。 禁止转载&#xff01; 基本语法 SELECT [*] <选择列表> [FROM] <表资源> [,…n] [WHERE] <行搜索条件> [GROUP BY] <分组表达式> [,…n] [HAVING] <组搜索条件> [ORDER B…

mock是什么?以及springboot中怎么使用mockMVC实现单元测试

目录 Mock是什么&#xff1f;Spring Boot中如何使用MockMVC实现单元测试&#xff1f;添加pom依赖创建测试案例 Mock是什么&#xff1f; Mock是一种测试模式&#xff0c;用于模拟或替代依赖项&#xff0c;以便测试程序的某些部分&#xff0c;而不是依赖于真实的外部系统或组件。…