分享

【整合篇】Activiti业务与流程整合之查询(二)

 飞鹰飞龙飞天 2016-07-06

    

继上篇博客:【整合篇】JBPM4.4业务与流程整合之查询 应用第二种方式:申请实体中加入需要的相应的工作流的属性

  1. package com.tgb.itoo.basic.entity;  
  2.   
  3. import java.util.Date;  
  4. import java.util.HashSet;  
  5. import java.util.Map;  
  6. import java.util.Set;  
  7.   
  8. import javax.persistence.CascadeType;  
  9. import javax.persistence.Column;  
  10. import javax.persistence.Entity;  
  11. import javax.persistence.FetchType;  
  12. import javax.persistence.JoinColumn;  
  13. import javax.persistence.ManyToOne;  
  14. import javax.persistence.OneToMany;  
  15. import javax.persistence.Table;  
  16. import javax.persistence.Temporal;  
  17. import javax.persistence.TemporalType;  
  18. import javax.persistence.Transient;  
  19.   
  20. import org.activiti.engine.history.HistoricProcessInstance;  
  21. import org.activiti.engine.repository.ProcessDefinition;  
  22. import org.activiti.engine.runtime.ProcessInstance;  
  23. import org.activiti.engine.task.Task;  
  24. import org.codehaus.jackson.annotate.JsonIgnore;  
  25. import org.springframework.format.annotation.DateTimeFormat;  
  26.   
  27. /** 
  28.  * Entity: Leave 
  29.  * 
  30.  * @author hejingyuan IdEntity implements Serializable 
  31.  */  
  32. @Entity  
  33. @Table(name = "OA_LEAVE")  
  34. public class Leave  extends IdEntity {   
  35.       
  36.     /** 
  37.      *  
  38.      */  
  39.     private static final long serialVersionUID = 1L;  
  40.     private String processInstanceId;  
  41.     private String userId;  
  42.     private String testId;  
  43.     private String oldCourse;  
  44.     private String applyCourse;  
  45.     @Column  
  46.     public String getApplyCourse() {  
  47.         return applyCourse;  
  48.     }  
  49.   
  50.     public void setApplyCourse(String applyCourse) {  
  51.         this.applyCourse = applyCourse;  
  52.     }  
  53.   
  54.     @Column  
  55.     public String getOldCourse() {  
  56.         return oldCourse;  
  57.     }  
  58.   
  59.     public void setOldCourse(String oldCourse) {  
  60.         this.oldCourse = oldCourse;  
  61.     }  
  62.     @Column  
  63.     public String getNewCourse() {  
  64.         return newCourse;  
  65.     }  
  66.   
  67.     public void setNewCourse(String newCourse) {  
  68.         this.newCourse = newCourse;  
  69.     }  
  70.   
  71.     private String newCourse;  
  72.      
  73.     @Column  
  74.     public String getTestId() {  
  75.         return testId;  
  76.     }  
  77.   
  78.     public void setTestId(String testId) {  
  79.         this.testId = testId;  
  80.     }  
  81.   
  82.     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")  
  83.     private Date startTime;  
  84.   
  85.     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")  
  86.     private Date endTime;  
  87.   
  88.    /* @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") 
  89.     private Date realityStartTime; 
  90.  
  91.     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") 
  92.     private Date realityEndTime;*/  
  93.     private Date applyTime;  
  94.     private String leaveType;  
  95.     private String reason;  
  96.   
  97.     //-- 临时属性 --//  
  98.   
  99.     // 流程任务  
  100.     private Task task;  
  101.   
  102.     private Map<String, Object> variables;  
  103.   
  104.     // 运行中的流程实例  
  105.     private ProcessInstance processInstance;  
  106.   
  107.     // 历史的流程实例  
  108.     private HistoricProcessInstance historicProcessInstance;  
  109.   
  110.     // 流程定义  
  111.     private ProcessDefinition processDefinition;  
  112.   
  113.     @Column  
  114.     public String getProcessInstanceId() {  
  115.         return processInstanceId;  
  116.     }  
  117.   
  118.     public void setProcessInstanceId(String processInstanceId) {  
  119.         this.processInstanceId = processInstanceId;  
  120.     }  
  121.   
  122.     @Column  
  123.     public String getUserId() {  
  124.         return userId;  
  125.     }  
  126.   
  127.     public void setUserId(String userId) {  
  128.         this.userId = userId;  
  129.     }  
  130.   
  131.     @Temporal(TemporalType.TIMESTAMP)  
  132.     @Column(name = "START_TIME")  
  133.     public Date getStartTime() {  
  134.         return startTime;  
  135.     }  
  136.   
  137.     public void setStartTime(Date startTime) {  
  138.         this.startTime = startTime;  
  139.     }  
  140.   
  141.     @Temporal(TemporalType.TIMESTAMP)  
  142.     @Column(name = "END_TIME")  
  143.     public Date getEndTime() {  
  144.         return endTime;  
  145.     }  
  146.   
  147.     public void setEndTime(Date endTime) {  
  148.         this.endTime = endTime;  
  149.     }  
  150.   
  151.     @Column  
  152.     @Temporal(TemporalType.TIMESTAMP)  
  153.     public Date getApplyTime() {  
  154.         return applyTime;  
  155.     }  
  156.   
  157.     public void setApplyTime(Date applyTime) {  
  158.         this.applyTime = applyTime;  
  159.     }  
  160.   
  161.     @Column  
  162.     public String getLeaveType() {  
  163.         return leaveType;  
  164.     }  
  165.   
  166.     public void setLeaveType(String leaveType) {  
  167.         this.leaveType = leaveType;  
  168.     }  
  169.   
  170.     @Column  
  171.     public String getReason() {  
  172.         return reason;  
  173.     }  
  174.   
  175.     public void setReason(String reason) {  
  176.         this.reason = reason;  
  177.     }  
  178.      
  179.     /** 
  180.      * 学生基础信息 
  181.      */  
  182.     @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = StudentCourseInfo.class)  
  183.     @JoinColumn(name = "studentCourseInfoId", nullable = true)  
  184.     private StudentCourseInfo studentCourseInfo;  
  185.       
  186.     public StudentCourseInfo getStudentCourseInfo() {  
  187.         return studentCourseInfo;  
  188.     }  
  189.   
  190.     public void setStudentCourseInfo(StudentCourseInfo studentCourseInfo) {  
  191.         this.studentCourseInfo = studentCourseInfo;  
  192.     }  
  193.   
  194.     @Transient  
  195.     public Task getTask() {  
  196.         return task;  
  197.     }  
  198.   
  199.     public void setTask(Task task) {  
  200.         this.task = task;  
  201.     }  
  202.   
  203.     @Transient  
  204.     public Map<String, Object> getVariables() {  
  205.         return variables;  
  206.     }  
  207.   
  208.     public void setVariables(Map<String, Object> variables) {  
  209.         this.variables = variables;  
  210.     }  
  211.   
  212.     @Transient  
  213.     public ProcessInstance getProcessInstance() {  
  214.         return processInstance;  
  215.     }  
  216.   
  217.     public void setProcessInstance(ProcessInstance processInstance) {  
  218.         this.processInstance = processInstance;  
  219.     }  
  220.   
  221.     @Transient  
  222.     public HistoricProcessInstance getHistoricProcessInstance() {  
  223.         return historicProcessInstance;  
  224.     }  
  225.   
  226.     public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {  
  227.         this.historicProcessInstance = historicProcessInstance;  
  228.     }  
  229.   
  230.     @Transient  
  231.     public ProcessDefinition getProcessDefinition() {  
  232.         return processDefinition;  
  233.     }  
  234.   
  235.     public void setProcessDefinition(ProcessDefinition processDefinition) {  
  236.         this.processDefinition = processDefinition;  
  237.     }  
  238.   
  239.       
  240. }  


