现代工作流(workflow)实例介绍(c#)
- 格式:ppt
- 大小:4.16 MB
- 文档页数:47
Jbpm4.0工作流的例子借款申请流程关键字: jbpm4 例子借款申请流程工作流正在学习jbpm4, 于是就写了个例子这个例子的流程就用借款申请的流程, 因为学jbpm3的时候对这个例子比较熟悉.流程图如下:流程定义:Xml代码1.<?xml version="1.0"encoding="UTF-8"?>2.<process name="loan"xmlns="/4.0/jpdl">3.<start g="172,-1,48,48"name="start1">4.<transition g="-27,-6"name="发起借款"to="填写借款申请"/>5.</start>6.7.<task assignee="#{proposer}"g="260,63,109,56"name="填写借款申请">8.<transition g="-28,-16"name="提交申请"to="部门经理审批"/>9.</task>10.11. <task assignee="manager"g="113,141,114,52"name="部门经理审批">12. <transition g="61,167:-36,62"name="部门经理驳回"to="cancel"/>13. <transition g="-51,-8"name="部门经理审批通过"to="金额判断"/>14. </task>15.16. <decision expr="#{money>=5000?'>=5000元':'<5000元'}"17. g="301,205,48,48"name="金额判断">18. <transition g="-20,-2"name=">=5000元"to="总经理审批"/>19. <transition g="-18,-13"name="<5000元"to="财务拨款"/>20. </decision>21.22. <end g="190,407,48,48"name="end"/>23. <end-cancel g="37,374,48,48"name="cancel"/>24.25. <task assignee="ceo"g="150,286,100,52"name="总经理审批">26. <transition g="-41,-6"name="总经理审批通过"to="财务拨款"/>27. <transition g="-17,-12"name="总经理驳回"to="cancel"/>28. </task>29.30. <task assignee="finance"g="345,325,92,52"name="财务拨款">31. <transition g="-26,-6"name="完成拨款"to="end"/>32. </task>33.</process>测试代码:Java代码1./**2. * CopyRight (C) 2006-2009 yeyong3. * @author yy4. * @project JbpmExamples5. * @version 1.06. * @mail yy629_86 at 163 dot com7. * @date 2009-9-9 下午3:12:138. * @description9. */10.package loan;11.12.import java.util.HashMap;13.import java.util.List;14.import java.util.Map;15.16.import org.jbpm.api.ProcessInstance;17.import org.jbpm.api.history.HistoryProcessInstance;18.import org.jbpm.api.task.Task;19.import org.jbpm.test.JbpmTestCase;20.21./**22. * @author yeyong23. */24.public class LoanTest extends JbpmTestCase {25. String deploymentId;26.27. @Override28. protected void setUp() throws Exception {29. super.setUp();30. deploymentId = repositoryService.createDeployment().addResourceFromClasspath("loan/loan.jpdl.xml")31. .deploy();32. }33.34. @Override35. protected void tearDown() throws Exception {36. repositoryService.deleteDeploymentCascade(deploymentId);37. super.tearDown();38. }39.40. /**41. * 测试用例42. * <p>43. * 张三申请4000元, 部门经理驳回44. */45. public void test4000ButManagerDisapprove() {46. String curUser = "Zhang San";47. ProcessInstance pi = startLoanProcess(curUser);48. String piId = pi.getId();49. filloutApplication(piId, curUser, 4000);50.51. curUser = "manager";52. managerApprove(piId, curUser, false, "最近资金紧张,暂不同意."); // 部门经理不同意53.54. pi = executionService.findProcessInstanceById(piId);55. assertNull(pi); // 流程结束56.57. HistoryProcessInstance hpi = getHistoryProcessInstanceByProcessInstanceId(piId);58. assertEquals(hpi.getState(), "cancel"); // 流程结束状态是cancel , 取消59. }60.61. /**62. * 测试用例63. * <p>64. * 李四申请4000元,部门经理同意65. */66. public void test4000AndManagerApprove() {67. String curUser = "Li si";68. ProcessInstance pi = startLoanProcess(curUser);69. String piId = pi.getId();70. filloutApplication(piId, curUser, 4000);71.72. curUser = "manager";73. managerApprove(piId, curUser, true, "同意."); // 部门经理同意74.75. pi = executionService.findProcessInstanceById(piId);76. assertNotNull(pi); // 流程未结束77. assertNotNull(pi.findActiveExecutionIn("财务拨款")); // 财务拨款处于活动状态78.79. curUser = "finance";80. earmark(piId, curUser, piId); // 拨款81.82. pi = executionService.findProcessInstanceById(piId);83. assertNull(pi); //流程结束84.85. HistoryProcessInstance hpi = getHistoryProcessInstanceByProcessInstanceId(piId);86. assertEquals(hpi.getState(), "ended"); // 流程结束状态是ended, 正常结束87. }88.89. /**90. * 测试用例91. * <p>92. * 王五申请6000元,部门经理驳回93. */94. public void test6000ButManagerDisapprove() {95. String curUser = "Wang Wu";96. ProcessInstance pi = startLoanProcess(curUser);97. String piId = pi.getId();98. filloutApplication(piId, curUser, 6000);99.100. curUser = "manager";101. managerApprove(piId, curUser, false, "最近资金紧张,暂不同意.");102.103. pi = executionService.findProcessInstanceById(piId);104. assertNull(pi);105.106. HistoryProcessInstance hpi = getHistoryProcessInstance ByProcessInstanceId(piId);107. assertEquals(hpi.getState(), "cancel");108. }109.110. /**111. * 测试用例112. * <p>113. * 赵六申请6000元,部门经理同意,总经理驳回114. */115. public void test6000AndManagerApproveButCeoDisapprove() {116. String curUser = "Zhao Liu";117. ProcessInstance pi = startLoanProcess(curUser); 118. String piId = pi.getId();119. filloutApplication(piId, curUser, 6000);120.121. curUser = "manager";122. managerApprove(piId, curUser, true, "同意. manager");123. pi = executionService.findProcessInstanceById(piId);124. assertNotNull(pi);125. assertNotNull(pi.findActiveExecutionIn("总经理审批"));126.127. curUser = "ceo";128. ceoApprove(piId, curUser, false, "不同意.等资金周转过来再说吧");129.130. pi = executionService.findProcessInstanceById(piId);131. assertNull(pi);132.133. HistoryProcessInstance hpi = getHistoryProcessInstance ByProcessInstanceId(piId);134. assertEquals(hpi.getState(), "cancel");135. }136.137. /**138. * 测试用例139. * <p>140. * 孙七申请6000元,部门经理同意,总经理也同意141. */142. public void test6000AndManagerApproveAdnCeoApprove() {143. String curUser = "Sun Qi";144. ProcessInstance pi = startLoanProcess(curUser); 145. String piId = pi.getId();146. filloutApplication(piId, curUser, 6000);147.148. curUser = "manager";149. managerApprove(piId, curUser, true, "同意. manager");150. pi = executionService.findProcessInstanceById(piId);151. assertNotNull(pi);152. assertNotNull(pi.findActiveExecutionIn("总经理审批"));153.154. curUser = "ceo";155. ceoApprove(piId, curUser, true, "同意. ceo");156. pi = executionService.findProcessInstanceById(piId);157.158. assertNotNull(pi);159. assertNotNull(pi.findActiveExecutionIn("财务拨款"));160.161. curUser = "finance";162. earmark(piId, curUser, piId);163. pi = executionService.findProcessInstanceById(piId);164. assertNull(pi);165.166. HistoryProcessInstance hpi =167. getHistoryProcessInstanceByProcessInsta nceId(piId);168. assertEquals(hpi.getState(), "ended");169. }170.171. /**172. * 用户发起借款申请173. *174. * @param userId175. * @return176. */177. protected ProcessInstance startLoanProcess(String user) {178. Map<String, Object> variables = new HashMap<String, Ob ject>();179. variables.put("proposer", user);180. return executionService.startProcessInstanceByKey("loa n", variables);181. }182.183. /**184. * 填写借款申请185. *186. * @param piId187. * @param user188. * @param money189. */190. protected void filloutApplication(String piId, String us er, double money) {191. List<Task> tasks = taskService.findPersonalTasks(user) ;192. Task filloutTask = null;193. for (Task task : tasks) {194. if (task.getExecutionId().equals(piId)) {195. filloutTask = task;196. break;197. }198. }199. assertNotNull(filloutTask);200. Map<String, Object> variables = new HashMap<String, Ob ject>();201. variables.put("money", money);202. executionService.setVariables(piId, variables); 203. pleteTask(filloutTask.getId()); 204. }205.206. /**207. * 经理审批208. *209. * @param piId210. * @param user211. * @param isPass212. * @param comment213. */214. protected void managerApprove(String piId, String user, boolean isPass, String comment) {215. List<Task> tasks = taskService.findPersonalTasks(user) ;216. Task approveTask = null;217. for (Task task : tasks) {218. if (task.getExecutionId().equals(piId)) {219. approveTask = task;220. break;221. }222. }223. assertNotNull(approveTask);224.225. taskService.addTaskComment(approveTask.getId(), commen t);226. pleteTask(approveTask.getId(), 227. isPass ? "部门经理审批通过" : "部门经理驳回");228.229. }230.231. /**232. * 总经理审批233. *234. * @param piId235. * @param user236. * @param isPass237. * @param comment238. */239. protected void ceoApprove(String piId, String user, bool ean isPass, String comment) {240. List<Task> tasks = taskService.findPersonalTasks(user) ;241. Task approveTask = null;242. for (Task task : tasks) {243. if (task.getExecutionId().equals(piId)) {244. approveTask = task;245. break;246. }247. }248. assertNotNull(approveTask);249.250. taskService.addTaskComment(approveTask.getId(), commen t);251. pleteTask(approveTask.getId(), 252. isPass ? "总经理审批通过" : "总经理驳回");253. }254.255. /**256. * 拨款257. *258. * @param piId259. * @param user260. * @param isPass261. * @param comment262. */263. /**264. * @param piId265. * @param user266. * @param comment267. */268. protected void earmark(String piId, String user, String comment) {269. List<Task> tasks = taskService.findPersonalTasks(user) ;270. Task earmarkask = null;271. for (Task task : tasks) {272. if (task.getExecutionId().equals(piId)) {273. earmarkask = task;274. break;275. }276. }277. assertNotNull(earmarkask);278.279. taskService.addTaskComment(earmarkask.getId(), comment );280.281.// HistoryProcessInstance hpi =282. getHistoryProcessInstanceByProcessInstanceId(piI d,"填写借款申请");283.284. String proposer =(String) executionService.getVariable (piId,"proposer");285. pleteTask(earmarkask.getId()); 286.287. // 通知借款申请人288. System.err.println(">> to " + proposer +", 财务科已经给你拨款.");289. }290.291. public HistoryProcessInstance292. getHistoryProcessInstanceByProcessInstanceId (String piId) {293. return historyService.createHistoryProcessInstanceQuer y().294. processInstanceId(piId).uniqueResult(); 295. }。
中国式的工作流场景配置案例一、场景背景。
这家工厂主要生产各种小电器,像电水壶、电吹风啥的。
订单来源有国内的经销商,也有一些国外的小订单。
整个工作流得保证订单从接收到产品发货的每个环节都不出差错,而且要高效,毕竟时间就是金钱嘛。
二、工作流环节配置。
1. 订单接收。
销售部门是订单的第一道关卡。
有个专门的销售助理小王,他就像个守门员。
每天早上一上班,他就打开邮箱,查看来自各个渠道的订单邮件。
那些邮件就像雪花一样,有时候多得让人眼花缭乱。
如果订单信息完整,小王就把订单信息录入到公司内部的订单管理系统里。
这个系统就像一个大账本,记录着每个订单的“身家性命”。
要是订单信息不全,小王就得赶紧给客户打电话或者发邮件,就像个催债的(当然是很礼貌的那种),询问清楚缺少的信息。
这时候小王心里肯定在想:“您可快点告诉我吧,后面还有一堆事儿等着呢。
”2. 订单审核。
3. 生产计划安排。
审核通过的订单会被推送到生产部门。
生产部门的张主管看到订单后,就开始头疼了。
为啥呢?因为他得像个拼图高手一样,把这个订单安排到生产计划里。
他得考虑现有的原材料库存、生产线的繁忙程度、工人的排班等各种因素。
如果原材料不够,他就得赶紧通知采购部门去采购。
这时候采购部门的小赵就像个救火队员,接到通知就得马上去找供应商。
要是生产线很忙,张主管可能就得调整订单的生产顺序,就像在堵车的时候调整行车路线一样。
4. 生产环节。
工人师傅们接到生产任务后就开始干活了。
每个工人就像一个小螺丝钉,虽然不起眼,但是缺了谁都不行。
生产线上的班组长就像个小队长,监督着工人的工作进度和质量。
如果发现有产品质量不合格,班组长就得像个严厉的老师一样,让工人重新做。
这期间,质量检测部门也会时不时地来抽检,就像个神秘的督察员,随时给生产环节来个“突然袭击”。
5. 包装与发货。
产品生产好后,就到了包装环节。
包装车间的工人们会把产品包装得漂漂亮亮的,就像给女儿出嫁打扮一样。
包装好的产品会被送到仓库,仓库管理员老钱会根据发货单安排发货。
工作流A c t i v i t介绍与应用标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]工作流Activiti介绍与应用工作流(workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。
我的理解就是:将部分或者全部的工作流程、逻辑让计算机帮你来处理,实现自动化。
1Activiti简介Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。
它实现了BPMN 规范,可以发布设计好的流程定义,并通过api进行流程调度。
1.1Activiti基础编程框架Activiti的基础编程框架如下:Activiti基于Spring,ibatis等开源中间件作为软件平台,在此之上构建了非常清晰的开发框架。
上图列出了Activiti的核心组件。
:流程引擎的抽象,对于开发者来说,它是我们使用Activiti的外观(faade),通过它可以获得我们需要的一切服务。
(TaskService,RuntimeService,RepositoryService...):Activiti按照流程的生命周期(定义,部署,运行)把不同阶段的服务封装在不同的Service中,用户可以非常清晰地使用特定阶段的接口。
通过ProcessEngine能够获得这些Service实例。
1.2Activiti重要服务类ProcessEngine:流程引擎的抽象,通过它我们可以获得我们需要的一切服务。
RepositoryService: Activiti中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据(例如 XML文件,表单定义文件,流程定义图像文件等),这些文件都存储在Activiti内建的Repository中。
⼯作流(Workflow)学习---基础知识整理⼯作流定义:⼯作流是将⼀组任务组织起来以完成某个经营:定义了任务的触发顺序和触发条件,每个任务可以由⼀个或多个完成,也可以由⼀个或⼀组⼈完成,还可以由⼀个或多个⼈与软件系统协作完成。
⼯作流2.0的定义是:实现⼯作过程管理的⾃动化、智能化和整合化。
⼯作流2.0最主要的特征就是可以灵便的实现数据整合和数据统计,消除信息孤岛,既能实现OA办公系统内部⼯作流之间的数据整合,如借款与报销、预算与决算等,⼜能实现OA办公系统⼯作流与其他业务系统之间的数据整合,如HR、ERP、CRM等。
⼯作流2.0能彻底的弥补⼯作流1.0的不⾜,它不但实现OA办公系统内部的数据整合,也实现OA办公系统和第三⽅应⽤系统之间的数据整合。
如果给⼯作流1.0打上标签的话,那就是“⽆纸化、重复⼯作、流程孤岛、系统孤岛、数据孤岛”;⼯作流2.0对应的便是“智能化、效率质量提升、外部数据整合、消除信息孤岛、内部数据整合”。
毫⽆疑问,⼯作流2.0更加智能,更加整合,能够实现数据的同步交换和共享的特征更受⽤户欢迎,能有效帮助企业简化多余流程,是未来⼯作流技术发展的⽅向。
适⽤⾏业消费品⾏业,,服务业,银证险等,物流服务业,物业服务业,物业管理,⼤中型进出⼝贸易公司,政府事业机构,研究院所及教育服务业等,特别是⼤的跨国企业和集团公司。
具体应⽤1.关键业务流程:订单、报价处理、采购处理、合同审核、客户电话处理、等。
2.⾏政管理类:出差申请、加班申请、请假申请、⽤车申请、各种办公⽤品申请、购买申请、⽇报周报等凡是原来⼿⼯流转处理的⾏政表单。
3.⼈事管理类:员⼯培训安排、绩效考评、职位变动处理、员⼯档案信息管理等。
4.财务相关类:付款请求、应收款处理、⽇常报销处理、出差报销、预算和计划申请等。
5.客户服务类:客户信息管理、客户投诉、请求处理、售后服务管理等。
6.特殊服务类:ISO系列对应流程、质量管理对应流程、产品数据信息管理、贸易公司报关处理、物流公司货物跟踪处理等各种通过逐步⼿⼯流转完成的任务均可应⽤⾃动规范地实施。
workflowcore的使用案例WorkflowCore是一个开源的工作流引擎,可以帮助开发人员实现复杂的业务流程。
它提供了一种声明式的方式来定义和执行工作流,使得工作流的设计和维护更加简单和高效。
下面是十个使用WorkflowCore的案例。
1. 审批流程管理:通过WorkflowCore,可以轻松地实现复杂的审批流程。
例如,一个请假申请流程可以包含多个节点,包括提交申请、上级审批、人事审批等。
WorkflowCore可以帮助管理和自动化整个流程,并提供实时的状态跟踪和通知功能。
2. 订单处理:WorkflowCore可以用于管理订单处理流程。
例如,一个电商平台的订单处理流程可以包括订单创建、库存检查、支付确认、物流安排等环节。
通过WorkflowCore,可以将这些环节组织起来,并自动触发下一步操作。
3. 任务调度:WorkflowCore可以用于实现任务调度系统。
例如,一个定时任务的调度系统可以使用WorkflowCore来管理任务的创建、调度和执行。
WorkflowCore提供了灵活的定时触发器和条件判断,可以满足各种调度需求。
4. 异步处理:WorkflowCore支持异步处理,可以帮助开发人员处理耗时的操作,如发送邮件、调用外部接口等。
通过将这些操作封装成工作流的一部分,可以实现更高效的异步处理,提高系统的性能和响应速度。
5. 并行处理:WorkflowCore支持并行处理,可以同时执行多个任务。
例如,在一个工作流中,可以同时处理多个子任务,而不是按顺序依次执行。
这样可以提高系统的并发性能,加快任务处理的速度。
6. 异常处理:WorkflowCore提供了强大的异常处理机制,可以捕获和处理工作流中的异常情况。
例如,当某个任务执行失败时,可以通过WorkflowCore自动触发异常处理逻辑,如发送告警通知、重试任务等。
7. 长时间运行的工作流:WorkflowCore支持长时间运行的工作流,可以处理需要跨多个时间段执行的任务。
Workflow简明教程注:我们将通过作一个workflow的实例来演示一个workflow工作流的建立。
首先建立new的项目在Workflows的file选择菜单中的选择向导选项,用向导作比较直观一些!选择后结果如下:上面两个栏位是新建立的项目的名称internal name 是程序需要的名字,display是显示的名字。
new process是项目中工作流过程的名称,同理,interal name是程序的名字,display name 是显示的名字需要注意的是,internal name是能用中文的,而且最好用大写,display name没有要求其余两个选项不作要求输入你需要的名字然后点ok,这时你的workflow整体框架就出来了,如图:左边是导航区,右边是工作区,跟form的风格和相似,注意右边他默认了两个图标,这是workflow流的两个端点,start和end 。
其中间的流过程是设计者来完成下面我将作一个关于审核工作票的工作流,其流程图如下第一步:我们要建立attribute ,即你在工作流中用到的所有的属性,这个例子中要用到4个属性,分别是send (审核人),view(修改人),gzpbg(工作票编号),p_url(打开的url地址)建立审核人,点右键,如图:建立新的attrib属性填写属性内容,注意如果是人员角色的属性,则要选择相对应的角色选项,如下填写完毕,确定,然后同理创建其余3个属性,这个时候属性创建完毕第二步!创建流程的节点,也就是关键点如图,我要创建一个审批的节点(p_check),还要创建一个审批不合格,需要重新审批的节点(p_ok)在导航区的notification上点右键,新增节点确立新的节点,同理,创建p_ok(复查节点)注意:1,message选项先不选择,因为稍后我们才创建message2, result type 是流程运行时当前节点的分支的类型,这个节点选择审批类型第三步,创建message,message是什么呢?通俗理解就是当流程走到这个节点上的时候,系统会自动根据这个节点上拥有的message发封邮件给你指定的人,通知她去接收信息,达到信息的流转。
OSWORKFLOW工作流描述介绍一、工作流的概念1. 步骤、状态和动作工作流要描述步骤(step)、步骤的状态(status)、各个步骤之间的关系以及执行各个步骤的条件和权限,每个步骤中可以含有一个或多个动作(action),动作将会使一个步骤的状态发生改变。
对于一个执行的工作流来讲,步骤的切换是不可避免的。
一个工作流在某一时刻会有一个或多个当前步骤,每个当前步骤都有一个状态值,当前步骤的状态值组成了工作流实例的状态值。
一旦完成了一个步骤,那么这个步骤将不再是当前步骤(而是切换到一个新的步骤),通常一个新的当前步骤将随之建立起来,以保证工作流继续执行。
完成了的步骤的最终状态值是用old-status属性指定的,这个状态值的设定将发生在切换到其他步骤之前。
old-status的值可以是任意的,但在一般情况下,我们设置为Finished。
切换本身是一个动作(action)的执行结果。
每个步骤可以含有多个动作,究竟要载入哪个动作是由最终用户、外部事件或者triggerd的自动调用决定的。
随着动作的完成,一个特定的步骤切换也将发生。
动作可以被限制在用户、用户组或当前状态。
每一个动作都必须包含一个unconditional result和0个或多个conditional results。
所以,总体来说,一个工作流由多个步骤组成。
每个步骤有一个当前状态(例如:Queued, Underway, or Finished),一个步骤包含多个动作。
每个步骤含有多个可以执行的动作。
每个动作都有执行的条件,也有要执行的函数。
动作包含有可以改变状态和当前工作流步骤的results。
2. Results, Joins, and Splits(1) Unconditional Result对于每一个动作来讲,必须存在一个Unconditional Result。
一个result是一系列指令,这些指令将告诉OSWorkFlow下一个任务要做什么。