【应用篇】Activiti外置表单实例demo(四)

在这里我想说的外置表单,是说我们将我们自己的jsp.form.html)等页面上传到工作流的数据库中,当任务执行到当前结点时,给我们像前台发送绑定好的表单。

 

此处是给表单绑定表单的过程





不同意为:${deptLeaderPass =='false'}

 

下面我们看对应的页面内容:

 

start.form简单的html页面:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <table border="1">  
  2.     <tr>  
  3.         <td>请假类型:</td>  
  4.         <td>  
  5.             <select id="leaveType" name="fp_leaveType">  
  6.                 <option>公休</option>  
  7.                 <option>病假</option>  
  8.                 <option>调休</option>  
  9.                 <option>事假</option>  
  10.                 <option>婚假</option>  
  11.             </select>  
  12.         </td>  
  13.     </tr>  
  14.     <tr>  
  15.         <td>开始时间:</td>  
  16.         <td><input type="text" id="startTime" name="fp_startTime" class="datetime required" /></td>  
  17.     </tr>  
  18.     <tr>  
  19.         <td>结束时间:</td>  
  20.         <td><input type="text" id="endTime" name="fp_endTime" class="datetime required" /></td>  
  21.     </tr>  
  22.     <tr>  
  23.         <td>请假原因:</td>  
  24.         <td>  
  25.             <textarea id="reason" name="fp_reason"></textarea>  
  26.         </td>  
  27.     </tr>  
  28. </table>  

dept-leader-audit.form页面:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <table class='view-info'>  
  2.     <tr>  
  3.         <td width="100" class="label">申请人:</td>  
  4.         <td name="userId">${applyUserId}</td>  
  5.     </tr>  
  6.     <tr>  
  7.         <td class="label">假种:</td>  
  8.         <td name="leaveType">${leaveType}</td>  
  9.     </tr>  
  10.     <tr>  
  11.         <td class="label">请假<font color="red">开始</font>时间:</td>  
  12.         <td name="startTime">${startTime}</td>  
  13.     </tr>  
  14.     <tr>  
  15.         <td class="label">请假<font color="red">结束</font>时间:</td>  
  16.         <td name="endTime">${endTime}</td>  
  17.     </tr>  
  18.     <tr>  
  19.         <td class="label">请假事由:</td>  
  20.         <td name="reason">${reason}</td>  
  21.     </tr>  
  22.     <tr>  
  23.         <td class="label">是否同意申请:</td>  
  24.         <td>  
  25.             <select id="deptLeaderPass" name="fp_deptLeaderPass">  
  26.                 <option value="true">同意</option>  
  27.                 <option value="false">驳回</option>  
  28.             </select>  
  29.         </td>  
  30.     </tr>  
  31.     <tr id="leaderBackReasonTr">  
  32.         <td class="label">驳回理由:</td>  
  33.         <td>  
  34.             <textarea id="leaderBackReason" name="fp_leaderBackReason"></textarea>  
  35.         </td>  
  36.     </tr>  
  37. </table>  

hr-audit.form也类似均是很简单的HTML页面。

 

