📄 statemachine.java
字号:
package cn.myapps.core.workflow.engine;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.TreeMap;
import cn.myapps.base.dao.PersistenceUtils;
import cn.myapps.constans.Environment;
import cn.myapps.core.department.ejb.DepartmentVO;
import cn.myapps.core.dynaform.document.ejb.DocumentProcess;
import cn.myapps.core.role.ejb.RoleVO;
import cn.myapps.core.user.action.WebUser;
import cn.myapps.core.workflow.FlowState;
import cn.myapps.core.workflow.FlowType;
import cn.myapps.core.workflow.element.AbortNode;
import cn.myapps.core.workflow.element.AutoNode;
import cn.myapps.core.workflow.element.CompleteNode;
import cn.myapps.core.workflow.element.Element;
import cn.myapps.core.workflow.element.FlowDiagram;
import cn.myapps.core.workflow.element.ManualNode;
import cn.myapps.core.workflow.element.Node;
import cn.myapps.core.workflow.element.Relation;
import cn.myapps.core.workflow.element.StartNode;
import cn.myapps.core.workflow.element.SuspendNode;
import cn.myapps.core.workflow.element.TerminateNode;
import cn.myapps.core.workflow.storage.definition.ejb.BillDefiProcess;
import cn.myapps.core.workflow.storage.definition.ejb.BillDefiVO;
import cn.myapps.core.workflow.storage.runtime.ejb.ActorHIS;
import cn.myapps.core.workflow.storage.runtime.ejb.ActorRT;
import cn.myapps.core.workflow.storage.runtime.ejb.ActorRTProcess;
import cn.myapps.core.workflow.storage.runtime.ejb.FlowStateRT;
import cn.myapps.core.workflow.storage.runtime.ejb.FlowStateRTProcess;
import cn.myapps.core.workflow.storage.runtime.ejb.NodeRT;
import cn.myapps.core.workflow.storage.runtime.ejb.NodeRTProcess;
import cn.myapps.core.workflow.storage.runtime.ejb.RelationHIS;
import cn.myapps.core.workflow.storage.runtime.ejb.RelationHISProcess;
import cn.myapps.core.workflow.utility.NameList;
import cn.myapps.core.workflow.utility.NameNode;
import cn.myapps.util.ProcessFactory;
import cn.myapps.util.property.DefaultProperty;
import cn.myapps.util.sequence.Sequence;
public class StateMachine {
public static BillDefiProcess getBillDefiProcess()
throws ClassNotFoundException {
return (BillDefiProcess) ProcessFactory
.createProcess(BillDefiProcess.class);
}
public static NodeRTProcess getNodeRTProcess()
throws ClassNotFoundException {
return (NodeRTProcess) ProcessFactory
.createProcess(NodeRTProcess.class);
}
public static FlowStateRTProcess getFlowStateRTProcess()
throws ClassNotFoundException {
return (FlowStateRTProcess) ProcessFactory
.createProcess(FlowStateRTProcess.class);
}
public static RelationHISProcess getRelationHISProcess()
throws ClassNotFoundException {
return (RelationHISProcess) ProcessFactory
.createProcess(RelationHISProcess.class);
}
public static ActorRTProcess getActorRTProcess()
throws ClassNotFoundException {
return (ActorRTProcess) ProcessFactory
.createProcess(ActorRTProcess.class);
}
public static DocumentProcess getDocumentProcess()
throws ClassNotFoundException {
return (DocumentProcess) ProcessFactory
.createProcess(DocumentProcess.class);
}
/**
* 流程处理
*
* @param docid
* @param flowVO
* @param currid
* @param nextids
* @param user
* @param flowType
* @param attitude
* 审批意见
* @throws Exception
*/
public static void doFlow(String docid, BillDefiVO flowVO, String currid,
String[] nextids, WebUser user, String flowType, String attitude,
Environment evt) throws Exception {
// 获取所有下一步结点
String flow = flowVO.getFlow();
WFRunner wfr = new WFRunner(flow);
FlowDiagram fd = wfr.getFlowDiagram();
Collection nodeList = fd.getNodeListByIds(nextids);
Node nextNode = null;
for (Iterator iter = nodeList.iterator(); iter.hasNext();) {
Node node = (Node) iter.next();
if (node instanceof ManualNode || node instanceof AutoNode) {
} else {
nextNode = node;
break;
}
}
// 查找当前NodeRT
NodeRT currNodeRT = (NodeRT) getNodeRTProcess().doView(docid,
flowVO.getId(), user);
Node currNode = null;
if (currNodeRT != null) {
currNode = (Node) wfr.getElementByID(currNodeRT.getNodeid());
}
if (currNode == null && nextNode == null) {// 开始流程
start2running(docid, flowVO, currid, nextids, user, attitude, evt);
} else if (currNode instanceof ManualNode && nextNode == null) {// 送一下步
if (flowType.equals(FlowType.RUNNING2RUNNING_NEXT)) {
running2running_next(docid, flowVO, currid, nextids, user,
flowType, attitude, evt);
} else if (flowType.equals(FlowType.RUNNING2RUNNING_BACK)) {
running2running_back(docid, flowVO, currid, nextids, user,
flowType, attitude, evt);
}
} else {
if (currNode instanceof StartNode
&& nextNode instanceof TerminateNode) {
start2terminate(docid, flowVO, currid, nextids, user, attitude,
evt);
} else if (currNode instanceof StartNode
&& nextNode instanceof CompleteNode) {
start2complete(docid, flowVO, currid, nextids, user, attitude,
evt);
} else if (currNode instanceof ManualNode
&& nextNode instanceof SuspendNode) {
running2suspend(docid, flowVO, currid, nextids, user, attitude,
evt);
} else if (currNode instanceof SuspendNode
&& nextNode instanceof AbortNode) {
suspend2abort(docid, flowVO, currid, nextids, user, attitude,
evt);
} else if (currNode instanceof SuspendNode && nextNode == null) {
suspend2running(docid, flowVO, currid, nextids, user, attitude,
evt);
} else if (currNode instanceof ManualNode
&& nextNode instanceof TerminateNode) {
running2termiate(docid, flowVO, currid, nextids, user,
attitude, evt);
} else if (currNode instanceof SuspendNode
&& nextNode instanceof SuspendNode) {
suspend2suspend(docid, flowVO, currid, nextids, user, attitude,
evt);
} else if (currNode instanceof ManualNode
&& nextNode instanceof CompleteNode) {
running2complete(docid, flowVO, currid, nextids, user,
attitude, evt);
} else if (currNode instanceof ManualNode
&& nextNode instanceof AbortNode) {
running2about(docid, flowVO, currid, nextids, user, attitude,
evt);
}
}
}
/**
* 送下一步、回退 均由此方法实现
*/
private synchronized static boolean flowTo(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String flowType,
String attitude, Environment evt) throws Exception {
PersistenceUtils.beginTransaction();
// 获取所有下一步结点
FlowDiagram fd = flowVO.toFlowDiagram();
boolean isPassed = false;
Collection nodeList = fd.getNodeListByIds(nextids);
NodeRT currNodeRT = (NodeRT) getNodeRTProcess().doView(docid,
flowVO.getId(), user);
// 当为开始节点
StartNode startNode = null;
if (currNodeRT == null) {
startNode = (StartNode) fd.getElementByID(currid);
currNodeRT = getNodeRTProcess().doCreate(docid, flowVO, startNode);
}
// 创建新的NodeRT
Date actionTime = new Date();
for (Iterator iter = nodeList.iterator(); iter.hasNext();) {
Node nd = (Node) iter.next();
boolean isExist = false;// NodeRT已存在,不需要创建新的NodeRT!
Collection nextNodeRTList = getNodeRTProcess()
.queryNodeRTByDocidAndFlowid(docid, flowVO.getId());
for (Iterator iter2 = nextNodeRTList.iterator(); iter2.hasNext();) {
NodeRT nrt = (NodeRT) iter2.next();
if (nrt.getNodeid().equals(nd.id)) {
isExist = true;
break;
}
}
// 根据当前节点角色检查是否通过
String startnodeid = currNodeRT.getNodeid();
String endnodeid = nd.id;
// 验证
Object obj = fd.validate(startnodeid, endnodeid);
if (obj != null && !(obj.toString()).equals("")) {
throw new Exception(obj.toString());
}
if (flowType.equals(FlowType.RUNNING2RUNNING_NEXT)
|| flowType.equals(FlowType.RUNNING2COMPLETE)) {
Collection actorList = currNodeRT.getActorrts();
// 设置角色为已处理
for (Iterator iterator = actorList.iterator(); iterator
.hasNext();) {
ActorRT actorrt = (ActorRT) iterator.next();
if (actorrt.isEquals(user)) {
actorrt.setIsprocessed(true);
getActorRTProcess().doUpdate(actorrt);
}
}
isPassed = isPassed(docid, flowVO, currNodeRT);
} else {
isPassed = true;
}
if (isPassed || startNode != null) { // 送下一步必须符合条件
if (!isExist)
if (flowType.equals(FlowType.RUNNING2SUSPEND)) {
getNodeRTProcess().doCreate(docid, flowVO, nd, user);
} else {
if (flowType.equals(FlowType.RUNNING2ABORT)
|| flowType.equals(FlowType.RUNNING2COMPLETE)
|| flowType.equals(FlowType.RUNNING2TERMIATE)) {
// 删除所有运行时节点
removeAllNodeRT(docid, flowVO.getId());
} else if (flowType.equals(FlowType.SUSPEND2RUNNING)
|| flowType
.equals(FlowType.RUNNING2RUNNING_BACK)) {
String tmp = startnodeid;
startnodeid = endnodeid;
endnodeid = tmp;
}
getNodeRTProcess().doCreate(docid, flowVO, nd);
}
// 删除旧的NodeRT
if (currNodeRT != null) {
getNodeRTProcess().doRemove(currNodeRT.getId());
}
Object rtn = fd.runAction(startnodeid, endnodeid); // 执行宏语言后的返回值
System.out.println("runAction->" + rtn);
}
// 改变关系历史
changeRelationHIS(docid, flowVO, currNodeRT, nd, user, actionTime,
attitude);
// 改变流程图,改变当前节点,并改变已走线路
changeFlowImage(docid, flowVO.getId(), fd);
// 生成流程图
toJpegImage(docid, fd, evt);
PersistenceUtils.commitTransaction();
}
return isPassed;
}
/**
* 开始->运行
*/
private static void start2running(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String attitude,
Environment evt) throws Exception {
flowTo(docid, flowVO, currid, nextids, user, FlowType.START2RUNNING,
attitude, evt);
changeFlowState(docid, flowVO, FlowState.RUNNING);
}
/**
* 运行->运行 送下一步
*/
private static void running2running_next(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String flowType,
String attitude, Environment evt) throws Exception {
flowTo(docid, flowVO, currid, nextids, user, flowType, attitude, evt);
changeFlowState(docid, flowVO, FlowState.RUNNING);
}
/**
* 运行->运行 回退
*/
private static void running2running_back(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String flowType,
String attitude, Environment evt) throws Exception {
flowTo(docid, flowVO, currid, nextids, user, flowType, attitude, evt);
changeFlowState(docid, flowVO, FlowState.RUNNING);
}
/**
* 开始-〉终止
*/
private static void start2terminate(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String attitude,
Environment evt) throws Exception {
flowTo(docid, flowVO, currid, nextids, user, FlowType.START2TERMINATE,
attitude, evt);
// 改变NodeRT 状态为 FlowState.TERMINAT
changeFlowState(docid, flowVO, FlowState.TERMINAT);
}
/**
* 开始-〉完成
*/
private static void start2complete(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String attitude,
Environment evt) throws Exception {
boolean isPassed = flowTo(docid, flowVO, currid, nextids, user, "",
attitude, evt);
// 改变NodeRT 状态为 FlowState.COMPLETE
if (isPassed) {
changeFlowState(docid, flowVO, FlowState.COMPLETE);
}
}
/**
* 运行-〉挂起
*/
private static void running2suspend(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String attitude,
Environment evt) throws Exception {
flowTo(docid, flowVO, currid, nextids, user, FlowType.RUNNING2SUSPEND,
attitude, evt);
// 改变NodeRT 状态为 FlowState.SUSPEND
changeFlowState(docid, flowVO, FlowState.SUSPEND);
}
/**
* 挂起-〉恢复
*/
private static void suspend2running(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String attitude,
Environment evt) throws Exception {
flowTo(docid, flowVO, currid, nextids, user, FlowType.SUSPEND2RUNNING,
attitude, evt);
// 改变NodeRT 状态为 FlowState.RUNNING
changeFlowState(docid, flowVO, FlowState.RUNNING);
}
/**
* 挂起-〉取消
*/
private static void suspend2abort(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String attitude,
Environment evt) throws Exception {
flowTo(docid, flowVO, currid, nextids, user, FlowType.SUSPEND2ABORT,
attitude, evt);
// 改变NodeRT 状态为 FlowState.ABORT
changeFlowState(docid, flowVO, FlowState.ABORT);
}
/**
* 运行-〉取消
*/
private static void running2about(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String attitude,
Environment evt) throws Exception {
flowTo(docid, flowVO, currid, nextids, user, FlowType.RUNNING2ABORT,
attitude, evt);
// 改变NodeRT 状态为 FlowState.ABORT
changeFlowState(docid, flowVO, FlowState.ABORT);
}
/**
* 运行-〉完成
*/
private static void running2complete(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String attitude,
Environment evt) throws Exception {
boolean isPassed = flowTo(docid, flowVO, currid, nextids, user,
FlowType.RUNNING2COMPLETE, attitude, evt);
if (isPassed) {
changeFlowState(docid, flowVO, FlowState.COMPLETE);
} else {
changeFlowState(docid, flowVO, FlowState.RUNNING);
}
}
/**
* 运行-〉终止
*/
private static void running2termiate(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String attitude,
Environment evt) throws Exception {
flowTo(docid, flowVO, currid, nextids, user, FlowType.RUNNING2TERMIATE,
attitude, evt);
// 改变NodeRT 状态为 FlowState.TERMINAT
changeFlowState(docid, flowVO, FlowState.TERMINAT);
}
/**
* 挂起-〉挂起
*/
private static void suspend2suspend(String docid, BillDefiVO flowVO,
String currid, String[] nextids, WebUser user, String attitude,
Environment evt) throws Exception {
flowTo(docid, flowVO, currid, nextids, user, FlowType.SUSPEND2SUSPEND,
attitude, evt);
changeFlowState(docid, flowVO, FlowState.SUSPEND);
}
/**
* 获取第一步处理结点列表
*
* @return Collection of ManualNodes、AutoNodes、...
* @throws Exception
*/
public static Collection getFirstNodeList(String docid, String flowid,
WebUser user) throws Exception {
Collection rtn = new ArrayList();
BillDefiProcess bp = (BillDefiProcess) ProcessFactory
.createProcess(BillDefiProcess.class);
BillDefiVO flowVO = (BillDefiVO) bp.doView(flowid);
if (flowVO != null) {
rtn = getFirstNodeList(docid, flowVO, user);
}
return rtn;
}
public static Collection getFirstNodeList(String docid, BillDefiVO flowVO,
WebUser user) {
ArrayList rtn = new ArrayList();
String flow = flowVO.getFlow();
WFRunner wfr = new WFRunner(flow);
FlowDiagram fd = wfr.getFlowDiagram();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -