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}