当前位置: 首页 > 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字段 用于记录某种快照状态。

http://www.lryc.cn/news/36016.html

相关文章:

  • 【剧前爆米花--爪哇岛寻宝】Java实现无头单向非循环链表和无头双向链表与相关题目
  • 学习MvvmLight工具
  • 基于BiLSTM+CRF医学病例命名实体识别项目
  • 05 C语言数据类型
  • C++11:右值引用和移动语义
  • tcpdump网络抓包工具
  • MaxCompute SQL中的所有保留字与关键字如下
  • Kafka 压缩算法
  • 关于React Hook(18)
  • 计算机网络:BGP协议
  • 91. 解码方法 ——【Leetcode每日刷题】
  • 人体存在传感器成品方案,精准感知静止存在,实时智能化感控技术
  • mysql连接池的实现
  • 哪种类型蓝牙耳机佩戴最舒服?舒适度最好的蓝牙耳机推荐
  • 2020蓝桥杯真题洁净数 C语言/C++
  • 【随笔二】useReducer详解及其应用场景
  • 打怪升级之istringstream介绍
  • 系统重装漏洞
  • C++面向对象编程之五:友元(friend)
  • [手写OS]动手实现一个OS 之X86实模式下的汇编开发
  • 【Linux内核二】常用的网络丢包错包debug工具介绍
  • qt控件增加渐变色效果
  • 【node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 最全面有效的解决方案】
  • 打怪升级之字符串的分界符与字符串替换
  • 载荷台子使用方式
  • 1005 继续(3n + 1)猜想
  • VMware15配置NAT模式联通网络
  • doPost的实际使用
  • 2017年MathorCup数学建模A题流程工业的智能制造解题全过程文档及程序
  • HNU-电子测试平台与工具2-数模转换