之前实现的动态表单的启动功能,现在把审核功能也做个总结。
审核流程界面 最终效果图:
主要需要实现的是一下功能点:
1. 列表页面
1.1.待办任务页面。列表中显示当前用户可以处理的流程。
1.2.运行中的流程。列表中显示当前用户 待办 或者 参与过并且未结束 的流程。
1.3.已结束的流程。列表中显示当前用户 参与过并且已结束 的流程。
2.审核页面
2.1 审核列表。 显示流程审核节点的流程中相关审核情况。根据是是待办人决定是否显示 审核操作里的 【通过】 【退回】等按钮。非待办人不能操作流程。
2.2 具体业务的动态表单。根据节点配置的表单属性配置显示动态表单。类是启动流程功能里的start节点配置。同一流程实例不同审核人可以根据配置的不同显示不同的业务表单。如上面图片中的任务分配节点可以配置一个任务分配的下拉框。这个下拉框控件只在任务分配节点显示,其他节点则不会显示。
待办任务页面点击任务连接进入审核页面具体实现:
ProcInstController.java
/** * 审核流程页面 */ @RequestMapping(value = "index") public String index(Model model,String pid,RedirectAttributes attr) { String pageUrl = ""; ProcInst pi = procInstService.getEntityById(pid); //动态表单,外置表单,普通表单(普通表单使用c_前缀,外置表单使用ex_前缀,其他的是动态表单)。参考procDefList.jsp页面 ProcDef pd = procDefService.getEntityById(pi.getProcDefId()); pi.setProcDef(pd); if(pd.getKey().indexOf("c_") == 0){
//普通表单 }else if(pd.getKey().indexOf("ex_") == 0){
//外置表单 //外置表单, 与动态表单不同的是根据表单key获取事先定义好的表单,不需要系统自动生成。 }else { //动态表单 List<FormAttr> formAttrlist = procInstService.getFormAttrList(pi); model.addAttribute("pi", pi); model.addAttribute("formAttrlist", formAttrlist); //审核流程列表 List<TaskInst> tasks = taskInstService.getTaskList(pi.getId()); model.addAttribute("tasks",tasks); model.addAttribute("tasksSize",tasks.size()); //流程变量 List<HistoricVariableInstance> varList = historyService.createHistoricVariableInstanceQuery().processInstanceId(pi.getId()).list(); Map<String,Object> varMap = new HashMap<String,Object>(); for (HistoricVariableInstance variableInstance : varList) { varMap.put(variableInstance.getVariableName(), variableInstance.getValue()); } model.addAttribute("varMap",varMap); pageUrl = "/system/workflow/hi/reviewed"; } return pageUrl; }
reviewed.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><!DOCTYPE html ><html><head><title>启动流程</title><%@include file="/common/base.jsp"%><script type="text/javascript"> $(function(){ $('input[type="checkbox"]').each(function(index,element){ $(element).click(function(){ element.value = element.checked; }); }) $('.easyui-datebox').each(function(index,element){ if($(element).attr("defaultVal")){ $(element).datebox('setValue', $(element).attr("defaultVal")); } }) $('#dg').datagrid(); $('#dg').remove(); }) function startProc(){ $('#fm').mySubmit({ url : 'backstage/workflow/hi/startProc', success: function(res){ closeWin(); } }); } function completeTask(){ $('#fm').mySubmit({ url : 'workflow/hi/ProcInstController/completeTask', success: function(res){ closeWin(); } }); } function closeWin(){ //关闭easyui弹出窗口 parent.window.$(".panel-tool-close").click(); //关闭layer弹出窗口 var index = parent.layer.getFrameIndex(window.name); //获取窗口索引 parent.layer.close(index); }</script><style type="text/css">.fitem { margin: 5px;}.fitem label { display: inline-block; width: 120px; text-align: right;}</style></head><body> <div class="ftitle" style="text-align: center; font-size: 26px; padding: 5px;">${pd.name }</div> <form id="fm" method="post">