Activti 流程启动,办理,查询个人业务,查询历史任务

本文介绍Activiti流程引擎的应用实践,包括流程启动、任务查询和个人任务处理等关键操作,并通过示例代码展示如何进行流程实例的管理和监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package activt001;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.junit.Test;

import utils.DbUtils;
/**
 * Execution   执行对象
	 按流程定义的规则执行一次的过程.
	 对应的表:
	 act_ru_execution: 正在执行的信息
	 act_hi_procinst:已经执行完的历史流程实例信息
	 act_hi_actinst:存放历史所有完成的活动
	ProcessInstance  流程实例
 		特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个。
	注意
    (1)如果是单例流程,执行对象ID就是流程实例ID
    (2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同
    (3)一个流程中,流程实例只有1个,执行对象可以存在多个。
	Task 任务
	 执行到某任务环节时生成的任务信息。
	 对应的表:
	  act_ru_task:正在执行的任务信息
	  act_hi_taskinst:已经执行完的历史任务信息

 * @Description: TODO(用一句话描述该文件做什么)  
* @author guochao 
* @date 2018年6月10日  
*
 */
public class ActivtTest002 {
// 实现流程启动和我的任务查询 
	/**
	 * 启动流程
	* @Description: TODO(用一句话描述该文件做什么)  
	* @author guochao 
	* @date 2018年6月8日  
	*
	 */
@Test
public void startProcess(){
		// 获得流程引擎
		ProcessEngine process = DbUtils.getProcessEngine();
		// 得到runtimeService
		RuntimeService runtimeService = process.getRuntimeService();
		// 根据流程定义Id启动流程   数据库中  act_re_procdef 表   PROC_DEF_ID_字段的值 "helloworld:3:904"
		ProcessInstance startProcess = runtimeService.startProcessInstanceById("helloworld:3:904");
		System.out.println(startProcess.getId());
	}

/**
 * 查询个人业务根据名查询
* @Description: TODO(用一句话描述该文件做什么)  
* @author guochao 
* @date 2018年6月8日  
*
 */
@Test
public void queryMyTask(){
	
	String name ="张三";
			ProcessEngine process = DbUtils.getProcessEngine();
			// 得到TaskService
			TaskService taskService = process.getTaskService();
			// 得到查询对象
			TaskQuery query = taskService.createTaskQuery();
			// 查询当前用户的任务
			List<Task> list = query.taskAssignee(name).list();
			for (Task task : list) {
				System.out.println(task.getAssignee() + "\t" +task.getName());
			}
}
/**
 * 办理业务
* @Description: TODO(用一句话描述该文件做什么)  
* @author guochao 
* @date 2018年6月8日  
*
 */
@Test
public  void  doProcess(){
	String  taskId= "1102";
	ProcessEngine process = DbUtils.getProcessEngine();
	// 得到TaskService
	TaskService taskService = process.getTaskService();
	taskService.complete(taskId);
	System.out.println("完成任务");
}
/**
 * 查询流程状态看是否结束 
 * 判断 act_ru_task 中是否有此流程  PROC_INST_ID_ 此字段
* @Description: TODO(用一句话描述该文件做什么)  
* @author guochao 
* @date 2018年6月8日  
*
 */
@Test
public  void queryProcess(){
	String  processInstanceId= "1001";  
	ProcessEngine process = DbUtils.getProcessEngine();
	// 得到runtimeService 
	RuntimeService runtimeService = process.getRuntimeService();
	ProcessInstance singleResult = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
	if(singleResult!=null){
		System.out.println(singleResult.getId());
	}
	else{
		System.out.println("已结束");
	}
	
}
/**
 * 查询历史人物  
 * act_hi_actinst  此表  根据  ASSIGNEE_ 字段查询 
* @Description: TODO(用一句话描述该文件做什么)  
* @author guochao 
* @date 2018年6月10日  
*
 */
@Test
public  void queryHistory(){
	String taskAssignee="张三";  //  办理人 提交申请 张三   审批李四
	// 使用办理人查询流程实例
	ProcessEngine process = DbUtils.getProcessEngine(); //  获取流程引擎对象
	List<HistoricTaskInstance> list = process.getHistoryService()//  获取历史Service
	.createHistoricTaskInstanceQuery()//创建历史任务查询
	.taskAssignee(taskAssignee)//指定办理人查询历史任务
	.list();
	if(list!=null && list.size()>0){
	 for(HistoricTaskInstance task:list){
	 System.out.println("任务ID:"+task.getId());
	 System.out.println("流程实例ID:"+task.getProcessInstanceId());
	 System.out.println("任务的办理人:"+task.getAssignee());
	 System.out.println("执行对象ID:"+task.getExecutionId());
	 System.out.println(task.getStartTime()+" "+task.getEndTime()+" "+task.getDurationInMillis());
	}
	}

}
/**
 * 根据流程实例ID查询  历史流程实例
 * 表 act_hi_actinst  字段 PROC_INST_ID_
* @Description: TODO(用一句话描述该文件做什么)  
* @author guochao 
* @date 2018年6月10日  
*
 */
@Test
public void queryHistoryProcessInstance() throws Exception {
String processInstanceId = "1201";
ProcessEngine process = DbUtils.getProcessEngine(); //  获取流程引擎对象
HistoricProcessInstance hpi = process.getHistoryService()//
    .createHistoricProcessInstanceQuery()//创建历史流程实例查询
    .processInstanceId(processInstanceId)//使用流程实例ID查询
    .singleResult();
System.out.println("流程定义ID:"+hpi.getProcessDefinitionId());
System.out.println("流程实例ID:"+hpi.getId());
System.out.println(hpi.getStartTime()+"    "+hpi.getEndTime()+"        "+hpi.getDurationInMillis());
}



}

