逆流程 场景下 处理状态机变化的方案
创始人
2024-05-31 11:09:47
0

背景:

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

常见的状态机如,

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

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

审批通过/审批驳回。

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

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

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

        比如我们对某条记录进行再次申请的时候,我们可以利用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字段 用于记录某种快照状态。

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...