这两个枚举应保持为两个独立维度:
AutomaticPipelineRecoveryAction:产品和流水线接下来怎么走。AutomaticPipelineFailureNotificationPolicy:何时、是否由通用调度器弹窗。
不要让“是否弹窗”隐含在恢复动作里。比如同样是RequireReset,有时需要立即弹窗,有时设备已有专用告警界面,只需等待复位。
| 通知策略 | 通用调度器行为 |
|---|---|
Silent | 仅记录日志,不更新面向操作员的失败提示,不弹窗 |
StatusOnly | 记录日志、失败码和产品状态;不弹窗 |
AfterSafeUnload | 暂不弹窗;等待吹扫、下料等安全流程完成后,在产品完成事件中弹窗 |
ImmediatePopup | 记录状态后立即请求通用弹窗 |
AlreadyNotified | 通用调度器不弹窗;专用业务必须已处理提示,并建议记录“已由 X 通知”审计信息 |
恢复动作的职责则可以明确为:
| 恢复动作 | 调度含义 |
|---|---|
StopProduct | 当前产品不再进入后续测试阶段 |
ContinueToPurgeAndUnload | 跳过测试,继续吹扫并安全下料 |
UnloadFromLoadingPosition | 产品尚未进入测试流程,直接从上料位退料 |
RequireReset | 中止自动调度,保持故障现场,等待人工复位 |
核心判定可以压缩为一个明确的入口,避免在各阶段散落if:
staticboolShouldShowPopup(AutomaticPipelineFailureNotificationPolicypolicy)=>policyisAutomaticPipelineFailureNotificationPolicy.ImmediatePopuporAutomaticPipelineFailureNotificationPolicy.AfterSafeUnload;但这里的AfterSafeUnload不能在失败当下直接调用弹窗。建议把它转换为“待通知”状态:
switch(handling.NotificationPolicy){caseImmediatePopup:ShowFailurePopup();break;caseAfterSafeUnload:product.PendingFailurePopup=true;break;caseSilent:caseStatusOnly:caseAlreadyNotified:break;}在“产品已安全下料/产品流程已结束”的统一事件中处理:
if(product.PendingFailurePopup){ShowFailurePopup();product.PendingFailurePopup=false;}优化计划:
- 定义统一策略对象,例如
AutomaticPipelineFailureHandling,包含通知策略、恢复动作、失败码和失败原因。 - 按“阶段 + 失败类型”建立策略表,而不是让每个
catch或 PLC 分支各自判断。 - 将通知处理集中到
HandleNotification,将产品流转集中到ApplyRecoveryAction。 - 以产品状态保存“待安全下料后提示”标记,不能只依赖内存中的一次性回调。
- 对不合理组合增加校验。例如
AfterSafeUnload + RequireReset需要业务明确说明:若无法安全下料,就不能等待下料后再提示。 - 为每种策略组合测试三件事:是否产生弹窗、弹窗时机、产品是否进入了正确的后续路径。
建议保留现有枚举,不用布尔值替代。它们表达的是业务语义,而不是简单的“弹/不弹”;通过集中映射和统一处理入口,阅读与后续新增策略都会更稳定。