业务描述:
1. 公司采购,因为办公用品价格高低的问题,需要分级审批,各级的审批资金的高低不一样,高于 500 块钱需要总经理审批!
1. 申请流程:
1. 申请人起草填写申请单(申请办公用品【数据库自带价格】、申请理由、使用人),保存后可立即提交申请;
1. 申请人提交审批,发起流程;
1. 部门经理审批;
1. 流程自动处理,采购金额buyCost大于 500的,自动转到总经理审批,否则直接转到人事部审批;
1. 如果总经理审批或者人事部审批通过,则自动转到财务部归档,否则被打回到申请人处理;
1. 财务归档处理后,流程转到采购部处理,采购部可以根据办公用品是否需要采购进行控制,选择采购办公用品或者人事部发放办公用品,流程转到此两者之一。
1. 如果申请单被打回到申请人,申请人可以再次修改后重新提交审批,也可以选择放弃、到此流程结束。
1. 如果流程走到采购办公用品,那么,采购部人员可以控制此流程,如果办公用品采购回来了,那么流程转到人事部发放办公用品。
1. 当人事部发放办公用品 人事部处理完过后,流程转到领取办公用品,申请人到人事部去领取办公用品,流程到此结束。

    // 使用代码创建工作流需要的23张表
@Before
public void createTable() {
// 工作流引擎的全部配置
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration
.createStandaloneProcessEngineConfiguration()
.setJdbcUrl("jdbc:jtds:sqlserver://localhost:1433/msgBoard2")
.setJdbcUsername("sa")
.setJdbcPassword("1234")
.setJdbcDriver("net.sourceforge.jtds.jdbc.Driver")
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); // 工作流的核心对象,ProcessEnginee对象
processEngine = processEngineConfiguration.buildProcessEngine();
System.out.println("-----------工作流引擎开启----------");
} /**
* 部署流程定义
*/
@Test
public void deploymentProcessDefinition() {
//创建核心引擎对象
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.name("flowable入门程序2")
.addClasspathResource("myProcess-test.bpmn20.xml")
.deploy();
System.out.println("##########添加部署##########");
System.out.println("部署ID:" + deployment.getId());
System.out.println("部署名称:" + deployment.getName());
findProcessDefinition();
} /**
* 启动流程实例
* 使用key值启动
*/
@Test
public void startProcessInstance2() {
// 流程定义的key
String processDefinitionKey = "myProcess-test";
ProcessInstance pi = processEngine.getRuntimeService()// 于正在执行的流程实例和执行对象相关的Service
.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应hellworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
System.out.println("流程实例ID:" + pi.getId());// 流程实例ID 101
System.out.println("流程定义ID:" + pi.getProcessDefinitionId()); // 流程定义ID HelloWorld:1:4
} /**
* 启动流程实例
* 使用id值启动
*/
@Test
public void startProcessInstance() {
RuntimeService runtimeService = processEngine.getRuntimeService();//表示正在执行的流程实例和执行对象 ProcurementVO procurementVO = new ProcurementVO();
procurementVO.setEmployee("sky");
procurementVO.setReason("测试用例。。。。。。。。");
List<Articles> articlesList = new ArrayList<Articles>();
Articles articles1 = new Articles("文具", 80, 1);
Articles articles2 = new Articles("电脑", 500, 1);
articlesList.add(articles1);
articlesList.add(articles2);
procurementVO.setArticlesList(articlesList);
double buyCost = 0;
for (Articles articles : articlesList) {
buyCost += (articles.getAmount() * articles.getPrice());
}
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("procurement", procurementVO);
variables.put("buyCost", buyCost); String processDefinitionId = "myProcess-test:1:105003";
ProcessInstance processInstance =
runtimeService.startProcessInstanceById(processDefinitionId, variables);
System.out.println("##########流程开启##########");
System.out.println("流程实例ID:" + processInstance.getId());
System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());
findTask();
} /**
* 查询所有的流程定义
*/
@Test
public void findProcessDefinition() {
List<ProcessDefinition> list = processEngine.getRepositoryService()// 与流程定义和部署对象先相关的service
.createProcessDefinitionQuery()// 创建一个流程定义的查询
/** 指定查询条件,where条件 */
// .deploymentId(deploymentId) //使用部署对象ID查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processDefinitionNameLike(processDefinitionNameLike)//使用流程定义的名称模糊查询 /* 排序 */
.orderByProcessDefinitionVersion().asc()
// .orderByProcessDefinitionVersion().desc() /* 返回的结果集 */
.list();// 返回一个集合列表,封装流程定义
// .singleResult();//返回惟一结果集
// .count();//返回结果集数量
// .listPage(firstResult, maxResults);//分页查询 if (list != null && list.size() > 0) {
for (ProcessDefinition pd : list) {
System.out.println("流程定义ID:" + pd.getId());// 流程定义的key+版本+随机生成数
System.out.println("流程定义的名称:" + pd.getName());// 对应helloworld.bpmn文件中的name属性值
System.out.println("流程定义的key:" + pd.getKey());// 对应helloworld.bpmn文件中的id属性值
System.out.println("流程定义的版本:" + pd.getVersion());// 当流程定义的key值相同的相同下,版本升级,默认1
System.out.println("资源名称bpmn文件:" + pd.getResourceName());
System.out.println("资源名称png文件:" + pd.getDiagramResourceName());
System.out.println("部署对象ID:" + pd.getDeploymentId());
System.out.println("是否暂停:" + pd.isSuspended());
System.out.println("#########################################################");
}
} else {
System.out.println("没有流程正在运行。");
}
} /**
* 获取任务
*/
@Test
public void getTask() {
// 与任务相关的service,正在执行的service
TaskService taskService = processEngine.getTaskService();
// 任务ID
String taskId = "85005"; Task task = taskService.newTask(taskId);
System.out.println(task.getId() + " " +
task.getAssignee() + " " +
task.getName() + " " +
task.getProcessInstanceId());
System.out.println("################################");
} /**
* 设置流程变量
*/
@Test
public void setVariables() {
// 与任务相关的service,正在执行的service
TaskService taskService = processEngine.getTaskService(); // 任务ID
String taskId = "107508"; Map<String, Object> variables = new HashMap<String, Object>();
// variables.put("approve", false);
variables.put("endOut", true);
// taskService.removeVariable(taskId, "buyCost");
taskService.complete(taskId, variables); System.out.println("设置流程变量成功!");
findTask();
} /**
* 删除流程定义(删除key相同的所有不同版本的流程定义)
*/
@Test
public void delteProcessDefinitionByKey() {
// 流程定义的Key
String processDefinitionKey = "myProcess-test";
// 先使用流程定义的key查询流程定义,查询出所有的版本
List<ProcessDefinition> list = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.processDefinitionKey(processDefinitionKey)// 使用流程定义的key查询
.list();
// 遍历,获取每个流程定义的部署ID
if (list != null && list.size() > 0) {
for (ProcessDefinition pd : list) {
// 获取部署ID
String deploymentId = pd.getDeploymentId();
// /*
// * 不带级联的删除, 只能删除没有启动的流程,如果流程启动,就会抛出异常
// */
// processEngine.getRepositoryService().deleteDeployment(deploymentId); /**
* 级联删除 不管流程是否启动,都可以删除
*/
System.out.println("删除部署:" + deploymentId);
processEngine.getRepositoryService().deleteDeployment(
deploymentId, true); } }
} /**
* 查询流程状态(判断流程正在执行,还是结束)
*/
@Test
public void isProcessEnd() {
String processInstanceId = "25001";
ProcessInstance pi = processEngine.getRuntimeService()//表示正在执行的流程实例和执行对象
.createProcessInstanceQuery()//创建流程实例查询
.processInstanceId(processInstanceId)//使用流程实例ID查询
.singleResult(); if (pi == null) {
System.out.println("流程已经结束");
} else {
System.out.println("流程没有结束");
}
} /**
* 查询任务
* --通过流程实例id
*/
@Test
public void findTask() {
// String processInstanceId = "42501";
List<HistoricTaskInstance> list = processEngine.getHistoryService()//与历史数据(历史表)相关的service
.createHistoricTaskInstanceQuery()//创建历史任务实例查询
// .processInstanceId(processInstanceId)
.orderByHistoricActivityInstanceId().asc()
.list(); if (list != null && list.size() > 0) {
for (HistoricTaskInstance hti : list) {
System.out.println(hti.getId() + " " +
hti.getAssignee() + " " +
hti.getName() + " " +
hti.getProcessInstanceId() + " " +
hti.getStartTime() + " " +
hti.getEndTime() + " " +
hti.getDurationInMillis());
System.out.println("################################");
}
}
} /**
* 查询当前人的个人任务
*/
@Test
public void findMyPersonTask() {
String assignee = "sky";
List<Task> list = processEngine.getTaskService()// 与正在执行的认为管理相关的Service
.createTaskQuery()// 创建任务查询对象
.taskAssignee(assignee)// 指定个人认为查询,指定办理人
.list(); if (list != null && list.size() > 0) {
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务名称:" + task.getName());
System.out.println("任务的创建时间" + task);
System.out.println("任务的办理人:" + task.getAssignee());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("执行对象ID:" + task.getExecutionId());
System.out.println("流程定义ID:" + task.getProcessDefinitionId());
System.out.println("#################################");
}
}
} /**
* 得到实际的 组任务列表
*/
@Test
public void findGroupTaskList() {
String groupName1 = "procurementOfManager";
String groupName2 = "procurementOfPersonnel"; TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup(groupName1).list();
System.out.println(groupName1 + " have " + tasks.size() + " tasks:");
for (int i = 0; i < tasks.size(); i++) {
System.out.println((i + 1) + ") " + tasks.get(i).getName());
}
System.out.println("#################################################");
TaskService taskService2 = processEngine.getTaskService();
List<Task> tasks2 = taskService.createTaskQuery().taskCandidateGroup(groupName2).list();
System.out.println(groupName2 + " have " + tasks2.size() + " tasks:");
for (int i = 0; i < tasks2.size(); i++) {
System.out.println((i + 1) + ") " + tasks2.get(i).getName());
}
}

  

