You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elsa 2.9.2审批工作流:已处理Signal链接点击后如何添加用户提示?

解决方案

针对Elsa 2.9.2中审批链接重复点击无提示的问题,完全可以实现自定义提示逻辑,核心思路是替换默认的信号触发端点,在触发前先检查工作流状态,根据结果返回对应提示,具体步骤如下:

1. 自定义信号触发API端点

默认的/signals/trigger端点仅执行信号触发逻辑,不会做状态校验,因此需要自己实现一个带校验逻辑的端点:

[ApiController]
[Route("custom-signals/trigger")]
public class CustomSignalTriggerController : ControllerBase
{
    private readonly IWorkflowInstanceStore _workflowInstanceStore;
    private readonly ISignalPublisher _signalPublisher;

    public CustomSignalTriggerController(IWorkflowInstanceStore workflowInstanceStore, ISignalPublisher signalPublisher)
    {
        _workflowInstanceStore = workflowInstanceStore;
        _signalPublisher = signalPublisher;
    }

    [HttpGet("{signalName}")]
    public async Task<IActionResult> TriggerSignal(string signalName, string workflowInstanceId)
    {
        // 1. 查询目标工作流实例
        var workflowInstance = await _workflowInstanceStore.FindByIdAsync(workflowInstanceId);
        if (workflowInstance == null)
            return Content("<h2>错误:找不到对应的工作流实例</h2>", "text/html");

        // 2. 检查审批是否已完成(这里假设工作流中用ApprovalCompleted变量标记状态)
        var isApprovalHandled = workflowInstance.Variables.TryGetValue("ApprovalCompleted", out var value) 
                               && value is bool completed && completed;

        if (isApprovalHandled)
        {
            // 3. 已处理则返回提示页面
            return Content(@"
                <div style='max-width: 600px; margin: 40px auto; padding: 20px; border: 1px solid #ddd; border-radius: 8px;'>
                    <h2>操作提示</h2>
                    <p>该审批请求已被其他用户处理,无需重复操作。</p>
                </div>
            ", "text/html");
        }

        // 4. 未处理则执行信号触发逻辑
        await _signalPublisher.PublishSignalAsync(signalName, workflowInstanceId: workflowInstanceId);

        // 5. 标记审批为已处理(也可以在工作流的审批完成节点中设置此变量)
        workflowInstance.Variables["ApprovalCompleted"] = true;
        await _workflowInstanceStore.SaveAsync(workflowInstance);

        // 6. 返回操作成功提示
        return Content(@"
            <div style='max-width: 600px; margin: 40px auto; padding: 20px; border: 1px solid #ddd; border-radius: 8px;'>
                <h2>操作成功</h2>
                <p>你的审批操作已提交。</p>
            </div>
        ", "text/html");
    }
}

2. 调整工作流与邮件模板

  • 在工作流中,确保审批完成的节点(比如SignalReceived之后的逻辑)中,将ApprovalCompleted变量设为true(如果不在API中设置的话)。
  • 修改邮件模板中的链接,替换默认的signal_url为自定义端点的地址,例如:
    https://你的域名/custom-signals/trigger/Approved?workflowInstanceId={WorkflowInstanceId}
    
    (Approved是你定义的审批信号名称,需和工作流中的信号名称一致)

3. 补充说明

  • 并发处理:如果担心多个用户同时点击链接导致重复触发,可以在更新工作流变量时使用事务,或者利用Elsa的IWorkflowInstanceLocker加锁,避免并发冲突。
  • 状态校验方式:除了用变量标记,也可以通过查询工作流实例的Status(比如是否处于Completed状态),或者查询对应SignalReceived活动的执行状态来判断审批是否已完成,根据你的工作流结构选择合适的方式。

内容的提问来源于stack exchange,提问作者zico7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:48:22