1.启动流程并分配任务是单个流程的正式開始,因此要使用到runtimeService接口。以及相关的启动流程的方法。我习惯于用流程定义的key启动,由于有多个版本号的流程定义时,用key启动默认会使用最新版本号。同一时候,由于启动中查询了流程部署时xml文件里流程节点的信息。也用到了repositoryService及相关方法。

2.后台业务代码,

  (1)自己定义的申请单实体类(为的目的仅仅为了跑通整个流程。因此仅仅定义了一个实体类。按公司标准开发来说,应该是和前台交互一个command类(事实上也还是实体类,叫法不一样而已),和数据库交互另一个实体类),在这里定义了一个申请单的基本信息:

[java] view
plain
 copy

  1. package model;
  2. public class applyModel {
  3. /**
  4. * 流程定义id
  5. */
  6. private String proDefId;
  7. /**
  8. * 流程定义的key
  9. */
  10. private String key;
  11. private String name;
  12. /**
  13. * 申请人
  14. */
  15. private String appPerson;
  16. /**
  17. * 原因
  18. */
  19. private String cause;
  20. /**
  21. * 内容
  22. */
  23. private String content;
  24. /**
  25. * 处理人。即下一个任务节点的受理人
  26. */
  27. private String proPerson;
  28. public String getKey() {
  29. return key;
  30. }
  31. public void setKey(String key) {
  32. this.key = key;
  33. }
  34. public String getAppPerson() {
  35. return appPerson;
  36. }
  37. public void setAppPerson(String appPerson) {
  38. this.appPerson = appPerson;
  39. }
  40. public String getCause() {
  41. return cause;
  42. }
  43. public void setCause(String cause) {
  44. this.cause = cause;
  45. }
  46. public String getContent() {
  47. return content;
  48. }
  49. public void setContent(String content) {
  50. this.content = content;
  51. }
  52. public String getProPerson() {
  53. return proPerson;
  54. }
  55. public void setProPerson(String proPerson) {
  56. this.proPerson = proPerson;
  57. }
  58. public String getName() {
  59. return name;
  60. }
  61. public void setName(String name) {
  62. this.name = name;
  63. }
  64. public String getProDefId() {
  65. return proDefId;
  66. }
  67. public void setProDefId(String proDefId) {
  68. this.proDefId = proDefId;
  69. }
  70. @Override
  71. public String toString() {
  72. return "applyModel [proDefId=" + proDefId + ", key=" + key + ", name="
  73. + name + ", appPerson=" + appPerson + ", cause=" + cause
  74. + ", content=" + content + ", proPerson=" + proPerson + "]";
  75. }
  76. }

(2)业务逻辑:





A,这种方法获取流程部署时xml文件中的各个节点相关信息。用来辨别当前是哪个节点,下一节点又是什么,共下边的B方法调用。

由于操作部署时的文件,因此使用repositoryService:

[java] view
plain
 copy

  1. /**
  2. * @throws XMLStreamException
  3. *             查询流程节点
  4. *
  5. * @author:tuzongxun
  6. * @Title: findFlow
  7. * @param @return
  8. * @return Iterator<FlowElement>
  9. * @date Mar 21, 2016 9:31:42 AM
  10. * @throws
  11. */
  12. public Iterator<FlowElement> findFlow(String processDefId)
  13. throws XMLStreamException {
  14. List<ProcessDefinition> lists = repositoryService
  15. .createProcessDefinitionQuery()
  16. .processDefinitionId(processDefId)
  17. .orderByProcessDefinitionVersion().desc().list();
  18. ProcessDefinition processDefinition = lists.get(0);
  19. processDefinition.getCategory();
  20. String resourceName = processDefinition.getResourceName();
  21. InputStream inputStream = repositoryService.getResourceAsStream(
  22. processDefinition.getDeploymentId(), resourceName);
  23. BpmnXMLConverter converter = new BpmnXMLConverter();
  24. XMLInputFactory factory = XMLInputFactory.newInstance();
  25. XMLStreamReader reader = factory.createXMLStreamReader(inputStream);
  26. BpmnModel bpmnModel = converter.convertToBpmnModel(reader);
  27. Process process = bpmnModel.getMainProcess();
  28. Collection<FlowElement> elements = process.getFlowElements();
  29. Iterator<FlowElement> iterator = elements.iterator();
  30. return iterator;
  31. }

B.这里调用上一个方法,一起完毕流程的启动及相关信息的设置:

[java] view
plain
 copy

  1. /**
  2. * @throws XMLStreamException
  3. *             启动流程
  4. *
  5. * @author:tuzongxun
  6. * @Title: startProcess
  7. * @param @return
  8. * @return Object
  9. * @date Mar 17, 2016 2:06:34 PM
  10. * @throws
  11. */
  12. @RequestMapping(value = "/startProcess.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
  13. @ResponseBody
  14. public Object startProcess(@RequestBody applyModel applyModel,
  15. HttpServletRequest req) throws XMLStreamException {
  16. Map<String, String> map = new HashMap<String, String>();
  17. boolean isLogin = this.isLogin(req);
  18. if (isLogin) {
  19. if (applyModel != null) {
  20. String processKey = applyModel.getKey();
  21. String processDefId = applyModel.getProDefId();
  22. // //////////////////////////
  23. Iterator<FlowElement> iterator = this.findFlow(processDefId);
  24. Map<String, Object> varables = new HashMap<String, Object>();
  25. int i = 1;
  26. while (iterator.hasNext()) {
  27. FlowElement flowElement = iterator.next();
  28. // 申请人
  29. if (flowElement.getClass().getSimpleName()
  30. .equals("UserTask")
  31. && i == 1) {
  32. UserTask userTask = (UserTask) flowElement;
  33. String assignee = userTask.getAssignee();
  34. int index1 = assignee.indexOf("{");
  35. int index2 = assignee.indexOf("}");
  36. varables.put(assignee.substring(index1 + 1, index2),
  37. applyModel.getAppPerson());
  38. varables.put("cause", applyModel.getCause());
  39. varables.put("content", applyModel.getContent());
  40. varables.put("taskType", applyModel.getName());
  41. i++;
  42. // 下一个处理人
  43. } else if (flowElement.getClass().getSimpleName()
  44. .equals("UserTask")
  45. && i == 2) {
  46. UserTask userTask = (UserTask) flowElement;
  47. String assignee = userTask.getAssignee();
  48. int index1 = assignee.indexOf("{");
  49. int index2 = assignee.indexOf("}");
  50. varables.put(assignee.substring(index1 + 1, index2),
  51. applyModel.getProPerson());
  52. break;
  53. }
  54. }
  55. // ///////////////////////////
  56. runtimeService.startProcessInstanceByKey(processKey, varables);
  57. map.put("userName",
  58. (String) req.getSession().getAttribute("userName"));
  59. map.put("isLogin", "yes");
  60. map.put("result", "success");
  61. } else {
  62. map.put("result", "fail");
  63. }
  64. } else {
  65. map.put("isLogin", "no");
  66. }
  67. return map;
  68. }

3.angular js前台代码。:

  (1)app.js中配置路由:

[javascript] view
plain
 copy

  1. $stateProvider
  2. .state('startProcess', {
  3. url: "/startProcess",
  4. views: {
  5. 'view': {
  6. templateUrl: 'activi_views/startProcess.html',
  7. controller: 'startProcessCtr'
  8. }
  9. }
  10. });

(2)逻辑相关代码:

[javascript] view
plain
 copy

  1. angular.module('activitiApp')
  2. .controller('startProcessCtr', ['$rootScope','$scope','$http','$location', function($rootScope,$scope,$http,$location){
  3. $http.post("createFlush.do").success(function(result){
  4. if(result.isLogin==="yes"){
  5. $rootScope.userName=result.userName;
  6. $scope.process1={"proDefId":"","key":"","appPerson":"","cause":"","content":"","proPerson":"","name":""};
  7. if($rootScope.process==null||$rootScope.process.key==null){
  8. $location.path("/processList");
  9. }else{
  10. $scope.process1.proDefId=$rootScope.process.id;
  11. $scope.process1.key=$rootScope.process.key;
  12. $scope.process1.name=$rootScope.process.name;
  13. }
  14. }else{
  15. $location.path("/login");
  16. }
  17. });
  18. $scope.startProcess=function(process){
  19. console.log(process);
  20. $http.post("./startProcess.do",process).success(function(deployResult){
  21. $location.path("/taskList");
  22. });
  23. }
  24. }])

4.相应的填写相关信息的页面:

[html] view
plain
 copy

  1. <center>
  2. <div style="margin-top:20px;margin-left:200px;background-color:#9cc;height:500px;width:50%;font-size:22px;position:relative;float:left;">
  3. <p style="font-size:28px">新建申请</p>
  4. 流程定义id:<input type="text" ng-model="process1.proDefId" readonly="readonly" style="background-color:#9dc"/>
  5. </br>
  6. </br>
  7. 流程定义key:<input type="text" ng-model="process1.key" readonly="readonly" style="background-color:#9dc"/>
  8. </br>
  9. </br>
  10. 申请类型:<input type="text" ng-model="process1.name" readonly="readonly" style="background-color:#9dc"/>
  11. </br>
  12. </br>
  13. 申请人:<input type="text" ng-model="process1.appPerson" />
  14. </br>
  15. </br>
  16. 申请原因:<input type="text" ng-model="process1.cause"/>
  17. </br>
  18. </br>
  19. 申请内容:<input type="text" ng-model="process1.content"/>
  20. </br>
  21. </br>
  22. 受理人:<input type="text" ng-model="process1.proPerson"/>
  23. </br>
  24. </br>
  25. <input style="font-size:24px;cursor:pointer" type="button" value="提交申请" ng-click="startProcess(process1);">
  26. <input style="font-size:24px;cursor:pointer" type="button" value="返回">
  27. </div>
  28. </center>

5.成功启动一个流程实例后,会看到act_ru_execution、act_ru_identitylink、act_ru_task、act_ru_variable以及act_hi_actinst、act_hi_detail、act_hi_indentitylink、act_hi_procinst、act_hi_taskinst、act_hi_varinst表中都有了数据。除开variable和varinst中的数据条数是依据相应的流程变量多少来定的。其它都是添加了一条数据。

activiti自己定义流程之Spring整合activiti-modeler实例(六):启动流程的更多相关文章

  1. activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

    注:(1)环境搭建:activiti自己定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建         (2)创建流程模型:activiti自己定义流程之Spr ...

  2. activiti自己定义流程之Spring整合activiti-modeler实例(一):环境搭建

    项目中须要整合activiti-modeler自己定义流程,找了非常多资料后,最终成功的跳转到activiti-modeler流程设计界面.下面是记录: 一.整合基础:eclipse4.4.1.tom ...

  3. activiti自己定义流程之Spring整合activiti-modeler实例(七):任务列表展示

    1.通过上一节的操作,能够知道流程启动以后会同一时候生成一个流程实例和用户任务.这个用户任务保存在act_ru_task和act_hi_task表中,从表明能够看出ru是runtime,hi是hist ...

  4. activiti自定义流程之Spring整合activiti-modeler5.16实例(五):流程定义列表

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  5. activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  6. activiti自定义流程之Spring整合activiti-modeler5.16实例(九):历史任务查询

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  7. activiti自定义流程之Spring整合activiti-modeler5.16实例(八):完成个人任务

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  8. activiti自定义流程之Spring整合activiti-modeler5.16实例(七):任务列表展示

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  9. activiti自定义流程之Spring整合activiti-modeler5.16实例(六):启动流程

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

随机推荐

  1. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---15

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  2. C语言编程中函数指针的定义及使用

    C语言中函数指针的定义: typedef int (*funcPtr)(int, int)表示定义了一个函数指针funcPtr,这个函数指针只能指向如下: int add(int, int).int ...

  3. 教学生jni编程(一)

    我的所有文件的目录在/home/michelle/WORKM/DAYCODE/day0426/,请根据个人情况适当调整 1)创建一个HelloWorld.Java文件,如下: public class ...

  4. 基于Xen实现一种domain0和domainU的应用层数据交互高效机制 - 2

    继续昨天的思路,今天先google了类似的实现domain0和domainU之间数据传输的方案 [Xen-devel] XenStore as a data transfer path?  这篇帖子讨 ...

  5. Javascript中函数声明与函数表达式的不同

    定义函数的方式有两种:一种是函数声明,另一种是函数表达式. 函数声明的语法如下: function functionName(arg0,arg1,arg2){ //函数体 } 函数表达式的语法如下: ...

  6. Codeforces 371E Subway Innovation (前缀和预处理应用)

    题目链接 Subway Innovation 首先不难想到所求的k个点一定是连续的,那么假设先选最前面的k个点,然后在O(1)内判断第2个点到第k+1个点这k个点哪个更优. 判断的时候用detla[i ...

  7. android windowSoftInputMode属性详解(转)

    activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一]当有焦点产生时,软键盘是隐藏还是显示 [二]是否减少活动 ...

  8. dedecms让channelartlist标签支持currentstyle属性方

    把dedecms中用channelartlist当导航的站很普遍,但是有的站需要用到当前页中导航样,就是随着不同的页面,导航样式也随着变化. 首先打开include\taglib\channelart ...

  9. 228. 汇总区间(leetcode)

    #整体思路:使用堆栈,在Python中可以使用列表代替:如果a[i]-a[i-1]==1,就要将a[i]合并到之前的区间里,#所以我们队首位元素开辟一个区间为[a[0],a[0]]#做最后汇总时候,如 ...

  10. 【Salvation】——怪物角色动画&主角碰撞死亡动画

    写在前面:这个动画功能同样也是使用JavaScript编写脚本,在Unity3D游戏引擎的环境中实现,在怪物的角色动画中,很多与人物相同,这里不再重复. 一.设计敌人 拖一个精英sprite到层次面板 ...