基于Petri网的工作流分析和移植

一、前言

在实际应用场景,包括PEC的订单流程从下订单到订单派送一直到订单完成都是按照一系列预先规定好的工作流策略进行的。

通常情况下如果是采用面向过程的编程方法,我们采用的方式无非就是判断当前的工作流状态以及操作步骤来选择工作流分支继续下一步,如果整个工作流从起始到结束所执行的步骤不多的话,采用此方式相当简便,但如果步骤一多起来,或者分支太多以及需要判断的或者切换的状态太多的时候,很容易出错,或者说在原有的工作流分支上新增一个操作步骤,则改起代码来会非常繁琐且易出错。比如在WMS系统个人做的售后退货流程的状态切换代码。

参考了PEC的订单流程,采用的是基于活动的工作流机制,实际核心是基于Petri网理论。从系统的构架设计上做了多层体系分离,工作流系统和业务系统之间具有很好的松散性。从而达到工作流系统不需要知道业务系统,业务系统也不需要了解工作流。

二、Petri网介绍

摘录自百度百科的Petri网介绍。Petri网可以描述每一个节点拥有自己的独立时序,只要条件满足,就可以发生。Petri网旨在描述变迁之间的因果关系,并由此构造时序。经典的Petri网是简单的过程模型,由两种节点:库所和变迁,有向弧,以及令牌等元素组成的。

结构

Petri网的元素:

+ 库所(Place)圆形节点

+ 变迁(Transition)方形节点

+ 有向弧(Connection)是库所和变迁之间的有向弧

+ 令牌(Token)是库所中的动态对象,可以从一个库所移动到另一个库所。

规则

+ 有向弧是有方向的

+ 两个库所或变迁之间不允许有弧

+ 库所可以拥有任意数量的令牌

o 行为

如果一个变迁的每个输入库所(input place)都拥有令牌,该变迁即为被允许(enable)。一个变迁被允许时,变迁将发生(fire),输入库所(input place)的令牌被消耗,同时为输出库所(output place)产生令牌。

三、CI框架上的移植

从上述的举例,售后退款流程也可以采用基于Petri网的工作流模型,一方面可以使工作流系统和业务流系统分隔开,开发人员按照工作流策略设计数据表的库所和变迁以及有向弧,另一方面每个库所或者变迁都可以采用面向对象的方式继承相应的方法从而达到松耦合。

数据表结构主要有Arcs、Cases、Places、Tokens、Transitions、Workflows和WorkItems。

Arcs:用于描述库所和变迁之间的迁移;

CREATE TABLE `Arcs` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `placeId` int(10) unsigned NOT NULL COMMENT '库所id',

  `transitionId` int(10) unsigned NOT NULL COMMENT '变迁id',

  `isP2T` tinyint(3) unsigned NOT NULL COMMENT '是否库所到变迁:0否1是',

  `preCondition` varchar(20) NOT NULL COMMENT '变迁发射后,输出库所获得令牌的条件',

  PRIMARY KEY (`id`),

  KEY `placeId` (`placeId`),

  KEY `transitionId` (`transitionId`)

) ENGINE=MyISAM AUTO_INCREMENT=407 DEFAULT CHARSET=utf8 COMMENT='向弧' 

Cases:用于创建工作流实例;

CREATE TABLE `Cases` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `siteId` int(10) unsigned NOT NULL,

  `workflowId` int(10) unsigned NOT NULL COMMENT '工作流id',

  `caseStatus` varchar(10) NOT NULL COMMENT '状态',

  `startTime` int(10) unsigned NOT NULL,

  `endTime` int(10) unsigned NOT NULL,

  PRIMARY KEY (`id`),

  KEY `workflowId` (`workflowId`),

  KEY `siteId` (`siteId`)

) ENGINE=MyISAM AUTO_INCREMENT=66605 DEFAULT CHARSET=utf8 COMMENT='工作流实例'

Places:用于描述库所,主要有开始库所、中间库所以及结束库所;

CREATE TABLE `Places` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `workflowId` int(10) unsigned NOT NULL COMMENT '工作流id',

  `placeType` tinyint(3) unsigned NOT NULL COMMENT '库所类型:1 开始库所 5 中间库所 9 结束库所',

  `placeName` varchar(100) NOT NULL,

  PRIMARY KEY (`id`),

  KEY `workflowId` (`workflowId`)

) ENGINE=MyISAM AUTO_INCREMENT=64 DEFAULT CHARSET=utf8 COMMENT='库所'

Tokens:用于描述令牌,状态分别有自由、锁定、消耗以及取消,同时包含令牌出现时间、取消时间和消耗时间;

CREATE TABLE `Tokens` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `caseId` int(10) unsigned NOT NULL COMMENT '实例id',

  `placeId` int(10) unsigned NOT NULL,

  `tokenStatus` tinyint(3) unsigned NOT NULL COMMENT '状态:1 自由 2 锁定 3 消耗 4 取消',

  `enabledTime` int(10) unsigned NOT NULL COMMENT '令牌出现时间',

  `cancelledTime` int(10) unsigned NOT NULL COMMENT '令牌取消时间',

  `consumedTime` int(10) unsigned NOT NULL COMMENT '令牌消耗时间',

  PRIMARY KEY (`id`),

  UNIQUE KEY `casePlace` (`caseId`,`placeId`)

) ENGINE=MyISAM AUTO_INCREMENT=235153 DEFAULT CHARSET=utf8 COMMENT='令牌'

Transitions:用于描述变迁,变迁的触发方式有用户手动触发、系统自动触发、外部事件触发以及到期触发几种策略;

CREATE TABLE `Transitions` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `workflowId` int(10) unsigned NOT NULL COMMENT '工作流id',

  `transitionName` varchar(30) NOT NULL,

  `transitionDesc` varchar(60) NOT NULL,

  `transitionTrigger` tinyint(3) unsigned NOT NULL COMMENT '变迁如何被触发:1 用户手动触发 2 系统自动触发 3 外部事件触发 4 到期触发',

  `timeLimit` int(10) unsigned NOT NULL COMMENT '当transitionTrigger为4(到期触发)时有效,表示多少小时触发',

  `taskId` varchar(255) NOT NULL COMMENT '触发时哪个任务被激活',

  `identify` varchar(255) DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `workflowId` (`workflowId`)

) ENGINE=MyISAM AUTO_INCREMENT=97 DEFAULT CHARSET=utf8 COMMENT='变迁'

Workflows:用于描述工作流;

CREATE TABLE `Workflows` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `workflowName` varchar(100) NOT NULL,

  `startTaskId` varchar(60) NOT NULL,

  `workflowType` varchar(20) NOT NULL COMMENT '流程类型',

  `siteIds` varchar(255) NOT NULL COMMENT '使用此流程的站点id列表,逗号隔开,前后有逗号(default表示默认)',

  PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 COMMENT='工作流'

WorkItems:用于描述工作项。

CREATE TABLE `WorkItems` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `caseId` int(10) unsigned NOT NULL,

  `transitionId` int(10) unsigned NOT NULL,

  `transitionTrigger` tinyint(3) unsigned NOT NULL COMMENT '如何触发:1 用户触发 2 系统触发 3 外部事件触发 4 超过时间触发',

  `taskId` varchar(255) NOT NULL,

  `workItemStatus` tinyint(3) unsigned NOT NULL COMMENT '工作项状态:1 启用 2 处理中 3 取消 4 完成',

  `enabledTime` int(10) unsigned NOT NULL,

  `cancelledTime` int(10) unsigned NOT NULL,

  `finishedTime` int(10) unsigned NOT NULL,

  `deadline` int(10) unsigned NOT NULL,

  PRIMARY KEY (`id`),

  KEY `caseTranId` (`caseId`,`transitionId`)

) ENGINE=MyISAM AUTO_INCREMENT=626106 DEFAULT CHARSET=utf8 COMMENT='工作项'

基于Petri网的工作流引擎主要可使用的方法有启动工作流、取操作模板、执行指定ID的操作、取用户可执行的操作列表、取任务类、运行任务、取工作流权限列表、完成超时工作项、完成工作项等操作。库所和变迁类所需要继承的接口分别是获取操作模板以及启动任务方法。

四、下一步方向

1)              在基于Petri网的工作流模型中,有可能会出现用户误操作,需要回滚的,目前在PEC订单流程中偶尔会出现误操作,需要开发人员通过操作数据库来回滚数据,后续可以考虑工作流回滚方式。

2)              CI框架采用的都是基于model模型操作,而PEC是采用数据实体类操作的,是把数据库数据存取到指定数据实体类,再统一写入数据库,同时在在级联操作上也很方便,后续CI可以考虑新增数据实体类。

