使用Nutz+ExtJS+JBPM44实现会签.docx
- 文档编号:6034565
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:26
- 大小:42.85KB
使用Nutz+ExtJS+JBPM44实现会签.docx
《使用Nutz+ExtJS+JBPM44实现会签.docx》由会员分享,可在线阅读,更多相关《使用Nutz+ExtJS+JBPM44实现会签.docx(26页珍藏版)》请在冰豆网上搜索。
使用Nutz+ExtJS+JBPM44实现会签
使用Nutz+ExtJS+JBPM4.4实现会签
∙工作流
∙nutz
∙extjs
会签的例子依然采用Nutz+ExtJS+JBPM来实现。
首先介绍下什么是会签
会签
会签是撰拟公文的过程中,主办单位主动与有关单位协商并核签的一种办文程序,一般当公文的内容涉及本单位的多个部门或与其他单位有关时,需要进行会签。
会签根据对象的不同分为内部会签和外部会签。
内部会签用于与本单位内部的各有关部门进行协商并核签;外部会签用于与外单位的有关部门进行协商并核签;二者的性质相同,但处理形式不同。
在管理系统中的会签流程,例如公司职员离职、大学生毕业离校都要在不同的部门去签字确认,这里去哪个部门签字没有顺序之分,但所有部门签字完毕后才可以离职或离校。
会签的情况会有很多中,根据复杂程度,一般可以分为单步会签(只有一个活动处理会签任务),以及多步会签(由多个任务组成的)
这里只介绍下常见的,也是业务中最常遇到的单步会签。
单步会签常见有4种情况
1.一票否决制——参加会签的用户中任何一个人不同意,会签活动就会结束,进去会签否决,全部同意,则进入会签通过
2.一票通过制——与一票否决完全相反
3.按比例通过——等全部参加会签的用户提交任务后,根据会签意见,按照比例(比如少数服从多数)决定下面的转移
4.意见收集制——等全部参加会签的用户提交完意见后(这里就是一个收集意见的作用而已),会签结束,进入下一个节点
下面的部分将会讲述如何实现一个动态会签(会签人数,人员,会签规则都可以自由设定)
好,接下来看一下今天举得这个申请经费的例子:
贴一下jpdl.xml文件
Xml代码
1.
xml version="1.0" encoding="UTF-8"?
>
2.
3. //jbpm.org/4.4/jpdl"> 4. [CDATA[ 5. 经费申请,大于30万需要老总们会签(采用一票否决制) 6. ]]> 7. -- 会签决策实现类 --> 8. 9. 10. 11. -- 以下三个参数只有按百分比策略才会用到,可以根据需要来设定 --> 12. -- 最小同意数 --> 13. 14. 15. 16. -- 最小同意比例(请设定一个在0-1之间的数字) --> 17. 18. 19. 20. -- 是否使用按比例(true为按照比例,false为按照人数) --> 21. 22. 23. 24. 25. 26. 27. 28. name="申请经费"> 29. 30. 31. '大于30万' : '小于等于30万'}" g="190,144,48,48" 32. name="判断1"> 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. '同意' : '不同意'}" g="325,293,48,48" 43. name="会签判断"> 44. 45. 46. 47. 48. 49. 50. 51. 52.
xmlversion="1.0"encoding="UTF-8"?
>
//jbpm.org/4.4/jpdl"> [CDATA[ 经费申请,大于30万需要老总们会签(采用一票否决制) ]]> --会签决策实现类--> --以下三个参数只有按百分比策略才会用到,可以根据需要来设定--> --最小同意数--> --最小同意比例(请设定一个在0-1之间的数字)--> --是否使用按比例(true为按照比例,false为按照人数)--> name="申请经费"> '大于30万': '小于等于30万'}"g="190,144,48,48" name="判断1"> '同意': '不同意'}"g="325,293,48,48" name="会签判断"> 可以说会签的难点就是如何在一个任务中,实现由多个人去完成。 JBPM4中提供了建立子任务的API,这一点就提供了一个思路. 那就是在进入这个任务后,给相应的会签人员建立对应的子任务,然后等待他们完成子任务后,该会签任务设定为完成,流程向下流转。 下面这段配置就是会签任务,可以看到,与普通task不同的是,添加一个assignment-handler属性,同时指定了一个java类 Xml代码 1. 2. 3. 4. 5. 6. 这里的作用就是,在流程进入到这个节点时,会执行你指定的这个类 这个类的要求是,实现AssignmentHandler接口 Java代码 1.public class CountersignAssignment implements AssignmentHandler publicclassCountersignAssignmentimplementsAssignmentHandler 查看这个接口,会发现需呀实现一个assign方法 Java代码 1./** interface to delegate {@link Task} or {@link Swimlane} assignment. 2. * 3. * @author Tom Baeyens 4. */ 5.public interface AssignmentHandler extends Serializable { 6. 7. /** sets the actorId and candidates for the given task. */ 8. void assign(Assignable assignable, OpenExecution execution) throws Exception; 9.} /**interfacetodelegate{@linkTask}or{@linkSwimlane}assignment. * *@authorTomBaeyens */ publicinterfaceAssignmentHandlerextendsSerializable{ /**setstheactorIdandcandidatesforthegiventask.*/ voidassign(Assignableassignable,OpenExecutionexecution)throwsException; } 下面给出ME的一个实现: Java代码 1.public class CountersignAssignment implements AssignmentHandler { 2. 3. public void assign(Assignable assignable, OpenExecution execution) throws Exception { 4. // 获得实例ID 5. String pid = execution.getProcessInstance().getId(); 6. // 获得当前的主任务 7. Task task = JbpmUtil.taskService.createTaskQuery().processInstanceId(pid) 8. .activityName(execution.getName()).uniqueResult(); 9. // 创建子任务 10. createSubTasks(task); 11. // 获得会签决策(通过jpdl配置文件中配置的属性) 12. String className = (String) JbpmUtil.taskService.getVariable(task.getId(), 13. "calc.countersignCalculatorImpl"); 14. // 通过会签决策工厂生产获得决策对象 15. CountersignCalculator calculator = CountersignCalculatorFactory 16. .makeCountersignCalculator(className); 17. // 如果是按比例通过的话,需要设定通过人数,或者比例 18. SetCalculatorVars(calculator, task.getId()); 19. // TODO 这里用户采用一个模拟的方式,以后可以通过要整合的系统提供的API 获得用户名字列表 20. CountersignInfo countersignInfo = CountersignInfoFactory.makeCountersignInfo(getUsers(), 21. calculator); 22. // 记录当前的主任务与会签信息 23. Map 24. vars.put("parentTaskId", task.getId()); 25. vars.put("countersignInfo", countersignInfo); 26. JbpmUtil.taskService.setVariables(task.getId(), vars); 27. return; 28. } 29. 30. private void SetCalculatorVars(CountersignCalculator calculator, String taskId) { 31. // 只有按比例会签决策需要设定参数 32. if (calculator instanceof PercentAgreeSign) { 33. // 获取参数 34. Object minAgreeSize = JbpmUtil.taskService.getVariable(taskId, "calc.minAgreeSize"); 35. Object minAgreePercent = JbpmUtil.taskService.getVariable(taskId, 36. "calc.minAgreePercent"); 37. Object userPercent = JbpmUtil.taskService.getVariable(taskId, "calc.userPercent"); 38. // 设定参数 39. PercentAgreeSign calc = (PercentAgreeSign) calculator; 40. if (null ! = minAgreeSize) { 41. calc.setMinAgreeSize((Integer) minAgreeSize); 42. } 43. if (null ! = minAgreePercent) { 44. calc.setMinAgreePrecent((Float) minAgreePercent); 45. } 46. if (null ! = userPercent) { 47. calc.setUserPercent((Boolean) userPercent); 48. } 49. } 50. } 51. 52. private void createSubTasks(Task task) { 53. // OpenTask才有createSubTask方法,Task接口是没有的 54. OpenTask oTask = (OpenTask) task; 55. // 这个对象非常重要,没有它,通过子任务无法跟主任务获得联系 56. Execution execution = JbpmUtil.executionService.findExecutionById(task.getExecutionId()); 57. // 获得所有的参与者 58. for (String assignee : getUsers()) { 59. TaskImpl subTask = (TaskImpl) oTask.createSubTask(); 60. subTask.setAssignee(assignee); 61. subTask.setName(task.getName()); 62. subTask.setFormResourceName(task.getFormResourceName()); 63. // 这句话是关键 只有设定同样的实例 子任务才能获得主任务设定的变量 64.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 Nutz ExtJS JBPM44 实现 会签