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/行事曆事件裡不可配置、每輪排程命中就重寄(無跨輪抑制)、以及另外三個警示源。
決策¶
- 不重造通道:Email 沿用 Mailgun+mailqueue+SchedulerWorker 全鏈;警示源只負責「判定+組信+入列」。LINE Notify 已於 2025-03-31 終止服務,若未來要 LINE 只能走 Messaging API(Push),本期不做(需官方帳號+付費額度)。
- 警示規則表
twork_sys_alertrule(per-DB,各客戶 csa 庫):每警示類型一列,含 門檻參數(JSON,中文 key)、收件人、通知通道、是否啟用、抑制視窗小時(預設 24)。收件人採兩層 fallback:規則表有值用之,否則退回twork_skd_eventitem.通知帳號(既有行為不受影響)。 - 跨輪抑制
twork_auto_alertlog(集中自動化庫):每次警示將關鍵維度(單號集合/票號集合/首次跌破月+警戒線)排序後 SHA2_256 成指紋;抑制視窗內同類型同指紋已發→靜音,內容變化→指紋變→照常通知。C# 端純函數AlertFingerprint/AlertSuppression(LogicBll\M.EIS\Alert\),SQL 端以 HASHBYTES 同構實作。 - 兩種警示源型態並存:
- SP 型(
TWORK_AUTO_AR_OVERDUE重用DARB_QRY_REC_QRY1查詢別=1 口徑;TWORK_AUTO_CHECK_DUE重用DARB_QRY_CHECK查詢別=31 收付票聯集)——走AutopilotMethod_LogSysExec(Dispatcher=SKD)零 C#。 - C# 型(
Flowcast_BaselineAlertAutoPilot task)——金流跌破判定重用FlowcastComposer.ApplyBaseline(有單測的純函數,不搬進 SQL);新增MailQueueEnqueuer(Common\Mail\)讓 C# 端也能入列。警戒線持久化到規則表門檻參數,解掉 UI-only 缺口。 - 金流跌破只通知首次跌破(使用者裁決):指紋維度=(首次跌破月, 警戒線)。
- 維護 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_OVERDUE、TWORK_AUTO_CHECK_DUE(auto 庫)+ log 庫 proc_param 登錄。 - 新檔:
SqlBI\twork_sys_alertrule.sql、SqlBI\twork_auto_alertlog.sql、SqlBI\TWORK_AUTO_AR_OVERDUE.sql、SqlBI\TWORK_AUTO_CHECK_DUE.sql、sql\alertrule-deploy.sql、sql\alertlog-deploy.sql、sql\ar-overdue-deploy.sql、sql\check-due-deploy.sql、LogicBll\M.EIS\Alert\*、Common\Mail\MailQueueEnqueuer.cs+MailQueueMessage.cs、AutoPilot\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(檢查點)。