# CN/TH 簡訊解析規則及流程簡述 ## 解析流程 ### 流程圖 ```mermaid flowchart TD receive[收到簡訊<br />存入資料庫] --> by_country[依系統環境判斷國別] by_country -->|CN| parse_bank_name[從簡訊內容中<br />查找銀行名稱] parse_bank_name -->|找到銀行名稱| get_bank_rules[取得該銀行規則] get_bank_rules --> parse_cn["解析簡訊內容<br />(含日期)"] parse_cn --> done_cn[解析完畢] parse_bank_name ---->|找不到銀行名稱| fail_cn[解析失敗] by_country -->|TH| parse_sim_server_info["解析 SIM Server 給的<br />發件人 (銀行名稱)<br />及收件時間"] parse_sim_server_info --->|找到銀行名稱| parse_th[解析簡訊內容] parse_th --> done_th[解析完畢] parse_sim_server_info ---->|找不到銀行名稱| fail_th[解析失敗] ``` ### CN、TH 共通 (解析前置作業) 1. 收到簡訊,存入資料庫,包含以下欄位: | SN | Name | Descrition | | :---: | --------------------- | ----------------------------- | | 1 | **ID** | 流水號 | | 2 | **SERVER_NAME** | 伺服器名稱 | | 3 | **SIM_ID** | 接收端口 | | 4 | **RECEIVE_TIMESTAMP** | 設備收到簡訊/送達報告的時間戳 | | 5 | **SMS_TYPE** | 標誌是否為送達報告 | | 6 | **SENDER** | 發件人 | | 7 | **RECEIVER** | 收件人 | | 8 | **MSG** | 簡訊內容 | | 9 | **CREATE_DATE** | 建立時間 | | 10 | **UNUSUAL_FLAG** | 是否有異常關鍵字 | ### CN 1. 先從 **簡訊內容** 中解析出 <u>**銀行名稱**</u> :::info 如 `【张家口银行】`、`[张家口银行]` 或 `%张家口银行%` (CN 的簡訊中銀行名稱一般會用 `【】`、`[]` 或 `%%` 包住) 這裡的銀行名稱,必須在各銀行規則設定頁最底部的 **銀行名稱 (包括子銀行)** 區塊有設置 程式會依據這個銀行名稱,篩選出該銀行專屬的解析規則 如果這一步解不出銀行名稱,則解析失敗 2. 根據 **簡訊內容 (`MSG`)** 欄位及設定好的該銀行 **簡訊解析規則** 進行解析 :::info **簡訊內容** 中也會包含 <u>**日期**</u> 和 <u>**時間**</u> 如果沒有時間,解析出來的時間會代入 <u>**當天的最後一秒**</u> (23:59:59) 如果連日期都沒有,會代入 <u>**解析執行當天的最後一秒**</u> 3. 解析完畢 ### TH 1. 根據**簡訊內容 (`MSG`)**、**發件人 (`SENDER`)、收信時間 (`RECEIVE_TIMESTAMP`)** 3 個欄位 及設定好的**簡訊解析規則**進行解析 :::info 比 CN 多了 **`SENDER`** 和 **`RECEIVE_TIMESTAMP`** 2 個欄位, 需要從前者取得**銀行別**,從後者取出**精確的年月日時間** ::: 2. 解析完畢 :::warning TH 不看簡訊時間,一律以接收時間為準,參見: * **[[CAS-296] [TH] TTB新增@解析規則](https://jira.1-pay.co/browse/CAS-296) ([#1049](http://10.34.0.121/web/paymentpool/-/issues/1049))** 關聯 issue: * [[CAS-230] [TH] 支援泰國銀行短信日期格式](https://jira.1-pay.co/browse/CAS-230) ([#956](http://10.34.0.121/web/paymentpool/-/issues/956)) * [[CAS-237] [TH] 支援 KKB (KKP) 銀行短信解析與匹配規則](https://jira.1-pay.co/browse/CAS-237) ([#969](http://10.34.0.121/web/paymentpool/-/issues/969)) * [[CAS-262] [TH] KKP/KKB銀行短信解析加入sim server日期時間](https://jira.1-pay.co/browse/CAS-262) ([#1003](http://10.34.0.121/web/paymentpool/-/issues/1003)) * [[CAS-300] [TH] ttb(ttbank)轉出轉入的短訊 配卡時要忽略卡號 只找銀行別](https://jira.1-pay.co/browse/CAS-300) ([#1053](http://10.34.0.121/web/paymentpool/-/issues/1053)) * [[CAS-559] [TH] 調整代碼以適應銀行短信的新時間格式](https://jira.1-pay.co/browse/CAS-559) ([#1307](http://10.34.0.121/web/paymentpool/-/issues/1307)) ::: ## 說明 * 雖然從步驟上來說,TH 比 CN 少了 1 動, 但由於目前 (2024-01-04) 程式以 CN 為主,僅關注 `MSG` 本身的解析, 所以需要額外撰寫處理 `SENDER` 和 `RECEIVE_TIMESTAMP` 的程式 * [CAS-237](https://jira.1-pay.co/browse/CAS-237) 解決了 `SENDER` 部分 * [CAS-262](https://jira.1-pay.co/browse/CAS-262) 即將解決 `RECEIVE_TIMESTAMP` 的部分 ## 備註 ### 手動配置解析規則 * 會需要指定[**正規表示式命名捕獲組**](https://www.runoob.com/w3cnote/java-capture-group.html)的名稱: ```regex! โอนเข้า บ\/ช (?<receiverAccount>X\d{4})\s(?<amount>[\d\.,]+) บาท ใช้ได้ (?<balance>[\d\.,]+) บาท ณ (?<actionTime>(\d{1,2})(?:ม.ค|ก.พ|มี.ค|เม.ย|พ.ค|มิ.ย|ก.ค|ส.ค|ก.ย|ต.ค|พ.ย|ธ.ค)) ``` 上面的 *receiverAccount*、*amount*、*balance* 和 *actionTime* 就是命名捕獲組的名稱 * pool 目前只允許 10 種捕獲組名稱 (原為 8 種,[CAS-582](https://jira.1-pay.co/browse/CAS-582) 新增隱碼姓名 2 種): | SN | Name | Description | | :---: | -------------------------- | ----------------- | | 1 | **actionTime** | 操作時間 | | 2 | **receiverUsername** | 收款姓名 | | 3 | **maskedReceiverUsername** | 收款姓名 (含隱碼) | | 4 | **receiverAccount** | 收款尾號 | | 5 | **transferUsername** | 出款姓名 | | 6 | **maskedTransferUsername** | 出款姓名 (含隱碼) | | 7 | **transferAccount** | 出款尾號 | | 8 | **amount** | 金額 | | 9 | **balance** | 餘額 | | 10 | **postScript** | 附言 | 使用除此之外的捕獲組名稱<u>**均無效**</u>,會造成解析失敗 :::info 前端:`moduleParameterTypeList` in resources/js/pinia/SMS/shared/values.js 後端:\App\Domains\CashpoolManage\SmsParsingRule\ModeParameter\TypeList ::: ### 模組化配置解析規則 * <u>不須</u>在各項參數的正規表示式中指定捕獲組名稱,直接寫好正規表示式即可; 程式會依類型自動套用以上列出的名稱 如下圖 (`簡訊 > 簡訊解析規則 > 簡訊各銀行規則 > 參數管理`): ![image](https://hackmd.io/_uploads/SyKX9rEuT.png)