Exemple #1
0
        /// <summary>
        /// 流程加签
        /// </summary>
        /// <param name="previousFLActivityName">上一节点</param>
        /// <param name="currentFLActivityName">当前节点</param>
        public void PlusApprove(string previousFLActivityName, string currentFLActivityName)
        {
            _isPlusApprove = true;
            _isReturn = false;
            _v = true;
            _previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);
            _currentFLActivity = _rootFLActivity.GetFLActivityByName(currentFLActivityName);
            _nextFLActivities = new List<FLActivity>();
            _nextFLActivities.Add(_currentFLActivity);

            //任意加签跳过检查
            if ((_previousFLActivity is IFLStandActivity && !((IFLStandActivity)_previousFLActivity).PlusApproveReturn)
                                   || (_previousFLActivity is IFLApproveActivity && !((IFLApproveActivity)_previousFLActivity).PlusApproveReturn))
            {

            }
            else
            {
                if (_previousFLActivity != null && _previousFLActivity.ExecutionStatus == FLActivityExecutionStatus.Executed)
                {
                    String message = SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "FLSetpIsApprovedOrReturned");
                    throw new FLException(2, message);
                }
            }

            // OnNotify(this, new __FLInstanceNotifyEventArgs());
        }
Exemple #2
0
 public FLActivity GetAvailableActivity(FLActivity previousFLActivity2, FLActivity currentFLActivity)
 {
     if (_flDefinitionXmlNodes == null)
     {
         _flDefinitionXmlNodes = new Hashtable();
         InitFLDefinitionXmlNodes();
     }
     var availableActivity = previousFLActivity2;
     var previousParallelPath = string.Join("->", GetParallelPath(previousFLActivity2));
     var currentParallelPath = string.Join("->", GetParallelPath(currentFLActivity));
     while (true)
     {
         if (availableActivity == null)
         {
             throw new Exception(string.Format("Return from:{0} to {1} failed.", currentParallelPath, previousParallelPath));
         }
         var availableParallelPath = string.Join("->", GetParallelPath(availableActivity));
         //                       - C1
         //  P(A) - C or P(A) <
         //                       - C2
         if (currentParallelPath.Contains(availableParallelPath))
         {
             return availableActivity;
         }
         //      - P1 -            - P1 -     - C1
         //  A <        > C or A <        > <
         //      - P2 -            - P2 -     - C2
         else if (availableParallelPath.Contains(currentParallelPath))
         {
             availableActivity = availableActivity.PreviousActivity;  // 继续退
         }
         //       - P1 -     - C1     P3(A) -    - P1 -     - C1
         //   A <        > <       or         ><        > <
         //       - P2 -     - C2        P4 -    - P2 -     - C2
         else
         {
             if (availableParallelPath.Contains(previousParallelPath) || previousParallelPath.Contains(availableParallelPath)) //直到退出previous的平行
             {
                 availableActivity = availableActivity.PreviousActivity;  // 继续退
             }
             else
             {
                 return availableActivity;
             }
         }
     }
 }
Exemple #3
0
        /// <summary>
        /// 修改流程定义
        /// </summary>
        /// <param name="flDefinitionFile">流程XOML文件</param>
        /// <param name="flRulesFile">流程规则文件</param>
        public void ModifyFLDefinition(string flDefinitionFile, string flRulesFile)
        {
            //Assembly assembly = Assembly.LoadFrom(EEPRegistry.Server + "\\" + dllName);
            //Type type = assembly.GetType(className);
            //MethodInfo method = type.GetMethod(methodName);

            //object obj = method.Invoke(null, new object[] { _flDefinitionFile, _flRulesFile });
            //Activity wfActivity = (Activity)obj;

            Activity wfActivity = FLInstance.GetWorkflowDefinition(flDefinitionFile, flRulesFile);

            IFLRootActivity tempRootActivity = null;
            // FLActivity
            if (wfActivity is IFLRootActivity)
            {
                tempRootActivity = new FLRootActivity();
                InitFLActivities((IFLActivity)tempRootActivity, wfActivity);
            }
            else
            {
                String message = SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "ErrorInXoml");
                throw new FLException(message);
            }

            ICollection keys = _rootFLActivity.GetAllChildFLActivities().Keys;
            foreach (object obj1 in keys)
            {
                FLActivity a0 = _rootFLActivity.GetFLActivityByName(obj1.ToString());
                FLActivity a1 = ((FLRootActivity)tempRootActivity).GetFLActivityByName(obj1.ToString());

                if (a0 != null && a1 != null && a0.GetType() == a1.GetType())
                {
                    InitFLActivities2(a0, a1);
                }
            }

            _flDefinition = _rootFLActivity;

            CheckFL();

            //if (_rootFLActivity.GetFLActivitiesByType(typeof(FLParallelActivity)).Count != 0)
            //{
            //    _isSupportRetake = false;
            //}
            //else
            //{
            //    _isSupportRetake = true;
            //}

            InitFLDefinitionXmlString();
        }
Exemple #4
0
        /// <summary>
        /// 设置当前Activity的路径
        /// </summary>
        /// <param name="activity">当前的Activity</param>
        private void SetLocation(FLActivity activity)
        {
            if (!_setLocations.Exists(
                    delegate(string s)
                    {
                        if (activity.Name == s)
                            return true;
                        else
                            return false;
                    }
                ))
            {
                FLActivity parentFLActivity = GetRealParentFLActivity(activity);
                if (parentFLActivity != null && !(parentFLActivity is IFLRootActivity))
                {
                    if (parentFLActivity is IFLParallelActivity)
                    {
                        activity.Location = parentFLActivity.Location;
                    }
                    else
                    {
                        FLActivity grandparentFLActivity = GetRealParentFLActivity(parentFLActivity);
                        if (grandparentFLActivity != null && !(grandparentFLActivity is IFLRootActivity) && grandparentFLActivity is IFLParallelActivity)
                        {
                            activity.Location = parentFLActivity.Location;
                        }
                        else
                        {
                            if (parentFLActivity.Location != null && parentFLActivity.Location != string.Empty)
                            {
                                activity.Location = parentFLActivity.Location + "->" + parentFLActivity.Name;
                            }
                            else
                            {
                                activity.Location = parentFLActivity.Name;
                            }
                        }
                    }
                }

                _setLocations.Add(activity.Name);
            }
        }
Exemple #5
0
        /// <summary>
        /// 设置Activity为UnExecute状态
        /// </summary>
        /// <param name="currentFLActivity">当前Activity</param>
        /// <param name="previousFLActivity">上一Activity</param>
        private void UnExecuteIFLControls(FLActivity currentFLActivity, FLActivity previousFLActivity)
        {
            List<FLActivity> unExecuteIFLControls = new List<FLActivity>();

            string currentLocation = currentFLActivity.Location;
            string previousLocation = previousFLActivity.Location;

            if (currentLocation != previousLocation && currentLocation != string.Empty)
            {
                List<string> list1 = new List<string>();
                List<string> list2 = new List<string>();

                string[] ss = currentLocation.Split("->".ToCharArray());
                foreach (string s in ss)
                {
                    if (s != null && s != string.Empty)
                        list1.Add(s);
                }

                ss = previousLocation.Split("->".ToCharArray());
                foreach (string s in ss)
                {
                    if (s != null && s != string.Empty)
                        list2.Add(s);
                }

                if (previousLocation != string.Empty)
                {
                    int i = 0;
                    int count1 = list1.Count;
                    int count2 = list2.Count;
                    foreach (string s in list1)
                    {
                        if (!(i <= count2 - 1 && list1[i] == list2[i]))
                        {
                            break;
                        }
                        i++;
                    }

                    for (int j = i; j <= count1 - 1; j++)
                    {
                        unExecuteIFLControls.Add(_rootFLActivity.GetFLActivityByName(list1[j]));
                    }
                }
                else
                {
                    foreach (string s in list1)
                    {
                        unExecuteIFLControls.Add(_rootFLActivity.GetFLActivityByName(s));
                    }
                }
            }

            foreach (FLActivity flControl in unExecuteIFLControls)
            {
                flControl.InitExecStatus();
                //retunr all child of ifelse acitivity
                if (flControl is IFLIfElseActivity)
                {
                    foreach (FLActivity flActivity in flControl.ChildFLActivities)
                    {
                        flActivity.InitExecStatus();
                    }
                }
            }
        }
Exemple #6
0
        /// <summary>
        /// 初始化流程定义
        /// </summary>
        private void InitFLDefinition()
        {
            Activity wfActivity = GetActivityByXoml(FLDefinitionFile, _flRulesFile);

            IFLRootActivity rootActivity = null;
            // FLActivity
            if (wfActivity is IFLRootActivity)
            {
                rootActivity = new FLRootActivity();
                InitFLActivities((IFLActivity)rootActivity, wfActivity);
            }
            else
            {
                String message = SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "ErrorInXoml");
                throw new FLException(message);
            }

            _rootFLActivity = (FLRootActivity)rootActivity;
            _flDefinition = (FLActivity)rootActivity;

            CheckFL();

            //if (_rootFLActivity.GetFLActivitiesByType(typeof(FLParallelActivity)).Count != 0)
            //{
            //    _isSupportRetake = false;
            //}
            //else
            //{
            //    _isSupportRetake = true;
            //}
        }
Exemple #7
0
        private void ReturnActivity(FLActivity activity)
        {
            foreach (var executedActivity in activity.ExecutedActivities)
            {
                executedActivity.InitExecStatus();
                if (executedActivity is FLParallelActivity)
                {
                    (executedActivity as FLParallelActivity).ExecutedBranches.Clear();
                }

            }
            foreach (var nextActivity in activity.NextActivities)
            {
                ReturnActivity(nextActivity);
                if (nextActivity is FLProcedureActivity)
                {
                    _flDirection = FLCore.FLDirection.GoToBack;
                    Logic.CallServerMethod(this, FLInstanceParms, this._keyValues, this._clientInfo, nextActivity as IFLProcedureActivity);
                    _flDirection = FLCore.FLDirection.GoToNext;
                }
            }
        }
Exemple #8
0
        internal List<FLActivity> GetNextFLActivities(string currentFLActivityName, string userId, string roleId)
        {
            FLActivity currentFLActivity = _rootFLActivity.GetFLActivityByName(currentFLActivityName);

            ((IEventWaitingExecute)currentFLActivity).Execute(userId, roleId, false);
            _sendFromFLActivity = currentFLActivity;
            _flDirection = FLDirection.GoToNext;
            if (_flDefinitionXmlNodes == null)
            {
                _flDefinitionXmlNodes = new Hashtable();
                InitFLDefinitionXmlNodes();
            }

            List<FLActivity> nextFLActivities = new List<FLActivity>();
            preview = true;
            GetNextFLActivities(currentFLActivity, nextFLActivities);
            preview = false;
            return nextFLActivities;
        }
Exemple #9
0
        private void AddToPathList(List<FLActivity> nextFLActivities, FLActivity currentFLActivity)
        {
            if (Version == "2.0")
            {
            }
            else
            {
                bool b = false;
                foreach (FLActivity nextFLActivity in nextFLActivities)
                {
                    if (nextFLActivity is IFLValidateActivity)
                    {
                        continue;
                    }
                    if ((currentFLActivity == null) || (nextFLActivity.UpperParallel == string.Empty && currentFLActivity.UpperParallel == string.Empty)
                        || (nextFLActivity.UpperParallel == string.Empty && currentFLActivity.UpperParallel != string.Empty))
                    {
                        #region

                        if (_p.Count >= 1)
                        {
                            if (_p[_p.Count - 1].ToString() != nextFLActivity.Name)
                                _p.Add(nextFLActivity.Name);
                        }
                        else
                        {
                            _p.Add(nextFLActivity.Name);
                        }

                        #endregion
                    }
                    else if (nextFLActivity.UpperParallel != string.Empty && currentFLActivity.UpperParallel != string.Empty
                        && nextFLActivity.UpperParallel == currentFLActivity.UpperParallel)
                    {
                        #region

                        List<object> list = (List<object>)_p[_p.Count - 1];
                        foreach (object o in list)
                        {
                            List<object> list1 = (List<object>)o;
                            if (list1.Exists(
                                     delegate(object s)
                                     {
                                         if (currentFLActivity.Name == s.ToString())
                                             return true;
                                         else
                                             return false;
                                     }
                                     ))
                            {
                                if (list1.Count >= 1)
                                {
                                    if (list1[list1.Count - 1].ToString() != nextFLActivity.Name)
                                        list1.Add(nextFLActivity.Name); break;
                                }
                                else
                                    list1.Add(nextFLActivity.Name); break;
                            }
                        }

                        #endregion
                    }
                    else          // (activity.UpperParallel != string.Empty && previousFLActivity.UpperParallel == string.Empty)
                    {
                        #region

                        List<object> list = null;
                        if (!b)
                        {
                            list = new List<object>();
                            _p.Add(list);
                            b = true;
                        }
                        else
                        {
                            list = (List<object>)_p[_p.Count - 1];
                        }

                        List<object> list1 = new List<object>();
                        list1.Add(nextFLActivity.Name);

                        list.Add(list1);

                        #endregion
                    }
                }
            }
        }
Exemple #10
0
        // XmlReader flDefinitionReader, XmlReader flRulesReader)
        // 第一次会向Db中写Definition。
        /// <summary>
        /// 初始化流程
        /// </summary>
        /// <param name="instanceId">流程Id</param>
        /// <param name="runtime">流程运行时</param>
        /// <param name="flDefinitionFile">流程XOML文件</param>
        /// <param name="flRulesFile">流程规则文件</param>
        /// <param name="clientInfo">ClientInfo</param>
        /// <param name="hostDataSet">宿主表</param>
        /// <param name="orgKind">角色的OrgKind</param>
        public FLInstance(Guid instanceId, FLRuntime runtime, string flDefinitionFile, string flRulesFile, object[] clientInfo, DataSet hostDataSet, string orgKind)
        {
            _createdTime = DateTime.Now;

            _clientInfo = clientInfo;
            _hostDataSet = hostDataSet;
            _flflag = ' ';
            _creator = string.Empty;
            _flDefinitionId = Guid.NewGuid();
            _flRuntime = runtime;
            _flInstanceId = instanceId;
            //_flDefinitionReader = flDefinitionReader;
            //_flRulesReader = flRulesReader;

            _flDefinitionFile = flDefinitionFile;
            _flRulesFile = flRulesFile;
            _orgKind = orgKind;

            InitFLDefinition();
            InitFLDefinitionId();
            InitFLDefinitionXmlString();

            _currentFLActivity = null;
            _previousFLActivity = null;
            _nextFLActivities = new List<FLActivity>();
            _setUpperParallels = new List<string>();
            _setLocations = new List<string>();
            _executedActivities = new Hashtable();

            solution = ((object[])clientInfo[0])[6] == null ? string.Empty : ((object[])clientInfo[0])[6].ToString();

            _flDirection = FLDirection.Waiting;
            _p = new List<object>();
            _rl = new List<string>();

            _records = new Hashtable();
            _nameRecords = new List<string>();
            _isFirstInParallel = false;
            _cacheFLInstanceParms = new List<string>();

            _version = "2.0";
        }
Exemple #11
0
        // ---------------------------------------------------------------------------
        /// <summary>
        /// 提交流程
        /// </summary>
        /// <param name="userId">用户Id</param>
        /// <param name="roleId">权限Id</param>
        /// <param name="isUrgent">是否紧急</param>
        /// <param name="tableFlowFlag">宿主表中的FlowFlag字段值</param>
        public void Submit(string userId, string roleId, bool isUrgent, string tableFlowFlag)
        {
            _isPlusApprove = false;
            _isPause = false;
            _isRetake = false;
            _isReturn = false;
            if (_rootFLActivity.ExecutionStatus != FLActivityExecutionStatus.Initialized)
            {
                String message = SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "FLInstanceIsSummited");
                throw new FLException(2, message);
            }

            _flflag = tableFlowFlag == "Z" ? 'C' : 'N';
            _v = true;
            _flDirection = FLDirection.GoToNext;
            _currentFLActivity = _rootFLActivity.ChildFLActivities[0];
            _nextFLActivities = new List<FLActivity>();

            var previousExecutedActivities = new List<FLActivity>();
            if (Version == "2.0")
            {
                previousExecutedActivities = GetExecutedActivities(this.RootFLActivity);
            }
            ((IEventWaitingExecute)_currentFLActivity).Execute(userId, roleId, isUrgent);
            _sendFromFLActivity = _currentFLActivity;

            //---------------------------------------------------------
            if (_flDefinitionXmlNodes == null)
            {
                _flDefinitionXmlNodes = new Hashtable();
                InitFLDefinitionXmlNodes();
            }

            GetNextFLActivities(_currentFLActivity, _nextFLActivities);
            foreach (FLActivity activity in _nextFLActivities)
            {
                activity.InitExecStatus();

                if (Version == "2.0")
                {
                    activity.PreviousActivity = _currentFLActivity;
                }
            }
            if (Version == "2.0")
            {
                _currentFLActivity.NextActivities = _nextFLActivities;
                _currentFLActivity.ExecutedActivities = GetExecutedActivities(this.RootFLActivity, previousExecutedActivities);
                LastActivity = _currentFLActivity.Name;
            }
            //---------------------------------------------------------
            List<FLActivity> list = new List<FLActivity>();
            list.Add(_currentFLActivity);
            AddToPathList(list, null);
            if (!_v)
            {
                //roll back current
                _currentFLActivity.InitExecStatus();
                //
                Record();
                object o = this.FLRuntime.GetService(typeof(FLPersistenceService));

                if (o != null)
                {
                    FLPersistenceService flPersistenceService = (FLPersistenceService)o;
                    flPersistenceService.PersistenceFL(this, _clientInfo);
                }

            }
            else
            {

                AddToPathList(_nextFLActivities, _currentFLActivity);
                Record();
            }

            // OnSubmit(this, new __FLInstanceSubmitEventArgs());
        }
Exemple #12
0
        /// <summary>
        /// 退回流程
        /// </summary>
        /// <param name="currentFLActivityName">当前节点</param>
        /// <param name="nextFLActivityName">下一节点</param>
        /// <param name="userId">用户Id</param>
        /// <param name="roleId">权限Id</param>
        /// <param name="isUrgent">是否紧急</param>
        public void Return2(string currentFLActivityName, string nextFLActivityName, string userId, string roleId, bool isUrgent)
        {
            _isPause = false;
            _isRetake = false;
            _isReturn = true;
            _v = true;
            _flDirection = FLDirection.GoToBack;
            _currentFLActivity = _rootFLActivity.GetFLActivityByName(nextFLActivityName);
            _nextFLActivities = new List<FLActivity>();
            _wl = new List<string>();

            if (_currentFLActivity.ExecutionStatus == FLActivityExecutionStatus.Executed)
            {
                String message = SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "FLSetpIsApprovedOrReturned");
                throw new FLException(2, message);
            }

            ((IEventWaitingExecute)_currentFLActivity).Return(userId, roleId, isUrgent);

            _previousFLActivity = _rootFLActivity.GetFLActivityByName(currentFLActivityName);
            _sendFromFLActivity = _currentFLActivity;

            GetPreviousFLActivites2(_currentFLActivity, _previousFLActivity, _nextFLActivities);
            foreach (FLActivity activity in _nextFLActivities)
            {
                activity.InitExecStatus();
            }

            ((IEventWaitingExecute)_currentFLActivity).Execute(userId, roleId, isUrgent);
            Record();

            // OnReturn(this, new __FLInstanceReturnEventArgs());
        }
Exemple #13
0
        /// <summary>
        /// 取回流程
        /// </summary>
        public List<FLActivity> Retake()
        {
            _isPlusApprove = false;
            _isPause = false;
            _isRetake = true;
            _isReturn = false;
            _v = true;
            if (Version == "2.0")
            {
                string retakeFLActivityName = this.GetRetakeFLActivityName();
                FLActivity retakeFLActivity = this.RootFLActivity.GetFLActivityByName(retakeFLActivityName);
                ReturnActivity(retakeFLActivity);
                _currentFLActivity = retakeFLActivity.PreviousActivity;
                LastActivity = _currentFLActivity == null ? string.Empty : _currentFLActivity.Name;
                _nextFLActivities = new List<FLActivity>();
                _nextFLActivities.Add(retakeFLActivity);
                return null;
            }
            else
            {
                int i = _nameRecords.Count;
                List<FLActivity> retakeActivities = new List<FLActivity>();
                // ArrayList keys = new ArrayList(_records.Keys);
                if (i > 1)
                {
                    string s = _nameRecords[i - 1].ToString();
                    string currentFLActivityName = s.Split(':')[0];

                    object o = _records[_nameRecords[i - 2]];
                    List<object> record = (List<object>)o;

                    _p = new List<object>((List<object>)record[0]);
                    _currentFLActivity = (FLActivity)record[1];
                    _previousFLActivity = (FLActivity)record[2];
                    _nextFLActivities = (List<FLActivity>)record[3];
                    _setUpperParallels = (List<string>)record[4];
                    _setLocations = (List<string>)record[5];
                    _flDirection = (FLDirection)record[6];
                    _flflag = (char)record[7];

                    if (_flDirection == FLCore.FLDirection.GoToBack)
                    {
                        var activitityName = _previousFLActivity.Name;
                        while (true)
                        {
                            if (_nameRecords.Count == 0)
                            {
                                break;
                            }
                            string n = _nameRecords[_nameRecords.Count - 1].ToString();
                            record = (List<object>)_records[n];
                            _p = new List<object>((List<object>)record[0]);
                            _currentFLActivity = (FLActivity)record[1];
                            _previousFLActivity = (FLActivity)record[2];
                            _nextFLActivities = (List<FLActivity>)record[3];
                            _setUpperParallels = (List<string>)record[4];
                            _setLocations = (List<string>)record[5];
                            _flDirection = (FLDirection)record[6];
                            _flflag = (char)record[7];
                            bool find = false;
                            if (_flDirection == FLCore.FLDirection.GoToNext)
                            {
                                for (int j = 0; j < _nextFLActivities.Count; j++)
                                {
                                    if (_nextFLActivities[j].Name == activitityName)
                                    {
                                        find = true;
                                    }
                                }
                            }
                            if (find)
                            {
                                break;
                            }
                            else
                            {
                                retakeActivities = _nextFLActivities;
                            }

                            _nameRecords.Remove(n);
                            _records.Remove(n);
                        }
                        Hashtable activitiesStutas = (Hashtable)record[8];
                        foreach (object key in activitiesStutas.Keys)
                        {
                            FLActivity activity = _rootFLActivity.GetFLActivityByName(key.ToString());
                            if (activity != null)
                            {
                                FLActivityExecutionStatus status = (FLActivityExecutionStatus)activitiesStutas[key];
                                if (status == FLActivityExecutionStatus.Initialized)
                                    activity.InitExecStatus();
                                else
                                    activity.ExecutionStatus = status;
                            }
                        }
                    }
                    else
                    {
                        retakeActivities = (List<FLActivity>)((List<object>)_records[s])[3];
                        Hashtable activitiesStutas = (Hashtable)record[8];
                        foreach (object key in activitiesStutas.Keys)
                        {
                            FLActivity activity = _rootFLActivity.GetFLActivityByName(key.ToString());
                            if (activity != null)
                            {
                                FLActivityExecutionStatus status = (FLActivityExecutionStatus)activitiesStutas[key];
                                if (status == FLActivityExecutionStatus.Initialized)
                                    activity.InitExecStatus();
                                else
                                    activity.ExecutionStatus = status;
                            }
                        }

                        _nameRecords.Remove(s);
                        _records.Remove(s);
                    }

                    // OnRetake(this, new __FLInstanceRetakeEventArgs());
                }
                else
                {
                    string s = _nameRecords[i - 1].ToString();
                    retakeActivities = (List<FLActivity>)((List<object>)_records[s])[3];

                    Hashtable table = _rootFLActivity.GetAllChildFLActivities();
                    foreach (object value in table.Values)
                    {
                        FLActivity activity = (FLActivity)value;
                        activity.InitExecStatus();
                        //activity.ExecutionStatus = FLActivityExecutionStatus.Initialized;
                    }

                    _nameRecords.Clear();
                    _records.Clear();
                    _p.RemoveAt(_p.Count - 1);
                }
                return retakeActivities;
            }
        }
Exemple #14
0
        /// <summary>
        /// 流程加签退回
        /// </summary>
        /// <param name="previousFLActivityName">上一节点</param>
        /// <param name="currentFLActivityName">当前节点</param>
        public void PlusReturn2(string previousFLActivityName, string currentFLActivityName)
        {
            _isPlusApprove = false;
            _isReturn = true;
            _v = true;
            _previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);
            _currentFLActivity = _rootFLActivity.GetFLActivityByName(currentFLActivityName);
            _nextFLActivities = new List<FLActivity>();
            _nextFLActivities.Add(_currentFLActivity);

            // OnNotify(this, new __FLInstanceNotifyEventArgs());
        }
Exemple #15
0
 /// <summary>
 /// 取得下一Activity
 /// </summary>
 /// <param name="flActivity">当前Activity</param>
 /// <returns></returns>
 private FLActivity GetRealNextFLActivity(FLActivity flActivity)
 {
     XmlNode currentNode = (XmlNode)_flDefinitionXmlNodes[flActivity.Name];
     XmlNode nextNode = currentNode.NextSibling;
     if (nextNode != null)
     {
         return _rootFLActivity.GetFLActivityByName(nextNode.Attributes["Name"].Value);
     }
     else
     {
         return null;
     }
 }
Exemple #16
0
 private List<object> GetCurrentPathList(FLActivity currentFLActivity, List<object> path)
 {
     if (currentFLActivity == null)
     {
         return path;
     }
     foreach (var p in path)
     {
         if (p is string && p.ToString() == currentFLActivity.Name)
         {
             return path;
         }
         else if (p is List<object>)
         {
             return GetCurrentPathList(currentFLActivity, p as List<object>);
         }
     }
     return path;
 }
Exemple #17
0
 /// <summary>
 /// 取得当前Activity的父Activity
 /// </summary>
 /// <param name="flActivity"></param>
 /// <returns></returns>
 private FLActivity GetRealParentFLActivity(FLActivity flActivity)
 {
     XmlNode currentNode = (XmlNode)_flDefinitionXmlNodes[flActivity.Name];
     XmlNode parentNode = currentNode.ParentNode;
     if (parentNode != null)
     {
         return _rootFLActivity.GetFLActivityByName(parentNode.Attributes["Name"].Value);
     }
     else
     {
         return null;
     }
 }
Exemple #18
0
 private List<FLActivity> GetExecutedActivities(FLActivity activity)
 {
     return GetExecutedActivities(activity, null);
 }
Exemple #19
0
 private bool IsSubParallel(FLActivity nextFLActivity, FLActivity currentFLActivity)
 {
     if (currentFLActivity == null || string.IsNullOrEmpty(currentFLActivity.UpperParallel))
     {
         return false;
     }
     if (!string.IsNullOrEmpty(nextFLActivity.UpperParallel))
     {
         if (nextFLActivity.UpperParallel == currentFLActivity.UpperParallel)
         {
             return true;
         }
         else
         {
             var parallelActivity = this.RootFLActivity.GetFLActivityByName(nextFLActivity.UpperParallel);
             if (parallelActivity != null)
             {
                 return IsSubParallel(parallelActivity, currentFLActivity);
             }
         }
     }
     return false;
 }
Exemple #20
0
 private List<FLActivity> GetExecutedActivities(FLActivity activity, List<FLActivity> previousExecutedActivities)
 {
     List<FLActivity> executedActivities = new List<FLActivity>();
     foreach (var childActivity in activity.ChildFLActivities)
     {
         if (childActivity.ExecutionStatus == FLActivityExecutionStatus.Executed)
         {
             if (previousExecutedActivities != null && previousExecutedActivities.Contains(childActivity))
             { }
             else
             {
                 executedActivities.Add(childActivity);
             }
         }
         executedActivities.AddRange(GetExecutedActivities(childActivity, previousExecutedActivities));
     }
     return executedActivities;
 }
Exemple #21
0
        private void ReturnUpperParallel(string activityName, FLActivity previousActivity)
        {
            FLActivity activity = _rootFLActivity.GetFLActivityByName(activityName);
            if (activity != null)
            {
                if (!string.IsNullOrEmpty(activity.Location))
                {
                    //
                    UnExecuteIFLControls(activity, previousActivity);
                }
                if (!string.IsNullOrEmpty(activity.UpperParallel))
                {
                    FLActivity parent = _rootFLActivity.GetFLActivityByName(activity.UpperParallel);
                    if (parent != null)
                    {
                        parent.InitExecStatus();
                    }
                    if (activity.UpperParallel != activityName)
                    {
                        ReturnUpperParallel(activity.UpperParallel, previousActivity);
                    }

                }
                if (!string.IsNullOrEmpty(activity.UpperParallelBranch))
                {
                    FLActivity parent = _rootFLActivity.GetFLActivityByName(activity.UpperParallelBranch);
                    if (parent != null)
                    {
                        parent.InitExecStatus();
                    }
                    if (activity.UpperParallelBranch != activityName)
                    {
                        ReturnUpperParallel(activity.UpperParallel, previousActivity);
                    }

                }
            }
        }
