通用流程管理要做些什么

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

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

基础的结构

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

  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. 面试 排序 java_面试 12:玩转 Java 快速排序
  3. linux命令-- 抓包
  4. VMware Workstation All Key
  5. thymealf 高级用法_Thymeleaf
  6. 一个超赞又好用的PHP技巧!如何生成PHP扩展的类手册
  7. Git的安装以及常用的命令总结
  8. 理解NLP中的卷积神经网络(CNN)
  9. .ashx文件与.ashx.cs
  10. Dubbo集成Spring与Zookeeper实例
  11. 收藏夹吃灰系列(五):解决Win10插入U盘不显示磁盘可用容量且打不开卡死问题 | 超级详细,建议收藏
  12. java google 离线地图开发_如何发布google离线地图及二次开发API
  13. matlab案例 光学,利用Matlab 仿真光学实验
  14. 汇编(三):DEBUG
  15. 网站加速的几种常用方法
  16. (二)机器学习实践Python3-决策树ID3的一个简单案例
  17. 大数(10^9)求欧拉数
  18. 2.1.7设置字体大小
  19. 用计算机打字打错了怎么办,电脑键盘打字错乱,怎么快速解决?
  20. 远程传输文件命令:scp、rsync

热门文章

  1. matlab生成指定大小的figure,matlab 为图像添加jet伪彩色,并添加color bar;保存figure图片; 对图像进行高斯模糊;
  2. java中onclick的用法,使用jQuery修改onclick函数
  3. 电脑正常开机运行黑屏但是有鼠标
  4. 初学者之《复刻英雄联盟官网之人脸识别登录》①
  5. 计算机知识竞赛开场白,知识竞赛开场白
  6. Python 第三方模块 统计1 statsmodels模块2 时间序列
  7. 他闷了几时了 操盘手软件
  8. 在Blender中使用代码控制人物模型的头部姿态 - 代码实践mediapipe版本
  9. 闭环步进电机 两款闭环步进电机设计资料
  10. 境外服务器可以做新闻网站吗,租用境外服务器对网站SEO有影响么?影响在哪里?...