框架 day57 BOS项目练习(流程定义/实例管理,bos用户角色同步activiti用户表组表)

BOS项目笔记第11天

内容:

1、提供新的json文件,修改系统菜单(加入工作流的菜单)

2、流程定义管理(查询、部署流程、查看png流程图片)

3、流程实例管理(查询、查看运行状态)

4、将bos系统中的用户数据和角色数据同步到activiti的用户表和组表

1.    提供新的json文件,修改系统菜单(加入工作流的菜单)

2.    流程定义管理

第一步:创建一个ProcessDefinitionAction,提供list方法,并注入流程引擎对象

 查询

@Controller
@Scope("prototype")
public class ProcessDefinitionAction extends ActionSupport {
	@Resource
	private ProcessEngine processEngine;

	/**
	 * 查询最新版本的流程定义列表数据
	 */
	public String list() {
		ProcessDefinitionQuery query = processEngine.getRepositoryService()
				.createProcessDefinitionQuery();
		query.latestVersion();
		List<ProcessDefinition> list = query.list();
		// 压栈
		ActionContext.getContext().getValueStack().set("list", list);
		return "list";
	}

第二步:配置struts.xml

第三步:提供processdefinition_list.jsp页面,展示流程定义数据

<body class="easyui-layout">
  <div region="center" >
  	<table id="grid" class="easyui-datagrid">
  		<thead>
  			<tr>
  				<th data-options="field:'id'" width="120">流程编号</th>
  				<th data-options="field:'name'" width="200">流程名称</th>
  				<th data-options="field:'key'" width="100">流程key</th>
  				<th data-options="field:'version'" width="80">版本号</th>
  				<th data-options="field:'viewpng'" width="200">查看流程图</th>
  			</tr>
  		</thead>
  		<tbody>
  				<s:iterator value="list" var="processDefinition">
  					<!-- 在循环过程中 ,将  processDefinition 对象,同时放入 root 和 map 中-->
  				<tr>
  					<td>
  						<s:property value="id"/> <!-- 从root找 -->
  						<%--
  						<s:property value="#processDefinition.id"/> <!-- 从map找 -->
  						 --%>

  					</td>
  					<td><s:property value="name"/>
  					</td>
  					<td><s:property value="key"/></td>
  					<td><s:property value="version"/></td>
  					<td>
  						<a onclick="window.showModalDialog('processDefinitionAction_showpng.action?pdId=${id }')"
  						 class="easyui-linkbutton" data-options="iconCls:'icon-search'">查看流程图
  						</a>
  					</td>
  				</tr>
  				</s:iterator>
  		</tbody>
  	</table>
  </div>

2.1   部署流程定义

第一步:提供文件上传的页面

<s:form action="processDefinitionAction_deploy" theme="simple" method="post"
	 enctype="multipart/form-data" id="uploadForm">
	<table class="table-edit" width="100%" >
		<tr class="title"><td colspan="2">发布新流程</td></tr>
		<tr>
			<td width="200">浏览流程定义zip压缩文件</td>
			<td>
				<input type="file" name="deploy" />
			</td>
		</tr>
		<tr>
			<td colspan="2">
				<a id="btn" href="javascript:$('#uploadForm').submit();"
				class="easyui-linkbutton" data-options="iconCls:'icon-save'">发布新流程</a>
			</td>
		</tr>
	</table>
</s:form>

第二步:在ProcessDefinitionAction中提供deploy方法,提供File类型的属性deploy

	// 接收上传的文件
	private File deploy;// zip文件
	public void setDeploy(File deploy) {
		this.deploy = deploy;
	}
	/**
	 * 部署流程定义
	 *
	 * @throws Exception
	 */
	public String deploy() throws Exception {
		DeploymentBuilder deploymentBuilder = processEngine
				.getRepositoryService().createDeployment();
		ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(
				deploy));
		deploymentBuilder.addZipInputStream(zipInputStream);
		deploymentBuilder.deploy();
		return "toList";
	}

第三步:配置struts.xml

2.2   查看流程图片

