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
相关产品推荐
相关产品推荐

