feat(workflow): 优化待办工作项查询逻辑

- 使用角色权限关联查询替代简单的用户ID匹配
- 添加通过用户角色获取节点ID列表的功能
- 实现子查询获取用户所属角色的流程节点权限
- 改进待办事项查询为基于角色权限的左连接查询
- 提升查询性能通过只选择必要字段减少数据传输
- 修复原有基于HandlerId的简单过滤限制
main
陈伟 2026-02-05 11:32:29 +08:00
parent 56f8f85cc2
commit e9cdd3b400
1 changed files with 17 additions and 4 deletions

View File

@ -333,13 +333,26 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
pageQueryDto = pageQueryDto ?? new PageQueryRequestDto();
var pageIndex = pageQueryDto.PageIndex < 1 ? 1 : pageQueryDto.PageIndex;
var pageSize = pageQueryDto.PageSize < 1 ? 10 : pageQueryDto.PageSize;
// 待办逻辑:工作项状态为"ToDo"、处理人ID为当前用户
// todo 这种分页不行,这是内存分页要改
var toDoQuery = _sqlSugar.Queryable<ZyFlowWorkitem>()
.Where(w => w.HandlerId == userId && w.Status == "ToDo")
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();
var toDoQuery = _sqlSugar
.Queryable<ZyFlowWorkitem>()
.LeftJoin<ZyFlowNode>((w, n) => w.NodeId == n.NodeId)
.Where((w, n) => nodeIdList.Contains(w.NodeId) && w.Status == "ToDo")
.OrderByDescending(w => w.ReceiveTime);
// 分页查询
var totalCount = toDoQuery.Count();
var toDoWorkitems = toDoQuery