Exemple #22
0
        /// <summary>
        /// 取得下一Activity的集合
        /// </summary>
        /// <param name="currentFLActivity">当前Activity</param>
        /// <param name="nextFLActivities">下一Activity的集合</param>
        private void GetNextFLActivities(FLActivity currentFLActivity, List<FLActivity> nextFLActivities)
        {
            SetUpperParallel(currentFLActivity);
            SetLocation(currentFLActivity);

            if (_isFirstInParallel && ((_tempParallel != currentFLActivity.UpperParallel) || (_tempParallelBranch != currentFLActivity.UpperParallelBranch)))
            {
                return;
            }

            if (currentFLActivity is IFLNotifyActivity || currentFLActivity is IFLProcedureActivity)
            {
                if (!nextFLActivities.Exists(
                    delegate(FLActivity flActivity)
                    {
                        if (currentFLActivity.Name == flActivity.Name)
                            return true;
                        else
                            return false;
                    }
                ) && currentFLActivity.Enabled)
                {

                    if (currentFLActivity is IFLProcedureActivity && !preview)
                    {
                        Logic.CallServerMethod(this, FLInstanceParms, this._keyValues, this._clientInfo, currentFLActivity as IFLProcedureActivity);
                    }

                    nextFLActivities.Add(currentFLActivity);
                }
            }

            if (currentFLActivity is IFLRejectActivity && currentFLActivity.Enabled)
            {
                nextFLActivities.Clear();
                nextFLActivities.Add(currentFLActivity);

                return;
            }

            if (currentFLActivity is IFLGotoActivity && currentFLActivity.Enabled)
            {
                nextFLActivities.Clear();
                nextFLActivities.Add(currentFLActivity);

                return;
            }

            if (currentFLActivity is IFLValidateActivity)
            {
                if (!nextFLActivities.Exists(
                    delegate(FLActivity flActivity)
                    {
                        if (currentFLActivity.Name == flActivity.Name)
                            return true;
                        else
                            return false;
                    }
                ) && currentFLActivity.Enabled && !preview)
                {
                    nextFLActivities.Add(currentFLActivity);

                    if (!JudgeCondition(((IFLValidateActivity)currentFLActivity).Expression))
                    {
                        _v = false;
                        _vN = currentFLActivity.Name;
                        VM = ((IFLValidateActivity)currentFLActivity).Message;
                        return;

                        //String message = string.Format(SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "ValidateFail"), currentFLActivity.Name);
                        //throw new FLException(2, message);
                    }
                }
            }

            FLActivity activity = null;
            if ((currentFLActivity is IFLApproveActivity && currentFLActivity.ExecutionStatus != FLActivityExecutionStatus.Executed) || currentFLActivity is IFLApproveBranchActivity)
            {
                #region

                List<FLActivity> approveRights;
                FLActivity approveActivity = null;
                if (currentFLActivity is IFLApproveActivity)
                {
                    approveRights = currentFLActivity.ChildFLActivities;
                    approveActivity = currentFLActivity;
                }
                else
                {
                    approveActivity = _rootFLActivity.GetFLActivityByName(((IFLApproveBranchActivity)currentFLActivity).ParentActivity);
                    approveRights = approveActivity.ChildFLActivities;
                }

                string roleId = string.Empty;
                string orgKind = ((IFLRootActivity)_rootFLActivity).OrgKind;
                if (((IEventWaiting)approveActivity).SendToKind == SendToKind.Manager || ((FLApproveActivity)approveActivity).I > 0)           // Manager或者RefManager第一次进
                {
                    roleId = ((IEventWaitingExecute)_sendFromFLActivity).RoleId;
                }
                else if (((IEventWaiting)approveActivity).SendToKind == SendToKind.RefManager)      // RefManager第二次进
                {
                    string sendToField = ((IEventWaiting)approveActivity).SendToField;
                    string values = _keyValues[1].ToString();

                    string tableName = _rootFLActivity.TableName;
                    string qq = Global.GetRoleIdByRefRole(this, sendToField, tableName, values, _clientInfo);
                    roleId = qq;//Global.GetManagerRoleId(qq.ToString(), orgKind, _clientInfo);
                }
                else if (((IEventWaiting)approveActivity).SendToKind == SendToKind.ApplicateManager)
                {
                    if (!string.IsNullOrEmpty(this.CreateRole))
                    {
                        roleId = this.CreateRole;
                    }
                    else
                    {
                        string user = this.Creator;
                        List<string> roles = Global.GetRoleIdsByUserId(user, _clientInfo);
                        if (roles.Count > 0)
                        {
                            roleId = roles[0];
                        }
                    }
                }

                if (((IEventWaiting)approveActivity).SendToKind == SendToKind.Manager && string.IsNullOrEmpty(roleId))
                {
                    if (preview)
                    {
                        return;
                    }
                    else
                    {
                        String message = string.Format(SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "InstanceManager", "UserNotHaveRole"), ((IEventWaitingExecute)_sendFromFLActivity).UserId);
                        throw new FLException(2, message);
                    }
                }

                bool b = false;
                string levelNo = Global.GetLevelNo(roleId, orgKind, _clientInfo);

                if (!string.IsNullOrEmpty(levelNo))
                {
                    List<string> gRoleIds = new List<string>();
                    foreach (FLActivity a in approveRights)
                    {
                        gRoleIds.Clear();

                        if (JudgeCondition(((IFLApproveBranchActivity)a).Expression))
                        {
                            string grade = string.Empty;
                            string name = string.Empty;
                            string roleId2 = roleId;
                            string roleId3 = string.Empty;
                            bool bb = true;
                            do
                            {
                                roleId3 = roleId2;
                                grade = Global.GetManagerLevelNo(roleId3, orgKind, _clientInfo);
                                if (string.IsNullOrEmpty(grade)) { bb = false; break; }
                                name = approveActivity.Name + "-" + grade;
                                roleId2 = Global.GetManagerRoleId(roleId3, orgKind, _clientInfo);
                                if (gRoleIds.Contains(roleId2))
                                {
                                    String message = string.Format(SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "InstanceManager", "UserManagerIsCircle"), roleId2);
                                    throw new FLException(2, message);
                                }
                                if (roleId2 == roleId3)
                                {
                                    String message = string.Format(SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "InstanceManager", "UserManagerCanNotBeYouself"), roleId2);
                                    throw new FLException(2, message);
                                }
                                gRoleIds.Add(roleId2);
                            }
                            while (!(name == a.Name || (((FLApproveActivity)approveActivity).I == 0 && a.Name == approveActivity.Name + "-0")));

                            if (!bb)
                            {
                                continue;
                            }

                            _r = roleId3;

                            if (approveRights.IndexOf(a) == approveRights.Count - 1 && currentFLActivity.Name == name)  // add by andy
                            {
                                break;
                            }

                            SetUpperParallel(a);
                            SetLocation(a);
                            nextFLActivities.Add(a);
                            b = true;
                            approveActivity.Execute();
                            ((FLApproveActivity)approveActivity).I++;
                            break;
                        }
                    }
                }

                if (!b)
                {
                    approveActivity.Execute();

                    GetNextFLActivities(approveActivity, nextFLActivities);
                }

                #endregion
            }
            else if (currentFLActivity is IFLDetailsActivity && currentFLActivity.ExecutionStatus != FLActivityExecutionStatus.Executed)
            {
                #region

                IFLDetailsActivity detailsActivity = (IFLDetailsActivity)currentFLActivity;
                if (_hostDataSet == null)
                {
                    _hostDataSet = HostTable.GetHostDataSet(this, _keyValues, _clientInfo);
                }

                currentFLActivity.ClearActivities();
                FLActivity childActivity = null;
                if (!string.IsNullOrEmpty(detailsActivity.ExtApproveID))
                {
                    childActivity = new FLSequenceActivity();
                    DataRow hostRow = _hostDataSet.Tables[0].Rows[0];
                    string groupID = hostRow[detailsActivity.ExtGroupField].ToString();
                    object value = hostRow[detailsActivity.ExtValueField];
                    List<string> roles = Global.GetExtApproveRoles(detailsActivity.ExtApproveID, groupID, value, _clientInfo);
                    for (int i = 0; i < roles.Count; i++)
                    {
                        FLStandActivity stand = new FLStandActivity();
                        stand.Name = detailsActivity.Name + "_" + i.ToString();
                        childActivity.AddFLActivity(stand);
                        stand.Description = ((IFLDetailsActivity)detailsActivity).Description;
                        stand.Enabled = ((IFLDetailsActivity)detailsActivity).Enabled;
                        stand.ExpTime = ((IFLDetailsActivity)detailsActivity).ExpTime;
                        stand.FLNavigatorMode = ((IFLDetailsActivity)detailsActivity).FLNavigatorMode;
                        stand.FormName = ((IFLDetailsActivity)detailsActivity).FormName;
                        stand.WebFormName = ((IFLDetailsActivity)detailsActivity).WebFormName;
                        stand.NavigatorMode = ((IFLDetailsActivity)detailsActivity).NavigatorMode;
                        stand.Parameters = ((IFLDetailsActivity)detailsActivity).Parameters;
                        stand.SendToField = ((IFLDetailsActivity)detailsActivity).SendToField;
                        stand.SendToKind = ((IFLDetailsActivity)detailsActivity).SendToKind;
                        stand.SendToRole = ((IFLDetailsActivity)detailsActivity).SendToRole;
                        stand.SendToUser = ((IFLDetailsActivity)detailsActivity).SendToUser;
                        stand.TimeUnit = ((IFLDetailsActivity)detailsActivity).TimeUnit;
                        stand.UrgentTime = ((IFLDetailsActivity)detailsActivity).UrgentTime;
                        stand.SendEmail = ((IFLDetailsActivity)detailsActivity).SendEmail;
                        stand.PlusApprove = ((IFLDetailsActivity)detailsActivity).PlusApprove;
                        stand.PlusApproveReturn = ((IFLDetailsActivity)detailsActivity).PlusApproveReturn;
                        stand.AllowSendBack = ((IFLDetailsActivity)detailsActivity).AllowSendBack;

                        ((ISupportFLDetailsActivity)stand).SendToId2 = roles[i];
                    }

                    if (childActivity.ChildFLActivities.Count > 0) //当有子activity时才加入
                    {
                        ((FLActivity)detailsActivity).AddFLActivity(childActivity);
                    }
                }
                else if (!string.IsNullOrEmpty(detailsActivity.SendToMasterField))
                {
                    #region

                    DataRow hostRow = _hostDataSet.Tables[0].Rows[0];
                    string ids = string.Empty;

                    if (hostRow.Table.Columns.Contains(detailsActivity.SendToMasterField))
                    {
                        //String message = string.Format(SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "TableNotExistColumn"), _rootFLActivity.TableName, detailsActivity.SendToMasterField);
                        //throw new FLException(2, message);

                        object obj = hostRow[detailsActivity.SendToMasterField];
                        if (obj != null && obj != DBNull.Value && !string.IsNullOrEmpty(obj.ToString()))
                        {
                            //String message = string.Format(SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "SendToFieldValueIsNull"), _rootFLActivity.TableName, detailsActivity.SendToMasterField);
                            //throw new FLException(2, message);
                            ids = obj.ToString();
                        }
                    }

                    if (detailsActivity.ParallelMode == ParallelMode.And || detailsActivity.ParallelMode == ParallelMode.Or)
                    {
                        childActivity = new FLParallelActivity();
                        childActivity.Description = (detailsActivity.ParallelMode == ParallelMode.And && detailsActivity.ParallelRate > 0) ?
                            string.Format("rate:{0}", detailsActivity.ParallelRate) : detailsActivity.ParallelMode.ToString();
                        childActivity.Name = detailsActivity.Name + "_p1";
                    }
                    else
                    {
                        childActivity = new FLSequenceActivity();
                        childActivity.Name = detailsActivity.Name + "_se1";
                    }

                    int i0 = 0;
                    string[] sendToIds = ids.ToString().Split(",".ToCharArray());
                    foreach (string sendToId in sendToIds)
                    {
                        if (string.IsNullOrEmpty(sendToId))
                        {
                            continue;
                        }

                        FLStandActivity stand = new FLStandActivity();
                        stand.Name = detailsActivity.Name + "_" + i0.ToString();
                        i0++;
                        if (detailsActivity.ParallelMode == ParallelMode.And || detailsActivity.ParallelMode == ParallelMode.Or)
                        {
                            FLSequenceActivity sequenceActivity = new FLSequenceActivity();
                            sequenceActivity.Name = detailsActivity.Name + "_se" + i0.ToString();
                            sequenceActivity.AddFLActivity(stand);
                            childActivity.AddFLActivity(sequenceActivity);
                        }
                        else
                        {
                            childActivity.AddFLActivity(stand);
                        }

                        stand.Description = ((IFLDetailsActivity)detailsActivity).Description;
                        stand.Enabled = ((IFLDetailsActivity)detailsActivity).Enabled;

                        stand.ExpTime = ((IFLDetailsActivity)detailsActivity).ExpTime;
                        stand.FLNavigatorMode = ((IFLDetailsActivity)detailsActivity).FLNavigatorMode;
                        stand.FormName = ((IFLDetailsActivity)detailsActivity).FormName;
                        stand.WebFormName = ((IFLDetailsActivity)detailsActivity).WebFormName;
                        stand.NavigatorMode = ((IFLDetailsActivity)detailsActivity).NavigatorMode;
                        stand.Parameters = ((IFLDetailsActivity)detailsActivity).Parameters;
                        stand.SendToField = ((IFLDetailsActivity)detailsActivity).SendToField;
                        stand.SendToKind = ((IFLDetailsActivity)detailsActivity).SendToKind;
                        stand.SendToRole = ((IFLDetailsActivity)detailsActivity).SendToRole;
                        stand.SendToUser = ((IFLDetailsActivity)detailsActivity).SendToUser;
                        stand.TimeUnit = ((IFLDetailsActivity)detailsActivity).TimeUnit;
                        stand.UrgentTime = ((IFLDetailsActivity)detailsActivity).UrgentTime;
                        stand.SendEmail = ((IFLDetailsActivity)detailsActivity).SendEmail;
                        stand.PlusApprove = ((IFLDetailsActivity)detailsActivity).PlusApprove;
                        stand.PlusApproveReturn = ((IFLDetailsActivity)detailsActivity).PlusApproveReturn;
                        stand.AllowSendBack = ((IFLDetailsActivity)detailsActivity).AllowSendBack;

                       // ((ISupportFLDetailsActivity)stand).SendToId2 = sendToId;
                        if (((IFLDetailsActivity)detailsActivity).SendToKind == SendToKind.RefRole)
                        {
                            stand.SendToKind = SendToKind.Role;
                            stand.SendToRole = sendToId;
                        }
                        else if (((IFLDetailsActivity)detailsActivity).SendToKind == SendToKind.RefUser)
                        {
                            stand.SendToKind = SendToKind.User;
                            stand.SendToUser = sendToId;
                        }
                    }
                    if (childActivity.ChildFLActivities.Count > 0) //当有子activity时才加入
                    {
                        ((FLActivity)detailsActivity).AddFLActivity(childActivity);
                    }

                    #endregion
                }
                else
                {
                    #region

                    Activity temp = FLInstance.GetActivityByXoml(this.FLDefinitionFile, string.Empty);
                    IFLRootActivity rootActivity = (IFLRootActivity)temp;

                    DataSet detailsDataSet = HostTable.GetDetailsDataSet(this, _hostDataSet, rootActivity.Keys, detailsActivity.DetailsTableName, detailsActivity.RelationKeys, _clientInfo);
                    string parallelField = detailsActivity.ParallelField;
                    string sendToField = detailsActivity.SendToField;

                    Dictionary<string, FLSequenceActivity> sequenceActivities = new Dictionary<string, FLSequenceActivity>(); // for y1,y2,y3
                    if (detailsDataSet != null && detailsDataSet.Tables.Count != 0 && detailsDataSet.Tables[0].Rows.Count != 0)
                    {
                        int i0 = 1;
                        int i1 = 1;
                        int i2 = 1;

                        foreach (DataRow row in detailsDataSet.Tables[0].Rows)
                        {
                            FLStandActivity stand = new FLStandActivity();

                            //stand.Name = n.Name + "_s" + i0.ToString();
                            stand.Name = detailsActivity.Name + "_" + i0.ToString();
                            i0++;

                            stand.Description = ((IFLDetailsActivity)detailsActivity).Description;
                            stand.Enabled = ((IFLDetailsActivity)detailsActivity).Enabled;

                            stand.ExpTime = ((IFLDetailsActivity)detailsActivity).ExpTime;
                            stand.FLNavigatorMode = ((IFLDetailsActivity)detailsActivity).FLNavigatorMode;
                            stand.FormName = ((IFLDetailsActivity)detailsActivity).FormName;
                            stand.WebFormName = ((IFLDetailsActivity)detailsActivity).WebFormName;
                            stand.NavigatorMode = ((IFLDetailsActivity)detailsActivity).NavigatorMode;
                            stand.Parameters = ((IFLDetailsActivity)detailsActivity).Parameters;
                            stand.SendToField = ((IFLDetailsActivity)detailsActivity).SendToField;
                            stand.SendToKind = ((IFLDetailsActivity)detailsActivity).SendToKind;
                            stand.SendToRole = ((IFLDetailsActivity)detailsActivity).SendToRole;
                            stand.SendToUser = ((IFLDetailsActivity)detailsActivity).SendToUser;
                            stand.TimeUnit = ((IFLDetailsActivity)detailsActivity).TimeUnit;
                            stand.UrgentTime = ((IFLDetailsActivity)detailsActivity).UrgentTime;
                            stand.SendEmail = ((IFLDetailsActivity)detailsActivity).SendEmail;
                            stand.PlusApprove = ((IFLDetailsActivity)detailsActivity).PlusApprove;
                            stand.PlusApproveReturn = ((IFLDetailsActivity)detailsActivity).PlusApproveReturn;
                            stand.AllowSendBack = ((IFLDetailsActivity)detailsActivity).AllowSendBack;

                            if (!string.IsNullOrEmpty(detailsActivity.FLNavigatorField))
                            {
                                object flNavigatorMode = row[detailsActivity.FLNavigatorField];
                                if (flNavigatorMode != null)
                                {
                                    if (string.Compare(flNavigatorMode.ToString(), "Continue", true) == 0)
                                    {
                                        stand.FLNavigatorMode = FLNavigatorMode.Continue;
                                    }
                                }
                            }

                            object sendToId2 = row[sendToField];
                            if (sendToId2 == null || sendToId2 == DBNull.Value || sendToId2.ToString() == string.Empty)
                            {
                                continue;
                                //String message = string.Format(SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "SendToFieldValueIsNull"), n.DetailsTableName);
                                //throw new FLException(message);
                            }
                            //((ISupportFLDetailsActivity)stand).SendToId2 = sendToId2.ToString();
                            if (((IFLDetailsActivity)detailsActivity).SendToKind == SendToKind.RefRole)
                            {
                                stand.SendToKind = SendToKind.Role;
                                stand.SendToRole = sendToId2.ToString();
                            }
                            else if (((IFLDetailsActivity)detailsActivity).SendToKind == SendToKind.RefUser)
                            {
                                stand.SendToKind = SendToKind.User;
                                stand.SendToUser = sendToId2.ToString();
                            }

                            if (!string.IsNullOrEmpty(parallelField))
                            {
                                object isParallel = row[parallelField];
                                if ((isParallel != null && isParallel != DBNull.Value) &&
                                    (isParallel.ToString().Trim().ToLower() == "y" || isParallel.ToString().Trim().ToLower() == "and"))
                                {
                                    if (childActivity == null)
                                    {
                                        childActivity = new FLParallelActivity();
                                        childActivity.Description = detailsActivity.ParallelRate > 0 ? string.Format("rate:{0}", detailsActivity.ParallelRate) : "and";
                                        childActivity.Name = detailsActivity.Name + "_p" + i2.ToString();
                                        i2++;

                                        ((FLActivity)detailsActivity).AddFLActivity(childActivity);
                                    }

                                    FLSequenceActivity sequenceActivity = new FLSequenceActivity();
                                    sequenceActivity.Name = detailsActivity.Name + "_se" + i1.ToString();
                                    i1++;
                                    ((FLActivity)childActivity).AddFLActivity(sequenceActivity);

                                    ((FLActivity)sequenceActivity).AddFLActivity(stand);
                                }
                                else if ((isParallel != null && isParallel != DBNull.Value) && (isParallel.ToString().Trim().ToLower().StartsWith("y")))
                                {
                                    if (childActivity == null)
                                    {
                                        childActivity = new FLParallelActivity();
                                        childActivity.Description = "and";
                                        childActivity.Name = detailsActivity.Name + "_p" + i2.ToString();
                                        i2++;

                                        ((FLActivity)detailsActivity).AddFLActivity(childActivity);
                                    }
                                    FLSequenceActivity sequenceActivity = null;
                                    if(sequenceActivities.ContainsKey(isParallel.ToString()))
                                    {
                                        sequenceActivity = sequenceActivities[isParallel.ToString()];
                                    }
                                    if (sequenceActivity == null)
                                    {
                                        sequenceActivity = new FLSequenceActivity();
                                        sequenceActivity.Name = detailsActivity.Name + "_se" + i1.ToString();
                                        i1++;
                                        ((FLActivity)childActivity).AddFLActivity(sequenceActivity);
                                        sequenceActivities[isParallel.ToString()] = sequenceActivity;
                                    }
                                    sequenceActivity.AddFLActivity(stand);
                                }
                                //修改n值时会串签
                                //else if ((isParallel != null && isParallel != DBNull.Value) &&
                                //    (isParallel.ToString().Trim().ToLower() == "n" || isParallel.ToString().Trim().ToLower() == "or"))
                                //{
                                //    if (childActivity == null)
                                //    {
                                //        childActivity = new FLParallelActivity();
                                //        childActivity.Description = "Or";
                                //        childActivity.Name = detailsActivity.Name + "_p" + i2.ToString();
                                //        i2++;

                            //        ((FLActivity)detailsActivity).AddFLActivity(childActivity);
                                //    }
                                //    FLSequenceActivity sequenceActivity = new FLSequenceActivity();
                                //    sequenceActivity.Name = detailsActivity.Name + "_se" + i1.ToString();
                                //    i1++;
                                //    ((FLActivity)childActivity).AddFLActivity(sequenceActivity);

                            //    ((FLActivity)sequenceActivity).AddFLActivity(stand);
                                //}
                                else
                                {
                                    childActivity = null;
                                    ((FLActivity)detailsActivity).AddFLActivity(stand);
                                }
                            }
                            else
                            {
                                childActivity = null;
                                ((FLActivity)detailsActivity).AddFLActivity(stand);
                            }
                        }
                    }

                    #endregion
                }

                XmlSerializer serializer = CreateXmlSerializer(typeof(FLDetailsActivity));

                StringBuilder builder = new StringBuilder();
                XmlWriter writer = XmlWriter.Create(builder);
                serializer.Serialize(writer, detailsActivity);

                XmlDocument doc = new XmlDocument();
                doc.LoadXml(builder.ToString());
                XmlNode nodeDetails = doc.SelectSingleNode(string.Format("FLDetailsActivity[@Name='{0}']", detailsActivity.Name));

                XmlNode nodeOldDetails = (XmlNode)_flDefinitionXmlNodes[detailsActivity.Name];
                nodeOldDetails.InnerXml = nodeDetails.InnerXml;

                InitFLDefinitionXmlNodes(nodeOldDetails);
                _flDefinitionXmlString = nodeOldDetails.OwnerDocument.InnerXml;

                ((FLActivity)detailsActivity).Execute();

                Hashtable childAll = ((FLActivity)detailsActivity).GetAllChildFLActivities();
                foreach (string key in childAll.Keys)
                {
                    _setUpperParallels.Remove(key);
                }
                foreach (string key in childAll.Keys)
                {
                    _setLocations.Remove(key);
                }
                SetUpperParallel((FLActivity)detailsActivity);
                SetLocation((FLActivity)detailsActivity);

                if (((FLActivity)detailsActivity).ChildFLActivities.Count == 0)
                {
                    GetNextFLActivities((FLActivity)detailsActivity, nextFLActivities);
                    //当detailsActivity没有任何人需要签核时, 撤消detailsActivity状态,不然退回后再也无法进入detailsActivity
                    ((FLActivity)detailsActivity).InitExecStatus();
                }
                else
                {
                    if (((FLActivity)detailsActivity).ChildFLActivities[0] is FLStandActivity)
                    {

                        SetUpperParallel(((FLActivity)detailsActivity).ChildFLActivities[0]);
                        SetLocation(((FLActivity)detailsActivity).ChildFLActivities[0]);

                        nextFLActivities.Add(((FLActivity)detailsActivity).ChildFLActivities[0]);
                    }
                    else
                    {
                        GetNextFLActivities(((FLActivity)detailsActivity).ChildFLActivities[0], nextFLActivities);
                    }
                }

                #endregion
            }
            else if (currentFLActivity is IFLSubFlowActivity && currentFLActivity.ExecutionStatus != FLActivityExecutionStatus.Executed)
            {

                IFLSubFlowActivity subflow = currentFLActivity as IFLSubFlowActivity;
                ((FLActivity)subflow).ChildFLActivities.Clear();
                string xomlName = subflow.XomlName;
                if (_hostDataSet == null)
                {
                    _hostDataSet = HostTable.GetHostDataSet(this, _keyValues, _clientInfo);
                }
                DataRow hostRow = _hostDataSet.Tables[0].Rows[0];
                if (!string.IsNullOrEmpty(subflow.XomlField) && hostRow.Table.Columns.Contains(subflow.XomlField))
                {
                    object obj = hostRow[subflow.XomlField];
                    if (obj != null && obj != DBNull.Value && !string.IsNullOrEmpty(obj.ToString()))
                    {
                        xomlName = obj.ToString();
                    }
                }

                if (!string.IsNullOrEmpty(xomlName))
                {
                    FLRootActivity subflowRoot = new FLRootActivity();
                    FileInfo fileInfo = new FileInfo(this.FLDefinitionFile);
                    string file = fileInfo.Directory + @"\" + xomlName;

                    if (!File.Exists(file))
                    {
                        file = fileInfo.Directory + @"\SubFlows\" + xomlName;
                    }
                    Activity subflowDefniation = GetActivityByXoml(file, string.Empty);

                    InitFLActivities(subflowRoot, subflowDefniation);

                    for (int i = 0; i < subflowRoot.ChildFLActivities.Count; i++)
                    {
                        if (i == 0 && !subflow.IncludeFirstActivity)
                        {
                            continue;
                        }

                        FLActivity child = subflowRoot.ChildFLActivities[i];

                        //((FLActivity)subflowRoot).ChildFLActivities.Remove(child);

                        if (this.RootFLActivity.GetFLActivityByName(child.Name) != null)
                        {
                            if (this.RootFLActivity.GetFLActivityByName(currentFLActivity.Name).GetFLActivityByName(child.Name) == null)
                            {
                                throw new FLException(string.Format("Activity:'{0}' exists in main flow and sub flow.", child.Name));
                            }
                        }

                        ((FLActivity)subflow).AddFLActivity(child);
                    }
                }

                XmlSerializer serializer = CreateXmlSerializer(typeof(FLSubFlowActivity));

                StringBuilder builder = new StringBuilder();
                XmlWriter writer = XmlWriter.Create(builder);
                serializer.Serialize(writer, subflow);

                XmlDocument doc = new XmlDocument();
                doc.LoadXml(builder.ToString());
                XmlNode nodeSubs = doc.SelectSingleNode(string.Format("FLSubFlowActivity[@Name='{0}']", subflow.Name));

                XmlNode nodeOldSubs = (XmlNode)_flDefinitionXmlNodes[subflow.Name];
                nodeOldSubs.InnerXml = nodeSubs.InnerXml;

                InitFLDefinitionXmlNodes(nodeOldSubs);
                _flDefinitionXmlString = nodeOldSubs.OwnerDocument.InnerXml;
                ((FLActivity)subflow).Execute();

                Hashtable childAll = ((FLActivity)subflow).GetAllChildFLActivities();
                foreach (string key in childAll.Keys)
                {
                    _setUpperParallels.Remove(key);
                    _setLocations.Remove(key);
                }

                SetUpperParallel((FLActivity)subflow);
                SetLocation((FLActivity)subflow);

                if (((FLActivity)subflow).ChildFLActivities.Count == 0)
                {
                    GetNextFLActivities((FLActivity)subflow, nextFLActivities);
                    //当subflow没有任何人需要签核时, 撤消subflow状态,不然退回后再也无法进入subflow
                    ((FLActivity)subflow).InitExecStatus();
                }
                else
                {
                    if (((FLActivity)subflow).ChildFLActivities[0] is FLStandActivity)
                    {
                        SetUpperParallel(((FLActivity)subflow).ChildFLActivities[0]);
                        SetLocation(((FLActivity)subflow).ChildFLActivities[0]);
                        nextFLActivities.Add(((FLActivity)subflow).ChildFLActivities[0]);
                    }
                    else
                    {
                        GetNextFLActivities(((FLActivity)subflow).ChildFLActivities[0], nextFLActivities);
                    }
                }
            }
            else
            {
                #region

                if ((currentFLActivity is IEventWaiting) || (currentFLActivity is IFLValidateActivity) || ((currentFLActivity is IControlFL) && (currentFLActivity.ExecutionStatus == FLActivityExecutionStatus.Executed)))
                {
                    if (currentFLActivity is IFLParallelActivity && (string.IsNullOrEmpty(((IFLParallelActivity)currentFLActivity).Description) || string.IsNullOrEmpty(((IFLParallelActivity)currentFLActivity).Description.Trim()) || ((IFLParallelActivity)currentFLActivity).Description.ToLower() == "and"))
                    {
                        bool b = true;
                        foreach (FLActivity a in currentFLActivity.ChildFLActivities)
                        {
                            if (!((IFLParallelActivity)currentFLActivity).ExecutedBranches.Exists(
                                delegate(string s)
                                {
                                    if (a.Name == s)
                                        return true;
                                    else
                                        return false;
                                }
                                ))
                            {
                                b = false;
                                break;
                            }
                        }

                        if (!b)
                        {
                            return;
                        }
                    }
                    else if (currentFLActivity is IFLParallelActivity && (!string.IsNullOrEmpty(((IFLParallelActivity)currentFLActivity).Description) && !string.IsNullOrEmpty(((IFLParallelActivity)currentFLActivity).Description.Trim()) && ((IFLParallelActivity)currentFLActivity).Description.ToLower().Contains("rate")))
                    {
                        decimal rate = 0;
                        decimal x = currentFLActivity.ChildFLActivities.Count;
                        if (x != 0)
                        {
                            decimal y = ((IFLParallelActivity)currentFLActivity).ExecutedBranches.Count;
                            decimal j = y / x;

                            string q = ((IFLParallelActivity)currentFLActivity).Description.Trim();
                            string[] qq = q.Split(":".ToCharArray());
                            string p = qq[1].Trim();
                            rate = decimal.Parse(p);

                            rate = rate / 100;
                            if (j < rate)
                            {
                                return;
                            }
                        }
                    }

                    activity = GetRealNextFLActivity(currentFLActivity);
                    if (activity == null)
                    {
                        activity = GetRealParentFLActivity(currentFLActivity);
                        if (activity == null || activity is IFLRootActivity)
                        {
                            _flflag = 'Z';
                            return;
                        }

                        FLActivity parentActivity = GetRealParentFLActivity(activity);
                        if (parentActivity is IFLParallelActivity && ((string.IsNullOrEmpty(((IFLParallelActivity)parentActivity).Description) || string.IsNullOrEmpty(((IFLParallelActivity)parentActivity).Description.Trim()) || ((IFLParallelActivity)parentActivity).Description.Trim().ToLower() == "and")
                            || (!string.IsNullOrEmpty(((IFLParallelActivity)parentActivity).Description) && !string.IsNullOrEmpty(((IFLParallelActivity)parentActivity).Description.Trim()) && ((IFLParallelActivity)parentActivity).Description.Trim().ToLower().Contains("rate"))))
                        {
                            if (!((IFLParallelActivity)parentActivity).ExecutedBranches.Exists(
                                 delegate(string s)
                                 {
                                     if (currentFLActivity.Name == s)
                                         return true;
                                     else
                                         return false;
                                 }
                                 ))
                            {
                                ((IFLParallelActivity)parentActivity).ExecutedBranches.Add(activity.Name);
                                foreach (FLActivity a in parentActivity.ChildFLActivities)
                                {
                                    FLDirection direction = ((IFLSequenceActivity)a).FLDirection;
                                    if (a.Name != activity.Name && direction != FLDirection.Waiting)
                                    {
                                        //if (direction != _flDirection)
                                        //{
                                        //    String message = string.Format(SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "DirectionError"), _flDirection.ToString(), a.Name, direction.ToString());
                                        //    throw new FLException(2, message);
                                        //}
                                    }
                                }
                                ((IFLSequenceActivity)activity).SetFLDirection(_flDirection);
                            }
                        }
                    }

                    if (activity is IEventWaiting && !(activity is IFLApproveActivity || activity is IFLApproveBranchActivity) && activity.Enabled)
                    {
                        SetUpperParallel(activity);
                        SetLocation(activity);
                        nextFLActivities.Add(activity);
                    }
                    else
                    {
                        GetNextFLActivities(activity, nextFLActivities);
                    }
                }
                else
                {
                    if (currentFLActivity is IControlFL && !(currentFLActivity is IFLRootActivity))
                    {
                        currentFLActivity.Execute();
                    }

                    FLActivity parentFLActivity = GetRealParentFLActivity(currentFLActivity);
                    if (parentFLActivity != null && parentFLActivity is IFLIfElseActivity)
                    {
                        foreach (FLActivity flActivity in parentFLActivity.ChildFLActivities)
                        {
                            flActivity.Execute();
                        }
                    }

                    if (currentFLActivity is IFLIfElseActivity)
                    {
                        List<FLActivity> branchActivities = currentFLActivity.ChildFLActivities;
                        List<FLActivity> runBranchActivities = new List<FLActivity>();
                        FLActivity elseBranchActivity = null;

                        foreach (FLActivity branchActivity in branchActivities)
                        {
                            IFLIfElseBranchActivity a = (IFLIfElseBranchActivity)branchActivity;
                            string condition = a.Condition;
                            if (condition != string.Empty)
                            {
                                if (JudgeCondition(condition))
                                {
                                    runBranchActivities.Add(branchActivity);
                                    break;
                                }
                            }
                            else
                            {
                                elseBranchActivity = branchActivity;
                            }
                        }

                        foreach (FLActivity branchActivity in runBranchActivities)
                        {
                            GetNextFLActivities(branchActivity, nextFLActivities);
                        }

                        if (runBranchActivities.Count == 0)
                        {
                            GetNextFLActivities(elseBranchActivity, nextFLActivities);
                        }
                    }
                    else if (currentFLActivity is IFLParallelActivity)
                    {
                        _isFirstInParallel = true;
                        _tempParallel = currentFLActivity.Name;
                        foreach (FLActivity a in currentFLActivity.ChildFLActivities)
                        {
                            _tempParallelBranch = a.Name;
                            List<FLActivity> tempNextFLActivities = new List<FLActivity>();

                            ((IFLSequenceActivity)a).SetFLDirection(FLDirection.Waiting);
                            GetNextFLActivities(a, tempNextFLActivities);

                            int j = 0;
                            foreach (FLActivity tempFLActivity in tempNextFLActivities)
                            {
                                if (tempFLActivity is IEventWaiting)
                                {
                                    j++;
                                }
                            }

                            if (j == 0)
                            {
                                ((IFLParallelActivity)currentFLActivity).ExecutedBranches.Add(a.Name);
                            }

                            nextFLActivities.AddRange(tempNextFLActivities);
                        }
                        _isFirstInParallel = false;
                        _tempParallel = string.Empty;
                        _tempParallelBranch = string.Empty;

                        if (nextFLActivities.Count == 0)
                        {
                            GetNextFLActivities(currentFLActivity, nextFLActivities);
                        }
                    }
                    else
                    {
                        List<FLActivity> activities = currentFLActivity.ChildFLActivities;
                        if (activities.Count == 0)
                        {
                            activity = GetRealNextFLActivity(currentFLActivity);
                            if (activity == null)
                            {
                                activity = GetRealParentFLActivity(currentFLActivity);
                                if (activity == null || activity is IFLRootActivity)
                                {
                                    _flflag = 'Z';
                                    return;
                                }
                            }

                            if (activity is IEventWaiting && !(activity is IFLApproveActivity || activity is IFLApproveBranchActivity) && activity.Enabled)
                            {
                                SetUpperParallel(activity);
                                SetLocation(activity);
                                nextFLActivities.Add(activity);
                            }
                            else
                            {
                                GetNextFLActivities(activity, nextFLActivities);
                            }
                        }
                        else
                        {
                            activity = activities[0];
                            if (activity is IEventWaiting && !(activity is IFLApproveActivity || activity is IFLApproveBranchActivity) && activity.Enabled)
                            {
                                SetUpperParallel(activity);
                                SetLocation(activity);
                                nextFLActivities.Add(activity);
                            }
                            else
                            {
                                GetNextFLActivities(activity, nextFLActivities);
                            }
                        }
                    }
                }

                #endregion
            }
        }
