Пример #1
0
 public FLSequenceActivity()
 {
     _flDirection = FLDirection.Waiting;
 }
Пример #2
0
 public void SetFLDirection(FLDirection flDirection)
 {
     _flDirection = flDirection;
 }
Пример #3
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;
                }
            }
        }
Пример #4
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());
        }
Пример #5
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;
        }
Пример #6
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());
        }
Пример #7
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";
        }
Пример #8
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());
        }
Пример #9
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;
            }
        }