背景:
针对某些业务场景下,存在逆流程。 比如场景的场景 正向流程如,发起某项申请->对某项申请进行审批。(审批为通过/驳回)。这样这个工作流程就算到最终态。
常见的状态机如,
申请未提交(保存草稿)、
申请提交待审批(提交操作)、
审批通过/审批驳回。
但是更多的场景 是允许进行“逆流程”,比如重新发起、撤回等 临时态改变。驳回后能再次申请。撤回后能再次提交等等。
上面只是简单的状态机变化,如果再涉及到 比如二级状态机变化。状态机级联变化,比如 对申请通过的数据记录可以进行 下一阶段的 反馈流程。而同样反馈流程 同样涉及到审批,对反馈的审批又反向影响到申请的状态。举个例子,比如申请通过的数据 可以进行 反馈。反馈审批驳回后,对于该条申请的数据状态 由原来的申请通过,调整为 反馈驳回。亦或者调整为 可以再次发起申请等状态。
基于此 逆流程的 状态机变化处理方案,思路:就是记录当时的 申请单的状态快照。
比如我们对某条记录进行再次申请的时候,我们可以利用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字段 用于记录某种快照状态。