2026年10月20日 星期二

SMTMS 技術分享:從 AI Coding Agent 開發到資料一致性,打造供應商品質與材料追溯系統

 

SMTMS 技術分享:從 AI Coding Agent 開發到資料一致性,打造供應商品質與材料追溯系統

一、為什麼要做 SMTMS?

在製造業的供應商品質管理中,管理供應商、物料與進料檢驗只是基本需求。真正困難的地方,是當物料發生品質異常時,系統能否提供足夠的資料,說明物料從哪裡來、經過哪些檢驗,以及目前處於什麼狀態。

例如,一批物料收到工廠後,會經過收料、內部批次拆分與 IQC(Incoming Quality Control,進料品質檢驗)等流程。如果後續發現品質問題,就必須能夠回頭查明來源,而不是只找到一筆孤立的檢驗紀錄。

因此,我以 SMTMS(Supplier Material Traceability Management System)作為專案,嘗試整合供應商管理、物料管理、進料作業、品質檢驗、異常處理與追溯相關功能。

這個專案的重點不是單純完成 CRUD,而是思考如何讓系統中的資料具有可追溯性、業務規則具有一致性,以及權限控制不會因為 AI 生成程式碼而被忽略。

二、技術架構與選型

SMTMS 採用前後端分離的架構,後端負責業務規則、資料驗證與 API,前端負責操作介面與資料呈現。

技術用途
FastAPI後端 API 與請求處理
SQLAlchemy 2.xORM 與資料存取
Alembic資料庫結構版本管理
MySQL業務資料儲存
RedisJWT Token 撤銷等相關狀態管理
React 19 + TypeScript前端介面
Vite前端開發與建置
Tailwind CSS介面樣式
Docker Compose開發環境服務編排
Nginx前端與服務入口相關配置
JWT + RBAC身分驗證與角色權限控制
uvPython 依賴管理

資料庫使用既有的外部 MySQL,Redis 則透過 Docker Compose 提供開發環境服務。這樣的安排也讓資料庫與應用程式容器的生命週期可以分開管理。

在資料存取層,使用 SQLAlchemy 管理 ORM 與資料庫操作,透過 Alembic 管理 Schema 變更,避免開發過程中只修改程式模型,卻忘記同步資料庫結構。

三、核心設計:資料關聯必須反映真實業務流程

在材料追溯系統中,最重要的不是能查出多少筆資料,而是查詢結果是否有實際紀錄支持。

SMTMS 的核心資料關係包含:

Supplier Lot → Material Receipt → Internal Material Lot → IQC Record

各個環節分別代表供應商批次、實際收料、工廠內部批次,以及進料檢驗紀錄。

這些關係必須透過實際建立的資料與關聯取得,不能只依照物料編號或 BOM(Bill of Materials,物料清單)推測某批物料實際使用在哪裡。

這個設計原則可以歸納為:

  • 資料關聯必須有明確來源。

  • 批次與收料紀錄必須保持一致。

  • 檢驗結果與批次放行狀態必須符合業務規則。

  • 缺少實際紀錄時,系統應明確反映資料不足,而不是自行推論。

這些原則比單純增加查詢畫面更重要,因為它們決定了系統提供的資訊能否被信任。

四、資料一致性:不能只依賴前端驗證

在收料與批次管理中,數量錯誤可能直接影響後續的品質管理與庫存資料。

例如,假設某次收料的數量為 100 件,系統允許建立內部批次時拆分數量,但所有拆分數量的總和不能超過實際可分配的收料數量。

如果只在前端檢查數量,使用者仍可能透過直接呼叫 API、重複送出請求,或同時執行多筆操作,造成資料不一致。

因此,這類規則必須在後端進行驗證,並根據操作的資料依賴關係設計交易與併發控制。

在開發過程中,我特別關注以下問題:

  1. 收料與內部分批之間的數量限制。

  2. 同一物料與供應商批次之間的關聯一致性。

  3. IQC 檢驗結果與放行狀態的同步。

  4. 多筆資料更新失敗時,是否可能留下部分完成的結果。

  5. 重複請求或併發操作是否可能突破既有驗證。

這些問題不能只靠增加欄位驗證解決,還需要檢查資料庫約束、交易邊界及實際的資料更新順序。

尤其在併發情境下,單元測試通過不代表真實 MySQL 多連線操作一定安全。涉及資料競爭的功能,仍需要適當的整合測試與併發測試,才能進一步確認其正確性。

五、權限設計:驗證身分不等於授權成功

SMTMS 使用 JWT 進行身分驗證,並透過 RBAC(Role-Based Access Control)管理角色與權限。

除了確認使用者是否登入,還必須判斷使用者能否執行特定操作,以及是否有權存取指定供應商的資料。

例如,供應商使用者不應只因為知道其他供應商的資料 ID,就能讀取或修改對方的品質紀錄。

因此,權限檢查不能只存在於前端選單或按鈕。即使前端隱藏了某個功能,後端 API 仍然必須獨立驗證權限與資料範圍。

在這個架構中,需要分別考慮:

  • Authentication: 確認使用者身分。

  • Authorization: 確認使用者是否具有所需權限。

  • Data Isolation: 確認使用者只能存取被授權的資料範圍。

  • Token Revocation: 在登出等情境下,透過 Redis 等機制管理已撤銷的 Token。

這些概念彼此相關,但不能互相取代。通過登入驗證,不代表自動擁有所有 API 的存取權限。

六、品質異常管理:讓異常處理成為可追蹤流程

品質異常管理不只是建立一筆異常紀錄,還涉及調查、處置、確認與結案等不同階段。

