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

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

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

不允许为:${deptLeaderPass ==‘false‘}

以下我们看相应的页面内容:

start.form简单的html页面:

<table border="1">
	<tr>
		<td>请假类型:</td>
		<td>
			<select id="leaveType" name="fp_leaveType">
				<option>公休</option>
				<option>病假</option>
				<option>调休</option>
				<option>事假</option>
				<option>婚假</option>
			</select>
		</td>
	</tr>
	<tr>
		<td>開始时间:</td>
		<td><input type="text" id="startTime" name="fp_startTime" class="datetime required" /></td>
	</tr>
	<tr>
		<td>结束时间:</td>
		<td><input type="text" id="endTime" name="fp_endTime" class="datetime required" /></td>
	</tr>
	<tr>
		<td>请假原因:</td>
		<td>
			<textarea id="reason" name="fp_reason"></textarea>
		</td>
	</tr>
</table>

dept-leader-audit.form页面:

<table class=‘view-info‘>
	<tr>
		<td width="100" class="label">申请人:</td>
		<td name="userId">${applyUserId}</td>
	</tr>
	<tr>
		<td class="label">假种:</td>
		<td name="leaveType">${leaveType}</td>
	</tr>
	<tr>
		<td class="label">请假<font color="red">開始</font>时间:</td>
		<td name="startTime">${startTime}</td>
	</tr>
	<tr>
		<td class="label">请假<font color="red">结束</font>时间:</td>
		<td name="endTime">${endTime}</td>
	</tr>
	<tr>
		<td class="label">请假事由:</td>
		<td name="reason">${reason}</td>
	</tr>
	<tr>
		<td class="label">是否允许申请:</td>
		<td>
			<select id="deptLeaderPass" name="fp_deptLeaderPass">
				<option value="true">允许</option>
				<option value="false">驳回</option>
			</select>
		</td>
	</tr>
	<tr id="leaderBackReasonTr">
		<td class="label">驳回理由:</td>
		<td>
			<textarea id="leaderBackReason" name="fp_leaderBackReason"></textarea>
		</td>
	</tr>
</table>

hr-audit.form也相似均是非常easy的HTML页面。

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

/*
	 * 启动流程 启动流程,仅仅考虑首次登录。

首次登录:启动工作流。而且更新/{processDefinitionId} @RequestMapping(value = "get-form/start/{processDefinitionId}")
	 */
	@RequestMapping(value = "/start/{processDefinitionId}")
	public String start(@PathVariable("processDefinitionId") String processDefinitionId,HttpServletRequest request) throws Exception {

		try {
			// 定义map用于往工作流数据库中传值。
			Map<String, String> formProperties = new HashMap<String, String>();
			//启动流程-何静媛-2015年5月24日--processDefinitionId,
			ProcessInstance processInstance = formService
					.submitStartFormData(processDefinitionId,
							formProperties);
			// 返回到显示用户信息的controller
			logger.debug("start a processinstance: {}", processInstance);
			return "redirect:/workflow/auto/get-form/task/"+ processInstance.getId();

		} catch (Exception e) {
			throw e;
		} finally {
			identityService.setAuthenticatedUserId(null);
		}

	}

	/**
	 * 读取Task的表单
	 * @RequestMapping(value = "get-form/task/{processDefinitionkey}")
	 * @PathVariable("processDefinitionkey") String processDefinitionkey
	 */
	@RequestMapping(value = "/get-form/task/{processInstanceId}")
	@ResponseBody
	public ModelAndView findTaskForm(
			@PathVariable("processInstanceId") String processInstanceId,
			HttpServletRequest request) throws Exception {
		ModelAndView mav = new ModelAndView("leave/apply");
		// 获取当前登陆人信息。
		/* User user = UserUtil.getUserFromSession(request.getSession()); */

		TaskQuery taskQuery = taskService.createTaskQuery()
				.processInstanceId(processInstanceId).orderByProcessInstanceId().desc();

		List<Task> tasks = taskQuery.list();
		if (tasks.size()==0) {
			ModelAndView mav2 = new ModelAndView("leave/finish");
			return mav2;
		}
		Task task = tasks.get(0);
		Object renderedTaskForm = formService.getRenderedTaskForm(task.getId());
		System.out.println(renderedTaskForm.toString());
		mav.addObject("renderedTaskForm", renderedTaskForm.toString());//整个页面,參数已经赋值(整个页面是什么时候赋上值的?)
		mav.addObject("taskId", task.getId());
		mav.addObject("processInstanceId", processInstanceId);
		return mav;
	}

	/**
     * 办理任务,提交task的并保存form
     */
    @RequestMapping(value = "task/complete/{taskId}/{processInstanceId}")
    @SuppressWarnings("unchecked")
    public String completeTask(@PathVariable("taskId") String taskId,@PathVariable("processInstanceId") String processInstanceId, RedirectAttributes redirectAttributes, HttpServletRequest request) {

    	Map<String, String> formProperties = new HashMap<String, String>();

        // 从request中读取參数然后转换
        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<Entry<String, String[]>> entrySet = parameterMap.entrySet();
        for (Entry<String, String[]> entry : entrySet) {
            String key = entry.getKey();

      /*
       * 參数结构:fq_reason,用_切割 fp的意思是form paremeter 最后一个是属性名称
       */
            if (StringUtils.defaultString(key).startsWith("fp_")) {
                String[] paramSplit = key.split("_");
                formProperties.put(paramSplit[1], entry.getValue()[0]);
            }
        }

        logger.debug("start form parameters: {}", formProperties);

        try {
            formService.submitTaskFormData(taskId, formProperties);
        } finally {
            identityService.setAuthenticatedUserId(null);
        }

        redirectAttributes.addFlashAttribute("message", "任务完毕:taskId=" + taskId);
        return "redirect:/workflow/auto/get-form/task/"+processInstanceId;

    }

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

Apply.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>申请信息</title>
</head>
<body>
<form name="form1" id="form1" action="${pageContext.request.contextPath}/workflow/auto/task/complete/${taskId}/${processInstanceId}">
		<div style="margin: 0 auto;">${renderedTaskForm}</div>
		 <input type="hidden" name="taskId"
			value="${taskId}">
			<input type="hidden" name="processInstanceId"
			value="${processInstanceId}">
		<div>
			 <table style="margin: auto" width="600">
				<tr>
					<td align="right" >
					<input type="submit"  value="下一步" />
					</td>
				</tr>
			</table>
		</div>
	</form>
</body>
</html>

我们让全部的表单(在没有完毕任务时。均返回到apply.jsp页面中。能够让每一个页面均加入上下一步的button)由于对于完毕来说,全部的任务均相应以上的方法实现。

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

1。外置表单的方式不须要我们建立不论什么实体,全部的数据均存放到工作流的数据库,不论什么业务来了均能够使用,当然工作流也支持保存到工作流库中的数据的全部查询操作,直接调用相应的api就可以。

2,须要我们画简单的html页面,对于提交表单等的操作能够使用js单独来操作,假设加入到jsp或html页面中。工作流表单在运行时是不识别的。会报错误

附录:demo说明

1,改动连接的数据库

2。初始化用户,初始化脚本在src/resources文件夹下

3。訪问地址http://localhost:8080/activitiDemo

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

activiti外置表单demo

时间: 2024-10-13 16:15:51

【应用篇】Activiti外置表单实例demo(四)的相关文章

【应用篇】Activiti外置表单简单应用(三)

Activiti的简单应用,使用外置表单的方式将业务页面绑定到工作流的结点上,当执行到当前结点时,打印出绑定表单的内容. 新建4个form页面,页面内容随便写些内容即可: 按照下图的方式依次绑定: 流程变量设置如图,其他的类似: 对应生成的xml: <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524

Activiti 工作流表单设计及开发

一.前言 Activiti 5对表单的支持目前还是比较弱的,表现在对表单的开发还需要写Freemark模板,并且它的模板还需要跟class文件一起打包发布.这使得流程的表单设计必须由开发人员来开发处理.因而,开发一套易用性强的流程表单功能就显得很有必要. 二.需求 用户一般都希望能有如Microsoft的Office套件中的InfoPath那样,可以自己进行设计,并且能与工作流程绑在一起进行流转处理.如下所示: 表单中每个字段有固定的数据类型,并由不同的数据控件展示,如日期.数字.单选或多选.下

PHP 表单验证 - 完成表单实例

------------------------------------------------------------------------------------------- 本节展示如何在用户提交表单后保留输入字段中的值. ------------------------------------------------------------------------------------------- PHP - 保留表单中的值 如需在用户点击提交按钮后在输入字段中显示值,我们在以下

sharepoint 2013基于AD的Form表单登录(四)——开发自定义登录过程需要引用文件路径。

1.Microsoft.IdentityModel.dll 位置 %ProgramFiles%\ReferenceAssemblies\Windows Identity Foundation\v3.5 2.Microsoft.SharePoint.IdentityModel.dll位置 C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SharePoint.IdentityModel\v4.0_15.0.0.0__71e9bce111e94

表单提交(四)——不能提交表单

Forms and their child elements should not use input names or ids that conflict with properties of a form, such as submit, length, or method. Name conflicts can cause confusing failures. For a complete list of rules and to check your markup for these

第一篇,js表单验证模板

下面是对于一个email的表单验证的基本模板<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <style type="text/css" > .init{ border: 1px solid black; font-weight: bold; } .right{ border: 1px solid green; f

【FunnyBear的Java之旅 - Spring篇】Spring表单验证

尝试对Spring提供的表单进行了验证 1. 创建表单 在jsp页面中添加如下表单.其中action对应我们准备的Controller,commandName用于指定在pageContext中表单所对应的对象.Spring会自动把表单数据填充到对象中.sf:input和sf:error的path对应对象的属性. <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>

vue_表单实例

<div id="app"> <form @submit.prevent="submit"> <div class="field"> 姓名:<input type="text" v-model="user.name"> </div> <div class="field"> 性別: <label> <

form注册表单圆角 demo

form注册表单圆角 <BODY> <div class="form"> <ul class="list"> <li> <label>用户名:</label> <div class="circle-box user"> <input type="text" placeholder="5之6位字母或数字组合"/>