refactor(workflow): 优化工作流待办事项查询逻辑

- 使用角色关联节点ID的方式重构待办事项查询,提升查询性能
- 添加部门角色ID子查询以支持更精确的权限控制
- 将原有的实例ID去重逻辑改为基于节点角色的直接查询
- 移除无效的实例ID空值检查逻辑
- 优化变量查询方式,通过一次查询获取多个流程变量
- 添加Type字段解析功能以支持流程分类显示
- 修复流程标题获取可能为空的问题
main
陈伟 2026-02-05 15:09:41 +08:00
parent 56da8eaf0e
commit bcb06c94db
1 changed files with 29 additions and 23 deletions

View File

@ -618,49 +618,55 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
var pageIndex = pageQueryDto.page < 1 ? 1 : pageQueryDto.page;
var pageSize = pageQueryDto.limit < 1 ? 10 : pageQueryDto.limit;
// 全部事项逻辑:当前用户相关的所有流程实例(去重)
var allInstanceIds = _sqlSugar.Queryable<ZyFlowWorkitem, ZyFlowInstance>((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<ZyFlowNode>()
// 核心In(主表字段, 子查询Lambda表达式)
.In(
zy => zy.RoleId, // 主表 zy_flow_node 的 role_id 字段
// 子查询:从 sys_userrole 中查询 UserId=2 的 RoleId
_sqlSugar.Queryable<SysUserRole>()
.Where(ur => ur.UserId == userId) // 条件UserId=2注意这里直接用数值避免字符串拼接
.Select(ur => ur.RoleId) // 子查询只返回 RoleId 字段
)
// 主查询只返回 node_id 字段(提升查询性能,避免查询全表字段)
.Select(zy => zy.NodeId)
// 执行查询,返回 List<long> 结果
.ToList();
// todo 未包含拟办,需集成表单后实现
var allQuery = _sqlSugar
.Queryable<ZyFlowWorkitem>()
.LeftJoin<ZyFlowNode>((w, n) => w.NodeId == n.NodeId)
.Where((w, n) => nodeIdList.Contains(w.NodeId))
.OrderByDescending(w => w.ReceiveTime);
if (!allInstanceIds.Any())
return new PageQueryResultDto<FlowQuerySingleResultDto>();
// 分页处理实例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<FlowQuerySingleResultDto>();
foreach (var instanceId in pagedInstanceIds)
foreach (var workitem in toDoWorkitems)
{
var flowInstance = _sqlSugar.Queryable<ZyFlowInstance>()
.Where(i => i.InstanceId == instanceId)
.Where(i => i.InstanceId == workitem.InstanceId)
.First();
if (flowInstance == null)
continue;
var flowTitle = _sqlSugar.Queryable<ZyFlowVariable>()
.Where(v => v.InstanceId == flowInstance.InstanceId && v.VarKey == "Title")
.First()?.VarValue ?? string.Empty;
var currentNode = _sqlSugar.Queryable<ZyFlowNode>()
.Where(n => n.NodeId == flowInstance.CurrentNodeId)
.First();
var zyflowVarList = _sqlSugar.Queryable<ZyFlowVariable>()
.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