コード例 #1
0
ファイル: ScriptManager.cs プロジェクト: radtek/FmsScript
        /// <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;
        }
コード例 #2
0
ファイル: ScriptManager.cs プロジェクト: radtek/FmsScript
 /// <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);
     }
 }
コード例 #3
0
ファイル: ScriptManager.cs プロジェクト: radtek/FmsScript
        /// <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);
        }
コード例 #4
0
ファイル: ScriptManager.cs プロジェクト: radtek/FmsScript
        /// <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);
                }
            }
        }