activiti自定义流程之Spring整合activiti-modeler5.16实例(九):历史任务查询

简介: <span style="font-family:Arial; font-size:14px; line-height:26px">注:(1)环境搭建:<a target="_blank" href="http://blog.csdn.net/tuzongxun/article/details/50787822">activiti自定义流程之Spring整合activiti-modeler
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建
        (2)创建流程模型:activiti自定义流程之Spring整合activiti-modeler5.16实例(二):创建流程模型
        (3)流程模型列表展示:activiti自定义流程之Spring整合activiti-modeler5.16实例(三):流程模型列表展示
        (4)部署流程定义:activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

        (5)流程定义列表:activiti自定义流程之Spring整合activiti-modeler5.16实例(五):流程定义列表

        (6)启动流程:activiti自定义流程之Spring整合activiti-modeler5.16实例(六):启动流程

        (7)任务列表展示:activiti自定义流程之Spring整合activiti-modeler5.16实例(七):任务列表展示

        (8)完成个人任务:activiti自定义流程之Spring整合activiti-modeler5.16实例(八):完成个人任务




1.所有任务完成,流程也就结束了,查询历史任务或历史流程就要操作act_hi_taskinst表,用的都是historyService来调用相关的方法。
本节示例查询历史任务,历史流程便不再专门示例。


2.后台业务代码,
  (1)自定义的任务实体类
package model;
import java.util.Date;

public class HisTaskModel {
	private String id;
	private String name;
	private String assignee;
	private String processInstanceId;
	private Date startTime;
	private Date endTime;
	private String cause;
	private String content;
	private String taskType;

	public String getCause() {
		return cause;
	}