基于Petri网的工作流分析和移植的更多相关文章

  1. petri网初步

    历史:Petri网的概念是德国的Carl Adam Petri早在1962年提出来的.他在他的论文里提出了一个新的信息流模型,这个模型基于系统各部分的异步并发的操作,并把各部分之间的关系用网状的图来描 ...

  2. 《转》常用Petri网模拟软件工具简介

    本文转载自liusj2003,如给您带来不便之处,请联系博主. 首先要介绍的的一个非常有名的Petri 网网站--Petri Nets World: http://www.informatik.uni ...

  3. 常用Petri网模拟软件工具简介

    常用Petri网模拟软件工具简介 首先要介绍的的一个非常有名的Petri 网网站--Petri Nets World:       http://www.informatik.uni-hamburg. ...

  4. petri网学习心得

    本文转载自duxw,如给您带来不便之处,请联系博主. 1.Petri网书籍:<petri网导论>,吴哲辉 非常适合初学者.概念清晰,容易理解. 2.工作流书籍:<Workflow M ...

  5. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  6. 用于并发系统建模和验证的着色Petri网及其工具软件的CPN Tools(笔记整理)

    1.着色Petri网(CPNS)是一种建模和验证系统的语言,在这些熊中并发性,交互性和同步性扮演着主要的角色,着色Petri网是一种功能编程语言Standard ML结合起来的离散时间建模语言,Pet ...

  7. Linux之uboot分析与移植20160601

    说一下uboot分析与移植: 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2 ...

  8. Petri网

    Petri网是一种适合于系统描述和分析的数学模型,主要描述异步和并发关系.(或者Petri网是对离散并行系统的数学表示,适用于描述异步的,并发的计算机系统模型.) Petri网模型自然,直观,简单易懂 ...

  9. 基于GPU加速的三维空间分析【转】

    基于GPU加速的三维空间分析 标签:supermap地理信息系统gisit 文:李凯 随着三维GIS 的快速发展和应用普及,三维空间分析技术以其应用中的实用性成为当前GIS技术研究的热点领域.面对日益 ...

随机推荐

  1. bootstrap快速入门笔记(九)-响应式工具

    一,可用的类   超小屏幕手机 (<768px) 小屏幕平板 (≥768px) 中等屏幕桌面 (≥992px) 大屏幕桌面 (≥1200px) .visible-xs-* 可见 隐藏 隐藏 隐藏 ...

  2. 详解Java反射机制

    反射是程序在运行状态下,动态的获取某个类的内部信息的一种操作.例如:类名,包名,所有属性的集合,所有方法的集合,构造方法的集合等.该操作发生在程序的运行时状态,所以编译器管不着有关反射的一些代码,通常 ...

  3. 1005 Number Sequence

    Problem Description A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) ...

  4. 再议Unity优化

    0x00 前言 在很长一段时间里,Unity项目的开发者的优化指南上基本都会有一条关于使用GetCompnent方法获取组件的条目(例如14年我的这篇博客<深入浅出聊Unity3D项目优化:从D ...

  5. 一个大数据平台省了20个IT人力——敦奴数据平台建设案例分享

    认识敦奴 敦奴集团创立于1987年,主营服装.酒店.地产,总部位于中国皮都-海宁.浙江敦奴联合实业股份有限公司(以下简称"敦奴")是一家集开发.设计.生产.销售于一体的大型专业服装 ...

  6. scala 异常处理机制

    有经验的码农都知道,程序开发的差不多的时候,为了提高程序的稳健性,是一定要加上异常处理机制的 在scala中,用try/catch/finally实现该功能,这个在我的博客,数字转汉字小工具中有体现, ...

  7. django无法加载admin的静态内容的问题(Centos7+Nginx+uwsgi环境下)

    Nginx静态资源无法加载,导致admin没有CSS样式: 这个问题,主要是要理解: 1.Django不会去解析静态内容(css,js,img)等,而是交给Nginx去处理,所以nginx.conf要 ...

  8. 用ng-view创建单页APP

    我们假设我们有一个单页面的程序,并且想为这个页面添加动画效果.点击某一个链接会将一个试图滑出,同时将另一个试图滑入. 我们将会使用: 使用 ngRoute 来为我们的页面路由 使用 ngAnimate ...

  9. 酷睿彩票合买代购网站管理系统 v2016 - 源码下载 有合买功能 有免费版 标准版 高级版

    源码介绍 免费版下载地址 电信 浙江腾佑 网鼎科技 正易网络下载 联通 网鼎联通   标准版联系QQ:1395239152 彩票合买代购网站管理系统公司独立开发,完全拥有软件自主知识产权.具有电脑We ...

  10. Linux的环境变量设置和查看

    一.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.永久的:需要修改配置文件,变量永久生效. 2.临时的:使用export命令声明即可,变量在关闭shell时失效. 二. ...