如果系統只保留異常描述與目前狀態,卻沒有記錄處置內容或操作歷程,就很難理解異常是如何被處理的。

因此,品質異常相關設計需要考慮:

  • 異常紀錄及其關聯資料。

  • 調查與處置內容。

  • 狀態變更及歷程。

  • 附件上傳、下載與刪除。

  • 使用者的操作權限與供應商資料隔離。

附件也不只是檔案上傳問題。系統必須確認檔案與業務紀錄的關聯、存取權限,以及刪除操作的授權範圍。

不過,品質異常管理與完整 CAPA(Corrective and Preventive Action,矯正與預防措施)並不是同一件事。若尚未具備根因分析、矯正措施、預防措施及有效性驗證等完整流程,就不應把一般異常處理功能描述成已完成的 CAPA 系統。

七、AI Coding Agent:開發速度之外,更重要的是限制錯誤

這個專案的另一個重點,是使用 AI Coding Agent 協助開發。

AI 可以協助建立 API、整理 ORM、撰寫前端頁面、補充測試與處理錯誤,但產出程式碼並不代表業務邏輯一定正確。

尤其當需求涉及資料一致性、批次關聯或權限隔離時,AI 可能產生語法正確、卻違反業務規則的實作。

因此,我採取的開發思路不是讓 Agent 自由擴大功能,而是盡可能明確定義修改範圍與驗證條件。

1. 先理解現有實作,再修改程式

面對既有程式或錯誤訊息,先確認實際執行流程、資料表結構、API 路由與相關測試,再判斷問題出在哪裡。

不應只根據錯誤訊息就直接新增欄位、服務類別或抽象層。

2. 明確定義不可違反的業務規則

例如:

  • 收料數量不可超過允許範圍。

  • 內部分批總數不可超過可分配數量。

  • 供應商資料不可跨租戶或授權範圍存取。

  • IQC 檢驗結果與放行狀態必須一致。

  • 追溯結果必須由實際資料關聯取得。

這些規則應該成為 Agent 修改程式時的明確限制,而不是依賴模型自行猜測。

3. 控制修改範圍

採取 KISS 與最小修改原則,優先重用既有的程式模式,避免為了單一需求就引入不必要的 DTO、Service、Helper 或新的抽象層。

修改範圍越大,回歸測試與理解成本通常也越高。

4. 讓驗證結果有明確依據

透過自動化測試、型別檢查、Lint、Migration 檢查與前端建置,確認修改至少符合已定義的技術條件。

但也必須區分測試通過與功能完整:測試只能證明已覆蓋的情境,不能自動證明所有業務規則都正確。

八、為什麼要拆分規格文件?

隨著專案功能增加,單一 spec.md 容易同時包含需求、目前實作、已知缺陷、資料表結構、測試結果與未來規劃。

這會讓 AI Coding Agent 難以判斷哪些是必須遵守的規則、哪些只是目前的程式行為,以及哪些功能尚未實作。

因此,SMTMS 的文件整理方向是將不同責任分開:

  • 01_SRS.md:系統應該提供什麼功能。

  • 02_DOMAIN_RULES.md:業務上不能違反的規則。

  • 03_ADR.md:架構與技術決策。

  • 04_API_CONTRACT.md:API 契約。

  • 05_DATABASE_SCHEMA.md:資料庫結構。

  • 06_CURRENT_STATE.md:目前的實作狀態與已知限制。

  • 07_ACCEPTANCE.md:如何驗證功能是否符合需求。

  • 08_ROADMAP.md:未來的開發順序與優先級。

這樣的拆分不只是文件管理,而是把原本依賴開發者記憶的知識,轉換成 Agent 可以明確引用的工程約束。

九、目前仍需持續驗證的部分

SMTMS 的開發不能只以功能頁面是否存在作為完成標準。

後續仍需要針對以下項目持續確認:

  • 真實 MySQL 多連線下的併發正確性。

  • 所有關鍵業務規則是否都有負向測試。

  • 追溯查詢是否能完整呈現實際存在的關聯鏈。

  • 品質異常是否具備完整的稽核歷程與 CAPA 流程。

  • 報表與匯出是否符合完整資料集的需求。

  • 部署、安全性與效能是否經過實際環境驗證。

這些項目必須依照實際完成的實作與測試逐步確認,不應因為規格已經列出,就認定功能已經完成。

十、結語

SMTMS 對我而言,不只是練習 FastAPI、React 或資料庫操作的專案,更是一個思考 AI 輔助工程開發方式的實例。

AI Coding Agent 可以加速程式碼產出,但工程上的責任並沒有因此消失。資料是否正確、交易是否一致、權限是否完整,以及系統是否真正符合業務規則,仍然需要透過明確的設計、可驗證的測試與持續的人工判斷來確保。

我認為 AI 輔助開發最有價值的地方,不是讓 AI 一次寫出大量程式碼,而是讓它在明確的規則與邊界下完成工作,並讓每一次修改都能被理解、被驗證,也能在出問題時被追查。

這也是 SMTMS 希望呈現的工程方向:以 AI 提升開發效率,以領域規則控制風險,以測試與證據確保系統的可信度。

沒有留言:

張貼留言

SMTMS 技術分享:從 AI Coding Agent 開發到資料一致性,打造供應商品質與材料追溯系統

  SMTMS 技術分享:從 AI Coding Agent 開發到資料一致性,打造供應商品質與材料追溯系統 一、為什麼要做 SMTMS? 在製造業的供應商品質管理中,管理供應商、物料與進料檢驗只是基本需求。真正困難的地方,是當物料發生品質異常時,系統能否提供足夠的資料,說明物料...