From a4a575cc4f4c7a042eb637b3fd55ed62f6eb8836 Mon Sep 17 00:00:00 2001 From: xiangning Date: Fri, 3 Jul 2026 17:27:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(workflow):=20=E6=B7=BB=E5=8A=A0=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=B5=81=E7=A8=8B=E5=AE=9E=E4=BE=8B=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 UpdateWorkflowInstanceVariablesCommand 命令处理变量更新逻辑 - 实现 UpdateWorkflowInstanceVariablesCommandHandler 验证并保存变量到数据库 - 添加 UpdateWorkflowInstanceVariablesEndpoint 提供 REST API 接口 - 创建 UpdateWorkflowInstanceVariablesRequest 定义请求数据结构 - 实现 JSON 格式验证确保变量数据有效性 - 支持人工干预修正流程运行时数据的场景需求 --- ...UpdateWorkflowInstanceVariablesEndpoint.cs | 30 +++++++++++++ .../UpdateWorkflowInstanceVariablesRequest.cs | 10 +++++ .../UpdateWorkflowInstanceVariablesCommand.cs | 11 +++++ ...WorkflowInstanceVariablesCommandHandler.cs | 43 +++++++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 src/BuildFlow.Host/Endpoints/Workflow/WorkflowInstance/UpdateWorkflowInstanceVariablesEndpoint.cs create mode 100644 src/BuildFlow.Host/Endpoints/Workflow/WorkflowInstance/UpdateWorkflowInstanceVariablesRequest.cs create mode 100644 src/modules/workflow/Application/Features/WorkflowInstances/Commands/UpdateWorkflowInstanceVariablesCommand.cs create mode 100644 src/modules/workflow/Application/Features/WorkflowInstances/Handlers/UpdateWorkflowInstanceVariablesCommandHandler.cs diff --git a/src/BuildFlow.Host/Endpoints/Workflow/WorkflowInstance/UpdateWorkflowInstanceVariablesEndpoint.cs b/src/BuildFlow.Host/Endpoints/Workflow/WorkflowInstance/UpdateWorkflowInstanceVariablesEndpoint.cs new file mode 100644 index 0000000..7211df8 --- /dev/null +++ b/src/BuildFlow.Host/Endpoints/Workflow/WorkflowInstance/UpdateWorkflowInstanceVariablesEndpoint.cs @@ -0,0 +1,30 @@ +using MediatR; +using Workflow.Application.Features.WorkflowInstances.Commands; + +namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; + +/// +/// 更新单个流程实例的运行时变量。用于人工干预修正流程数据(仅改 Variables,不动状态/定义版本)。 +/// +public class UpdateWorkflowInstanceVariablesEndpoint(IMediator mediator) + : Endpoint +{ + public override void Configure() + { + Put("/workflow-instances/{Id}/variables"); + Permissions("workflow-instance:manage"); + Summary(s => + { + s.Summary = "Update variables of a single workflow instance"; + }); + } + + public override async Task HandleAsync(UpdateWorkflowInstanceVariablesRequest req, CancellationToken ct) + { + var id = Route("Id"); + await mediator.Send(new UpdateWorkflowInstanceVariablesCommand(id, req.Variables), ct); + HttpContext.Response.StatusCode = 200; + HttpContext.Response.ContentType = "application/json"; + await HttpContext.Response.WriteAsync("{}", ct); + } +} diff --git a/src/BuildFlow.Host/Endpoints/Workflow/WorkflowInstance/UpdateWorkflowInstanceVariablesRequest.cs b/src/BuildFlow.Host/Endpoints/Workflow/WorkflowInstance/UpdateWorkflowInstanceVariablesRequest.cs new file mode 100644 index 0000000..83e919e --- /dev/null +++ b/src/BuildFlow.Host/Endpoints/Workflow/WorkflowInstance/UpdateWorkflowInstanceVariablesRequest.cs @@ -0,0 +1,10 @@ +namespace BuildFlow.Host.Endpoints.Workflow.WorkflowInstance; + +/// +/// 更新流程实例变量请求体。 +/// +public class UpdateWorkflowInstanceVariablesRequest +{ + /// 新的流程变量 JSON(必须是 JSON 对象,如 {"amount": 5000, "level": 3})。 + public string Variables { get; set; } = string.Empty; +} diff --git a/src/modules/workflow/Application/Features/WorkflowInstances/Commands/UpdateWorkflowInstanceVariablesCommand.cs b/src/modules/workflow/Application/Features/WorkflowInstances/Commands/UpdateWorkflowInstanceVariablesCommand.cs new file mode 100644 index 0000000..a400da3 --- /dev/null +++ b/src/modules/workflow/Application/Features/WorkflowInstances/Commands/UpdateWorkflowInstanceVariablesCommand.cs @@ -0,0 +1,11 @@ +using MediatR; + +namespace Workflow.Application.Features.WorkflowInstances.Commands; + +/// +/// 更新单个流程实例的运行时变量(Variables)命令。 +/// 用于人工干预修正流程数据(如表单填错、条件分支走错),仅改 Variables,不动状态、定义版本、token。 +/// +public record UpdateWorkflowInstanceVariablesCommand( + Guid InstanceId, + string Variables) : IRequest; diff --git a/src/modules/workflow/Application/Features/WorkflowInstances/Handlers/UpdateWorkflowInstanceVariablesCommandHandler.cs b/src/modules/workflow/Application/Features/WorkflowInstances/Handlers/UpdateWorkflowInstanceVariablesCommandHandler.cs new file mode 100644 index 0000000..e60bff9 --- /dev/null +++ b/src/modules/workflow/Application/Features/WorkflowInstances/Handlers/UpdateWorkflowInstanceVariablesCommandHandler.cs @@ -0,0 +1,43 @@ +using System.Text.Json; +using MediatR; +using Workflow.Application.Features.WorkflowInstances.Commands; +using Workflow.Infrastructure.Persistence; + +namespace Workflow.Application.Features.WorkflowInstances.Handlers; + +/// +/// 更新流程实例变量处理器。校验实例存在且 Variables 为合法 JSON 对象后覆盖写入。 +/// 不校验实例状态:Running/Suspended/Completed 均允许修正变量(人工干预场景)。 +/// +public class UpdateWorkflowInstanceVariablesCommandHandler(WorkflowDbContext db) + : IRequestHandler +{ + public async Task Handle(UpdateWorkflowInstanceVariablesCommand request, CancellationToken ct) + { + var instance = await db.WorkflowInstances.FindAsync([request.InstanceId], ct) + ?? throw new NotFoundException($"Workflow instance '{request.InstanceId}' not found."); + + // 校验 Variables 是合法 JSON 对象,避免脏数据破坏引擎条件求值(ParseVariables 会吞异常返回空, + // 但这里前置校验能给出明确错误而非静默丢失变量) + ValidateVariablesJson(request.Variables); + + instance.Variables = request.Variables; + await db.SaveChangesAsync(ct); + + return Unit.Value; + } + + private static void ValidateVariablesJson(string variables) + { + try + { + using var doc = JsonDocument.Parse(variables); + if (doc.RootElement.ValueKind != JsonValueKind.Object) + throw new BusinessException("流程变量必须是 JSON 对象(如 {\"key\":\"value\"})。"); + } + catch (JsonException ex) + { + throw new BusinessException($"流程变量不是合法的 JSON:{ex.Message}"); + } + } +}