/// <summary> /// 添加一个脚本流实例 /// </summary> /// <param name="script">脚本流对象</param> /// <param name="statusModel">启动模式</param> /// <param name="db">DBEntities</param> /// <param name="err">ErrorInfo</param> /// <returns></returns> public static EM_SCRIPT_CASE AddScriptCase(EM_SCRIPT script, PubEnum.StatusModel statusModel, DBEntities db, ref ErrorInfo err) { EM_SCRIPT_CASE _scriptCase = new EM_SCRIPT_CASE { ID = Fun.GetSeqID <EM_SCRIPT_CASE>(), NAME = script.NAME, SCRIPT_ID = script.ID, START_TIME = DateTime.Now, START_MODEL = (short)statusModel, RUN_STATUS = (short)PubEnum.RunStatus.Wait, RETRY_TIME = script.RETRY_TIME }; db.EM_SCRIPT_CASE.Add(_scriptCase); return(_scriptCase); //try //{ // db.SaveChanges(); //} //catch (Exception e) //{ // err.IsError = true; // err.Message = e.Message; // err.Excep = e; // return _scriptCase.ID; //} //return null; }
/// <summary> /// 根据脚本流实例ID获取脚本实例 /// </summary> /// <param name="scriptCaseID"></param> /// <param name="err"></param> /// <returns></returns> public static EM_SCRIPT_CASE GetScriptCase(long?scriptCaseID, ref ErrorInfo err) { //验证scriptID是否为空 if (scriptCaseID == null) { err.IsError = true; err.Message = "传入的scriptCaseID值不能为空"; return(null); } using (DBEntities db = new DBEntities()) { EM_SCRIPT_CASE _scriptCase = db.EM_SCRIPT_CASE.Find(scriptCaseID); if (_scriptCase == null) { err.IsError = true; err.Message = "未找到主键值[" + scriptCaseID.ToString() + "]的脚本流实例"; return(null); } return(_scriptCase); } }
/// <summary> /// 添加其依赖脚本节点的实例(根据当前脚本节点实例和脚本节点ID) /// </summary> /// <param name="scriptNodeID"></param> /// <param name="scriptCaseID"></param> /// <param name="scripNodeCaseID"></param> /// <param name="db"></param> /// <param name="err"></param> /// <returns></returns> public static bool AddNextScritNodeCase(long?scriptNodeID, long?scriptCaseID, long?scripNodeCaseID, ref ErrorInfo err) { string msg = ""; if (scriptCaseID == null || scriptNodeID == null || scripNodeCaseID == null) { err.IsError = true; err.Message = "传入的scriptNodeID、scriptCaseID、scripNodeCaseID值不能为空"; return(false); } using (DBEntities db = new DBEntities()) { //获取当前脚本流实例 EM_SCRIPT_CASE _scriptCase = db.EM_SCRIPT_CASE.Find(scriptCaseID); if (_scriptCase == null) { err.IsError = true; err.Message = "未找到脚本实例[" + scriptCaseID.ToString() + "]"; return(false); } //上级节点(脚本流实例) var snode = db.EM_SCRIPT_NODE_FORCASE.FirstOrDefault(p => p.SCRIPT_NODE_ID == scriptNodeID && p.SCRIPT_CASE_ID == _scriptCase.ID); var snodeCase = db.EM_SCRIPT_NODE_CASE.Find(scripNodeCaseID);//上级节点实例 //根据上级节点获取其子节点集合 List <EM_SCRIPT_REF_NODE_FORCASE> _scriptNodeList = db.EM_SCRIPT_REF_NODE_FORCASE.Where (p => p.SCRIPT_ID == _scriptCase.SCRIPT_ID && p.PARENT_NODE_ID == scriptNodeID && p.SCRIPT_CASE_ID == scriptCaseID).ToList(); if (_scriptNodeList != null && _scriptNodeList.Count > 0) { //foreach (var _nextSNode in _scriptNodeList) //{ for (int i = 0; i < _scriptNodeList.Count; i++) { var _nextSNode = _scriptNodeList[i]; var scriptNode = db.EM_SCRIPT_NODE_FORCASE.FirstOrDefault(p => p.SCRIPT_CASE_ID == scriptCaseID && p.SCRIPT_NODE_ID == _nextSNode.CURR_NODE_ID); //获取_nextSNode节点的父节点 var nodeParentList = db.EM_SCRIPT_REF_NODE_FORCASE. Where(p => p.CURR_NODE_ID == _nextSNode.CURR_NODE_ID && p.SCRIPT_ID == _scriptCase.SCRIPT_ID && p.SCRIPT_CASE_ID == scriptCaseID).Select(p => p.PARENT_NODE_ID).ToList(); //_nextSNode的父节点实例数(当前脚本流实例) //var caseCount = db.EM_SCRIPT_NODE_CASE.Where(p => p.SCRIPT_CASE_ID == scriptCaseID && nodeParentList.Contains(p.SCRIPT_NODE_ID)).Count(); var caseCount = db.EM_SCRIPT_NODE_CASE.Where(p => p.SCRIPT_CASE_ID == scriptCaseID && nodeParentList.Contains(p.SCRIPT_NODE_ID) && p.RUN_STATUS == (short)PubEnum.RunStatus.Stop && p.RETURN_CODE == (short)PubEnum.ReturnCode.Success).Count(); //父节点数=父节点实例数,则添加子实例 if (caseCount != 0 && nodeParentList.Count == caseCount) { //添加子节点实例 var _ncase = AddScriptNodeCase(_nextSNode.CURR_NODE_ID, scriptCaseID, db, ref err); var _snCaseID = _ncase.ID; if (err.IsError) { LogForScriptCase("添加脚本节点【" + snode.NAME + "】的下级节点【" + scriptNode.NAME + "】的实例【失败】:" + err.Message, "", scriptCaseID, ref err); return(false); } msg = string.Format("添加脚本节点【{0}】的下级节点【{1}】的实例,实例编号为【{2}】", snode.NAME, scriptNode.NAME, _snCaseID.ToString()); //msg += "\r\n等待调度服务执行!"; //写入日志 LogForNodeCase(msg, "", _snCaseID, ref err); LogForScriptCase(msg, "", scriptCaseID, ref err); try { db.SaveChanges();//集中保存 msg = string.Format(@"脚本节点【{0}】的下级节点【{1}】实例【{2}】添加【成功】", snode.NAME, scriptNode.NAME, _snCaseID.ToString()); //写入日志 LogForNodeCase(msg, "", snodeCase.ID, ref err); LogForScriptCase(msg, "", scriptCaseID, ref err); } catch (Exception e) { msg = string.Format(@"脚本节点【{0}】的依赖节点【{1}】实例【{2}】添加【失败】:{3}", snode.NAME, scriptNode.NAME, _snCaseID.ToString(), e.Message); //写入日志 LogForNodeCase(msg, "", snodeCase.ID, ref err); LogForScriptCase(msg, "", scriptCaseID, ref err); } } else//未满足,不新增节点实例 { msg = string.Format("脚本节点【{0}】的实例添加【失败】:其父节点实例未全部执行,等待父节点实例全部完毕", scriptNode.NAME); //写入脚本流日志 LogForScriptCase(msg, "", scriptCaseID, ref err); } } } else//未找到子节点 { //判断当前脚本流是否执行完毕。判断数量是否相等,考虑调用当前方法前提代码部分 var nodeListCount = db.EM_SCRIPT_NODE_FORCASE.Count(p => p.SCRIPT_CASE_ID == scriptCaseID); var caseListCount = db.EM_SCRIPT_NODE_CASE.Count(p => p.SCRIPT_CASE_ID == scriptCaseID && p.RETURN_CODE == (short)PubEnum.ReturnCode.Success); //脚本流的所有执行成功节点实例数量=脚本流所涉及的节点数 if (nodeListCount == caseListCount) { //修改脚本流实例状态 ModifyScriptCase(scriptCaseID, PubEnum.RunStatus.Stop, PubEnum.ReturnCode.Success, ref err); if (err.IsError) { LogForScriptCase("将脚本流【" + _scriptCase.NAME + "】实例编号【" + _scriptCase.ID + "】状态修改为【执行成功】:但修改【失败】", "", scriptCaseID, ref err); } msg = string.Format(@"恭喜!脚本流【{0}】实例编号【{1}】所有节点实例执行【成功】", _scriptCase.NAME, _scriptCase.ID); //写入日志 LogForNodeCase(msg, "", snodeCase.ID, ref err); LogForScriptCase(msg, "", scriptCaseID, ref err); } } } return(true); }
/// <summary> /// 启动一个脚本流实例 /// </summary> /// <param name="scriptID"></param> /// <param name="statusModel"></param> /// <param name="err"></param> public static EM_SCRIPT_CASE StartScriptCase(long?scriptID, PubEnum.StatusModel statusModel, ref ErrorInfo err) { string msg = ""; using (DBEntities db = new DBEntities()) { if (scriptID == null) { err.IsError = true; err.Message = "传入的scriptID值不能为空"; return(null); } //根据scriptID获取脚本流对象 EM_SCRIPT _script = GetScripByID(scriptID, db, ref err); if (err.IsError) { return(null); } //验证当前脚本流能否启动一个脚本流实例 //状态不为‘等待’或‘执行中’时,允许添加实例 EM_SCRIPT_CASE _scriptCase = GetEffectScriptCase(scriptID, db); if (_scriptCase == null) { #region 添加脚本流实例 var _scriptCa = AddScriptCase(_script, statusModel, db, ref err); long?_scriptCaseID = _scriptCa.ID; //写入脚本流实例日志 msg = "添加脚本流【" + _script.NAME + "】实例,实例ID为【" + _scriptCaseID.ToString() + "】"; //写入日志 LogForScriptCase(msg, "", _scriptCaseID, ref err); #endregion #region 添加脚本流实例的第一组脚本节点实例 //获取脚本流的首组脚本节点 List <EM_SCRIPT_REF_NODE> _scRefNodeList = db.EM_SCRIPT.Find(scriptID).EM_SCRIPT_REF_NODE.Where(p => p.PARENT_NODE_ID == null).ToList(); //为首组脚本添加节点实例 foreach (var _scNode in _scRefNodeList) { //添加一个节点实例 var snc = AddScriptNodeCase(_scNode.CURR_NODE_ID, _scriptCaseID, db, ref err, 1); var _snCaseID = snc.ID; //写入脚本节点实例日志信息 if (!err.IsError) { msg = string.Format("添加实例为【{1}】脚本流【{0}】的首组脚本节点【{2}】实例,实例编号为【{3}】", _script.NAME, _scriptCaseID.ToString(), db.EM_SCRIPT_NODE.Find(_scNode.CURR_NODE_ID).NAME, _snCaseID); //msg += "\r\n等待调度服务启动!"; //写入日志 LogForNodeCase(msg, "", _snCaseID, ref err); LogForScriptCase(msg, "", _scriptCaseID, ref err); } } //为当前脚本流【复制】节点配置及内容 LogForScriptCase("开始为脚本流【" + _script.NAME + "】实例【" + _scriptCaseID.ToString() + "】复制脚本节点及配置信息", "", _scriptCaseID, ref err); CopyScriptNodeForCase(_scriptCaseID, scriptID, _script.NAME, db, ref err); if (err.IsError) { LogForScriptCase("复制脚本流【" + _script.NAME + "】实例【" + _scriptCaseID.ToString() + "】脚本节点及配置信息【失败】:" + err.Message, "", _scriptCaseID, ref err); } else { LogForScriptCase("复制脚本流【" + _script.NAME + "】实例【" + _scriptCaseID.ToString() + "】脚本节点及配置信息【成功】!", "", _scriptCaseID, ref err); } #endregion try { db.SaveChanges(); LogForScriptCase("启动脚本流【" + _script.NAME + "】实例【" + _scriptCaseID.ToString() + "】【成功】!", "", _scriptCaseID, ref err); return(_scriptCa); } catch (Exception e) { err.IsError = true; err.Message = "启动脚本流【" + _script.NAME + "】实例【" + _scriptCaseID.ToString() + "】【失败】:" + e.Message; //写日志 LogForScriptCase(err.Message, err.Message, _scriptCaseID, ref err); return(null); } } else { err.IsError = true; err.Message = "添加脚本流实例【失败】!脚本流【" + _script.NAME + "】已存在正运行的实例!"; return(null); } } }