package com.jestdoc.flowengine;
import java.sql.*;
import java.util.*;
import com.jestdoc.dbconn.DbConn;
import com.jestdoc.inc.*;
import com.jestdoc.org.*;
import com.jestdoc.flowmodel.*;
import com.jestdoc.flowdata.WfConstants;
import com.jestdoc.flowengine.*;
/**
* <p>Title: 工作流引擎之任務處理類</p>
* <p>Description: </p>
本類是工作流引擎類的核心,也是整個工作流管理系統的核心.本類負責完成工作流的實例化,任務處理
導航,任務分配以及向工作流任務管理器,工作流應用模塊提供API接口.
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: Wingroup(China)</p>
* @author 王應南,葛志春
* @version 1.0
*/
public class TaskProc
{
private DbConn conn = null;
private WinDept Dept=null;
private WinGroup Group=null;
private WinRole Role=null;
private WinUser User=null;
private ExtendCalendar exCal=null;
private ExtendString exStr=null;
private ExtendMath exMath=null;
private String errMsg="";
private int[] seqSubJoinFileID; //順會並案子實例.
private int seqJoinFile=0 ; //並案順序
/**
* 構造函數.
* 自身建立數據庫連接.
*/
public TaskProc()
{
conn =new DbConn("DbCp1");
Dept = new WinDept();
Group= new WinGroup();
Role = new WinRole();
User = new WinUser();
exCal = new ExtendCalendar();
exStr=new ExtendString();
exMath=new ExtendMath();
}
/**
* 構造函數.
* 數據庫連接由外部傳入.
*/
public TaskProc(DbConn dbconn)
{
this.conn =dbconn;
Dept = new WinDept();
Group= new WinGroup();
Role = new WinRole();
User = new WinUser();
exCal = new ExtendCalendar();
exStr=new ExtendString();
exMath=new ExtendMath();
}
/**
public void finalize()
{
System.out.print("TaskProc Over!");
}
*/
/**
*方法功能:
* 獲取本類方法執行錯誤信息.
* @return 返回 本類錯誤信息;
*/
public String getErrMsg()
{
return this.errMsg;
}
/*
*方法功能:
*數據庫連接關閉
*/
public void close()
{
Dept.close();
Group.close();
Role.close();
User.close();
this.conn.close();
//System.out.print("dbconn is closed!");
System.gc();
}
/************************************
* 以下為任務管理器提供流程實例化的接口 *
************************************/
/**
* <P>方法功能:</p>
* <p>流程啟動,本方法為主計處轉案提供</p>
* <p>方法描述:<p>
* 該方法用於流程的開始狀態,調用該方法啟動指定的流程,並創建流程實例,完成開始狀態下指定事件的處理
* @param flowID 流程編號
* @param eventID 當前執行的事件編號
* @param upFileID 父實例編號
* @param upStateID 父狀態編號
* @param fileInfoid 文號
* @param title 主旨
* @param limTime 限辦時間
* @param curGroupID 群組編號
* @param curRoleID 角色編號
* @param applyID 申請人用戶編號
* @param nextDeptID 下一個處理人部門編號,當下一個任務處理物件為動態指定時該參數有效
* @param nextGroupID 下一個處理人群組編號 當下一個任務處理物件為動態指定時該參數有效
* 黨procType=WfConstants.GROUP_MASTER時該值表示給那一個群組.
* @param nextRoleID 下一個處理人角色編號,當下一個任務處理物件為動態指定時該參數有效
* @param nextUserID 下一個處理人用戶編號 當下一個任務處理物件為動態指定時該參數有效
* @param 另對於NextDeptID與NextGroupID,兩者選其中一個,不可以兩者都null,也不可以兩者都非null.
* @return 處理成功 返回 true;處理失敗 返回 false;
*/
public boolean startFile(int flowID,int eventID,int upFileID,int upStateID,
String fileInfoid,String title,float limTime ,
int curGroupID,int curRoleID, int applyID,
int nextDeptID,int nextGroupID,int nextRoleID,int nextUserID)
{
boolean flag ;//方法執行成功,失敗標誌.
int taskID= -1;
int teamType=0;
int[] teamDeptID=new int[1], teamGroupID=new int[1], teamRoleID=new int[1], teamUserID=new int[1];
try
{
conn.setAutoCommit(false);
//實例化流程
taskID=this.newFile(flowID,upFileID,upStateID,fileInfoid,title,limTime,applyID);
if(taskID<1)
{
this.conn.rollback();
this.conn.setAutoCommit(true);
return false;
}
conn.commit();
conn.setAutoCommit(true);
//處理該流程實例的開始狀態下的指定事件。
flag=this.procTask(taskID , eventID, curGroupID, curRoleID, applyID, nextDeptID, nextGroupID,nextRoleID,nextUserID,
teamType, teamDeptID,teamGroupID, teamRoleID,teamUserID);
if(!flag)
{
this.errMsg="開始任務處理失敗!";
return false;
}
return true;
}
catch(Exception ex)
{
this.errMsg="系統執行異常!";
conn.rollback();
conn.setAutoCommit(true);
return false;
}
}
/**
* <P>方法功能:</p>
* <p>流程啟動</p>
* <p>方法描述:<p>
* 該方法用於流程的開始狀態,調用該方法啟動指定的流程,並創建流程實例,完成開始狀態下指定事件的處理
* @param flowID 流程編號
* @param eventID 當前執行的事件編號
* @param upFileID 父實例編號
* @param upStateID 父狀態編號
* @param fileInfoid 文號
* @param title 主旨
* @param limTime 限辦時間
* @param applyID 申請人用戶編號
* @param nextDeptID 下一個處理人部門編號,當下一個任務處理物件為動態指定時該參數有效
* @param nextGroupID 下一個處理人群組編號 當下一個任務處理物件為動態指定時該參數有效
* 黨procType=WfConstants.GROUP_MASTER時該值表示給那一個群組.
* @param nextRoleID 下一個處理人角色編號,當下一個任務處理物件為動態指定時該參數有效
* @param nextUserID 下一個處理人用戶編號 當下一個任務處理物件為動態指定時該參數有效
* @param 另對於NextDeptID與NextGroupID,兩者選其中一個,不可以兩者都null,也不可以兩者都非null.
* @return 處理成功 返回 true;處理失敗 返回 false;
*/
public boolean startFile(int flowID,int eventID,int upFileID,int upStateID,
String fileInfoid,String title,float limTime ,int applyID,
int nextDeptID,int nextGroupID,int nextRoleID,int nextUserID)
{
boolean flag ;//方法執行成功,失敗標誌.
int taskID= -1;
int teamType=0;
int[] teamDeptID=new int[1], teamGroupID=new int[1], teamRoleID=new int[1], teamUserID=new int[1];
try
{
conn.setAutoCommit(false);
//實例化流程
taskID=this.newFile(flowID,upFileID,upStateID,fileInfoid,title,limTime,applyID);
if(taskID<1)
{
this.conn.rollback();
this.conn.setAutoCommit(true);
return false;
}
conn.commit();
conn.setAutoCommit(true);
//處理該流程實例的開始狀態下的指定事件。
flag=this.procTask(taskID,eventID,applyID, nextDeptID, nextGroupID,nextRoleID,nextUserID,
teamType, teamDeptID,teamGroupID, teamRoleID,teamUserID);
if(!flag)
{
this.errMsg="開始任務處理失敗!";
return false;
}
return true;
}
catch(Exception ex)
{
this.errMsg="系統執行異常!";
conn.rollback();
conn.setAutoCommit(true);
return false;
}
}
/**
* <P>方法功能:</p>
* <p>流程啟動</p>
* <p>方法描述:<p>
* 該方法用於流程的開始狀態,調用該方法啟動指定的流程,並創建流程實例,完成開始狀態下指定事件的處理
* @param flowID 流程編號
* @param eventID 當前執行的事件編號
* @param upFileID 父實例編號
* @param upStateID 父狀態編號
* @param fileInfoid 文號
* @param title 主旨
* @param limTime 限辦時間
* @param app