Переглянути джерело

git-svn-id: https://192.168.57.71/svn/jsgkj@1780 931142cf-59ea-a443-aa0e-51397b428577

ld_zhouk 8 роки тому
батько
коміт
b18611e770

+ 5 - 0
gkaqv2/trunk/modules/web/pom.xml

@@ -152,6 +152,11 @@
 			<artifactId>poi</artifactId>
 		</dependency>
 		<dependency>
+		    <groupId>com.fasterxml.uuid</groupId>
+		    <artifactId>java-uuid-generator</artifactId>
+		    <version>3.1.3</version>
+		</dependency>
+		<dependency>
 		  <groupId>commons-fileupload</groupId>
 		  <artifactId>commons-fileupload</artifactId>
 		  <version>1.2.2</version>

+ 92 - 0
gkaqv2/trunk/modules/web/src/main/java/com/xt/js/gkaq/web/ctl/frame/WfdemoCtl.java

@@ -0,0 +1,92 @@
+package com.xt.js.gkaq.web.ctl.frame;
+
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.xt.js.gkaq.common.BaseCtl;
+import com.xt.js.gkaq.common.log.annotation.SysLog;
+import com.xt.js.gkaq.frame.model.TaskModel;
+import com.xt.js.gkaq.frame.model.UserModel;
+import com.xt.js.gkaq.frame.service.TaskModelService;
+import com.xt.js.gkaq.frame.wf.WorkFlowParam;
+import com.xt.js.gkaq.frame.wf.WorkflowMangerService;
+import com.xt.js.gkaq.web.vo.TaskVo;
+import com.yuanxd.tools.pagehelper.PageHelper;
+import com.yuanxd.tools.pagehelper.PageInfo;
+import com.yuanxd.tools.utils.WebJsonResult;
+
+/**
+ * 工作流DEMO管理控制
+ */
+@Controller
+@RequestMapping(value = "/wfdemo", produces = "application/json; charset=utf-8")
+public class WfdemoCtl extends BaseCtl {
+    @Autowired
+    private TaskModelService taskModelService;
+
+    @Autowired
+    private WorkflowMangerService wfMangerService;
+
+    /**
+     * 进入首页
+     * 
+     * @param model
+     * @return
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+        return "frame/wfdemo";
+    }
+
+    /**
+     * 初始化页面加载数据
+     * 
+     * @param vo
+     * @return
+     * @throws UnsupportedEncodingException
+     */
+    @RequestMapping("list")
+    @ResponseBody
+    @SysLog(description="工作流列表查询")
+    public PageInfo<TaskModel> getPageInfo(TaskVo vo) {
+        // 初始化工作流
+        PageHelper.startPage(vo.getcPage(), vo.getpSize());
+
+        TaskModel model = new TaskModel();
+        model.setTaskKey(vo.getTaskKey());
+        // 开始时间
+        model.setCreateTime(vo.getBeginTime());
+        // 结束时间
+        model.setUpdateTime(vo.getEndTime());
+        List<TaskModel> list = taskModelService.findAllByCond(model);
+        PageInfo<TaskModel> pageResult = new PageInfo<>(list);
+        return pageResult;
+    }
+
+    @RequestMapping("create")
+    @ResponseBody
+    @SysLog(description="发起流程")
+    public WebJsonResult create() {
+
+        Subject subject = SecurityUtils.getSubject();
+        UserModel user = (UserModel) subject.getPrincipal();
+        WorkFlowParam param = new WorkFlowParam();
+        param.put(WorkFlowParam.BUSINESS_KEY, "B0001");
+        param.put(WorkFlowParam.AUDIT_USER, user.getLoginName());
+        param.put(WorkFlowParam.DESCRIPTION, "发起作业附证流程");
+        Map<String, Object> variables = new HashMap<String, Object>();
+        String processDefinitionKey = "zyfzWorkflow";
+        wfMangerService.create(param, variables, processDefinitionKey);
+        return success();
+    }
+}

+ 222 - 0
gkaqv2/trunk/modules/web/src/main/java/com/xt/js/gkaq/web/vo/TaskVo.java