公司采购 流程flowable例子的更多相关文章

  1. 刚刚结束了公司EP流程,开始KMS项目开发了

    刚刚结束了公司EP流程,开始KMS项目开发了 EP流程:AGpoint+MOSS+C# KMS:MOSS上的文档管理系统

  2. PO_标准采购流程请购采购接受入库(流程)

    2014-06-03 Created By BaoXinjian

  3. flowable 6.1.2 命令行完成请假审批流程的例子

    一.创建 eclipse maven新项目 1.设置项目选项 其中,Create a simple project 要选中. 2.填写项目包名和项目名称 这里的Group id:必须是 org.flo ...

  4. activitie5 流程入门例子

    流程这个东西在ERP项目用得比较多.在网上找到一个例子,与大家分享一下.http://yiyiboy2010.iteye.com/blog/1530924 感谢原博主提供 http://blog.ch ...

  5. 公司上线流程 pushonline_alpha

     这是在公司将服务部署上线的一个记录,只是部署很小的python脚本,各公司不同,参考性不是很大 开始吧(版本管理是git) 1.整理好代码后:git add xxx.py git commit -m ...

  6. Robot Framework--用例、数据、流程分离例子

    如果想改变输入框的输入词,则需要不停的复制case,为了减少冗余,可以做一个简单的分层,把搜索流程剥离成一个关键字,然后再不同的case中调用这个关键字,然后传递不同的参数,以进行不同数据在同一流程下 ...

  7. git管理分支某公司的流程

  8. C#设计模式学习笔记:(20)职责链模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第八个模式--职 ...

  9. C#设计模式-责任链模式

    在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所以在面试的 ...

