diff --git a/OpenAuth.App/Flow/FlowRuntime.cs b/OpenAuth.App/Flow/FlowRuntime.cs index 50d6f9f5..36f19fc4 100644 --- a/OpenAuth.App/Flow/FlowRuntime.cs +++ b/OpenAuth.App/Flow/FlowRuntime.cs @@ -596,8 +596,11 @@ namespace OpenAuth.App.Flow #region 获取节点审批人 /// - /// 寻找下一步的执行人 - /// 一般用于本节点审核完成后,修改流程实例的当前执行人,可以做到通知等功能 + /// 计算流程推进到下一步时的执行人 + /// 创建流程实例(Add):新建流程后计算第一个审批人 + /// 网关审批完成(VerifyGatewayStart):网关结束后推进到下一节点 + /// 普通节点审批通过(VerifyNode):审批同意后推进到下一节点 + /// 启动草稿流程(Start):草稿变为运行状态,计算下一执行人 /// /// public string GetNextMakers(NodeDesignateReq request = null) @@ -636,9 +639,7 @@ namespace OpenAuth.App.Flow throw new Exception("前端提交的节点权限类型异常,请检查流程"); } - var revelanceApp = AutofacContainerModule.GetService(); - var users = revelanceApp.Get(Define.USERROLE, false, request.NodeDesignates); - makerList = GenericHelpers.ArrayToString(users, makerList); + makerList = ResolveDesignateUsers(Define.SPECIAL_ROLE, request.NodeDesignates); } else if (nextNode.setInfo.NodeDesignate == Define.RUNTIME_SPECIAL_USER) { @@ -648,7 +649,7 @@ namespace OpenAuth.App.Flow throw new Exception("前端提交的节点权限类型异常,请检查流程"); } - makerList = GenericHelpers.ArrayToString(request.NodeDesignates, makerList); + makerList = ResolveDesignateUsers(Define.SPECIAL_USER, request.NodeDesignates); } else if (nextNode.setInfo.NodeDesignate == Define.SPECIAL_SQL) { @@ -658,10 +659,7 @@ namespace OpenAuth.App.Flow throw new Exception("前端提交的节点权限类型异常,请检查流程"); } - var sql = ReplaceSql(nextNode.setInfo.NodeDesignateData.datas[0]); - var sugarClient = AutofacContainerModule.GetService(); - var result = sugarClient.Ado.SqlQuery(sql); - makerList = GenericHelpers.ArrayToString(result, makerList); + makerList = ResolveDesignateUsers(Define.SPECIAL_SQL, nextNode.setInfo.NodeDesignateData.datas); } else if (nextNode.setInfo.NodeDesignate == Define.RUNTIME_PARENT || nextNode.setInfo.NodeDesignate == Define.RUNTIME_MANY_PARENTS) @@ -708,6 +706,99 @@ namespace OpenAuth.App.Flow return makerList; } + /// + /// 获取节点审批人 + /// 回退/查询"场景,回答"这个节点设计时配了谁来审" + /// 驳回到指定节点(RejectNode):流程被驳回时,需要重新计算目标节点的审批人 + /// 召回流程(ReCall):将流程撤回到开始节点,用创建人ID算出审批人 + /// 撤销审批(UndoVerification):恢复上一个节点的审批人 + /// 网关分支中查找可审核节点(GetOneForkLineCanCheckNodeId):遍历分支判断当前用户是否有权审核 + /// 网关分支获取审核者(GetOneForkLineMakers):找到分支线上下一个待审人 + /// + public string GetNodeMarkers(FlowNode node, string flowinstanceCreateUserId = "") + { + string makerList = ""; + if (node.type == Define.NODE_TYPE_START && (!string.IsNullOrEmpty(flowinstanceCreateUserId))) //如果是开始节点,通常情况下是驳回到开始了 + { + makerList = flowinstanceCreateUserId; + } + else if (node.setInfo != null) + { + if (node.setInfo.NodeDesignate == Define.RUNTIME_SPECIAL_ROLE + || node.setInfo.NodeDesignate == Define.RUNTIME_SPECIAL_USER) + { + //如果是运行时选定的用户,则暂不处理。由上个节点审批时选定 + } + else if (node.setInfo.NodeDesignate == Define.RUNTIME_PARENT + || node.setInfo.NodeDesignate == Define.RUNTIME_MANY_PARENTS) + { + //驳回/撤销场景:找到目标节点的前一个节点的执行人,以其为基准计算直属上级 + var preNode = GetPreNode(node.id); + var preNodeUserId = preNode.setInfo?.UserId; + if (!string.IsNullOrEmpty(preNodeUserId)) + { + var userManagerApp = AutofacContainerModule.GetService(); + var parentId = userManagerApp.GetParent(preNodeUserId); + if (!StringExtension.IsNullOrEmpty(parentId)) + { + makerList = GenericHelpers.ArrayToString(new[] { parentId }, makerList); + } + } + } + else if (node.setInfo.NodeDesignate == Define.RUNTIME_CHAIRMAN) + { + //驳回/撤销场景:获取发起人的部门负责人 + var orgManagerApp = AutofacContainerModule.GetService(); + var chairmanIds = orgManagerApp.GetChairmanId(node.setInfo.NodeDesignateData?.datas); + makerList = GenericHelpers.ArrayToString(chairmanIds, makerList); + } + else + { + makerList = ResolveDesignateUsers(node.setInfo.NodeDesignate, node.setInfo.NodeDesignateData?.datas); + } + } + else //如果没有设置节点信息,属于流程设计异常 + { + throw new Exception($"节点【{node.name}】未设置审批人信息,请检查流程设计!"); + } + + return makerList; + } + + /// + /// 根据指定类型和指定数据解析审批人列表(公共辅助方法) + /// + /// 节点指定类型 + /// 节点指定数据 + /// 审批人列表字符串 + private string ResolveDesignateUsers(string designateType, string[] designateData) + { + string makerList = ""; + if (string.IsNullOrEmpty(designateType) || designateType == Define.ALL_USER) //所有成员 + { + makerList = "1"; + } + else if (designateType == Define.SPECIAL_USER) //指定成员 + { + makerList = GenericHelpers.ArrayToString(designateData, makerList); + } + else if (designateType == Define.SPECIAL_ROLE) //指定角色 + { + var revelanceApp = AutofacContainerModule.GetService(); + var users = revelanceApp.Get(Define.USERROLE, false, designateData); + makerList = GenericHelpers.ArrayToString(users, makerList); + } + else if (designateType == Define.SPECIAL_SQL) //指定SQL + { + var sql = ReplaceSql(designateData[0]); + var sugarClient = AutofacContainerModule.GetService(); + var result = sugarClient.Ado.SqlQuery(sql); + makerList = GenericHelpers.ArrayToString(result, makerList); + } + + return makerList; + } + /// /// 计算多实例、会签节点的执行人 /// @@ -777,57 +868,6 @@ namespace OpenAuth.App.Flow return GenericHelpers.ArrayToString(makerList, ""); } - /// - /// 这里专门处理由前端选择相关的节点执行人 - /// - /// - /// - public string GetNodeMarkers(FlowNode node, string flowinstanceCreateUserId = "") - { - string makerList = ""; - if (node.type == Define.NODE_TYPE_START && (!string.IsNullOrEmpty(flowinstanceCreateUserId))) //如果是开始节点,通常情况下是驳回到开始了 - { - makerList = flowinstanceCreateUserId; - } - else if (node.setInfo != null) - { - if (string.IsNullOrEmpty(node.setInfo.NodeDesignate) || - node.setInfo.NodeDesignate == Define.ALL_USER) //所有成员 - { - makerList = "1"; - } - else if (node.setInfo.NodeDesignate == Define.SPECIAL_USER) //指定成员 - { - makerList = GenericHelpers.ArrayToString(node.setInfo.NodeDesignateData.datas, makerList); - } - else if (node.setInfo.NodeDesignate == Define.SPECIAL_ROLE) //指定角色 - { - var revelanceApp = AutofacContainerModule.GetService(); - var users = revelanceApp.Get(Define.USERROLE, false, node.setInfo.NodeDesignateData.datas); - makerList = GenericHelpers.ArrayToString(users, makerList); - } - else if (node.setInfo.NodeDesignate == Define.SPECIAL_SQL) //指定SQL - { - //如果是指定SQL,则需要执行SQL,并返回结果 - var sql = ReplaceSql(node.setInfo.NodeDesignateData.datas[0]); - var sugarClient = AutofacContainerModule.GetService(); - var result = sugarClient.Ado.SqlQuery(sql); - makerList = GenericHelpers.ArrayToString(result, makerList); - } - else if (node.setInfo.NodeDesignate == Define.RUNTIME_SPECIAL_ROLE - || node.setInfo.NodeDesignate == Define.RUNTIME_SPECIAL_USER) - { - //如果是运行时选定的用户,则暂不处理。由上个节点审批时选定 - } - } - else //如果没有设置节点信息,默认所有人都可以审核 - { - makerList = "1"; - } - - return makerList; - } - /// /// 替换SQL中的权限占位符 /// 如当前用户的全部下属:select id from sysuser where parentId = {loginUser}