/// <summary> /// 节点审核 /// </summary> /// <param name="instanceId"></param> /// <returns></returns> public async Task <bool> NodeVerification(string instanceId, Tag tag) { FlowinstanceEntity flowInstance = GetForm(instanceId).Result; FlowInstanceOperationHistory flowInstanceOperationHistory = new FlowInstanceOperationHistory { F_Id = Utils.GuId(), F_InstanceId = instanceId, F_CreatorUserId = tag.UserId, F_CreatorUserName = tag.UserName, F_CreatorTime = DateTime.Now };//操作记录 FlowRuntime wfruntime = new FlowRuntime(flowInstance); uniwork.BeginTrans(); #region 会签 if (flowInstance.F_ActivityType == 0)//当前节点是会签节点 { //会签时的【当前节点】一直是会签开始节点 //TODO: 标记会签节点的状态,这个地方感觉怪怪的 wfruntime.MakeTagNode(wfruntime.currentNodeId, tag); string canCheckId = ""; //寻找当前登录用户可审核的节点Id foreach (string fromForkStartNodeId in wfruntime.FromNodeLines[wfruntime.currentNodeId].Select(u => u.to)) { var fromForkStartNode = wfruntime.Nodes[fromForkStartNodeId]; //与会前开始节点直接连接的节点 canCheckId = GetOneForkLineCanCheckNodeId(fromForkStartNode, wfruntime, tag); if (!string.IsNullOrEmpty(canCheckId)) { break; } } if (canCheckId == "") { throw (new Exception("审核异常,找不到审核节点")); } flowInstanceOperationHistory.F_Content = "【" + wfruntime.Nodes[canCheckId].name + "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "】" + (tag.Taged == 1 ? "同意" : "不同意") + ",备注:" + tag.Description; wfruntime.MakeTagNode(canCheckId, tag); //标记审核节点状态 string res = wfruntime.NodeConfluence(canCheckId, tag); if (res == TagState.No.ToString("D")) { flowInstance.F_IsFinish = 3; } else if (!string.IsNullOrEmpty(res)) { flowInstance.F_PreviousId = flowInstance.F_ActivityId; flowInstance.F_ActivityId = wfruntime.nextNodeId; flowInstance.F_ActivityType = wfruntime.nextNodeType; flowInstance.F_ActivityName = wfruntime.nextNode.name; flowInstance.F_IsFinish = (wfruntime.nextNodeType == 4 ? 1 : 0); flowInstance.F_MakerList = (wfruntime.nextNodeType == 4 ? "" : GetNextMakers(wfruntime)); await AddTransHistory(wfruntime); } else { //会签过程中,需要更新用户 flowInstance.F_MakerList = GetForkNodeMakers(wfruntime, wfruntime.currentNodeId); await AddTransHistory(wfruntime); } } #endregion 会签 #region 一般审核 else { wfruntime.MakeTagNode(wfruntime.currentNodeId, tag); if (tag.Taged == (int)TagState.Ok) { flowInstance.F_PreviousId = flowInstance.F_ActivityId; flowInstance.F_ActivityId = wfruntime.nextNodeId; flowInstance.F_ActivityType = wfruntime.nextNodeType; flowInstance.F_ActivityName = wfruntime.nextNode.name; flowInstance.F_MakerList = wfruntime.nextNodeType == 4 ? "" : GetNextMakers(wfruntime); flowInstance.F_IsFinish = (wfruntime.nextNodeType == 4 ? 1 : 0); await AddTransHistory(wfruntime); } else { flowInstance.F_IsFinish = 3; //表示该节点不同意 } flowInstanceOperationHistory.F_Content = "【" + wfruntime.currentNode.name + "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "】" + (tag.Taged == 1 ? "同意" : "不同意") + ",备注:" + tag.Description; } #endregion 一般审核 wfruntime.RemoveNode(wfruntime.nextNodeId); flowInstance.F_SchemeContent = wfruntime.ToSchemeObj().ToJson(); await uniwork.Update(flowInstance); await uniwork.Insert(flowInstanceOperationHistory); MessageEntity msg = new MessageEntity(); msg.F_CreatorUserName = currentuser.UserName; msg.F_EnabledMark = true; if (flowInstance.F_IsFinish == 1) { msg.F_MessageInfo = flowInstance.F_CustomName + "--流程已完成"; var module = uniwork.IQueryable <ModuleEntity>(a => a.F_EnCode == className.Substring(0, className.Length - 7)).FirstOrDefault(); msg.F_Href = module.F_UrlAddress; msg.F_HrefTarget = module.F_Target; msg.F_ToUserId = flowInstance.F_CreatorUserId; msg.F_ClickRead = true; msg.F_KeyValue = flowInstance.F_Id; } else if (flowInstance.F_IsFinish == 3) { msg.F_MessageInfo = flowInstance.F_CustomName + "--流程已终止"; var module = uniwork.IQueryable <ModuleEntity>(a => a.F_EnCode == className.Substring(0, className.Length - 7)).FirstOrDefault(); msg.F_Href = module.F_UrlAddress; msg.F_HrefTarget = module.F_Target; var makerList = uniwork.IQueryable <FlowInstanceOperationHistory>(a => a.F_InstanceId == flowInstance.F_Id && a.F_CreatorUserId != currentuser.UserId).Select(a => a.F_CreatorUserId).Distinct().ToList(); msg.F_ToUserId = flowInstance.F_CreatorUserId; msg.F_ClickRead = true; msg.F_KeyValue = flowInstance.F_Id; } else { msg.F_MessageInfo = flowInstance.F_CustomName + "--流程待处理"; var module = uniwork.IQueryable <ModuleEntity>(a => a.F_EnCode == className.Substring(0, className.Length - 7)).FirstOrDefault(); msg.F_Href = module.F_UrlAddress.Remove(module.F_UrlAddress.Length - 5, 5) + "ToDoFlow"; msg.F_HrefTarget = module.F_Target; msg.F_ToUserId = flowInstance.F_MakerList == "1" ? "" : flowInstance.F_MakerList; msg.F_ClickRead = false; msg.F_KeyValue = flowInstance.F_Id; } msg.F_MessageType = 2; var lastmsg = uniwork.IQueryable <MessageEntity>(a => a.F_ClickRead == false && a.F_KeyValue == flowInstance.F_Id).OrderByDesc(a => a.F_CreatorTime).FirstOrDefault(); if (lastmsg != null && uniwork.IQueryable <MessageHistoryEntity>(a => a.F_MessageId == lastmsg.F_Id).Count() == 0) { await messageApp.ReadMsgForm(lastmsg.F_Id); } await messageApp.SubmitForm(msg); uniwork.Commit(); wfruntime.NotifyThirdParty(_httpClientFactory.CreateClient(), tag); return(true); }
/// <summary> /// 驳回 /// 如果NodeRejectStep不为空,优先使用;否则按照NodeRejectType驳回 /// </summary> /// <returns></returns> public async Task <bool> NodeReject(VerificationExtend reqest) { var user = currentuser; FlowinstanceEntity flowInstance = await GetForm(reqest.F_FlowInstanceId); FlowRuntime wfruntime = new FlowRuntime(flowInstance); string resnode = ""; resnode = string.IsNullOrEmpty(reqest.NodeRejectStep) ? wfruntime.RejectNode(reqest.NodeRejectType) : reqest.NodeRejectStep; var tag = new Tag { Description = reqest.F_VerificationOpinion, Taged = (int)TagState.Reject, UserId = user.UserId, UserName = user.UserName }; wfruntime.MakeTagNode(wfruntime.currentNodeId, tag); flowInstance.F_IsFinish = 4;//4表示驳回(需要申请者重新提交表单) uniwork.BeginTrans(); if (resnode != "") { wfruntime.RemoveNode(resnode); flowInstance.F_SchemeContent = wfruntime.ToSchemeObj().ToJson(); flowInstance.F_ActivityId = resnode; var prruntime = new FlowRuntime(flowInstance); prruntime.MakeTagNode(prruntime.currentNodeId, tag); flowInstance.F_PreviousId = prruntime.previousId; flowInstance.F_ActivityType = prruntime.GetNodeType(resnode); flowInstance.F_ActivityName = prruntime.Nodes[resnode].name; if (resnode == wfruntime.startNodeId) { flowInstance.F_MakerList = flowInstance.F_CreatorUserId; } else { flowInstance.F_MakerList = await uniwork.IQueryable <FlowInstanceTransitionHistory>(a => a.F_FromNodeId == resnode && a.F_ToNodeId == prruntime.nextNodeId).OrderByDesc(a => a.F_CreatorTime).Select(a => a.F_CreatorUserId).FirstAsync();//当前节点可执行的人信息 } await AddRejectTransHistory(wfruntime, prruntime); await repository.Update(flowInstance); } await uniwork.Insert(new FlowInstanceOperationHistory { F_Id = Utils.GuId(), F_InstanceId = reqest.F_FlowInstanceId , F_CreatorUserId = user.UserId , F_CreatorUserName = user.UserName , F_CreatorTime = DateTime.Now , F_Content = "【" + wfruntime.currentNode.name + "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "】驳回,备注:" + reqest.F_VerificationOpinion }); MessageEntity msg = new MessageEntity(); if (resnode == wfruntime.startNodeId) { msg.F_MessageInfo = flowInstance.F_CustomName + "--流程驳回"; var module = uniwork.IQueryable <ModuleEntity>(a => a.F_EnCode == className.Substring(0, className.Length - 7)).FirstOrDefault(); msg.F_Href = module.F_UrlAddress; msg.F_HrefTarget = module.F_Target; msg.F_ToUserId = flowInstance.F_CreatorUserId; msg.F_ToUserName = flowInstance.F_CreatorUserName; msg.F_ClickRead = true; msg.F_KeyValue = flowInstance.F_Id; } else { msg.F_MessageInfo = flowInstance.F_CustomName + "--流程待处理"; var module = uniwork.IQueryable <ModuleEntity>(a => a.F_EnCode == className.Substring(0, className.Length - 7)).FirstOrDefault(); msg.F_Href = module.F_UrlAddress.Remove(module.F_UrlAddress.Length - 5, 5) + "ToDoFlow"; msg.F_HrefTarget = module.F_Target; msg.F_ToUserId = flowInstance.F_MakerList == "1" ? "" : flowInstance.F_MakerList; msg.F_ClickRead = false; msg.F_KeyValue = flowInstance.F_Id; } msg.F_CreatorUserName = currentuser.UserName; msg.F_EnabledMark = true; msg.F_MessageType = 2; var lastmsg = uniwork.IQueryable <MessageEntity>(a => a.F_ClickRead == false && a.F_KeyValue == flowInstance.F_Id).OrderByDesc(a => a.F_CreatorTime).FirstOrDefault(); if (lastmsg != null && uniwork.IQueryable <MessageHistoryEntity>(a => a.F_MessageId == lastmsg.F_Id).Count() == 0) { await messageApp.ReadMsgForm(lastmsg.F_Id); } await messageApp.SubmitForm(msg); uniwork.Commit(); wfruntime.NotifyThirdParty(_httpClientFactory.CreateClient(), tag); return(true); }