1.pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.knife</groupId>
<artifactId>testspringbootflowable</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>testspringbootflowable</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<!--flowable工作流依赖-->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.3.0</version>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
</dependencies>
</project>
2.application.yml
################### 项目启动端口 ###################
server:
port: 8080
################### spring配置 ###################
spring:
profiles:
active: dev
##########################################################
################### 开发环境的profile ###################
##########################################################
datasource:
url: jdbc:mysql://127.0.0.1:3306/flowable-spring-boot
username: root
password: root
thymeleaf:
cache: false
3.SanController
package com.knife.testspringbootflowable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.engine.ProcessEngine;
import org.flowable.engine.ProcessEngineConfiguration;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.image.ProcessDiagramGenerator;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping(value = "san")
public class SanController {
@RequestMapping(value = "index")
public String index() {
return "index.html";
}
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private ProcessEngine processEngine;
/**
* 添加报销
* @param userId 用户Id
*
*/
@RequestMapping(value = "add")
@ResponseBody
public String addExpense(String userId,String bpmn) {
// 启动流程
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("taskUser", userId);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(bpmn, map);
return processInstance.getId();
}
/**
* 批准
*
* @param taskId 任务ID
*/
@RequestMapping(value = "/select")
@ResponseBody
public String apply(String userId,Integer option) {
List<Task> tasks = taskService.createTaskQuery().taskAssignee(userId).orderByTaskCreateTime().desc().list();
String result = "";
for (Task task : tasks) {
System.out.println(task.toString());
result= task.getId();
}
Task task = taskService.createTaskQuery().taskId(result).singleResult();
if (task == null) {
throw new RuntimeException("流程不存在");
}
// 通过审核
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("option",option);
taskService.complete(result, map);
return "processed ok!";
}
/**
* 生成流程图
*
* @param processId 任务ID
*/
@RequestMapping(value = "processDiagram")
public void genProcessDiagram(HttpServletResponse httpServletResponse, String processId) throws Exception {
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
// 流程走完的不显示图
if (pi == null) {
return;
}
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
// 使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象
String InstanceId = task.getProcessInstanceId();
List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(InstanceId).list();
// 得到正在执行的Activity的Id
List<String> activityIds = new ArrayList<String>();
List<String> flows = new ArrayList<String>();
for (Execution exe : executions) {
List<String> ids = runtimeService.getActiveActivityIds(exe.getId());
activityIds.addAll(ids);
}
// 获取流程图
BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId());
ProcessEngineConfiguration engconf = processEngine.getProcessEngineConfiguration();
ProcessDiagramGenerator diagramGenerator = engconf.getProcessDiagramGenerator();
InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows,
engconf.getActivityFontName(), engconf.getLabelFontName(), engconf.getAnnotationFontName(),
engconf.getClassLoader(), 1.0);
drawpng(httpServletResponse,in);
}
private void drawpng(HttpServletResponse httpServletResponse,InputStream in ) throws IOException {
OutputStream out = null;
byte[] buf = new byte[1024];
int legth = 0;
try {
out = httpServletResponse.getOutputStream();
while ((legth = in.read(buf)) != -1) {
out.write(buf, 0, legth);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
4.bpmn配置
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:flowable="http://flowable.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath"
targetNamespace="http://www.flowable.org/processdef">
<process id="mySanProcess" name="My San process"
isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask4"></sequenceFlow>
<userTask id="usertask4" name="是好好先生嗎" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow2" sourceRef="usertask4" targetRef="exclusivegateway1"></sequenceFlow>
<exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow3" sourceRef="exclusivegateway1" targetRef="usertask5">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow4" sourceRef="exclusivegateway1" targetRef="usertask6">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask5" name="曾欺騙他人嗎" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow6" sourceRef="usertask5" targetRef="exclusivegateway3"></sequenceFlow>
<exclusiveGateway id="exclusivegateway3" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow17" sourceRef="exclusivegateway3" targetRef="usertask14">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow28" sourceRef="exclusivegateway3" targetRef="usertask21">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask6" name="是八面玲瓏的人嗎" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow51" sourceRef="usertask6" targetRef="exclusivegateway13"></sequenceFlow>
<exclusiveGateway id="exclusivegateway13" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow52" sourceRef="exclusivegateway13" targetRef="usertask9">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow53" sourceRef="exclusivegateway13" targetRef="usertask24">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask9" name="講人情義利嗎" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow10" sourceRef="usertask9" targetRef="exclusivegateway4"></sequenceFlow>
<exclusiveGateway id="exclusivegateway4" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow11" sourceRef="exclusivegateway4" targetRef="usertask10">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow41" sourceRef="exclusivegateway4" targetRef="usertask22">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask10" name="依賴他人嗎" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow12" sourceRef="usertask10" targetRef="exclusivegateway5"></sequenceFlow>
<exclusiveGateway id="exclusivegateway5" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow13" sourceRef="exclusivegateway5" targetRef="usertask11">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow39" sourceRef="exclusivegateway5" targetRef="usertask23">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask11" name="有決斷力嗎" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow14" sourceRef="usertask11" targetRef="exclusivegateway6"></sequenceFlow>
<exclusiveGateway id="exclusivegateway6" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow15" sourceRef="exclusivegateway6" targetRef="usertask12">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow16" sourceRef="exclusivegateway6" targetRef="usertask13">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask15" name="對小事耿耿於懷" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow20" sourceRef="usertask15" targetRef="exclusivegateway8"></sequenceFlow>
<exclusiveGateway id="exclusivegateway8" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow21" sourceRef="exclusivegateway8" targetRef="usertask16">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow22" sourceRef="exclusivegateway8" targetRef="usertask17">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask18" name="打架從沒輸過" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow24" sourceRef="usertask18" targetRef="exclusivegateway9"></sequenceFlow>
<exclusiveGateway id="exclusivegateway9" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow25" sourceRef="exclusivegateway9" targetRef="usertask19">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow26" sourceRef="exclusivegateway9" targetRef="usertask20">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask14" name="想要的一定要得到" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow18" sourceRef="usertask14" targetRef="exclusivegateway7"></sequenceFlow>
<exclusiveGateway id="exclusivegateway7" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow19" sourceRef="exclusivegateway7" targetRef="usertask15">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow57" sourceRef="exclusivegateway7" targetRef="usertask23">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask21" name="喜歡存錢嗎" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow29" sourceRef="usertask21" targetRef="exclusivegateway10"></sequenceFlow>
<exclusiveGateway id="exclusivegateway10" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow30" sourceRef="exclusivegateway10" targetRef="usertask22">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow35" sourceRef="exclusivegateway10" targetRef="usertask9">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask23" name="容易興奮嗎" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow36" sourceRef="usertask23" targetRef="exclusivegateway12"></sequenceFlow>
<exclusiveGateway id="exclusivegateway12" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow37" sourceRef="exclusivegateway12" targetRef="usertask18">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow38" sourceRef="exclusivegateway12" targetRef="usertask15">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask22" name="有耐心嗎" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow31" sourceRef="usertask22" targetRef="exclusivegateway11"></sequenceFlow>
<exclusiveGateway id="exclusivegateway11" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow32" sourceRef="exclusivegateway11" targetRef="usertask23">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow40" sourceRef="exclusivegateway11" targetRef="usertask14">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask24" name="討厭麻煩" flowable:assignee="${taskUser}"></userTask>
<sequenceFlow id="flow54" sourceRef="usertask24" targetRef="exclusivegateway14"></sequenceFlow>
<exclusiveGateway id="exclusivegateway14" name="Exclusive Gateway" flowable:assignee="${taskUser}"></exclusiveGateway>
<sequenceFlow id="flow55" sourceRef="exclusivegateway14" targetRef="usertask9">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='0'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow56" sourceRef="exclusivegateway14" targetRef="usertask21">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${option=='1'}]]></conditionExpression>
</sequenceFlow>
<userTask id="usertask16" name="曹操" flowable:assignee="${taskUser}"></userTask>
<userTask id="usertask17" name="袁紹" flowable:assignee="${taskUser}"></userTask>
<userTask id="usertask19" name="孫權" flowable:assignee="${taskUser}"></userTask>
<userTask id="usertask20" name="馬騰" flowable:assignee="${taskUser}"></userTask>
<userTask id="usertask12" name="劉備" flowable:assignee="${taskUser}"></userTask>
<userTask id="usertask13" name="劉璋" flowable:assignee="${taskUser}"></userTask>
<endEvent id="endevent1" name="End"></endEvent>
<endEvent id="endevent2" name="End"></endEvent>
<sequenceFlow id="flow44" sourceRef="usertask16"
targetRef="endevent2"></sequenceFlow>
<endEvent id="endevent3" name="End"></endEvent>
<sequenceFlow id="flow45" sourceRef="usertask17"
targetRef="endevent3"></sequenceFlow>
<endEvent id="endevent4" name="End"></endEvent>
<sequenceFlow id="flow46" sourceRef="usertask17"
targetRef="endevent4"></sequenceFlow>
<endEvent id="endevent5" name="End"></endEvent>
<sequenceFlow id="flow47" sourceRef="usertask20"
targetRef="endevent5"></sequenceFlow>
<endEvent id="endevent6" name="End"></endEvent>
<sequenceFlow id="flow48" sourceRef="usertask19"
targetRef="endevent6"></sequenceFlow>
<endEvent id="endevent7" name="End"></endEvent>
<sequenceFlow id="flow49" sourceRef="usertask13"
targetRef="endevent7"></sequenceFlow>
<endEvent id="endevent8" name="End"></endEvent>
<sequenceFlow id="flow50" sourceRef="usertask12"
targetRef="endevent8"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
<bpmndi:BPMNPlane bpmnElement="myProcess"
id="BPMNPlane_myProcess">
<bpmndi:BPMNShape bpmnElement="startevent1"
id="BPMNShape_startevent1">
<omgdc:Bounds height="71.0" width="71.0" x="11.0"
y="190.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask4"
id="BPMNShape_usertask4">
<omgdc:Bounds height="55.0" width="105.0" x="100.0"
y="199.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway1"
id="BPMNShape_exclusivegateway1">
<omgdc:Bounds height="40.0" width="40.0" x="229.0"
y="205.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask5"
id="BPMNShape_usertask5">
<omgdc:Bounds height="55.0" width="105.0" x="197.0"
y="340.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask6"
id="BPMNShape_usertask6">
<omgdc:Bounds height="55.0" width="105.0" x="125.0"
y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway3"
id="BPMNShape_exclusivegateway3">
<omgdc:Bounds height="40.0" width="40.0" x="347.0"
y="348.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask9"
id="BPMNShape_usertask9">
<omgdc:Bounds height="55.0" width="105.0" x="380.0"
y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway4"
id="BPMNShape_exclusivegateway4">
<omgdc:Bounds height="40.0" width="40.0" x="518.0"
y="67.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask10"
id="BPMNShape_usertask10">
<omgdc:Bounds height="55.0" width="105.0" x="582.0"
y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway5"
id="BPMNShape_exclusivegateway5">
<omgdc:Bounds height="40.0" width="40.0" x="720.0"
y="67.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask11"
id="BPMNShape_usertask11">
<omgdc:Bounds height="55.0" width="105.0" x="790.0"
y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway6"
id="BPMNShape_exclusivegateway6">
<omgdc:Bounds height="40.0" width="40.0" x="920.0"
y="67.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask12"
id="BPMNShape_usertask12">
<omgdc:Bounds height="55.0" width="105.0" x="1013.0"
y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask13"
id="BPMNShape_usertask13">
<omgdc:Bounds height="55.0" width="105.0" x="1013.0"
y="136.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask14"
id="BPMNShape_usertask14">
<omgdc:Bounds height="55.0" width="105.0" x="486.0"
y="340.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway7"
id="BPMNShape_exclusivegateway7">
<omgdc:Bounds height="40.0" width="40.0" x="688.0"
y="348.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask15"
id="BPMNShape_usertask15">
<omgdc:Bounds height="55.0" width="105.0" x="790.0"
y="340.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway8"
id="BPMNShape_exclusivegateway8">
<omgdc:Bounds height="40.0" width="40.0" x="920.0"
y="347.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask16"
id="BPMNShape_usertask16">
<omgdc:Bounds height="55.0" width="105.0" x="1013.0"
y="387.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask17"
id="BPMNShape_usertask17">
<omgdc:Bounds height="55.0" width="105.0" x="1013.0"
y="320.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask18"
id="BPMNShape_usertask18">
<omgdc:Bounds height="55.0" width="105.0" x="819.0"
y="171.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway9"
id="BPMNShape_exclusivegateway9">
<omgdc:Bounds height="40.0" width="40.0" x="950.0"
y="218.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask19"
id="BPMNShape_usertask19">
<omgdc:Bounds height="55.0" width="105.0" x="1013.0"
y="198.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask20"
id="BPMNShape_usertask20">
<omgdc:Bounds height="55.0" width="105.0" x="1013.0"
y="260.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask21"
id="BPMNShape_usertask21">
<omgdc:Bounds height="55.0" width="105.0" x="453.0"
y="260.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway10"
id="BPMNShape_exclusivegateway10">
<omgdc:Bounds height="40.0" width="40.0" x="471.0"
y="178.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask22"
id="BPMNShape_usertask22">
<omgdc:Bounds height="55.0" width="105.0" x="558.0"
y="171.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway11"
id="BPMNShape_exclusivegateway11">
<omgdc:Bounds height="40.0" width="40.0" x="646.0"
y="273.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask23"
id="BPMNShape_usertask23">
<omgdc:Bounds height="55.0" width="105.0" x="686.0"
y="171.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway12"
id="BPMNShape_exclusivegateway12">
<omgdc:Bounds height="40.0" width="40.0" x="771.0"
y="273.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1"
id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="1163.0"
y="397.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent2"
id="BPMNShape_endevent2">
<omgdc:Bounds height="35.0" width="35.0" x="1163.0"
y="397.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent3"
id="BPMNShape_endevent3">
<omgdc:Bounds height="35.0" width="35.0" x="1163.0"
y="330.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent4"
id="BPMNShape_endevent4">
<omgdc:Bounds height="35.0" width="35.0" x="1163.0"
y="330.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent5"
id="BPMNShape_endevent5">
<omgdc:Bounds height="35.0" width="35.0" x="1163.0"
y="270.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent6"
id="BPMNShape_endevent6">
<omgdc:Bounds height="35.0" width="35.0" x="1163.0"
y="208.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent7"
id="BPMNShape_endevent7">
<omgdc:Bounds height="35.0" width="35.0" x="1163.0"
y="146.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent8"
id="BPMNShape_endevent8">
<omgdc:Bounds height="35.0" width="35.0" x="1163.0"
y="70.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway13"
id="BPMNShape_exclusivegateway13">
<omgdc:Bounds height="40.0" width="40.0" x="275.0"
y="68.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask24"
id="BPMNShape_usertask24">
<omgdc:Bounds height="55.0" width="105.0" x="284.0"
y="198.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway14"
id="BPMNShape_exclusivegateway14">
<omgdc:Bounds height="40.0" width="40.0" x="420.0"
y="206.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1"
id="BPMNEdge_flow1">
<omgdi:waypoint x="82.0" y="225.0"></omgdi:waypoint>
<omgdi:waypoint x="100.0" y="226.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2"
id="BPMNEdge_flow2">
<omgdi:waypoint x="205.0" y="226.0"></omgdi:waypoint>
<omgdi:waypoint x="229.0" y="225.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3"
id="BPMNEdge_flow3">
<omgdi:waypoint x="249.0" y="245.0"></omgdi:waypoint>
<omgdi:waypoint x="249.0" y="340.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4"
id="BPMNEdge_flow4">
<omgdi:waypoint x="249.0" y="205.0"></omgdi:waypoint>
<omgdi:waypoint x="177.0" y="115.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow6"
id="BPMNEdge_flow6">
<omgdi:waypoint x="302.0" y="367.0"></omgdi:waypoint>
<omgdi:waypoint x="347.0" y="368.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow10"
id="BPMNEdge_flow10">
<omgdi:waypoint x="485.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="518.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow11"
id="BPMNEdge_flow11">
<omgdi:waypoint x="558.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="582.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow12"
id="BPMNEdge_flow12">
<omgdi:waypoint x="687.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="720.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow13"
id="BPMNEdge_flow13">
<omgdi:waypoint x="760.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="790.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow14"
id="BPMNEdge_flow14">
<omgdi:waypoint x="895.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="920.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow15"
id="BPMNEdge_flow15">
<omgdi:waypoint x="960.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="1013.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow16"
id="BPMNEdge_flow16">
<omgdi:waypoint x="940.0" y="107.0"></omgdi:waypoint>
<omgdi:waypoint x="1065.0" y="136.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow17"
id="BPMNEdge_flow17">
<omgdi:waypoint x="387.0" y="368.0"></omgdi:waypoint>
<omgdi:waypoint x="486.0" y="367.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow18"
id="BPMNEdge_flow18">
<omgdi:waypoint x="591.0" y="367.0"></omgdi:waypoint>
<omgdi:waypoint x="688.0" y="368.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow19"
id="BPMNEdge_flow19">
<omgdi:waypoint x="728.0" y="368.0"></omgdi:waypoint>
<omgdi:waypoint x="790.0" y="367.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow20"
id="BPMNEdge_flow20">
<omgdi:waypoint x="895.0" y="367.0"></omgdi:waypoint>
<omgdi:waypoint x="920.0" y="367.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow21"
id="BPMNEdge_flow21">
<omgdi:waypoint x="960.0" y="367.0"></omgdi:waypoint>
<omgdi:waypoint x="1065.0" y="387.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow22"
id="BPMNEdge_flow22">
<omgdi:waypoint x="960.0" y="367.0"></omgdi:waypoint>
<omgdi:waypoint x="1013.0" y="347.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow24"
id="BPMNEdge_flow24">
<omgdi:waypoint x="924.0" y="198.0"></omgdi:waypoint>
<omgdi:waypoint x="970.0" y="218.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow25"
id="BPMNEdge_flow25">
<omgdi:waypoint x="990.0" y="238.0"></omgdi:waypoint>
<omgdi:waypoint x="1013.0" y="225.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow26"
id="BPMNEdge_flow26">
<omgdi:waypoint x="990.0" y="238.0"></omgdi:waypoint>
<omgdi:waypoint x="1065.0" y="260.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow28"
id="BPMNEdge_flow28">
<omgdi:waypoint x="367.0" y="348.0"></omgdi:waypoint>
<omgdi:waypoint x="505.0" y="315.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow29"
id="BPMNEdge_flow29">
<omgdi:waypoint x="505.0" y="260.0"></omgdi:waypoint>
<omgdi:waypoint x="491.0" y="218.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow30"
id="BPMNEdge_flow30">
<omgdi:waypoint x="511.0" y="198.0"></omgdi:waypoint>
<omgdi:waypoint x="558.0" y="198.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow31"
id="BPMNEdge_flow31">
<omgdi:waypoint x="610.0" y="226.0"></omgdi:waypoint>
<omgdi:waypoint x="666.0" y="273.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow32"
id="BPMNEdge_flow32">
<omgdi:waypoint x="666.0" y="273.0"></omgdi:waypoint>
<omgdi:waypoint x="738.0" y="226.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow35"
id="BPMNEdge_flow35">
<omgdi:waypoint x="491.0" y="178.0"></omgdi:waypoint>
<omgdi:waypoint x="432.0" y="115.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow36"
id="BPMNEdge_flow36">
<omgdi:waypoint x="738.0" y="226.0"></omgdi:waypoint>
<omgdi:waypoint x="791.0" y="273.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow37"
id="BPMNEdge_flow37">
<omgdi:waypoint x="791.0" y="273.0"></omgdi:waypoint>
<omgdi:waypoint x="871.0" y="226.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow38"
id="BPMNEdge_flow38">
<omgdi:waypoint x="791.0" y="313.0"></omgdi:waypoint>
<omgdi:waypoint x="761.0" y="367.0"></omgdi:waypoint>
<omgdi:waypoint x="790.0" y="367.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow39"
id="BPMNEdge_flow39">
<omgdi:waypoint x="740.0" y="107.0"></omgdi:waypoint>
<omgdi:waypoint x="738.0" y="171.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow40"
id="BPMNEdge_flow40">
<omgdi:waypoint x="666.0" y="313.0"></omgdi:waypoint>
<omgdi:waypoint x="538.0" y="340.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow41"
id="BPMNEdge_flow41">
<omgdi:waypoint x="538.0" y="107.0"></omgdi:waypoint>
<omgdi:waypoint x="610.0" y="171.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow44"
id="BPMNEdge_flow44">
<omgdi:waypoint x="1118.0" y="414.0"></omgdi:waypoint>
<omgdi:waypoint x="1163.0" y="414.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow45"
id="BPMNEdge_flow45">
<omgdi:waypoint x="1118.0" y="347.0"></omgdi:waypoint>
<omgdi:waypoint x="1163.0" y="347.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow46"
id="BPMNEdge_flow46">
<omgdi:waypoint x="1118.0" y="347.0"></omgdi:waypoint>
<omgdi:waypoint x="1163.0" y="347.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow47"
id="BPMNEdge_flow47">
<omgdi:waypoint x="1118.0" y="287.0"></omgdi:waypoint>
<omgdi:waypoint x="1163.0" y="287.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow48"
id="BPMNEdge_flow48">
<omgdi:waypoint x="1118.0" y="225.0"></omgdi:waypoint>
<omgdi:waypoint x="1163.0" y="225.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow49"
id="BPMNEdge_flow49">
<omgdi:waypoint x="1118.0" y="163.0"></omgdi:waypoint>
<omgdi:waypoint x="1163.0" y="163.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow50"
id="BPMNEdge_flow50">
<omgdi:waypoint x="1118.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="1163.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow51"
id="BPMNEdge_flow51">
<omgdi:waypoint x="230.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="275.0" y="88.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow52"
id="BPMNEdge_flow52">
<omgdi:waypoint x="315.0" y="88.0"></omgdi:waypoint>
<omgdi:waypoint x="380.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow53"
id="BPMNEdge_flow53">
<omgdi:waypoint x="295.0" y="108.0"></omgdi:waypoint>
<omgdi:waypoint x="336.0" y="198.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow54"
id="BPMNEdge_flow54">
<omgdi:waypoint x="389.0" y="225.0"></omgdi:waypoint>
<omgdi:waypoint x="420.0" y="226.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow55"
id="BPMNEdge_flow55">
<omgdi:waypoint x="440.0" y="206.0"></omgdi:waypoint>
<omgdi:waypoint x="432.0" y="115.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow56"
id="BPMNEdge_flow56">
<omgdi:waypoint x="440.0" y="246.0"></omgdi:waypoint>
<omgdi:waypoint x="440.0" y="287.0"></omgdi:waypoint>
<omgdi:waypoint x="453.0" y="287.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow57"
id="BPMNEdge_flow57">
<omgdi:waypoint x="708.0" y="348.0"></omgdi:waypoint>
<omgdi:waypoint x="738.0" y="226.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
5.前端页面
<div id="imgdiv">
<img src="http://localhost:8080/san/processDiagram?processId=60014" />
</div>
<div style="width:100%;text-align:center;margin-top:100px;">
id:<input id="userid" type="text" />
<button onclick="add()">begin</button>
</div>
<div style="width:100%;text-align:center;margin-top:50px;">
<button onclick="select(1)">yes</button>
<button onclick="select(0)">no</button>
</div>
<script src="../jquery.js">
</script>
<script>
var __id;
function add(){
$.ajax({
url:"../san/add",
data:{
userId:$("#userid").val(),
bpmn:"mySanProcess"
},
success:function(msg){
console.log(msg);
__id=msg;
change();
}
})
}
function select(option){
$.ajax({
url:"../san/select",
data:{
userId:$("#userid").val(),
option:option
},
success:function(msg){
console.log(msg);
//__id=msg;
change();
}
})
}
function change(){
$("#imgdiv").empty();
$("#imgdiv").append("<img src=\"http://localhost:8080/san/processDiagram?processId="+__id+"&random="+Math.random()+"\" />");
}
</script>
6.最终效果