From bcb06c94db0d015ac64dede679c52337b90f59c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=BC=9F?= <421281095@qq.com> Date: Thu, 5 Feb 2026 15:09:41 +0800 Subject: [PATCH] =?UTF-8?q?refactor(workflow):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=BE=85=E5=8A=9E=E4=BA=8B=E9=A1=B9?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用角色关联节点ID的方式重构待办事项查询,提升查询性能 - 添加部门角色ID子查询以支持更精确的权限控制 - 将原有的实例ID去重逻辑改为基于节点角色的直接查询 - 移除无效的实例ID空值检查逻辑 - 优化变量查询方式,通过一次查询获取多个流程变量 - 添加Type字段解析功能以支持流程分类显示 - 修复流程标题获取可能为空的问题 --- OpenAuth.App/workflow/WorkflowEngineApp.cs | 52 ++++++++++++---------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/OpenAuth.App/workflow/WorkflowEngineApp.cs b/OpenAuth.App/workflow/WorkflowEngineApp.cs index d4105e3..de602c8 100644 --- a/OpenAuth.App/workflow/WorkflowEngineApp.cs +++ b/OpenAuth.App/workflow/WorkflowEngineApp.cs @@ -618,49 +618,55 @@ public class WorkflowEngineApp : SqlSugarBaseApp((w, i) => new JoinQueryInfos( - JoinType.Inner, w.InstanceId == i.InstanceId)) - .Where((w, i) => w.HandlerId == userId || (w.Status == "Draft" && _auditDeptRoleIds.Contains(w.NodeId)) - || i.InitiatorId == userId) - .Select((w, i) => i.InstanceId) - .Distinct() + + var nodeIdList = _sqlSugar.Queryable() + // 核心:In(主表字段, 子查询Lambda表达式) + .In( + zy => zy.RoleId, // 主表 zy_flow_node 的 role_id 字段 + // 子查询:从 sys_userrole 中查询 UserId=2 的 RoleId + _sqlSugar.Queryable() + .Where(ur => ur.UserId == userId) // 条件:UserId=2(注意:这里直接用数值,避免字符串拼接) + .Select(ur => ur.RoleId) // 子查询只返回 RoleId 字段 + ) + // 主查询只返回 node_id 字段(提升查询性能,避免查询全表字段) + .Select(zy => zy.NodeId) + // 执行查询,返回 List 结果 .ToList(); + // todo 未包含拟办,需集成表单后实现 + var allQuery = _sqlSugar + .Queryable() + .LeftJoin((w, n) => w.NodeId == n.NodeId) + .Where((w, n) => nodeIdList.Contains(w.NodeId)) + .OrderByDescending(w => w.ReceiveTime); - if (!allInstanceIds.Any()) - return new PageQueryResultDto(); - - // 分页处理实例ID - var pagedInstanceIds = allInstanceIds + var totalCount = allQuery.Count(); + var toDoWorkitems = allQuery .Skip((pageIndex - 1) * pageSize) .Take(pageSize) .ToList(); - var totalCount = allInstanceIds.Count; // 组装返回结果 var dataList = new List(); - foreach (var instanceId in pagedInstanceIds) + foreach (var workitem in toDoWorkitems) { var flowInstance = _sqlSugar.Queryable() - .Where(i => i.InstanceId == instanceId) + .Where(i => i.InstanceId == workitem.InstanceId) .First(); if (flowInstance == null) continue; - var flowTitle = _sqlSugar.Queryable() - .Where(v => v.InstanceId == flowInstance.InstanceId && v.VarKey == "Title") - .First()?.VarValue ?? string.Empty; - - var currentNode = _sqlSugar.Queryable() - .Where(n => n.NodeId == flowInstance.CurrentNodeId) - .First(); + var zyflowVarList = _sqlSugar.Queryable() + .Where(v => v.InstanceId == flowInstance.InstanceId); + var flowTitle = zyflowVarList.Where(v => v.VarKey == "Title").First()?.VarValue; + var type = zyflowVarList.Where(v => v.VarKey == "Type").First()?.VarValue; dataList.Add(new FlowQuerySingleResultDto { InstanceId = flowInstance.InstanceId, BusinessNo = flowInstance.BusinessNo, Title = flowTitle, - NodeName = currentNode?.NodeName ?? string.Empty, + Type = Int16.Parse(type ?? "0"), + NodeName = workitem.NodeName, Status = flowInstance.Status, CreateTime = flowInstance.CreateTime, InitiatorName = flowInstance.InitiatorName