审批流设计

2023-11-18

审批流系统

在日常企业中,经常涉及员工提交申请单,需要上级领导和多个节点审批通过,驳回,已完成申请单。

实现目标

  • 工单自定义模版,需支持用户自定义表单,拖拽式动态生成流转表单,打造低代码平台,降低了研发投入成本,提高整体人效;
  • 工单流程需支持用户自定义配置流程,丰富的配置选项,包括流程节点处理人配置、节点操作配置、节点表单模版配置,相对于传统审批流框架更加灵活、修改及时生效,不需要研发修改流程图再发布上线的过程;
  • 工单流程需提供丰富的节点处理人配置,包含按照组织部门架构配置处理部门,人员岗位角色和指定人员;
  • 工单系统需支持多种处理操作,包括工单提交、工单驳回、工单转交和工单废弃,支持业务方各种工单流转场景;
  • 工单系统将表单和流程进行解耦,并将业务表单进行插件化配置,可支持更多业务场景并且不需要对工单系统进行额外开发,只需独立开发业务表单部分,完成业务产品快速上线,提高产品交付效率;

系统设计

系统流程交互

ddd领域模型架构

JSON Schema

使用JSON Schema 自定义申请表单

如何使用 - XRender

基于JSON Schema的前端可视化活动编辑器 - 知乎

审批流程

代码实现

Domain领域层设计

目录结构

FlowReq 聚合根类定义

聚合根:

Aggregate是一组相关对象地集合,作为一个整体被外界访问,聚合根是这个聚合地根节点。

聚合是一个非常重要的概念,核心领域往往都需要聚合来表达。其次,聚合在技术上有非常高的价值,可以指导详细设计。聚合由根实体,值对象和实体组成。

/**
 * FlowReq Entity
 */
@NoArgsConstructor
public class FlowReq {
    /**
     * 主键
     */
    private Integer id;

    /**
     * 主配置表(flow_config)编码
     */
    private String flowConfigCode;

    /**
     * 流程申请id
     */
    private String reqId;

    /**
     * 流程名称
     */
    private String reqName;

    /**
     * 流程当前节点编码
     */
    private String currentNodeCode;

    /**
     * 流程状态
     */
    private FlowReqStatusEnum flowReqStatus;

    /**
     * 子流程总数
     */
    private Integer subTotal;

    /**
     * 子流程完成数
     */
    private Integer subFinishCount;

    /**
     * 申请人
     */
    private String applyErp;

    /**
     * 数据
     */
    private String data;

    /**
     * 业务id
     */
    private Integer relId;

    /**
     * 业务类型,1:垂直业务申请,2:水平业务申请,3:水平业务使用申请
     */
    private Integer businessType;

    private Date createAt;

    private String createBy;

    private Date modifyAt;

    private String modifyBy;

    private List<FlowReqNode> flowReqNodes;

    private FlowReqNode headFlowReqNode;


    public FlowReq(FlowReqSubmitCmd command, String headNodeCode, String headNodeName) {

    }

    /**
     * 提交申请单
     */
    public void submit() {

    }

    /**
     * 批准
     */
    public void adopt() {
        // 申请单是否到终态
        if (FlowReqStatusEnum.terminateStatus.contains(flowReqStatus)) {
            //throw new FlowReqNoWithdrawException();
        }

        // 判断是否最后一个节点
    }

    /**
     * 驳回到终节点
     */
    public void refuse() {

    }

    /**
     * 撤回
     */
    public void withdraw() {

    }

    public List<FlowReqNode> getFlowReqNodes() {
        return flowReqNodes;
    }

    public String getReqId() {
        return reqId;
    }

    public FlowReqNode getHeadFlowReqNode() {
        return headFlowReqNode;
    }
}

infrastructure基础设施层设计

目录结构

application 应用层

流程编排

(三)JDEasyFlow-流程引擎模块使用指南_jjtliyl的博客-CSDN博客

GitHub - JDEasyFlow/jd-easyflow

Compileflow入门教程_灬点点的博客-CSDN博客_compileflow 使用

通用流程编排引擎介绍_changtianshuiyue的博客-CSDN博客_流程编排引擎

自建工单(审批流)系统设计_wenqi365的博客-CSDN博客_工单系统数据库表设计

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

审批流设计 的相关文章

  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 如果一列没有值,MySQL 返回最大值或 null

    我尝试获取 mysql select 的最大值 但如果有一行不包含时间戳 则希望将其设置为 null empty 0 表统计数据 简化 ID CLIENT ORDER DATE CANCEL DATE 1 5 1213567200 2 5
  • 从所有表中选择

    我的数据库中有很多表都具有相同的结构 我想从所有表中进行选择 而不必像这样列出所有表 SELECT name FROM table1 table2 table3 table4 我尝试过 但这不起作用 SELECT name FROM 有没有
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • 如何使用 Java Apache POI 隐藏 Excel 工作表中以下未使用的行?

    我正在使用数据库中的数据填充模板 Excel 工作表 for Map
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • MYSQL:SQL查询获取自增字段的值

    我有一张桌子 主键是id及其自动递增 现在 当我插入新记录时 我需要获取更新记录的 id 我怎样才能做到这一点 如果我使用查询 select max id from table name 执行后我可以获得id 但我能确定它是刚刚插入的记录的
  • Mysql获取特定表的最后一个id

    我必须从特定的插入表中获取最后的插入 ID 可以说我有这个代码 INSERT INTO blahblah test1 test 2 VALUES test1 test2 INSERT INTO blahblah2 test1 test 2
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • 我所有的 java 应用程序现在都会抛出 java.awt.headlessException

    所以几天前我有几个工作Java应用程序使用Swing图书馆 JFrame尤其 他们都工作得很好 现在他们都抛出了这个异常 java awt headlessexception 我不知道是什么改变了也许我的Java版本不小心更新了 谢谢你尽你
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • MySQL #1093 - 您无法在 FROM 子句中指定用于更新的目标表“赠品”

    I tried UPDATE giveaways SET winner 1 WHERE ID SELECT MAX ID FROM giveaways 但它给出了 1093 您无法指定目标表 赠品 进行更新FROM clause 本文 ht
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • #1115 - 未知字符集:'utf8mb4'

    我的电脑上运行着一个本地网络服务器 用于本地开发 我现在正处于导出数据库并导入到我的托管 VPS 的阶段 导出然后导入时出现以下错误 1115 未知字符集 utf8mb4 有人能指出我正确的方向吗 该错误明确表明您没有utf8mb4您的阶段
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据

随机推荐

  • glint360k数据集的解压

    关于训练集的解压早就有人写了blog了 文章地址 https blog csdn net weixin 43408232 article details 109687884 但是对于它剩余的7个bin文件我很困惑 根据他们在官方的微博上声明
  • Verilog学习(3)initial,always,task,function,常见系统任务

    结构说明语句 Verilog中任何过程模块都属于以下四种结构的说明语句 initial说明语句 always 说明语句 task说明语句 function说明语句 一个程序模块可以有多个initial和always 过程块 每个initia
  • 常用的windows命令大全

    当我们熟练掌握windows命令时 可以通过输入命令来快速完成各种系统操作 非常的便捷 那么常用的windows命令有哪些呢 今天 小编就把命令介绍给大家 windows命令 1 gpedit msc 组策略 2 sndrec32 录音机
  • 12-JavaScript的正则表达式 DAY9 (04.20)

    1 正则表达式的定义 正则表达式是由一个字符序列形成的搜索模式 用来匹配 当在文本中搜索数据时 可以使用搜索模式来描述查询内容 其可以是一个简单的字符 或者一个更复杂的模式 2 正则表达式的创建 1 字面量 var reg1 abc g g
  • 论人工智能历史、现状与未来发展战略

    来源 学术前沿 作者 郭毅可 人工智能问世60多年来 承载着人类对自己的智慧的无限自信 在这样的自信下 人工智能发展到了今天 人们在追求机器从事尽可能多的智力劳动的路上走得很快 也很远 今天人工智能的发展 实际上标志着人类第三次认知革命 即
  • 理解cpp的重载,重写,重定义

    函数重载 overload 函数重载是指在一个类中声明多个名称相同但参数列表不同的函数 这些的参数可能个数或顺序 类型不同 但是不能靠返回类型来判断 特征是 1 相同的范围 在同一个作用域中 2 函数名字相同 3 参数不同 4 virtua
  • 死锁产生条件和解决办法

    死锁 死锁产生的四个条件 产生死锁必须同时满足以下四个条件 只要其中任一条件不成立 死锁就不会发生 互斥条件 线程要求对所分配的资源 如打印机 进行排他性控制 即在一段时间内某资源仅为一个线程所占有 此时若有其他线程请求该资源 则请求线程只
  • 城市污水管网监测系统解决方案

    一 方案概述 在经济快速发展和政府政策的推动下 以产业聚焦为核心的城市园区经济发展迅速 由于在城市园区企业 工厂在生产制造过程产生了大量的废水等其他污染物都是由污水管进行排放 一旦发生井下污水管网堵塞 会造成废水中的气体等其他有害物质的传播
  • LSTM预测大写数字的c++ 代码

    自己写的LSTM预测大写数字的c 代码 有较详细的注释 有不懂的可以交流 平台 vs2015 头文件 LstmCppH h pragma once include iostream include math h include stdlib
  • Mysql 数据库

    数据库基础 1 什么是数据库 用来存储数据 数据库可在硬盘及内存中存储数据 数据库与文件存储数据的区别 数据库本质也是通过文件来存储数据 数据库的概念就是系统的管理存储数据的文件 数据库介绍 本质就是存储数据的C S架构的socket套接字
  • 商务智能-第六章 数据挖掘

    Lecture6 Data Mining 1 数据挖掘 在数据库及数据仓库中存贮有大量的数据 它们具有规范的结构形式与可靠的来源 且数量大 保存期间长 是一种极为宝贵的数据资源 充分开发 利用这些数据资源是目前计算机界的一项重要工作 1 1
  • netty handler的执行顺序(3)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 今天解决2个问题 1 handler在pipeline当中究竟是如何存储的 2 在遍历handler的过程中 会根据event的不同 调用不同的handler 这一点是如何
  • Fresco使用

    fresco简单使用 先上文档地址 github https github com facebook fresco 文档 https frescolib org docs index html 从在github上最好点击英文文档 中文的版本
  • 一文学会使用GCeasy——一款超好用的在线分析GC日志的网站

    https blog csdn net CoderBruis article details 101234738
  • #145 - Table 'xxxxx' is marked as crashed and should

    数据表损坏了 只需要修复一下就可以了 进入数据库 执行以下SQL REPAIR TABLE lt datastore
  • box-shadow 设置后看不到的问题

    引子 在修复问题的时候 发现一个元素设置了 box shadow 属性 其它的元素也有公用 但这个元素的阴影看不见 试着把颜色值变的更明显 但还是看不到 问题示例 示例二维码 Origin My GitHub 问题原因 首先想到是不是属性写
  • 12月份GitHub上最热门的Web开源项目

    在过去的一个月里 mybridge对将近200个Web开发开源项目排名 mybridge根据各种因素 对项目进行比较 并从中精选出前10位 上榜开源项目所获得Star数平均为 5550 1Quicklink https github com
  • Day.1 LeetCode刷题练习(最长公共前缀 C/C++两种解法)

    题目 例子 分析题目 主要目的 求出各个字符串的公共前缀 思路 本人解法 用所给实例来看 不难看出我们可以直接以竖着对应来查看是否是公共前缀 这样就有了一定的思路 然后接着想如何让他找到最长的公共前缀后就 停止下来呢 这样就能想到 从最短的
  • Win11共享打印机指定的网络名不可用?

    不知道大家在使用共享打印机的时候是否有遇到错误 共享打印机指定的网络名不可用 的情况 如果有的话 可以试试下面的解决办法 原因很明确 网络名称无法使用 有冲突 删除网络连接 重新建立即可 方法一 1 按键盘上的 Win X 组合键 或右键点
  • 审批流设计

    审批流系统 在日常企业中 经常涉及员工提交申请单 需要上级领导和多个节点审批通过 驳回 已完成申请单 实现目标 工单自定义模版 需支持用户自定义表单 拖拽式动态生成流转表单 打造低代码平台 降低了研发投入成本 提高整体人效 工单流程需支持用