///// <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(); }); }
/// <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()); }
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); } }
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); }
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); }
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)); }
private WfActivityInstance CreateActivityInstance(WfProcess process, WfProcessInstance processInstance, WfActivity activity, WfActivityState state, long assignToUserId, string assignToUserName) { return(CreateActivityInstance(process, processInstance, activity, state, $"[{assignToUserId}]", assignToUserName)); }
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); } }
/// <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}]已关联业务,不能删除"); } }
/// <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)); }
/// <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 }); }
/// <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); }
/// <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); }
/// <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)); }
/// <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)); }
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)); }
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); }
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); }
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; }
/// <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)); }
/// <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)); }
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); }