Archived
M5(3/3): trigger —— 三类触发器与起单幂等
- matchesEvent:事件触发的命中判定(S-FEEL 规则;规则写坏按不命中处置,不让事件流停摆) - assembleInput:字段映射装配;缺必填即起单失败入死信,不静默丢弃 - 幂等:同一事件对同一触发器至多起一单;数据日历型同一行同一日期只触发一次 - 周期两型:日历表达式到点扫描 + 数据日历型(日期字段 + 偏移 + 过滤)逐行起单 - 登记触发:人工起单的统一形态,登记人即来源 - 触发器与流程包平级:配置独立存放,增删启停不改流程包版本 340 个测试通过,门禁五道全绿 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
co-authored by
Claude Opus 5
parent
a8f6eef610
commit
4ad901c452
@@ -0,0 +1,28 @@
|
||||
# module: trigger
|
||||
|
||||
职责: 触发器三类(周期两型 / 事件 / 登记)的配置、判定与经调用接口起单;
|
||||
起单幂等;数据日历型的逐行扫描
|
||||
不负责: 流程包的结构与流转(见 process)、事件的投递(见 event —— 触发器是它的一个消费方)
|
||||
|
||||
公开出口: index.ts
|
||||
- 类型:`TriggerService` `TriggerConfig` `EventScope` `FireOutcome` `AssemblyResult`
|
||||
- 错误:`TriggerInputMissingError`
|
||||
- 端口类型:`TriggerStore` `ProcessGateway` `Sfeel` `DeadLetterSink` `LedgerScanner`
|
||||
- 用例工厂:`createTriggerService(deps): TriggerService`
|
||||
- 纯函数:`matchesEvent` `assembleInput` `triggerIdempotencyKey` `nextCalendarFire`
|
||||
`dataCalendarKey` `applyOffset` `scopeOf`
|
||||
- adapter:`createTriggerStore`;Drizzle 表:`triggerTable` `triggerClaimTable`
|
||||
|
||||
层级: L7(编码规范 §4)
|
||||
依赖: @contracts;@shared/db;process(L7 同层 → 经 `ProcessGateway` 端口由 app 注入);
|
||||
port:`Sfeel` / `DeadLetterSink`(message)/ `LedgerScanner`(ledger)
|
||||
被依赖: event(经 `TriggerMatcher` 端口,由 app 注入 —— event 是 L1,不反向依赖本模块)、app
|
||||
|
||||
不变量(OS 3.1 / 6.3):
|
||||
- **触发器与流程包平级**:配置独立存放,增删启停**不改流程包的任何版本**
|
||||
- **只负责起单**:经调用接口调起流程包;流程包与活动内部不含任何触发逻辑
|
||||
- **同一事件流,不另设通路**:`match` 供 event 的三级消费判定使用
|
||||
- **同一事件对同一触发器至多起一单**:以事件 ID 为幂等键
|
||||
- **缺必填即起单失败入死信**,不静默丢弃
|
||||
- **数据日历型同一行同一日期只触发一次**(键含日期值);字段值变更后可再触发
|
||||
- 命中规则求值失败按**不命中**处置 —— 规则写坏了不让事件流停摆
|
||||
Reference in New Issue
Block a user