🔄refactor: 重构驳回的逻辑

This commit is contained in:
yubaolee
2026-06-12 01:50:47 +08:00
parent 0340fb224f
commit a222959efe

View File

@@ -596,8 +596,11 @@ namespace OpenAuth.App.Flow
#region
/// <summary>
/// 寻找下一步的执行人
/// 一般用于本节点审核完成后,修改流程实例的当前执行人,可以做到通知等功能
/// 计算流程推进到下一步的执行人
/// <para>创建流程实例Add新建流程后计算第一个审批人</para>
/// <para>网关审批完成VerifyGatewayStart网关结束后推进到下一节点</para>
/// <para>普通节点审批通过VerifyNode审批同意后推进到下一节点</para>
/// <para>启动草稿流程Start草稿变为运行状态计算下一执行人</para>
/// </summary>
/// <returns></returns>
public string GetNextMakers(NodeDesignateReq request = null)
@@ -636,9 +639,7 @@ namespace OpenAuth.App.Flow
throw new Exception("前端提交的节点权限类型异常,请检查流程");
}
var revelanceApp = AutofacContainerModule.GetService<RevelanceManagerApp>();
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<ISqlSugarClient>();
var result = sugarClient.Ado.SqlQuery<string>(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;
}
/// <summary>
/// 获取节点审批人
/// <para>回退/查询"场景,回答"这个节点设计时配了谁来审"</para>
/// <para>驳回到指定节点RejectNode流程被驳回时需要重新计算目标节点的审批人</para>
/// <para>召回流程ReCall将流程撤回到开始节点用创建人ID算出审批人</para>
/// <para>撤销审批UndoVerification恢复上一个节点的审批人</para>
/// <para>网关分支中查找可审核节点GetOneForkLineCanCheckNodeId遍历分支判断当前用户是否有权审核</para>
/// <para>网关分支获取审核者GetOneForkLineMakers找到分支线上下一个待审人</para>
/// </summary>
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<UserManagerApp>();
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<OrgManagerApp>();
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;
}
/// <summary>
/// 根据指定类型和指定数据解析审批人列表(公共辅助方法)
/// </summary>
/// <param name="designateType">节点指定类型</param>
/// <param name="designateData">节点指定数据</param>
/// <returns>审批人列表字符串</returns>
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<RevelanceManagerApp>();
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<ISqlSugarClient>();
var result = sugarClient.Ado.SqlQuery<string>(sql);
makerList = GenericHelpers.ArrayToString(result, makerList);
}
return makerList;
}
/// <summary>
/// 计算多实例、会签节点的执行人
/// </summary>
@@ -777,57 +868,6 @@ namespace OpenAuth.App.Flow
return GenericHelpers.ArrayToString(makerList, "");
}
/// <summary>
/// 这里专门处理由前端选择相关的节点执行人
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
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<RevelanceManagerApp>();
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<ISqlSugarClient>();
var result = sugarClient.Ado.SqlQuery<string>(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;
}
/// <summary>
/// 替换SQL中的权限占位符
/// <para>如当前用户的全部下属select id from sysuser where parentId = {loginUser}</para>