[통합편]Activiti 업무와 절차 통합의 조회(3)

6519 단어
두 번째 블로그에 이어 세 번째 방식 적용
 
실체에 업무 흐름과 관련된 어떤 속성을 도입할 필요가 없고 단순히 자신을 잘하면 됩니다!예를 들어 다음과 같은 신청 항목(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와 한 걸음 더 가깝다.
이상의 이런 방식도 모두 실천에서 축적된 것이니 총괄적으로 기록해 보세요!

좋은 웹페이지 즐겨찾기