Exemple #23
0
        /* // 此方法支持Parallel的嵌套
        private void SetUpperParallel(FLActivity activity)
        {
            if (!_setUpperParallelFLActivities.Exists(
                    delegate(string s)
                    {
                        if (activity.Name == s)
                            return true;
                        else
                            return false;
                    }
                ))
            {
                FLActivity parentActivity = GetRealParentFLActivity(activity);
                if (parentActivity != null && !(parentActivity is IFLRootActivity))
                {
                    if (parentActivity is IFLParallelActivity)
                    {
                        if (parentActivity.UpperParallel != null && parentActivity.UpperParallel != string.Empty)
                        {
                            activity.UpperParallel = parentActivity.UpperParallel + "->";
                        }
                        activity.UpperParallel += parentActivity.Name;
                        if (((IFLParallelActivity)parentActivity).Description.ToLower() == "true")
                        {
                            activity.IsUpperParallelAnd = true;
                        }
                        activity.UpperParallelBranch = activity.Name;
                    }
                    else
                    {
                        activity.UpperParallel = parentActivity.UpperParallel;
                        activity.IsUpperParallelAnd = parentActivity.IsUpperParallelAnd;
                        activity.UpperParallelBranch = parentActivity.UpperParallelBranch;
                    }
                }

                _setUpperParallelFLActivities.Add(activity.Name);
            }
        }
        */
        // 此方法不支持Parallel的嵌套
        /// <summary>
        /// 设置当前Activity的上一级的Parallel
        /// </summary>
        /// <param name="activity">当前的Activity</param>
        private void SetUpperParallel(FLActivity activity)
        {
            if (!_setUpperParallels.Exists(
                    delegate(string s)
                    {
                        if (activity.Name == s)
                            return true;
                        else
                            return false;
                    }
                ))
            {
                FLActivity parentFLActivity = GetRealParentFLActivity(activity);
                if (parentFLActivity != null && !(parentFLActivity is IFLRootActivity))
                {
                    if (parentFLActivity is IFLParallelActivity)
                    {
                        activity.UpperParallel = parentFLActivity.Name;
                        if (((IFLParallelActivity)parentFLActivity).Description.ToLower() == "and" || string.IsNullOrEmpty(((IFLParallelActivity)parentFLActivity).Description))
                        {
                            activity.IsUpperParallelAnd = true;
                        }
                        activity.UpperParallelBranch = activity.Name;
                    }
                    else
                    {
                        activity.UpperParallel = parentFLActivity.UpperParallel;
                        activity.IsUpperParallelAnd = parentFLActivity.IsUpperParallelAnd;
                        activity.UpperParallelBranch = parentFLActivity.UpperParallelBranch;
                    }
                }

                _setUpperParallels.Add(activity.Name);
            }
        }
