Esempio n. 1
0
        ///// <summary>
        ///// 取消所有的分支流程
        ///// </summary>
        ///// <param name="recursive">是否递归</param>
        //public void CancelBranchProcesses(bool recursive)
        //{
        //    this.BranchProcessGroups.ForEach(group =>
        //    {
        //        ((WfBranchProcessGroup)group).CheckProcessesStatusInBranches();
        //        ProcessProgress.Current.MaxStep += group.Branches.Count;
        //        ProcessProgress.Current.Response();

        //        group.Branches.ForEach(p =>
        //        {
        //            ((WfProcess)p).InternalCancelProcess(recursive);

        //            ProcessProgress.Current.Increment();
        //            ProcessProgress.Current.Response();
        //        });
        //    });
        //}

        /// <summary>
        /// 取消所有的分支流程
        /// </summary>
        /// <param name="recursive">是否递归</param>
        public void CancelBranchProcesses(bool recursive)
        {
            this.BranchProcessGroups.ForEach(group =>
            {
                ((WfBranchProcessGroup)group).CheckProcessesStatusInBranches();

                IList <string> processIDs = ((WfBranchProcessGroup)group).InternalBranches.FindProcessIDsByStatus(status => status != WfProcessStatus.Aborted);

                ProcessProgress.Current.MaxStep += processIDs.Count;
                ProcessProgress.Current.Response();

                int i = 1;
                processIDs.ForEach(pID =>
                {
                    WfProcess p = (WfProcess)WfRuntime.GetProcessByProcessID(pID);

                    ProcessProgress.Current.StatusText = string.Format("正在作废分支流程{0}/{1}", i, processIDs.Count);
                    ProcessProgress.Current.Response();

                    p.InternalCancelProcess(recursive);

                    i++;
                    ProcessProgress.Current.Increment();
                    ProcessProgress.Current.Response();
                });

                ProcessProgress.Current.StatusText = string.Empty;
                ProcessProgress.Current.Response();
            });
        }
Esempio n. 2
0
        /// <summary>
        /// 设计
        /// </summary>
        /// <returns></returns>
        public IActionResult Design(string fid)
        {
            WfProcess tmplate    = _dbContext.Get <WfProcess>(fid);
            string    diagramUid = tmplate.DiagramId;
            WfDiagram diagram    = null;
            string    xml        = string.Empty;

            if (diagramUid.IsPresent())
            {
                diagram = _dbContext.Get <WfDiagram>(diagramUid);
            }
            if (diagram == null)
            {
                diagram = new WfDiagram()
                {
                    Fid = UUIDUtils.Fid, ProcessName = tmplate.ProcessName, XmlContent = ""
                };
            }
            if (diagram.XmlContent.IsMissing())
            {
                xml = string.Join("", new string[] { $"<mxGraphModel dx=\"1426\" dy=\"779\" grid=\"1\" gridSize=\"10\" guides=\"1\" tooltips=\"1\" connect=\"1\" arrows=\"1\" fold=\"1\" page=\"1\" pageScale=\"1\" pageWidth=\"827\" pageHeight=\"1169\" wfProcessUid=\"{fid}\" wfDiagramUid=\"{diagram.Fid}\" wfDiagramName=\"{diagram.ProcessName}\" wfDesc=\"\" wfResultNotice=\"1\" wfSuspendNotice=\"0\" wfMail=\"1\" wfMessage=\"1\" frmType=\"Internal\" billTable=\"\" background=\"#ffffff\">",
                                                     "  <root>",
                                                     "    <mxCell id=\"0\"/>",
                                                     "    <mxCell id=\"1\" parent=\"0\"/>   ",
                                                     "  </root>",
                                                     "</mxGraphModel>" });
            }
            else
            {
                xml = diagram.XmlContent.Replace("workflowProcess", "mxGraphModel");
            }
            ViewBag.XML = xml;
            return(View());
        }
Esempio n. 3
0
        public void UpgradeProcessTemplateDirectly(long id)
        {
            WfProcess wfProcess = _dataAccessor.Get <WfProcess>(id);

            if (wfProcess != null)
            {
                WfProcess newWfProcess = wfProcess.Clone() as WfProcess;
                //升级流程图
                newWfProcess.Fid      = UUIDUtils.Fid;
                newWfProcess.Version += 1;


                //升级流程图
                WfDiagram wfDiagram = _dataAccessor.Get <WfDiagram>(wfProcess.DiagramId);
                if (wfDiagram != null)
                {
                    wfDiagram.Version    = newWfProcess.Version;
                    wfDiagram.Fid        = UUIDUtils.Fid;
                    wfDiagram.ProcessUid = newWfProcess.Fid;
                    _dataAccessor.Insert <WfDiagram>(wfDiagram);
                }

                //更新升级后的流程模板
                newWfProcess.DiagramId = wfDiagram.Fid;
                _dataAccessor.Insert <WfProcess>(newWfProcess);
                //将原来的流程模板变成历史状态
                wfProcess.Status = WfProcessState.Historical;
                _dataAccessor.Update <WfProcess>(wfProcess);
            }
        }
Esempio n. 4
0
        private ProcessEntity GetProcessEntity(string processUid, string billUid)
        {
            ProcessEntity entity    = null;
            WfProcess     wfProcess = _dataAccessor.Get <WfProcess>(processUid);

            if (wfProcess != null)
            {
                entity = new ProcessEntity();
                dynamic bizData         = _dataAccessor.Get(wfProcess.BillTable, billUid);
                var     processInstance = _dataAccessor.QueryFirstOrDefaultWhere <WfProcessInstance>("ProcessUid=@ProcessUid and BillUid=@BillUid", new DynamicParameters(new { ProcessUid = processUid, BillUid = billUid }));
                if (processInstance == null)
                {
                    WfDiagram diagram = _dataAccessor.Get <WfDiagram>(wfProcess.DiagramId);
                    entity.XmlContent = diagram.XmlContent;
                }
                else
                {
                    var diagramInstance = _dataAccessor.QueryFirstOrDefaultWhere <WfDiagramInstance>("ProcessInsUid=@ProcessInsUid", new DynamicParameters(new { ProcessInsUid = processInstance.Fid }));
                    entity.XmlContent = diagramInstance.XmlContent;
                }
                entity.ProcessUid  = wfProcess.Fid;
                entity.ProcessName = wfProcess.ProcessName;
                entity.AppType     = wfProcess.ProcessGroupUid;
                entity.IsUsing     = wfProcess.Status == WfProcessState.Using;
                entity.Version     = wfProcess.Version;
                entity.BizData     = bizData;
            }
            else
            {
                _logger.LogError($"数据库没有对应的流程定义记录,模板{processUid}");
            }
            return(entity);
        }
Esempio n. 5
0
        private async Task SendProgress(string nextStepId,
                                        string assignToUserIds,
                                        string assignToUserNames,
                                        JsonModel jsonModel,
                                        WfProcessInstance processInstance,
                                        WfProcess process,
                                        WfActivityInstance currActIns)
        {
            var nextAct = process.GetActivity(nextStepId);

            if (nextAct == null)
            {
                jsonModel.statusCode = 300;
                jsonModel.message    = $"流程 {process.Name}的节点 {nextStepId} 找不到!";
                return;
            }

            var nextActInstance = CreateActivityInstance(process,
                                                         processInstance,
                                                         nextAct,
                                                         WfActivityState.Running,
                                                         assignToUserIds,
                                                         assignToUserNames);

            nextActInstance.PreActInstanceId = currActIns.Id;
            processInstance.CurrActivityName = nextActInstance.ActivityName;
            await WfActivityInstanceRepository.SaveAsync(nextActInstance);
        }
Esempio n. 6
0
        public PartialViewResult HistoryVersion(int id)
        {
            WfProcess       template      = _dbContext.Get <WfProcess>(id);
            string          collectionId  = template.CollectionId;
            string          initCondition = $"CollectionId='{collectionId}' AND Status='{WfProcessState.Historical}'";
            JqGridViewModel model         = this.GetJqGridModel("WfProcess", (queryOption) =>
            {
                queryOption.GlobalWhere = initCondition;
            });

            ViewBag.Id = template.Id;
            return(PartialView(model));
        }
Esempio n. 7
0
 private WfActivityInstance CreateActivityInstance(WfProcess process,
                                                   WfProcessInstance processInstance,
                                                   WfActivity activity,
                                                   WfActivityState state,
                                                   long assignToUserId,
                                                   string assignToUserName)
 {
     return(CreateActivityInstance(process,
                                   processInstance,
                                   activity,
                                   state,
                                   $"[{assignToUserId}]",
                                   assignToUserName));
 }
Esempio n. 8
0
        public void SaveProcessTemplate(string xml)
        {
            xml = xml.Replace("mxGraphModel", "workflowProcess");
            XmlDocument doc = new XmlDocument();

            doc.LoadXml(xml);
            var       workflowNode   = doc.GetElementsByTagName("workflowProcess")[0];
            string    processUid     = XMLHelper.GetXmlAttribute(workflowNode, "wfProcessUid");
            string    diagramUid     = XMLHelper.GetXmlAttribute(workflowNode, "wfDiagramUid");
            string    diagramName    = XMLHelper.GetXmlAttribute(workflowNode, "wfDiagramName");
            string    formType       = XMLHelper.GetXmlAttribute(workflowNode, "frmType");
            string    billTable      = XMLHelper.GetXmlAttribute(workflowNode, "billTable");
            string    formTemplate   = XMLHelper.GetXmlAttribute(workflowNode, "billTemplate");
            string    notice         = XMLHelper.GetXmlAttribute(workflowNode, "wfResultNotice");
            string    suspendNotice  = XMLHelper.GetXmlAttribute(workflowNode, "wfSuspendNotice");
            string    wfMail         = XMLHelper.GetXmlAttribute(workflowNode, "wfMail");
            string    wfMessage      = XMLHelper.GetXmlAttribute(workflowNode, "wfMessage");
            string    messageSetting = $"{{'notice':{notice},'suspend':{suspendNotice},'mail':{wfMail},'message':{wfMessage}}}";
            WfDiagram wfDiagram      = _dataAccessor.Get <WfDiagram>(diagramUid);
            WfProcess wfProcess      = _dataAccessor.Get <WfProcess>(processUid);

            wfProcess.DiagramId       = diagramUid;
            wfProcess.ProcessName     = diagramName;
            wfProcess.FormType        = formType;
            wfProcess.FormTemplateUid = formTemplate;
            wfProcess.BillTable       = billTable;
            wfProcess.MessageSetting  = messageSetting;
            if (wfDiagram == null)
            {
                //新增
                wfDiagram = new WfDiagram()
                {
                    Fid = diagramUid, ProcessName = diagramName, ProcessUid = processUid, XmlContent = xml
                };

                //保存流程图
                _dataAccessor.Insert <WfDiagram>(wfDiagram);
                _dataAccessor.Update <WfProcess>(wfProcess);
            }
            else //更新
            {
                wfDiagram.ProcessName = diagramName;
                wfDiagram.XmlContent  = xml;

                //保存流程图
                _dataAccessor.Update <WfDiagram>(wfDiagram);
                _dataAccessor.Update <WfProcess>(wfProcess);
            }
        }
Esempio n. 9
0
        /// <summary>
        /// 申请列表
        /// </summary>
        /// <param name="id">业务类型fid</param>
        /// <returns></returns>
        public PartialViewResult Apply(string fid)
        {
            WfBusiness business  = _dbContext.Get <WfBusiness>(fid);
            WfProcess  wfProcess = _dbContext.Get <WfProcess>(business.WfProcessUid);

            ViewBag.WfProcess  = wfProcess;
            ViewBag.WfBusiness = business;
            var model = this.GetJqGridModel(business.BillEntity, (qs) =>
            {
                qs.GlobalWhere = "(BillEmpUid=@EmpUid or AppEmpUid=@EmpUid)";
                qs.AddParameter("EmpUid", _applicationContext.EmpUid);
            });

            return(PartialView(model));
        }
        /// <summary>
        /// 删除之前判断是否关联了业务
        /// </summary>
        /// <param name="dynamicData"></param>
        public override void BeforeDynamicObjectDelete(FapDynamicObject fapDynamicData)
        {
            string fid   = fapDynamicData.Get("Fid").ToString();
            bool   allow = _wfService.AllowDeleteProcessTemplate(fid);

            if (allow)
            {
                _dbContext.Execute($"delete from WfProcess where Fid='{fid}'");
            }
            else
            {
                WfProcess wft = _dbContext.Get <WfProcess>(fid);
                throw new Exception($"流程[{wft.ProcessName}]已关联业务,不能删除");
            }
        }
Esempio n. 11
0
        /// <summary>
        /// 申请列表管理
        /// </summary>
        /// <param name="id">业务类型fid</param>
        /// <returns></returns>
        public ActionResult Manage(string fid)
        {
            WfBusiness wfb = _dbContext.Get <WfBusiness>(fid);

            if (wfb == null)
            {
                return(Content("业务未关联流程"));
            }
            WfProcess wfProcess = _dbContext.Get <WfProcess>(wfb.WfProcessUid);

            ViewBag.WfProcess  = wfProcess;
            ViewBag.WfBusiness = wfb;
            var model = this.GetJqGridModel(wfb.BillEntity, (qs) =>
            {
                qs.GlobalWhere = "BillStatus<>'DRAFT' and BillStatus<>'CANCELED' and BillStatus<>'ENDED' and BillStatus<>'CLOSED'";
                qs.AddOrderBy("Id", "desc");
            });

            return(PartialView(model));
        }
Esempio n. 12
0
 /// <summary>
 /// 创建节点实例
 /// </summary>
 /// <param name="process"></param>
 /// <param name="processInstance"></param>
 /// <param name="activity"></param>
 /// <returns></returns>
 private WfActivityInstance CreateActivityInstance(WfProcess process,
                                                   WfProcessInstance processInstance,
                                                   WfActivity activity,
                                                   WfActivityState state,
                                                   string assignToUserId,
                                                   string assignToUserName)
 {
     return(new WfActivityInstance()
     {
         ActivityGuid = activity.key,
         ActivityName = activity.text,
         ActivityState = state,
         ActivityType = activity.activityType,
         CommonStatus = CommonStatus.Enabled,
         ProcessId = process.Id,
         ProcessInstanceId = processInstance.Id,
         ProcessName = process.Name,
         AssignToUserIds = assignToUserId,
         AssignToUserNames = assignToUserName
     });
 }
Esempio n. 13
0
        /// <summary>
        /// 生成回退节点
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="process"></param>
        /// <param name="currActIns"></param>
        /// <returns></returns>
        private async Task FallBackProgress(WfProcessInstance processInstance,
                                            WfProcess process,
                                            WfActivityInstance currActIns,
                                            string backStepId)
        {
            var preActInstance = await WfActivityInstanceRepository.GetLatestActivityAsync(processInstance.Id, backStepId);

            var backActivity    = process.GetActivity(backStepId);
            var backActInstance = CreateActivityInstance(process,
                                                         processInstance,
                                                         backActivity,
                                                         WfActivityState.Running,
                                                         preActInstance.AssignToUserIds,
                                                         preActInstance.AssignToUserNames);

            backActInstance.PreActInstanceId       = preActInstance.PreActInstanceId;
            backActInstance.BackActivityInstanceId = currActIns.Id;
            processInstance.CurrActivityName       = backActInstance.ActivityName;
            currActIns.ActivityState = WfActivityState.Sendbacked;
            await WfActivityInstanceRepository.SaveAsync(backActInstance);
        }
Esempio n. 14
0
        /// <summary>
        /// 创建新流程实例,根据流程模板
        /// </summary>
        /// <param name="runner"></param>
        /// <param name="func"></param>
        /// <param name="service"></param>
        /// <returns></returns>
        internal WfProcessInstance CreateProcessInstance(WfAppRunner runner, WfProcessInstance parentProcessInstance,
                                                         WfActivityInstance subProcessNode, Action <WfAppRunner, WfProcessInstance, WfProcess> func)
        {
            WfProcess         wfProcess         = _dataAccessor.Get <WfProcess>(runner.ProcessUid, false);
            WfProcessInstance wfProcessInstance = new WfProcessInstance();

            wfProcessInstance.Fid             = UUIDUtils.Fid;;
            wfProcessInstance.ProcessUid      = wfProcess.Fid;
            wfProcessInstance.BillUid         = runner.BillUid;
            wfProcessInstance.BizName         = runner.BillData.BillCode;//易标识
            wfProcessInstance.AppEmpUid       = runner.UserId;
            wfProcessInstance.AppEmpName      = runner.UserName;
            wfProcessInstance.StartTime       = DateTimeUtils.CurrentDateStr;
            wfProcessInstance.ProcessState    = WfProcessInstanceState.Running;
            wfProcessInstance.ProcessName     = wfProcess.ProcessName;
            wfProcessInstance.ProcessDesc     = wfProcess.Description;
            wfProcessInstance.IsHasForm       = 1;
            wfProcessInstance.BusinessUid     = runner.BusinessUid;
            wfProcessInstance.IsHandling      = 0; //未处理状态
            wfProcessInstance.MessageSetting  = wfProcess.MessageSetting;
            wfProcessInstance.FormTemplateUid = wfProcess.FormTemplateUid;
            wfProcessInstance.FormType        = wfProcess.FormType;
            wfProcessInstance.BillTable       = wfProcess.BillTable;
            if (parentProcessInstance != null)
            {
                //流程的Parent信息
                wfProcessInstance.ParentProcessInsUid  = parentProcessInstance.Fid;
                wfProcessInstance.ParentProcessUid     = parentProcessInstance.ProcessUid;
                wfProcessInstance.InvokeActivityInsUid = subProcessNode.Fid;
                wfProcessInstance.InvokeActivityUid    = subProcessNode.NodeId.ToInt();
            }
            if (func != null)
            {
                func(runner, wfProcessInstance, wfProcess);
            }

            return(wfProcessInstance);
        }
Esempio n. 15
0
        /// <summary>
        /// 申请单
        /// </summary>
        /// <param name="processUid">流程</param>
        /// <param name="billUid">单据</param>
        /// <returns></returns>
        public IActionResult ApplyBill(string businessUid, string billUid = "")
        {
            WfBusiness    business = _dbContext.Get <WfBusiness>(businessUid);
            WfProcess     process  = _dbContext.Get <WfProcess>(business.WfProcessUid);
            FormViewModel model    = GetFormViewModel(business.BillEntity, business.BillEntity, billUid);

            if (process.BillTable.EqualsWithIgnoreCase("TmTravelApply"))
            {
                //设置子表默认值
                SubTableDefaultValue sub = new SubTableDefaultValue()
                {
                    TableName = "TmTravelBudget", Data = new Dictionary <string, string> {
                        ["Currency"] = "fcdc11e5828cc236d2ab", ["CurrencyMC"] = "人民币"
                    }
                };
                model.SubDefaultDataList.AsList().Add(sub);
            }
            //关联的业务类型Uid
            ViewBag.Business = business;
            //当前流程
            ViewBag.Process = process;
            return(View(model));
        }
Esempio n. 16
0
        /// <summary>
        /// 查看申请单
        /// </summary>
        /// <param name="processUid"></param>
        /// <param name="businessUid">业务</param>
        /// <param name="billUid">单据</param>
        /// <returns></returns>
        public IActionResult ApplyViewBill(string processUid, string businessUid, string billUid)
        {
            WfProcess     process = _dbContext.Get <WfProcess>(processUid);
            FormViewModel model   = this.GetFormViewModel(process.BillTable, "frm-" + process.BillTable, billUid);

            model.FormStatus = AspNetCore.Controls.DataForm.FormStatus.View;

            //关联的业务类型Uid
            ViewBag.BusinessUid = businessUid;
            //当前流程
            ViewBag.Process = process;
            //获取审批历史
            DynamicParameters parameters = new DynamicParameters();

            parameters.Add("ProcessUid", processUid);
            parameters.Add("BillUid", billUid);
            var activityIns = _dbContext.QueryWhere <WfActivityInstance>("ActivityType<>'GatewayNode' and ProcessUid=@ProcessUid and BillUid=@BillUid", parameters, true).OrderBy(a => a.StartTime);
            var tasks       = _dbContext.QueryWhere <WfTask>("ProcessUid=@ProcessUid and BillUid=@BillUid", parameters, true).OrderBy(t => t.TaskStartTime).OrderBy(t => t.ExecuteTime);

            ViewBag.ActivityIns = activityIns;
            ViewBag.WfTasks     = tasks;

            return(View(model));
        }
Esempio n. 17
0
        public WfRepository GetMasterRepoByProcess(Guid processGuid)
        {
            WfProcess process = db.WfProcesss.First(o => o.ProcessGuid == processGuid);

            return(db.WfRepositorys.First(o => o.ProcessGuid == processGuid && o.Version == process.MasterVer));
        }
Esempio n. 18
0
        private static WfProcessCollection DataTableToProcessCollection(DataTable table)
        {
            WfProcessCollection result = new WfProcessCollection();

            XElementFormatter formatter = new XElementFormatter();

            formatter.OutputShortType = WorkflowSettings.GetConfig().OutputShortType;

            foreach (DataRow row in table.Rows)
            {
                WfProcessInstanceData instanceData = new WfProcessInstanceData();

                ORMapping.DataRowToObject(row, instanceData);

                XElement extData = GetExtData(instanceData.ExtData);

                Encoding originalEncoding = GetEncodingFromExtData(extData);
                Encoding preferedEncoding = originalEncoding;
                byte[]   decompressedData = null;

                if (null != instanceData.BinaryData)
                {
                    PerformanceMonitorHelper.GetDefaultMonitor().WriteExecutionDuration(string.Format("Extra Process Data:{0}", instanceData.InstanceID),
                                                                                        () => decompressedData = CompressManager.ExtractBytes(instanceData.BinaryData));

                    PerformanceMonitorHelper.GetDefaultMonitor().WriteExecutionDuration("EncodeProcessString", () =>
                    {
                        preferedEncoding  = GetPreferedEncoding(decompressedData, originalEncoding);
                        instanceData.Data = BytesToProcessData(decompressedData, preferedEncoding);
                    }
                                                                                        );
                }
                else
                {
                    (instanceData.Data != null).FalseThrow <ArgumentException>(Translator.Translate(Define.DefaultCulture, "流程实例表的Data和BinaryData都为空"));
                }

                XElement root = null;

                try
                {
                    root = XElement.Parse(instanceData.Data);
                }
                catch (System.Xml.XmlException)
                {
                    if (decompressedData != null)
                    {
                        instanceData.Data = ChangeEncoding(decompressedData, preferedEncoding);
                        root = XElement.Parse(instanceData.Data);
                    }
                    else
                    {
                        throw;
                    }
                }

                extData.SetAttributeValue("encoding", originalEncoding.BodyName);

                WfProcess process = null;

                PerformanceMonitorHelper.GetDefaultMonitor().WriteExecutionDuration(string.Format("Deserialize Process:{0}", instanceData.InstanceID),
                                                                                    () => process = (WfProcess)formatter.Deserialize(root));

                process.LoadingType = DataLoadingType.External;
                process.Activities.ForEach(a =>
                {
                    ((WfActivityBase)a).LoadingType = DataLoadingType.External;
                    WfActivityBuilderBase.LoadActions(a);
                });
                process.UpdateTag = instanceData.UpdateTag;
                process.Context["SerilizationExtData"] = extData.ToString();

                result.Add(process);
            }

            return(result);
        }
Esempio n. 19
0
        public static IWfProcess StartWorkflow(WfProcessStartupParams startupParams)
        {
            startupParams.NullCheck <WfRuntimeException>("startupParams");

            WfProcess process = new WfProcess(startupParams.ProcessDescriptor);

            FillProcessDescriptorProperties(startupParams, process.Descriptor);
            FillProcessInstanceProperties(startupParams, process);

            WfProcessContextCache.Instance.Add(process.ID, process);

            if (process.Creator == null && DeluxePrincipal.IsAuthenticated)
            {
                process.Creator = DeluxeIdentity.CurrentUser;
            }

            if (process.InitialActivity != null)
            {
                if (process.InitialActivity.Descriptor.Properties.GetValue("AutoGenerateCadidates", true))
                {
                    process.InitialActivity.GenerateCandidatesFromResources();

                    WfMatrix matrix = process.GetMatrix();

                    if (matrix != null)
                    {
                        ((WfActivityBase)process.InitialActivity).GenerateCandidatesFromMatrix(matrix);
                    }
                }

                if (startupParams.CheckStartProcessUserPermission)
                {
                    CheckStartProcessUserPermission(process);
                }

                if (startupParams.Assignees.Count == 0)
                {
                    startupParams.Assignees.CopyFrom(process.InitialActivity.Candidates);
                }

                if (process.InitialActivity.Descriptor.Resources.Count == 0)
                {
                    startupParams.Assignees.ToUsers().ForEach(u => process.InitialActivity.Descriptor.Resources.Add(new WfUserResourceDescriptor(u)));
                }

                WfSimulator.WriteSimulationInfo(process, WfSimulationOperationType.Startup);

                //如果自动启动第一个活动且存在活动点,则流转到第一个点
                if (startupParams.AutoStartInitialActivity)
                {
                    WfAssigneeCollection assignees = startupParams.Assignees;
                    process.InitialActivity.Candidates.Clear();
                    process.InitialActivity.Candidates.CopyFrom(startupParams.Assignees);

                    IWfActivity originalInitial = process.InitialActivity;

                    WfRuntime.DecorateProcess(process);

                    //修饰流程后,如果起始点发生了变化...
                    if (originalInitial != process.InitialActivity)
                    {
                        assignees = process.InitialActivity.Candidates;
                    }

                    WfTransferParams transferParams = new WfTransferParams(process.InitialActivity.Descriptor);

                    //设置初始节点子流程参数
                    process.InitialActivity.Descriptor.BranchProcessTemplates.ForEach(branchTemplate =>
                    {
                        transferParams.BranchTransferParams.Add(new WfBranchProcessTransferParams(branchTemplate));
                    });

                    transferParams.Operator = startupParams.Creator;
                    transferParams.Assignees.CopyFrom(assignees);
                    process.MoveTo(transferParams);

                    WfRuntime.ProcessContext.NormalizeTaskTitles();
                }
            }

            WfRuntime.ProcessContext.AffectedProcesses.AddOrReplace(process);

            return(process);
        }
Esempio n. 20
0
        private static void FillProcessInstanceProperties(WfProcessStartupParams startupParams, WfProcess process)
        {
            process.ResourceID = startupParams.ResourceID;
            process.RelativeParams.CopyFrom(startupParams.RelativeParams);
            process.RelativeID          = startupParams.RelativeID;
            process.RelativeURL         = startupParams.RelativeURL;
            process.BranchStartupParams = startupParams.BranchStartupParams;
            process.EntryInfo           = startupParams.Group;
            process.OwnerActivityID     = startupParams.OwnerActivityID;
            process.OwnerTemplateKey    = startupParams.OwnerTemplateKey;
            process.Sequence            = startupParams.Sequence;
            process.ApplicationRuntimeParameters.CopyFrom(startupParams.ApplicationRuntimeParameters);
            process.Committed = startupParams.AutoCommit;

            process.OwnerDepartment = startupParams.Department;
            process.Creator         = startupParams.Creator;
        }
Esempio n. 21
0
        /// <summary>
        /// 审批单
        /// </summary>
        /// <param name="BillUid"></param>
        /// <param name="BusinessUid"></param>
        /// <param name="agent"></param>
        /// <returns></returns>
        public IActionResult ApprovalBill(string billUid, string businessUid, int agent = 0)
        {
            DynamicParameters param = new DynamicParameters();

            param.Add("BillUid", billUid);
            param.Add("BusinessUid", businessUid);
            string sql = string.Empty;

            if (agent == 1)
            {
                //获取代理人
                var agents = _dbContext.QueryAll <WfAgentSetting>().Where(a => a.Agent == _applicationContext.EmpUid && a.State == 1);// _dbContext.QueryWhere<WfAgentSetting>($" Agent='{_applicationContext.EmpUid}' and [State]=1");
                if (agents.Any())
                {
                    sql = $"select WfTask.* from WfTask,WfActivityInstance where WfTask.ActivityInsUid=WfActivityInstance.Fid and  WfActivityInstance.ActivityState in('{WfActivityInstanceState.Running}','{WfActivityInstanceState.Ready}') and WfTask.ExecutorEmpUid in @Agent and WfTask.BusinessUid=@BusinessUid and WfTask.BillUid=@BillUid and WfTask.TaskState='Handling'";
                    param.Add("Agent", agents.Select(a => a.Principal));
                }
                else
                {
                    sql = $"select WfTask.* from WfTask where 1=2";
                }
            }
            else
            {
                sql = $"select WfTask.* from WfTask,WfActivityInstance where WfTask.ActivityInsUid=WfActivityInstance.Fid and  WfActivityInstance.ActivityState in('{WfActivityInstanceState.Running}','{WfActivityInstanceState.Ready}') and WfTask.ExecutorEmpUid='{_applicationContext.EmpUid}' and WfTask.BusinessUid=@BusinessUid and WfTask.BillUid=@BillUid and WfTask.TaskState='Handling'";
            }
            WfTask wfTask = _dbContext.QueryFirstOrDefault <WfTask>(sql, param);

            if (wfTask == null)
            {
                return(Content("没有找到要审批的任务"));
            }
            string activityInsUid = wfTask.ActivityInsUid;
            //获取表单类型 以及模板,字段权限
            WfProcess          wfProcess          = _dbContext.Get <WfProcess>(wfTask.ProcessUid);
            WfActivityInstance wfActivityInstance = _dbContext.Get <WfActivityInstance>(activityInsUid);

            //表单模板
            ViewBag.FormTemplate = wfActivityInstance.FormTemplate;
            //表单表
            string tn = wfProcess.BillTable;

            ViewBag.Process   = wfProcess;
            ViewBag.FormPower = wfActivityInstance.FormPower;
            //权限字段解析
            int needEdit = 0;//存在需要编辑字段,审批的时候首先要保存

            if (wfActivityInstance.FormPower.IsPresent())
            {
                IList <FieldEntity> powers = JsonConvert.DeserializeObject <IList <FieldEntity> >(wfActivityInstance.FormPower);
                if (powers != null && powers.Any())
                {
                    var allColumns = _dbContext.Columns(tn);
                    foreach (var field in powers)
                    {
                        string colName = field.FieldName;
                        var    column  = allColumns.FirstOrDefault(col => col.ColName == colName);
                        if (column != null && column.CtrlType == FapColumn.CTRL_TYPE_REFERENCE)
                        {
                            field.FieldName += "MC";
                        }
                        field.FieldNameMC = column.ColComment;
                        if (field.Property == Fap.Workflow.Engine.Enums.FieldPropertyEnum.Editable)
                        {
                            needEdit = 1;
                        }
                    }
                    ViewBag.FormPower = powers.ToJsonIgnoreNullValue();
                }
            }
            else
            {
                ViewBag.FormPower = "undefined";
            }
            //是否编辑表单
            ViewBag.IsEdit = needEdit;
            //审批任务
            ViewBag.WfTask = wfTask;
            FormViewModel model = this.GetFormViewModel(tn, "frm-" + tn, billUid);

            return(View(model));
        }
Esempio n. 22
0
        /// <summary>
        /// 查看审批单
        /// </summary>
        /// <param name="BillUid"></param>
        /// <param name="BusinessUid"></param>
        /// <returns></returns>
        public IActionResult ApprovalViewBill(string billUid, string businessUid)
        {
            DynamicParameters param = new DynamicParameters();

            param.Add("BillUid", billUid);
            param.Add("BusinessUid", businessUid);
            string sql = $"select * from WfTask where  (ExecutorEmpUid='{_applicationContext.EmpUid}' or AgentEmpUid='{_applicationContext.EmpUid}') and BusinessUid=@BusinessUid and BillUid=@BillUid and TaskState in('Completed','Revoked')";

            WfTask wfTask = _dbContext.QueryFirstOrDefault <WfTask>(sql, param);

            if (wfTask == null)
            {
                return(Content("没有找到审批数据"));
            }
            string activityInsUid = wfTask.ActivityInsUid;
            //获取表单类型 以及模板,字段权限
            WfProcess          wfProcess          = _dbContext.Get <WfProcess>(wfTask.ProcessUid);
            WfActivityInstance wfActivityInstance = _dbContext.Get <WfActivityInstance>(activityInsUid);

            //表单模板
            ViewBag.FormTemplate = wfActivityInstance.FormTemplate;
            //表单表
            string tn = wfProcess.BillTable;

            ViewBag.Process   = wfProcess;
            ViewBag.FormPower = wfActivityInstance.FormPower;
            //权限字段解析
            int needEdit = 0;//存在需要编辑字段,审批的时候首先要保存

            if (wfActivityInstance.FormPower.IsPresent())
            {
                IList <FieldEntity> powers = JsonConvert.DeserializeObject <IList <FieldEntity> >(wfActivityInstance.FormPower);
                if (powers != null && powers.Any())
                {
                    var allColumns = _dbContext.Columns(tn);
                    foreach (var field in powers)
                    {
                        string colName = field.FieldName;
                        var    column  = allColumns.FirstOrDefault(col => col.ColName == colName);
                        if (column != null && column.CtrlType == FapColumn.CTRL_TYPE_REFERENCE)
                        {
                            field.FieldName += "MC";
                        }
                        field.FieldNameMC = column.ColComment;
                        if (field.Property == Fap.Workflow.Engine.Enums.FieldPropertyEnum.Editable)
                        {
                            needEdit = 1;
                        }
                    }
                    ViewBag.FormPower = powers.ToJsonIgnoreNullValue();
                }
            }
            else
            {
                ViewBag.FormPower = "undefined";
            }
            //是否编辑表单
            ViewBag.IsEdit = needEdit;
            //审批任务
            ViewBag.WfTask = wfTask;
            FormViewModel model = this.GetFormViewModel(tn, "frm-" + tn, billUid);

            model.FormStatus = AspNetCore.Controls.DataForm.FormStatus.View;
            return(View(model));
        }
Esempio n. 23
0
        public async Task InitTestProcess()
        {
            //生成一条测试用流程,流程如下:
            //Start - 填写请假信息 - 部门经理审核 - 人事审核 - 结束。
            //                                    -(小于5天) 副总经理审核 - 人事审核 - 结束
            //                                    -(大于5天)总经理审核 - 人事审核 - 结束
            //
            int roleIdDept    = 11,
                roleIdHuRes   = 12,
                roleIdDeputy  = 13,
                roleIdManager = 14;
            var process       = new WfProcess();

            process.CommonStatus = CommonStatus.Enabled;
            process.Name         = "请假流程";
            process.Remark       = "流程测试范例";
            process.TableSource  = TableSource.LeaveInfo;

            #region 定义流程信息
            var processModel = new WfProcessModel();
            processModel.linkDataArray = new List <WfTransition>();
            processModel.nodeDataArray = new List <WfActivity>();
            #region start 节点
            //start节点
            var actStart = new WfActivity()
            {
                activityType = WfActivityType.Start,
                key          = Guid.NewGuid().ToString(),
                text         = "开始"
            };
            processModel.nodeDataArray.Add(actStart);

            #endregion

            #region //填写信息
            var actInput = new WfActivity()
            {
                activityType = WfActivityType.Task,
                key          = Guid.NewGuid().ToString(),
                text         = "填写信息"
            };
            processModel.nodeDataArray.Add(actInput);

            //link
            var linkStart2Input = new WfTransition()
            {
                from = actStart.key,
                to   = actInput.key
            };
            processModel.linkDataArray.Add(linkStart2Input);

            #endregion

            #region 部门经理审核
            var actDept = new WfActivity()
            {
                activityType = WfActivityType.Task,
                key          = Guid.NewGuid().ToString(),
                text         = "部门经理审批",
                roleIds      = roleIdDept.ToString()
            };
            processModel.nodeDataArray.Add(actDept);

            //link
            var linkInput2Dept = new WfTransition()
            {
                from = actInput.key,
                to   = actDept.key
            };
            processModel.linkDataArray.Add(linkInput2Dept);
            #endregion

            #region 副总经理审核
            var actDeputy = new WfActivity()
            {
                activityType = WfActivityType.Task,
                key          = Guid.NewGuid().ToString(),
                text         = "副总经理审批",
                roleIds      = roleIdDeputy.ToString()
            };
            processModel.nodeDataArray.Add(actDeputy);

            //link
            var linkDept2Deputy = new WfTransition()
            {
                from      = actDept.key,
                to        = actDeputy.key,
                condition = " Days<5 ",
            };
            processModel.linkDataArray.Add(linkDept2Deputy);
            #endregion

            #region 总经理审核
            var actManager = new WfActivity()
            {
                activityType = WfActivityType.Task,
                key          = Guid.NewGuid().ToString(),
                text         = "总经理审批",
                roleIds      = roleIdManager.ToString()
            };
            processModel.nodeDataArray.Add(actManager);

            //link
            var linkDept2Manager = new WfTransition()
            {
                from      = actDept.key,
                to        = actManager.key,
                condition = " Days>5 ",
            };
            processModel.linkDataArray.Add(linkDept2Manager);
            #endregion

            #region 人事审核
            var actHuRes = new WfActivity()
            {
                activityType = WfActivityType.Task,
                key          = Guid.NewGuid().ToString(),
                text         = "人事审批",
                roleIds      = roleIdHuRes.ToString()
            };
            processModel.nodeDataArray.Add(actHuRes);

            //link 部门-人事
            var linkDept2HuRes = new WfTransition()
            {
                from = actDept.key,
                to   = actHuRes.key,
            };
            processModel.linkDataArray.Add(linkDept2HuRes);
            //link 副总-人事
            var linkDeputy2HuRes = new WfTransition()
            {
                from = actDeputy.key,
                to   = actHuRes.key,
            };
            processModel.linkDataArray.Add(linkDeputy2HuRes);
            //link 部门-人事
            var linkManager2HuRes = new WfTransition()
            {
                from = actManager.key,
                to   = actHuRes.key,
            };
            processModel.linkDataArray.Add(linkManager2HuRes);
            #endregion

            #region 结束
            var actEnd = new WfActivity()
            {
                activityType = WfActivityType.End,
                key          = Guid.NewGuid().ToString(),
                text         = "结束",
            };
            processModel.nodeDataArray.Add(actEnd);

            //link
            var linkHuRes2End = new WfTransition()
            {
                from = actHuRes.key,
                to   = actEnd.key,
            };
            processModel.linkDataArray.Add(linkHuRes2End);
            #endregion
            #endregion

            process.ProcessContent = JsonConvert.SerializeObject(processModel);

            await WfProcessRepository.SaveAsync(process);
        }