第一步:修改processdefintion_list.jsp页面中链接按钮的地址

  						<a onclick="window.showModalDialog('processDefinitionAction_showpng.action?pdId=${id }')"
  						 class="easyui-linkbutton" data-options="iconCls:'icon-search'">查看流程图
  						</a>

第二步:在Action中提供showpng方法,获取对应的png图片的输入流

	//接收流程定义ID
	private String pdId;
	public void setPdId(String pdId) {
		this.pdId = pdId;
	}
	/**
	 * 查看png图片
	 */
	public String showpng(){
		//processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);
		InputStream pngStream = processEngine.getRepositoryService().getProcessDiagram(pdId);
		ActionContext.getContext().getValueStack().set("pngStream", pngStream);
		//使用struts2的文件下载功能展示png图片
		return "showpng";
	}

第三步:配置struts.xml

		<!-- 流程定义管理Action -->
		<action name="processDefinitionAction_*" class="processDefinitionAction"
			method="{1}">
			<result name="list">/WEB-INF/pages/workflow/processdefinition_list.jsp
			</result>
			<!-- <result name="toList" type="redirectAction"> <param name="namespace">/</param>
				<param name="actionName">processDefinitionAction_list</param> </result> -->
			<result name="toList" type="redirectAction">
				processDefinitionAction_list
			</result>
			<result name="showpng" type="stream">
				<param name="contentType">image/png</param>
				<param name="inputName">pngStream</param>
				<!--
				<param name="contentDisposition">attachment;filename="document.pdf"</param>
				<param name="bufferSize">1024</param>
				 -->
			</result>
		</action>

3.    流程实例管理

3.1   查看正在运行的流程实例

第一步:创建ProcessInstanceAction,提供list方法,查询流程实例列表数据

@Controller
@Scope("prototype")
public class ProcessInstanceAction extends ActionSupport {
	@Autowired
	private ProcessEngine processEngine;

	/**
	 * 查询正在运行的流程实例数据
	 */
	public String list() {
		// 流程实例查询对象,查询表act_ru_execution
		ProcessInstanceQuery query = processEngine.getRuntimeService()
				.createProcessInstanceQuery();
		query.orderByProcessDefinitionKey().desc();
		List<ProcessInstance> list = query.list();
		ActionContext.getContext().getValueStack().set("list", list);
		return "list";
	}

第二步:配置struts.xml

第三步:提供processinstance_list.jsp页面,展示列表数据

<body class="easyui-layout">
   <div region="center">
   	  <table id="grid" class="easyui-datagrid">
   	  	<thead>
  			<tr>
  				<th data-options="field:'id'" width="60">实例编号</th>
  				<th data-options="field:'name'" width="150">流程定义编号</th>
  				<th data-options="field:'activity'" width="150">运行到哪个任务</th>
  				<th data-options="field:'viewRuntime'" width="500">业务数据</th>
  				<th data-options="field:'viewpng'" width="200">查看流程图</th>
  			</tr>
  		</thead>
  		<tbody>
  			<s:iterator value="list">
  				<tr>
  					<td>${id }</td>
  					<td>${processDefinitionId }</td>
  					<td>${activityId }</td>
  					<td>
  						<div id="div${id }"></div>
  						<script type="text/javascript">
  							//根据流程实例id查询流程变量
  							$.post("${pageContext.request.contextPath}/processInstanceAction_findData.action",{"id":'${id}'},function(data){
  								$("#div${id}").html(data);
  							});
  						</script>
  					</td>
  					<td>
  						<script type="text/javascript">
  							function showPng(id){
  								window.showModalDialog("processInstanceAction_showPng.action?id="+id);
  							}
  						</script>
  						<a data-options="iconCls:'icon-search'" class="easyui-linkbutton"
  						onclick="showPng('${id}');" href="#">查看流程图</a>
  					</td>
  				</tr>
  			</s:iterator>
  		</tbody>
   	  </table>
   </div>
</body>

第四步:在Action中提供findData方法,根据流程实例ID查询对应的流程变量

	// 接收流程实例ID
	private String id;
	public void setId(String id) {
		this.id = id;
	}
	/**
	 * 根据流程实例ID查询流程变量
	 *
	 * @throws IOException
	 */
	public String findData() throws IOException {
		Map<String, Object> variables = processEngine.getRuntimeService()
				.getVariables(id);
		ServletActionContext.getResponse().setContentType(
				"text/html;charset=UTF-8");
		ServletActionContext.getResponse().getWriter().print(variables);
		return NONE;
	}

3.2   查询流程实例运行状态(图片显示)

第一步:在流程实例列表页面,修改链接按钮的地址

效果

第二步:在Action中提供showPng方法,查询部署ID,图片名称,任务坐标

	/**
	 * 流程任务获取图片数据
	 *
	 * @return
	 */
	public String showPng() {
		// 通过流程实例获取流程定义id
		ProcessInstance processInstance = processEngine.getRuntimeService()
				.createProcessInstanceQuery().processInstanceId(id)
				.singleResult();
		String processDefinitionId = processInstance.getProcessDefinitionId();
		// 通过流程定义id获取流程定义对象,然后获取部署id和图片名称
		ProcessDefinition processDefinition = processEngine
				.getRepositoryService().createProcessDefinitionQuery()
				.processDefinitionId(processDefinitionId).singleResult();
		String deploymentId = processDefinition.getDeploymentId();
		String imageName = processDefinition.getDiagramResourceName();
		// 通过流程定义id获取详细(包含坐标)的流程定义对象
		ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) processEngine
				.getRepositoryService().getProcessDefinition(
						processDefinitionId);
		String activityId = processInstance.getActivityId();
		//通过活动id获取活动(当前任务)对象
		ActivityImpl activityImpl = processDefinitionEntity.findActivity(activityId);
		//获取图片参数
		int x = activityImpl.getX();
		int y = activityImpl.getY();
		int height = activityImpl.getHeight();
		int width = activityImpl.getWidth();
		//把所有参数都放到值栈
		Map<String,Object> map=new HashMap<String, Object>();
		map.put("deploymentId", deploymentId);
		map.put("imageName", imageName);
		map.put("x", x);
		map.put("y", y);
		map.put("height", height);
		map.put("width", width);
		ActionContext.getContext().getValueStack().push(map);
		return "image";
	}

提取工具类:ActivitiUtils

public class ActivitiUtils {
	public static Map<String, Object> findDataByInstanceId(
			ProcessEngine processEngine, String id) {
		// 查询部署ID、png图片名称、当前流程任务的坐标
		ProcessInstanceQuery query = processEngine.getRuntimeService()
				.createProcessInstanceQuery();
		// 根据流程实例ID查询流程实例对象
		query.processInstanceId(id);
		ProcessInstance processInstance = query.singleResult();

		// 根据流程实例对象查询流程定义ID
		String processDefinitionId = processInstance.getProcessDefinitionId();
		// 根据流程定义ID查询流程定义对象
		ProcessDefinitionQuery query2 = processEngine.getRepositoryService()
				.createProcessDefinitionQuery();
		query2.processDefinitionId(processDefinitionId);
		ProcessDefinition processDefinition = query2.singleResult();

		// 获得当前流程实例执行到那个任务了
		String activityId = processInstance.getActivityId();// usertask2

		// 根据流程定义ID查询流程定义对象(包含有坐标信息)
		ProcessDefinitionEntity processDefinition2 = (ProcessDefinitionEntity) processEngine
				.getRepositoryService().getProcessDefinition(
						processDefinitionId);
		ActivityImpl activityImpl = processDefinition2.findActivity(activityId);
		int x = activityImpl.getX();
		int y = activityImpl.getY();
		int width = activityImpl.getWidth();
		int height = activityImpl.getHeight();

		Map<String, Object> map = new HashMap<String, Object>();
		map.put("deploymentId", processDefinition.getDeploymentId());
		map.put("imageName", processDefinition.getDiagramResourceName());
		map.put("x", x);
		map.put("y", y);
		map.put("width", width);
		map.put("height", height);
		return map;
	}
}

第三步:配置struts.xml

第四步:提供image.jsp页面,展示图片和div

