/// <summary> /// 转签或者加签 /// </summary> /// <param name="InstanceStepExecutorId"></param> /// <param name="list"></param> /// <param name="ExecuteComment"></param> /// <param name="ExecuteResult"></param> /// <param name="p"></param> public void TransferOrAdditional(string InstanceStepExecutorId, List <VM_WF_M_USER> list, string ExecuteComment, string ExecuteResult, string currentUser) { WFInstance Instance; WFInstanceStep InstanceStep; WF_M_STEP Step; WF_T_INSTANCESTEPEXECUTOR InstanceStepExecutor; InstanceStepExecutorDAO.GetAllInfo(InstanceStepExecutorId, out InstanceStepExecutor, out InstanceStep, out Instance, out Step); ExecuteComment = string.Format("{0}\r\n{1}", ExecuteComment, InstanceStepExecutor.ExecuteComment); var engine = NinjectHelper.Get <IEngine>(); if (engine == null) { throw new WFException("找不到 IEngine".GetRes()); } var memo = string.Format("{0}{1}给{2}", currentUser, ExecuteResult, string.Join(",", list.Select(a => a.UserName))); // 加签或者转签 for (int i = 0; i < list.Count; i++) { var user = list[i]; var listInstanceStepExecutorIds = ExecutorImp.InsertOneAndProxy(InstanceStep.InstanceStepId, user.UserId, user.UserName , memo, currentUser, true); SaveAdditionalApproveInfo(listInstanceStepExecutorIds, ExecuteResult, InstanceStepExecutor.InstanceStepExecutorId, user.UserName); } if (ExecuteResult == "加签" && string.IsNullOrWhiteSpace(InstanceStep.Extend04)) { WFDA.Instance.UpdateInstanceStepExt(InstanceStep.InstanceStepId, "Extend04", InstanceStepExecutorId, currentUser); } // 结束当前我自己的任务 SetFinished(InstanceStepExecutorId, ExecuteResult, ExecuteComment, memo, currentUser); }
public List <WFItem> GetRejectOrRollbackSteps(string InstanceStepExecutorId) { WFInstance Instance; WFInstanceStep InstanceStep; WF_M_STEP Step; WF_T_INSTANCESTEPEXECUTOR InstanceStepExecutor; InstanceStepExecutorDAO.GetAllInfo(InstanceStepExecutorId, out InstanceStepExecutor, out InstanceStep, out Instance, out Step); if (IsHideNextStep(InstanceStepExecutor.InstanceStepId)) { return(new List <WFItem>()); } // 查找之前走过的节点 var listFromStepIds = new List <string>(); var InstanceConnectors = WFDA.Instance.GetInstanceConnectorByTo(InstanceStep.InstanceId, InstanceStep.InstanceStepId); // 根据节点运行时连线记录,“到节点”查找所有的之前走过的节点 GetFromSteps(listFromStepIds, InstanceConnectors); List <WFItem> list = new List <WFItem>(); using (var db = Pub.DB) { list = WFDA.Instance.GetSteps(Step.ModelId).Where(a => listFromStepIds.Contains(a.StepId) && a.StepType != "Start" && a.StepId != InstanceStepExecutor.StepId) .Select(a => new WFItem() { text = a.StepName, value = a.StepId }).ToList(); } return(list); }
/// <summary> /// 继续执行工作流 /// </summary> /// <param name="entity"></param> /// <param name="user"></param> /// <param name="ExecuteResult"></param> /// <param name="ExecuteComment"></param> /// <param name="Memo"></param> public void LabData_ContinueDBWF(string InstanceStepExecutorId, string ToStepId, string ExecuteResult, string ExecuteComment, string Memo, string currentUserId, string currentUserName, bool continueWF) { var InstanceStepExecutor = InstanceStepExecutorDAO.Get(InstanceStepExecutorId); var InstanceStep = WFDA.Instance.GetInstanceStep(InstanceStepExecutor.InstanceStepId); var Instance = WFDA.Instance.GetInstance(InstanceStepExecutor.InstanceId); // 更新 InstanceStepExecutor 的 Extend01 字段,让工作流进行流转 var toStep = WFDA.Instance.GetStep(ToStepId); SetFinished(InstanceStepExecutorId, ExecuteResult, ExecuteComment, Memo, currentUserName); WFDA.Instance.UpdateInstanceStepExt(InstanceStep.InstanceStepId, "Extend01", toStep.StepId, currentUserName); WFDA.Instance.UpdateInstanceStepExt(InstanceStep.InstanceStepId, "Extend02", toStep.StepName, currentUserName); if (continueWF) { var engine = NinjectHelper.Get <IEngine>(); if (engine == null) { throw new Exception("找不到 IEngine".GetRes()); } // 继续工作流 engine.ContinueDBWF(Instance.ModelId, Instance.InstanceId, InstanceStep.InstanceStepId, true, currentUserId, currentUserName); } }
public List <WFItem> GetSubmitOrApproveSteps(string InstanceStepExecutorId) { WFInstance Instance; WFInstanceStep InstanceStep; WF_M_STEP Step; WF_T_INSTANCESTEPEXECUTOR InstanceStepExecutor; InstanceStepExecutorDAO.GetAllInfo(InstanceStepExecutorId, out InstanceStepExecutor, out InstanceStep, out Instance, out Step); if (IsHideNextStep(InstanceStepExecutor.InstanceStepId)) { return(new List <WFItem>()); } // 得到 sql 语句 var instance = WFDA.Instance.GetInstance(InstanceStep.InstanceId); var data1 = WFBusinessData.AddPrefix("WF_T_INSTANCE_", WFBusinessData.CreateInstance <WF_T_INSTANCE>(instance)); var data2 = WFBusinessData.AddPrefix("WF_T_INSTANCESTEP_", WFBusinessData.CreateInstance <WF_T_INSTANCESTEP>(InstanceStep)); var data3 = WFBusinessData.AddPrefix("WF_T_INSTANCESTEPEXECUTOR_", WFBusinessData.CreateInstance <WF_T_INSTANCESTEPEXECUTOR>(InstanceStepExecutor)); WFBusinessData.Merge(data2, data1); WFBusinessData.Merge(data3, data1); var businessData = data1; var sql = Pub.GetOriginalSql(Step.Script); return(GetWFItems(instance, businessData, ref sql)); }
/// <summary> /// 更新来源,方便在加签的用户操作后通知原来的用户 /// </summary> /// <param name="listNewExecutors"></param> /// <param name="Extend01"></param> /// <param name="Extend02"></param> /// <param name="user"></param> private void SaveAdditionalApproveInfo(List <string> listNewExecutors, string Extend01, string Extend02, string user) { foreach (var item in listNewExecutors) { InstanceStepExecutorDAO.UpdateInstanceStepExecutorExt(item, "Extend01", Extend01, user); InstanceStepExecutorDAO.UpdateInstanceStepExecutorExt(item, "Extend02", Extend02, user); } }
public override void SetAccess(FormM form, DFDictionary entity) { var page = ((this.Parent as ucForm).Page as DFIndexWF); var list = InstanceStepExecutorDAO.QueryUnfinishedByInstanceId(entity["InstanceId"]); if (list.Count == 0) { form.GetControlM("btnRemind").Remove(); } // 1 保存 2 提交 3 同意 4 不同意 5 回退 6 转签 7 加签 var result = GetAccess(form, entity); if ((result & 1) <= 0) { form.GetControlM("btnSave").Remove(); if (page != null) { page.UcForm1.Form.GetControlMs_Like("btnEdit").ForEach(a => a.Remove()); page.UcForm1.Form.GetControlMs_Like("btnUpdate").ForEach(a => a.Remove()); page.UcForm1.Form.GetControlMs_Like("btnDelete").ForEach(a => a.Remove()); page.UcForm1.Form.GetControlMs_Like("btnAdd").ForEach(a => a.Remove()); page.UcForm1.Form.GetControlMs_Like("btnUpload").ForEach(a => a.Remove()); } } if ((result & 2) <= 0) { form.GetControlM("btnSubmit").Remove(); } if ((result & 4) <= 0) { form.GetControlM("btnApprove").Remove(); } if ((result & 8) <= 0) { form.GetControlM("btnReject").Remove(); } if ((result & 16) <= 0) { form.GetControlM("btnRollback").Remove(); } if ((result & 32) <= 0) { form.GetControlM("btnTransferApprove").Remove(); } if ((result & 64) <= 0) { form.GetControlM("btnAdditionalApprove").Remove(); } base.SetAccess(form, entity); }
public DataGridVM Remind(DFDictionary dict) { ArgumentCheck.CheckMustInput(dict, "InstanceId"); var user = Util.GetCurrentUser(); var list = InstanceStepExecutorDAO.QueryUnfinishedByInstanceId(dict["InstanceId"]); foreach (var item in list) { ExecutorImp.SendMessage(item.InstanceStepExecutorId, user.UserName); } return(new DataGridVM() { data = "催签成功!".GetRes() }); }
public void Goto(string InstanceStepExecutorId, string ExecuteComment, string ExecuteResult, string ToStepId, string CurrentUserId, string CurrentUserName) { var InstanceStepExecutor = InstanceStepExecutorDAO.Get(InstanceStepExecutorId); if (InstanceStepExecutor.ExecuteStatus == Pub.Finished) { throw new WFException("该签核任务已经完成"); } // 更新当前任务已经完成 SetFinished(InstanceStepExecutorId, ExecuteResult, ExecuteComment, CurrentUserName); BackToAdditionalSource(InstanceStepExecutor.InstanceStepId, CurrentUserName); if (!string.IsNullOrWhiteSpace(ToStepId)) { GotoStep(InstanceStepExecutorId, ToStepId, CurrentUserId, CurrentUserName); } }
/// <summary> /// 尝试某个运行时节点的下面的步骤 /// </summary> /// <param name="InstanceStepId"></param> /// <returns></returns> private List <WFItem> TryGetNextSteps(string InstanceStepExecutorId) { var InstanceStepExecutor = InstanceStepExecutorDAO.Get(InstanceStepExecutorId); var InstanceStep = WFDA.Instance.GetInstanceStep(InstanceStepExecutor.InstanceStepId); var instance = WFDA.Instance.GetInstance(InstanceStep.InstanceId); var data1 = WFBusinessData.AddPrefix("WF_T_INSTANCE_", WFBusinessData.CreateInstance <WF_T_INSTANCE>(instance)); var data2 = WFBusinessData.AddPrefix("WF_T_INSTANCESTEP_", WFBusinessData.CreateInstance <WF_T_INSTANCESTEP>(InstanceStep)); var data3 = WFBusinessData.AddPrefix("WF_T_INSTANCESTEPEXECUTOR_", WFBusinessData.CreateInstance <WF_T_INSTANCESTEPEXECUTOR>(InstanceStepExecutor)); WFBusinessData.Merge(data2, data1); WFBusinessData.Merge(data3, data1); var businessData = data1; var Step = WFDA.Instance.GetStep(InstanceStep.StepId); var sql = Pub.GetOriginalSql(Step.Script); return(GetWFItems(instance, businessData, ref sql)); }
/// <summary> /// 如果有加签人,就返回到加签人,如果没有加签人,直接忽略 /// </summary> /// <param name="InstanceStepId"></param> /// <param name="currentUser"></param> private void BackToAdditionalSource(string InstanceStepId, string currentUser) { var instanceStep = WFDA.Instance.GetInstanceStep(InstanceStepId); if (!string.IsNullOrWhiteSpace(instanceStep.Extend04)) { var item = InstanceStepExecutorDAO.Get(instanceStep.Extend04); if (item != null) { var list = InstanceStepExecutorDAO.QueryByExecuteStatus(InstanceStepId, Pub.Unfinished); list.ForEach(a => a.Extend01 = string.Format("{0}", a.Extend01)); if (!list.Any(a => a.Extend01.Contains("签"))) { // 转签加签都完成了 ExecutorImp.InsertOneAndProxy(InstanceStepId, item.ExecutorId, item.ExecutorName, string.Empty, currentUser, true); // 需要返回到加签的来源人 WFDA.Instance.UpdateInstanceStepExt(InstanceStepId, "Extend04", null, currentUser); } } } }
public override void SetAccess(FormM form, DFDictionary entity) { var InstanceStepExecutorId = entity["InstanceStepExecutorId"]; var actionName = DFPub.UrlDecode(entity["actionName"]); var action = entity["action"]; if (string.IsNullOrWhiteSpace(InstanceStepExecutorId)) { throw new WFException("缺少参数 InstanceStepExecutorId"); } //form.GetControlM("NextStep").Text = actionName; var InstanceStepExecutor = InstanceStepExecutorDAO.Get(InstanceStepExecutorId); if (new StateEngineHelper().IsHideNextStep(InstanceStepExecutor.InstanceStepId)) { // 加签不影响流程走向,所以要隐藏下一步 form.GetControlM("NextStep").Visible = false; } else { if (action == "btnSubmit" || action == "btnApprove") { var list = new StateEngineHelper().GetSubmitOrApproveSteps(InstanceStepExecutorId); base.SetSelectDataSource(form, "NextStep", list.Select(a => new DFSelectItem() { Text = a.text, Value = a.value }).ToList()); } else if (action == "btnRollback" || action == "btnReject") { var list = new StateEngineHelper().GetRejectOrRollbackSteps(InstanceStepExecutorId); base.SetSelectDataSource(form, "NextStep", list.Select(a => new DFSelectItem() { Text = a.text, Value = a.value }).ToList()); } } base.SetAccess(form, entity); }
/// <summary> /// 是否隐藏下一步 /// 不管是加签还是转签,加签的用户和转签的用户都要签核完成 /// </summary> /// <param name="InstanceStepId"></param> /// <returns></returns> public bool IsHideNextStep(string InstanceStepId) { var extend04 = WFDA.Instance.GetInstanceStep(InstanceStepId).Extend04; if (!string.IsNullOrWhiteSpace(extend04)) { // 需要返回到加签的来源人,需要隐藏下一步 return(true); } var list = InstanceStepExecutorDAO.QueryByExecuteStatus(InstanceStepId, Pub.Unfinished); list.ForEach(a => a.Extend01 = string.Format("{0}", a.Extend01)); if (list.Count(a => a.Extend01.Contains("签")) >= 2) { return(true); } else { // 默认显示选择下一步的下拉框 return(false); } }
/// <summary> /// 从某个运行时步骤到另外一个步骤 /// </summary> /// <param name="InstanceStepExecutorId"></param> /// <param name="ToStepId"></param> /// <param name="CurrentUserId"></param> /// <param name="CurrentUserName"></param> private void GotoStep(string InstanceStepExecutorId, string ToStepId, string CurrentUserId, string CurrentUserName) { var InstanceStepExecutor = InstanceStepExecutorDAO.Get(InstanceStepExecutorId); var ToStep = WFDA.Instance.GetStep(ToStepId); if (ToStep.StepId == InstanceStepExecutor.StepId) { throw new WFException("当前步骤和下一步骤不能相同".GetRes()); } var engine = NinjectHelper.Get <IEngine>(); if (engine == null) { throw new WFException("找不到 IEngine".GetRes()); } // 更新步骤签核信息 InstanceStepExecutorDAO.UpdateUnfinishedByInstanceStepId(InstanceStepExecutor.InstanceStepId, "自动完成", Pub.Finished, CurrentUserName); var rollback = new List <string>() { "回退", "不同意", "拒绝" }; if (rollback.Contains(InstanceStepExecutor.ExecuteResult)) { engine.RollbackDBWF(ToStep.ModelId, InstanceStepExecutor.InstanceId, InstanceStepExecutor.InstanceStepId, ToStep.StepId, true, CurrentUserId, CurrentUserName); } else { Extend02(CurrentUserId, CurrentUserName, InstanceStepExecutor, engine); // 继续工作流 engine.GotoDBWF(ToStep.ModelId, InstanceStepExecutor.InstanceId, InstanceStepExecutor.InstanceStepId, ToStep.StepId, true, CurrentUserId, CurrentUserName); } }
private static int GetAccess(FormM form, DFDictionary entity) { var InstanceStepExecutorId = entity["InstanceStepExecutorId"]; if (string.IsNullOrWhiteSpace(InstanceStepExecutorId)) { return(0); } var result = 0; var InstanceStepExecutor = InstanceStepExecutorDAO.Get(InstanceStepExecutorId); if (null != InstanceStepExecutor) { if (InstanceStepExecutor.ExecuteStatus == Pub.Finished) { var user = Util.GetCurrentUser(); // 判断是否是流程管理员 if (WFDA.Instance.IsInstanceStepRunning(InstanceStepExecutorId) && WFDA.Instance.IsWorkflowAdmin(user.UserName, InstanceStepExecutor.ModelName)) { // 允许加签转签功能 result = result | 32; result = result | 64; } return(result); } var Step = WFDA.Instance.GetStep(InstanceStepExecutor.StepId); if (null != Step && !string.IsNullOrWhiteSpace(Step.AllowActions)) { // 1 保存 2 提交 3 同意 4 不同意 5 回退 6 转签 7 加签 var list = Step.AllowActions.Split(','); if (list.Contains("1")) { result = result | 1; } if (list.Contains("2")) { result = result | 2; } if (list.Contains("3")) { result = result | 4; } if (list.Contains("4")) { result = result | 8; } if (list.Contains("5")) { result = result | 16; } if (list.Contains("6")) { result = result | 32; } if (list.Contains("7")) { result = result | 64; } } } return(result); }
private void SetFinished(string InstanceStepExecutorId, string ExecuteResult, string ExecuteComment, string memo, string CurrentUserName) { InstanceStepExecutorDAO.UpdateInstanceStepExecutor(InstanceStepExecutorId, ExecuteResult, ExecuteComment, memo, Pub.Finished, CurrentUserName); }