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