<body>
<!-- 1.获取到规则流程图 -->
<img style="position: absolute;top: 0px;left: 0px;"
	 src="processInstanceAction_viewImage?deploymentId=${deploymentId }&imageName=${imageName}">

<!-- 2.根据当前活动的坐标,动态绘制DIV -->
<div style="position: absolute;border:1px solid red;
	top:${y-1}px;left:${x-1}px;width:${width}px;height:${height}px;">
</div>
</body>

第五步:在Action中提供viewImage方法,查询png图片的输入流

	//接收图片src传递过来的参数
	String deploymentId;
	String imageName;

	public void setDeploymentId(String deploymentId) {
		this.deploymentId = deploymentId;
	}

	public void setImageName(String imageName) {
		this.imageName = imageName;
	}

	/**
	 * 查询png图片的输入流,展示图片
	 */
	public String viewImage() {
		InputStream pngStream = processEngine.getRepositoryService()
				.getResourceAsStream(deploymentId, imageName);
		ActionContext.getContext().getValueStack().set("pngStream", pngStream);
		return "viewImage";
	}

第六步:配置struts.xml,使用文件下载

		<!-- 流程实例管理Action -->
		<action name="processInstanceAction_*" class="processInstanceAction" method="{1}">
			<result name="list">/WEB-INF/pages/workflow/processinstance_list.jsp</result>
			<result name="showPng">//WEB-INF/pages/workflow/image.jsp</result>
			<result name="viewImage" type="stream">
				<param name="contentType">image/png</param>
				<param name="inputName">pngStream</param>
			</result>
		</action>

4.    将bos系统中的用户和组同步到activiti中

    同步用户

	//添加用户,同步到activiti的act_id_user  act_id_mebership
	public void save(User user, String[] roleIds) {
		String password = user.getPassword();
		//使用md5加密
		password = MD5Utils.md5(password);
		user.setPassword(password);
		userDao.save(user);//持久对象
		//添加activiti UserEntity
		org.activiti.engine.identity.User actUser = new UserEntity();
		actUser.setId(user.getId());
		processEngine.getIdentityService().saveUser(actUser);//操作act_id_user
		for (String id : roleIds) {
			Role role = roleDao.findById(id);
			//用户关联角色
			user.getRoles().add(role);
			//将ac用户加入到ac组中 role.getName()使用角色名字做为组ID方便阅读
			processEngine.getIdentityService().createMembership(actUser.getId(), role.getName());
		}
	}

    同步组

	//保存角色,同步到activiti的act_id_group
	public void save(Role model, String funcitonIds) {
		roleDao.save(model);//持久对象
		//创建ac组并添加
		Group group = new GroupEntity();
		group.setId(model.getName());
		group.setName(model.getName());
		processEngine.getIdentityService().saveGroup(group );
		String[] ids = funcitonIds.split(",");
		for (String id : ids) {
			Function function = new Function();
			function.setId(id);
			model.getFunctions().add(function);//角色关联权限
		}
	}
时间: 2024-10-20 20:23:19

框架 day57 BOS项目练习(流程定义/实例管理,bos用户角色同步activiti用户表组表)的相关文章

【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 (13)客户管理

声明:本系列为原创,分享本人现用框架,未经本人同意,禁止转载!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技术和项目,都毫无保留的提供,希望大家能自己跟着做一套,还有,请大家放心,只要大家喜欢,有人需要,绝对不会烂尾,我会坚持写完~ 如果你感觉文章有帮助,点一下推荐,让更多的朋友参与进来,也是对本人劳动成果的鼓励,谢谢大家!由于还要工作,所以基本都是牺牲午休时间来写博客的,写博客呢不是简单的Ctrl+C.Ctrl+V,我是要挨着做一遍的,这也是对大家负责

BOS项目 第10天(activiti工作流第二天,流程变量、组任务、排他网关、spring整合activiti、项目中实现流程定义管理)

