mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-09-19 18:22:11 +08:00
fix: 修复顺序审批时,节点审批人为全部加签的异常
This commit is contained in:
@@ -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";
|
||||
|
||||
/// <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";
|
||||
|
||||
/// <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";
|
||||
}
|
||||
}
|
@@ -773,7 +773,7 @@ namespace OpenAuth.App.Flow
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算节点执行人
|
||||
/// 这里专门处理由前端选择相关的节点执行人
|
||||
/// </summary>
|
||||
/// <param name="node"></param>
|
||||
/// <returns></returns>
|
||||
|
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -696,22 +696,22 @@ namespace OpenAuth.App
|
||||
else if (SugarClient.CurrentConnectionConfig.DbType == DbType.Oracle)
|
||||
{
|
||||
groupConcatSql = $@" (select listagg(Account, ',') within group (order by Account)
|
||||
from SysUser
|
||||
where fi.MakerList like '%' || Id || '%') ";
|
||||
from SysUser
|
||||
where fi.MakerList like '%' || Id || '%') ";
|
||||
}
|
||||
else if (SugarClient.CurrentConnectionConfig.DbType == DbType.PostgreSQL)
|
||||
{
|
||||
groupConcatSql = $@" (select string_agg(Account, ',')
|
||||
from SysUser
|
||||
where fi.MakerList like '%' || Id || '%') ";
|
||||
from SysUser
|
||||
where fi.MakerList like '%' || Id || '%') ";
|
||||
}
|
||||
|
||||
string sql = String.Empty;
|
||||
|
||||
if (request.type == "wait") //待办事项(即需要我处理的流程)
|
||||
{
|
||||
sql = $@"
|
||||
SELECT fi.Id,
|
||||
sql =$@"
|
||||
SELECT fi.Id,
|
||||
fi.CreateUserName,
|
||||
fi.ActivityName,
|
||||
fi.CreateDate,
|
||||
@@ -722,24 +722,38 @@ namespace OpenAuth.App
|
||||
CASE
|
||||
WHEN fi.MakerList = '1' THEN '所有人'
|
||||
WHEN fi.MakerList = '00000000-0000-0000-0000-000000000000' THEN 'System'
|
||||
ELSE {groupConcatSql}
|
||||
ELSE {groupConcatSql}
|
||||
END AS MakerList
|
||||
FROM FlowInstance fi
|
||||
JOIN (SELECT fith.Id
|
||||
FROM FlowInstance fith
|
||||
WHERE (MakerList = '1' or MakerList LIKE '%{user.User.Id}%')
|
||||
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";
|
||||
FROM FlowInstance fith
|
||||
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}'
|
||||
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") //已办事项(即我参与过的流程)
|
||||
{
|
||||
@@ -758,15 +772,15 @@ namespace OpenAuth.App
|
||||
ELSE {groupConcatSql}
|
||||
END AS MakerList
|
||||
FROM FlowInstance fi
|
||||
JOIN (SELECT fith.InstanceId
|
||||
FROM FlowInstanceOperationHistory fith
|
||||
WHERE fith.CreateUserId = '{user.User.Id}'
|
||||
UNION
|
||||
SELECT fa.InstanceId
|
||||
FROM FlowApprover fa
|
||||
WHERE fa.Status <> 0
|
||||
AND fa.ApproverId = '{user.User.Id}') UniqueInstanceIds
|
||||
ON fi.Id = UniqueInstanceIds.InstanceId
|
||||
JOIN (SELECT fith.InstanceId
|
||||
FROM FlowInstanceOperationHistory fith
|
||||
WHERE fith.CreateUserId = '{user.User.Id}'
|
||||
UNION
|
||||
SELECT fa.InstanceId
|
||||
FROM FlowApprover fa
|
||||
WHERE fa.Status <> 0
|
||||
AND fa.ApproverId = '{user.User.Id}') UniqueInstanceIds
|
||||
ON fi.Id = UniqueInstanceIds.InstanceId
|
||||
";
|
||||
}
|
||||
else //我的流程(我创建的及知会我的)
|
||||
@@ -786,25 +800,25 @@ namespace OpenAuth.App
|
||||
ELSE {groupConcatSql}
|
||||
END AS MakerList
|
||||
FROM FlowInstance fi
|
||||
JOIN (select Id as InstanceId
|
||||
JOIN (select Id as InstanceId
|
||||
from FlowInstance
|
||||
where CreateUserId = '{user.User.Id}'
|
||||
union
|
||||
select distinct FirstId as InstanceId
|
||||
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}'
|
||||
and SecondId = '{user.User.Id}'
|
||||
and SecondId = '{user.User.Id}'
|
||||
union
|
||||
select distinct a.FirstId as InstanceId
|
||||
from Relevance a
|
||||
inner join (select SecondId as RoleId
|
||||
from Relevance
|
||||
where RelKey = 'UserRole'
|
||||
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 (select SecondId as RoleId
|
||||
from Relevance
|
||||
where RelKey = 'UserRole'
|
||||
and FirstId = '{user.User.Id}') b on a.SecondId = b.RoleId
|
||||
inner join FlowInstance flow on a.FirstId = flow.Id and flow.IsFinish = 1
|
||||
where a.RelKey = '{Define.INSTANCE_NOTICE_ROLE}') UniqueInstanceIds
|
||||
ON fi.Id = UniqueInstanceIds.InstanceId
|
||||
ON fi.Id = UniqueInstanceIds.InstanceId
|
||||
";
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user