/// <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()); }
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; } } } }
/// <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(); }
/// <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); } }
/// <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(); } } } }
/// <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; //} }
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; } } }
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; }
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 } } } }
// 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="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()); }
/// <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; } }
/// <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()); }
/// <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; } }
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; }
/// <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; } }
private List<FLActivity> GetExecutedActivities(FLActivity activity) { return GetExecutedActivities(activity, null); }
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; }
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; }
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); } } } }
/// <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 } }
/* // 此方法支持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); } }
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; } }
/// <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()); }
//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'; } }
/// <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; } } } }
/// <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'; } }
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; }
/// <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) ? " " : 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) ? " " : 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); } } }