[통합편]Activiti 업무와 절차 통합의 조회(3)
실체에 업무 흐름과 관련된 어떤 속성을 도입할 필요가 없고 단순히 자신을 잘하면 됩니다!예를 들어 다음과 같은 신청 항목(Leave):
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;
private Date applyTime;
private String leaveType;
private String reason;
//-- --//
private Map<String, Object> variables;
@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;
}
@Transient
public Map<String, Object> getVariables() {
return variables;
}
public void setVariables(Map<String, Object> variables) {
this.variables = variables;
}
}
그렇다면 조회할 때 어떻게 업무 흐름과 통합해야 합니까?
우리는 임무 수행의 결점을 보았다.
/**
* 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<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
String userId = UserUtil.getUserFromSession(session).getId();
results=abstractTaskList(userId);
return new ModelAndView("/oa/leave/taskList","results",results);
}
/**
* ,
*
* @param userId id
* @return
*/
public List<Map<String, Object>> abstractTaskList(String userId){
List<Leave> results = new ArrayList<Leave>();
// ID
TaskQuery taskQuery = taskService.createTaskQuery().taskCandidateOrAssigned(userId);
List<Task> tasks = taskQuery.list();
int i=0;
List<Map<String, Object>> mapList = new ArrayList<Map<String, Object>>();
// 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;
}
Map<String, Object> map = new HashMap<String, Object>();
Leave leave = leaveBean.findEntityById(businessKey);
map.put("leave", leave);// “ ”
map.put("task", task);
map.put("processDefinition", getProcessDefinition(processInstance.getProcessDefinitionId()));
map.put("processInstance", processInstance);// “ ”
mapList.add(map);
/*Leave leave=updateEntity(processInstance,task,businessKey);
results.add(leave); */
i=i+1;
}
return mapList;
}
이때 우리가 사용하는 방식은 비즈니스Key를 이용하여 절차 변수에 저장된 업무 데이터를 사용하지 않고 업무표에 직접 가서 조회하는 것이다. 동기화되지 않는 상황을 피하고 반환값은 맵 형식을 사용하기 때문에 업무 실체가 추가 속성을 추가할 필요가 없다. 우리가 말한 AOP와 한 걸음 더 가깝다.
이상의 이런 방식도 모두 실천에서 축적된 것이니 총괄적으로 기록해 보세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.