在真正应用之前我们先来简单介绍一下在Activiti中比JBPM4.4的一处优化。

activiti中,它为我们提供了一个businessKey字段。

 

在启动流程时,流程实例中会添加一条记录,而且流程实例表中会有一个businessKey字段,String businessKey = leave.getId().toString();这样我们的流程表中就始终拥有业务的id,当我们再次需要的时候可以重新查询。




下面举例说明:

  1. /** 
  2.     * 任务列表ERROR [stderr] (http-localhost/127.0.0.1:8080-3) ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider com.sun.script.javascript.RhinoScriptEngineFactory not found 
  3.     * 
  4.     * @param leave 
  5.     */  
  6.    @RequestMapping(value = "list/task")  
  7.    public ModelAndView taskList(HttpSession session, HttpServletRequest request) {  
  8.     List<Leave> results = new ArrayList<Leave>();  
  9.     String userId = UserUtil.getUserFromSession(session).getId();  
  10.     results=abstractTaskList(userId);         
  11.     return new ModelAndView("/oa/leave/taskList","results",results);                              
  12.           
  13.    }  

  1. /** 
  2.      * 抽象出来的查看任务列表,与基本业务无关 
  3.      * 
  4.      * @param userId 用户id 
  5.      * @return 
  6.      */  
  7.     public List<Leave> abstractTaskList(String userId){  
  8.          List<Leave> results = new ArrayList<Leave>();  
  9.          // 根据当前人的ID查询  
  10.          TaskQuery taskQuery = taskService.createTaskQuery().taskCandidateOrAssigned(userId);          
  11.          List<Task> tasks = taskQuery.list();       
  12.          int i=0;  
  13.            
  14.          // 根据流程的业务ID查询实体并关联  
  15.          for (Task task : tasks) {  
  16.              String processInstanceId = task.getProcessInstanceId();  
  17.              ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();  
  18.              String businessKey = processInstance.getBusinessKey();  
  19.              if (businessKey == null) {  
  20.                  continue;  
  21.              }   
  22.              Leave leave=updateEntity(processInstance,task,businessKey);  
  23.              results.add(leave);   
  24.              i=i+1;  
  25.          }  
  26.         return results;  
  27.     }  

  1. //更新实体   
  2.     public Leave updateEntity(ProcessInstance processInstance,Task task,String businessKey){  
  3.         Leave leave = leaveBean.findEntityById(businessKey);  
  4.         leave.setProcessInstance(processInstance);  
  5.         leave.setProcessDefinition(getProcessDefinition(processInstance.getProcessDefinitionId()));                   
  6.         leave.setTask(task);  
  7.         return leave;  
  8.     }  


对比:

    之前的JBPM的操作方式,启动流程时将业务数据存储到流程变量中,在需要查询时,将数据从流程变量中取出,然后将取出的值赋给我们的组合实体即可。这样做的弊端在于数据可能会出现不同步的情况,但是应该并不多见。

 

    其实使用这种方式呢,即使在实体层添加了工作流的属性,但是并不需要在真正的数据库表中添加相应的字段,那么这样做的便利在哪里呢?其实这样做主要是使得我们在返回前台数据时更加方便,我们只需要返回一个实体即可。但是弊端是什么呢,就是业务的实体中需要知道一些工作流的属性。

    而且弊端不仅如此,在大型系统中,相当于实体层需要加入所有的依赖工作流的jar包,如果这个实体还需要被其他系统所依赖,那么所有的系统都会有工作流的依赖,我们曾遇到的问题就是,当我们在当前系统的实体项目中加入工作流的依赖时,由于其他系统也依赖我们本实体,导致所有的系统均瘫痪jboss不能正常启动,报不识别工作流的类。这种影响就是深远的,所以我们要实现的还是解耦。


下篇继续




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多