elsa 3.5 中间件记录最后执行的节点数据

获取最后执行的节点信息

 public class WorkflowCompletionMiddleware : IWorkflowExecutionMiddleware
 {
     private readonly WorkflowMiddlewareDelegate _next;

     public WorkflowCompletionMiddleware(WorkflowMiddlewareDelegate next)
     {
         this._next = next;
     }

     public async ValueTask InvokeAsync(WorkflowExecutionContext context)
     {
         try
         {
             // 调用下一个中间件
             await _next(context);
         }
         catch (System.Exception)
         {
             //TODO 记录异常日志
             //TODO 更新流程执行异常状态

         }

         //记录流程执行结果
         if (context.Status == WorkflowStatus.Finished)
         {
             var vari = context.Workflow.Variables.ToList();
             var result = context.Variables.ToList();

             var instanceId = context.Id;
             var status = (int)context.SubStatus;

             //此处需要根据实际情况将公共的最外层的流程去掉,只保留业务相关的实际节点
             var lastNode = context.ExecutionLog.LastOrDefault(f => f.ActivityType != "Elsa.Workflow" && f.ActivityType != "Elsa.Flowchart");
             if (lastNode == null)
             {
                 return;
             }

             var activityID = lastNode.ActivityId;
             var activityName = lastNode.ActivityName;

             long startTime = 0;
             long endTime = 0;
             if (lastNode.EventName == "Completed")
             {
                 endTime = lastNode.Timestamp.ToUnixTimeMilliseconds();

                 var startNode = context.ExecutionLog.FirstOrDefault(f => f.ActivityId == lastNode.ActivityId && f.EventName == "Started");
               
                 if (startNode != null)
                 {
                     startTime = startNode.Timestamp.ToUnixTimeMilliseconds();
                 }
             }
             else
             {
                 startTime = lastNode.Timestamp.ToUnixTimeMilliseconds();
             }
         }
     }
 }

记录所有的变量数据

通过定义一个输出变量将所有数据返回,考虑到unicode、特殊字符等问题将数据json之后再base64处理

  var vari = context.Workflow.Variables.ToList();
  var result = context.Variables.ToList();
  var sugar = context.GetService<ISqlSugarClient>();


  var dic = new Dictionary<string, object>();
  foreach (var item in vari)
  {
      var v = JsonConvert.SerializeObject(item.Value);
      dic.Add(item.Name, item.Value);
  }

  var json = JsonConvert.SerializeObject(dic);
  var plainTextBytes = Encoding.UTF8.GetBytes(json);
  var base64Str = Convert.ToBase64String(plainTextBytes);
  context.Output.Add("Out__Result", base64Str);
posted @ 2026-05-12 10:16  Hey,Coder!  阅读(7)  评论(0)    收藏  举报