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

View File

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

View File

@@ -2,7 +2,7 @@
* @Author: yubaolee <yubaolee@163.com> | ahfu~ <954478625@qq.com> * @Author: yubaolee <yubaolee@163.com> | ahfu~ <954478625@qq.com>
* @Date: 2024-12-13 16:55:17 * @Date: 2024-12-13 16:55:17
* @Description: 工作流实例表操作 * @Description: 工作流实例表操作
* @LastEditTime: 2025-04-18 17:30:07 * @LastEditTime: 2025-04-19 00:23:47
* Copyright (c) 2024 by yubaolee | ahfu~ , All Rights Reserved. * Copyright (c) 2024 by yubaolee | ahfu~ , All Rights Reserved.
*/ */
@@ -696,22 +696,22 @@ namespace OpenAuth.App
else if (SugarClient.CurrentConnectionConfig.DbType == DbType.Oracle) else if (SugarClient.CurrentConnectionConfig.DbType == DbType.Oracle)
{ {
groupConcatSql = $@" (select listagg(Account, ',') within group (order by Account) groupConcatSql = $@" (select listagg(Account, ',') within group (order by Account)
from SysUser from SysUser
where fi.MakerList like '%' || Id || '%') "; where fi.MakerList like '%' || Id || '%') ";
} }
else if (SugarClient.CurrentConnectionConfig.DbType == DbType.PostgreSQL) else if (SugarClient.CurrentConnectionConfig.DbType == DbType.PostgreSQL)
{ {
groupConcatSql = $@" (select string_agg(Account, ',') groupConcatSql = $@" (select string_agg(Account, ',')
from SysUser from SysUser
where fi.MakerList like '%' || Id || '%') "; where fi.MakerList like '%' || Id || '%') ";
} }
string sql = String.Empty; string sql = String.Empty;
if (request.type == "wait") //待办事项(即需要我处理的流程) if (request.type == "wait") //待办事项(即需要我处理的流程)
{ {
sql = $@" sql =$@"
SELECT fi.Id, SELECT fi.Id,
fi.CreateUserName, fi.CreateUserName,
fi.ActivityName, fi.ActivityName,
fi.CreateDate, fi.CreateDate,
@@ -722,24 +722,38 @@ namespace OpenAuth.App
CASE CASE
WHEN fi.MakerList = '1' THEN '所有人' WHEN fi.MakerList = '1' THEN '所有人'
WHEN fi.MakerList = '00000000-0000-0000-0000-000000000000' THEN 'System' WHEN fi.MakerList = '00000000-0000-0000-0000-000000000000' THEN 'System'
ELSE {groupConcatSql} ELSE {groupConcatSql}
END AS MakerList END AS MakerList
FROM FlowInstance fi FROM FlowInstance fi
JOIN (SELECT fith.Id JOIN (SELECT fith.Id
FROM FlowInstance fith 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 (fith.IsFinish = {FlowInstanceStatus.Running} or fith.IsFinish = {FlowInstanceStatus.Rejected})
and not exists (select 1 and not exists (select 1
from flowapprover from flowapprover
where fith.Id = InstanceId where fith.Id = InstanceId
and fith.ActivityId = ActivityId and fith.ActivityId = ActivityId
and Status = 0) and Status = 0)
UNION union
SELECT fa.InstanceId select fa.instanceid
FROM FlowApprover fa from flowapprover fa
WHERE fa.Status = 0 where fa.status = 0
AND fa.ApproverId = '{user.User.Id}') UniqueInstanceIds and fa.approverid = '{user.User.Id}'
ON fi.Id = UniqueInstanceIds.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") //已办事项(即我参与过的流程) else if (request.type == "disposed") //已办事项(即我参与过的流程)
{ {
@@ -758,15 +772,15 @@ namespace OpenAuth.App
ELSE {groupConcatSql} ELSE {groupConcatSql}
END AS MakerList END AS MakerList
FROM FlowInstance fi FROM FlowInstance fi
JOIN (SELECT fith.InstanceId JOIN (SELECT fith.InstanceId
FROM FlowInstanceOperationHistory fith FROM FlowInstanceOperationHistory fith
WHERE fith.CreateUserId = '{user.User.Id}' WHERE fith.CreateUserId = '{user.User.Id}'
UNION UNION
SELECT fa.InstanceId SELECT fa.InstanceId
FROM FlowApprover fa FROM FlowApprover fa
WHERE fa.Status <> 0 WHERE fa.Status <> 0
AND fa.ApproverId = '{user.User.Id}') UniqueInstanceIds AND fa.ApproverId = '{user.User.Id}') UniqueInstanceIds
ON fi.Id = UniqueInstanceIds.InstanceId ON fi.Id = UniqueInstanceIds.InstanceId
"; ";
} }
else //我的流程(我创建的及知会我的) else //我的流程(我创建的及知会我的)
@@ -786,25 +800,25 @@ namespace OpenAuth.App
ELSE {groupConcatSql} ELSE {groupConcatSql}
END AS MakerList END AS MakerList
FROM FlowInstance fi FROM FlowInstance fi
JOIN (select Id as InstanceId JOIN (select Id as InstanceId
from FlowInstance from FlowInstance
where CreateUserId = '{user.User.Id}' where CreateUserId = '{user.User.Id}'
union union
select distinct FirstId as InstanceId select distinct FirstId as InstanceId
from Relevance rel from Relevance rel
inner join FlowInstance flow on rel.FirstId = flow.Id and flow.IsFinish = 1 inner join FlowInstance flow on rel.FirstId = flow.Id and flow.IsFinish = 1
where RelKey = '{Define.INSTANCE_NOTICE_USER}' where RelKey = '{Define.INSTANCE_NOTICE_USER}'
and SecondId = '{user.User.Id}' and SecondId = '{user.User.Id}'
union union
select distinct a.FirstId as InstanceId select distinct a.FirstId as InstanceId
from Relevance a from Relevance a
inner join (select SecondId as RoleId inner join (select SecondId as RoleId
from Relevance from Relevance
where RelKey = 'UserRole' where RelKey = 'UserRole'
and FirstId = '{user.User.Id}') b on a.SecondId = b.RoleId and FirstId = '{user.User.Id}') b on a.SecondId = b.RoleId
inner join FlowInstance flow on a.FirstId = flow.Id and flow.IsFinish = 1 inner join FlowInstance flow on a.FirstId = flow.Id and flow.IsFinish = 1
where a.RelKey = '{Define.INSTANCE_NOTICE_ROLE}') UniqueInstanceIds where a.RelKey = '{Define.INSTANCE_NOTICE_ROLE}') UniqueInstanceIds
ON fi.Id = UniqueInstanceIds.InstanceId ON fi.Id = UniqueInstanceIds.InstanceId
"; ";
} }