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

文章探讨了在业务场景中处理逆流程的需求,如重新发起、撤回等操作。通过记录状态快照,使用old_id字段保存数据状态,并在新记录中关联旧记录ID来支持逆向操作。在涉及多级状态机变化时,文章提出了在反馈申请中记录原申请ID以同步更新相关状态。示例展示了活动申请表和反馈表的数据库设计结构,包括关键字段如审批状态、重新申请状态和旧申请ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

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

常见的状态机如,

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

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

审批通过/审批驳回。

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值