对应的核心工作流实现代码:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.      * 启动流程 启动流程,只考虑首次登录。 首次登录:启动工作流,并且更新/{processDefinitionId} @RequestMapping(value = "get-form/start/{processDefinitionId}") 
  3.      */  
  4.     @RequestMapping(value = "/start/{processDefinitionId}")   
  5.     public String start(@PathVariable("processDefinitionId") String processDefinitionId,HttpServletRequest request) throws Exception {  
  6.   
  7.         try {             
  8.             // 定义map用于往工作流数据库中传值。  
  9.             Map<String, String> formProperties = new HashMap<String, String>();                       
  10.             //启动流程-何静媛-2015年5月24日--processDefinitionId,  
  11.             ProcessInstance processInstance = formService  
  12.                     .submitStartFormData(processDefinitionId,  
  13.                             formProperties);  
  14.             // 返回到显示用户信息的controller           
  15.             logger.debug("start a processinstance: {}", processInstance);             
  16.             return "redirect:/workflow/auto/get-form/task/"+ processInstance.getId();  
  17.               
  18.         } catch (Exception e) {     
  19.             throw e;   
  20.         } finally {  
  21.             identityService.setAuthenticatedUserId(null);  
  22.         }  
  23.           
  24.   
  25.     }  
  26.       
  27.     /** 
  28.      * 读取Task的表单 
  29.      * @RequestMapping(value = "get-form/task/{processDefinitionkey}") 
  30.      * @PathVariable("processDefinitionkey") String processDefinitionkey 
  31.      */  
  32.     @RequestMapping(value = "/get-form/task/{processInstanceId}")  
  33.     @ResponseBody  
  34.     public ModelAndView findTaskForm(  
  35.             @PathVariable("processInstanceId") String processInstanceId,  
  36.             HttpServletRequest request) throws Exception {  
  37.         ModelAndView mav = new ModelAndView("leave/apply");  
  38.         // 获取当前登陆人信息。  
  39.         /* User user = UserUtil.getUserFromSession(request.getSession()); */  
  40.           
  41.         TaskQuery taskQuery = taskService.createTaskQuery()  
  42.                 .processInstanceId(processInstanceId).orderByProcessInstanceId().desc();  
  43.                   
  44.         List<Task> tasks = taskQuery.list();  
  45.         if (tasks.size()==0) {  
  46.             ModelAndView mav2 = new ModelAndView("leave/finish");  
  47.             return mav2;  
  48.         }  
  49.         Task task = tasks.get(0);  
  50.         Object renderedTaskForm = formService.getRenderedTaskForm(task.getId());  
  51.         System.out.println(renderedTaskForm.toString());  
  52.         mav.addObject("renderedTaskForm", renderedTaskForm.toString());//整个页面,参数已经赋值(整个页面是什么时候赋上值的?)  
  53.         mav.addObject("taskId", task.getId());  
  54.         mav.addObject("processInstanceId", processInstanceId);  
  55.         return mav;  
  56.     }  
  57.   
  58.     /** 
  59.      * 办理任务,提交task的并保存form 
  60.      */  
  61.     @RequestMapping(value = "task/complete/{taskId}/{processInstanceId}")  
  62.     @SuppressWarnings("unchecked")  
  63.     public String completeTask(@PathVariable("taskId") String taskId,@PathVariable("processInstanceId") String processInstanceId, RedirectAttributes redirectAttributes, HttpServletRequest request) {  
  64.           
  65.         Map<String, String> formProperties = new HashMap<String, String>();  
  66.   
  67.         // 从request中读取参数然后转换  
  68.         Map<String, String[]> parameterMap = request.getParameterMap();  
  69.         Set<Entry<String, String[]>> entrySet = parameterMap.entrySet();  
  70.         for (Entry<String, String[]> entry : entrySet) {  
  71.             String key = entry.getKey();  
  72.   
  73.       /* 
  74.        * 参数结构:fq_reason,用_分割 fp的意思是form paremeter 最后一个是属性名称 
  75.        */  
  76.             if (StringUtils.defaultString(key).startsWith("fp_")) {  
  77.                 String[] paramSplit = key.split("_");  
  78.                 formProperties.put(paramSplit[1], entry.getValue()[0]);  
  79.             }  
  80.         }  
  81.   
  82.         logger.debug("start form parameters: {}", formProperties);  
  83.   
  84.         try {  
  85.             formService.submitTaskFormData(taskId, formProperties);  
  86.         } finally {  
  87.             identityService.setAuthenticatedUserId(null);  
  88.         }  
  89.   
  90.         redirectAttributes.addFlashAttribute("message""任务完成:taskId=" + taskId);  
  91.         return "redirect:/workflow/auto/get-form/task/"+processInstanceId;  
  92.          
  93.     }  
  94.   
  95.       

那么对应的提交表单的方式怎么实现的呢?

 

Apply.jsp

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>申请信息</title>   
  8. </head>  
  9. <body>  
  10. <form name="form1" id="form1" action="${pageContext.request.contextPath}/workflow/auto/task/complete/${taskId}/${processInstanceId}">  
  11.         <div style="margin: 0 auto;">${renderedTaskForm}</div>   
  12.          <input type="hidden" name="taskId"  
  13.             value="${taskId}">  
  14.             <input type="hidden" name="processInstanceId"  
  15.             value="${processInstanceId}">  
  16.         <div>  
  17.              <table style="margin: auto" width="600">  
  18.                 <tr>            
  19.                     <td align="right" >  
  20.                     <input type="submit"  value="下一步" />  
  21.                     </td>  
  22.                 </tr>  
  23.             </table>   
  24.         </div>   
  25.     </form>   
  26. </body>  
  27. </html>  


我们让所有的表单(在没有完成任务时,均返回到apply.jsp页面中,可以让每个页面均添加上下一步的按钮)因为对于完成来说,所有的任务均对应以上的方法实现。

 

 

总结:使用这种外置表单的方式相比我们静态表单的方式有什么区别呢?

1,外置表单的方式不需要我们建立任何实体,所有的数据均存放到工作流的数据库,任何业务来了均可以使用,当然工作流也支持保存到工作流库中的数据的所有查询操作,直接调用相应的api即可。

2,需要我们画简单的html页面,对于提交表单等的操作可以使用js单独来操作,如果添加到jsphtml页面中,工作流表单在执行时是不识别的,会报错误

 

附录:demo说明

1,修改连接的数据库

2,初始化用户,初始化脚本在src/resources目录下

3,访问地址http://localhost:8080/activitiDemo

4,登录后,需要部署流程才可以使用,流程文件在diagrams文件夹下,打成压缩包上传即可。

 

activiti外置表单demo


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值