⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 statemachine.java

📁 OBPM是一个开源
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -