fix: 修复顺序审批时,节点审批人为全部加签的异常

This commit is contained in:
wintel
2025-04-19 00:31:19 +08:00
parent d5249d8cb3
commit 263ff70f26
3 changed files with 254 additions and 80 deletions

View File

@@ -6,86 +6,246 @@
public static class Define
{
//Relevance关联KEY
public static string USERROLE = "UserRole"; //用户角色关联KEY
public const string ROLERESOURCE = "RoleResource"; //角色资源关联KEY
public const string USERORG = "UserOrg"; //用户机构关联KEY
public const string ROLEELEMENT = "RoleElement"; //角色菜单关联KEY
public const string ROLEMODULE = "RoleModule"; //角色模块关联KEY
public const string ROLEDATAPROPERTY = "RoleDataProperty"; //角色数据字段权限
public const string MODULEPRINTERPLAN = "ModulePrinterPlan"; //模块配置打印方案
public const string MODULE_FLOWSCHEME = "ModuleFlowScheme"; //模块挂载流程模板
/// <summary>
/// 用户角色关联KEY
/// </summary>
public static string USERROLE = "UserRole";
/// <summary>
/// 角色资源关联KEY
/// </summary>
public const string ROLERESOURCE = "RoleResource";
/// <summary>
/// 用户机构关联KEY
/// </summary>
public const string USERORG = "UserOrg";
/// <summary>
/// 角色菜单关联KEY
/// </summary>
public const string ROLEELEMENT = "RoleElement";
/// <summary>
/// 角色模块关联KEY
/// </summary>
public const string ROLEMODULE = "RoleModule";
/// <summary>
/// 角色数据字段权限
/// </summary>
public const string ROLEDATAPROPERTY = "RoleDataProperty";
/// <summary>
/// 模块配置打印方案
/// </summary>
public const string MODULEPRINTERPLAN = "ModulePrinterPlan";
/// <summary>
/// 模块挂载流程模板
/// </summary>
public const string MODULE_FLOWSCHEME = "ModuleFlowScheme";
//数据库类型
public const string DBTYPE_SQLSERVER = "SqlServer"; //sql server
public const string DBTYPE_MYSQL = "MySql"; //mysql
public const string DBTYPE_PostgreSQL = "PostgreSQL"; //PostgreSQL
public const string DBTYPE_ORACLE = "Oracle"; //oracle
/// <summary>
/// 数据库类型SQL Server
/// </summary>
public const string DBTYPE_SQLSERVER = "SqlServer";
public const int INVALID_TOKEN = 50014; //token无效
/// <summary>
/// 数据库类型MySQL
/// </summary>
public const string DBTYPE_MYSQL = "MySql";
/// <summary>
/// 数据库类型PostgreSQL
/// </summary>
public const string DBTYPE_PostgreSQL = "PostgreSQL";
/// <summary>
/// 数据库类型Oracle
/// </summary>
public const string DBTYPE_ORACLE = "Oracle";
/// <summary>
/// Token无效错误码50014
/// </summary>
public const int INVALID_TOKEN = 50014;
/// <summary>
/// Token名称用于HTTP请求头
/// </summary>
public const string TOKEN_NAME = "X-Token";
/// <summary>
/// 租户ID标识
/// </summary>
public const string TENANT_ID = "tenantId";
/// <summary>
/// 系统用户名
/// </summary>
public const string SYSTEM_USERNAME = "System";
/// <summary>
/// 系统用户默认密码
/// </summary>
public const string SYSTEM_USERPWD = "123456";
public const string DATAPRIVILEGE_LOGINUSER = "{loginUser}"; //数据权限配置中当前登录用户的key
public const string DATAPRIVILEGE_LOGINROLE = "{loginRole}"; //数据权限配置中,当前登录用户角色的key
public const string DATAPRIVILEGE_LOGINORG = "{loginOrg}"; //数据权限配置中当前登录用户部门的key
/// <summary>
/// 数据权限配置中当前登录用户的key
/// </summary>
public const string DATAPRIVILEGE_LOGINUSER = "{loginUser}";
/// <summary>
/// 数据权限配置中当前登录用户角色的key
/// </summary>
public const string DATAPRIVILEGE_LOGINROLE = "{loginRole}";
/// <summary>
/// 数据权限配置中当前登录用户部门的key
/// </summary>
public const string DATAPRIVILEGE_LOGINORG = "{loginOrg}";
/// <summary>
/// 任务调度映射键
/// </summary>
public const string JOBMAPKEY = "OpenJob";
/// <summary>
/// 默认表单实例ID字段名
/// </summary>
public const string DEFAULT_FORM_INSTANCE_ID_NAME = "InstanceId";
//表单类型
public const int FORM_TYPE_DYNAMIC = 0; //动态表单
public const int FORM_TYPE_DEVELOP = 1; //自定义表单
public const int FORM_TYPE_DRAG = 2; //vForm拖拽表单
public const int FORM_TYPE_URL = 3; //URL表单
/// <summary>
/// 表单类型:动态表单(0)
/// </summary>
public const int FORM_TYPE_DYNAMIC = 0;
/// <summary>
/// 表单类型:自定义表单(1)
/// </summary>
public const int FORM_TYPE_DEVELOP = 1;
/// <summary>
/// 表单类型vForm拖拽表单(2)
/// </summary>
public const int FORM_TYPE_DRAG = 2;
/// <summary>
/// 表单类型URL表单(3)
/// </summary>
public const int FORM_TYPE_URL = 3;
//节点类型
public const string NODE_TYPE_START = "start"; //开始节点
public const string NODE_TYPE_END = "end"; //结束节点
public const string NODE_TYPE_TASK = "node"; //任务节点
public const string NODE_TYPE_FORK = "fork"; //网关开始
public const string NODE_TYPE_JOIN = "join"; //网关结束
public const string NODE_TYPE_MULTI_INSTANCE = "multiInstance"; //多实例、会签节点
/// <summary>
/// 节点类型:开始节点
/// </summary>
public const string NODE_TYPE_START = "start";
//流程实例知会用户
/// <summary>
/// 节点类型:结束节点
/// </summary>
public const string NODE_TYPE_END = "end";
/// <summary>
/// 节点类型:任务节点
/// </summary>
public const string NODE_TYPE_TASK = "node";
/// <summary>
/// 节点类型:网关开始
/// </summary>
public const string NODE_TYPE_FORK = "fork";
/// <summary>
/// 节点类型:网关结束
/// </summary>
public const string NODE_TYPE_JOIN = "join";
/// <summary>
/// 节点类型:多实例、会签节点
/// </summary>
public const string NODE_TYPE_MULTI_INSTANCE = "multiInstance";
/// <summary>
/// 流程实例知会用户
/// </summary>
public const string INSTANCE_NOTICE_USER = "INSTANCE_NOTICE_USER";
//流程实例知会角色
/// <summary>
/// 流程实例知会角色
/// </summary>
public const string INSTANCE_NOTICE_ROLE = "INSTANCE_NOTICE_ROLE";
//流程节点执行权限类型
public const string ALL_USER = "ALL_USER"; //所有用户
public const string SPECIAL_ROLE = "SPECIAL_ROLE"; //指定角色
public const string SPECIAL_USER = "SPECIAL_USER"; //指定用户
public const string SPECIAL_SQL = "SPECIAL_SQL"; //指定SQL
/// <summary>
/// 流程节点执行权限类型:所有用户
/// </summary>
public const string ALL_USER = "ALL_USER";
/// <summary>
/// 流程节点执行权限类型:指定角色
/// </summary>
public const string SPECIAL_ROLE = "SPECIAL_ROLE";
/// <summary>
/// 流程节点执行权限类型:指定用户
/// </summary>
public const string SPECIAL_USER = "SPECIAL_USER";
/// <summary>
/// 流程节点执行权限类型指定SQL
/// </summary>
public const string SPECIAL_SQL = "SPECIAL_SQL";
/// <summary>
/// 连续多级直属上级
/// <para>不同于钉钉的各上级部门负责人审批OpenAuth以用户的各级直属上级审批模式</para>
/// </summary>
public const string RUNTIME_MANY_PARENTS = "RUNTIME_MANY_PARENTS";
/// <summary>
/// 部门负责人
/// </summary>
public const string RUNTIME_CHAIRMAN = "RUNTIME_CHAIRMAN";
/// <summary>
/// 上一节点执行人的直属上级
/// </summary>
public const string RUNTIME_PARENT = "RUNTIME_PARENT";
public const string RUNTIME_SPECIAL_ROLE = "RUNTIME_SPECIAL_ROLE"; //运行时指定角色
public const string RUNTIME_SPECIAL_USER = "RUNTIME_SPECIAL_USER"; //运行时指定用户
/// <summary>
/// 流程节点执行权限类型:运行时指定角色
/// </summary>
public const string RUNTIME_SPECIAL_ROLE = "RUNTIME_SPECIAL_ROLE";
/// <summary>
/// 流程节点执行权限类型:运行时指定用户
/// </summary>
public const string RUNTIME_SPECIAL_USER = "RUNTIME_SPECIAL_USER";
//加签类型
public const string APPROVE_TYPE_SEQUENTIAL = "sequential"; //顺序
public const string APPROVE_TYPE_ALL = "all"; //并行且
public const string APPROVE_TYPE_ONE = "one"; //并行或
/// <summary>
/// 加签类型:顺序审批
/// </summary>
public const string APPROVE_TYPE_SEQUENTIAL = "sequential";
/// <summary>
/// 加签类型:并行且审批(所有人必须同意)
/// </summary>
public const string APPROVE_TYPE_ALL = "all";
/// <summary>
/// 加签类型:并行或审批(一人同意即可)
/// </summary>
public const string APPROVE_TYPE_ONE = "one";
/// <summary>
/// API资源标识
/// </summary>
public const string API = "API_RESOURCE";
}
}

View File

@@ -773,7 +773,7 @@ namespace OpenAuth.App.Flow
}
/// <summary>
/// 计算节点执行人
/// 这里专门处理由前端选择相关的节点执行人
/// </summary>
/// <param name="node"></param>
/// <returns></returns>

View File

@@ -2,7 +2,7 @@
* @Author: yubaolee <yubaolee@163.com> | ahfu~ <954478625@qq.com>
* @Date: 2024-12-13 16:55:17
* @Description: 工作流实例表操作
* @LastEditTime: 2025-04-18 17:30:07
* @LastEditTime: 2025-04-19 00:23:47
* Copyright (c) 2024 by yubaolee | ahfu~ , All Rights Reserved.
*/
@@ -710,7 +710,7 @@ namespace OpenAuth.App
if (request.type == "wait") //待办事项(即需要我处理的流程)
{
sql = $@"
sql =$@"
SELECT fi.Id,
fi.CreateUserName,
fi.ActivityName,
@@ -727,19 +727,33 @@ namespace OpenAuth.App
FROM FlowInstance fi
JOIN (SELECT fith.Id
FROM FlowInstance fith
WHERE (MakerList = '1' or MakerList LIKE '%{user.User.Id}%')
WHERE (MakerList = '1' or MakerList LIKE '%00000000-0000-0000-0000-000000000000%')
and (fith.IsFinish = {FlowInstanceStatus.Running} or fith.IsFinish = {FlowInstanceStatus.Rejected})
and not exists (select 1
from flowapprover
where fith.Id = InstanceId
and fith.ActivityId = ActivityId
and Status = 0)
UNION
SELECT fa.InstanceId
FROM FlowApprover fa
WHERE fa.Status = 0
AND fa.ApproverId = '{user.User.Id}') UniqueInstanceIds
ON fi.Id = UniqueInstanceIds.Id";
union
select fa.instanceid
from flowapprover fa
where fa.status = 0
and fa.approverid = '{user.User.Id}'
and fa.approvetype <> '{Define.APPROVE_TYPE_SEQUENTIAL}'
union
select fa.instanceid
from flowapprover fa
where not exists (select 1
from flowapprover fa2
where fa2.instanceid = fa.instanceid
and fa2.orderno < fa.orderno
and fa2.status = 0
and fa2.approvetype = '{Define.APPROVE_TYPE_SEQUENTIAL}')
and fa.status = 0
and fa.approverid = '{user.User.Id}'
and fa.approvetype = '{Define.APPROVE_TYPE_SEQUENTIAL}') UniqueInstanceIds
ON fi.Id = UniqueInstanceIds.Id
";
}
else if (request.type == "disposed") //已办事项(即我参与过的流程)
{