public FLSequenceActivity() { _flDirection = FLDirection.Waiting; }
public void SetFLDirection(FLDirection flDirection) { _flDirection = flDirection; }
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; } } }
/// <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()); }
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; }
// --------------------------------------------------------------------------- /// <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()); }
// 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"; }
/// <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()); }
/// <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; } }