BOS项目笔记 第10天 今天内容安排: 1.流程变量(设置.获取) 2.组任务(候选人.候选组) 3.排他网关使用 4.spring整合activiti 5.将activiti应用到bos项目中 6.在bos项目中实现流程定义管理(部署.查询.查看png.删除) 1. 流程变量 1.1 设置流程变量的方式 l 方式一:启动流程实例时设置 l 方式二:办理任务时设置 l 方式三:使用RuntimeService的set方法设置 l 方式四:使用TaskService的set方法设置 注意:如果设

框架 day55 BOS项目练习(工作流,activiti入门)

BOS项目笔记第9天 内容: 1.工作流概念 2.安装eclipse插件(工作流流程设计器插件) 3.创建activiti框架提供的数据库表结构(23张表) 4.学习工作流框架API,操作流程 1.    工作流概念 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现".(按照某种预定义的规则来执

BOS项目 第12天(总结)

BOS项目笔记 第12天 1. 项目复习 1.1 项目第一天 l 项目概述 l 搭建环境(数据库.web项目) l easyUI 1.layout页面布局 2.accordion折叠面板 <div class="easyui-accordion" data-options="fit:true"> <div title="面板一"></div> <div titlte="面板二">

工作流笔记第二天_流程定义的CRUD

0.流程定义的表 -- Deployment 部署对象和流程定义相关的表-- 1.一次部署的多个文件的信息,对于不需要的流程可以删除或修改select * FROM act_re_deployment; -- 部署对象表select * FROM act_re_procdef; -- 流程定义表select * FROM act_ge_bytearray; -- 资源文件表select * FROM act_ge_property; -- 主键生成策略表,下一个流程的编号 1.部署流程定义的三种

框架 day56 BOS项目练习(activiti,历史数据操作,流程变量,任务组,监听器,网关,spring整合)

BOS项目笔记第10天 内容: 1.历史数据查询(历史流程实例数据.历史任务数据.历史活动数据) 2.流程变量 3.组任务(候选人.候选组) 4.监听器(执行.任务) 5.网关(排他.并行) 6.spring整合activiti 1.    历史数据查询 历史是一个组件,它可以捕获发生在进程执行中的信息并永久的保存,与运行时数据不同的是,当流程实例运行完成之后它还会存在于数据库中. 在流程引擎配置对象中可以设置历史记录规则: 1.1   查询历史流程实例数据 表中内容包含已经完成的流程和正在进行

框架 day58 BOS项目练习(基于activiti物流配送流程,启动,查询,办理,项目知识点复习)

BOS项目笔记第12天 内容: 1.设计物流配送流程 2.启动物流配送流程 3.查询组任务.拾取组任务 4.查询个人任务.办理个人任务 1.    设计物流配送流程     物流配送流程 基于组任务进行任务分配.使用排他网关,分支选择使用流程变量实现 Activiti图形界面中: Process的Id值 对应流程定义表中的key值,可以用于启动最新版本的流程实例 任务节点中: General的 Id值对应任务表中的Task_def_key既 taskDefinitionKey值,用于定义项目中

BOS项目 第11天(activiti工作流第三天,流程实例管理、项目中的用户和角色同步到activiti的用户和组表、设计物流配送流程、启动物流配送流程、组任务操作(查询、拾取)、个人任务操作(查询、办理))

BOS项目笔记 第11天 今天内容安排: 1.流程实例管理(查询.查看运行状态) 2.将bos系统中的用户和角色同步到activiti的用户和组表 3.设计物流配送流程 4.启动物流配送流程 5.组任务操作(查询.拾取) 6.个人任务操作(查询.办理) 1. 流程实例管理 1.1 查询流程实例列表 第一步:创建一个流程实例管理Action,提供list方法,查询流程实例列表数据 第二步:配置struts.xml 第三步:提供processinstance.jsp页面,展示列表数据 <s:iter

BOS项目 第9天(activiti工作流第一天,工作流概念、工作流所需要的23张表、eclipse安装流程设计插件、流程api基本操作)

BOS项目笔记 第9天 今天内容安排: 1.工作流概念 2.安装流程设计器插件(eclipse)----设计流程图 3.创建activiti数据库(23张表) 4.activiti的API操作流程 1. 工作流概念 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现". 工作流管理系统(Workf