<think>我们正在创建一个使用HTMLActiviti绘制流程图的网页。根据引用[1],Activiti提供了一个官方的web工具来绘制流程图。但是,用户希望在自己的HTML页面中集成这个功能。 根据引用[2],我们看到一个示例的HTML代码片段,其中包含一个用于显示流程图的img元素一个用于显示审批信息的表格。这暗示了我们可以通过以下步骤实现: 1. 使用Activiti的REST API或内置的流程图生成功能来获取流程图的图片。 2. 在HTML页面中通过img标签显示流程图。 3. 同时,我们可以展示流程的审批信息,这可能通过另一个表格来展示。 然而,用户的问题是如何生成一个“绘制”流程图的页面,而不仅仅是显示。这意味着我们需要一个可以编辑流程图的界面。 实际上,Activiti官方提供了一个流程图设计器(Modeler),我们可以将其嵌入到自己的Web应用中。以下是实现步骤: 步骤1:引入Activiti Modeler 我们可以将Activiti Modeler的静态资源(HTML、JS、CSS等)集成到我们的Web应用中。 步骤2:创建HTML页面 创建一个HTML页面,用于承载Activiti Modeler。通常,Activiti Modeler是一个独立的页面,我们可以通过iframe嵌入或者直接使用其提供的页面。 步骤3:配置初始化 根据Activiti的文档,配置Modeler的路径相关参数。 但是,由于Activiti Modeler是一个相对复杂的前端应用,直接嵌入需要一定的配置。这里我们提供一个简单的示例,展示如何嵌入Activiti Modeler。 注意:Activiti Modeler需要后端支持,因为它的数据存储读取都是通过REST API与Activiti引擎交互。 因此,我们首先需要部署Activiti应用(包括Activiti RestActiviti Modeler)。然后,在我们的HTML页面中,可以通过以下方式嵌入: 示例代码(假设Activiti Modeler部署在同一个应用的/activiti路径下): ```html <!DOCTYPE html> <html> <head> <title>流程图设计器</title> <style> body, html { margin: 0; padding: 0; height: 100%; overflow: hidden; } #modeler-container { position: absolute; width: 100%; height: 100%; } </style> </head> <body> <div id="modeler-container"></div> <script src="/activiti/editor/editor.js"></script> <script> // 初始化Modeler var modeler = new window.Activiti.Modeler({ container: '#modeler-container', restUrl: '/activiti-service' // Activiti REST服务的根路径 }); </script> </body> </html> ``` 但是,请注意,Activiti Modeler的具体引入方式可能会根据版本部署方式有所不同。上述代码仅为示意。 另外,如果用户希望自己绘制流程图并保存,那么需要确保有Activiti引擎的后端支持,并且用户有权限访问。 如果用户只是希望显示已有的流程图(而不是绘制),那么可以使用如下方式显示流程图图片: ```html <img src="/activiti-rest/service/repository/deployments/{deploymentId}/resources/{resourceName}/image" /> ``` 其中,deploymentId是部署ID,resourceName是流程定义的资源名称(通常是BPMN文件对应的PNG图片资源)。 但是,根据引用[2]中的代码,他们使用了img标签来显示流程图,并且通过设置src属性来获取图片。同时,还展示了审批信息的表格。 因此,针对用户的需求“绘制流程图的页面”,我们主要提供嵌入Activiti Modeler的方法。 然而,由于Activiti Modeler的集成相对复杂,通常需要将整个Activiti应用部署好,并且前端页面需要与后端进行认证交互。因此,我们可能还需要考虑用户登录权限的问题。 总结:创建一个可以绘制流程图的HTML页面,最直接的方式是嵌入Activiti官方提供的Modeler。这需要我们将Activiti Modeler的静态资源部署到服务器,并在HTML页面中引入相应的JSCSS,然后通过JavaScript初始化Modeler。 但是,由于Activiti Modeler本身是一个完整的应用,我们也可以直接跳转到Activiti Modeler的URL(如果已经部署),例如:http://localhost:8080/activiti-app/modeler.html 如果用户希望在自己的页面中嵌入,可以使用iframe: ```html <iframe src="http://localhost:8080/activiti-app/modeler.html" style="width:100%; height:100vh; border:none;"></iframe> ``` 这样,用户就可以在iframe中直接使用Activiti Modeler绘制流程图。 因此,根据用户的需求,我们给出两种方案: 方案1:直接跳转到Activiti Modeler提供的页面(如果已经部署了Activiti应用)。 方案2:在自己的HTML页面中使用iframe嵌入Activiti Modeler。 方案2的示例代码如下: ```html <!DOCTYPE html> <html> <head> <title>流程图设计器</title> </head> <body style="margin:0; padding:0;"> <iframe src="http://你的Activiti应用地址/activiti-app/modeler.html" style="width:100%; height:100vh; border:none;"> </iframe> </body> </html> ``` 注意:将“你的Activiti应用地址”替换为实际部署的地址。 另外,关于引用[2]中提到的审批信息表格,那是另一个功能,用于展示流程的审批信息,与绘制流程图不在同一个页面。如果需要同时展示,可以设计一个包含两个部分的页面:一部分是流程图(绘制或查看),另一部分是审批信息表格。但是,绘制流程图通常是一个独立的功能,审批信息表格通常在流程实例运行时展示。 因此,针对用户的问题,我们重点解决绘制流程图的页面创建。审批信息表格的展示可以在另一个页面或同一个页面的不同标签页中实现。 最后,生成相关问题: §§相关问题§§ 1. 如何部署Activiti应用以使用流程图设计器? 2. 如何保存通过Activiti Modeler绘制的流程图? 3. 如何在网页中展示流程图的审批信息?</think>要创建一个使用HTMLActiviti绘制流程图的网页,需要结合Activiti的BPMN设计器功能HTML页面集成。以下是实现步骤代码示例: ### 一、核心实现步骤 1. **引入Activiti设计器依赖** 在项目中添加Activiti Modeler依赖(Maven示例): ```xml <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-modeler</artifactId> <version>6.0.0</version> <!-- 根据实际版本调整 --> </dependency> ``` 2. **创建流程图设计页面** ```html <!-- diagram.html --> <!DOCTYPE html> <html> <head> <title>流程图设计器</title> <link rel="stylesheet" href="bpmn-js/assets/diagram-js.css"> <link rel="stylesheet" href="bpmn-js/assets/bpmn-font/css/bpmn.css"> </head> <body> <div id="canvas" style="height: 80vh; border: 1px solid #ccc"></div> <button onclick="saveDiagram()">保存流程图</button> <script src="bpmn-js/bpmn-modeler.development.js"></script> <script> const bpmnModeler = new BpmnModeler({ container: '#canvas' }); // 初始化空白流程图 bpmnModeler.createDiagram(); // 保存流程图 function saveDiagram() { bpmnModeler.saveXML({ format: true }, (err, xml) => { if (err) throw err; // 发送XML到后端保存 fetch('/save-bpmn', { method: 'POST', body: JSON.stringify({ xml }) }); }); } </script> </body> </html> ``` 3. **后端保存接口(Spring Boot示例)** ```java @RestController public class BpmnController { @PostMapping("/save-bpmn") public ResponseEntity<?> saveBpmn(@RequestBody Map<String, String> data) { String xml = data.get("xml"); // 1. 保存XML到数据库/文件系统 // 2. 部署流程定义(可选) repositoryService.createDeployment() .addString("process.bpmn20.xml", xml) .deploy(); return ResponseEntity.ok().build(); } } ``` 4. **流程查看页面**(引用[2]的优化实现) ```html <!-- view.html --> <div class="flow-container"> <div id="flow-chart"> <img id="flow-image" src="/get-diagram-image?processId=PROCESS_ID" /> </div> <div class="approval-info"> <table class="approval-table"> <thead> <tr> <th>审批节点</th> <th>审批人</th> <th>状态</th> </tr> </thead> <tbody id="approval-data"><!-- 动态加载 --></tbody> </table> </div> </div> ``` ### 二、关键功能实现 1. **生成流程图图片**(后端接口) ```java @GetMapping("/get-diagram-image") public void getDiagramImage(@RequestParam String processId, HttpServletResponse response) throws IOException { ProcessDefinition definition = repositoryService.createProcessDefinitionQuery() .processDefinitionId(processId).singleResult(); InputStream imageStream = repositoryService.getResourceAsStream( definition.getDeploymentId(), definition.getDiagramResourceName() ); response.setContentType("image/png"); IOUtils.copy(imageStream, response.getOutputStream()); } ``` 2. **动态加载审批数据**(前端JS) ```javascript fetch(`/approval-data?processId=${processId}`) .then(res => res.json()) .then(data => { const tbody = document.getElementById('approval-data'); data.forEach(item => { const row = `<tr> <td>${item.taskName}</td> <td>${item.assignee}</td> <td>${item.status}</td> </tr>`; tbody.innerHTML += row; }); }); ``` ### 三、部署注意事项 1. **路径配置** - 确保前端能访问到`bpmn-js`资源(从`activiti-webapp-explorer`中提取) - 配置静态资源路径: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/bpmn-js/**") .addResourceLocations("classpath:/static/bpmn-js/"); } } ``` 2. **跨域问题** 若前后端分离开发,需添加CORS配置: ```java @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedMethods("GET", "POST"); } }; } ``` ### 四、效果说明 1. **设计器功能** ![BPMN设计器界面](https://activiti.org/assets/modeler-example.png) 支持拖拽任务/网关/事件等元素(符合BPMN2.0标准) 2. **审批信息展示** ![流程图与审批信息](https://example.com/flow-approval.png) 左侧显示流程图,右侧表格展示审批状态(参考引用[2]布局) 最终实现效果:用户可在网页中设计流程 → 自动保存BPMN XML → 查看流程图与审批状态[^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_slaves

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值