@@ -0,0 +1,222 @@
+package com.xt.js.gkaq.web.vo;
+
+import java.util.Date;
+
+import org.springframework.format.annotation.DateTimeFormat;
+
+import com.xt.js.gkaq.common.BaseVo;
+
+public class TaskVo extends BaseVo {
+    private String taskId;
+
+    private String busId;
+
+    private String step;
+
+    private Date startTime;
+
+    private String startUser;
+
+    private String currName;
+
+    private String runner;
+
+    private Date runTime;
+
+    private Date auditTime;
+
+    private String auditMsg;
+
+    private String auditResult;
+
+    private String qylb;
+
+    private Short ssqy;
+
+    private String busKey;
+
+    private String auditUser;
+
+    private String taskKey;
+
+    private String roleCode;
+
+    private String auditUsername;
+
+    private Short szd;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date beginTime;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    public String getBusId() {
+        return busId;
+    }
+
+    public void setBusId(String busId) {
+        this.busId = busId;
+    }
+
+    public String getStep() {
+        return step;
+    }
+
+    public void setStep(String step) {
+        this.step = step;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getStartUser() {
+        return startUser;
+    }
+
+    public void setStartUser(String startUser) {
+        this.startUser = startUser;
+    }
+
+    public String getCurrName() {
+        return currName;
+    }
+
+    public void setCurrName(String currName) {
+        this.currName = currName;
+    }
+
+    public String getRunner() {
+        return runner;
+    }
+
+    public void setRunner(String runner) {
+        this.runner = runner;
+    }
+
+    public Date getRunTime() {
+        return runTime;
+    }
+
+    public void setRunTime(Date runTime) {
+        this.runTime = runTime;
+    }
+
+    public Date getAuditTime() {
+        return auditTime;
+    }
+
+    public void setAuditTime(Date auditTime) {
+        this.auditTime = auditTime;
+    }
+
+    public String getAuditMsg() {
+        return auditMsg;
+    }
+
+    public void setAuditMsg(String auditMsg) {
+        this.auditMsg = auditMsg;
+    }
+
+    public String getAuditResult() {
+        return auditResult;
+    }
+
+    public void setAuditResult(String auditResult) {
+        this.auditResult = auditResult;
+    }
+
+    public String getQylb() {
+        return qylb;
+    }
+
+    public void setQylb(String qylb) {
+        this.qylb = qylb;
+    }
+
+    public Short getSsqy() {
+        return ssqy;
+    }
+
+    public void setSsqy(Short ssqy) {
+        this.ssqy = ssqy;
+    }
+
+    public String getBusKey() {
+        return busKey;
+    }
+
+    public void setBusKey(String busKey) {
+        this.busKey = busKey;
+    }
+
+    public String getAuditUser() {
+        return auditUser;
+    }
+
+    public void setAuditUser(String auditUser) {
+        this.auditUser = auditUser;
+    }
+
+    public String getTaskKey() {
+        return taskKey;
+    }
+
+    public void setTaskKey(String taskKey) {
+        this.taskKey = taskKey;
+    }
+
+    public String getRoleCode() {
+        return roleCode;
+    }
+
+    public void setRoleCode(String roleCode) {
+        this.roleCode = roleCode;
+    }
+
+    public String getAuditUsername() {
+        return auditUsername;
+    }
+
+    public void setAuditUsername(String auditUsername) {
+        this.auditUsername = auditUsername;
+    }
+
+    public Short getSzd() {
+        return szd;
+    }
+
+    public void setSzd(Short szd) {
+        this.szd = szd;
+    }
+
+    public Date getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Date beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+}

+ 2 - 0
gkaqv2/trunk/modules/web/src/main/resources/spring/spring-workflow.xml

@@ -12,7 +12,9 @@
 		<property name="properties" value="classpath:/spring/workflowDS.properties" />
 		<property name="dsType" value="com.alibaba.druid.pool.DruidDataSource"></property>
 	</bean>
+	<bean id="uuidGenerator" class="org.activiti.engine.impl.persistence.StrongUuidGenerator" />
 	<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
+		<property name="idGenerator" ref="uuidGenerator" />
 		<property name="dataSource" ref="workflowDS" />
 		<property name="transactionManager" ref="transactionManager" />
 		<property name="databaseSchemaUpdate" value="" />

+ 2 - 2
gkaqv2/trunk/modules/web/src/main/resources/spring/workflowDS.properties

@@ -1,8 +1,8 @@
 url=jdbc:oracle:thin:@192.168.57.36:1521:orcl
 #url=jdbc:h2:~/oa;AUTO_SERVER=TRUE
 #driverClassName=org.h2.Driver
-username=gkaqwf
-password=gkaqwf
+username=gkaqv2
+password=gkaq
 #druid datasource
 initialSize=10
 minIdle=10

+ 2 - 2
gkaqv2/trunk/modules/web/src/main/webapp/WEB-INF/view/frame/syslog.jsp

@@ -39,8 +39,8 @@
                                 <option value="" selected="selected">请选择...</option>
                         </select></td>
                         <td class="tdname">日志时间</td>
-                        <td class="tdcontent" style="width:400px"><input type="text" id="srh_begin" name="srh_begin" class="p_txt"> ~
-                            <input type="text" id="srh_end" name="srh_end" class="p_txt"></td>
+                        <td class="tdcontent" style="width:400px"><input type="text" id="srh_begin" name="srh_begin" class="p_txt" > ~
+                            <input type="text" id="srh_end" name="srh_end" class="p_txt" ></td>
                         <td class="tdname"><img class="p_searchbtn"
                             src="<%=base%>/static/images/list/btn_query.png" title="查询" onclick="searchRecord()" />
                         </td>

+ 128 - 0
gkaqv2/trunk/modules/web/src/main/webapp/WEB-INF/view/frame/wfdemo.jsp

@@ -0,0 +1,128 @@
+<%@ page language="java" contentType="text/html;charset=GBK" pageEncoding="GBK"%>
+<!DOCTYPE html>
+<html>
+<head>
+<title>工作台</title>
+
+<%@ include file="../layouts/header.jsp"%>
+<script src="<%=base%>/static/js/frame/wfdemo.js"></script>
+</head>
+<body class="p_body">
+    <div class="p_all">
+        <div class="p_headdiv">
+            <div class="p_headnav">
+                <img class="p_headnavimg" onclick="gotoHome()" src="<%=base%>/static/images/list/home.png" />
+            </div>
+            <div class="p_headblock">
+                <div class="p_headleft">工作台</div>
+            </div>
+        </div>
+        <div class="p_block">
+            <div class="p_fucdiv">
+                <div class="p_titlediv">
+                    <div class="p_titlename">工作台</div>
+                    <div id="totalRecord" class="p_titlerecord">共0条记录</div>
+                </div>
+                <div class="p_buttondiv">
+                    <div class="p_buttonbg">
+                        <img class="p_buttonimg" src="<%=base%>/static/images/list/edit.png" onclick="pass()"
+                            title="" />批准通过
+                    </div>
+                    <div class="p_buttonbg">
+                        <img class="p_buttonimg" src="<%=base%>/static/images/list/edit.png" onclick="review()"
+                            title="" />审核
+                    </div>
+                    <div class="p_buttonbg">
+                        <img class="p_buttonimg" src="<%=base%>/static/images/list/edit.png" onclick="recheck()"
+                            title="" />审查
+                    </div>
+                    <div class="p_buttonbg">
+                        <img class="p_buttonimg" src="<%=base%>/static/images/list/edit.png" onclick="check()"
+                            title="" />形式审查
+                    </div>
+                    <div class="p_buttonbg">
+                        <img class="p_buttonimg" src="<%=base%>/static/images/list/edit.png" onclick="create()"
+                            title="" />发起流程
+                    </div>
+                    <div class="p_buttonbg">
+                        <img class="p_buttonimg" src="<%=base%>/static/images/list/search.png" onclick="showSearch()"
+                            title="查询" />
+                    </div>
+                </div>
+            </div>
+            <div class="p_searchdiv">
+                <table class="tabsearch">
+                    <tr class="trsearch">
+                        <td class="tdname">任务类型</td>
+                        <td class="tdcontent"><input type="text" id="srh_taskType" name="srh_taskType" class="p_txt"></td>
+                        <td class="tdname">开始时间从</td>
+                        <td class="tdcontent"><input type="text" id="srh_begin" name="srh_begin" class="p_txt"></td>
+                        <td class="tdname">至</td>
+                        <td class="tdcontent"><input type="text" id="srh_end" name="srh_end" class="p_txt"></td>
+                        <td class="tdname"><img class="p_searchbtn"
+                            src="<%=base%>/static/images/list/btn_query.png" title="查询" onclick="searchRecord()" />
+                        </td>
+                    </tr>
+                </table>
+            </div>
+            <div class="container page-content">
+                <!--  列表部分 -->
+                <table grid-manager="grid-table" id="grid-table"></table>
+            </div>
+        </div>
+        <%@ include file="../layouts/footer.jsp"%>
+    </div>
+
+    <div class="modal fade" id="editWin" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">
+                        <span aria-hidden="true">&times;</span><span class="sr-only">Close</span>
+                    </button>
+                    <h6 class="modal-title" id="myModalLabel"></h6>
+                </div>
+                <div class="modal-body">
+                    <form class="form-horizontal" id="editForm" method="post" onsubmit="return false;">
+                        <input type="hidden" id="id" name="id">
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label" for="key">参数主键</label>
+                            <div class="col-sm-9">
+                                <input class="form-control" id="key" name="key" type="text" />
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label" for="value">参数值</label>
+                            <div class="col-sm-9">
+                                <input class="form-control" id="value" name="value" type="text" />
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label" for="clazz">所属类</label>
+                            <div class="col-sm-9">
+                                <input class="form-control" id="clazz" name="clazz" type="text" />
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label" for="disp">属性描述</label>
+                            <div class="col-sm-9">
+                                <input class="form-control" id="disp" name="disp" type="text" />
+                            </div>
+                        </div>
+                        <div class="row">
+                            <div class="center-block" style="width: 160px;">
+                                <button class="btn btn-custom btn-round btn-sm" onclick="save()">
+                                    <i class="glyphicon glyphicon-ok"></i> 保存
+                                </button>
+                                <button class="btn btn-custom btn-round btn-sm" onclick="closeWin()">
+                                    <i class="glyphicon glyphicon-remove"></i> 关闭
+                                </button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+</body>
+</html>

+ 84 - 0
gkaqv2/trunk/modules/web/src/main/webapp/static/js/frame/wfdemo.js

@@ -0,0 +1,84 @@
+var grid_selector = "#grid-table";
+
+$(document).ready(function() {
+    initGrid();
+});
+
+/**
+ * 初始化Grid
+ */
+function initGrid() {
+    //单列表简易渲染
+    var table = $(grid_selector);
+    table.GM({
+        ajax_url: basePath + '/wfdemo/list'
+        ,ajax_type: 'POST'
+        ,columnData: [
+            {
+                key: 'taskKey',
+                text: '任务类型'
+            },{
+                key: 'auditMsg',
+                text: '任务内容'
+            },{
+                key: 'currName',
+                text: '任务标题'
+            },{
+                key: 'startTime',
+                text: '开始时间'
+            },{
+                key: 'startUser',
+                text: '发出人'
+            },{
+                key: 'startUser',
+                text: '发出单位'
+            },{
+                key: 'auditResult',
+                text: '处理'
+            }
+        ]
+        ,pagingBefore:function(query){}
+        ,pagingAfter: function(query){}
+        ,sortingBefore:function(query){}
+        ,sortingAfter: function(query){}
+        ,ajax_beforeSend: function(query){}
+        ,ajax_complete: function(data){
+            showTotalRecord(data);
+        }
+    },function(query){
+//        console.log('init方法回调query参数', query);
+    });
+};
+
+/**
+ * 查询
+ */
+function searchRecord() {
+    var srh_taskType = $("#srh_taskType").val();
+
+    // 定义查询参数
+    var obj = {
+        'taskType': srh_taskType,
+    };
+    // 设置gird参数
+    $(grid_selector).GM('setQuery', obj);
+    // 查询grid
+    $(grid_selector).GM('refreshGrid', true, null);
+};
+
+function create() {
+    $.ajax({
+        type : "post",
+        url : basePath + '/wfdemo/create',
+        dataType : 'json',
+        success : function(data) {
+            // 成功保存后刷新页面
+            if (data && data.success == true) {
+                layer.alert("流程已成功发起!");
+                searchRecord();
+            } else {
+                layer.alert("流程发起失败!");
+            }
+        }
+    });
+}

+ 36 - 0
gkaqv2/trunk/modules/web/src/test/java/org/activiti/designer/test/ProcessTestActivitiReview.java

@@ -0,0 +1,36 @@
+package org.activiti.designer.test;
+
+import static org.junit.Assert.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.io.FileInputStream;
+
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.test.ActivitiRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class ProcessTestActivitiReview {
+
+	private String filename = "D:\\workspace\\web\\src\\test\\resources\\MyProcess.bpmn";
+
+	@Rule
+	public ActivitiRule activitiRule = new ActivitiRule();
+
+	@Test
+	public void startProcess() throws Exception {
+		RepositoryService repositoryService = activitiRule.getRepositoryService();
+		repositoryService.createDeployment().addInputStream("activitiReview.bpmn20.xml",
+				new FileInputStream(filename)).deploy();
+		RuntimeService runtimeService = activitiRule.getRuntimeService();
+		Map<String, Object> variableMap = new HashMap<String, Object>();
+		variableMap.put("name", "Activiti");
+		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("activitiReview", variableMap);
+		assertNotNull(processInstance.getId());
+		System.out.println("id " + processInstance.getId() + " "
+				+ processInstance.getProcessDefinitionId());
+	}
+}

+ 36 - 0
gkaqv2/trunk/modules/web/src/test/java/org/activiti/designer/test/ProcessTestZyfzWorkflow.java

@@ -0,0 +1,36 @@
+package org.activiti.designer.test;
+
+import static org.junit.Assert.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.io.FileInputStream;
+
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.test.ActivitiRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class ProcessTestZyfzWorkflow {
+
+	private String filename = "D:\\workspace\\web\\src\\test\\resources\\zyfzWf.bpmn";
+
+	@Rule
+	public ActivitiRule activitiRule = new ActivitiRule();
+
+	@Test
+	public void startProcess() throws Exception {
+		RepositoryService repositoryService = activitiRule.getRepositoryService();
+		repositoryService.createDeployment().addInputStream("zyfzWorkflow.bpmn20.xml",
+				new FileInputStream(filename)).deploy();
+		RuntimeService runtimeService = activitiRule.getRuntimeService();
+		Map<String, Object> variableMap = new HashMap<String, Object>();
+		variableMap.put("name", "Activiti");
+		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("zyfzWorkflow", variableMap);
+		assertNotNull(processInstance.getId());
+		System.out.println("id " + processInstance.getId() + " "
+				+ processInstance.getProcessDefinitionId());
+	}
+}

+ 104 - 0
gkaqv2/trunk/modules/web/src/test/java/web/MyDemoActivti.java

@@ -0,0 +1,104 @@
+package web;
+
+import java.util.List;
+
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.ProcessEngine;
+import org.activiti.engine.ProcessEngineConfiguration;
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.task.Task;
+
+public class MyDemoActivti {
+
+    public static void main(String[] args) {
+        // Create Activiti process engine
+        // 创建一个流程引擎对象
+        // ProcessEngine processEngine = ProcessEngineConfiguration
+        // .createStandaloneProcessEngineConfiguration()
+        // .buildProcessEngine();
+
+        // 创建一个流程引擎对象(为了便于多册测试,修改 name="databaseSchemaUpdate"
+        // value="create-drop" 默认为ture)
+        // /spring/spring-workflow.xml
+        ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
+                "/activiti.cfg.xml").buildProcessEngine();
+
+        // Get Activiti services
+        // 获取流程相关的服务
+        RepositoryService repositoryService = processEngine.getRepositoryService();
+        RuntimeService runtimeService = processEngine.getRuntimeService();
+
+        // Deploy the process definition
+        // 部署相关的流程配置
+        repositoryService.createDeployment().addClasspathResource("MyDemo.bpmn").deploy();
+
+        // Start a process instance
+        // 获取流程实例
+        String procId = runtimeService.startProcessInstanceByKey("myDemo").getId();
+        
+//        // diagrams实际路径  
+//        private static String realPath =   
+//                "D:\\Java~coding~site\\J2EE-IDE\\Workspace\\workspace[indigo-jee]" +  
+//                "\\activiti-demo\\src\\main\\resources\\diagrams"; 
+//        // 部署流程定义  
+//        repositoryService  
+//                .createDeployment()  
+//                .addInputStream("DemoProcess.bpmn",new FileInputStream(realPath + "\\DemoProcess.bpmn"))  
+//                .addInputStream("DemoProcess.png", new FileInputStream(realPath + <a href="file://\\DemoProcess.png">\\DemoProcess.png</a>))  
+//                .deploy(); 
+//        // 启动流程实例  
+//        ProcessInstance instance = processEngine  
+//                 .getRuntimeService().startProcessInstanceByKey("DemoProcess");  
+//        String procId = instance.getId();  
+//        System.out.println("procId:"+ procId);
+
+        // Get the first task
+        TaskService taskService = processEngine.getTaskService();
+        // 获取accountancy组可能要操作的任务
+        List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();
+        for (Task task : tasks) {
+            System.out.println("Following task is available for accountancy group: " + task.getName());
+
+            // 设置fozzie代办 claim it
+            taskService.claim(task.getId(), "fozzie");
+        }
+
+        // Verify Fozzie can now retrieve the task
+        // 审核fozzie当前的获取的任务数量
+        tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();
+        for (Task task : tasks) {
+            System.out.println("Task for fozzie: " + task.getName());
+
+            // Complete the task
+            // 设置forzze完毕
+            taskService.complete(task.getId());
+        }
+
+        System.out.println("Number of tasks for fozzie: "
+                + taskService.createTaskQuery().taskAssignee("fozzie").count());
+
+        // Retrieve and claim the second task
+        // 管理者审核报告并让kermit代办
+        tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
+        for (Task task : tasks) {
+            System.out.println("Following task is available for accountancy group: " + task.getName());
+            taskService.claim(task.getId(), "kermit");
+        }
+
+        // Completing the second task ends the process
+        // 完成报告
+        for (Task task : tasks) {
+            taskService.complete(task.getId());
+        }
+
+        // verify that the process is actually finished
+        // 查询流程实例完成事件
+        HistoryService historyService = processEngine.getHistoryService();
+        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
+                .processInstanceId(procId).singleResult();
+        System.out.println("Process instance end time: " + historicProcessInstance.getEndTime());
+    }
+}