Exemple #24
0
 private List<string> GetParallelPath(FLActivity activity)
 {
     var parentAcivity = GetRealParentFLActivity(activity);
     if (parentAcivity is FLRootActivity)
     {
         return new List<string>(new string[] { parentAcivity.Name });
     }
     else
     {
         var parentPath = GetParallelPath(parentAcivity);
         if (parentAcivity is FLParallelActivity)
         {
             parentPath.Add(parentAcivity.Name);
         }
         return parentPath;
     }
 }
Exemple #25
0
        /// <summary>
        /// 审批流程
        /// </summary>
        /// <param name="previousFLActivityName">上一节点</param>
        /// <param name="currentFLActivityName">当前节点</param>
        /// <param name="userId">用户Id</param>
        /// <param name="roleId">权限Id</param>
        /// <param name="isUrgent">是否紧急</param>
        public void Approve(string previousFLActivityName, string currentFLActivityName, string userId, string roleId, bool isUrgent)
        {
            _isPlusApprove = false;
            _isPause = false;
            _isRetake = false;
            _isReturn = false;
            _flflag = 'P';
            _v = true;
            _flDirection = FLDirection.GoToNext;
            _previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);
            _currentFLActivity = _rootFLActivity.GetFLActivityByName(currentFLActivityName);
            _nextFLActivities = new List<FLActivity>();

            if (_currentFLActivity.ExecutionStatus == FLActivityExecutionStatus.Executed)
            {
                String message = SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "FLSetpIsApprovedOrReturned");
                throw new FLException(2, message);
            }

            if (_previousFLActivity != null && _previousFLActivity.ExecutionStatus != FLActivityExecutionStatus.Executed && previousFLActivityName != currentFLActivityName)
            {
                String message = SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "FLSetpIsApprovedOrReturned");
                throw new FLException(2, message);
            }
            var previousExecutedActivities = new List<FLActivity>();
            if (Version == "2.0")
            {
                previousExecutedActivities = GetExecutedActivities(this.RootFLActivity);
            }
            ((IEventWaitingExecute)_currentFLActivity).Execute(userId, roleId, isUrgent);

            _sendFromFLActivity = _currentFLActivity;

            //---------------------------------------------------------
            if (_flDefinitionXmlNodes == null)
            {
                _flDefinitionXmlNodes = new Hashtable();
                InitFLDefinitionXmlNodes();
            }
            GetNextFLActivities(_currentFLActivity, _nextFLActivities);
            foreach (FLActivity activity in _nextFLActivities)
            {
                activity.InitExecStatus();
                if (Version == "2.0")
                {
                    activity.PreviousActivity = _currentFLActivity;
                }
            }
            if (Version == "2.0")
            {
                _currentFLActivity.NextActivities = _nextFLActivities;
                _currentFLActivity.ExecutedActivities = GetExecutedActivities(this.RootFLActivity, previousExecutedActivities);
                LastActivity = _currentFLActivity.Name;
            }
            //---------------------------------------------------------

            AddToPathList(_nextFLActivities, _currentFLActivity);
            Record();

            // OnApprove(this, new __FLInstanceApproveEventArgs());
        }
Exemple #26
0
        //private void GetPreviousFLActivites(FLActivity currentFLActivity, List<FLActivity> nextFLActivities)
        //{
        //    if (_flPathList.Count <= 1)
        //    {
        //        _flflag = 'Z';
        //    }
        //    currentFLActivity.UnExecute();
        //    if (currentFLActivity.UpperParallel == string.Empty)
        //    {
        //        object o0 = _flPathList[_flPathList.Count - 2];
        //        // A ——> B ——> C
        //        if (o0 is string)
        //        {
        //            FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(o0.ToString());
        //            nextFLActivities.Add(previousFLActivity);
        //            UnExecuteIFLControls(currentFLActivity, previousFLActivity);
        //            _flPathList.Remove(currentFLActivity.Name);
        //        }
        //        // B ——>
        //        //         A
        //        // C ——>
        //        else
        //        {
        //            List<object> list01 = (List<object>)_flPathList[_flPathList.Count - 2];
        //            List<string> branches = new List<string>();
        //            foreach (object o1 in list01)
        //            {
        //                List<object> list1 = (List<object>)o1;
        //                if (list1.Count > 0)
        //                {
        //                    string previousFLActivityName = list1[list1.Count - 1].ToString();
        //                    FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);
        //                    nextFLActivities.Add(previousFLActivity);
        //                    branches.Add(previousFLActivity.UpperParallelBranch);
        //                    UnExecuteIFLControls(currentFLActivity, previousFLActivity);
        //                }
        //            }
        //            FLActivity tempFLActivity = _rootFLActivity.GetFLActivityByName(((List<object>)list01[0])[0].ToString());
        //            string upperParallel = tempFLActivity.UpperParallel;
        //            FLActivity parallelFLActivity = _rootFLActivity.GetFLActivityByName(upperParallel);
        //            foreach (string branch in branches)
        //            {
        //                ((IFLParallelActivity)parallelFLActivity).ExecutedBranches.Remove(branch);
        //                ((IFLSequenceActivity)_rootFLActivity.GetFLActivityByName(branch)).SetFLDirection(FLDirection.Waiting);
        //            }
        //            _flPathList.Remove(currentFLActivity.Name);
        //        }
        //    }
        //    else
        //    {
        //        List<object> list0 = (List<object>)_flPathList[_flPathList.Count - 1];
        //        List<object> list1 = null;
        //        foreach (object o0 in list0)
        //        {
        //            List<object> temp = (List<object>)o0;
        //            if (temp.Exists(
        //                         delegate(object s)
        //                         {
        //                             if (currentFLActivity.Name == s.ToString())
        //                                 return true;
        //                             else
        //                                 return false;
        //                         }
        //                ))
        //            {
        //                list1 = temp;
        //                break;
        //            }
        //        }
        //        //   ——> B ——> D
        //        // A
        //        //   ——> C ——> E
        //        if (list1.Count > 1)
        //        {
        //            FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(list1[list1.Count - 2].ToString());
        //            nextFLActivities.Add(previousFLActivity);
        //            UnExecuteIFLControls(currentFLActivity, previousFLActivity);
        //            list1.Remove(currentFLActivity.Name);
        //        }
        //        else
        //        {
        //            FLActivity upperParallelFLActivity = _rootFLActivity.GetFLActivityByName(currentFLActivity.UpperParallel);
        //            FLActivity upperParallelBranchFLActivity = _rootFLActivity.GetFLActivityByName(currentFLActivity.UpperParallelBranch);
        //            foreach (FLActivity a in upperParallelFLActivity.ChildFLActivities)
        //            {
        //                FLDirection direction = ((IFLSequenceActivity)a).FLDirection;
        //                if (a.Name != upperParallelBranchFLActivity.Name && direction != FLDirection.Waiting)
        //                {
        //                    if (direction != _flDirection)
        //                    {
        //                        throw new Exception("You don't " + _flDirection.ToString() + ",because " + a.Name + " had " + direction.ToString() + ".");
        //                    }
        //                }
        //            }
        //            ((IFLSequenceActivity)upperParallelBranchFLActivity).SetFLDirection(_flDirection);
        //            object o01 = _flPathList[_flPathList.Count - 2];
        //            //   ——> B
        //            // A
        //            //   ——> C
        //            if (o01 is string)
        //            {
        //                FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(o01.ToString());
        //                if (list0.Count <= 1)
        //                {
        //                    nextFLActivities.Add(previousFLActivity);
        //                    upperParallelBranchFLActivity.UnExecute();
        //                    upperParallelFLActivity.UnExecute();
        //                    UnExecuteIFLControls(currentFLActivity, previousFLActivity);
        //                    _flPathList.Remove(list0);
        //                }
        //                else
        //                {
        //                    upperParallelBranchFLActivity.UnExecute();
        //                    UnExecuteIFLControls(currentFLActivity, previousFLActivity);
        //                    list0.Remove(list1);
        //                }
        //            }
        //            // A ——>      ——> C(有问题)
        //            //         None
        //            // B ——>      ——> D
        //            else
        //            {
        //                List<object> list01 = (List<object>)o01;
        //                List<string> branches = new List<string>();
        //                if (list0.Count <= 1)
        //                {
        //                    foreach (object o1 in list01)
        //                    {
        //                        list1 = (List<object>)o1;
        //                        if (list1.Count > 0)
        //                        {
        //                            string previousFLActivityName = list1[list1.Count - 1].ToString();
        //                            FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);
        //                            nextFLActivities.Add(previousFLActivity);
        //                            branches.Add(previousFLActivity.UpperParallelBranch);
        //                            UnExecuteIFLControls(currentFLActivity, previousFLActivity);
        //                        }
        //                    }
        //                    // --------------------------------------------------------------------------------------------------
        //                    upperParallelBranchFLActivity.UnExecute();
        //                    upperParallelFLActivity.UnExecute();
        //                    FLActivity tempFLActivity = _rootFLActivity.GetFLActivityByName(((List<object>)list01[0])[0].ToString());
        //                    string upperParallel = tempFLActivity.UpperParallel;
        //                    FLActivity parallelFLActivity = _rootFLActivity.GetFLActivityByName(upperParallel);
        //                    foreach (string branch in branches)
        //                    {
        //                        ((IFLParallelActivity)parallelFLActivity).ExecutedBranches.Remove(branch);
        //                        ((IFLSequenceActivity)_rootFLActivity.GetFLActivityByName(branch)).SetFLDirection(FLDirection.Waiting);
        //                    }
        //                    // --------------------------------------------------------------------------------------------------
        //                    _flPathList.Remove(list0);
        //                }
        //                else
        //                {
        //                    foreach (object o1 in list01)
        //                    {
        //                        list1 = (List<object>)o1;
        //                        if (list1.Count > 0)
        //                        {
        //                            string previousFLActivityName = list1[list1.Count - 1].ToString();
        //                            FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);
        //                            UnExecuteIFLControls(currentFLActivity, previousFLActivity);
        //                        }
        //                    }
        //                    upperParallelBranchFLActivity.UnExecute();
        //                    list0.Remove(list1);
        //                }
        //            }
        //        }
        //    }
        //    _flflag = 'P';
        //}
        /// <summary>
        /// 取得上一Activity的集合
        /// </summary>
        /// <param name="currentFLActivity">当前Activity</param>
        /// <param name="nextFLActivities">下一Activity的集合</param>
        private void GetPreviousFLActivites(FLActivity currentFLActivity, List<FLActivity> nextFLActivities)
        {
            if (Version == "2.0")
            {
                var previousFLActivity = currentFLActivity.PreviousActivity;
                GetPreviousFLActivites2(currentFLActivity, previousFLActivity, nextFLActivities);
            }
            else
            {

                if (_p.Count <= 1)
                {
                    String message = SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLTools", "FLWebNavigator", "ReturnToEnd");
                    throw new FLException(message);
                    return;
                }

                ////同时要退回当前activity的上级
                //object current = _p[_p.Count - 1];
                //if (current is string)
                //{
                //    ReturnUpperParallel((string)current, currentFLActivity);
                //}
                //else
                //{
                //    List<object> list = (List<object>)current;
                //    foreach (object obj in list)
                //    {
                //        List<object> branch = obj as List<object>;
                //        foreach (object str in branch)
                //        {
                //            ReturnUpperParallel(str.ToString(), currentFLActivity);
                //        }
                //    }
                //}

                if (currentFLActivity.UpperParallel == string.Empty)
                {
                    object o0 = _p[_p.Count - 2];
                    // A ——> B ——> C
                    if (o0 is string)
                    {
                        FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(o0.ToString());

                        UnExecuteIFLControls(currentFLActivity, previousFLActivity);

                        _p.Remove(currentFLActivity.Name);

                        if (previousFLActivity is IEventWaiting)
                        {
                            nextFLActivities.Add(previousFLActivity);
                            //Hashtable table = _rootFLActivity.GetAllChildFLActivities();
                            //foreach (object key in table.Keys)
                            //{
                            //    object o3 = table[key];
                            //    if (o3 == null)
                            //    {
                            //        continue;
                            //    }

                            //    FLActivity temp2FLActivity = (FLActivity)o3;
                            //    if (temp2FLActivity is FLIfElseActivity)
                            //    {
                            //        ((FLIfElseActivity)temp2FLActivity).InitExecStatus();
                            //        foreach (FLActivity child in ((FLIfElseActivity)temp2FLActivity).ChildFLActivities)
                            //        {
                            //            child.InitExecStatus();
                            //        }
                            //    }
                            //}
                        }
                        else if (previousFLActivity is IFLProcedureActivity)
                        {
                            if (previousFLActivity is IFLProcedureActivity)
                            {
                                Logic.CallServerMethod(this, FLInstanceParms, this._keyValues, this._clientInfo, previousFLActivity as IFLProcedureActivity);
                            }
                            nextFLActivities.Add(previousFLActivity);

                            GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                        }
                        else
                        {
                            GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                        }
                    }
                    // B ——>
                    //         A
                    // C ——>
                    else
                    {
                        List<object> list01 = (List<object>)_p[_p.Count - 2];
                        List<string> branches = new List<string>();
                        foreach (object o1 in list01)
                        {
                            List<object> list1 = (List<object>)o1;
                            if (list1.Count > 0)
                            {
                                string previousFLActivityName = list1[list1.Count - 1].ToString();
                                FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);

                                branches.Add(previousFLActivity.UpperParallelBranch);

                                UnExecuteIFLControls(currentFLActivity, previousFLActivity);

                                if (previousFLActivity is IEventWaiting)
                                {
                                    nextFLActivities.Add(previousFLActivity);
                                }
                                else if (previousFLActivity is IFLProcedureActivity)
                                {
                                    if (previousFLActivity is IFLProcedureActivity)
                                    {
                                        Logic.CallServerMethod(this, FLInstanceParms, this._keyValues, this._clientInfo, previousFLActivity as IFLProcedureActivity);
                                    }
                                    nextFLActivities.Add(previousFLActivity);

                                    GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                                }
                                else
                                {
                                    GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                                }
                            }
                        }

                        FLActivity tempFLActivity = _rootFLActivity.GetFLActivityByName(((List<object>)list01[0])[0].ToString());
                        string upperParallel = tempFLActivity.UpperParallel;
                        FLActivity parallelFLActivity = _rootFLActivity.GetFLActivityByName(upperParallel);
                        foreach (string branch in branches)
                        {
                            ((IFLParallelActivity)parallelFLActivity).ExecutedBranches.Remove(branch);
                            ((IFLSequenceActivity)_rootFLActivity.GetFLActivityByName(branch)).SetFLDirection(FLDirection.Waiting);
                        }

                        _p.Remove(currentFLActivity.Name);
                    }
                }
                else
                {
                    List<object> list0 = _p[_p.Count - 1] is List<object> ? (List<object>)_p[_p.Count - 1] : (List<object>)_p[_p.Count - 2];
                    List<object> list1 = null;
                    foreach (object o0 in list0)
                    {
                        List<object> temp = (List<object>)o0;
                        if (temp.Exists(
                                     delegate(object s)
                                     {
                                         if (currentFLActivity.Name == s.ToString())
                                             return true;
                                         else
                                             return false;
                                     }
                            ))
                        {
                            list1 = temp;
                            break;
                        }
                    }

                    //   ——> B ——> D
                    // A
                    //   ——> C ——> E
                    if (list1.Count > 1)
                    {
                        FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(list1[list1.Count - 2].ToString());

                        UnExecuteIFLControls(currentFLActivity, previousFLActivity);

                        list1.Remove(currentFLActivity.Name);

                        if (previousFLActivity is IEventWaiting)
                        {
                            nextFLActivities.Add(previousFLActivity);
                        }
                        else if (previousFLActivity is IFLProcedureActivity)
                        {
                            if (previousFLActivity is IFLProcedureActivity)
                            {
                                Logic.CallServerMethod(this, FLInstanceParms, this._keyValues, this._clientInfo, previousFLActivity as IFLProcedureActivity);
                            }
                            nextFLActivities.Add(previousFLActivity);

                            GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                        }
                        else
                        {
                            GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                        }
                    }
                    else
                    {
                        FLActivity upperParallelFLActivity = _rootFLActivity.GetFLActivityByName(currentFLActivity.UpperParallel);
                        FLActivity upperParallelBranchFLActivity = _rootFLActivity.GetFLActivityByName(currentFLActivity.UpperParallelBranch);
                        foreach (FLActivity a in upperParallelFLActivity.ChildFLActivities)
                        {
                            FLDirection direction = ((IFLSequenceActivity)a).FLDirection;
                            if (a.Name != upperParallelBranchFLActivity.Name && direction != FLDirection.Waiting)
                            {
                                //有退回时不考虑其他的方向
                                //if (direction != _flDirection)
                                //{
                                //    String message = string.Format(SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLRuntime", "FLInstance", "DirectionError"), a.Name);
                                //    throw new FLException(2, message);
                                //}

                            }
                        }

                        ((IFLSequenceActivity)upperParallelBranchFLActivity).SetFLDirection(_flDirection);

                        object o01 = _p[_p.Count - 2];
                        //   ——> B
                        // A
                        //   ——> C
                        if (o01 is string)
                        {
                            FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(o01.ToString());
                            bool w = false;
                            if (upperParallelFLActivity.Description.Length == 0 || upperParallelFLActivity.Description.ToLower() == "and")
                            {
                                //w= true; 平行的直接退回
                                w = false;
                            }
                            if (upperParallelFLActivity.Description.ToLower().Trim().StartsWith("rate"))
                            {
                                string q = upperParallelFLActivity.Description.Trim();
                                string[] qq = q.Split(":".ToCharArray());
                                string p = qq[1].Trim();
                                decimal rate = decimal.Parse(p);
                                rate = rate / 100;

                                int c = upperParallelFLActivity.ChildFLActivities.Count;
                                decimal rate2 = new decimal((c - list0.Count + 1)) / c;
                                if (rate2 < rate)
                                {
                                    w = true;
                                }
                            }

                            if ((w) && list0.Count > 1)
                            {
                                upperParallelBranchFLActivity.InitExecStatus();

                                UnExecuteIFLControls(currentFLActivity, previousFLActivity);

                                list0.Remove(list1);

                                GetWL(list0, _wl);
                            }
                            else
                            {
                                //改了平行加签直接退回后,需要重置整个平行系统
                                ReturnUpperParallel(currentFLActivity.Name, previousFLActivity);
                                // upperParallelBranchFLActivity.InitExecStatus();
                                foreach (FLActivity a in upperParallelFLActivity.ChildFLActivities)
                                {
                                    a.InitExecStatus();
                                }
                                if (upperParallelFLActivity is FLTools.ComponentModel.FLParallelActivity)
                                {
                                    (upperParallelFLActivity as FLTools.ComponentModel.FLParallelActivity).ExecutedBranches.Clear(); //退回時重置這個屬性
                                }

                                upperParallelFLActivity.InitExecStatus();

                                UnExecuteIFLControls(currentFLActivity, previousFLActivity);

                                _p.Remove(list0);

                                if (previousFLActivity is IEventWaiting)
                                {
                                    nextFLActivities.Add(previousFLActivity);
                                }
                                else if (previousFLActivity is IFLProcedureActivity)
                                {
                                    if (previousFLActivity is IFLProcedureActivity)
                                    {
                                        Logic.CallServerMethod(this, FLInstanceParms, this._keyValues, this._clientInfo, previousFLActivity as IFLProcedureActivity);
                                    }
                                    nextFLActivities.Add(previousFLActivity);

                                    GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                                }
                                else
                                {

                                    GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                                }
                            }

                            //if (upperParallelFLActivity.Description.ToLower() != "and" || list0.Count <= 1)
                            //{
                            //    upperParallelBranchFLActivity.InitExecStatus();

                            //    upperParallelFLActivity.InitExecStatus();

                            //    UnExecuteIFLControls(currentFLActivity, previousFLActivity);

                            //    _flPathList.Remove(list0);

                            //    if (previousFLActivity is IEventWaiting)
                            //    {
                            //        nextFLActivities.Add(previousFLActivity);
                            //    }
                            //    else if (previousFLActivity is IFLProcedureActivity)
                            //    {
                            //        nextFLActivities.Add(previousFLActivity);

                            //        GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                            //    }
                            //    else
                            //    {

                            //        GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                            //    }
                            //}
                            //else
                            //{
                            //    upperParallelBranchFLActivity.InitExecStatus();

                            //    UnExecuteIFLControls(currentFLActivity, previousFLActivity);

                            //    list0.Remove(list1);
                            //}
                        }
                        // A ——>      ——> C(有问题)
                        //         None
                        // B ——>      ——> D
                        else
                        {
                            List<object> list01 = (List<object>)o01;
                            List<string> branches = new List<string>();

                            if (true)//直接退回
                            {
                                foreach (object o1 in list01)
                                {
                                    list1 = (List<object>)o1;
                                    if (list1.Count > 0)
                                    {
                                        string previousFLActivityName = list1[list1.Count - 1].ToString();
                                        FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);

                                        branches.Add(previousFLActivity.UpperParallelBranch);

                                        UnExecuteIFLControls(currentFLActivity, previousFLActivity);

                                        if (previousFLActivity is IEventWaiting)
                                        {
                                            nextFLActivities.Add(previousFLActivity);
                                        }
                                        else if (previousFLActivity is IFLProcedureActivity)
                                        {
                                            if (previousFLActivity is IFLProcedureActivity)
                                            {
                                                Logic.CallServerMethod(this, FLInstanceParms, this._keyValues, this._clientInfo, previousFLActivity as IFLProcedureActivity);
                                            }
                                            nextFLActivities.Add(previousFLActivity);

                                            GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                                        }
                                        else
                                        {
                                            GetPreviousFLActivites(previousFLActivity, nextFLActivities);
                                        }
                                    }
                                }

                                // --------------------------------------------------------------------------------------------------
                                upperParallelBranchFLActivity.InitExecStatus();

                                upperParallelFLActivity.InitExecStatus();

                                FLActivity tempFLActivity = _rootFLActivity.GetFLActivityByName(((List<object>)list01[0])[0].ToString());
                                string upperParallel = tempFLActivity.UpperParallel;

                                FLActivity parallelFLActivity = _rootFLActivity.GetFLActivityByName(upperParallel);
                                foreach (string branch in branches)
                                {
                                    ((IFLParallelActivity)parallelFLActivity).ExecutedBranches.Remove(branch);
                                    ((IFLSequenceActivity)_rootFLActivity.GetFLActivityByName(branch)).SetFLDirection(FLDirection.Waiting);
                                }
                                // --------------------------------------------------------------------------------------------------

                                _p.Remove(list0);
                            }
                            else
                            {
                                foreach (object o1 in list01)
                                {
                                    list1 = (List<object>)o1;
                                    if (list1.Count > 0)
                                    {
                                        string previousFLActivityName = list1[list1.Count - 1].ToString();
                                        FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);
                                        UnExecuteIFLControls(currentFLActivity, previousFLActivity);
                                    }
                                }

                                upperParallelBranchFLActivity.InitExecStatus();

                                list0.Remove(list1);
                            }
                        }
                    }
                }

                _flflag = 'P';
            }
        }
Exemple #27
0
 /// <summary>
 /// 取得是否支持多步退回
 /// </summary>
 /// <param name="nextFLActivity"></param>
 /// <returns></returns>
 public bool GetMultiStepReturn(FLActivity nextFLActivity)
 {
     if (Version == "2.0")
     {
         return true;
     }
     else
     {
         string upperParallel = nextFLActivity.UpperParallel;
         if (string.IsNullOrEmpty(upperParallel))
         {
             return true;
         }
         else
         {
             IFLParallelActivity parallel = (IFLParallelActivity)_rootFLActivity.GetFLActivityByName(upperParallel);
             if (string.IsNullOrEmpty(parallel.Description) || parallel.Description.ToLower() == "and")
             {
                 return false;
             }
             else
             {
                 return true;
             }
         }
     }
 }
