/// <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);
        }