随机推荐

  1. sqlmap 实战漏洞平台dvwa进行密码破解

    2016-05-24 (1)实验的具体的环境极其思路 首先我们要检测我们的漏洞平台是否有sql注入 ,进行简单的测试发现在用户userid 上存在注入的漏洞 使用抓包工具对其cookie 进行获取如下 ...

  2. 越努力越幸运--3-日常bug修复

    提供一个so给PYTHON调用,后端发现业务处理流程不是按照方法传入的参数来跑. 查看c的代码,看了客户端没看出什么问题,查看服务端为什么会出现这样的情况,有些字段明显不是入参带过来的,跟踪服务端解析 ...

  3. 紫书 例题11-11 UVa 12661 (dihkstra变形)

    这道题主要比较权值的时候要改变一下,其他地方基本一样. 比较权值的时候要考虑边的时间与a, b 可以设相对于当前边的时间now, 则now = d[u] % (a+b), 也就是当前这个边进行到整个a ...

  4. 【codeforces 553C】Love Triangles

    [题目链接]:http://codeforces.com/problemset/problem/553/C [题意] 给你n个点,m条边; 每种边有2两种类型; 让你补充剩下的边,构造一个完全图; 使 ...

  5. MarkDown写作之嵌入LaTeX和HTML

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49788741 Markdown 是一种 ...

  6. HDU——T 1507 Uncle Tom's Inherited Land*

    http://acm.hdu.edu.cn/showproblem.php?pid=1507 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  7. CI框架源代码阅读笔记2 一切的入口 index.php

    上一节(CI框架源代码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程.这里再次贴出流程图.以备參考: 作为CI框架的入口文件.源代码阅读,自然由此開始. 在源代码阅读的 ...

  8. 理解Swift中map 和 flatMap对集合的作用

    map和flatMap是函数式编程中常见的概念,python等语言中都有.借助于 map和flapMap 函数可以非常轻易地将数组转换成另外一个新数组. map函数可以被数组调用,它接受一个闭包作为參 ...

  9. HDU 1542 Atlantis(矩形面积并)

    HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...

  10. cpc,tank

    先保存一段错误的代码 #include<iostream> #include<cstdio> #include<cstring> #include<algor ...