作者:立而山0605_408 | 来源:互联网 | 2023-09-24 14:01
继上篇博客:【整合篇】JBPM4.4业务与流程整合之查询应用第二种方式:申请实体中加入需要的相应的工作流的属性packagecom.tgb.itoo.basic.entity;import
继上篇博客:【整合篇】JBPM4.4业务与流程整合之查询 应用第二种方式:申请实体中加入需要的相应的工作流的属性
package com.tgb.itoo.basic.entity;
import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.springframework.format.annotation.DateTimeFormat;
/**
* Entity: Leave
*
* @author hejingyuan IdEntity implements Serializable
*/
@Entity
@Table(name = "OA_LEAVE")
public class Leave extends IdEntity {
/**
*
*/
private static final long serialVersiOnUID= 1L;
private String processInstanceId;
private String userId;
private String testId;
private String oldCourse;
private String applyCourse;
@Column
public String getApplyCourse() {
return applyCourse;
}
public void setApplyCourse(String applyCourse) {
this.applyCourse = applyCourse;
}
@Column
public String getOldCourse() {
return oldCourse;
}
public void setOldCourse(String oldCourse) {
this.oldCourse = oldCourse;
}
@Column
public String getNewCourse() {
return newCourse;
}
public void setNewCourse(String newCourse) {
this.newCourse = newCourse;
}
private String newCourse;
@Column
public String getTestId() {
return testId;
}
public void setTestId(String testId) {
this.testId = testId;
}
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date startTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date endTime;
/* @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date realityStartTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date realityEndTime;*/
private Date applyTime;
private String leaveType;
private String reason;
//-- 临时属性 --//
// 流程任务
private Task task;
private Map variables;
// 运行中的流程实例
private ProcessInstance processInstance;
// 历史的流程实例
private HistoricProcessInstance historicProcessInstance;
// 流程定义
private ProcessDefinition processDefinition;
@Column
public String getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
}
@Column
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "START_TIME")
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "END_TIME")
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
@Column
@Temporal(TemporalType.TIMESTAMP)
public Date getApplyTime() {
return applyTime;
}
public void setApplyTime(Date applyTime) {
this.applyTime = applyTime;
}
@Column
public String getLeaveType() {
return leaveType;
}
public void setLeaveType(String leaveType) {
this.leaveType = leaveType;
}
@Column
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
/**
* 学生基础信息
*/
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = StudentCourseInfo.class)
@JoinColumn(name = "studentCourseInfoId", nullable = true)
private StudentCourseInfo studentCourseInfo;
public StudentCourseInfo getStudentCourseInfo() {
return studentCourseInfo;
}
public void setStudentCourseInfo(StudentCourseInfo studentCourseInfo) {
this.studentCourseInfo = studentCourseInfo;
}
@Transient
public Task getTask() {
return task;
}
public void setTask(Task task) {
this.task = task;
}
@Transient
public Map getVariables() {
return variables;
}
public void setVariables(Map variables) {
this.variables = variables;
}
@Transient
public ProcessInstance getProcessInstance() {
return processInstance;
}
public void setProcessInstance(ProcessInstance processInstance) {
this.processInstance = processInstance;
}
@Transient
public HistoricProcessInstance getHistoricProcessInstance() {
return historicProcessInstance;
}
public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
this.historicProcessInstance = historicProcessInstance;
}
@Transient
public ProcessDefinition getProcessDefinition() {
return processDefinition;
}
public void setProcessDefinition(ProcessDefinition processDefinition) {
this.processDefinition = processDefinition;
}
}
在真正应用之前我们先来简单介绍一下在Activiti中比JBPM4.4的一处优化。
在activiti中,它为我们提供了一个businessKey字段。
在启动流程时,流程实例中会添加一条记录,而且流程实例表中会有一个businessKey字段,String businessKey = leave.getId().toString();这样我们的流程表中就始终拥有业务的id,当我们再次需要的时候可以重新查询。
下面举例说明:
/**
* 任务列表ERROR [stderr] (http-localhost/127.0.0.1:8080-3) ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider com.sun.script.Javascript.RhinoScriptEngineFactory not found
*
* @param leave
*/
@RequestMapping(value = "list/task")
public ModelAndView taskList(HttpSession session, HttpServletRequest request) {
List results = new ArrayList();
String userId = UserUtil.getUserFromSession(session).getId();
results=abstractTaskList(userId);
return new ModelAndView("/oa/leave/taskList","results",results);
}
/**
* 抽象出来的查看任务列表,与基本业务无关
*
* @param userId 用户id
* @return
*/
public List abstractTaskList(String userId){
List results = new ArrayList();
// 根据当前人的ID查询
TaskQuery taskQuery = taskService.createTaskQuery().taskCandidateOrAssigned(userId);
List tasks = taskQuery.list();
int i=0;
// 根据流程的业务ID查询实体并关联
for (Task task : tasks) {
String processInstanceId = task.getProcessInstanceId();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
String businessKey = processInstance.getBusinessKey();
if (businessKey == null) {
continue;
}
Leave leave=updateEntity(processInstance,task,businessKey);
results.add(leave);
i=i+1;
}
return results;
}
//更新实体
public Leave updateEntity(ProcessInstance processInstance,Task task,String businessKey){
Leave leave = leaveBean.findEntityById(businessKey);
leave.setProcessInstance(processInstance);
leave.setProcessDefinition(getProcessDefinition(processInstance.getProcessDefinitionId()));
leave.setTask(task);
return leave;
}
对比:
之前的JBPM的操作方式,启动流程时将业务数据存储到流程变量中,在需要查询时,将数据从流程变量中取出,然后将取出的值赋给我们的组合实体即可。这样做的弊端在于数据可能会出现不同步的情况,但是应该并不多见。
其实使用这种方式呢,即使在实体层添加了工作流的属性,但是并不需要在真正的数据库表中添加相应的字段,那么这样做的便利在哪里呢?其实这样做主要是使得我们在返回前台数据时更加方便,我们只需要返回一个实体即可。但是弊端是什么呢,就是业务的实体中需要知道一些工作流的属性。
而且弊端不仅如此,在大型系统中,相当于实体层需要加入所有的依赖工作流的jar包,如果这个实体还需要被其他系统所依赖,那么所有的系统都会有工作流的依赖,我们曾遇到的问题就是,当我们在当前系统的实体项目中加入工作流的依赖时,由于其他系统也依赖我们本实体,导致所有的系统均瘫痪jboss不能正常启动,报不识别工作流的类。这种影响就是深远的,所以我们要实现的还是解耦。
下篇继续