+ 68 - 0
gkaqv2/trunk/modules/web/src/test/java/web/TestMain.java

@@ -0,0 +1,68 @@
+package web;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Date;
+
+import org.apache.shiro.crypto.hash.Sha256Hash;
+
+public class TestMain {
+
+    public static void main(String[] args) {
+//        testSha();
+//        testIp();
+        testType();
+    }
+
+    private static void testSha() {
+        String val = "123456";
+        String pwd = new Sha256Hash(val).toBase64();
+        System.out.println("password : " + pwd);
+        Sha256Hash sha = Sha256Hash.fromBase64String(pwd);
+        System.out.println(sha.toHex() + " , " + sha.toBase64());
+        pwd = new Sha256Hash(val).toHex();
+        System.out.println("password : " + pwd);
+        sha = Sha256Hash.fromHexString(pwd);
+        System.out.println(sha.toHex() + " , " + sha.toBase64());
+        
+        try {
+            MessageDigest md = MessageDigest.getInstance("SHA-256");
+            md.update(val.getBytes());
+            StringBuffer strHexString = new StringBuffer(); 
+            for (byte b : md.digest()) {
+                String hex = Integer.toHexString(0xff & b);  
+                if (hex.length() == 1)  
+                {  
+                  strHexString.append('0');  
+                }  
+                strHexString.append(hex); 
+            }
+            System.out.println(strHexString.toString());
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private static void testIp() {
+        String ip = "";
+        if (isNotIp(ip)) {
+            System.out.println(ip + " is not ip address");
+        } else {
+            System.out.println(ip + " is ip address");
+        }
+    }
+
+    private static boolean isNotIp(String ip) {
+        return ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip);
+    }
+
+    
+    private static void testType() {
+        StringBuffer sb = new StringBuffer();
+        Long a = 1000l;
+        String b = "222";
+        Date c = new Date();
+        sb.append(a).append(b).append(c);
+        System.out.println(sb.toString());
+    }
+}

+ 40 - 0
gkaqv2/trunk/modules/web/src/test/resources/MyDemo.bpmn

@@ -0,0 +1,40 @@
+<?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:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.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.activiti.org/test">
+  <process id="myDemo" name="My Demo" isExecutable="true">
+    <startEvent id="startevent1" name="Start"></startEvent>
+    <userTask id="usertask1" name="财务编写" activiti:candidateGroups="accountancy"></userTask>
+    <userTask id="usertask2" name="股东审核" activiti:candidateGroups="management"></userTask>
+    <endEvent id="endevent1" name="End"></endEvent>
+    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
+    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
+    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
+    <bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
+      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="130.0" y="160.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
+        <omgdc:Bounds height="55.0" width="105.0" x="230.0" y="150.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
+        <omgdc:Bounds height="55.0" width="105.0" x="420.0" y="150.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="620.0" y="160.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="165.0" y="177.0"></omgdi:waypoint>
+        <omgdi:waypoint x="230.0" y="177.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <omgdi:waypoint x="335.0" y="177.0"></omgdi:waypoint>
+        <omgdi:waypoint x="420.0" y="177.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="525.0" y="177.0"></omgdi:waypoint>
+        <omgdi:waypoint x="620.0" y="177.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>

+ 102 - 0
gkaqv2/trunk/modules/web/src/test/resources/MyProcess.bpmn

@@ -0,0 +1,102 @@
+<?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:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.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://activiti.org/bpmn20" id="review-definitions">
+  <process id="activitiReview" name="Review And Approve Activiti Process" isExecutable="true">
+    <startEvent id="start" activiti:formKey="wf:submitReviewTask"></startEvent>
+    <sequenceFlow id="flow1" sourceRef="start" targetRef="reviewTask"></sequenceFlow>
+    <userTask id="reviewTask" name="评审" activiti:assignee="${bpm_assignee.properties.userName}" activiti:formKey="wf:activitiReviewTask">
+      <extensionElements>
+        <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
+          <activiti:field name="script">
+            <activiti:string><![CDATA[if (typeof bpm_workflowDueDate != 'undefined') task.setVariableLocal('bpm_dueDate', bpm_workflowDueDate);
+                        if (typeof bpm_workflowPriority != 'undefined') task.priority = bpm_workflowPriority;]]></activiti:string>
+          </activiti:field>
+        </activiti:taskListener>
+        <activiti:taskListener event="complete" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
+          <activiti:field name="script">
+            <activiti:string><![CDATA[execution.setVariable('wf_reviewOutcome', task.getVariable('wf_reviewOutcome'));]]></activiti:string>
+          </activiti:field>
+        </activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <sequenceFlow id="flow2" sourceRef="reviewTask" targetRef="reviewDecision"></sequenceFlow>
+    <exclusiveGateway id="reviewDecision" name="Review Decision"></exclusiveGateway>
+    <sequenceFlow id="flow3" sourceRef="reviewDecision" targetRef="approved">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${wf_reviewOutcome == 'Approve'}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow4" sourceRef="reviewDecision" targetRef="rejected"></sequenceFlow>
+    <userTask id="approved" name="通过" activiti:assignee="${initiator.properties.userName}" activiti:formKey="wf:approvedTask">
+      <documentation>The document was reviewed and approved.</documentation>
+      <extensionElements>
+        <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
+          <activiti:field name="script">
+            <activiti:string><![CDATA[if (typeof bpm_workflowDueDate != 'undefined') task.setVariableLocal('bpm_dueDate', bpm_workflowDueDate);
+                        if (typeof bpm_workflowPriority != 'undefined') task.priority = bpm_workflowPriority;]]></activiti:string>
+          </activiti:field>
+        </activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <userTask id="rejected" name="拒绝" activiti:assignee="${initiator.properties.userName}" activiti:formKey="wf:rejectedTask">
+      <documentation>The document was reviewed and rejected.</documentation>
+      <extensionElements>
+        <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
+          <activiti:field name="script">
+            <activiti:string><![CDATA[if (typeof bpm_workflowDueDate != 'undefined') task.setVariableLocal('bpm_dueDate', bpm_workflowDueDate);
+                        if (typeof bpm_workflowPriority != 'undefined') task.priority = bpm_workflowPriority;]]></activiti:string>
+          </activiti:field>
+        </activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <sequenceFlow id="flow5" sourceRef="approved" targetRef="end"></sequenceFlow>
+    <sequenceFlow id="flow6" sourceRef="rejected" targetRef="end"></sequenceFlow>
+    <endEvent id="end"></endEvent>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_activitiReview">
+    <bpmndi:BPMNPlane bpmnElement="activitiReview" id="BPMNPlane_activitiReview">
+      <bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
+        <omgdc:Bounds height="35.0" width="35.0" x="30.0" y="200.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="reviewTask" id="BPMNShape_reviewTask">
+        <omgdc:Bounds height="55.0" width="105.0" x="105.0" y="190.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="reviewDecision" id="BPMNShape_reviewDecision">
+        <omgdc:Bounds height="40.0" width="40.0" x="250.0" y="197.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="approved" id="BPMNShape_approved">
+        <omgdc:Bounds height="55.0" width="105.0" x="330.0" y="137.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="rejected" id="BPMNShape_rejected">
+        <omgdc:Bounds height="55.0" width="105.0" x="330.0" y="257.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end">
+        <omgdc:Bounds height="35.0" width="35.0" x="550.0" y="147.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="65.0" y="217.0"></omgdi:waypoint>
+        <omgdi:waypoint x="105.0" y="217.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <omgdi:waypoint x="210.0" y="217.0"></omgdi:waypoint>
+        <omgdi:waypoint x="250.0" y="217.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="270.0" y="197.0"></omgdi:waypoint>
+        <omgdi:waypoint x="270.0" y="164.0"></omgdi:waypoint>
+        <omgdi:waypoint x="330.0" y="164.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
+        <omgdi:waypoint x="270.0" y="237.0"></omgdi:waypoint>
+        <omgdi:waypoint x="270.0" y="284.0"></omgdi:waypoint>
+        <omgdi:waypoint x="330.0" y="284.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
+        <omgdi:waypoint x="435.0" y="164.0"></omgdi:waypoint>
+        <omgdi:waypoint x="550.0" y="164.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
+        <omgdi:waypoint x="435.0" y="284.0"></omgdi:waypoint>
+        <omgdi:waypoint x="571.0" y="284.0"></omgdi:waypoint>
+        <omgdi:waypoint x="567.0" y="182.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>

BIN
gkaqv2/trunk/modules/web/src/test/resources/MyProcess.jpg


+ 76 - 0
gkaqv2/trunk/modules/web/src/test/resources/activiti.cfg.xml

@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+	   xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
+	   xsi:schemaLocation="http://www.springframework.org/schema/beans
+	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+	http://www.springframework.org/schema/context 
+	http://www.springframework.org/schema/context/spring-context-3.0.xsd
+	http://www.springframework.org/schema/aop
+	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
+
+	<bean id="workflowDS" class="com.xt.js.gkaq.web.system.DataSourceFactory" init-method="init" destroy-method="close">
+		<property name="properties" value="classpath:/spring/workflowDS.properties" />
+		<property name="dsType" value="com.alibaba.druid.pool.DruidDataSource"></property>
+	</bean>
+	<bean id="transactionManager"
+		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
+		<property name="dataSource" ref="workflowDS" />
+	</bean>
+	<!-- <bean id="uuidGenerator" class="org.activiti.engine.impl.persistence.StrongUuidGenerator"> -->
+	<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
+		<!-- <property name="idGenerator" ref="uuidGenerator"> -->
+		<property name="dataSource" ref="workflowDS" />
+		<property name="transactionManager" ref="transactionManager" />
+		<property name="databaseSchemaUpdate" value="" />
+		<property name="jobExecutorActivate" value="false" />
+		<property name="history" value="full" />
+		<property name="deploymentResources">
+			<list>
+					<!--
+					<value>classpath*:/deployments/*</value> 
+					<value>classpath*:/deployments/bgzysbsp-city.*</value>
+					<value>classpath*:/deployments/qxzysbsp-city.*</value>
+					<value>classpath*:/deployments/autoAudit.*</value>
+					<value>classpath*:/deployments/jyrUser.*</value>
+					<value>classpath*:/deployments/aqyssc-*</value>
+					<value>classpath*:/deployments/jsxmaqtjsc-*</value>
+					<value>classpath*:/deployments/whzyfzsq-city.*</value>
+					<value>classpath*:/deployments/aqsszxyssc-city.*</value>
+					<value>classpath*:/deployments/aqpjbgjzgfa-city.*</value>
+					<value>classpath*:/deployments/aqpjjgba-*</value>
+					<value>classpath*:/deployments/jdhxpyjzdwxy-city.*</value>
+					<value>classpath*:/deployments/yjyaba-city.*</value>
+					<value>classpath*:/deployments/zdsgyhpc-city.*</value>
+					<value>classpath*:/deployments/zysbsp-city.*</value>
+					<value>classpath*:/deployments/jdjc.*</value>
+				-->
+			</list>
+		</property>
+		<property name="customSessionFactories">
+			<list>
+				<bean class="com.xt.js.gkaq.frame.wf.MyUserEntityManagerFactory" />
+				<bean class="com.xt.js.gkaq.frame.wf.MyGroupEntityManagerFactory"/>
+			</list>
+		</property>
+	</bean>
+	<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
+		<property name="processEngineConfiguration" ref="processEngineConfiguration" />
+	</bean>
+
+	<bean id="repositoryService" factory-bean="processEngine"
+		  factory-method="getRepositoryService" />
+	<bean id="runtimeService" factory-bean="processEngine"
+		  factory-method="getRuntimeService" />
+	<bean id="formService" factory-bean="processEngine"
+		  factory-method="getFormService" />
+	<bean id="identityService" factory-bean="processEngine"
+		  factory-method="getIdentityService" />
+	<bean id="taskService" factory-bean="processEngine"
+		  factory-method="getTaskService" />
+	<bean id="historyService" factory-bean="processEngine"
+		  factory-method="getHistoryService" />
+	<bean id="managementService" factory-bean="processEngine"
+		  factory-method="getManagementService" />
+
+</beans>

+ 165 - 0
gkaqv2/trunk/modules/web/src/test/resources/zyfzWf.bpmn

@@ -0,0 +1,165 @@
+<?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:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.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.activiti.org/test">
+  <process id="zyfzWorkflow" name="作业附证工作流" isExecutable="true">
+    <startEvent id="startevent1" name="Start"></startEvent>
+    <userTask id="tianbaoTask" name="填报"></userTask>
+    <userTask id="xsshenchaTask" name="形式审查"></userTask>
+    <userTask id="shenchaTask" name="审查"></userTask>
+    <userTask id="shenheTask" name="审核"></userTask>
+    <userTask id="pizhunTask" name="批准"></userTask>
+    <userTask id="tongguoTask" name="批准通过"></userTask>
+    <userTask id="sjtongguoTask" name="省级批准通过"></userTask>
+    <endEvent id="endevent1" name="End"></endEvent>
+    <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
+    <sequenceFlow id="flow6" sourceRef="startevent1" targetRef="tianbaoTask"></sequenceFlow>
+    <sequenceFlow id="flow7" sourceRef="tianbaoTask" targetRef="xsshenchaTask"></sequenceFlow>
+    <exclusiveGateway id="exclusivegateway2" name="Exclusive Gateway"></exclusiveGateway>
+    <sequenceFlow id="flow8" sourceRef="xsshenchaTask" targetRef="exclusivegateway2"></sequenceFlow>
+    <sequenceFlow id="flow9" sourceRef="exclusivegateway2" targetRef="shenchaTask">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${audit_result==1}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow10" sourceRef="exclusivegateway2" targetRef="tianbaoTask">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${audit_result==0}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow11" sourceRef="shenchaTask" targetRef="exclusivegateway1"></sequenceFlow>
+    <sequenceFlow id="flow12" sourceRef="exclusivegateway1" targetRef="shenheTask">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${audit_result==1}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow13" sourceRef="exclusivegateway1" targetRef="xsshenchaTask">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${audit_result==0}]]></conditionExpression>
+    </sequenceFlow>
+    <exclusiveGateway id="exclusivegateway3" name="Exclusive Gateway"></exclusiveGateway>
+    <sequenceFlow id="flow14" sourceRef="shenheTask" targetRef="exclusivegateway3"></sequenceFlow>
+    <sequenceFlow id="flow15" sourceRef="exclusivegateway3" targetRef="pizhunTask">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${audit_result==1}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow16" sourceRef="exclusivegateway3" targetRef="shenchaTask">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${audit_result==0}]]></conditionExpression>
+    </sequenceFlow>
+    <exclusiveGateway id="exclusivegateway4" name="Exclusive Gateway"></exclusiveGateway>
+    <sequenceFlow id="flow20" sourceRef="pizhunTask" targetRef="exclusivegateway4"></sequenceFlow>
+    <sequenceFlow id="flow21" sourceRef="exclusivegateway4" targetRef="tongguoTask">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${audit_result==1}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow22" sourceRef="exclusivegateway4" targetRef="shenheTask">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${audit_result==0}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow23" sourceRef="tongguoTask" targetRef="sjtongguoTask"></sequenceFlow>
+    <sequenceFlow id="flow25" sourceRef="sjtongguoTask" targetRef="endevent1"></sequenceFlow>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_zyfzWorkflow">
+    <bpmndi:BPMNPlane bpmnElement="zyfzWorkflow" id="BPMNPlane_zyfzWorkflow">
+      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="27.0" y="129.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="tianbaoTask" id="BPMNShape_tianbaoTask">
+        <omgdc:Bounds height="55.0" width="105.0" x="95.0" y="119.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="xsshenchaTask" id="BPMNShape_xsshenchaTask">
+        <omgdc:Bounds height="55.0" width="105.0" x="230.0" y="119.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="shenchaTask" id="BPMNShape_shenchaTask">
+        <omgdc:Bounds height="55.0" width="105.0" x="450.0" y="119.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="shenheTask" id="BPMNShape_shenheTask">
+        <omgdc:Bounds height="55.0" width="105.0" x="660.0" y="119.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="pizhunTask" id="BPMNShape_pizhunTask">
+        <omgdc:Bounds height="55.0" width="105.0" x="869.0" y="119.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="tongguoTask" id="BPMNShape_tongguoTask">
+        <omgdc:Bounds height="55.0" width="105.0" x="1089.0" y="119.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="sjtongguoTask" id="BPMNShape_sjtongguoTask">
+        <omgdc:Bounds height="55.0" width="105.0" x="1089.0" y="241.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="1124.0" y="360.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
+        <omgdc:Bounds height="40.0" width="40.0" x="590.0" y="126.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="BPMNShape_exclusivegateway2">
+        <omgdc:Bounds height="40.0" width="40.0" x="379.0" y="126.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway3" id="BPMNShape_exclusivegateway3">
+        <omgdc:Bounds height="40.0" width="40.0" x="800.0" y="126.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway4" id="BPMNShape_exclusivegateway4">
+        <omgdc:Bounds height="40.0" width="40.0" x="1010.0" y="126.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
+        <omgdi:waypoint x="62.0" y="146.0"></omgdi:waypoint>
+        <omgdi:waypoint x="95.0" y="146.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
+        <omgdi:waypoint x="200.0" y="146.0"></omgdi:waypoint>
+        <omgdi:waypoint x="230.0" y="146.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
+        <omgdi:waypoint x="335.0" y="146.0"></omgdi:waypoint>
+        <omgdi:waypoint x="379.0" y="146.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9">
+        <omgdi:waypoint x="419.0" y="146.0"></omgdi:waypoint>
+        <omgdi:waypoint x="450.0" y="146.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10">
+        <omgdi:waypoint x="399.0" y="126.0"></omgdi:waypoint>
+        <omgdi:waypoint x="401.0" y="77.0"></omgdi:waypoint>
+        <omgdi:waypoint x="147.0" y="77.0"></omgdi:waypoint>
+        <omgdi:waypoint x="147.0" y="119.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11">
+        <omgdi:waypoint x="555.0" y="146.0"></omgdi:waypoint>
+        <omgdi:waypoint x="590.0" y="146.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow12" id="BPMNEdge_flow12">
+        <omgdi:waypoint x="630.0" y="146.0"></omgdi:waypoint>
+        <omgdi:waypoint x="660.0" y="146.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow13" id="BPMNEdge_flow13">
+        <omgdi:waypoint x="610.0" y="166.0"></omgdi:waypoint>
+        <omgdi:waypoint x="610.0" y="219.0"></omgdi:waypoint>
+        <omgdi:waypoint x="282.0" y="219.0"></omgdi:waypoint>
+        <omgdi:waypoint x="282.0" y="174.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow14" id="BPMNEdge_flow14">
+        <omgdi:waypoint x="765.0" y="146.0"></omgdi:waypoint>
+        <omgdi:waypoint x="800.0" y="146.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow15" id="BPMNEdge_flow15">
+        <omgdi:waypoint x="840.0" y="146.0"></omgdi:waypoint>
+        <omgdi:waypoint x="869.0" y="146.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow16" id="BPMNEdge_flow16">
+        <omgdi:waypoint x="820.0" y="126.0"></omgdi:waypoint>
+        <omgdi:waypoint x="820.0" y="75.0"></omgdi:waypoint>
+        <omgdi:waypoint x="502.0" y="75.0"></omgdi:waypoint>
+        <omgdi:waypoint x="502.0" y="119.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow20" id="BPMNEdge_flow20">
+        <omgdi:waypoint x="974.0" y="146.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1010.0" y="146.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow21" id="BPMNEdge_flow21">
+        <omgdi:waypoint x="1050.0" y="146.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1089.0" y="146.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow22" id="BPMNEdge_flow22">
+        <omgdi:waypoint x="1030.0" y="166.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1030.0" y="220.0"></omgdi:waypoint>
+        <omgdi:waypoint x="712.0" y="220.0"></omgdi:waypoint>
+        <omgdi:waypoint x="712.0" y="174.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow23" id="BPMNEdge_flow23">
+        <omgdi:waypoint x="1141.0" y="174.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1141.0" y="241.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow25" id="BPMNEdge_flow25">
+        <omgdi:waypoint x="1141.0" y="296.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1141.0" y="360.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>

BIN
gkaqv2/trunk/modules/web/src/test/resources/zyfzWf.png