---
# System prepended metadata

title: CN/TH 簡訊解析規則及流程簡述
tags: [Pool, HSress, SMS Parsing]

---

# 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)
