当前位置: 首页 > news >正文

逆流程 场景下 处理状态机变化的方案

背景:

        针对某些业务场景下,存在逆流程。 比如场景的场景  正向流程如,发起某项申请->对某项申请进行审批。(审批为通过/驳回)。这样这个工作流程就算到最终态。

常见的状态机如,

申请未提交(保存草稿)、

申请提交待审批(提交操作)、

审批通过/审批驳回。

但是更多的场景 是允许进行“逆流程”,比如重新发起、撤回等 临时态改变。驳回后能再次申请。撤回后能再次提交等等。

        上面只是简单的状态机变化,如果再涉及到 比如二级状态机变化。状态机级联变化,比如 对申请通过的数据记录可以进行 下一阶段的 反馈流程。而同样反馈流程 同样涉及到审批,对反馈的审批又反向影响到申请的状态。举个例子,比如申请通过的数据 可以进行 反馈。反馈审批驳回后,对于该条申请的数据状态 由原来的申请通过,调整为 反馈驳回。亦或者调整为 可以再次发起申请等状态。

基于此 逆流程的 状态机变化处理方案,思路:就是记录当时的 申请单的状态快照。

        比如我们对某条记录进行再次申请的时候,我们可以利用old_id 字段 保存当时的数据的状态,同时新增一条新记录。或者同时增加额外的字段 比如is_recommited 记录是否重复提交等行为。

        通过这种方式 我们可以回溯到当时的数据的状态 进行逆向操作。

        而对于我刚刚说的 状态级联的场景,可以再新的 申请单上 记录 原申请单id。比如在反馈的申请单中记录 申请的申请单id。 在发起反馈 进行创建反馈申请单时,把申请的申请单id也同步记录下来。保证后续操作反馈申请的状态时,可以同步更新申请的申请单的申请信息。

Dome 举例 数据表sql参考如:

活动申请表:

CREATE TABLE `dg_slf_activity_apply` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',`code` varchar(20) DEFAULT NULL COMMENT '申请编号',`start_time` date DEFAULT NULL COMMENT '预计活动开始时间',`end_time` date DEFAULT NULL COMMENT '预计活动结束时间',`activity_days` int(11) DEFAULT NULL COMMENT '活动天数',`total_budget` decimal(20,2) DEFAULT NULL COMMENT '活动总预算',`online_total_budget` decimal(20,2) DEFAULT NULL COMMENT '线上预算合计',`offline_total_budget` decimal(20,2) DEFAULT NULL COMMENT '线下预算合计',`apply_submit_date` datetime DEFAULT NULL COMMENT '申请提交日期',`re_application_status` int(11) NOT NULL DEFAULT '0' COMMENT '重新申请状态,0未申请,1已申请',`approval_status` int(11) NOT NULL COMMENT '审批状态:0:申请未提交,1:申请已提交,2:申请已通过,-2:申请已驳回,3:反馈未提交,4:反馈待审批,5:反馈已通过,-5:反馈已驳回',`approval_comments` varchar(255) DEFAULT NULL COMMENT '审批意见',`old_apply_id` bigint(20) DEFAULT NULL COMMENT '审批驳回重新提交,提交之前的申请id,为空则不是重复提交',`deleted` int(11) NOT NULL DEFAULT '0' COMMENT '逻辑删除,0:未删除,1:已删除',`create_by` varchar(64) NOT NULL COMMENT '创建者',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_by` varchar(64) NOT NULL COMMENT '修改者',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=99 DEFAULT CHARSET=utf8mb4 COMMENT='活动申请表';

活动反馈表:

CREATE TABLE `dg_slf_activity_feedback_apply` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',`activity_apply_id` bigint(20) DEFAULT NULL COMMENT '活动申请id',`code` varchar(255) DEFAULT NULL COMMENT '申请编号',`start_time` date DEFAULT NULL COMMENT '预计活动开始时间',`end_time` date DEFAULT NULL COMMENT '预计活动结束时间',`activity_days` int(11) DEFAULT NULL COMMENT '活动天数',`total_amount` decimal(20,2) DEFAULT NULL COMMENT '实际总花费',`online_total_amount` decimal(20,2) DEFAULT NULL COMMENT '线上实际花费合计',`offline_total_amount` decimal(20,2) DEFAULT NULL COMMENT '线下实际花费合计',`apply_submit_date` datetime DEFAULT NULL COMMENT '申请提交日期',`re_application_status` int(11) NOT NULL DEFAULT '0' COMMENT '重新申请状态,0未申请,1已申请',`approval_status` int(11) NOT NULL COMMENT '审批状态:0:申请未提交,1:申请已提交,2:申请已通过,-2:申请已驳回,3:反馈未提交,4:反馈待审批,5:反馈已通过,-5:反馈已驳回',`approval_comments` varchar(255) DEFAULT NULL COMMENT '审批意见',`approver_id` bigint(20) DEFAULT NULL COMMENT '审批人id',`approver_name` varchar(100) DEFAULT NULL COMMENT '审批人',`approval_date` date DEFAULT NULL COMMENT '审批日期',`old_apply_id` bigint(20) DEFAULT NULL COMMENT '审批驳回重新提交,提交之前的申请id,为空则不是重复提交',`deleted` int(11) NOT NULL DEFAULT '0' COMMENT '逻辑删除,0:未删除,1:已删除',`applicant_id` bigint(20) NOT NULL COMMENT '申请人id',`create_by` varchar(64) NOT NULL COMMENT '创建者',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_by` varchar(64) NOT NULL COMMENT '修改者',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb4 COMMENT='活动反馈表';

说明:

        如在活动反馈表中 利用activity_apply_id 记录活动申请表信息。利用old_apply_id记录逆流程快照信息。活动申请表类似,同时re_application_status字段 用于记录某种快照状态。

相关文章:

逆流程 场景下 处理状态机变化的方案

背景: 针对某些业务场景下,存在逆流程。 比如场景的场景 正向流程如,发起某项申请->对某项申请进行审批。(审批为通过/驳回)。这样这个工作流程就算到最终态。 常见的状态机如, 申请未提交&#xff0…...

【剧前爆米花--爪哇岛寻宝】Java实现无头单向非循环链表和无头双向链表与相关题目

作者:困了电视剧 专栏:《数据结构--Java》 文章分布:这是关于数据结构链表的文章,包含了自己的无头单向非循环链表和无头双向链表实现简单实现,和相关题目,想对你有所帮助。 目录 无头单向非循环链表实现 …...

学习MvvmLight工具

最近学习了一下MvvmLight,觉得有些功能还是挺有特色的,所以记录一下 首先新建也给WPF程序 然后在Nuget里面安装MvvmLightLib 包,安装上面那个也可以,但是安装上面那个会自动在代码里面添加一些MvvmLight的demo ,安装M…...

基于BiLSTM+CRF医学病例命名实体识别项目

研究背景 为通过项目实战增加对命名实体识别的认识,本文找到中科院软件所刘焕勇老师在github上的开源项目,中文电子病例命名实体识别项目MedicalNamedEntityRecognition。对其进行详细解读。 原项目地址:https://github.com/liuhuanyong/Med…...

05 C语言数据类型

05 C语言数据类型 1、数据类型 编程语言对数据类型分为两派&#xff1a;一种认为要注重&#xff0c;一种认为可以忽视。 C语言类型 1、整数 : char < short < int < long < long long &#xff0c;bool 2、浮点数&#xff1a;float < double < long doub…...

C++11:右值引用和移动语义

文章目录1. 左值和右值表达式1.1 概念1.2 左值和右值2. 左值引用和右值引用2.1 相互引用2.2 示例代码2.3 左值引用使用场景缺点2.4 右值引用和移动语义小结2.5 移动赋值2.6 右值引用的其他使用场景右值引用版本的插入函数3. 完美转发3.1 万能引用3.2 如何实现完美转发3.3 完美转…...

tcpdump网络抓包工具

tcpdump 是一个强大的网络抓包工具&#xff0c;在分析服务之间调用时非常有用。可以将网络中传送的数据包抓取下来进行分析。tcpdump 提供灵活的抓取策略&#xff0c;支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;并提供 and、or、not 等逻辑语句来去掉不想要的信…...

MaxCompute SQL中的所有保留字与关键字如下

– MaxCompute SQL中的所有保留字与关键字如下 注意 命名表、列或分区时&#xff0c;不要使用保留字与关键字&#xff0c;否则可能会报错。 保留字不区分大小写。 在对表、列或是分区命名时如若使用关键字&#xff0c;需给关键字加符号进行转义&#xff0c;否则会报错。 % &am…...

Kafka 压缩算法

压缩 (compression) : 用时间换空间的思想 用较小的 CPU 开销获得磁盘少占用或网络 I/O 少传输 Kafka 消息分两层&#xff1a; 消息日志组成 : n 个消息集合消息集合 (message set) 组成 : n 条日志项 (record item)日志项封装了消息 (message)Kafka 在消息集合层上进行写入…...

关于React Hook(18)

useState&#xff08;&#xff09;&#xff1a;&#x1f449;详情 &#xff08;必须“有条件地调用”&#xff1b;注意避免冗余状态的产生&#xff09; 关于useState的两种使用方式的区别&#xff1a;&#x1f449;详情 关于batch机制&#xff1a;有条件地调用一些状态的set方…...

计算机网络:BGP协议

BGP协议 与其他AS的邻站BPG发言人交换信息。 交换的网络可达性信息&#xff0c;即要到达某一个网络所要经历的一系列AS 发生变化时&#xff0c;更新有变化的部分 BGP协议交换信息的过程&#xff1a;所交换的网络可达性信息就是要到达某一个网络所要经历的一系列AS&#xff…...

91. 解码方法 ——【Leetcode每日刷题】

91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; ‘A’ -> “1” ‘B’ -> “2” … ‘Z’ -> “26” 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种方法&#xff0…...

人体存在传感器成品方案,精准感知静止存在,实时智能化感控技术

随着现今智能时代的发展&#xff0c;酒店也越来越趋于智能化&#xff0c;也在不断地推行智慧酒店&#xff0c;这也给人们入住酒店提供了良好的体验。 人体存在感知是智能酒店中极其重要的一项应用技术&#xff0c;只有智能设备通过精准地感知人体存在&#xff0c;才能更好地做…...

mysql连接池的实现

目录 1 池化技术 2 什么是数据库连接池 3 为什么使用数据库连接池 3.1 不使用连接池 3.2 使用连接池 3.3 长连接和连接池的区别 4 数据库连接池运行机制 5 连接池和线程池的关系 6 线程池设计要点 6.1 连接池设计逻辑 构造函数 初始化 请求获取连接 归还连接 析…...

哪种类型蓝牙耳机佩戴最舒服?舒适度最好的蓝牙耳机推荐

如果您想在外出时听自己喜欢的音乐&#xff0c;您需要佩戴耳机&#xff0c;当前的耳机都足够小&#xff0c;可以将它们放在口袋里&#xff0c;即使它们在充电盒中也是如此&#xff0c;舒适度一直都是人们所追求的&#xff0c;舒适之余&#xff0c;佩戴同样稳固更加令人安心&…...

2020蓝桥杯真题洁净数 C语言/C++

题目描述 小明非常不喜欢数字 2&#xff0c;包括那些数位上包含数字 2 的数。如果一个数的数位不包含数字 2&#xff0c;小明将它称为洁净数。 请问在整数 1 至 n 中&#xff0c;洁净数有多少个&#xff1f; 输入描述 输入的第一行包含一个整数 n(1≤n≤10^6)。 输出描述 输…...

【随笔二】useReducer详解及其应用场景

前言 useReducer 实际上是 useState 的升级版&#xff0c;都是用来存储和更新 state&#xff0c;只是应用的场景不一样。 一般情况下&#xff0c;我们使用 useState 就足够项目需要了&#xff0c;不多当遇到以下场景时&#xff0c;使用useReducer 会更好些 。 状态逻辑复杂&…...

打怪升级之istringstream介绍

istringstream类 istringstream本质不是类&#xff0c;是一个宏&#xff0c;或者说是一个流&#xff1a; typedef basic_istringstream<char> istringstream;istringstream从basic_istringstream的char专用项而来。这一部分让人看得摸不着头脑的原因是因为大量使用了st…...

系统重装漏洞

zzcms系统重装漏洞 一、配置zzcms环境 1. 使用小皮搭建zzcms框架 2. 安装zzcms 按照下面的操作进行,傻瓜式操作即可 3. 打开网站 二、漏洞利用 在访问install目录的默认文件后,会出现zzcms安装向导 http://www.zzcms.com/install/index.php 但是会显示 “安装向导…...

C++面向对象编程之五:友元(friend)

C中&#xff0c;允许一个类的非共有成员被这个类授予友元&#xff08;friend&#xff09;关系的全局函数&#xff0c;另一个类&#xff0c;或另一个类中的成员函数访问。友元不是一个类中的成员&#xff0c;所以它们不受声明出现部分的访问权限&#xff08;public&#xff0c;p…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python&#xff0c;或者java 的大型项目中&#xff0c;都会涉及到 自身平台微服务之间的相互调用&#xff0c;以及和第三发平台的 接口对接&#xff0c;那在python 中是怎么实现的呢&#xff1f; 在 Python Web 开发中&#xff0c;FastAPI 和 Django 是两个重要但定位不…...