Example #1
0
        /// <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);
        }
Example #2
0
        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);
        }
Example #3
0
        /// <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);
            }
        }
Example #4
0
        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));
        }
Example #5
0
 /// <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()
            });
        }
Example #8
0
        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);
            }
        }
Example #9
0
        /// <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));
        }
Example #10
0
        /// <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);
                    }
                }
            }
        }
Example #11
0
        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);
        }
Example #12
0
        /// <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);
            }
        }
Example #13
0
        /// <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);
        }
Example #15
0
 private void SetFinished(string InstanceStepExecutorId, string ExecuteResult, string ExecuteComment, string memo, string CurrentUserName)
 {
     InstanceStepExecutorDAO.UpdateInstanceStepExecutor(InstanceStepExecutorId, ExecuteResult, ExecuteComment, memo, Pub.Finished, CurrentUserName);
 }