public DataResult SubimtFlow(SubmitData submitData)
        {
            //SMTWorkFlowManage.ColseWorkFlowRuntime(null);
            //DataSet ds = new DataSet();
            LogSubmitData(submitData);
            Tracer.Debug("***********************************************开始***********************************************");
            string returnMsg = "";//暂时没有用,记录执行的顺序
            #region 更新个人缓存
            //临时屏蔽
            //FlowEngine.TaskCacheReflesh(submitData.ApprovalUser.UserID);
            //Tracer.Debug("FormID=" + submitData.FormID + ";更新个人缓存 完成 UserID=" + submitData.ApprovalUser.UserID);
            #endregion
            DateTime dtStart = DateTime.Now;
            DateTime dtEngineStart = DateTime.Now;
            DateTime dtEnd = DateTime.Now;
            DateTime dtCheckData = DateTime.Now;
            DataResult dataResult = new DataResult();
            FlowUser User = new FlowUser();
            //设置2分钟超时时间
            //using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(DateTime.Now.AddMinutes(2).Ticks)))
            //{
                try
                {
                    #region 初始化流程所属人的信息
                    Tracer.Debug("进入事务操作 FormID=" + submitData.FormID);
                    User = new FlowUser(submitData.ApprovalUser.CompanyID, submitData.ApprovalUser.UserID, submitData.ModelCode);
                    User.FormID = submitData.FormID;
                    Tracer.Debug("初始化流程所属人的信息 FormID=" + submitData.FormID);
                    SUser = User;
                    Tracer.Debug("SUser = User FormID=" + submitData.FormID);

                    FlowBLL Flowbll = new FlowBLL();
                    string AppCompanyID = "";  //申请公司
                    string MessageUserID = ""; //申请人ID
                    string MessageUserName = ""; //申请人名
                    dataResult.FlowResult = FlowResult.SUCCESS;
                    #endregion

                    #region 检查流程数据是否规范
                    if (!FlowBLL.CheckFlowData(submitData, ref dataResult))
                    {
                        dataResult.FlowResult = FlowResult.FAIL;
                        {
                            return dataResult;
                        }
                    }
                    #region XML进行验证
                    if (!string.IsNullOrEmpty(submitData.XML) && submitData.SubmitFlag == SubmitFlag.New)
                    {//如果是提交并XML不为空是进行验证
                        if (VerifyXML(submitData.XML))
                        {
                            dataResult.Err = "传入的XML不合法!请检查元数据Key值和DataValue值是否有空的";
                            dataResult.FlowResult = FlowResult.FAIL;
                            FlowMonitor.AddFlowMonitor(submitData, User);
                            return dataResult;
                        }
                    }
                    if (string.IsNullOrEmpty(submitData.XML) && submitData.SubmitFlag == SubmitFlag.New)
                    {//如果是提交并XML为空
                        dataResult.Err = "XML元数据不能为空!";
                        dataResult.FlowResult = FlowResult.FAIL;
                        FlowMonitor.AddFlowMonitor(submitData, User);
                        return dataResult;
                    }
                    #endregion
                    #endregion

                    #region 检查是否已提交流程(对数据库操作)
                    submitData.ApprovalResult = submitData.SubmitFlag == SubmitFlag.New ? ApprovalResult.Pass : submitData.ApprovalResult;
                    submitData.FlowSelectType = submitData.FlowSelectType == null ? FlowSelectType.FixedFlow : submitData.FlowSelectType;

                    CheckResult CheckFlowResult = Flowbll.CheckFlowIsApproved(submitData, dataResult);//对数据库操作
                    dtCheckData = DateTime.Now;
                    dataResult = CheckFlowResult.APPDataResult;
                    if (CheckFlowResult.Flag == 0 && submitData.SubmitFlag == SubmitFlag.New)//已审批:1,未审批:0
                    {
                        dataResult.Err = "该单据已提交,还没有审核,不能再提交!";
                        dataResult.FlowResult = FlowResult.FAIL;
                        return dataResult;
                    }
                    if (CheckFlowResult.fd != null && CheckFlowResult.fd[0].CHECKSTATE == "1" && submitData.SubmitFlag == SubmitFlag.New)//审核中:1
                    {//如果单据还在审核中,不允许再提交单据
                        dataResult.Err = "该单据已在审核中,不能再提交!";
                        dataResult.FlowResult = FlowResult.FAIL;
                        return dataResult;
                    }

                    #endregion

                    #region 新增,撤单,审核
                    dataResult.AppState = submitData.NextStateCode;
                    if (submitData.SubmitFlag == SubmitFlag.New)
                    {
                        //提交新流程
                        #region 新增
                        AppCompanyID = submitData.ApprovalUser.CompanyID;
                        if (submitData.FlowSelectType == FlowSelectType.FreeFlow)
                            //自选流程
                            dataResult = Flowbll.SubmitFreeFlow(submitData, dataResult, ref User);//对数据库操作
                        else
                        {
                            //固定流程
                            Tracer.Debug("固定流程.Flowbill.AddFlow2");
                            dataResult = Flowbll.SubmitFlow(submitData, dataResult, ref User);//对数据库操作

                        }
                        #endregion
                    }
                    else if (submitData.SubmitFlag == SubmitFlag.Cancel)
                    {
                        #region 撤单
                        if (!string.IsNullOrEmpty(CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT))
                        {
                            submitData.XML = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT;
                        }
                        submitData.ApprovalContent = "";
                        dataResult = Flowbll.CancelFlow(submitData, dataResult, CheckFlowResult.fd);
                        dataResult.SubmitFlag = submitData.SubmitFlag;
                        #endregion
                    }
                    else
                    {
                        //审批流程
                        #region  审核
                        if (CheckFlowResult.fd[0] == null)
                        {
                            dataResult.Err = "FormID =" + submitData.FormID + ";该单据没有审核记录!";
                            dataResult.FlowResult = FlowResult.FAIL;
                            return dataResult;
                        }
                        if (!string.IsNullOrEmpty(CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT))
                        {
                            submitData.XML = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT;
                        }
                        //引擎消息数据
                        AppCompanyID = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.CREATECOMPANYID;
                        MessageUserID = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.CREATEUSERID;
                        MessageUserName = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.CREATEUSERNAME;
                        submitData.ApprovalUser.CompanyID = CheckFlowResult.fd[0].EDITCOMPANYID;
                        submitData.ApprovalUser.DepartmentID = CheckFlowResult.fd[0].EDITDEPARTMENTID;
                        submitData.ApprovalUser.PostID = CheckFlowResult.fd[0].EDITPOSTID;
                        submitData.FlowSelectType = (FlowSelectType)Convert.ToInt32(CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.FLOWSELECTTYPE);
                        if (submitData.FlowSelectType == FlowSelectType.FreeFlow)
                            dataResult = Flowbll.ApprovalFreeFlow(submitData, dataResult, CheckFlowResult.fd, ref  User);//对数据库操作、对服务操作
                        else
                            dataResult = Flowbll.ApprovalFlow(submitData, dataResult, CheckFlowResult.fd, ref User, ref returnMsg);
                        #endregion
                    }

                    #endregion

                    #region 如果检出有多个审核人时,返回界面让用户选择一个人进行审核
                    if (dataResult.FlowResult == FlowResult.MULTIUSER)
                    {
                        string users = "FormID =" + submitData.FormID + " 检出有多个审核人\r\n";
                        foreach (var u in dataResult.UserInfo)
                        {
                            //users += "CompanyID      =" + u.CompanyID + "\r\n";
                            //users += "DepartmentID   = " + u.DepartmentID + "\r\n";
                            //users += "PostID         = " + u.PostID + "\r\n";
                            //users += "serID          = " + u.UserID + "\r\n";
                            //users += "UserName       = "******"\r\n";

                            users += "公司ID   = " + u.CompanyID + "\r\n";
                            users += "部门ID   = " + u.DepartmentID + "\r\n";
                            users += "岗位ID   = " + u.PostID + "\r\n";
                            users += "员工ID   = " + u.UserID + "\r\n";

                            users += "公司名称 = " + u.CompanyName + "\r\n";
                            users += "部门名称 = " + u.DepartmentName + "\r\n";
                            users += "岗位名称 = " + u.PostName + "\r\n";
                            users += "员工姓名 = " + u.UserName + "\r\n";
                            users += "------------------------------------\r\n";
                        }
                        Tracer.Debug(users + "返回界面让用户选择一个人审核人");
                        for (int i = 0; i < dataResult.UserInfo.Count; i++)
                        {
                            dataResult.UserInfo[i].Roles = null; //解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题)
                        }

                        return dataResult;
                    }
                    #endregion

                    #region 解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题)
                    for (int i = 0; i < dataResult.UserInfo.Count; i++)
                    {
                        dataResult.UserInfo[i].Roles = null; //解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题)
                    }
                    if (dataResult.DictCounterUser != null)
                    {
                        if (dataResult.DictCounterUser.Count > 0)
                        {
                            string name = "";
                            foreach (KeyValuePair<FlowRole, List<UserInfo>> u in dataResult.DictCounterUser)
                            {
                                name += "角色名称:" + u.Key.Remark + "  人数:" + u.Value.Count + "\r\n";
                                foreach (var user in u.Value)
                                {
                                    user.Roles = null;//解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题)
                                    name += "姓名:" + user.UserName + " 公司:" + user.CompanyName + "\r\n";
                                }
                                name += "---------------------------------------------------------------\r\n";
                            }
                            Tracer.Debug("FormID=" + User.FormID + " 会签角色下所有的人员 \r\n" + name);
                        }
                    }
                    #endregion

                    #region 发送审批消息(调用引擎服务)
                    Tracer.Debug("FormID=" + User.FormID + " 模块名称:user.ModelCode=" + User.ModelCode + "; user.ModelName=" + User.ModelName + " ;流程名称=" + User.FlowName + "(" + User.FlowCode + ")");
                    if (string.IsNullOrEmpty(strIsFlowEngine) || strIsFlowEngine.ToLower() == "true")
                    {
                        SubmitEngineService(submitData, dataResult, ref User, CheckFlowResult, Flowbll, AppCompanyID, MessageUserID, MessageUserName, ref returnMsg);
                    }
                    #endregion

                    #region 修改我的单据状态
                    //修改我的单据状态 新建并且不能不等于会签才更改状态
                    if (submitData.SubmitFlag == SubmitFlag.New && dataResult.FlowResult == FlowResult.SUCCESS)
                    {
                        EnginFlowBLL.AddPersonalRecord(submitData, "1", User, null);
                    }
                    if (dataResult.FlowResult == FlowResult.END)
                    {
                        EnginFlowBLL.AddPersonalRecord(submitData, dataResult.CheckState, User, CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T);
                    }
                    dtEnd = DateTime.Now;
                    dataResult.SubmitFlag = submitData.SubmitFlag;

                    if (dataResult.FlowResult == FlowResult.FAIL)
                    {
                        dataResult.Err = dataResult.Err + " \r\n FormID=" + User.FormID + ";时间:" + DateTime.Now.ToString();
                        User.ErrorMsg += "=================================================================================\r\n";
                        User.ErrorMsg += dataResult.Err + "\r\n";
                        FlowMonitor.AddFlowMonitor(submitData, User);
                    }
                    #endregion

                    //ts.Complete();//提交事务
                    //关闭数据库
                    Tracer.Debug("执行流程成功:FormID=" + User.FormID + ";单据所属人:" + User.UserName + "(" + User.UserID + ");公司名称:" + User.CompayName + ";模块名称:" + User.ModelName + " ;流程名称:" + User.FlowName + " (" + User.FlowCode + ") \r\n 返回给业务系统的 dataResult.FlowResult=" + dataResult.FlowResult.ToString() + "  " + dataResult.Err);
                }
                catch (Exception ex)
                {
                    #region 记录到流程监控表里
                    //ts.Dispose();
                    dataResult.RunTime += "---FlowEnd:" + DateTime.Now.ToString();
                    dataResult.FlowResult = FlowResult.FAIL;
                    dataResult.Err = ex.Message;
                    User.ErrorMsg += "=================================================================================\r\n";
                    User.ErrorMsg += "执行流程失败:FormID=" + User.FormID + ";单据所属人:" + User.UserName + "(" + User.UserID + ");公司名称:" + User.CompayName + ";模块名称:" + User.ModelName + "; 流程名称:" + User.FlowName + " (" + User.FlowCode + "); 异常信息\r\n" + ex.ToString() + "\r\n";
                    FlowMonitor.AddFlowMonitor(submitData, User);

                    #endregion

                    #region restore workflow instanceState
                    if (User.InstanceState != null && User.InstanceState.Tables[0].Rows.Count > 0)
                    {
                        foreach (DataRow dr in User.InstanceState.Tables[0].Rows)
                        {
                            Tracer.Debug("恢复工作流InstanceState:" + dr["instance_id"]);
                            InsertInstanceState(dr);
                        }
                    }
                    #endregion

                    #region return FAIL result
                    if (dataResult.FlowResult == FlowResult.FAIL)
                    {
                        dataResult.Err = dataResult.Err + " FormID=" + User.FormID + ";时间:" + DateTime.Now.ToString();
                        Tracer.Debug("失败错误信息:" + dataResult.Err);
                    }
                    Tracer.Debug("执行流程失败:FormID=" + User.FormID + ";单据所属人:" + User.UserName + "(" + User.UserID + ");公司名称:" + User.CompayName + ";模块名称:" + User.ModelName + "; 流程名称:" + User.FlowName + " (" + User.FlowCode + ");执行踪信息如下:\r\n" + User.TrackingMessage + "\r\n 异常信息\r\n" + ex.ToString());
                    return dataResult;
                    #endregion
                }
                finally
                {
                }
            //}
            FlowMonitor.AddInstance(submitData, User);
            return dataResult;
        }