mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2026-06-23 00:52:07 +08:00
🔄refactor: 重构驳回的逻辑
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user