• 2017.2.28 activiti实战--第六章--任务表单(二)外置表单


    学习资料:《Activiti实战》

    第六章 任务表单(二)外置表单

    6.3 外置表单

    考虑到动态表单的缺点(见上节),外置表单使用的更多。

    外置表单的特点:

    1 页面的原样显示
    2 字段值的自动填充

    6.3.1 流程定义

    (1)form文件

     

    leave-start.form作为示例展示(字段要和后面代码中variables变量的key互相对应):

     1 <div class="control-group">
     2     <label class="control-label" for="startDate">开始时间:</label>
     3     <div class="controls">
     4         <input type="text" id="startDate" name="startDate" class="datepicker" data-date-format="yyyy-mm-dd" required />
     5     </div>
     6 </div>
     7 <div class="control-group">
     8     <label class="control-label" for="endDate">结束时间:</label>
     9     <div class="controls">
    10         <input type="text" id="endDate" name="endDate" class="datepicker" data-date-format="yyyy-mm-dd" required />
    11     </div>
    12 </div>
    13 <div class="control-group">
    14     <label class="control-label" for="reason">请假原因:</label>
    15     <div class="controls">
    16         <textarea id="reason" name="reason" required></textarea>
    17     </div>
    18 </div>

    (2)流程文件

    这里只显示部分xml内容,其他的一些见上节动态表单。这里的xml文件只是为了展示外置表单的使用方法。

    基本使用方式就是:activiti:formkey="chapter6/leave-formkey/approve.form" 

    form的值支持动态设置:activiti:formkey="${fooFormName}.form"

     1 <process id="leave-formkey" name="请假流程-外置表单">
     2     <startEvent id="startevent1" name="Start" 
     3                 activiti:initiator="applyUserId"
     4                 activiti:formkey="chapter6/leave-formkey/leave-start.form">
     5     </startEvent>
     6     <userTask id="deptLeaderVerify" name="部门经理审批" 
     7                 activiti:candidateGroups="deptLeader"
     8                 activiti:formkey="chapter6/leave-formkey/approve.form">
     9     </userTask>
    10     <userTask id="hrVerify" name="人事审批" 
    11                 activiti:candidateGroups="hr"
    12                 activiti:formkey="chapter6/leave-formkey/approve.form">
    13     </userTask>
    14     <userTask id="reportBack" name="销假" 
    15                 activiti:assignee="${applyUserId}"
    16                 activiti:formkey="chapter6/leave-formkey/report-back.form">
    17     </userTask>
    18     <userTask id="modifyApply" name="调整申请内容" 
    19                 activiti:assignee="${applyUserId}"
    20                 activiti:formkey="chapter6/leave-formkey/modify-apply.form">
    21     </userTask>
    22     <endEvent id="endevent1" name="End" 
    23     </endEvent>
    24 </process>

    (3)单元测试

    部署表单流程时需要把bpmn文件和form文件同时打包部署。这样部署了同名的form文件时多个流程定义,或相同流程不同版本之间,都不会有冲突。

     1 public class LeaveFormKeyTest extends AbstractTest {
     2 
     3     @Test
     4     @Deployment(resources = {"chapter6/leave-formkey/leave-formkey.bpmn", 
     5             "chapter6/leave-formkey/leave-start.form",
     6             "chapter6/leave-formkey/approve-deptLeader.form", 
     7             "chapter6/leave-formkey/approve-hr.form", 
     8             "chapter6/leave-formkey/report-back.form",
     9             "chapter6/leave-formkey/modify-apply.form"})
    10 
    11     public void allPass() throws Exception {
    12         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    13         Map<String, String> variables = new HashMap<String, String>();
    14         Calendar ca = Calendar.getInstance();
    15         String startDate = sdf.format(ca.getTime());
    16         ca.add(Calendar.DAY_OF_MONTH, 2); // 当前日期加2天
    17         String endDate = sdf.format(ca.getTime());
    18 
    19         // 启动流程
    20         variables.put("startDate", startDate);
    21         variables.put("endDate", endDate);
    22         variables.put("reason", "公休");
    23 
    24         ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
    25 
    26         // 读取启动表单
    27         Object renderedStartForm = formService.getRenderedStartForm(processDefinition.getId());
    28         assertNotNull(renderedStartForm);
    29 
    30         // 启动流程
    31         // 设置当前用户
    32         String currentUserId = "henryyan";
    33         identityService.setAuthenticatedUserId(currentUserId);
    34         ProcessInstance processInstance = formService.submitStartFormData(processDefinition.getId(), variables);
    35         assertNotNull(processInstance);
    36 
    37         // 部门领导审批通过
    38         Task deptLeaderTask = taskService.createTaskQuery().taskCandidateGroup("deptLeader").singleResult();
    39         assertNotNull(formService.getRenderedTaskForm(deptLeaderTask.getId()));
    40         variables = new HashMap<String, String>();
    41         variables.put("deptLeaderApproved", "true");
    42         formService.submitTaskFormData(deptLeaderTask.getId(), variables);
    43 
    44         // 人事审批通过
    45         Task hrTask = taskService.createTaskQuery().taskCandidateGroup("hr").singleResult();
    46         assertNotNull(formService.getRenderedTaskForm(hrTask.getId()));// 读取任务表单
    47         variables = new HashMap<String, String>();
    48         variables.put("hrApproved", "true");
    49         formService.submitTaskFormData(hrTask.getId(), variables);
    50 
    51         // 销假(根据申请人的用户ID读取)
    52         Task reportBackTask = taskService.createTaskQuery().taskAssignee(currentUserId).singleResult();
    53         assertNotNull(formService.getRenderedTaskForm(reportBackTask.getId()));
    54         variables = new HashMap<String, String>();
    55         variables.put("reportBackDate", sdf.format(ca.getTime()));
    56         formService.submitTaskFormData(reportBackTask.getId(), variables);
    57 
    58         // 验证流程是否已经结束
    59         HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().finished().singleResult();
    60         assertNotNull(historicProcessInstance);
    61 
    62         // 读取历史变量
    63         Map<String, Object> historyVariables = packageVariables(processInstance);
    64 
    65         // 验证执行结果
    66         assertEquals("ok", historyVariables.get("result"));
    67 
    68     }
    69 ...
    70 }

    6.3.2 自定义表单引擎

    activiti既可以可以支持B/S结构的应用,也可以支持C/S结构的应用。getRenderd***Form()返回的内容是经过activiti的默认Form引擎处理过的,返回的值可以让B/S结构的应用直接使用,但是却不能直接支持C/S结构的应用。所以如果要生成C/S程序需要的java控件,需要事先自定义的form引擎

    这一块暂时用不到,略过。

    6.3.3 读取流程启动表单

    Activiti Explorer支持动态表单,却不支持外置表单。所以需要为Activiti Explorer增加外置表单支持。

  • 相关阅读:
    生命中的另一口井
    sqlldr使用小记
    字节单位介绍
    《Java虚拟机》随笔记01
    Python生成器实现杨辉三角打印
    什么是递归?用十进制转二进制的Python函数示例说明
    Python的filter与map内置函数
    Python内置函数property()使用实例
    Python装饰器的理解
    Python迭代与递归方法实现斐波拉契数列
  • 原文地址:https://www.cnblogs.com/lyh421/p/6483125.html
Copyright © 2020-2023  润新知