Exemple #28
0
        /// <summary>
        /// 取得上一Activity的集合
        /// </summary>
        /// <param name="currentFLActivity">当前Activity</param>
        /// <param name="previousFLActivity2">上一Activity</param>
        /// <param name="nextFLActivities">下一Activity的集合</param>
        private void GetPreviousFLActivites2(FLActivity currentFLActivity, FLActivity previousFLActivity2, List<FLActivity> nextFLActivities)
        {
            if (Version == "2.0")
            {
                //比对2个activity的位置
                var availableActivity = GetAvailableActivity(previousFLActivity2, currentFLActivity);
                if (availableActivity == previousFLActivity2) //直接退回
                {
                    ReturnActivity(previousFLActivity2);
                    nextFLActivities.Add(previousFLActivity2);

                    LastActivity = availableActivity == null ? string.Empty : availableActivity.Name;
                }
                else
                {
                    //var currentParallelPath = string.Join("->", GetParallelPath(currentFLActivity));
                    foreach (var nextActivity in availableActivity.NextActivities) //退进平行的话(只有退回上一步才会), 退回到平行关卡的上一关
                    {
                        //var nextParallelPath = string.Join("->", GetParallelPath(nextActivity));
                        //if (nextParallelPath.Contains(currentParallelPath))
                        //{
                        ReturnActivity(nextActivity);
                        if (nextActivity is IEventWaiting)
                        {
                            nextFLActivities.Add(nextActivity);
                        }
                        //}
                    }
                    foreach (var executedActivity in availableActivity.ExecutedActivities)
                    {
                        if (executedActivity is FLParallelActivity)
                        {
                            (executedActivity as FLParallelActivity).ExecutedBranches.Clear(); //清除ExecutedBranches
                        }
                    }
                    LastActivity = availableActivity.Name;
                }
            }
            else
            {
                if (_p.Count <= 1)
                {
                    String message = SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(_clientInfo[0]))[0]), "FLTools", "FLWebNavigator", "ReturnToEnd");
                    throw new FLException(message);
                    return;
                }
                //同时要退回当前activity的上级
                object current = _p[_p.Count - 1];
                if (current is string)
                {
                    ReturnUpperParallel((string)current, previousFLActivity2);
                }
                else
                {
                    if (previousFLActivity2.UpperParallel != string.Empty && previousFLActivity2.UpperParallel == currentFLActivity.UpperParallel)
                    {
                        List<object> list = (List<object>)current;
                        // 特别的在平行签核同一边的退回
                        var path = GetParallelPath(previousFLActivity2.Name, currentFLActivity.Name, list);
                        if (path != null)
                        {
                            for (int i = path.Count - 1; i >= 0; i--)
                            {
                                var obj = path[i];
                                if (obj is string)
                                {
                                    var activity = _rootFLActivity.GetFLActivityByName(obj.ToString());
                                    if (activity != null)
                                    {
                                        if (obj.ToString() == previousFLActivity2.Name)
                                        {
                                            nextFLActivities.Add(activity);
                                            break;
                                        }
                                        else
                                        {
                                            activity.InitExecStatus();
                                        }
                                    }

                                }
                            }
                            return;
                        }
                    }
                    else
                    {
                        List<object> list = (List<object>)current;
                        foreach (object obj in list)
                        {
                            List<object> branch = obj as List<object>;
                            foreach (object str in branch)
                            {
                                ReturnUpperParallel(str.ToString(), previousFLActivity2);
                            }
                        }
                    }
                }
                object o0 = _p[_p.Count - 2];
                if (o0 is string)
                {
                    FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(o0.ToString());

                    UnExecuteIFLControls(currentFLActivity, previousFLActivity);

                    //当前步是会签时。这里会移除不掉
                    if (current is string)
                    {
                        _p.Remove(currentFLActivity.Name);
                    }
                    else
                    {
                        List<object> list = (List<object>)current;
                        foreach (object item in list)
                        {
                            if (item is string && item.Equals(currentFLActivity.Name))
                            {
                                _p.Remove(current);
                                break;
                            }
                            else
                            {
                                List<object> list1 = (List<object>)item;
                                if (list1.Contains(currentFLActivity.Name))
                                {
                                    _p.Remove(current);
                                    break;
                                }
                            }
                        }
                    }
                    if (previousFLActivity is IEventWaiting && previousFLActivity.Name.ToLower() == previousFLActivity2.Name.ToLower())
                    {
                        nextFLActivities.Add(previousFLActivity);

                        //Hashtable table = _rootFLActivity.GetAllChildFLActivities();
                        //foreach (object key in table.Keys)
                        //{
                        //    object o3 = table[key];
                        //    if (o3 == null)
                        //    {
                        //        continue;
                        //    }

                        //    FLActivity temp2FLActivity = (FLActivity)o3;
                        //    if (temp2FLActivity is FLIfElseActivity)
                        //    {
                        //        ((FLIfElseActivity)temp2FLActivity).InitExecStatus();
                        //        foreach (FLActivity child in ((FLIfElseActivity)temp2FLActivity).ChildFLActivities)
                        //        {
                        //            child.InitExecStatus();
                        //        }
                        //    }
                        //}
                    }
                    else
                    {
                        if (previousFLActivity is IEventWaiting && !string.IsNullOrEmpty(((IEventWaiting)previousFLActivity).SendToId))
                        {
                            FLNotifyActivity notifyActivity = new FLNotifyActivity();
                            notifyActivity.Name = "Notify_" + previousFLActivity.Name;
                            // -------------------------------------------------------------------
                            //notifyActivity.SendToField = ((IEventWaiting)previousFLActivity).SendToField;
                            //notifyActivity.SendToKind = ((IEventWaiting)previousFLActivity).SendToKind;
                            //notifyActivity.SendToRole = ((IEventWaiting)previousFLActivity).SendToRole;
                            notifyActivity.SendToKind = SendToKind.Role;
                            notifyActivity.SendToRole = ((IEventWaiting)previousFLActivity).SendToId;
                            // -------------------------------------------------------------------
                            notifyActivity.FormName = ((IEventWaiting)previousFLActivity).FormName;
                            notifyActivity.WebFormName = ((IEventWaiting)previousFLActivity).WebFormName;
                            notifyActivity.UrgentTime = (int)((IEventWaiting)previousFLActivity).UrgentTime;
                            notifyActivity.TimeUnit = ((IEventWaiting)previousFLActivity).TimeUnit;
                            notifyActivity.NavigatorMode = ((IEventWaiting)previousFLActivity).NavigatorMode;
                            notifyActivity.FLNavigatorMode = ((IEventWaiting)previousFLActivity).FLNavigatorMode;
                            notifyActivity.UserId = ((IEventWaitingExecute)previousFLActivity).UserId;
                            notifyActivity.RoleId = ((IEventWaitingExecute)previousFLActivity).RoleId;

                            nextFLActivities.Add(notifyActivity);
                        }
                        else if (previousFLActivity is IFLProcedureActivity)
                        {
                            if (previousFLActivity is IFLProcedureActivity)
                            {
                                Logic.CallServerMethod(this, FLInstanceParms, this._keyValues, this._clientInfo, previousFLActivity as IFLProcedureActivity);
                            }
                            nextFLActivities.Add(previousFLActivity);
                        }
                        GetPreviousFLActivites2(previousFLActivity, previousFLActivity2, nextFLActivities);
                    }
                }
                else
                {
                    List<object> list01 = (List<object>)_p[_p.Count - 2];
                    bool isDetailReturn = false;
                    List<string> branches = new List<string>();
                    foreach (object o1 in list01)
                    {
                        List<object> list1 = (List<object>)o1;
                        if (list1.Count > 0)
                        {
                            string previousFLActivityName = list1[list1.Count - 1].ToString();
                            FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);
                            if (previousFLActivity.Location == previousFLActivity2.Location)
                            {
                                isDetailReturn = true;
                                branches.Add(previousFLActivity.UpperParallelBranch);

                                UnExecuteIFLControls(currentFLActivity, previousFLActivity);

                                if (previousFLActivity is IEventWaiting)
                                {
                                    nextFLActivities.Add(previousFLActivity);
                                }
                            }
                        }
                    }

                    if (isDetailReturn)
                    {
                        FLActivity tempFLActivity = _rootFLActivity.GetFLActivityByName(((List<object>)list01[0])[0].ToString());
                        string upperParallel = tempFLActivity.UpperParallel;
                        FLActivity parallelFLActivity = _rootFLActivity.GetFLActivityByName(upperParallel);
                        foreach (string branch in branches)
                        {
                            ((IFLParallelActivity)parallelFLActivity).ExecutedBranches.Remove(branch);
                            ((IFLSequenceActivity)_rootFLActivity.GetFLActivityByName(branch)).SetFLDirection(FLDirection.Waiting);
                        }

                        _p.Remove(currentFLActivity.Name);
                    }
                    else
                    {
                        branches = new List<string>();
                        foreach (object o1 in list01)
                        {
                            List<object> list1 = (List<object>)o1;
                            if (list1.Count > 0)
                            {
                                string previousFLActivityName = list1[list1.Count - 1].ToString();
                                FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(previousFLActivityName);

                                branches.Add(previousFLActivity.UpperParallelBranch);
                            }
                        }

                        FLActivity temp1FLActivity = _rootFLActivity.GetFLActivityByName(((List<object>)list01[0])[0].ToString());
                        string upperParallel = temp1FLActivity.UpperParallel;
                        FLActivity parallelFLActivity = _rootFLActivity.GetFLActivityByName(upperParallel);
                        parallelFLActivity.InitExecStatus();
                        if (!string.IsNullOrEmpty(parallelFLActivity.Location))//退回时要初始化FlDetail
                        {
                            UnExecuteIFLControls(parallelFLActivity, previousFLActivity2);
                            //FLActivity detailActivity = _rootFLActivity.GetFLActivityByName(parallelFLActivity.Location);
                            //if (detailActivity != null)
                            //{
                            //    detailActivity.InitExecStatus();
                            //}
                        }
                        foreach (string branch in branches)
                        {
                            ((IFLParallelActivity)parallelFLActivity).ExecutedBranches.Remove(branch);
                            FLActivity previousFLActivity = _rootFLActivity.GetFLActivityByName(branch);
                            //_rootFLActivity.GetFLActivityByName(branch).InitExecStatus();//多步退回时触发procedure
                            previousFLActivity.InitExecStatus();
                            if (previousFLActivity is IFLProcedureActivity)
                            {
                                if (previousFLActivity is IFLProcedureActivity)
                                {
                                    Logic.CallServerMethod(this, FLInstanceParms, this._keyValues, this._clientInfo, previousFLActivity as IFLProcedureActivity);
                                }
                                nextFLActivities.Add(previousFLActivity);
                            }
                            ((IFLSequenceActivity)_rootFLActivity.GetFLActivityByName(branch)).SetFLDirection(FLDirection.Waiting);
                        }

                        //Hashtable table = _rootFLActivity.GetAllChildFLActivities();
                        //foreach (object key in table.Keys)
                        //{
                        //    object o3 = table[key];
                        //    if (o3 == null)
                        //    {
                        //        continue;
                        //    }

                        //    FLActivity temp2FLActivity = (FLActivity)o3;
                        //    if (temp2FLActivity is IEventWaiting)
                        //    {
                        //        ((IEventWaitingExecute)(temp2FLActivity)).InitExecStatus();
                        //    }
                        //    else if (temp2FLActivity is FLIfElseActivity)
                        //    {
                        //        ((FLIfElseActivity)temp2FLActivity).InitExecStatus();
                        //        foreach (FLActivity child in ((FLIfElseActivity)temp2FLActivity).ChildFLActivities)
                        //        {
                        //            child.InitExecStatus();
                        //        }
                        //    }
                        //}

                        _p.Remove(list01);
                        GetPreviousFLActivites2(currentFLActivity, previousFLActivity2, nextFLActivities);
                    }

                }

                _flflag = 'P';
            }
        }
Exemple #29
0
 private static List<string> GetDeletePaths(FLActivity activity)
 {
     var deletePaths = new List<string>();
     foreach (var nextActivity in activity.NextActivities)
     {
         deletePaths.Add(nextActivity.Name);
         deletePaths.AddRange(GetDeletePaths(nextActivity));
     }
     activity.NextActivities.Clear();
     return deletePaths;
 }
