zoukankan      html  css  js  c++  java
  • 工作流(workflow)

    package com.byd.mes.plugins.workFlow;
    
    import java.util.List;
    
    import java.util.Map;
    
    import com.byd.mes.bussiness.bo.main.OperationBO;
    import com.byd.mes.bussiness.bo.main.ResourceBO;
    import com.byd.mes.bussiness.bo.main.RouterBO;
    import com.byd.mes.bussiness.bo.siteoperation.sfc.SfcInfoBO;
    import com.byd.mes.bussiness.bo.system.UserBO;
    import com.bydwf.vo.NodeVo;
    
    public interface BydWorkFlowService{
    
    	public interface Event{
    		void execute(SfcInfoBO sfc,RouterBO routerBo,OperationBO operation,ResourceBO resource,NodeVo nodeVo,UserBO userBo,WFContext wfContext);
    	}
    	
    	public class WFContext{
    		private BydWorkFlowService s;
    		
    		public WFContext(BydWorkFlowService s){
    			this.s = s;
    		}
    		public NodeVo getFirstNode(RouterBO routerBo){
    			return this.s.getFirstNode(routerBo);
    		}
    		public List<NodeVo> getAllNodes(RouterBO router){
    			return this.s.getAllNodes(router);
    		}
    		public List<NodeVo> getNextNodes(SfcInfoBO sfcInfoBo,String paramNodeId,Map contextproperties){
    			return this.s.getNextNodes(sfcInfoBo, paramNodeId, contextproperties);
    		}
    		public List<NodeVo> getNextNodes(RouterBO routerBo,String paramNodeId){
    			return this.s.getNextNodes(routerBo, paramNodeId);
    		}
    		public NodeVo getNodeById(RouterBO routerBo,String nodeId){
    			return this.s.getNodeById(routerBo, nodeId);
    		}
    		public RouterBO getPreviousRouter(SfcInfoBO sfcInfoBo){
    			return this.s.getPreviousRouter(sfcInfoBo);
    		}
    		public boolean isFirstOperation (OperationBO operation,RouterBO routerBo){
    			return this.s.isFirstOperation(operation, routerBo);
    		}
    		public boolean isNodeOperation(OperationBO operation,NodeVo nodeVo){
    			return this.s.isNodeOperation(operation, nodeVo);
    		}
    		public boolean isCurOperation(SfcInfoBO sfcInfoBo,OperationBO operationBo){
    			return this.s.isCurOperation(sfcInfoBo, operationBo);
    		}
    	} 
    	
    	/**
    	 * 发起工作流,生成工序步骤信息
    	 * @param parameter
    	 * @return
    	 */
    	void load(SfcInfoBO sfcInfoBo,RouterBO routerBo,UserBO userBo,String beforeLoadClass,String afterLoadClass,Map map);
    	
    	/**
    	 * 将SFC状态由排队改为活动,如果传入的工艺路线是特殊工艺路线,如果之前没有走过,则发起工作流,生成工序步骤信息,
    	 * 如果走过,则清空之前的工序步骤信息,然后到首工序活动
    	 * @param sfcInfoBo
    	 * @param routerBo
    	 * @param sfcOperationBO
    	 */
    	void start(SfcInfoBO sfcInfoBo,OperationBO operationBO,ResourceBO resourceBo,RouterBO routerBo,UserBO userBo,String beforeStartClass,String afterStartClass,Map map);
    	
    	/**
    	 * 跳到到下一节点
    	 * @param sfcInfoBo
    	 * @param fromNodeId
    	 * @param toNodeId
    	 * @return
    	 */
    	void approve(SfcInfoBO sfcInfoBo,RouterBO routerBo,String toNodeId,UserBO userBo,String beforeApproveClass,String afterApproveClass,Map map);
    		
    	/**
    	 * 获取第一个节点
    	 * @param sfcInfoBo
    	 * @return
    	 */
    	@Deprecated
    	NodeVo getFirstNode(RouterBO routerBo);	
    
    	/**
    	 * 获取所有节点
    	 * @param RouterBO
    	 * @return List<NodeVo>
    	 */
    	List<NodeVo> getAllNodes(RouterBO router);
    	
    	/**
    	 * 获取下一下节点集
    	 * @param sfcInfoBo
    	 * @return
    	 */
    	List<NodeVo> getNextNodes(SfcInfoBO sfcInfoBo,String paramNodeId,Map contextproperties);
    	
    	/**
    	 * 获取下一下节点集
    	 * @param sfcInfoBo
    	 * @return
    	 */
    	List<NodeVo> getNextNodes(RouterBO routerBo,String paramNodeId);
    
    	/**
    	 * 获取节点流程定义信息
    	 * @param routerBo
    	 * @param nodeId
    	 * @return
    	 */
    	NodeVo getNodeById(RouterBO routerBo,String nodeId);
    	/**
    	 * 获取上一步工艺路线
    	 * @param sfcInfoBo
    	 * @return
    	 */
    	RouterBO getPreviousRouter(SfcInfoBO sfcInfoBo);
    	
    	/**
    	 * 校验工序是否是工艺路线的首工序
    	 * @param operation
    	 * @param routerBo
    	 * @return
    	 */
    	boolean isFirstOperation (OperationBO operation,RouterBO routerBo);
    	
    	/**
    	 * 校验工序是否是步骤的工序
    	 * @param operation
    	 * @param nodeVo
    	 * @return
    	 */
    	boolean isNodeOperation(OperationBO operation,NodeVo nodeVo);
    	
    	/**
    	 * 校验工序是否是SFC当前所在工序
    	 * @param sfcInfoBo
    	 * @param operationBo
    	 * @return
    	 */
    	boolean isCurOperation(SfcInfoBO sfcInfoBo,OperationBO operationBo);
    }
    /**
     * *CreateTime:2010-12-2 下午04:35:17
     *Description:MES功能点已工作流对接接口默认实现类
    */
    package com.byd.mes.plugins.workFlow.impl;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.script.Invocable;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    import com.byd.mes.bussiness.bo.main.OperationBO;
    import com.byd.mes.bussiness.bo.main.ResourceBO;
    import com.byd.mes.bussiness.bo.main.RouterBO;
    import com.byd.mes.bussiness.bo.main.StatusBO;
    import com.byd.mes.bussiness.bo.siteoperation.podmanager.ActivityInfoBO;
    import com.byd.mes.bussiness.bo.siteoperation.sfc.SfcInfoBO;
    import com.byd.mes.bussiness.bo.siteoperation.sfc.SfcOperationBO;
    import com.byd.mes.bussiness.bo.siteoperation.sfc.SfcRouterBO;
    import com.byd.mes.bussiness.bo.system.UserBO;
    import com.byd.mes.bussiness.service.ServiceException;
    import com.byd.mes.bussiness.service.activity.ExecuteActivityService;
    import com.byd.mes.bussiness.service.main.OperationService;
    import com.byd.mes.bussiness.service.main.ResourceService;
    import com.byd.mes.bussiness.service.main.RouterService;
    import com.byd.mes.bussiness.service.main.StatusService;
    import com.byd.mes.bussiness.service.siteoperation.podmanager.ActivityInfoService;
    import com.byd.mes.bussiness.service.siteoperation.sfc.SfcInfoService;
    import com.byd.mes.bussiness.service.siteoperation.sfc.SfcOperationService;
    import com.byd.mes.bussiness.service.siteoperation.sfc.SfcRouterService;
    import com.byd.mes.plugins.workFlow.BydWorkFlowService;
    import com.byd.mes.util.BeanFactory;
    import com.bydwf.util.MesWfutil;
    import com.bydwf.vo.NodeVo;
    import com.ibatis.sqlmap.client.SqlMapClient;
    
    public class BydWorkFlowServiceImpl implements BydWorkFlowService{
    	private static final Log log = LogFactory.getLog(BydWorkFlowServiceImpl.class);
    	private SfcInfoService sfcInfoService;
    	private StatusService statusService;
    	private SfcOperationService sfcOperationService;
    	private SfcRouterService sfcRouterService;
    	private RouterService routerService;
    	private OperationService operationService;
    	private SqlMapClient sqlMapClient;
    	private ResourceService resourceService;
    	private ExecuteActivityService executeActivityService;
    	private ActivityInfoService activityInfoService;
    	
    	static private final String EVENT_BEFORE_LOAD = "BEFORE_LOAD";
    	static private final String EVENT_AFTER_LOAD = "AFTER_LOAD";
    	static private final String EVENT_BEFORE_APPROVE = "BEFORE_APPROVE";
    	static private final String EVENT_AFTER_APPROVE = "AFTER_APPROVE";
    	static private final String EVENT_BEFORE_START = "BEFORE_START";
    	static private final String EVENT_AFTER_START = "AFTER_START";
    	private Map<String,String[]> listener;
    		
    	@Override
    	public void start(SfcInfoBO sfcInfoBo,OperationBO operationBO,ResourceBO resourceBo,RouterBO routerBo,UserBO userBo,String beforeStartClass,String afterStartClass,Map map) {
    	    Date curDate = new Date();
    	    //校验SfcInfo是否为空
    	    if(sfcInfoBo == null){
    	    	throw new ServiceException("2001","调用MES工作流方法[START]时,传入的SfcInfoBO对象为空!");
    	    }
    	    if(StringUtils.isEmpty(sfcInfoBo.getId())){
    	    	throw new ServiceException("2002","调用MES工作流方法[START]时,传入的SfcInfoBO对象的ID属性值为空!");
    	    }
    	    
    	    //校验OperationBO是否为空
    	    if(operationBO == null){
    	    	throw new ServiceException("2003","调用MES工作流方法[START]时,传入的OperationBO对象为空!");
    	    }
    	    if(StringUtils.isEmpty(operationBO.getId())){
    	    	throw new ServiceException("2004","调用MES工作流方法[START]时,传入的OperationBO对象的ID属性值为空!");
    	    }
    	    
    	    //校验ResourceBO是否为空
    	    if(resourceBo == null){
    	    	throw new ServiceException("2005","调用MES工作流方法[START]时,传入的ResourceBO对象为空!");
    	    }
    	    if(StringUtils.isEmpty(resourceBo.getId())){
    	    	throw new ServiceException("2006","调用MES工作流方法[START]时,传入的ResourceBO对象的ID属性值为空!");
    	    }
    	    
    	    //校验RouterBO是否为空
    	    if(routerBo == null){
    	    	throw new ServiceException("2005","调用MES工作流方法[START]时,传入的RouterBO对象为空!");
    	    }
    	    if(StringUtils.isEmpty(routerBo.getId())){
    	    	throw new ServiceException("2006","调用MES工作流方法[START]时,传入的RouterBO对象的ID属性值为空!");
    	    }
    	    
    	    //校验UserBO是否为空
    	    if(userBo == null){
    	    	throw new ServiceException("2007","调用MES工作流方法[START]时,传入的UserBO对象为空!");
    	    }
    	    if(StringUtils.isEmpty(userBo.getId())){
    	    	throw new ServiceException("2008","调用MES工作流方法[START]时,传入的UserBO对象的ID属性值为空!");
    	    }
    	    
    	    
    		//查询Sfc基本信息
    		try{
    			sfcInfoBo = sfcInfoService.findByPk(sfcInfoBo.getId());	
    		}catch(Exception ex){
    			throw new ServiceException("2100","执行MES工作流方法[START]时,根据SFC ID["+sfcInfoBo.getId()+"]查询SFC 基本信息失败!",ex);
    		}		
    		if(sfcInfoBo == null){
    			throw new ServiceException("2101","执行MES工作流方法[START]时,SFC无效!");
    		}
    		
    		//查询工艺路线信息
    		try{
    			routerBo = routerService.findByPk(routerBo.getId());
    		}catch(Exception ex){
    			throw new ServiceException("2103","SFC["+sfcInfoBo.getSfcNo()+"]在开始之前根据工艺路线 ID["+routerBo.getId()+"]查询工艺路线基本信息失败!",ex);
    		}		
    		if(routerBo == null){
    			throw new ServiceException("2104","执行MES工作流方法[START]时,工艺路线无效!");
    		}
    		
    		//查询资源
    		try{
    			resourceBo = resourceService.findByPk(resourceBo.getId());
    		}catch(Exception ex){
    			throw new ServiceException("2105","SFC["+sfcInfoBo.getSfcNo()+"]在开始之前根据资源 ID["+resourceBo.getId()+"]查询资源基本信息失败!",ex);
    		}		
    		if(resourceBo == null){
    			throw new ServiceException("2106","执行MES工作流方法[START]时,资源(ResourceBO)无效!");
    		}
    		
    		//查询工序
    		try{
    			operationBO=this.operationService.findByPk(operationBO.getId());
    		}catch(Exception ex){
    			throw new ServiceException("2107","SFC["+sfcInfoBo.getSfcNo()+"]在开始之前根据 工序ID["+operationBO.getId()+"]查询 工序基本信息失败!",ex);
    		}		
    		if(operationBO == null){
    			throw new ServiceException("2108","执行MES工作流方法[START]时,工序无效!");
    		}
    						
    		//查询SFC"活动"状态对象
    		StatusBO statusActiveBo=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.sfc.status"),
    				BeanFactory.getSystemParamters().get("mes.siteoperation.sfc.status.active"));
    		//查询SFC工序步骤"活动"状态对象
    		StatusBO  operationActiveStatus=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus"),
    				BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus.active"));
    		
    		MesWfutil mesWfUtil =null;
    		NodeVo firstNode=null;
    		List<NodeVo> allNodes=null;
    		
    		//获取工艺路线上的所有节点
    		try{
    			mesWfUtil = new MesWfutil(sqlMapClient);
    			allNodes = mesWfUtil.getAllNodes(routerBo.getNo(), routerBo.getVersion());		
    		}catch(Exception ex){
    			throw new ServiceException("3003","调用工作流方法[getAllNodes]根据工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]查询工艺路线所有工序步骤失败!",ex);
    		}		
    		if(allNodes == null || allNodes.size() <= 0){
    			throw new ServiceException("3004","工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]没有工序步骤!");
    		}
    		
    		//获取工艺路线上的第一个节点
    		try{
    			firstNode =this.getFirstNode(routerBo);
    		}catch(Exception ex){
    			throw new ServiceException("3002","调用工作流方法[getFirsetNode]根据工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]查询工艺路线第一个工序步骤失败!",ex);
    		}
    		if(firstNode == null){
    			throw new ServiceException("3005","工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]没有首工序步骤!");
    		}
    		
    		//BeforeLoad:执行二次开发接口业务处理类
    		log.debug(">>>>>>>>>>>>>>>>>>>>>>Execute Before Start Listener ");
    		this.executeEvent(this.EVENT_BEFORE_START, sfcInfoBo, routerBo, operationBO, resourceBo, null, userBo);
    		
    		
    		//A:校验SFC当前是否在传入的工艺路线上,是则校验SFC当前排队工序是否是传入的工序,是则将排队改为活动
    		if(sfcInfoBo.getSfcRouter()!= null && 
    				StringUtils.isNotEmpty(sfcInfoBo.getSfcRouter().getId()) && 
    				sfcInfoBo.getRouter().getId().equals(routerBo.getId())){
    			
    			//校验SFC当前是否是排队状态
    			if(this.sfcInfoService.isQuence(sfcInfoBo)){				
    				//查询SFC当前工艺路线信息(SfcRouterBO)
    				SfcRouterBO  sfcRouterBO= null;
    				try {
    					sfcRouterBO=this.sfcRouterService.findByUk(sfcInfoBo.getSite().getId(), sfcInfoBo.getId(), routerBo.getId());				
    				} catch (Exception ex) {
    					throw new ServiceException("2118","根据SFC["+sfcInfoBo.getSfcNo()+"]工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]查询SFC工艺路线(SfcRouterBO)信息失败!",ex);
    				}
    				
    				//A1:如果是步骤组:如果步骤类型是"SIMULTANEITY",则将开始变为活动,如果是"RANDOM",则将当前传入的工序步骤变为活动,将步骤中的其他步骤清空
    				if( sfcRouterBO != null && 
    					StringUtils.isNotEmpty(sfcRouterBO.getNodeGroup())){
    					NodeVo nodeGroup = null;
    					//查询步骤组代表节点信息
    					try{
    						nodeGroup = mesWfUtil.getNodeById(routerBo.getNo(),routerBo.getVersion(), sfcRouterBO.getNodeGroup());
    					}catch(Exception ex){
    						throw new ServiceException("3001","调用工作流方法[getNodeById]根据工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]工序步骤ID["+sfcRouterBO.getNodeGroup()+"]查询工序步骤基本信息失败!",ex);
    					}
    					if(nodeGroup == null){
    						throw new ServiceException("3006","在工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]上没有找到工序步骤["+sfcRouterBO.getNodeGroup()+"]!");
    					}
    					
    					//查询步骤组中的所有工序步骤
    					List<SfcOperationBO> sfcOperations = null;
    					SfcOperationBO sfcOperationBo = new SfcOperationBO();
    					sfcOperationBo.setSite(sfcRouterBO.getSite());
    					sfcOperationBo.setSfcRouter(sfcRouterBO);
    					sfcOperationBo.setStepGroup(sfcRouterBO.getNodeGroup());
    					try {						
    						sfcOperations = sfcOperationService.find(sfcOperationBo );
    					} catch (Exception ex) {
    						throw new ServiceException("2310","查询SFC["+sfcInfoBo.getSfcNo()+"]在工艺路线RouterBo["+routerBo.getNo()+"]["+routerBo.getVersion()+"]上的工序步骤信息失败!",ex);
    					}
    					if(sfcOperations == null || sfcOperations.size() <= 0 ){
    						throw new ServiceException("2318","SFC["+sfcInfoBo.getSfcNo()+"]在工艺路线RouterBo["+routerBo.getNo()+"]["+routerBo.getVersion()+"]上的步骤组["+sfcRouterBO.getNodeGroup()+"]中的步骤信息为空!");
    					}
    					
    					//校验SFC是否是在步骤组上排队
    					boolean isInNodeGroup = false;
    					for(SfcOperationBO sob : sfcOperations){
    						if(StringUtils.equals(operationBO.getId(), sob.getOperation().getId())){
    							isInNodeGroup = true;
    						}
    					}
    					if(!isInNodeGroup){
    						throw new ServiceException("2319","SFC["+sfcInfoBo.getSfcNo()+"]不在工序["+operationBO.getNo()+"]上排队,它在步骤组["+nodeGroup.getNodeId()+"]上排队");
    					}
    					
    					for(SfcOperationBO sob : sfcOperations){
    						//如果传入工序在步骤组中,则将传入工序的步骤状态改为活动
    						if(StringUtils.equals(operationBO.getId(), sob.getOperation().getId())){
    							//更改SFC(SfcInfoBO)相关信息
    							sfcInfoBo.setOriginalStatus(sfcInfoBo.getStatus());
    							sfcInfoBo.setStatus(statusActiveBo);					
    							sfcInfoBo.setOperationStepStatus(operationActiveStatus);
    							sfcInfoBo.setLastHandleUser(userBo);
    							sfcInfoBo.setLastHandleTime(curDate);
    							sfcInfoBo.setCurrentResource(resourceBo);
    							 
    							sfcInfoBo.setOperation(operationBO);
    							sfcInfoBo.setSfcOperation(sob);
    							try {
    								this.sfcInfoService.update(sfcInfoBo);
    							} catch (Exception ex) {
    								throw new ServiceException("2110","更新SFC["+sfcInfoBo.getSfcNo()+"]基本信息(SfcInfoBO)信息失败!",ex);
    							}
    							
    							//更新SfcRouter信息
    							try {
    								sfcRouterBO.setLastSfcOperationStep(sob);
    								this.sfcRouterService.update(sfcRouterBO);
    							} catch (Exception ex) {
    								throw new ServiceException("4004","更新SFC["+sfcInfoBo.getSfcNo()+"]的SFC工艺路线(SfcRouterBO)["+sfcRouterBO.getId()+"]中的当前工序步骤失败!",ex);
    							}
    							
    							//更新SfcOperation信息
    							try {
    								sob.setStatus(operationActiveStatus);
    								sob.setTriggerUser(userBo);
    								sob.setActiveDate(curDate);
    								sob.setActiveNum(sob.getActiveNum()+1);
    								this.sfcOperationService.update(sob);						
    							} catch (Exception ex) {
    								throw new ServiceException("2112","更新SFC["+sfcInfoBo.getSfcNo()+"]SFC工序步骤(sfcOperationBO)信息失败!",ex);
    							}
    						}else{							
    							//“RANDOM” 步骤组,任意步骤组,如果在一个步骤上开始了,则必须清空步骤组中的其他步骤的状态
    							if(StringUtils.equals("RANDOM", nodeGroup.getNodeGroupType())){
    								try {
    									StatusBO  operationDoneStatus=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus"),
    											BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus.complete"));
    									if(sob.getStatus() != null && 
    											StringUtils.isNotEmpty(sob.getStatus().getId()) && 
    											!StringUtils.equals(sob.getStatus().getId(), operationDoneStatus.getId())){
    										sob.setSfcQty(0);
    										sob.setStatus(null);
    										sob.setActiveDate(curDate);
    										sob.setTriggerUser(userBo);
    										sob.setPreviousOperation(null);
    										this.sfcOperationService.update(sob);
    									}															
    								} catch (Exception ex) {
    									throw new ServiceException("2112","更新SFC["+sfcInfoBo.getSfcNo()+"]SFC工序步骤(sfcOperationBO)信息失败!",ex);
    								}
    							}
    						}
    					}
    				}else{//A2:不是步骤组
    					//校验SFC当前所在工序是否是传入的工序
    					if(sfcInfoBo.getOperation().equals(operationBO)){
    						//更改SFC(SfcInfoBO)相关信息
    						sfcInfoBo.setOriginalStatus(sfcInfoBo.getStatus());
    						sfcInfoBo.setStatus(statusActiveBo);					
    						sfcInfoBo.setOperationStepStatus(operationActiveStatus);
    						sfcInfoBo.setLastHandleUser(userBo);
    						sfcInfoBo.setLastHandleTime(curDate);
    						sfcInfoBo.setCurrentResource(resourceBo);
    						try {
    							this.sfcInfoService.update(sfcInfoBo);
    						} catch (Exception ex) {
    							throw new ServiceException("2110","更新SFC["+sfcInfoBo.getSfcNo()+"]基本信息(SfcInfoBO)信息失败!",ex);
    						}
    						
    						//更改SFC SFC工序步骤(SfcOperationBO)相关信息
    						SfcOperationBO sfcOperationBO = null;
    						try{
    							sfcOperationBO=sfcOperationService.findByPk(sfcInfoBo.getSfcOperation().getId());
    						}catch(Exception ex){
    							throw new ServiceException("2111","SFC["+sfcInfoBo.getSfcNo()+"]在开始之前根据 SFC当前工序步骤ID["+sfcInfoBo.getSfcOperation().getId()+"]查询 SFC工序步骤(sfcOperationBO)信息失败!",ex);
    						}
    						sfcOperationBO.setStatus(operationActiveStatus);
    						sfcOperationBO.setTriggerUser(userBo);
    						sfcOperationBO.setActiveDate(curDate);
    						sfcOperationBO.setActiveNum(sfcOperationBO.getActiveNum()+1);
    						try {
    							this.sfcOperationService.update(sfcOperationBO);						
    						} catch (Exception ex) {
    							throw new ServiceException("2112","更新SFC["+sfcInfoBo.getSfcNo()+"]SFC工序步骤(sfcOperationBO)信息失败!",ex);
    						}
    					}else{
    						throw new ServiceException("2113","SFC["+sfcInfoBo.getSfcNo()+"]不在工序["+operationBO.getNo()+"]上排队,它在工序["+sfcInfoBo.getOperation().getNo()+"]上排队");
    					}
    				}
    			}else{
    				StatusBO Status=this.statusService.findByPk(sfcInfoBo.getStatus().getId());
    				throw new ServiceException("2114","SFC["+sfcInfoBo.getSfcNo()+"]不在工序["+operationBO.getNo()+"]上排队,它在工序["+sfcInfoBo.getOperation().getNo()+"]"+Status.getNo() );
    			}
    		}else{
    			//B:SFC当前不在传入的工艺路线上,校验传入工序是否是传入工艺路线的首工序,是则校验传入工艺路线之前有没有走过,没有走过,则生成工序步骤信息,走过,则清空之前的工艺路线信息,重新再走;						
    			if(isNodeOperation(operationBO,firstNode) ){
    				SfcRouterBO  sfcRouterBO= null;
    				try {
    					sfcRouterBO=this.sfcRouterService.findByUk(sfcInfoBo.getSite().getId(), sfcInfoBo.getId(), routerBo.getId());				
    				} catch (Exception ex) {
    					throw new ServiceException("2115","根据SFC["+sfcInfoBo.getSfcNo()+"]工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]查询SFC工艺路线(SfcRouterBO)信息失败!",ex);
    				}
    				//B1:传入工艺路线之前走过
    				if(sfcRouterBO!=null){
    					 //清空SFC工序步骤信息					
    					 List<SfcOperationBO> sfcOperations = null;
    					 SfcOperationBO sfcOperation = new SfcOperationBO();
    					 sfcOperation.setSite(sfcRouterBO.getSite());
    					 sfcOperation.setSfcRouter(sfcRouterBO);
    					 try {						
    						sfcOperations = sfcOperationService.find(sfcOperation );
    					 } catch (Exception ex) {
    						throw new ServiceException("2310","查询SFC["+sfcInfoBo.getSfcNo()+"]在工艺路线RouterBo["+routerBo.getNo()+"]["+routerBo.getVersion()+"]上的工序步骤信息失败!",ex);
    					 }
    					 for(SfcOperationBO sob:sfcOperations){
    						 sfcInfoBo = clearSfcOperationInfo(sfcInfoBo,sob,userBo,firstNode,operationActiveStatus,curDate,operationBO);				 
    					 }
    					 
    					 //Update SfcRouter
    					 sfcRouterBO.setPreviousRouter(sfcInfoBo.getSfcRouter());
    					 sfcRouterBO.setLastSfcOperationStep(sfcInfoBo.getSfcOperation());
    					 if(StringUtils.equals("NODEGROUP", firstNode.getExNodeType())){
    						 sfcRouterBO.setNodeGroup(firstNode.getNodeId());
    					 }
    					 try {
    							this.sfcRouterService.update(sfcRouterBO);
    						} catch (Exception ex) {
    							throw new ServiceException("2116","更新SFC["+sfcInfoBo.getSfcNo()+"]SFC工艺路线(SfcRouterBO)["+routerBo.getNo()+"]["+routerBo.getVersion()+"]中的当前工序步骤失败!",ex);
    					 }
    					 
    					 //update SfcInfo
    					 sfcInfoBo.setOriginalStatus(sfcInfoBo.getStatus());
    					 sfcInfoBo.setStatus(statusActiveBo);
    					 sfcInfoBo.setOperationStepStatus(operationActiveStatus);
    					 sfcInfoBo.setSfcRouter(sfcRouterBO);					 					 
    					 sfcInfoBo.setRouter(routerBo);
    					 sfcInfoBo.setOperation(operationBO);
    					 sfcInfoBo.setLastHandleUser(userBo);
    					 sfcInfoBo.setLastHandleTime(curDate);
    					 sfcInfoBo.setCurrentResource(resourceBo);
    					 try {
    						 this.sfcInfoService.update(sfcInfoBo);
    					 } catch (Exception ex) {
    						 throw new ServiceException("2117","更新SFC["+sfcInfoBo.getSfcNo()+"]基本信息(SfcInfoBO)信息失败!",ex);
    					 }				 
    					 
    				//B2:传入工艺路线之前没走过
    				}else{
    					//生成SFC工艺路线信息(SfcRouter), 更改它的上一工艺路线
    					createSfcRouterOperationInfo( sfcInfoBo,  routerBo,  userBo , allNodes,statusActiveBo,operationActiveStatus,firstNode,operationBO,curDate,resourceBo);
    				}
    			}else{
    				throw new ServiceException("2122","工序["+operationBO.getNo()+"]不是工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]的首工序,不能开始!");
    			}
    		}
    		
    		//AfterLoad:执行二次开发接口业务处理类
    		log.debug(">>>>>>>>>>>>>>>>>>>>>>Execute After Start Listener");
    		this.executeEvent(this.EVENT_AFTER_START, sfcInfoBo, routerBo, operationBO, resourceBo, null, userBo);
    	}
    	
    	@Override
    	public void load(SfcInfoBO sfcInfoBo,RouterBO routerBo,UserBO userBo,String beforeLoadClass,String afterLoadClass,Map mapParam){
    		Date curDate = new Date();
    		// TODO Auto-generated method stub	
    		//校验SfcInfo是否为空
    	    if(sfcInfoBo == null){
    	    	throw new ServiceException("2009","调用MES工作流方法[LOAD]时,传入的SfcInfoBO对象为空!");
    	    }
    	    if(StringUtils.isEmpty(sfcInfoBo.getId())){
    	    	throw new ServiceException("2010","调用MES工作流方法[LOAD]时,传入的SfcInfoBO对象的ID属性值为空!");
    	    }
    	    	    
    	    //校验RouterBO是否为空
    	    if(routerBo == null){
    	    	throw new ServiceException("2011","调用MES工作流方法[LOAD]时,传入的RouterBO对象为空!");
    	    }
    	    if(StringUtils.isEmpty(routerBo.getId())){
    	    	throw new ServiceException("2012","调用MES工作流方法[LOAD]时,传入的RouterBO对象的ID属性值为空!");
    	    }
    	    
    	    //校验UserBO是否为空
    	    if(userBo == null){
    	    	throw new ServiceException("2013","调用MES工作流方法[LOAD]时,传入的UserBO对象为空!");
    	    }
    	    if(StringUtils.isEmpty(userBo.getId())){
    	    	throw new ServiceException("2014","调用MES工作流方法[LOAD]时,传入的UserBO对象的ID属性值为空!");
    	    }		
    		
    		//根据SFC ID查询SFC(SfcInfoBO)基本信息
    		try{
    			sfcInfoBo = sfcInfoService.findByPk(sfcInfoBo.getId());	
    		}catch(Exception ex){
    			throw new ServiceException("2200","生成SFC工序步骤之前根据SFC ID["+sfcInfoBo.getId()+"]查询SFC 基本信息失败!",ex);
    		}		
    		if(sfcInfoBo == null){
    			throw new ServiceException("2201","SFC为空,不能生成工序步骤!");
    		}
    		//根据ROUTER ID查询ROUTER 基本信息
    		try{
    			routerBo = routerService.findByPk(routerBo.getId());
    		}catch(Exception ex){
    			throw new ServiceException("2203","SFC["+sfcInfoBo.getSfcNo()+"]在生成工序步骤之前根据工艺路线 ID["+routerBo.getId()+"]查询工艺路线基本信息失败!",ex);
    		}		
    		if(routerBo == null){
    			throw new ServiceException("2204","工艺路线为空,不能生成工序步骤!");
    		}
    		
    		//查询SFC"排队"状态对象
    		StatusBO statusBo=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.sfc.status"),
    				BeanFactory.getSystemParamters().get("mes.siteoperation.sfc.status.queue"));
    		//查询SFC工序步骤"排队"状态对象
    		StatusBO  operationStepStatus=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus"),
    				BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus.queue"));
    		
    		MesWfutil mesWfUtil =null;
    		//生成工序步骤信息
    		//获取工艺路线上的所有节点
    		List<NodeVo> allNodes = null;
    		NodeVo firstNode = null;
    		OperationBO firstOperation = null;
    		try{
    			mesWfUtil = new MesWfutil(sqlMapClient);
    			allNodes = mesWfUtil.getAllNodes(routerBo.getNo(), routerBo.getVersion());
    		}catch(Exception ex){
    			throw new ServiceException("3003","调用工作流方法[getAllNodes]根据工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]查询工艺路线所有工序步骤失败!",ex);
    		}
    		//获取工艺路线的第一个节点
    		try{				
    			firstNode = mesWfUtil.getFirstNode(routerBo.getNo(), routerBo.getVersion());
    		}catch(Exception ex){
    			throw new ServiceException("3002","调用工作流方法[getFirsetNode]根据工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]查询工艺路线第一个工序步骤失败!",ex);
    		}
    	    
    		//如果第一节点的类型是"OPERATION",则获取其工序
    		if(StringUtils.equals("OPERATION", firstNode.getExNodeType())){
    			//获取工艺路线的第一个工序
    			try{
    				firstOperation = operationService.findByPk(firstNode.getOperationId());
    			}catch(Exception ex){
    				throw new ServiceException("2206","根据工序 ID["+firstNode.getOperationId()+"]查询工序基本信息失败!",ex);
    			}
    		}	
    		
    		//BeforeLoad:执行二次开发接口业务处理类
    		log.debug(">>>>>>>>>>>>>>>>>>>>>>Execute Before Load Listener ");
    		this.executeEvent(this.EVENT_BEFORE_LOAD, sfcInfoBo, routerBo, firstOperation, null, firstNode, userBo);
    		
    		if(allNodes != null && allNodes.size()>0){
    			createSfcRouterOperationInfo( sfcInfoBo,  routerBo,  userBo , allNodes,statusBo,operationStepStatus,firstNode,firstOperation,curDate,sfcInfoBo.getCurrentResource());
    		}else{
    			throw new ServiceException("2207","工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]中没有工序步骤,不能开始!");
    		}
    		
    		//AfterLoad:执行二次开发接口业务处理类
    		log.debug(">>>>>>>>>>>>>>>>>>>>>>Execute After Load Listener ");
    		this.executeEvent(this.EVENT_AFTER_LOAD, sfcInfoBo, routerBo, firstOperation, null, firstNode, userBo);
    	}
    	
    	@Override
    	public void approve(SfcInfoBO sfcInfoBo,RouterBO toRouter,String toNodeId,UserBO userBo,String beforeApproveClass,String afterApproveClass,Map map) {
    		Date curDate = new Date();
    		// TODO Auto-generated method stub
    		//校验SfcInfo是否为空
    	    if(sfcInfoBo == null){
    	    	throw new ServiceException("2015","调用MES工作流方法[APPROVE]时,传入的SFC对象为空!");
    	    }
    	    if(StringUtils.isEmpty(sfcInfoBo.getId())){
    	    	throw new ServiceException("2016","调用MES工作流方法[APPROVE]时,传入的SfcInfoBO对象ID为空!");
    	    }
    	    
    	    //校验RouterBO是否为空
    	    if(toRouter == null){
    	    	throw new ServiceException("2017","调用MES工作流方法[APPROVE]时,传入的RouterBO对象为空!");
    	    }
    	    if(StringUtils.isEmpty(toRouter.getId())){
    	    	throw new ServiceException("2018","调用MES工作流方法[APPROVE]时,传入的RouterBO对象的ID属性值为空!");
    	    }
    	    
    	    //校验UserBO是否为空
    	    if(userBo == null){
    	    	throw new ServiceException("2019","调用MES工作流方法[APPROVE]时,传入的UserBO对象为空!");
    	    }
    	    if(StringUtils.isEmpty(userBo.getId())){
    	    	throw new ServiceException("2020","调用MES工作流方法[APPROVE]时,传入的UserBO对象的ID属性值为空!");
    	    }
    		
    		//校验toNodeId是否为空值
    		if(StringUtils.isEmpty(toNodeId)){
    			throw new ServiceException("2300","调用MES工作流方法[APPROVE]时,传入的下一步骤ID为空值!");
    		}
    				
    		//查询SFC基本信息
    		try{
    			sfcInfoBo = sfcInfoService.findByPk(sfcInfoBo.getId());	
    		}catch(Exception ex){
    			throw new ServiceException("2301","执行MES工作流方法[APPROVE]时,根据SFC ID["+sfcInfoBo.getId()+"]查询SFC基本信息失败!",ex);
    		}
    		
    		try{
    			toRouter = routerService.findByPk(toRouter.getId());
    		}catch(Exception ex){
    			throw new ServiceException("2303","执行MES工作流APPROVE时根据工艺路线 ID["+toRouter.getId()+"]查询工艺路线基本信息失败!",ex);
    		}
    		
    		MesWfutil mesWfUtil =null;
    		List<NodeVo> toRouterAllNodes=null;		
    		NodeVo toNode = null;
    	
    		//获取即将跳转到的节点基本信息
    		try{
    			mesWfUtil = new MesWfutil(sqlMapClient);
    			toNode = mesWfUtil.getNodeById(toRouter.getNo(),toRouter.getVersion(), toNodeId);
    		}catch(Exception ex){
    			throw new ServiceException("3001","调用工作流方法[getNodeById]根据工艺路线["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]工序步骤ID["+toNodeId+"]查询工序步骤基本信息失败!",ex);
    		}
    		if(toNode == null){
    			throw new ServiceException("2324","即将跳转到的步骤["+toNodeId+"]不在即将跳转到的工艺路线上["+toRouter.getNo()+"]["+toRouter.getVersion()+"]!");
    		}		
    			
    		//获取工艺路线上的所有节点
    		try{
    			toRouterAllNodes = mesWfUtil.getAllNodes(toRouter.getNo(),toRouter.getVersion());		
    		}catch(Exception ex){
    			throw new ServiceException("3003","调用工作流方法[getAllNodes]根据工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]查询工艺路线所有工序步骤失败!",ex);
    		}
    			
    		//BeforeApprove:执行二次开发接口业务处理类
    		log.debug(">>>>>>>>>>>>>>>>>>>>>>Execute Before Approve Listener ");
    		this.executeEvent(this.EVENT_BEFORE_APPROVE, sfcInfoBo, toRouter, null, null, toNode, userBo);
    		
    		//O:公共操作=>>将当前工序步骤状态改为完成
    		//查询SFC“排队”状态对象
    		StatusBO statusQueueBo=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.sfc.status"),
    				BeanFactory.getSystemParamters().get("mes.siteoperation.sfc.status.queue"));
    		//查询SFC工序步骤"排队"状态对象
    		StatusBO operationQueueBoStatus=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus"),
    				BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus.queue"));
    		//查询工序步骤“完成”状态对象
    		StatusBO  operationDoneStatus=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus"),
    				BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus.complete"));		
    		
    		SfcRouterBO curSfcRouterBo = null;	
    		SfcOperationBO curSfcOperationBo = null;			
            //查询SFC当前工艺路线信息
    		try{
    			curSfcRouterBo = sfcRouterService.findByPk(sfcInfoBo.getSfcRouter().getId());
    		}catch(Exception ex){
    			throw new ServiceException("2305","SFC["+sfcInfoBo.getSfcNo()+"]执行Complete时根据SfcRouter ID["+sfcInfoBo.getSfcRouter().getId()+"]查询SFC工艺路线信息失败!",ex);
    		}	
    		//判断是否是步骤组
    		if(curSfcRouterBo.getLastSfcOperationStep()==null||curSfcRouterBo.getLastSfcOperationStep().getId()==null||StringUtils.isEmpty(curSfcRouterBo.getLastSfcOperationStep().getId()) ){
    			throw new ServiceException("2306","SFC["+sfcInfoBo.getSfcNo()+"]在工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]步骤组["+curSfcRouterBo.getNodeGroup()+"]排队,不能跳转!");
    		}
    		//查询当前工序步骤信息
    		try{
    			curSfcOperationBo = sfcOperationService.findByPk(curSfcRouterBo.getLastSfcOperationStep().getId());
    		}catch(Exception ex){
    			throw new ServiceException("2306","SFC["+sfcInfoBo.getSfcNo()+"]执行Complete时根据SfcOperation ID["+curSfcRouterBo.getLastSfcOperationStep().getId()+"]查询SFC工序步骤信息失败!",ex);
    		}		
    		curSfcOperationBo.setActiveDate(curDate);
    		curSfcOperationBo.setTriggerUser(userBo);
    		curSfcOperationBo.setStatus(operationDoneStatus);
    		curSfcOperationBo.setThroughNum(curSfcOperationBo.getThroughNum()+1 );
    		//更新当前工序步骤状态为完成
    		try {						
    			 sfcOperationService.update(curSfcOperationBo);
    		} catch (Exception ex) {
    			throw new ServiceException("2307","更新SFC["+sfcInfoBo.getSfcNo()+"]的SFC工序步骤(SfcOperationBO)["+curSfcOperationBo.getId()+"]信息失败!",ex);
    		}		
    				
    		//A.判断节点类型是否是工序,是则跳转到下一节点
    		if(StringUtils.equals("OPERATION", toNode.getExNodeType())){
    			//查询传入进来的工艺路线的SfcRouterBO
    			SfcRouterBO toSfcRouterBo = null;			
    			OperationBO toOperation = null;
    			try{
    				toSfcRouterBo = sfcRouterService.findByUk(sfcInfoBo.getSite().getId(), sfcInfoBo.getId(), toRouter.getId());
    			}catch(Exception ex){
    				throw new ServiceException("2308","根据SFC["+sfcInfoBo.getSfcNo()+"]工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]查询SFC工艺路线信息(SfcRouterBO)失败!",ex);
    			}
    			//获取即将跳转到的工序基本信息
    			try{			
    				toOperation = operationService.findByPk(toNode.getOperationId());
    			}catch(Exception ex){
    				throw new ServiceException("2310","根据工序ID["+toNode.getOperationId()+"]查询工序信息失败!",ex);
    			}
    			//如果工艺路线之前没有走过,并且传入的节点是传入工艺路线的首节点,则发起工作流程,生成步骤信息;否则抛出异常
    			if(toSfcRouterBo == null){
    				//throw new ServiceException("2309","SFC["+sfcInfoBo.getSfcNo()+"]没有走过工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"],不能跳转!");				
    				NodeVo toRouterFirstNode = null;
    				try{
    					toRouterFirstNode = mesWfUtil.getFirstNode(toRouter.getNo(),toRouter.getVersion());
    				}catch(Exception ex){
    					throw new ServiceException("3002","调用工作流方法[getFirsetNode]根据工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]查询工艺路线第一个工序步骤失败!",ex);
    				}
    				if(StringUtils.equals(toRouterFirstNode.getNodeId(), toNode.getNodeId())){
    					this.createSfcRouterOperationInfo(sfcInfoBo, toRouter, userBo, toRouterAllNodes,statusQueueBo , operationQueueBoStatus,toNode,toOperation,curDate,sfcInfoBo.getCurrentResource());					
    				}else{
    					throw new ServiceException("2309","SFC["+sfcInfoBo.getSfcNo()+"]没有走过工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"],步骤["+toNode.getNodeId()+"]不是工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]的首步骤,不能跳转!");				
    				}				
    			}else{
    				//如果工艺路线之前走过,则直接跳转指定的节点上
    				List<SfcOperationBO> sfcOperationBOs=null;
    				SfcOperationBO sfcOperationBO= new SfcOperationBO();
    				sfcOperationBO.setSfcRouter(toSfcRouterBo);
    				sfcOperationBO.setSite(sfcInfoBo.getSite());
    				//获取传入工艺路线的所有工序步骤信息
    				try {						
    					sfcOperationBOs = sfcOperationService.find(sfcOperationBO );
    				} catch (Exception ex) {
    					throw new ServiceException("2310","查询SFC["+sfcInfoBo.getSfcNo()+"]在工艺路线RouterBo["+toRouter.getNo()+"]["+toRouter.getVersion()+"]上的工序步骤信息失败!",ex);
    				}
    				//查找需要调整的工序步骤
    				for (SfcOperationBO bean : sfcOperationBOs) {
    					if(StringUtils.equals(bean.getStepId(), toNodeId)){
    						bean.setStatus(operationQueueBoStatus);
    						bean.setSfcQty(sfcInfoBo.getQty());
    						bean.setActiveDate(curDate);
    						bean.setTriggerUser(userBo);
    						bean.setPreviousOperation(curSfcOperationBo);
    						bean.setQueueNum(bean.getQueueNum()+1);
    						//如果即将跳去的节点是SFC当前所在的节点,则将循环次数加1
    						if(StringUtils.equals(bean.getId(), curSfcOperationBo.getId())){
    							bean.setLoopNum(bean.getLoopNum() + 1);
    						}						
    						try {						
    							 sfcOperationService.update(bean);
    						} catch (Exception ex) {
    							throw new ServiceException("2311","更新SFC["+sfcInfoBo.getSfcNo()+"]的SFC工序步骤(SfcOperationBO)["+bean.getId()+"]信息失败!",ex);
    						}
    						//判断传入的工艺路线是否与当前工艺路线相同
    						if(!toRouter.equals(sfcInfoBo.getRouter())){
    							toSfcRouterBo.setPreviousRouter(sfcInfoBo.getSfcRouter());
    						}
    						toSfcRouterBo.setLastSfcOperationStep(bean);
    						if(StringUtils.isEmpty(bean.getStepGroup())){
    							toSfcRouterBo.setNodeGroup(null);
    							sfcInfoBo.setStepGroup(null);
    						}						
    						try {
    							this.sfcRouterService.update(toSfcRouterBo);
    						} catch (Exception ex) {
    							throw new ServiceException("2312","更新SFC["+sfcInfoBo.getSfcNo()+"]的SFC工艺路线(SfcRouterBO)["+curSfcRouterBo.getId()+"]中的当前工序步骤失败!",ex);
    						}
    						
    						sfcInfoBo.setOriginalStatus(sfcInfoBo.getStatus());					
    						sfcInfoBo.setStatus(statusQueueBo );
    						sfcInfoBo.setOperationStepStatus(operationQueueBoStatus);
    						sfcInfoBo.setRouter(toRouter);
    						sfcInfoBo.setOperation(toOperation);
    						sfcInfoBo.setSfcRouter(toSfcRouterBo);
    						sfcInfoBo.setSfcOperation(bean);					
    						sfcInfoBo.setLastHandleTime(curDate);
    						sfcInfoBo.setLastHandleUser(userBo);
    						sfcInfoBo.setStepId(toNodeId );
    						try {
    							 this.sfcInfoService.update(sfcInfoBo);
    						} catch (Exception ex) {
    							 throw new ServiceException("2313","更新SFC["+sfcInfoBo.getSfcNo()+"]基本信息(SfcInfoBO)信息失败!",ex);
    						}
    					}else{
    						//将循环次数清零
    						if(StringUtils.equals(bean.getId(), curSfcOperationBo.getId()) && curSfcOperationBo.getLoopNum() > 0){
    							bean.setLoopNum(0);
    							try {						
    								 sfcOperationService.update(bean);
    							} catch (Exception ex) {
    								throw new ServiceException("2323","将SFC["+sfcInfoBo.getSfcNo()+"]的SFC工序步骤(SfcOperationBO)["+bean.getId()+"]的循环次数清零失败!",ex);
    							}
    						}
    					}
    				}
    			}
    		}
    							
    		//B.判断节点的类型是处置功能HANDFUNCTION,是则执行节点上的处置功能
    		if(StringUtils.equals("HANDFUNCTION", toNode.getExNodeType())){
    		   //获取处置功能功能点,执行处置功能
    			ActivityInfoBO activityBo = new ActivityInfoBO(toNode.getHandFunction());
    			try{
    				activityBo = activityInfoService.findByPk(toNode.getHandFunction());
    			}catch(Exception ex){
    				throw new ServiceException("2322","根据功能点ID["+toNode.getHandFunction()+"]查询功能点信息失败!",ex);
    			}
    			try{				
    				executeActivityService.executeSingle(sfcInfoBo.getSite(),sfcInfoBo, sfcInfoBo.getOperation(),
    						sfcInfoBo.getCurrentResource(), activityBo, userBo, null);
    			}catch(Exception ex){
    				throw new ServiceException("2314","执行Complete时执行下一工序步骤上设置的处置功能上配置的活动["+activityBo.getActivityNo()+"]失败!",ex);
    			}				   	
    		}	
    		
    		//C.判断节点类型是否是子工艺路线,是则判断该子工艺路线之前有没有走过,有则清空之前的工序步骤信息,然后到子工艺路线的首工序排队,没有生成子工艺路线步骤信息
    		if(StringUtils.equals("CHILDROUTER", toNode.getExNodeType())){
    			//抓取子工艺路线
    			NodeVo toChildRouterFirstNode=null;
    			List<NodeVo> toChildAllNodes = null;
    			RouterBO toChildRouter = null;	
    			OperationBO toChildOperation = null;
    			//查询子工艺路线
    			try{
    				toChildRouter = routerService.findByPk(toNode.getChildRouterId());
    			}catch(Exception ex){
    				throw new ServiceException("2315","执行Complete之前根据子工艺路线 ID["+toNode.getOperationId()+"]查询子工艺路线基本信息失败!",ex);
    			}
    			//查询子工艺路线上的所有节点
    			try{
    				toChildAllNodes = mesWfUtil.getAllNodes(toChildRouter.getNo(),toChildRouter.getVersion());		
    			}catch(Exception ex){
    				throw new ServiceException("3003","调用工作流方法[getAllNodes]根据工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]查询工艺路线所有工序步骤失败!",ex);
    			}
    			//查询子工艺路线第一个步骤
    			try{				
    				toChildRouterFirstNode = mesWfUtil.getFirstNode(toChildRouter.getNo(), toChildRouter.getVersion());
    			}catch(Exception ex){
    				throw new ServiceException("2316","调用工作流方法[getFirsetNode]根据工艺路线["+toChildRouter.getNo()+"]["+toChildRouter.getVersion()+"]查询工艺路线第一个工序步骤失败!",ex);
    			}
    			//查询子工艺路线首工序
    			if(StringUtils.equals("NODEGROUP", toChildRouterFirstNode.getExNodeType())){
    				try{
    					toChildOperation = operationService.findByPk(toChildRouterFirstNode.getOperationId());
    				}catch(Exception ex){
    					throw new ServiceException("2317","根据工序 ID["+toNode.getOperationId()+"]查询工序基本信息失败!",ex);
    				}
    			}
    			
    			//查询SFC 子工艺路线步骤信息(SfcRouter),校验传入工艺路线之前走过
    			SfcRouterBO  sfcRouterBO= null;
    			try {
    				sfcRouterBO=this.sfcRouterService.findByUk(sfcInfoBo.getSite().getId(), sfcInfoBo.getId(), toChildRouter.getId());				
    			} catch (Exception ex) {
    				throw new ServiceException("2318","根据SFC["+sfcInfoBo.getSfcNo()+"]工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]查询SFC工艺路线(SfcRouterBO)信息是否存在失败!",ex);
    			}			
    			if(sfcRouterBO!=null){
    				 //清空SFC工序步骤信息
    				 List<SfcOperationBO> sfcOperations = null;
    				 try{
    					 SfcOperationBO sfcOperation = new SfcOperationBO();
    					 sfcOperation.setSite(sfcRouterBO.getSite());
    					 sfcOperation.setSfcRouter(sfcRouterBO);
    					 try {						
    						sfcOperations = sfcOperationService.find(sfcOperation );
    					 } catch (Exception ex) {
    						throw new ServiceException("2310","查询SFC["+sfcInfoBo.getSfcNo()+"]在工艺路线RouterBo["+toChildRouter.getNo()+"]["+toChildRouter.getVersion()+"]上的工序步骤信息失败!",ex);
    					 }
    				 }catch(Exception ex){
    					 
    				 }
    				 for(SfcOperationBO sob:sfcOperations){
    					 sfcInfoBo =clearSfcOperationInfo(sfcInfoBo,sob,userBo,toChildRouterFirstNode,operationQueueBoStatus,curDate,toChildOperation);				 
    				 }
    				 
    				 //Update SfcRouter
    				 sfcRouterBO.setPreviousRouter(sfcInfoBo.getSfcRouter());
    				 sfcRouterBO.setLastSfcOperationStep(sfcInfoBo.getSfcOperation());
    				 try {	
    					this.sfcRouterService.update(sfcRouterBO);
    				} catch (Exception ex) {
    					throw new ServiceException("2319","更新SFC["+sfcInfoBo.getSfcNo()+"]工艺路线(SfcRouterBO)工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]的信息中的当前工序步骤失败!",ex);
    				 }
    				 
    				 //update SfcInfo
    				 sfcInfoBo.setOriginalStatus(sfcInfoBo.getStatus());
    				 sfcInfoBo.setStatus(statusQueueBo);
    				 sfcInfoBo.setOperationStepStatus(operationQueueBoStatus);
    				 sfcInfoBo.setRouter(toChildRouter);
    				 sfcInfoBo.setOperation(toChildOperation);
    				 sfcInfoBo.setSfcRouter(sfcRouterBO);
    				 sfcInfoBo.setLastHandleUser(userBo);
    				 sfcInfoBo.setLastHandleTime(curDate);
    				 try {
    					 this.sfcInfoService.update(sfcInfoBo);
    				 } catch (Exception ex) {
    					 throw new ServiceException("2320","更新SFC["+sfcInfoBo.getSfcNo()+"]基本信息(SfcInfoBO)信息失败!",ex);
    				 }
    			//传入工艺路线之前没走过
    			}else{
    				this.createSfcRouterOperationInfo(sfcInfoBo, toChildRouter, userBo, toChildAllNodes,statusQueueBo , operationQueueBoStatus,toChildRouterFirstNode,toChildOperation,curDate,sfcInfoBo.getCurrentResource());
    			}
    		}		
    		
    		//D.判断节点类型是否是步骤组
    		if(StringUtils.equals("NODEGROUP", toNode.getExNodeType())){
    			//查询传入进来的工艺路线的SfcRouterBO
    			SfcRouterBO toSfcRouterBo = null;			
    			OperationBO toOperation = null;
    			try{
    				toSfcRouterBo = sfcRouterService.findByUk(sfcInfoBo.getSite().getId(), sfcInfoBo.getId(), toRouter.getId());
    			}catch(Exception ex){
    				throw new ServiceException("2308","根据SFC["+sfcInfoBo.getSfcNo()+"]工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]查询SFC工艺路线信息(SfcRouterBO)失败!",ex);
    			}
    			
    			//如果工艺路线之前没有走过,并且传入的节点是传入工艺路线的首节点,则发起工作流程,生成步骤信息;否则抛出异常
    			if(toSfcRouterBo == null){								
    				NodeVo toRouterFirstNode = null;
    				try{
    					toRouterFirstNode = mesWfUtil.getFirstNode(toRouter.getNo(),toRouter.getVersion());
    				}catch(Exception ex){
    					throw new ServiceException("3002","调用工作流方法[getFirsetNode]根据工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]查询工艺路线第一个工序步骤失败!",ex);
    				}
    				if(StringUtils.equals(toRouterFirstNode.getNodeId(), toNode.getNodeId())){
    					this.createSfcRouterOperationInfo(sfcInfoBo, toRouter, userBo, toRouterAllNodes,statusQueueBo , operationQueueBoStatus,toNode,toOperation,curDate,sfcInfoBo.getCurrentResource());					
    				}else{
    					throw new ServiceException("2309","SFC["+sfcInfoBo.getSfcNo()+"]没有走过工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"],步骤["+toNode.getNodeId()+"]不是工艺路线["+toRouter.getNo()+"]["+toRouter.getVersion()+"]的首步骤,不能跳转!");				
    				}				
    			}else{
    				//如果之前走过,则直接跳转过去
    				List<SfcOperationBO> sfcOperationBOs=null;
    				SfcOperationBO sfcOperationBO= new SfcOperationBO();
    				sfcOperationBO.setSfcRouter(toSfcRouterBo);
    				sfcOperationBO.setSite(sfcInfoBo.getSite());
    				sfcOperationBO.setStepGroup(toNode.getNodeId());
    				//获取传入步骤组中的所有工序步骤信息
    				try {						
    					sfcOperationBOs = sfcOperationService.find(sfcOperationBO );
    				} catch (Exception ex) {
    					throw new ServiceException("2310","查询SFC["+sfcInfoBo.getSfcNo()+"]在工艺路线RouterBo["+toRouter.getNo()+"]["+toRouter.getVersion()+"]上的工序步骤信息失败!",ex);
    				}
    				//Update SfcOperationBO
    				for (SfcOperationBO bean : sfcOperationBOs) {
    					 
    					bean.setStatus(operationQueueBoStatus);
    					bean.setSfcQty(sfcInfoBo.getQty());
    					bean.setActiveDate(curDate);
    					bean.setTriggerUser(userBo);
    					bean.setPreviousOperation(curSfcOperationBo);
    					bean.setQueueNum(bean.getQueueNum()+1);
    					try {						
    						 sfcOperationService.update(bean);
    					} catch (Exception ex) {
    						throw new ServiceException("2311","更新SFC["+sfcInfoBo.getSfcNo()+"]的SFC工序步骤(SfcOperationBO)["+bean.getId()+"]信息失败!",ex);
    					}
    				}
    				//Update SfcRouterBO
    				//判断传入的工艺路线是否与当前工艺路线相同
    				if(!toRouter.equals(sfcInfoBo.getRouter())){
    					toSfcRouterBo.setPreviousRouter(sfcInfoBo.getSfcRouter());
    				}
    				toSfcRouterBo.setLastSfcOperationStep(null);
    				toSfcRouterBo.setNodeGroup(toNode.getNodeId());				
    				 try {
    					this.sfcRouterService.update(toSfcRouterBo);
    				} catch (Exception ex) {
    					throw new ServiceException("2312","更新SFC["+sfcInfoBo.getSfcNo()+"]的SFC工艺路线(SfcRouterBO)["+curSfcRouterBo.getId()+"]中的当前工序步骤失败!",ex);
    				}
    				//Update SfcInfoBO
    				sfcInfoBo.setOriginalStatus(sfcInfoBo.getStatus());					
    				sfcInfoBo.setStatus(statusQueueBo );
    				sfcInfoBo.setOperationStepStatus(operationQueueBoStatus);
    				sfcInfoBo.setRouter(toRouter);
    				sfcInfoBo.setOperation(toOperation);
    				sfcInfoBo.setSfcRouter(toSfcRouterBo);
    				sfcInfoBo.setSfcOperation(null);					
    				sfcInfoBo.setLastHandleTime(curDate);
    				sfcInfoBo.setLastHandleUser(userBo);
    				sfcInfoBo.setStepGroup(toNode.getNodeId());
    				sfcInfoBo.setStepId(toNode.getNodeId());
    				try {
    					 this.sfcInfoService.update(sfcInfoBo);
    				} catch (Exception ex) {
    					 throw new ServiceException("2313","更新SFC["+sfcInfoBo.getSfcNo()+"]基本信息(SfcInfoBO)信息失败!",ex);
    				}
    			}
    		}
    		
    		//AfterApprove:执行二次开发接口业务处理类
    		log.debug(">>>>>>>>>>>>>>>>>>>>>>Execute After Approve Listener ");
    		this.executeEvent(this.EVENT_AFTER_APPROVE, sfcInfoBo, toRouter, null, null, toNode, userBo);
    	}
    		
    	@Override
    	public NodeVo getFirstNode(RouterBO routerBo){
    		// TODO Auto-generated method stub
    		//校验RouterBO是否为空
    	    if(routerBo == null){
    	    	throw new ServiceException("2021","调用MES工作流getFirstNode时,传入的RouterBO为空!");
    	    }
    	    if(StringUtils.isEmpty(routerBo.getId())){
    	    	throw new ServiceException("2022","调用MES工作流getFirstNode时,传入的RouterBO对象ID为空!");
    	    }
    	    
    		try{
    			routerBo = routerService.findByPk(routerBo.getId());
    		}catch(Exception ex){
    			throw new ServiceException("2050","获取工艺路线首工序时根据ROUTER ID["+routerBo.getId()+"]查询工艺路线基本信息异常!",ex);
    		}
    		MesWfutil mesWfUtil =null;
    		NodeVo nv = null;
    		try{
    			mesWfUtil = new MesWfutil(sqlMapClient);
    			nv = mesWfUtil.getFirstNode(routerBo.getNo(), routerBo.getVersion());
    		}catch(Exception ex){
    			throw new ServiceException("3002","调用工作流方法[getFirsetNode]根据工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]查询工艺路线第一个工序步骤失败!",ex);
    		}
    		return nv;
    	}
    		
    	@Override
    	public List<NodeVo> getAllNodes(RouterBO router) {
    		// TODO Auto-generated method stub
    		//校验RouterBO是否为空
    	    if(router == null){
    	    	throw new ServiceException("2023","调用MES工作流getAllNodes时,传入的RouterBO为空!");
    	    }
    	    if(StringUtils.isEmpty(router.getId())){
    	    	throw new ServiceException("2024","调用MES工作流getAllNodes时,传入的RouterBO对象ID为空!");
    	    }
    		try{
    			router = routerService.findByPk(router.getId());
    		}catch(Exception ex){
    			throw new ServiceException("2050","获取工艺路线所有工序步骤时根据ROUTER ID["+router.getId()+"]查询工艺路线基本信息异常!",ex);
    		}
    		MesWfutil mesWfUtil =null;
    		List<NodeVo> nv = null;
    		try{
    			mesWfUtil = new MesWfutil(sqlMapClient);
    			nv = mesWfUtil.getAllNodes(router.getNo(), router.getVersion());
    		}catch(Exception ex){
    			throw new ServiceException("3003","调用工作流方法[getAllNodes]根据工艺路线["+router.getNo()+"]["+router.getVersion()+"]查询工艺路线所有工序步骤失败!",ex);
    		}
    		return nv;
    	}
    	@Override
    	public List<NodeVo> getNextNodes(RouterBO routerBo, String paramNodeId) {
    		MesWfutil mesWfUtil =null;
    		List<NodeVo> canToNodes = null;
    		mesWfUtil = new MesWfutil(sqlMapClient);
    		try {
    			canToNodes = mesWfUtil.getNextNodes(routerBo.getNo(), routerBo.getVersion(),paramNodeId);
    		} catch (SQLException ex) {
    			throw new ServiceException("3004","调用工作流方法[getNextNodes]根据工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]工序步骤ID["+paramNodeId+"]获取一下工序步骤集失败!",ex);
    		}
    
    		return canToNodes;
    	}
    	@Override
    	public List<NodeVo> getNextNodes(SfcInfoBO sfcInfoBo,String paramNodeId,Map contextproperties) {
    		// TODO Auto-generated method stub
    		//校验SfcInfoBO是否为空
    	    if(sfcInfoBo == null){
    	    	throw new ServiceException("2025","调用MES工作流getNextNodes时,传入的SfcInfoBO为空!");
    	    }
    	    if(StringUtils.isEmpty(sfcInfoBo.getId())){
    	    	throw new ServiceException("2026","调用MES工作流getNextNodes时,传入的SfcInfoBO对象ID为空!");
    	    }
    	    
    	    //校验paramNodeId是否为空
    	    if(paramNodeId == null){
    	    	throw new ServiceException("2027","调用MES工作流getNextNodes时,传入的步骤ID为空!");
    	    }
    	    if(StringUtils.isEmpty(sfcInfoBo.getId())){
    	    	throw new ServiceException("2028","调用MES工作流getNextNodes时,传入的步骤ID为空!");
    	    }
    		
    		//查询SFC基本信息
    		try{
    			sfcInfoBo = sfcInfoService.findByPk(sfcInfoBo.getId());	
    		}catch(Exception ex){
    			throw new ServiceException("2011","获取下一工序步骤时根据SFC ID["+sfcInfoBo.getId()+"]查询SFC基本信息(SfcInfoBO)失败!",ex);
    		}
    				
    		SfcRouterBO curSfcRouterBo = null;		
    		//查询SFC当前工艺路线(SfcRouterBO)信息
    		try{
    			curSfcRouterBo = sfcRouterService.findByPk(sfcInfoBo.getSfcRouter().getId());
    		}catch(Exception ex){
    			throw new ServiceException("2012","获取SFC["+sfcInfoBo.getSfcNo()+"]下一工序步骤时根据SfcRouter ID["+sfcInfoBo.getSfcRouter().getId()+"]查询SFC当前工艺路线信息(SfcRouterBO)失败!",ex);
    		}
    		
    		MesWfutil mesWfUtil =null;
    		List<NodeVo> returnNodes = new ArrayList<NodeVo>();
    		List<NodeVo> canToNodes = null;		
    		NodeVo curNode = null;
    		NodeVo paramNode = null;
    		Object excuteJsResult = null;
    				
    		//获取传入的节点信息
    		try{		
    			mesWfUtil = new MesWfutil(sqlMapClient);
    			paramNode = mesWfUtil.getNodeById(sfcInfoBo.getRouter().getNo(), sfcInfoBo.getRouter().getVersion(), paramNodeId);
    		}catch(Exception ex){
    			throw new ServiceException("3001","调用工作流方法[getNodeById]根据工艺路线["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]工序步骤ID["+paramNodeId+"]查询工序步骤基本信息失败!",ex);
    		}
    		if(paramNode == null){
    			throw new ServiceException("2014","在工艺路线["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]中没有找到工序步骤["+paramNodeId+"]!");
    		}
    				
    		//A:传入节点是返回步骤RETURN,则计算原来工艺路线上可以去的节点
    		if(StringUtils.equals(paramNode.getExNodeType(), "RETURN") ){
    		   //获取SFC当前工艺路线的上一工艺路线,如果没有则抛出异常,如果有则计算上一工艺路线上可以Return的工序	
    		    if(curSfcRouterBo.getPreviousRouter() == null){
    				throw new ServiceException("2014","SFC["+sfcInfoBo.getSfcNo()+"]所走的工艺路线只有["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]一条,不能执行返回步骤!");				   
    			}
    			   
    		    if(StringUtils.isEmpty(curSfcRouterBo.getPreviousRouter().getId())){
    				throw new ServiceException("2015","SFC["+sfcInfoBo.getSfcNo()+"]所走的工艺路线只有["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]一条,不能执行返回步骤!");				   
    			}
    			   
    		    SfcRouterBO preSfcRouterBo = null;
    		    SfcOperationBO preSfcOperationBo = null;
    		    RouterBO preRouterBo = null;
    			   
    		    //获取SFC原工艺路线(SfcRouterBO)的信息
    			try{
    			   preSfcRouterBo = sfcRouterService.findByPk(curSfcRouterBo.getPreviousRouter().getId());
    			}catch(Exception ex){							
    			   throw new ServiceException("2016","获取SFC["+sfcInfoBo.getSfcNo()+"]下一工序步骤时根据SfcRouter ID["+curSfcRouterBo.getPreviousRouter().getId()+"]查询SFC原工艺路线基本信息失败!",ex);
    			}
    			   
    			//获取SFC原工艺路线上的最后工序步骤(SfcOperationBO)信息
    			try{
    			   preSfcOperationBo = sfcOperationService.findByPk(preSfcRouterBo.getLastSfcOperationStep().getId());
    			}catch(Exception ex){
    			   throw new ServiceException("2017","获取SFC["+sfcInfoBo.getSfcNo()+"]下一工序步骤时根据SfcOperation ID["+preSfcRouterBo.getLastSfcOperationStep().getId()+"]查询SFC原工序步骤基本信息失败!",ex);
    			}
    				
    			//获取原工艺路线的基本信息
    			try{
    			   preRouterBo = routerService.findByPk(preSfcRouterBo.getRouter().getId());
    			}catch(Exception ex){
    			   throw new ServiceException("2018","获取SFC["+sfcInfoBo.getSfcNo()+"]下一工序步骤时根据工艺路线 ID["+preSfcRouterBo.getRouter().getId()+"]查询工艺路线基本信息失败!",ex);
    			}
    			   
    			//获取SFC原工艺路线上的最后工序步骤的节点信息
    			NodeVo preNodeVo = null;
    			try{							
    				preNodeVo = mesWfUtil.getNodeById(preRouterBo.getNo(), preRouterBo.getVersion(), preSfcOperationBo.getStepId());
    			}catch(Exception ex){
    				throw new ServiceException("3001","调用工作流方法[getNodeById]根据工艺路线["+preRouterBo.getNo()+"]["+preRouterBo.getVersion()+"]工序步骤ID["+preSfcOperationBo.getStepId()+"]查询工序步骤基本信息失败!",ex);
    			}
    			   
    		    //B1:ReturnAny:获取原工艺路线的所有节点
    			if(StringUtils.equals("ReturnAny", paramNode.getReturnFunction())){					
    				List<NodeVo> preAllNodes = null;
    				try{							
    					preAllNodes = mesWfUtil.getAllNodes(preRouterBo.getNo(), preRouterBo.getVersion());
    				}catch(Exception ex){
    					throw new ServiceException("3003","调用工作流方法[getAllNodes]根据工艺路线["+preRouterBo.getNo()+"]["+preRouterBo.getVersion()+"]查询工艺路线所有工序步骤失败!",ex);
    				}
    					
    				if(preAllNodes != null && preAllNodes.size()>0 ){
    					for(int i=0;i<preAllNodes.size();i++){
    						if(preAllNodes.get(i).getExNodeType().equals("START") ||
    								preAllNodes.get(i).getExNodeType().equals("END")||
    								preAllNodes.get(i).getExNodeType().equals("NODEGROUP")||
    								preAllNodes.get(i).getExNodeType().equals("RETURN")
    								){
    							preAllNodes.remove(i);
    						}
    					}
    					returnNodes = preAllNodes;
    				}				
    				return returnNodes;
    			 }
    			   
    			 //B2:ReturnBack:获取原工艺路线的原节点
    			 if(StringUtils.equals("ReturnBack", paramNode.getReturnFunction())){	
    			     returnNodes.add(preNodeVo);
    				 return returnNodes;
    			 }
    			   
    			 //B3:ReturnNext:获取原工艺路线的原节点的下一个节点集
    			 if(StringUtils.equals("ReturnNext", paramNode.getReturnFunction())){	
    				 List<NodeVo> preNextNodes = null;
    				 try{
    				   preNextNodes = mesWfUtil.getNextNodes(preRouterBo.getNo(), preRouterBo.getVersion(), preNodeVo.getNodeId());
    				 }catch(Exception ex){
    					throw new ServiceException("3004","调用工作流方法[getNextNodes]根据工艺路线["+preRouterBo.getNo()+"]["+preRouterBo.getVersion()+"]工序步骤ID["+preNodeVo.getNodeId()+"]获取一下工序步骤失败!",ex);
    				 }
    				 returnNodes = preNextNodes;
    				 return returnNodes;
    			  }
    			   
    			  //B4:ReturnPrevious:获取原工艺路线的原节点的上一个节点
    			  if(StringUtils.equals("ReturnPrevious", paramNode.getReturnFunction())){	
    				   if(preSfcOperationBo.getPreviousOperation() == null){
    					   throw new ServiceException("2017","SFC["+sfcInfoBo.getSfcNo()+"]原工艺路线["+preRouterBo.getNo()+"]["+preRouterBo.getVersion()+"]的原工序步骤没有上一工序,不能执行ReturnPrevious!");
    				   }
    				   
    				   if(StringUtils.isEmpty(preSfcOperationBo.getPreviousOperation().getId())){
    					   throw new ServiceException("2018","SFC["+sfcInfoBo.getSfcNo()+"]原工艺路线["+preRouterBo.getNo()+"]["+preRouterBo.getVersion()+"]的原工序步骤没有上一工序,不能执行ReturnPrevious!");
    				   }
    				   
    				   SfcOperationBO prePreviousSfcOperation = null;
    				   //获取SFC原工艺路线上的最后工序步骤信息的上一工序步骤  
    				   try{
    					   prePreviousSfcOperation = sfcOperationService.findByPk(preSfcOperationBo.getPreviousOperation().getId());
    				   }catch(Exception ex){
    						throw new ServiceException("2019","根据SfcOperation ID["+preSfcRouterBo.getLastSfcOperationStep().getId()+"]查询SFC["+sfcInfoBo.getSfcNo()+"]工序步骤基本信息失败!",ex);
    				   }
    				   
    				   NodeVo prePreviousNodeVo = null;
    				   try{							
    						preNodeVo = mesWfUtil.getNodeById(preRouterBo.getNo(), preRouterBo.getVersion(), prePreviousSfcOperation.getStepId());
    				   }catch(Exception ex){
    						throw new ServiceException("3001","调用工作流方法[getNodeById]根据工艺路线["+preRouterBo.getNo()+"]["+preRouterBo.getVersion()+"]工序步骤ID["+prePreviousSfcOperation.getStepId()+"]查询工序步骤基本信息失败!",ex);
    				   }
    				   
    				   if(prePreviousNodeVo != null){
    					   returnNodes.add(prePreviousNodeVo);
    				   } 				   
    				   return returnNodes;
    			  }	
    		}
    		
    		//B:不是返回步骤		
    		//执行JS脚本,如果返回值为空值或"-1",则让用户选择去哪个工序
    		if(StringUtils.isNotEmpty(paramNode.getExecutionRules())){
    			excuteJsResult = this.excuteJS(paramNode.getExecutionRules(), "getNextNode", contextproperties);			
    		}
    		
    		//如果执行JS后返回-2,则抛出异常
    		if(excuteJsResult != null && excuteJsResult.equals("-2")){
    			throw new ServiceException("2020","JS语法错误,请检查节点["+paramNode.getNodeId()+"]上设置的执行规则JS脚本!");
    		}
    		
    		//如果执行JS后返回一个节点号,则将返回的节点返回
    		if(excuteJsResult != null && !excuteJsResult.equals("-1")){
    			//获取执行JS脚本后返回的节点信息
    			NodeVo nv = null;
    			try{
    				nv = mesWfUtil.getNodeById(sfcInfoBo.getRouter().getNo(), sfcInfoBo.getRouter().getVersion(), excuteJsResult.toString().trim());
    			}catch(Exception ex){
    				throw new ServiceException("3001","调用工作流方法[getNodeById]根据工艺路线["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]工序步骤["+excuteJsResult.toString()+"]查询节点基本信息失败!",ex);
    			}
    			
    			if(nv == null ){
    				throw new ServiceException("3010","在工艺路线["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]中没有找到工序步骤["+excuteJsResult.toString()+"],请检查工序步骤["+curNode.getNodeId()+"]上设置的执行规则JS脚本!");
    			}	
    			
    		    returnNodes.add(nv);			
    		    return returnNodes;
    		}
    		
    		//没有JS 或是 执行JS返回-1,则获取所有可以去的工序步骤
    		try{
    			canToNodes = mesWfUtil.getNextNodes(sfcInfoBo.getRouter().getNo(), sfcInfoBo.getRouter().getVersion(), paramNode.getNodeId());
    			returnNodes.addAll(canToNodes);
    		}catch(Exception ex){
    			throw new ServiceException("3004","调用工作流方法[getNextNodes]根据工艺路线["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]工序步骤ID["+paramNode.getNodeId()+"]获取一下工序步骤集失败!",ex);
    		}
    		
    		//如果传入节点是步骤组
    		if( paramNode.getNodeId().indexOf(".")>0 ){
    			String nodeGroupId = paramNode.getNodeId().subSequence(0, paramNode.getNodeId().indexOf(".")).toString();
    			List<SfcOperationBO> sfcOperations = null;
    			SfcOperationBO sfcOperationBo = new SfcOperationBO();
    			sfcOperationBo.setSite(curSfcRouterBo.getSite());
    			sfcOperationBo.setSfcRouter(curSfcRouterBo);
    			sfcOperationBo.setStepGroup(nodeGroupId);
    			try {						
    				sfcOperations = sfcOperationService.find(sfcOperationBo );
    			} catch (Exception ex) {
    				throw new ServiceException("2310","查询SFC["+sfcInfoBo.getSfcNo()+"]在工艺路线RouterBo["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]上的工序步骤信息失败!",ex);
    			}
    			//查询工序步骤“完成”状态对象
    			StatusBO  operationDoneStatus=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus"),
    					BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus.complete"));
    			int doneNodesInNodeGroup = 0;
    			for(SfcOperationBO sob : sfcOperations){
    				if(StringUtils.equals(sob.getStatus().getId(), operationDoneStatus.getId())){
    					doneNodesInNodeGroup = doneNodesInNodeGroup + 1;
    				}
    			}
    			//查询步骤组节点信息
    			NodeVo nodeGroup = null;
    			try{					
    				nodeGroup = mesWfUtil.getNodeById(sfcInfoBo.getRouter().getNo(), sfcInfoBo.getRouter().getVersion(), nodeGroupId);
    			}catch(Exception ex){
    				throw new ServiceException("3001","调用工作流方法[getNodeById]根据工艺路线["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]工序步骤ID["+nodeGroupId+"]查询工序步骤信息失败!",ex);
    			}
    			
    			if(nodeGroup.getMustExeNum() != null && doneNodesInNodeGroup >= nodeGroup.getMustExeNum().intValue()){
    				try{				
    					canToNodes = mesWfUtil.getNextNodes(sfcInfoBo.getRouter().getNo(), sfcInfoBo.getRouter().getVersion(),nodeGroupId);
    					returnNodes.addAll(canToNodes);
    				}catch(Exception ex){
    					throw new ServiceException("3004","调用工作流方法[getNextNodes]根据工艺路线["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]工序步骤ID["+nodeGroupId+"]获取一下工序步骤集失败!",ex);
    				}
    			}
    		}			
    		
    		return returnNodes;
    	}
    	
    	@Override
    	public NodeVo getNodeById(RouterBO routerBo, String nodeId) {
    		// TODO Auto-generated method stub
    		if(routerBo == null){
    			throw new ServiceException("2029","获取节点基本信息时传入的工艺路线对象为空!");
    		}
    		if(StringUtils.isEmpty(routerBo.getId())){
    			throw new ServiceException("2030","获取节点基本信息时传入的工艺路线ID为空值!");
    		}
    		if(StringUtils.isEmpty(nodeId)){
    			throw new ServiceException("2031","获取节点基本信息时传入的节点ID为空值!");
    		}
    		try{
    			routerBo = routerService.findByPk(routerBo.getId());
    		}catch(Exception ex){
    			throw new ServiceException("2064","获取节点基本信息时根据工艺路线ID["+routerBo.getId()+"]查询工艺路线基本信息失败!",ex);
    		}
    		
    		MesWfutil mesWfUtil =null;
    		NodeVo nv = null;
    		try{
    			mesWfUtil = new MesWfutil(sqlMapClient);
    			nv = mesWfUtil.getNodeById(routerBo.getNo(), routerBo.getVersion(), nodeId);
    		}catch(Exception ex){			
    			throw new ServiceException("3001","调用工作流方法[getNodeById]根据工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]工序步骤ID["+nodeId+"]查询工序步骤基本信息失败!",ex);
    		}
    		return nv;
    	}
    	
    	/**
    	 * JS脚本执行方法
    	 * @param jsfun
    	 * @param funname
    	 * @param contextproperties
    	 * @return
    	 */
    	public Object excuteJS(String jsfun,String funname,Map contextproperties){
    		if(contextproperties == null){
    			contextproperties = new HashMap();
    			contextproperties.put("NCCODE",null);
    			contextproperties.put("LOOPCOUNT",null);
    		}
    		
    		if(contextproperties.get("NCCODE") != null && StringUtils.isEmpty(contextproperties.get("NCCODE").toString())){
    			contextproperties.put("NCCODE",null);
    		}
    		
    		if(contextproperties.get("LOOPCOUNT") != null &&  StringUtils.isEmpty(contextproperties.get("LOOPCOUNT").toString())){
    			contextproperties.put("LOOPCOUNT",null);
    		}
    		
    		String beforeJsFun = " function getNextNode(param){try{var NCCODE = param.get(\"NCCODE\");var LOOPCOUNT = param.get(\"LOOPCOUNT\"); ";
    		String afterJsFun  = " return \"-1\";}catch(ex){return \"-2\";}return \"-1\";}";
    		
    		jsfun = beforeJsFun + jsfun + afterJsFun ;
    		
    		//初始化返回对象
    		Object returnObject = null;
    		//获取脚本引擎
            ScriptEngineManager sem = new ScriptEngineManager();
            ScriptEngine se = null;
            se = sem.getEngineByExtension("js");   
            try {
                se.eval(jsfun);
                if (se instanceof Invocable) {
                    Invocable invoke = (Invocable) se;
                    //执行指定的JS方法
                    returnObject = invoke.invokeFunction(funname,contextproperties);
                }
            } catch (NoSuchMethodException ex) {
            	throw new ServiceException("4000","执行JS脚本失败!",ex); 
            } catch (ScriptException ex) {
            	throw new ServiceException("4001","执行JS脚本失败!",ex); 
            }
            //返回
    		return returnObject;
    	}
    	
    	@Override
    	public RouterBO getPreviousRouter(SfcInfoBO sfcInfoBo) {
    		RouterBO routerBo=null;
    		SfcRouterBO sfcRouterBo=null ,PreviousRouter=null;
    		//校验SFC是否为空
    		if(sfcInfoBo == null){
    	    	throw new ServiceException("2032","调用MES工作流getPreviousRouter时,传入的SfcInfoBO为空!");
    	    }
    	    if(StringUtils.isEmpty(sfcInfoBo.getId())){
    	    	throw new ServiceException("2033","调用MES工作流getPreviousRouter时,传入的SfcInfoBO对象ID为空!");
    	    }
    		
    		//获取sfc基本信息
    		try{
    			sfcInfoBo = sfcInfoService.findByPk(sfcInfoBo.getId());	
    		}catch(Exception ex){
    			throw new ServiceException("2500","根据SFC ID["+sfcInfoBo.getId()+"]查询SFC 基本信息失败!",ex);
    		}		
    		if(sfcInfoBo == null){
    			throw new ServiceException("2501","SfcInfoBO对象为空,不能开始!");
    		} 
    		if(StringUtils.isNotEmpty(sfcInfoBo.getSfcRouter().getId())){
    			try{
    				//获取当前sfc工艺路线
    				sfcRouterBo = this.sfcRouterService.findByPk(sfcInfoBo.getSfcRouter().getId());
    			}catch(Exception ex){
    				throw new ServiceException("2502","根据SFC["+sfcInfoBo.getSfcNo()+"]工艺路线["+sfcInfoBo.getSfcRouter().getId()+"]查询SFC 工艺路线信息失败!",ex);
    			}
    			if(sfcRouterBo!=null&&StringUtils.isNotEmpty(sfcRouterBo.getPreviousRouter().getId())){
    				try{
    					//获取上一步sfc工艺路线
    					PreviousRouter = this.sfcRouterService.findByPk(sfcRouterBo.getPreviousRouter().getId());
    					if(PreviousRouter!=null &&  PreviousRouter.getRouter()!=null){
    						routerBo=PreviousRouter.getRouter();
    					}
    				}catch(Exception ex){
    					throw new ServiceException("2503","根据SFC["+sfcInfoBo.getSfcNo()+"]上一步工艺路线["+PreviousRouter.getId()+"]查询SFC工艺路线信息失败!",ex);
    				}
    			}			
    		}
    		return routerBo;
    	} 
    	
    	
    	//清除sfc工序步骤信息
    	private SfcInfoBO clearSfcOperationInfo(SfcInfoBO sfcInfoBo,SfcOperationBO sfcOperation,UserBO userBo,NodeVo firstNode,StatusBO status,Date curDate,OperationBO operation){		
    		
    		//查询SFC工序步骤"排队"状态对象
    		StatusBO  operationStepQueueStatus=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus"),
    				BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus.queue"));
    		
    		 sfcOperation.setSfcQty(0);
    		 sfcOperation.setStatus(null);
    		 sfcOperation.setActiveDate(curDate);
    		 sfcOperation.setTriggerUser(userBo);
    		 sfcOperation.setPreviousOperation(null);	
    		 
    		 if(StringUtils.equals("NODEGROUP", firstNode.getExNodeType())){
    			 if(StringUtils.equals(sfcOperation.getStepGroup(), firstNode.getNodeId())){
    				 sfcOperation.setSfcQty(sfcInfoBo.getQty());
    				 sfcOperation.setStatus(status);
    				 sfcOperation.setPreviousOperation(sfcInfoBo.getSfcOperation());
    				 
    				 sfcInfoBo.setStepGroup(sfcOperation.getStepGroup());
    				 if( operation!= null && 
    					 StringUtils.isNotEmpty(operation.getId()) && 
    					 operation.getId() != null &&
    					 StringUtils.equals(operation.getId(), sfcOperation.getOperation().getId())){
    					 	 sfcInfoBo.setOperation(operation);
    					     sfcInfoBo.setSfcOperation(sfcOperation);	
    					     sfcInfoBo.setStepId(sfcOperation.getStepId() );
    					     if(StringUtils.equals(operationStepQueueStatus.getId(), status.getId())){
    					    	 sfcOperation.setActiveNum(sfcOperation.getActiveNum()+1);
    					     }else{
    					    	 sfcOperation.setQueueNum(sfcOperation.getQueueNum()+1);
    					     }
    				 }else{
    					 sfcOperation.setStatus(operationStepQueueStatus);
    					 sfcOperation.setQueueNum(sfcOperation.getQueueNum()+1);
    				 }				 
    			 }
    		 }else{
    			 if(sfcOperation.getStepId().equals(firstNode.getNodeId())){
    				 sfcOperation.setSfcQty(sfcInfoBo.getQty());
    				 sfcOperation.setStatus(status);
    				 sfcOperation.setPreviousOperation(sfcInfoBo.getSfcOperation());				 
    				 sfcInfoBo.setSfcOperation(sfcOperation);
    				 sfcInfoBo.setStepGroup(null);
    				 sfcInfoBo.setStepId(firstNode.getNodeId() );
    				 if(StringUtils.equals(operationStepQueueStatus.getId(), status.getId())){
    			    	 sfcOperation.setActiveNum(sfcOperation.getActiveNum()+1);
    			     }else{
    			    	 sfcOperation.setQueueNum(sfcOperation.getQueueNum()+1);
    			     }
    			 }
    		 }
    		 
    		 try {
    				this.sfcOperationService.update(sfcOperation);
    			} catch (Exception ex) {
    				throw new ServiceException("4001","更新SFC["+sfcInfoBo.getSfcNo()+"]工序步骤工艺路线["+sfcInfoBo.getRouter().getNo()+"]["+sfcInfoBo.getRouter().getVersion()+"]步骤["+sfcOperation.getStepId()+"]信息失败!",ex);
    		 }		
    		 return sfcInfoBo;
    	}
    	
    	
    	//创建sfc工艺路线以及工序步骤相关信息
    	private void createSfcRouterOperationInfo(SfcInfoBO sfcInfoBo,RouterBO routerBo,UserBO userBo ,List<NodeVo> allNodes,StatusBO statusBO,StatusBO operationStatusBO,NodeVo firstNode,OperationBO firstOperation,Date curDate,ResourceBO resource){
    		   if(!( StringUtils.equals("OPERATION",firstNode.getExNodeType()) || 
    				 StringUtils.equals("NODEGROUP",firstNode.getExNodeType()) )
    				 ){
    			  throw new ServiceException("4006","工艺路线["+routerBo.getNo()+"]["+routerBo.getVersion()+"]首工序步骤不能是‘"+firstNode.getExNodeType()+"’类型!");
    		   }
    		   
    		   //查询SFC工序步骤"排队"状态对象
    		   StatusBO  operationStepQueueStatus=statusService.findByUK(BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus"),
    					BeanFactory.getSystemParamters().get("mes.siteoperation.operationstatus.queue"));
    		   
    		    //创建SfcRouterBO实例并对属性赋值	
    			SfcRouterBO sfcRouterBo = new SfcRouterBO();
    			sfcRouterBo.setSite(sfcInfoBo.getSite());
    			sfcRouterBo.setSfc(sfcInfoBo);
    			sfcRouterBo.setRouter(routerBo);
    			sfcRouterBo.setPreviousRouter(sfcInfoBo.getSfcRouter());
    			sfcRouterBo.setCreateUser(userBo);
    			sfcRouterBo.setCreateDate(curDate);
    			
    			try {
    				sfcRouterBo.setId(this.sfcRouterService.save(sfcRouterBo));
    			} catch (Exception ex) {
    				throw new ServiceException("4002","保存SFC["+sfcInfoBo.getSfcNo()+"]工艺路线SfcRouterBO["+sfcRouterBo.getId()+"]信息失败!",ex);
    			}	
    			
    			for(int i=0;i<allNodes.size();i++){
    				//普通工序
    				if(StringUtils.equals("OPERATION", allNodes.get(i).getExNodeType().trim()) ){
    					SfcOperationBO sob = new SfcOperationBO();
    					sob.setSite(sfcRouterBo.getSite());
    					sob.setSfcRouter(sfcRouterBo);
    					sob.setOperation(operationService.findByPk(allNodes.get(i).getOperationId()));
    					sob.setStepId(allNodes.get(i).getNodeId());
    					sob.setSfcQty(0);
    					sob.setThroughNum(0);
    					sob.setActiveNum(0);
    					sob.setQueueNum(0);
    					sob.setLoopNum(0);
    					sob.setActiveDate(curDate);
    					sob.setTriggerUser(userBo);
    					if(allNodes.get(i).getNodeId().equals(firstNode.getNodeId())){
    						sob.setSfcQty(sfcInfoBo.getQty());
    						sob.setStatus(operationStatusBO);	
    						sob.setPreviousOperation(sfcInfoBo.getSfcOperation());
    						if(!StringUtils.equals(operationStepQueueStatus.getId(), operationStatusBO.getId())){								
    							sob.setStatus(operationStatusBO);	
    							sob.setActiveNum(1);
    						}else{
    							sob.setStatus(operationStepQueueStatus);
    							sob.setQueueNum(1);
    						}		
    					}	
    					try {						
    						sob.setId(this.sfcOperationService.save(sob));
    						if(allNodes.get(i).getNodeId().equals(firstNode.getNodeId())){
    							sfcRouterBo.setLastSfcOperationStep(sob);
    						}
    					} catch (Exception ex) {
    						throw new ServiceException("4003","生成SFC["+sfcInfoBo.getSfcNo()+"]的工序步骤信息(sfcOperationBO)["+sob.getId()+"]信息失败!",ex);
    					}
    				}
    				//步骤组
    				if(StringUtils.equals("NODEGROUP", allNodes.get(i).getExNodeType().trim()) ){
    					List<NodeVo> groupNodes = allNodes.get(i).getGroupList();
    					for(int j=0;j<groupNodes.size();j++){
    						SfcOperationBO sob = new SfcOperationBO();
    						sob.setSite(sfcRouterBo.getSite());
    						sob.setSfcRouter(sfcRouterBo);
    						sob.setOperation(operationService.findByPk(allNodes.get(i).getOperationId()));
    						sob.setStepId(groupNodes.get(j).getNodeId());
    						sob.setSfcQty(0);
    						sob.setThroughNum(0);
    						sob.setActiveNum(0);
    						sob.setQueueNum(0);
    						sob.setLoopNum(0);
    						sob.setActiveDate(curDate);
    						sob.setTriggerUser(userBo);
    						sob.setStepGroup(allNodes.get(i).getNodeId());
    						if(allNodes.get(i).getNodeId().equals(firstNode.getNodeId())){
    							sob.setSfcQty(sfcInfoBo.getQty());							
    							sob.setPreviousOperation(sfcInfoBo.getSfcOperation());
    							if(firstOperation != null && 
    									StringUtils.isNotEmpty(firstOperation.getId())&& 
    									firstOperation.getId() != null &&
    									StringUtils.equals(firstOperation.getId(), allNodes.get(i).getOperationId())){								
    								//不是排队状态
    								if(!StringUtils.equals(operationStepQueueStatus.getId(), operationStatusBO.getId())){								
    									sob.setStatus(operationStatusBO);	
    									sob.setActiveNum(1);
    								}else{
    									sob.setStatus(operationStepQueueStatus);
    									sob.setQueueNum(1);
    								}		
    							}else{
    								sob.setStatus(operationStepQueueStatus);
    								sob.setQueueNum(1);
    							}				
    						}	
    						try {						
    							sob.setId(this.sfcOperationService.save(sob));							
    						} catch (Exception ex) {
    							throw new ServiceException("4003","生成SFC["+sfcInfoBo.getSfcNo()+"]的工序步骤信息(sfcOperationBO)["+sob.getId()+"]信息失败!",ex);
    						}
    					}
    					//如果步骤组是首工序,则设置SfcRouter的步骤组
    					if(allNodes.get(i).getNodeId().equals(firstNode.getNodeId())){
    						sfcRouterBo.setNodeGroup(allNodes.get(i).getNodeId());
    						sfcInfoBo.setStepGroup(allNodes.get(i).getNodeId());
    					}
    				}				
    			}
    			//更新SfcRouter信息
    			try {
    				this.sfcRouterService.update(sfcRouterBo);
    			} catch (Exception ex) {
    				throw new ServiceException("4004","更新SFC["+sfcInfoBo.getSfcNo()+"]的SFC工艺路线(SfcRouterBO)["+sfcRouterBo.getId()+"]中的当前工序步骤失败!",ex);
    			}
    			//更新SfcInfo 信息
    			sfcInfoBo.setOriginalStatus(sfcInfoBo.getStatus());
    			sfcInfoBo.setStatus(statusBO);
    			sfcInfoBo.setOperationStepStatus(operationStatusBO);
    			sfcInfoBo.setRouter(routerBo);
    			sfcInfoBo.setOperation(firstOperation);	
    			sfcInfoBo.setSfcRouter(sfcRouterBo);
    			sfcInfoBo.setSfcOperation(sfcRouterBo.getLastSfcOperationStep());
    			sfcInfoBo.setLastHandleTime(curDate);
    			sfcInfoBo.setLastHandleUser(userBo);
    			sfcInfoBo.setCurrentResource(resource);
    			sfcInfoBo.setStepId(firstNode.getNodeId());
    			try {
    				this.sfcInfoService.update(sfcInfoBo);
    			} catch (Exception ex) {
    				throw new ServiceException("4005","更新SfcInfo基本信息失败!",ex);
    			}
    	}
    	@Override
    	public boolean isFirstOperation(OperationBO operation, RouterBO routerBo) {
    		//校验OperationBO是否为空
    	    if(operation == null){
    	    	throw new ServiceException("2034","调用MES工作流isFirstOperation时,传入的OperationBO为空!");
    	    }
    	    if(StringUtils.isEmpty(operation.getId())){
    	    	throw new ServiceException("2035","调用MES工作流isFirstOperation时,传入的OperationBO对象ID为空!");
    	    }
    	    
    	    //校验RouterBO是否为空
    	    if(routerBo == null){
    	    	throw new ServiceException("2036","调用MES工作流isFirstOperation时,传入的RouterBO为空!");
    	    }
    	    if(StringUtils.isEmpty(routerBo.getId())){
    	    	throw new ServiceException("2037","调用MES工作流isFirstOperation时,传入的RouterBO ID为空!");
    	    }
    		
    		NodeVo firstNode=null;
    		firstNode=this.getFirstNode(routerBo);
    		boolean flag=false;
    		if(firstNode!=null){
    			flag= this.isNodeOperation(operation, firstNode);
    		}
    		return flag;
    	}
    	
    	public boolean isNodeOperation(OperationBO operation,NodeVo nodeVo){
    		//校验OperationBO是否为空
    	    if(operation == null){
    	    	throw new ServiceException("2038","调用MES工作流isNodeOperation时,传入的OperationBO为空!");
    	    }
    	    if(StringUtils.isEmpty(operation.getId())){
    	    	throw new ServiceException("2039","调用MES工作流isNodeOperation时,传入的OperationBO对象ID为空!");
    	    }
    	    
    	    //校验NodeVo是否为空
    	    if(nodeVo == null){
    	    	throw new ServiceException("2040","调用MES工作流isNodeOperation时,传入的步骤ID为空!");
    	    }
    	    if(StringUtils.isEmpty(nodeVo.getNodeId())){
    	    	throw new ServiceException("2041","调用MES工作流isNodeOperation时,传入的步骤ID为空!");
    	    }
    		
    		if(StringUtils.equals("NODEGROUP", nodeVo.getExNodeType())){
    			for(NodeVo nv:nodeVo.getGroupList()){
    				if(StringUtils.equals(operation.getId(),nv.getOperationId())){
    					return true;
    				}				
    			}
    		}
    		if(StringUtils.equals("OPERATION", nodeVo.getExNodeType())){
    			if(StringUtils.equals(operation.getId(),nodeVo.getOperationId())){
    				return true;
    			}
    		}
    		return false;
    	}
    	
    	public boolean isCurOperation(SfcInfoBO sfcInfoBo,OperationBO operationBo){
    		//校验OperationBO是否为空
    	    if(operationBo == null){
    	    	throw new ServiceException("2042","调用MES工作流isCurOperation时,传入的OperationBO为空!");
    	    }
    	    if(StringUtils.isEmpty(operationBo.getId())){
    	    	throw new ServiceException("2043","调用MES工作流isCurOperation时,传入的OperationBO对象ID为空!");
    	    }
    	    
    	    //校验SfcInfo是否为空
    	    if(sfcInfoBo == null){
    	    	throw new ServiceException("2044","调用MES工作流isCurOperation时,传入的SfcInfoBO为空!");
    	    }
    	    if(StringUtils.isEmpty(sfcInfoBo.getId())){
    	    	throw new ServiceException("2045","调用MES工作流isCurOperation时,传入的SfcInfoBO对象ID为空!");
    	    }
    	    
    	    //查询Sfc基本信息
    		try{
    			sfcInfoBo = sfcInfoService.findByPk(sfcInfoBo.getId());	
    		}catch(Exception ex){
    			throw new ServiceException("2100","根据SFC ID["+sfcInfoBo.getId()+"]查询SFC 基本信息失败!",ex);
    		}		
    		if(sfcInfoBo == null){
    			throw new ServiceException("2101","SFC无效!");
    		}
    		
    		if(sfcInfoBo.getOperation() != null && StringUtils.isNotEmpty(sfcInfoBo.getOperation().getId())){
    			if(StringUtils.equals(sfcInfoBo.getOperation().getId(), operationBo.getId())){
    				return true;
    			}else{
    				return false;
    			}
    		}
    		
    		if(sfcInfoBo.getStepGroup() != null && StringUtils.isNotEmpty(sfcInfoBo.getStepGroup())){
    			NodeVo nv = this.getNodeById(sfcInfoBo.getRouter(), sfcInfoBo.getStepGroup());
    			return this.isNodeOperation(operationBo, nv);
    		}		
    		return false;
    	}
    	
    	/**
    	 * 监听事件执行方法
    	 * @param event
    	 * @param sfc
    	 * @param routerBo
    	 * @param operationBo
    	 * @param resourceBo
    	 * @param toNodeId
    	 * @param userBo
    	 */
    	private void executeEvent(String event,SfcInfoBO sfcInfoBo,RouterBO routerBo,OperationBO operationBo,ResourceBO resourceBo,NodeVo nodeVo,UserBO userBo){
    		String[] clazzes =  getListener().get(event);
    		if(clazzes == null || clazzes.length == 0) return;
    		for(String clazz : clazzes){
    			try{
    				Event e = (Event) BeanFactory.getClazzIns(clazz, BeanFactory.INSTANCE_SINGLETON);
    				e.execute(sfcInfoBo,routerBo,operationBo,resourceBo,nodeVo,userBo,new WFContext(this));
    			}catch(Exception ex){
    				throw new ServiceException("2109","SFC["+sfcInfoBo.getSfcNo()+"]"+event+"执行MES业务功能代码["+clazz+"]异常!",ex);
    			}
    		}
    	}
    		
    	public void setSfcInfoService(SfcInfoService sfcInfoService){
    		this.sfcInfoService = sfcInfoService;
    	}
    
    	public void setStatusService(StatusService statusService) {
    		this.statusService = statusService;
    	}
    
    	public void setSfcOperationService(SfcOperationService sfcOperationService) {
    		this.sfcOperationService = sfcOperationService;
    	}
    
    	public void setSfcRouterService(SfcRouterService sfcRouterService) {
    		this.sfcRouterService = sfcRouterService;
    	}
    
    	public void setRouterService(RouterService routerService) {
    		this.routerService = routerService;
    	}
    
    	public void setOperationService(OperationService operationService) {
    		this.operationService = operationService;
    	}
    
    	public void setSqlMapClient(SqlMapClient sqlMapClient) {
    		this.sqlMapClient = sqlMapClient;
    	}
    
    	public void setResourceService(ResourceService resourceService) {
    		this.resourceService = resourceService;
    	}
    
    	public void setExecuteActivityService(
    			ExecuteActivityService executeActivityService) {
    		this.executeActivityService = executeActivityService;
    	}
    
    	public void setActivityInfoService(ActivityInfoService activityInfoService) {
    		this.activityInfoService = activityInfoService;
    	}
    
    	public void setListener(Map<String,String[]> listener) {
    		this.listener = listener;
    	}
    	public Map<String,String[]> getListener() {
    		return listener;
    	}	
    }
    
    package com.byd.mes.plugins.workFlow;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
     
    
    import org.apache.commons.io.IOUtils;
    import org.apache.commons.lang.StringUtils;
    import com.byd.mes.plugins.workFlow.impl.BydWorkFlowServiceImpl;
    
    
    public class Test { 
     public static void main(String[] args) {   
      File file = new File("d:/js.txt");
      try {
       String str = IOUtils.toString(new FileReader(file));
       
       System.out.println(str);
       BydWorkFlowServiceImpl bw = new BydWorkFlowServiceImpl();
       
       Map mp = new HashMap();
       mp.put("NcCode1", "2");
       mp.put("LoopCount2",3);   
       String rl = bw.excuteJS(str, "getNextNode", mp).toString();
       System.out.println(rl);
      } catch (FileNotFoundException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
    }
    
     
    
  • 相关阅读:
    rgw
    comm命令
    s3cmd、aws的使用
    【RPM包的制作】
    【C++高级编程 | 23】future、packaged_task等使用机制
    【shell语法 | 01】基础练习
    【宏 | 01】#、##、__VA_ARGS__和##__VA_ARGS__的作用
    求求你别再用offset和limit分页了
    你和阿里程序员的差距在哪里?看看鸿蒙级计算机底层知识总结与操作系统就知道了
    什么?CPU 怎么运行代码?太刁难人了吧!
  • 原文地址:https://www.cnblogs.com/qq1988627/p/6606884.html
Copyright © 2011-2022 走看看