public static WorkFlowItem ToDomain(this WorkFlowItemDto item, WorkFlowItem originalItem = null) { if (originalItem != null && originalItem.Id == item.Id) { originalItem.Json = JsonConvert.SerializeObject(item.Obj); originalItem.Type = item.Type.Replace("Dto", ""); originalItem.ParentType = item.ParentType.Replace("Dto", ""); originalItem.ParentId = item.ParentId; originalItem.API = item.API; originalItem.ObjId = item.ObjId; originalItem.ApprovalStatus = (ApprovalStatus)Enum.Parse(typeof(ApprovalStatus), item.ApprovalStatus.ToString(), true); ((IDataDto)item).ToDomain((IData)originalItem); return(originalItem); } var data = new WorkFlowItem { Json = JsonConvert.SerializeObject(item.Obj), Type = item.Type.Replace("Dto", ""), ParentType = item.ParentType.Replace("Dto", ""), ParentId = item.ParentId, API = item.API, ObjId = item.ObjId, ApprovalStatus = (ApprovalStatus)Enum.Parse(typeof(ApprovalStatus), item.ApprovalStatus.ToString(), true) }; ((IDataDto)item).ToDomain((IData)data); return(data); }
public async Task <List <WorkFlowItem> > GetAllWorkflows(string teamName) { List <KeyValue> metaData = new List <KeyValue>(); List <WorkFlowItem> workFlowList = new List <WorkFlowItem>(); JArray result = await InvokeAsync <JArray>(string.Format(Constants.GET_ALL_TEAM_WORKFLOWS, teamName), Constants.HttpMethod.GET, metaData) .ConfigureAwait(false); if (result?.Count > 0) { List <string> connectorNames = new List <string>(); foreach (var wkf in result) { JObject wItem = wkf as JObject; WorkFlowItem item = new WorkFlowItem() { Name = wItem?["Name"].Value <string>(), Description = wItem?["Description"].Value <string>(), Expression = GetExpression(wItem?["Expression"] as JObject, connectorNames), }; workFlowList.Add(item); } } return(workFlowList); }
private void Edit(WorkFlowItem item) { WorkflowEditorView wnd = new WorkflowEditorView(); ((WorkflowEditorViewModel)wnd.DataContext).LoadXml(item.File); wnd.ShowDialog(); LoadWorkFlows(); }
private void LoadWorkFlows() { WorkFlows = new AsyncObservableCollection <WorkFlowItem>(); try { if (!Directory.Exists(Settings.Instance.WorkflowFolder)) { Directory.CreateDirectory(Settings.Instance.WorkflowFolder); } } catch (Exception e) { Log.Error("Unable to create workflow folder"); } var files = Directory.GetFiles(Settings.Instance.WorkflowFolder, "*.cwpkg"); foreach (var file in files) { try { WorkFlowItem item = new WorkFlowItem() { Workflow = WorkflowManager.Instance.LoadFromPackage(file), IsEditable = false, IsPackage = true, File = file }; WorkFlows.Add(item); } catch (Exception e) { Log.Debug("Unable to load package" + file, e); } } files = Directory.GetFiles(Settings.Instance.WorkflowFolder, "*.cwxml"); foreach (var file in files) { var fileName = Path.GetFileName(file); try { WorkFlowItem item = new WorkFlowItem() { Workflow = WorkflowManager.Instance.Load(file), IsEditable = true, IsPackage = false, File = file, IsRevertable = File.Exists(Path.Combine(Settings.Instance.DefaultWorkflowFolder, fileName)) }; WorkFlows.Add(item); } catch (Exception e) { Log.Debug("Unable to load package" + file, e); } } }
private void Copy(WorkFlowItem obj) { var workflow = obj.Workflow; workflow.Name = workflow.Name + " Copy"; workflow.Id = Guid.NewGuid().ToString(); WorkflowManager.Instance.Save(workflow, Path.Combine(Settings.Instance.WorkflowFolder, workflow.Id + ".cwxml")); LoadWorkFlows(); }
public static WorkFlowItem GetHeadName() { WorkFlowItem i = new WorkFlowItem(); i.CaseCode = "流水号"; i.ProjectName = "项目简称"; i.FlowName = "流程名称"; i.TaskName = "任务"; i.Title = "主题"; i.FromUser = "******"; i.FromDate = "发件时间"; i.Url = "链接地址"; return(i); }
public WorkFlowItem[] GetAllCase(string type) { if (Session["User"] == null) { WorkFlowItem[] items = new WorkFlowItem[2]; items[0] = WorkFlowItem.GetHeadName(); items[1] = new WorkFlowItem(); items[1].Title = "未登录,不能取得流程清单"; return(items); } if (type == string.Empty) { type = "Begin"; } return(LoadWorkFlowList(((RmsPM.Web.User)Session["User"]).UserCode, type)); }
private void Run(WorkFlowItem obj) { var workFlow = obj.IsPackage ? WorkflowManager.Instance.LoadFromPackage(obj.File) : WorkflowManager.Instance.Load(obj.File); if (workFlow.Views.Count == 0) { MessageBox.Show("No view(s) are defined !"); return; } WorkflowManager.Instance.Context.WorkFlow = workFlow; WorkflowViewView wnd = new WorkflowViewView(); wnd.ShowDialog(); }
public JObject GetPossiblePath(Guid id, string libID) //审批用户获取下一步可能的路径 { WorkFlowItem cwfi = bdb.WorkFlowItems.Where(i => i.WfInstanceId == id).FirstOrDefault(); ItServiceItem cisi = bdb.ItServiceItems.Where(i => i.ID == cwfi.WfBusinessId).FirstOrDefault(); WorkflowApplication wfApp = new WorkflowApplication(new ItService()) { InstanceStore = CreateInstanceStore(), PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) { //var ex = e.GetInstanceExtensions<CustomTrackingParticipant>(); // Outputs = ex.First().Outputs.ToString(); return(PersistableIdleAction.Unload); }, Completed = delegate(WorkflowApplicationCompletedEventArgs e) { }, Aborted = delegate(WorkflowApplicationAbortedEventArgs e) { }, Unloaded = delegate(WorkflowApplicationEventArgs e) { }, OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e) { return(UnhandledExceptionAction.Terminate); }, Idle = delegate(WorkflowApplicationIdleEventArgs e) { } }; var trackerInstance = StateMachineStateTracker.LoadInstance(id, wfApp.WorkflowDefinition, ConfigurationManager.ConnectionStrings["ApacheConnection"].ConnectionString); //var Pt = trackerInstance.PossibleTransitions; var Pt = GetPossibleTransitions(libID, false, cisi.Status); //BookmarkResumptionResult result = wfApp.ResumeBookmark("Hello123", "ddd"); string[] strs = Pt.Split(','); JObject json = new JObject( new JProperty("rows", new JArray( from r in strs select new JObject( new JProperty("ID", r.ToString()), new JProperty("Name", r.ToString()))))); return(json); }
private WorkFlowItem[] LoadWorkFlowList(string usercode, string type) { try { string sql = BuildWorkFlowSqlString(usercode, type); QueryAgent qa = new QueryAgent(); EntityData entity = qa.FillEntityData("WorkFlowAct", sql); qa.Dispose(); DataTable dt = entity.CurrentTable; int rowcount = dt.Rows.Count; WorkFlowItem[] list = new WorkFlowItem[rowcount + 1]; list[0] = WorkFlowItem.GetHeadName(); for (int i = 1; i <= rowcount; i++) { DataRow dr = dt.Rows[i - 1]; list[i] = new WorkFlowItem(); list[i].CaseCode = RmsPM.BLL.WorkFlowRule.GetWorkFlowNumber(dr["CaseCode"].ToString()); //流水号 list[i].ProjectName = RmsPM.BLL.WorkFlowRule.GetWorkFlowCaseProjectName(dr["CaseCode"].ToString()); //项目简称 list[i].FlowName = dr["ProcedureName"].ToString(); //流程名称 list[i].TaskName = dr["ToTaskName"].ToString(); //任务 list[i].Title = RmsPM.BLL.WorkFlowRule.GetWorkFlowCaseTitle(dr["CaseCode"].ToString()); //主题 list[i].FromUser = RmsPM.BLL.SystemRule.GetUserName(dr["FromUserCode"].ToString()); //发件人 list[i].FromDate = RmsPM.BLL.WorkFlowRule.GetFormatExcedableDate(DateTime.Parse(dr["FromDate"].ToString())); //发件时间 string url = dr["ApplicationPath"].ToString() + "?action=Sign"; url += "&CaseCode=" + list[i].CaseCode; url += "&ActCode=" + dr["ActCode"].ToString(); url += "&ApplicationCode=" + dr["ApplicationCode"].ToString(); list[i].Url = url; } entity.Dispose(); return(list); } catch (Exception ex) { WorkFlowItem[] items = new WorkFlowItem[2]; items[0] = WorkFlowItem.GetHeadName(); items[1] = new WorkFlowItem(); items[1].Title = "出现异常,不能取得流程清单"; return(items); } }
private void Revert(WorkFlowItem obj) { if (!obj.IsRevertable) { return; } try { var file = Path.GetFileName(obj.File); File.Copy(Path.Combine(Settings.Instance.DefaultWorkflowFolder, file), obj.File, true); } catch (Exception e) { Log.Debug("Unable to revert", e); MessageBox.Show("Unable to revert workflow."); } LoadWorkFlows(); }
/// <summary> /// 创建第一个任务 /// </summary> /// <param name="task">当前任务Dto</param> /// <returns>业务操作结果</returns> protected OperationResult CreateFirstTask(FlowExecuteDto task) { OperationResult re = CheckFlow(task.FlowId, task.EntityId); if (re.ResultType == OperationResultType.Success) { var firstStep = FlowStepRepository.Entities.Where(c => c.FlowDesignId == task.FlowId && c.StepType == 0).Select(m => new { m.StepId, m.StepName }).SingleOrDefault(); //起始步骤 var flowItemId = CombHelper.NewComb(); var id = CombHelper.NewComb(); WorkFlowTask taskModel = new WorkFlowTask() { Id = id, FlowItemId = flowItemId, PrevStepId = -1, StepId = firstStep.StepId, StepName = firstStep.StepName, SenderId = task.SenderId, SenderName = task.SenderName, ReceiverId = task.SenderId, ReceiverName = task.SenderName, CreatedTime = DateTime.Now, IsComment = false, IsSeal = false, IsArchive = false, Status = 1 }; var model = new WorkFlowItem() { Id = flowItemId, FlowDesignId = task.FlowId, EntityId = task.EntityId, EntityName = task.Title, CreatorUserId = task.SenderId, CreatorUserName = task.SenderName, //StepDay,DelayDay,HandleDay 用触发器保证数据正确性 Status = 0 }; model.Tasks.Add(taskModel); FlowItemRepository.Insert(model); re = new OperationResult(OperationResultType.Success, "流程启动成功!"); //re.Data = taskModel; } return(re); }
public async Task <WorkFlowItem> GetWorkflow(string teamName, string workFlowName) { List <KeyValue> metaData = new List <KeyValue>(); WorkFlowItem workFlowItem = null; JObject result = await InvokeAsync <JObject>(string.Format(Constants.GET_TEAM_WORKFLOW, teamName, workFlowName), Constants.HttpMethod.GET, metaData) .ConfigureAwait(false); if (result != null) { List <string> connectorNames = new List <string>(); workFlowItem = new WorkFlowItem() { Name = result?["Name"].Value <string>(), Description = result?["Description"].Value <string>(), Expression = GetExpression(result?["Expression"] as JObject, connectorNames), }; } return(workFlowItem); }
private void Run(WorkFlowItem obj) { var workFlow = obj.IsPackage ? WorkflowManager.Instance.LoadFromPackage(obj.File) : WorkflowManager.Instance.Load(obj.File); if (File.Exists(Path.Combine(Settings.Instance.DefaultWorkflowFolder, Path.GetFileName(obj.File)))) { var defFile = Path.Combine(Settings.Instance.DefaultWorkflowFolder, Path.GetFileName(obj.File)); var defWorkflow = obj.IsPackage ? WorkflowManager.Instance.LoadFromPackage(defFile) : WorkflowManager.Instance.Load(defFile); if (defWorkflow.GetVersion() > workFlow.GetVersion()) { if (MessageBox.Show("New version is available do you want update the workflow ?", "Warning", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { Revert(obj); workFlow = obj.IsPackage ? WorkflowManager.Instance.LoadFromPackage(obj.File) : WorkflowManager.Instance.Load(obj.File); } } } if (workFlow.Views.Count == 0) { MessageBox.Show("No view(s) are defined !"); return; } ServiceProvider.Instance.DeviceManager.PhotoCaptured -= DeviceManager_PhotoCaptured; WorkflowManager.Instance.Context.WorkFlow = workFlow; WorkflowViewView wnd = new WorkflowViewView(); wnd.ShowDialog(); WorkflowManager.Instance.Context.Clear(); ServiceProvider.Instance.DeviceManager.PhotoCaptured += DeviceManager_PhotoCaptured; }
//Add Data From Linked Tables for Display public void EditItemForDisplay(WorkFlowItem workFlowItem) { //Add Form INfo FormRepository formRepository = new FormRepository(); Form form = new Form(); form = formRepository.GetForm(workFlowItem.FormId); if (form != null) { workFlowItem.FormName = form.FormName; } //Add PolicyGroupName WorkFlowGroupRepository workFlowGroupRepository = new WorkFlowGroupRepository(); WorkFlowGroup workFlowGroup = new WorkFlowGroup(); workFlowGroup = workFlowGroupRepository.GetGroup(workFlowItem.WorkFlowGroupId); if (workFlowGroup != null) { workFlowItem.WorkFlowGroupName = workFlowGroup.WorkFlowGroupName; } }
public static WorkFlowItemDto ToDto(this WorkFlowItem item) { try { var dto = new WorkFlowItemDto { Obj = JsonConvert.DeserializeObject(item.Json, System.Type.GetType(item.Type + "Dto")), Type = item.Type.Insert(item.Type.Length, "Dto"), ParentType = item.ParentType?.Insert(item.ParentType.Length, "Dto"), ParentId = item.ParentId, API = item.API, ObjId = item.ObjId, ApprovalStatus = (ApprovalStatusDto)Enum.Parse(typeof(ApprovalStatusDto), item.ApprovalStatus.ToString(), true) }; ((IData)item).ToDto((IDataDto)dto); return(dto); } catch (Exception ex) { return(null); } }
private void Revert(WorkFlowItem obj) { if (!obj.IsRevertable) { return; } if (MessageBox.Show("If you made any changes, all changes will be reverted !!!\nContinue ?", "Warning", MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes) { return; } try { var file = Path.GetFileName(obj.File); File.Copy(Path.Combine(Settings.Instance.DefaultWorkflowFolder, file), obj.File, true); } catch (Exception e) { Log.Debug("Unable to revert", e); MessageBox.Show("Unable to revert workflow."); } LoadWorkFlows(); }
public ActionResult OpenWorkFlow(Guid id) //用户处理流程 { #region 判断是不是当前处理人 WorkFlowItem cwfi = bdb.WorkFlowItems.Where(i => i.WfInstanceId == id).FirstOrDefault(); string currentUserId = User.Identity.GetUserId(); ApplicationUser user = db.Users.Include(i => i.Roles).FirstOrDefault(i => i.Id == currentUserId); if (cwfi.WfCurrentUser.ToString().Trim() != user.UserName.ToString().Trim()) { var json = new { errorMsg = "你不是当前处理人" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } #endregion var wf = bdb.WorkFlowItems.Where(i => i.WfInstanceId == id).FirstOrDefault(); var bid = wf.WfBusinessId; ViewBag.WfWriteField = wf.WfWriteField; ViewBag.WfFlowChart = wf.WfFlowChart; ViewBag.instanceId = wf.WfInstanceId; ItServiceItem isi = bdb.ItServiceItems.Where(i => i.ID == bid).FirstOrDefault(); return(View(isi)); }
private void ParseWFItem(XmlNode hNode) { WorkFlowItem wfi = new WorkFlowItem(); foreach (XmlAttribute attrib in hNode.Attributes) { switch (attrib.Name) { case "name": wfi.itemName = attrib.Value; break; case "out-name": wfi.outItemName = attrib.Value; break; case "type": wfi.wfiType = attrib.Value; break; case "alt-out-name": wfi.altOutItemName = attrib.Value; break; case "comparator": wfi.comparator = attrib.Value; break; case "script-module": wfi.scriptModule = attrib.Value; break; case "throw-bind-name": wfi.throwBindName = attrib.Value; break; case "catch-name": wfi.catchName = attrib.Value; break; case "end-mode": wfi.endMode = attrib.Value; break; default: Log("New WFI Attrib : {0} = {1}", attrib.Name, attrib.Value); break; } } foreach (XmlNode node in hNode.ChildNodes) { switch (node.Name) { case "display-name": wfi.displayName = node.InnerText; break; case "script": wfi.lines = node.InnerText.Split(new String[] { Environment.NewLine }, StringSplitOptions.None); break; case "in-binding": foreach (XmlNode bNode in node.ChildNodes) { if (bNode.Name == "bind") { String bindName = ""; String bindType = ""; String bindEName = ""; foreach (XmlAttribute bAttr in bNode.Attributes) { switch (bAttr.Name) { case "name": bindName = bAttr.Value; break; case "type": bindType = bAttr.Value; break; case "export-name": bindEName = bAttr.Value; break; } } if (inputs.ContainsKey(bindEName)) { wfi.inputs.Add(bindName, inputs[bindEName]); } else if (attribs.ContainsKey(bindEName)) { wfi.inputs.Add(bindName, attribs[bindEName]); } } } break; case "out-binding": foreach (XmlNode bNode in node.ChildNodes) { if (bNode.Name == "bind") { String bindName = ""; String bindType = ""; String bindEName = ""; foreach (XmlAttribute bAttr in bNode.Attributes) { switch (bAttr.Name) { case "name": bindName = bAttr.Value; break; case "type": bindType = bAttr.Value; break; case "export-name": bindEName = bAttr.Value; break; } } if (inputs.ContainsKey(bindEName)) { wfi.outputs.Add(bindName, inputs[bindEName]); } else if (attribs.ContainsKey(bindEName)) { wfi.outputs.Add(bindName, attribs[bindEName]); } } } break; } } String keyname = wfi.displayName + ":" + wfi.itemName; workitems.Add(wfi.itemName, wfi); itemKeys.Add(keyname, wfi.itemName); }
public async Task <IActionResult> UpdateWorkFlowItem([FromBody] WorkFlowItemEditModel model) { var mapping = new Func <WorkFlow, Task <WorkFlow> >(async(entity) => { var workFlowItems = entity.WorkFlowItems != null ? entity.WorkFlowItems : new List <WorkFlowItem>(); var destGradeIndex = model.FlowGrade; //目的index var originGradeIndex = !string.IsNullOrWhiteSpace(model.Id) ? workFlowItems.First(x => x.Id == model.Id).FlowGrade : 0; //原index if (!string.IsNullOrWhiteSpace(model.Id)) { for (var idx = workFlowItems.Count - 1; idx >= 0; idx--) { var curItem = workFlowItems[idx]; if (destGradeIndex < originGradeIndex) { //上移 /* * 1)自己本身变成destIndex * 2)原items中,大于等于destIndex且小于自己originIndex都加1 */ if (curItem.FlowGrade >= destGradeIndex && curItem.FlowGrade < originGradeIndex) { curItem.FlowGrade += 1; } } else if (destGradeIndex > originGradeIndex) { //下移 /* * 1)自己本身变成destIndex * 2)原items中,大于originIndex且小于等于destIndex都减1 */ if (curItem.FlowGrade > originGradeIndex && curItem.FlowGrade <= destGradeIndex) { curItem.FlowGrade -= 1; } } else { } //以上提到的自己本身index变为destIndex if (curItem.Id == model.Id) { curItem.Name = model.Name; curItem.Description = model.Description; curItem.OperateRoles = model.OperateRoles; curItem.AutoWorkFlow = model.AutoWorkFlow; curItem.FlowGrade = destGradeIndex; curItem.SubWorkFlowId = model.SubWorkFlowId; curItem.Modifier = CurrentAccountId; curItem.ModifiedTime = DateTime.Now; } } } else { var newFlowItem = new WorkFlowItem(); newFlowItem.Id = GuidGen.NewGUID(); newFlowItem.Name = model.Name; newFlowItem.Description = model.Description; newFlowItem.OperateRoles = model.OperateRoles; newFlowItem.AutoWorkFlow = model.AutoWorkFlow; newFlowItem.FlowGrade = workFlowItems.Count; newFlowItem.SubWorkFlowId = model.SubWorkFlowId; newFlowItem.Creator = CurrentAccountId; newFlowItem.Modifier = CurrentAccountId; newFlowItem.CreatedTime = DateTime.Now; newFlowItem.ModifiedTime = newFlowItem.CreatedTime; newFlowItem.WorkFlow = entity; workFlowItems.Add(newFlowItem); } entity.WorkFlowItems = workFlowItems; entity.Modifier = CurrentAccountId; entity.ModifiedTime = DateTime.Now; return(await Task.FromResult(entity)); }); return(await _PutRequest(model.WorkFlowId, mapping, async (data) => { return await Get(data.Id); })); }
/// <summary> /// 创建第一个任务 /// </summary> /// <param name="task">当前任务Dto</param> /// <returns>业务操作结果</returns> protected OperationResult CreateFirstTask(FlowExecuteDto task) { OperationResult re = CheckFlow(task.FlowId, task.EntityId); if (re.ResultType == OperationResultType.Success) { var firstStep = FlowStepRepository.Entities.Where(c => c.FlowDesignId == task.FlowId && c.StepType == 0).Select(m => new { m.StepId,m.StepName}).SingleOrDefault(); //起始步骤 var flowItemId = CombHelper.NewComb(); var id = CombHelper.NewComb(); WorkFlowTask taskModel = new WorkFlowTask() { Id = id, FlowItemId = flowItemId, PrevStepId = -1, StepId = firstStep.StepId, StepName = firstStep.StepName, SenderId = task.SenderId, SenderName=task.SenderName, ReceiverId = task.SenderId, ReceiverName = task.SenderName, CreatedTime=DateTime.Now, IsComment = false, IsSeal = false, IsArchive=false, Status = 1 }; var model = new WorkFlowItem() { Id = flowItemId, FlowDesignId = task.FlowId, EntityId = task.EntityId, EntityName = task.Title, CreatorUserId = task.SenderId, CreatorUserName=task.SenderName, //StepDay,DelayDay,HandleDay 用触发器保证数据正确性 Status = 0 }; model.Tasks.Add(taskModel); FlowItemRepository.Insert(model); re = new OperationResult(OperationResultType.Success, "流程启动成功!"); //re.Data = taskModel; } return re; }
public ActionResult DelWorkFlow(Guid id) //删除流程及业务数据 { if (id != null) { WorkFlowItem wf = bdb.WorkFlowItems.Where(i => i.WfInstanceId == id).FirstOrDefault(); var bid = wf.WfBusinessId; ItServiceItem isi = bdb.ItServiceItems.Where(i => i.ID == bid).FirstOrDefault(); if (wf != null && isi != null) { if (wf.Wfstatus != "已结束") { bdb.WorkFlowItems.Remove(wf); bdb.ItServiceItems.Remove(isi); try { bdb.SaveChanges(); var json = new { okMsg = "删除成功" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } catch { var json = new { errorMsg = "由于数据库或系统原因,删除流程失败" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } } else { var json = new { okMsg = "已结束流程不能删除" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } } else { var json = new { okMsg = "未找到相关流程和业务数据" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } } else { var json = new { okMsg = "数据输入有误" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } }
public ActionResult ToNextState(ItServiceItem isi, Guid instanceId, string NextLink, string libid, string Opinion) //审批者到下一环节,思路:保存当前流程的数据,恢复bookmark到下一环节,并保存下一环节流程信息 { #region 判断是不是当前处理人 WorkFlowItem cwfi = bdb.WorkFlowItems.Where(i => i.WfInstanceId == instanceId).FirstOrDefault(); string currentUserId = User.Identity.GetUserId(); ApplicationUser user = db.Users.Include(i => i.Roles).FirstOrDefault(i => i.Id == currentUserId); if (cwfi.WfCurrentUser.ToString().Trim() != user.UserName.ToString().Trim()) { var json = new { errorMsg = "你不是当前处理人" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } #endregion string[] strs = NextLink.Trim().Split('('); AutoResetEvent syncEvent = new AutoResetEvent(false); int isComplete = 0; WorkflowApplication wfApp = new WorkflowApplication(new ItService()) { InstanceStore = CreateInstanceStore(), PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) { //var ex = e.GetInstanceExtensions<CustomTrackingParticipant>(); // Outputs = ex.First().Outputs.ToString(); return(PersistableIdleAction.Unload); }, Completed = delegate(WorkflowApplicationCompletedEventArgs e) { isComplete = 1; syncEvent.Set(); }, Aborted = delegate(WorkflowApplicationAbortedEventArgs e) { }, Unloaded = delegate(WorkflowApplicationEventArgs e) { syncEvent.Set(); }, OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e) { return(UnhandledExceptionAction.Terminate); }, Idle = delegate(WorkflowApplicationIdleEventArgs e) { } }; var StateTracker = new StateMachineStateTracker(wfApp.WorkflowDefinition); //当前状态追踪 wfApp.Extensions.Add(StateTracker); wfApp.Extensions.Add(new StateTrackerPersistenceProvider(StateTracker)); var cu = new CustomTrackingParticipant(); //获取Activity内部变量 wfApp.Extensions.Add(cu); //获取Activity内部变量需要的追踪器 //Guid instanceId = wfApp.Id; var trackerInstance = StateMachineStateTracker.LoadInstance(instanceId, wfApp.WorkflowDefinition, ConfigurationManager.ConnectionStrings["ApacheConnection"].ConnectionString); wfApp.Load(instanceId); BookmarkResumptionResult result = wfApp.ResumeBookmark(trackerInstance.CurrentState, strs[0]); //BookmarkResumptionResult result = wfApp.ResumeBookmark(trackerInstance.CurrentState, NextLink.Trim()); //恢复当前状态,并进入下一个bookmark,注意使用Trim,开始没使用,NextLInk无法取到,调试了大半夜 syncEvent.WaitOne(); string CurrentUser; string OpinionField = ""; string CurrentState; string completeStr = ""; if (isComplete == 0) { if (strs.Count() == 1) { CurrentUser = cu.Outputs["CurrentUser"].ToString(); } else { CurrentUser = db.LibraryApprovers.ToList().First(p => (p.LibID == libid) && (p.ApproverName == strs[1].Replace(")", ""))).Approver; } OpinionField = cu.Outputs["OpinionField"].ToString(); CurrentState = StateTracker.CurrentState; } else { CurrentUser = "******"; CurrentState = "已结束"; completeStr = "->结束"; } //string currentUserId = User.Identity.GetUserId(); //ApplicationUser user = db.Users.Include(i => i.Roles).FirstOrDefault(i => i.Id == currentUserId); //获取当前用户TrueName,为增加流转信息提供数据 WorkFlowItem wfi = bdb.WorkFlowItems.Where(i => i.WfInstanceId == instanceId).FirstOrDefault(); //获取当前流程信息 ItServiceItem cisi = bdb.ItServiceItems.Where(i => i.ID == isi.ID).FirstOrDefault(); //获取当前业务数据的信息 //业务数据更新开始 cisi.Title = isi.Title; cisi.applicant = isi.applicant; cisi.applicant_dept = isi.applicant_dept; //cisi.description = isi.description; cisi.isitype = isi.isitype; cisi.sub_isitype = isi.sub_isitype; cisi.end_isitype = isi.end_isitype; cisi.Object = isi.Object; cisi.Topic = isi.Topic; cisi.Purpose = isi.Purpose; cisi.Status = 1; if (NextLink == "驳回") { cisi.Status = 3; } if (isComplete == 1) { cisi.isiCompleteDate = DateTime.Now; if (NextLink == "撤销") { cisi.Status = 4; } else { cisi.Status = 2; } } #region 审批意见更新开始 if (Opinion != null) { if (Convert.ToString(Opinion) != "") { if (wfi.WfWriteField.Trim() == "FirstExamine") { cisi.FirstExamine = cisi.FirstExamine + "<br>" + Opinion + " (意见填写人:" + user.TrueName + " 时间:" + DateTime.Now + ")"; } if (wfi.WfWriteField.Trim() == "SecondExamine") { cisi.SecondExamine = cisi.SecondExamine + "<br>" + Opinion + " (意见填写人:" + user.TrueName + " 时间:" + DateTime.Now + ")"; } if (wfi.WfWriteField.Trim() == "LastExamine") { cisi.LastExamine = cisi.LastExamine + "<br>" + Opinion + " (意见填写人:" + user.TrueName + " 时间:" + DateTime.Now + ")"; } } } #endregion if (wfi != null) { wfi.WfCurrentUser = CurrentUser; wfi.Wfstatus = CurrentState; wfi.WfWriteField = OpinionField; if (isComplete == 1) { wfi.WfCompleteDate = DateTime.Now; } wfi.WfFlowChart = wfi.WfFlowChart + "->" + trackerInstance.CurrentState + "(" + user.TrueName + ")" + completeStr; //增加流转信息 try { bdb.SaveChanges(); var json = new { okMsg = "提交成功" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } catch (Exception e) { var json = new { errorMsg = "提交失败" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } } else { var json = new { errorMsg = "流程不存在" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } }
public ActionResult DrafterToNextState(ItServiceItem isi, Guid instanceId, string NextLink, string libid) //起草者到下一环节 { string[] strs = NextLink.Trim().Split('('); AutoResetEvent syncEvent = new AutoResetEvent(false); WorkflowApplication wfApp = new WorkflowApplication(new ItService()) { InstanceStore = CreateInstanceStore(), PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) { //var ex = e.GetInstanceExtensions<CustomTrackingParticipant>(); // Outputs = ex.First().Outputs.ToString();` return(PersistableIdleAction.Unload); }, Completed = delegate(WorkflowApplicationCompletedEventArgs e) { }, Aborted = delegate(WorkflowApplicationAbortedEventArgs e) { }, Unloaded = delegate(WorkflowApplicationEventArgs e) { syncEvent.Set(); }, OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e) { return(UnhandledExceptionAction.Terminate); }, Idle = delegate(WorkflowApplicationIdleEventArgs e) { } }; var StateTracker = new StateMachineStateTracker(wfApp.WorkflowDefinition); //当前状态追踪 wfApp.Extensions.Add(StateTracker); wfApp.Extensions.Add(new StateTrackerPersistenceProvider(StateTracker)); var cu = new CustomTrackingParticipant(); //获取Activity内部变量 wfApp.Extensions.Add(cu); //获取Activity内部变量需要的追踪器 //Guid instanceId = wfApp.Id; var trackerInstance = StateMachineStateTracker.LoadInstance(instanceId, wfApp.WorkflowDefinition, ConfigurationManager.ConnectionStrings["ApacheConnection"].ConnectionString); wfApp.Load(instanceId); //BookmarkResumptionResult result = wfApp.ResumeBookmark(trackerInstance.CurrentState, NextLink.Trim()); BookmarkResumptionResult result = wfApp.ResumeBookmark(trackerInstance.CurrentState, strs[0]); syncEvent.WaitOne(); //string CurrentUser = cu.Outputs["CurrentUser"].ToString(); string CurrentUser = db.LibraryApprovers.ToList().First(p => (p.LibID == libid) && (p.ApproverName == strs[1].Replace(")", ""))).Approver; //string CurrentRole = cu.Outputs["CurrentRole"].ToString(); string OpinionField = cu.Outputs["OpinionField"].ToString(); string Drafter = cu.Outputs["Drafter"].ToString(); var CurrentState = StateTracker.CurrentState; //var Pt = StateTracker.PossibleTransitions; ApplicationUser user = db.Users.Include(i => i.Roles).FirstOrDefault(i => i.UserName == Drafter); //获取当前用户username isi.drafter = Drafter; isi.isiCreateDate = DateTime.Now; isi.Status = 1; bdb.ItServiceItems.Add(isi); //添加业务数据 try { bdb.SaveChanges(); } catch { var json = new { errorMsg = "添加业务数据出错" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } WorkFlowItem wf = new WorkFlowItem(); wf.WfInstanceId = instanceId; wf.WfType = "专病库IT服务申请"; wf.WfCurrentUser = CurrentUser; wf.WfDrafter = Drafter; wf.WfWriteField = OpinionField; wf.Wfstatus = CurrentState; wf.WfBussinessUrl = "/ItService/OpenWorkFlow?id=" + instanceId; wf.WfCreateDate = DateTime.Now; wf.WfBusinessId = isi.ID; //添加业务数据关联 wf.WfFlowChart = trackerInstance.CurrentState + "(" + user.TrueName + ")"; bdb.WorkFlowItems.Add(wf); bdb.SaveChanges(); try { bdb.SaveChanges(); var json = new { okMsg = "流程保存成功" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } catch { var json = new { errorMsg = "流程保存出错" }; return(Json(json, "text/html", JsonRequestBehavior.AllowGet)); } }