通用流程管理要做些什么

通用流程管理旨在抽象出流程部分,让流程与业务进行松耦合,那么这个抽象过程就需要考虑出完整的结构,以适合尽可能多的业务。
我们通常做项目的时候,都把业务流程两个词儿放到一起考虑,其实我们不妨把业务和流程分开考虑。当业务和流程分开之后,可以想象,业务层就可以减轻大量的工作。

当然,随之而来的要求就是需要我们通用流程部分不断去迭代。以兼容更多的业务流程情形。

基础的结构

首先,我们还是按照一个有向无环图的理论点去推进。那么整个流程就可以抽象成以下几个点:

  1. 流程图
  2. 流程节点
  3. 流程边

首先,流程图就是描述整个流程的情况,初步实验的结构如下

public class ProcessTree {private ProcessNode beginNode;private String processName;private Long processId;private String processDesc;
}

流程节点,就是每个流程的顶点,结构如下

public class ProcessNode {private Long nodeId; // 节点标识private String processName; // 节点名private String nodeType; // 节点类型private Boolean processStart; // 起始节点private Boolean processFinish; // 结束节点private String processStatus; // 节点状态private List<ProcessSide> adjSide; // 邻接边:定义出节点关系
}

流程边,也就是流程节点间的流转关系,结构如下:

public class ProcessSide {private String relationType; // 关系类型private ProcessNode toNode; // 达到节点
}

理论上讲,我们的流程节点应该要挂到某个应用场景下,流程边应该是要控制流转是否可达,但是这里又会存在粒度问题,即流程边是否能与我们的业务挂钩,如果挂钩了,是否显得过于复杂,同时又和松耦合的理念相悖?

测试基础结构的可用性

现在,我定义一个子类来继承ProcessTree,用来表示是某个业务场景下的流程。

package com.chaojilaji.autocli.process.demo;import com.chaojilaji.autocli.process.ProcessTree;public class CcsProcessTree extends ProcessTree {private Long projectId;private Long bizSystemId;public CcsProcessTree() {}public CcsProcessTree(String processName, Long processId, String processDesc) {super(processName, processId, processDesc);}}

然后,在单元测试里面对以上结构的可序列化和反序列化特性进行初步测试

@Testpublic void demo() {CcsProcessTree processTree = new CcsProcessTree("demo",1L,"demodemodemo");processTree.setBizSystemId(123L);processTree.setProjectId(456L);ProcessNode begin = new ProcessNode(1L,"开始","1",true,false);processTree.setBeginNode(begin);ProcessNode a = new ProcessNode(2L,"a","1",false,false);ProcessSide s1 = new ProcessSide("1",a);begin.getAdjSide().add(s1);ProcessNode a1 = new ProcessNode(3L,"a1","1",false,false);ProcessNode a2 = new ProcessNode(4L,"a2","1",false,false);ProcessNode a3 = new ProcessNode(5L,"a3","1",false,false);ProcessSide s2 = new ProcessSide("1",a1);ProcessSide s3 = new ProcessSide("1",a2);ProcessSide s4 = new ProcessSide("1",a3);a.getAdjSide().add(s2);a.getAdjSide().add(s3);a.getAdjSide().add(s4);ProcessNode a11 = new ProcessNode(31L,"a11","1",false,false);ProcessNode a21 = new ProcessNode(41L,"a21","1",false,false);ProcessNode a31 = new ProcessNode(51L,"a31","1",false,false);ProcessSide s5 = new ProcessSide("1",a11);ProcessSide s6 = new ProcessSide("1",a21);ProcessSide s7 = new ProcessSide("1",a31);a1.getAdjSide().add(s5);a2.getAdjSide().add(s6);a3.getAdjSide().add(s7);ProcessNode a111 = new ProcessNode(311L,"a111","1",false,false);ProcessNode a211 = new ProcessNode(411L,"a211","1",false,false);ProcessSide s8 = new ProcessSide("1",a111);ProcessSide s9 = new ProcessSide("1",a211);a11.getAdjSide().add(s8);a21.getAdjSide().add(s9);a31.getAdjSide().add(s9);ProcessNode a1111 = new ProcessNode(3111L,"a1111","1",false,true);ProcessSide s10 = new ProcessSide("1",a1111);a211.getAdjSide().add(s10);a111.getAdjSide().add(s10);System.out.println(Json.toJson(processTree));}

测试的结果,打印出这个流程如下:

{"begin_node": {"node_id": 1,"process_name": "开始","node_type": "1","process_start": true,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 2,"process_name": "a","node_type": "1","process_start": false,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 3,"process_name": "a1","node_type": "1","process_start": false,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 31,"process_name": "a11","node_type": "1","process_start": false,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 311,"process_name": "a111","node_type": "1","process_start": false,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 3111,"process_name": "a1111","node_type": "1","process_start": false,"process_finish": true,"process_status": "not begin","adj_side": []}}]}}]}}]}},{"relation_type": "1","to_node": {"node_id": 4,"process_name": "a2","node_type": "1","process_start": false,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 41,"process_name": "a21","node_type": "1","process_start": false,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 411,"process_name": "a211","node_type": "1","process_start": false,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 3111,"process_name": "a1111","node_type": "1","process_start": false,"process_finish": true,"process_status": "not begin","adj_side": []}}]}}]}}]}},{"relation_type": "1","to_node": {"node_id": 5,"process_name": "a3","node_type": "1","process_start": false,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 51,"process_name": "a31","node_type": "1","process_start": false,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 411,"process_name": "a211","node_type": "1","process_start": false,"process_finish": false,"process_status": "not begin","adj_side": [{"relation_type": "1","to_node": {"node_id": 3111,"process_name": "a1111","node_type": "1","process_start": false,"process_finish": true,"process_status": "not begin","adj_side": []}}]}}]}}]}}]}}]},"process_name": "demo","process_id": 1,"process_desc": "demodemodemo","project_id": 456,"biz_system_id": 123
}