Exemple #30
0
        /// <summary>
        /// 发送Email
        /// </summary>
        /// <param name="flInstance">流程</param>
        /// <param name="flInstanceParms">流程参数</param>
        /// <param name="keyValues">宿主筛选条件</param>
        /// <param name="roleId">角色Id</param>
        /// <param name="flActivity">Activity</param>
        /// <param name="clientInfo">ClientInfo</param>
        public static void SendTo2(FLInstance flInstance, object[] flInstanceParms, object[] keyValues, string roleId, FLActivity flActivity, object[] clientInfo)
        {
            List<string> sendToes = new List<string>();

            string tableName = ((IFLRootActivity)flInstance.RootFLActivity).TableName;
            string flowDesc = ((IFLRootActivity)flInstance.RootFLActivity).Description;
            string sUserId = ((object[])clientInfo[0])[1].ToString();
            string sUserName = Global.GetUserName(sUserId, clientInfo);

            var setting = EmailSetting.LoadSetting(clientInfo);

            var active = setting.Activie;
            if (!active)
            {
                return;
            }

            var sendFrom = setting.SendFrom;
            var password = setting.Password;
            var smtp = setting.SMTP;
            var enableSSL = setting.EnableSSL;
            var port = setting.Port;

            if (!(flActivity is IEventWaiting) && !(flActivity is IFLNotifyActivity))
            {
                return;
            }

            bool sm = false;
            if (flActivity is IEventWaiting)
            {
                sm = ((IEventWaiting)flActivity).SendEmail;
            }
            else if (flActivity is IFLNotifyActivity)
            {
                sm = ((IFLNotifyActivity)flActivity).SendEmail;
            }

            if (sm)
            {
                FLActivity nextFLActivity = flActivity;
                int plusApprove = 0;
                if (nextFLActivity is IFLStandActivity)
                {
                    plusApprove = Convert.ToInt32(((IFLStandActivity)nextFLActivity).PlusApprove);
                }
                else if (nextFLActivity is IFLApproveActivity)
                {
                    plusApprove = Convert.ToInt32(((IFLApproveActivity)nextFLActivity).PlusApprove);
                }
                else if (nextFLActivity is IFLApproveBranchActivity)
                {
                    FLActivity approve = flInstance.RootFLActivity.GetFLActivityByName(((IFLApproveBranchActivity)nextFLActivity).ParentActivity);
                    plusApprove = Convert.ToInt32(((IFLApproveActivity)approve).PlusApprove);
                }

                string users = string.Empty;
                string email = string.Empty;
                List<string> roleIds = new List<string>();
                List<string> userIds = new List<string>();
                SendToKind sk = SendToKind.Applicate;
                string sr = string.Empty;
                string su = string.Empty;
                string sf = string.Empty;
                string fn = string.Empty;
                string wfn = string.Empty;
                NavigatorMode nm = NavigatorMode.Normal;
                FLNavigatorMode fnm = FLNavigatorMode.Notify;
                if (flActivity is IEventWaiting)
                {
                    sk = ((IEventWaiting)flActivity).SendToKind;
                    sr = ((IEventWaiting)flActivity).SendToRole;
                    su = ((IEventWaiting)flActivity).SendToUser;
                    sf = ((IEventWaiting)flActivity).SendToField;
                    wfn = string.IsNullOrEmpty(((IEventWaiting)flActivity).WebFormName)
                        ? ((IFLRootActivity)flInstance.RootFLActivity).WebFormName
                        : ((IEventWaiting)flActivity).WebFormName;
                    nm = ((IEventWaiting)flActivity).NavigatorMode;
                    fnm = ((IEventWaiting)flActivity).FLNavigatorMode;
                }
                else if (flActivity is IFLNotifyActivity)
                {
                    sk = ((IFLNotifyActivity)flActivity).SendToKind;
                    sr = ((IFLNotifyActivity)flActivity).SendToRole;
                    su = ((IFLNotifyActivity)flActivity).SendToUser;
                    sf = ((IFLNotifyActivity)flActivity).SendToField;
                    wfn = string.IsNullOrEmpty(((IFLNotifyActivity)flActivity).WebFormName)
                                 ? ((IFLRootActivity)flInstance.RootFLActivity).WebFormName
                                 : ((IFLNotifyActivity)flActivity).WebFormName;
                    nm = ((IFLNotifyActivity)flActivity).NavigatorMode;
                    fnm = ((IFLNotifyActivity)flActivity).FLNavigatorMode;
                }
                //ccm   2012/11/07-------------------------------------------------------------------------------------------------------------------------------------
                if (flInstance.IsPlusApprove)
                {
                    string q = flInstanceParms[8].ToString();
                    string[] qq = q.Split(";".ToCharArray());
                    foreach (string r in qq)
                    {
                        if (!string.IsNullOrEmpty(r))
                        {
                            if (r.StartsWith("U:"))
                            {
                                userIds.Add(r.Substring(2));
                            }
                            else
                            {
                                roleIds.Add(r);
                            }
                        }
                    }
                }
                //-------------------------------------------------------------------------------------------------------------------------------------
                else if (sk == SendToKind.Applicate)
                {
                    userIds.Add(flInstance.Creator);
                }
                else
                {
                    string orgKind = ((IFLRootActivity)flInstance.RootFLActivity).OrgKind;
                    if (sk == SendToKind.Role)
                    {
                        string q = sr;
                        string[] qq = q.Split(";".ToCharArray());

                        //roleId = qq[0].Trim();
                        roleIds.Add(qq[0].Trim());
                    }
                    else if (sk == SendToKind.ApplicateManager)
                    {
                        if (!string.IsNullOrEmpty(flInstance.CreateRole))
                        {
                            //roleId = Global.GetManagerRoleId(flInstance.CreateRole, orgKind, clientInfo);
                            roleIds.Add(Global.GetManagerRoleId(flInstance.R, orgKind, clientInfo));
                        }
                        else
                        {
                            if (!string.IsNullOrEmpty(flInstance.CreateRole))
                            {
                                roleIds.Add(Global.GetManagerRoleId(flInstance.CreateRole, orgKind, clientInfo));
                            }
                            else
                            {
                                List<string> roles = Global.GetRoleIdsByUserId(flInstance.Creator, clientInfo);
                                if (roles.Count > 0)
                                {
                                    roleIds.Add(Global.GetManagerRoleId(roles[0], orgKind, clientInfo));
                                }
                            }
                        }
                    }
                    else if (sk == SendToKind.Manager)
                    {
                        if (flInstance.FLDirection == FLDirection.GoToBack)
                        {
                            // roleId = ((IEventWaitingExecute)nextFLActivity).RoleId;
                            roleIds.Add(((IEventWaitingExecute)nextFLActivity).RoleId);
                        }
                        else
                        {
                            if (string.IsNullOrEmpty(flInstance.R))
                            {
                                // roleId = Global.GetManagerRoleId(flInstanceParms[5].ToString(), orgKind, clientInfo);
                                roleIds.Add(Global.GetManagerRoleId(flInstanceParms[5].ToString(), orgKind, clientInfo));
                            }
                            else
                            {
                                roleIds.Add(Global.GetManagerRoleId(flInstance.R, orgKind, clientInfo));
                            }
                        }
                    }
                    else if (sk == SendToKind.RefRole)
                    {
                        if (nextFLActivity is FLStandActivity && ((ISupportFLDetailsActivity)nextFLActivity).SendToId2 != string.Empty)
                        {
                            // roleId = ((ISupportFLDetailsActivity)nextFLActivity).SendToId2;
                            roleIds.Add(((ISupportFLDetailsActivity)nextFLActivity).SendToId2);
                        }
                        else
                        {
                            // roleId = Global.GetRoleIdByRefRole(sf, tableName, keyValues[1].ToString(), clientInfo);
                            roleIds.Add(Global.GetRoleIdByRefRole(flInstance, sf, tableName, keyValues[1].ToString(), clientInfo));
                        }
                    }
                    else if (sk == SendToKind.RefManager)
                    {
                        if (flInstance.FLDirection == FLDirection.GoToBack)
                        {
                            // roleId = ((IEventWaitingExecute)nextFLActivity).RoleId;
                            roleIds.Add(((IEventWaitingExecute)nextFLActivity).RoleId);
                        }
                        else
                        {
                            if (nextFLActivity is IFLApproveBranchActivity && !string.IsNullOrEmpty(flInstance.R))
                            {
                                // roleId = Global.GetManagerRoleId(flInstanceParms[5].ToString(), orgKind, clientInfo);
                                roleIds.Add(Global.GetManagerRoleId(flInstance.R, orgKind, clientInfo));
                            }
                            else
                            {
                                string sendToField = sf;
                                string values = keyValues[1].ToString();

                                string s = Global.GetRoleIdByRefRole(flInstance, sendToField, tableName, values, clientInfo);
                                // roleId = Global.GetManagerRoleId(s.ToString(), orgKind, clientInfo);
                                roleIds.Add(Global.GetManagerRoleId(s.ToString(), orgKind, clientInfo));
                            }
                        }
                    }
                    else if (sk == SendToKind.RefUser)
                    {
                        string id = Global.GetRoleIdByRefRole(flInstance, sf, tableName, keyValues[1].ToString(), clientInfo, true);

                        if (!string.IsNullOrEmpty(id))
                        {
                            string[] listusers = id.Split(';');
                            foreach (string user in listusers)
                            {
                                if (user.Trim().Length > 0)
                                {
                                    userIds.Add(user);
                                }
                            }
                        }
                    }
                    else if (sk == SendToKind.User)
                    {
                        string[] listusers = su.Split(';');
                        foreach (string user in listusers)
                        {
                            if (user.Trim().Length > 0)
                            {
                                userIds.Add(user);
                            }
                        }
                    }
                    else
                    {
                        //roleId = flInstanceParms[5].ToString();
                        roleIds.Add(flInstanceParms[5].ToString());
                    }
                }
                List<string> tempIds = new List<string>();
                foreach (string r in roleIds)
                {
                    string[] rr = r.Split(":".ToCharArray());
                    if (rr.Length > 1)
                    {
                        tempIds.Add(rr[1]);
                    }

                    List<string> userofrole = Global.GetUsersIdsByRoleId(r, clientInfo);
                    if (userofrole.Count > 0)
                    {
                        string agent = Global.GetAgent(r, userofrole[0], flInstance.RootFLActivity.Description, clientInfo);
                        if (!string.IsNullOrEmpty(agent))
                        {
                            object parAgent = Global.GetPARAGENT(flInstance.RootFLActivity.Description, agent, clientInfo);
                            if (parAgent != null && Convert.ToBoolean(parAgent))
                            {
                                tempIds.AddRange(userofrole);
                            }
                            tempIds.Add(agent);
                        }
                        else
                        {
                            tempIds.AddRange(userofrole);
                        }
                    }
                }
                foreach (string u in tempIds)
                {
                    if (userIds.Contains(u))
                        continue;

                    userIds.Add(u);
                }
                Dictionary<string, string> userEmails = new Dictionary<string, string>();
                foreach (string userId in userIds)
                {
                    if (users.Length != 0)
                    {
                        users += ",";
                    }
                    users += userId;

                    email = Global.GetUserEmail(userId, clientInfo);
                    if (email != null && email != string.Empty)
                    {
                        AddEmail(sendToes, email);
                        userEmails[userId] = email;
                    }
                }

                if (sendToes.Count == 0)
                {
                    return;
                }

                string body = string.Empty;

                if(setting.BodyActivityDescription)
                {
                    body += "<span>" + nextFLActivity.Description + "</span>";
                }

                body += "<TABLE BORDER=1>";

                if (setting.BodySender)
                {
                    body += "<TR>";
                    body += "<TD WIDTH=150>";
                    body += SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(clientInfo[0]))[0]), "FLRuntime", "InstanceManager", _sender);
                    body += "</TD>";
                    body += "<TD  COLSPAN=7>";
                    body += string.Format("[{0}]{1}", sUserId, sUserName);
                    body += "</TD>";
                    body += "</TR>";
                }

                if (setting.BodyFlowName)
                {
                    body += "<TR>";
                    body += "<TD>";
                    body += SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(clientInfo[0]))[0]), "FLRuntime", "InstanceManager", _flowName);
                    body += "</TD>";
                    body += "<TD  COLSPAN=7>";
                    body += string.IsNullOrEmpty(flowDesc) ? "&nbsp;" : flowDesc;
                    body += "</TD>";
                    body += "</TR>";
                }

                if (setting.BodyActivityName)
                {
                    body += "<TR>";
                    body += "<TD>";
                    body += SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(clientInfo[0]))[0]), "FLRuntime", "InstanceManager", _activityName);
                    body += "</TD>";
                    body += "<TD  COLSPAN=7>";
                    body += nextFLActivity.Name;
                    body += "</TD>";
                    body += "</TR>";
                }

                string presenationCT = null;
                if (setting.BodyContent)
                {
                    string presentFields = ((IFLRootActivity)flInstance.RootFLActivity).PresentFields;
                    string keys = keyValues[0].ToString();
                    string presenation = keyValues[1].ToString();
                    presenationCT = Global.GetFormPresentCT(flInstance, keys, presenation, presentFields, clientInfo);

                    body += GetPresentation(presenationCT);
                    body += GetBodyHtml(flInstance, keyValues, clientInfo);
                }

                if (setting.BodyDescription)
                {
                    string remark = flInstanceParms[4].ToString();
                    //意見內容有換行會報錯
                    remark = InitRemark(remark);
                    body += "<TR>";
                    body += "<TD>";
                    body += SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(clientInfo[0]))[0]), "FLRuntime", "InstanceManager", _description);
                    body += "</TD>";
                    body += "<TD  COLSPAN=7>";
                    body += string.IsNullOrEmpty(remark) ? "&nbsp;" : remark;
                    body += "</TD>";
                    body += "</TR>";
                }

                if (setting.BodyDatetime)
                {
                    body += "<TR>";
                    body += "<TD>";
                    body += SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(clientInfo[0]))[0]), "FLRuntime", "InstanceManager", _dateTime);
                    body += "</TD>";
                    body += "<TD  COLSPAN=7>";
                    body += DateTime.Now.ToString();
                    body += "</TD>";
                    body += "</TR>";
                }

                if (setting.BodyHyperlink)
                {
                    string webUrl = flInstance.GetWebUrl();
                    if (webUrl != null && webUrl != "0" && !string.IsNullOrEmpty(wfn))
                    {
                        if (webUrl.IndexOf("/MainPage_Flow.aspx") > 0)
                        {
                            //在下面替换
                        }
                        else
                        {
                            List<object> objs = new List<object>();
                            if (wfn.IndexOf(".web", StringComparison.OrdinalIgnoreCase) == 0 && wfn.Length > 4)
                            {
                                wfn = wfn.Substring(4);
                            }
                            string[] webFormNames = wfn.Split('.');
                            if (webFormNames.Length >= 2)
                            {
                                objs.Add(HttpUtility.UrlEncode(webFormNames[0]));
                                objs.Add(HttpUtility.UrlEncode(webFormNames[1]) + ".aspx");
                                objs.Add(HttpUtility.UrlEncode(flInstance.FLInstanceId.ToString()));
                                objs.Add(HttpUtility.UrlEncode((flInstance.CurrentFLActivity == null ? string.Empty : flInstance.CurrentFLActivity.Name) + ";" + nextFLActivity.Name));
                                objs.Add(HttpUtility.UrlEncode(keyValues[1].ToString()));
                                objs.Add(HttpUtility.UrlEncode(((int)nm).ToString()));
                                objs.Add(HttpUtility.UrlEncode(((int)fnm).ToString()));
                                objs.Add(HttpUtility.UrlEncode(users));
                                objs.Add(plusApprove);
                                objs.Add(plusApprove == 1 ? "A" : "");
                                objs.Add(roleId);
                                objs.Add(GetMultiStepReturn(flInstance, nextFLActivity) ? "1" : "0");
                                objs.Add(flInstanceParms.Length >= 10 ? HttpUtility.UrlEncode(flInstanceParms[9].ToString()) : string.Empty);

                                if (webUrl != null && webUrl != string.Empty)
                                {
                                    webUrl = string.Format(webUrl, objs.ToArray());

                                    if (setting.AutoLogin)
                                    {
                                        webUrl += "&AutoLogin=true";
                                    }
                                }
                            }
                        }

                        body += "<TR>";
                        body += "<TD>";
                        body += SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(clientInfo[0]))[0]), "FLRuntime", "InstanceManager", _hyperLink);
                        body += "</TD>";
                        body += "<TD  COLSPAN=7>";
                        body += "<a href='" + webUrl + "' target='_blank'>" + SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(clientInfo[0]))[0]), "FLRuntime", "InstanceManager", _hyperLink2) + "</a>";
                        body += "</TD>";
                        body += "</TR>";
                    }
                }

                if (setting.BodyComment)
                {
                    body += GetComments(flInstance.FLInstanceId.ToString(), clientInfo);
                }

                body += "</TABLE>";

                //---------------------------------------------------------------

                string subject = SysMsg.GetSystemMessage((SYS_LANGUAGE)(((object[])(clientInfo[0]))[0]), "FLRuntime", "InstanceManager", _overTime);

                if (setting.SubjectFlowName)
                {
                    subject += flowDesc + "-";
                }

                if (setting.SubjectActivityName)
                {
                    subject += nextFLActivity.Name;
                }

                if (setting.SubjectDescription)
                {
                    string remark = flInstanceParms[4].ToString();
                    //意見內容有換行會報錯
                    remark = remark.Replace("\r\n", " ");
                    if (subject.Length != 0)
                    {
                        subject += ",";
                    }

                    subject += remark;
                }

                if (setting.SubjectSender)
                {
                    if (subject.Length != 0)
                    {
                        subject += ",";
                    }

                    subject += sUserId;
                    subject += "(" + sUserName + ")";
                }

                if (setting.SubjectContent)
                {
                    if (subject.Length != 0)
                    {
                        subject += ",";
                    }
                    if (string.IsNullOrEmpty(presenationCT))
                    {
                        string presentFields = ((IFLRootActivity)flInstance.RootFLActivity).PresentFields;
                        string keys = keyValues[0].ToString();
                        string presenation = keyValues[1].ToString();
                        presenationCT = Global.GetFormPresentCT(flInstance, keys, presenation, presentFields, clientInfo);
                    }
                    subject += presenationCT;
                }

                if (subject.Length == 0 && body.Length == 0)
                {
                    return;
                }

                foreach (var userEmail in userEmails)
                {
                    var client = CreateSmtpClient(smtp, sendFrom, password, enableSSL, port);

                    MailMessage message = new MailMessage();
                    message.SubjectEncoding = Encoding.UTF8;
                    message.Priority = MailPriority.High;
                    message.BodyEncoding = Encoding.UTF8;
                    message.From = new MailAddress(sendFrom, "Workflow", System.Text.Encoding.UTF8);
                    message.To.Add(new MailAddress(userEmail.Value, userEmail.Value, Encoding.UTF8));
                    message.IsBodyHtml = true;
                    message.Subject = subject;
                    if (nextFLActivity is IEventWaiting)
                    {
                        message.Body = body.Replace("href='" + flInstance.GetWebUrl() + "'", GetUrl(flInstance, clientInfo, userEmail.Key, nextFLActivity as IEventWaiting, fnm))
                            + GetButtons(flInstance, clientInfo, setting, userEmail.Key, nextFLActivity as IEventWaiting);
                    }
                    else
                    {
                        message.Body = body.Replace("href='" + flInstance.GetWebUrl() + "'", GetUrl(flInstance, clientInfo, userEmail.Key, nextFLActivity as IFLBaseActivity, fnm));
                    }
                    //_message = message;

                    Thread thread = new Thread(new ParameterizedThreadStart(SendMail));
                    DateTime d1 = DateTime.Now;
                    thread.Start(new object[] { client, message });
                    DateTime d2 = DateTime.Now;
                    Thread.Sleep(200);
                }
            }
        }