	public void setCause(String cause) {
		this.cause = cause;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getTaskType() {
		return taskType;
	}

	public void setTaskType(String taskType) {
		this.taskType = taskType;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAssignee() {
		return assignee;
	}

	public void setAssignee(String assignee) {
		this.assignee = assignee;
	}

	public String getProcessInstanceId() {
		return processInstanceId;
	}

	public void setProcessInstanceId(String processInstanceId) {
		this.processInstanceId = processInstanceId;
	}

	public Date getStartTime() {
		return startTime;
	}

	public void setStartTime(Date startTime) {
		this.startTime = startTime;
	}

	public Date getEndTime() {
		return endTime;
	}

	public void setEndTime(Date endTime) {
		this.endTime = endTime;
	}

	@Override
	public String toString() {
		return "HisTaskModel [id=" + id + ", name=" + name + ", assignee="
				+ assignee + ", processInstanceId=" + processInstanceId
				+ ", startTime=" + startTime + ", endTime=" + endTime
				+ ", cause=" + cause + ", content=" + content + ", taskType="
				+ taskType + "]";
	}
}


  (2)业务逻辑:
这里需要注意的是,历史表中存在并非是单一类型的数据,就拿历史任务表来说,里边既有已经结束的任务,也有还没有结束的任务。
如果要单独查询结束了的任务,就可以调用finished()方法,查询的就是已经结束的任务。

/**
	 * 查询我的历史任务
	 * 
	 * @author:tuzongxun
	 * @Title: hisTask
	 * @param @param req
	 * @param @return
	 * @return Object
	 * @date Mar 18, 2016 9:12:07 AM
	 * @throws
	 */
	@RequestMapping(value = "/hisTask.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
	@ResponseBody
	public Object hisTask(HttpServletRequest req) {
		Map<String, Object> map = new HashMap<String, Object>();
		boolean isLogin = this.isLogin(req);
		if (isLogin) {
			HttpSession session = req.getSession();
			String assignee = (String) session.getAttribute("userName");
			List<HistoricTaskInstance> hisTaskList1 = historyService
					.createHistoricTaskInstanceQuery().taskAssignee(assignee)
					.finished().list();
			List<HisTaskModel> hisTaskList = new ArrayList<HisTaskModel>();
			for (HistoricTaskInstance hisTask : hisTaskList1) {
				HisTaskModel hisModel = new HisTaskModel();
				List<HistoricVariableInstance> hisList = historyService
						.createHistoricVariableInstanceQuery()
						.processInstanceId(hisTask.getProcessInstanceId())
						.list();
				for (HistoricVariableInstance hisVariable : hisList) {
					String name = hisVariable.getVariableName();
					if (name.equals("content")) {
						hisModel.setContent((String) hisVariable.getValue());
					} else if (name.equals("cause")) {
						hisModel.setCause((String) hisVariable.getValue());
					} else if (name.equals("taskType")) {
						hisModel.setTaskType((String) hisVariable.getValue());
					}
				}


				hisModel.setAssignee(hisTask.getAssignee());
				hisModel.setEndTime(hisTask.getEndTime());
				hisModel.setId(hisTask.getId());
				hisModel.setName(hisTask.getName());
				hisModel.setProcessInstanceId(hisTask.getProcessInstanceId());
				hisModel.setStartTime(hisTask.getStartTime());
				hisTaskList.add(hisModel);
			}
			map.put("isLogin", "yes");
			map.put("userName",
					(String) req.getSession().getAttribute("userName"));
			map.put("result", "success");
			map.put("data", hisTaskList);
		} else {
			map.put("isLogin", "no");
		}
		return map;
	}


3.angular js前台代码(前台只是做简单的展示,不多讲):
  (1)app.js中配置路由:
  
$stateProvider  
   .state('hisTask', {  
   url: "/hisTask",  
   views: {  
      'view': {  
       templateUrl: 'activi_views/hisTask.html',  
       controller: 'hisTaskCtr'  
      }  
   }  
  });  
   
  (2)逻辑相关代码:
 
 angular.module('activitiApp')  
.controller('hisTaskCtr', ['$rootScope','$scope','$http','$location', function($rootScope,$scope,$http,$location){  
$scope.init=function(){
        $http.post("./hisTask.do").success(function(result) {
        	if(result.isLogin==="yes"){
        	    console.log(result.data); 
        	    $rootScope.userName=result.userName;
    	        $scope.taskList=result.data;
        	}else{
        		$location.path("/login");
        	}
        });
}
  
}])  

4.对应的填写相关信息的页面:
<div id="logdiv1" ng-init="init();">  
   <p style="font-size:24px;margin-top:10px">历史任务列表</p>
   <center> 
   <table border="1px" style="width:87%;font-size:18px;text-align:center;margin-top:1px;margin-left:2px;position:relative;float:left;" cellSpacing="0px" cellPadding="0px">
      <tr style="background-color:#ccc">
         <td>类型</td>
         <td>ID</td>
         <td>NAME</td>
         <td>流程实例Id</td>
         <td>开始时间</td>
         <td>受理人</td>
         <td>完成时间</td>
         <td>发起原因</td>
         <td>内容</td>
      </tr>
      <tr ng-repeat="task in taskList | orderBy:'id'" >
         <td>{{task.taskType}}</td>
         <td>{{task.id}}</td>
         <td>{{task.name}}</td>
         <td>{{task.processInstanceId}}</td>
         <td>{{task.startTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
         <td>{{task.assignee}}</td>
         <td>{{task.endTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
         <td>{{task.cause}}</td>
         <td>{{task.content}}</td>
      </tr>
   </table>  
   </center> 
</div>  


目录
相关文章
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
14656 60
|
7月前
|
监控 安全 Java
使用 @HealthEndpoint 在 Spring Boot 中实现自定义健康检查
Spring Boot 通过 Actuator 模块提供了强大的健康检查功能,帮助开发者快速了解应用程序的运行状态。默认健康检查可检测数据库连接、依赖服务、资源可用性等,但在实际应用中,业务需求和依赖关系各不相同,因此需要实现自定义健康检查来更精确地监控关键组件。本文介绍了如何使用 @HealthEndpoint 注解及实现 HealthIndicator 接口来扩展 Spring Boot 的健康检查功能,从而提升系统的可观测性与稳定性。
540 0
使用 @HealthEndpoint 在 Spring Boot 中实现自定义健康检查
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
1009 1
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot中使用拦截器——拦截器使用实例
本文主要讲解了Spring Boot中拦截器的使用实例,包括判断用户是否登录和取消特定拦截操作两大场景。通过token验证实现登录状态检查,未登录则拦截请求;定义自定义注解@UnInterception实现灵活取消拦截功能。最后总结了拦截器的创建、配置及对静态资源的影响,并提供两种配置方式供选择,帮助读者掌握拦截器的实际应用。
661 0
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——拦截自定义异常
本文介绍了在实际项目中如何拦截自定义异常。首先,通过定义异常信息枚举类 `BusinessMsgEnum`,统一管理业务异常的代码和消息。接着,创建自定义业务异常类 `BusinessErrorException`,并在其构造方法中传入枚举类以实现异常信息的封装。最后,利用 `GlobalExceptionHandler` 拦截并处理自定义异常,返回标准的 JSON 响应格式。文章还提供了示例代码和测试方法,展示了全局异常处理在 Spring Boot 项目中的应用价值。
588 0
|
9月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1294 0
|
10月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
1096 0
|
6月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
542 4
|
6月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1068 3
|
前端开发 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
505 0