refactor(workflow): 优化工作流待办事项查询逻辑
- 使用角色关联节点ID的方式重构待办事项查询,提升查询性能 - 添加部门角色ID子查询以支持更精确的权限控制 - 将原有的实例ID去重逻辑改为基于节点角色的直接查询 - 移除无效的实例ID空值检查逻辑 - 优化变量查询方式,通过一次查询获取多个流程变量 - 添加Type字段解析功能以支持流程分类显示 - 修复流程标题获取可能为空的问题main
parent
56da8eaf0e
commit
bcb06c94db
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue