跳轉到

0092 — 主動警示框架:規則表+跨輪抑制+三個新警示源

日期:2026-07-13 狀態:已採用

背景

ERP 內的關鍵風險訊號(應收逾期、票據到期、庫存低於安全量、金流預測跌破警戒)過去只能靠使用者主動開視窗查詢。系統其實已有完整的通知骨幹:Mailgun 通道(Common\Mail\IMailService/MailGunService)、twork_skd_mailqueue 佇列(ADR 0018:AutoPilot SP 組信+入列、寄送統一回 SchedulerWorker)、AutoPilot 排程(ADR 0065 集中自動化庫),且「庫存低於安全量」(TWORK_AUTO_SAFETYSTOCK)已是完成品。缺的是:門檻與收件人寫死在 SP/行事曆事件裡不可配置、每輪排程命中就重寄(無跨輪抑制)、以及另外三個警示源。

決策

  1. 不重造通道:Email 沿用 Mailgun+mailqueue+SchedulerWorker 全鏈;警示源只負責「判定+組信+入列」。LINE Notify 已於 2025-03-31 終止服務,若未來要 LINE 只能走 Messaging API(Push),本期不做(需官方帳號+付費額度)。
  2. 警示規則表 twork_sys_alertrule(per-DB,各客戶 csa 庫):每警示類型一列,含 門檻參數(JSON,中文 key)、收件人、通知通道、是否啟用、抑制視窗小時(預設 24)。收件人採兩層 fallback:規則表有值用之,否則退回 twork_skd_eventitem.通知帳號(既有行為不受影響)。
  3. 跨輪抑制 twork_auto_alertlog(集中自動化庫):每次警示將關鍵維度(單號集合/票號集合/首次跌破月+警戒線)排序後 SHA2_256 成指紋;抑制視窗內同類型同指紋已發→靜音,內容變化→指紋變→照常通知。C# 端純函數 AlertFingerprint/AlertSuppression(LogicBll\M.EIS\Alert\),SQL 端以 HASHBYTES 同構實作。
  4. 兩種警示源型態並存
  5. SP 型(TWORK_AUTO_AR_OVERDUE 重用 DARB_QRY_REC_QRY1 查詢別=1 口徑;TWORK_AUTO_CHECK_DUE 重用 DARB_QRY_CHECK 查詢別=31 收付票聯集)——走 AutopilotMethod_LogSysExec(Dispatcher=SKD)零 C#。
  6. C# 型(Flowcast_BaselineAlert AutoPilot task)——金流跌破判定重用 FlowcastComposer.ApplyBaseline(有單測的純函數,不搬進 SQL);新增 MailQueueEnqueuer(Common\Mail\)讓 C# 端也能入列。警戒線持久化到規則表門檻參數,解掉 UI-only 缺口。
  7. 金流跌破只通知首次跌破(使用者裁決):指紋維度=(首次跌破月, 警戒線)。
  8. 維護 UI:警示規則維護頁(TsView,ProgramClass=ALERTRULE),S5 交付。

取捨

  • 收件人主來源放規則表而非行事曆事件:收件人應綁「警示類型」而非「排程事件」(同警示排兩個時段不必維護兩份),且通道/抑制視窗/門檻 JSON 在 eventitem 無欄位可放;以 fallback 保相容。
  • alertlog 去重索引採 (指紋, 發送時間 DESC) INCLUDE(...) 而非計畫草案的 (警示類型,指紋,發送時間):指紋已編碼警示類型,前導類型欄冗餘(fresh 審查認定為正當優化)。
  • AlertRuleBll 採 CustomdashConfigBll 混合模式(寫走 ItemsBindingManager 標準上傳、讀走直接 SELECT):規則屬全域設定無 BOR 權限需求,讀路徑不掛 QRY SP,排程端可共用。

影響

  • 新表:twork_sys_alertrule(csa 各庫)、twork_auto_alertlog(各客戶 auto 庫);新 SP:TWORK_AUTO_AR_OVERDUETWORK_AUTO_CHECK_DUE(auto 庫)+ log 庫 proc_param 登錄。
  • 新檔:SqlBI\twork_sys_alertrule.sqlSqlBI\twork_auto_alertlog.sqlSqlBI\TWORK_AUTO_AR_OVERDUE.sqlSqlBI\TWORK_AUTO_CHECK_DUE.sqlsql\alertrule-deploy.sqlsql\alertlog-deploy.sqlsql\ar-overdue-deploy.sqlsql\check-due-deploy.sqlLogicBll\M.EIS\Alert\*Common\Mail\MailQueueEnqueuer.csMailQueueMessage.csAutoPilot\Flowcast_BaselineAlert.cs
  • 部署現況:dev(localhost csa1/5、darbnogiauto1、log1)已落地並經三輪功能實測+SchedulerWorker 端到端真寄驗證;正式機五帳套與其他客戶 auto 庫待使用者部署(deploy 腳本檔頭已註明 proc_param IDENTITY 兩環境差異)。
  • 踩雷升格:sqlcmd 預設 QUOTED_IDENTIFIER OFF 建 SP/對帶篩選索引表 DML 會炸 Msg 1934(中文「訊息 1934」);JSON 路徑中文 key 必須雙引號——見 memory sqlcmd-quoted-identifier-msg1934
  • 已知缺口:Flowcast_BaselineAlert.Execute 的排程 runtime 未驗(需登入 context 的行事曆事件實跑);正式部署時若某 log 庫缺對應 auto 庫,派發會靜默 no-rows(檢查點)。