证明结构是可用的。更完整的流程抽象,只需要在实施阶段想明白,实现完即可。

架构抽象之通用流程管理抽象相关推荐

  1. 大数据_Flink_数据处理_运行时架构2_作业提交流程_抽象架构---Flink工作笔记0017

    1.首先先去提交任务,这个提交任务可以是在网页端后台,也可以是在命令行提交任务. 在网页端后台提交就是flink的网页管理端对吧. 2.第1步任务将会被提交到分发器 3.第2步分发器会把任务转交给jo ...

  2. EASYUI+MVC4通用权限管理平台

    通用权限案例平台在经过几年的实际项目使用,并取得了不错的用户好评.在平台开发完成后,特抽空总结一下平台知识,请各位在以后的时间里,关注博客的更新. 1.EASYUI+MVC4通用权限管理平台--前言 ...

  3. 用MongoDB数据库来管理办公系统中文档型的表单和信息——通用流程化应用审批单设计思路(二,续)

    1.办公系统中文档的定义 办公系统中的文档就是指对数据不敏感的业务,例如流程中的审批单.信息专栏.数据上报.信息记录等.而对于这些信息的管理,特别是时效性较强的管理记录,仍采用关系型数据库进行管理. ...

  4. 文思海辉技术有限公司——流程管理架构平台应用

    一.项目简介 1.客户介绍 文思海辉技术有限公司的前身分别是文思信息技术有限公司和海辉软件(国际)集团公司,这两家公司都是软件外包服务提供商.之后宣布合并,合并的公司中文名称为"文思海辉技术 ...

  5. 工作流程管理软件的系统架构与功能

    流程管理系统从流程建模,到流程的部署,流程的自动化,流程的运行控制,以及流程的管理监控,形成完整的流程管理体系.它包括了运行服务中心(Service Center),表单设计器(Form Design ...

  6. 重复性管理——抽象的重要性(下)

    2019独角兽企业重金招聘Python工程师标准>>> 接着上一篇的谈论,继续谈论抽象在重复性管理中的重要作用. 好的抽象与糟糕的抽象? 通过前面的一些例子,你可能形成了一个印象:所 ...

  7. C#毕业设计——基于C#+asp.net+sqlserver的工作计划流程管理系统设计与实现(毕业论文+程序源码)——流程管理系统

    基于C#+asp.net+sqlserver的工作计划流程管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+sqlserver的工作计划流程管理系统设计与实现, ...

  8. 流程编排、如此简单-通用流程编排组件JDEasyFlow介绍

    作者:李玉亮 JDEasyFlow是企业金融研发部自研的通用流程编排技术组件,适用于服务编排.工作流.审批流等场景,该组件已开源(https://github.com/JDEasyFlow/jd-ea ...

  9. 【用户画像】用户画像简介、用户画像的架构、搭建用户画像管理平台

    文章目录 一 用户画像简介 1 用户画像 2 定位 2 应用 3 用户标签 (1)标签分级 (2)标签分类 二 用户画像的架构 1 画像处理流程 2 画像标签数据应用 3 用户画像管理平台 三 搭建用 ...

最新文章

  1. 鱼佬:我的数据挖掘之路!
  2. 利用定时器做防止误触发功能以及多久后执行某个事件
  3. C#通过Outlook发送邮件
  4. mysql服务器(二)
  5. 重要接口—NavigableSet接口
  6. 数据库原理与应用(SQL Server)笔记 第七章 流程控制语句、系统内置函数
  7. Java EE 8发生了什么?
  8. Java LocalDate类| parse()方法与示例
  9. 易优CMS精美简洁作文范文网站模板源码
  10. prestashop后台如何删除订单
  11. Java类与对象——几个课堂例子的总结及作业
  12. 【分形理论、分形维数、多重分形、Matlab程序等整理】
  13. 拉格朗日插值公式详解
  14. 微信小程序 实现购物车结算
  15. OpenLayers5在EPSG:4326投影坐标系下测量长度和面积
  16. 从超融合到混合云,深信服有了哪些新“畅想”?
  17. 第一章: HTML、CSS、JavaScript入门篇
  18. 趣图:程序员到底是一群什么样的人?
  19. 非数学类全国大学生数学竞赛总结
  20. kindle只显示电池加感叹号,该怎么办呢 !

热门文章

  1. 企业级实战大数据课程(五)-尹成-专题视频课程
  2. 函数指针与block
  3. 操作系统,计算机网络,数据库刷题笔记14
  4. Matlab图形(Figure)中使用差值光标提取数据
  5. ROS联合Webots实现3d建图(一)Ubuntu20.04 A_LOAM环境搭建(完美运行)
  6. 突发奇想 整个智能浇花系统给老妈 浇花用 分享每日过程和经历
  7. 高数复习系列(同济,b版)——快乐级数
  8. 硕士论文查重检测哪些部分?
  9. 【数据结构课设】数据压缩与解压缩(java实现 javafx实现GUI)
  10. 中国知网html阅读说明什么区别,万方数据库与中国知网的区别都有哪些