採購對帳自動化

開發規格+操作手冊 整合摘要(新討論串起點)

一、背景

採購部目前的對帳作業仰賴人工從兩個系統撈 Excel,再用人眼比對、手動計算促銷調價額後回填。流程穩定但耗時、易錯,促銷品差額計算特別容易漏。

原始作業流程文件來源:Notion「採購部作業流程」。

二、現況對帳 SOP(六步驟)

  1. 登入莫筆克供應商查詢系統
  2. 執行結算作業:選廠商 + 選對帳月份 → 執行結算
  3. 等結算完成
  4. 結算完成 → 產出對帳報表(Excel A)
  5. 切換到莫筆克 ERP > 商品銷售,輸入條件(出貨日/時段/指定廠商/店鋪:全部),撈出銷售明細(Excel B)
  6. 兩份 Excel 人工比對:
    • 銷售數量 vs 對帳單「本期結算數量」須一致
    • 分開確認「一般商品」與「促銷商品」
    • 計算促銷調價額並回填

調價額公式:(促銷進價 - 原始進價)× 促銷商品銷售數量

調價額填回對帳 Excel「調價額」欄位後,廠商對帳總表會自動更新。

三、對帳的兩種情境

項目 寄賣 拋單
貨物位置 汐止大倉(公司) 廠商端
出貨方 公司倉管 廠商
對帳週期 月 月
對帳依據 銷售數量 銷售數量

兩種情境的對帳邏輯相同,差別只在「出貨方」與「貨物實體位置」。

四、自動化範圍(原始設計)

人工負責(不自動化)

  • SOP 步驟 1 到 5:登入兩個莫筆克系統、執行結算、下載兩個 Excel
  • 將兩個 Excel 上傳到自動化工具

系統負責(自動化)

  • 依品項比對兩份 Excel 的銷售數量
  • 區分一般商品/促銷商品
  • 自動計算每筆促銷品的調價額
  • 回填調價額到對帳 Excel
  • 產出比對報告:數量一致品項、數量不符品項(標警示)、調價額彙總

輸出:填好調價額的對帳 Excel + 一份比對結論報告。

五、原始技術方案(LINE + Cloudflare Pages)

2026-05-29 需求書當時規劃的方案:

  • 使用者入口 LINE:採購團隊用 LINE 溝通,不用 Slack;LINE 端只負責「傳網頁連結 + 通知」,不處理檔案
  • 處理介面 純前端網頁:採購點 LINE 內的連結開啟網頁,網頁拖入兩個 Excel,邏輯在瀏覽器本機跑(SheetJS 解 Excel),產出檔案直接下載
  • 資料安全:檔案完全不上傳任何 server
  • Hosting:Cloudflare Pages(免費、自帶 HTTPS、可綁公司 domain 如 duizhang.公司domain.com)
  • 不依賴 @Tako 所在的 K8s pod/私人 Slack 環境

原始 scope 排除項:登入權限、歷史對帳資料庫、多廠商批次處理、LINE Bot 對話介面。

六、實際落地版(2026-06-05)

最後沒走網頁路線,改成 Windows 本機 Python + 資料夾批次 的方案。

檔案位置:/home/node/workspace/monthly-reconcile/ 打包版:/home/node/workspace/monthly-reconcile.zip(5KB)

資產清單:

  • monthly.py:主程式,Python + openpyxl
  • run.bat:Windows 雙擊執行入口
  • requirements.txt:只有 openpyxl>=3.1
  • 使用說明.txt:給採購看的操作手冊
  • input/、output/:每月三類 xlsx 丟進去
  • back/(執行後才建立):歷月歸檔與執行報告

七、每月操作 SOP(採購版)

步驟 1:把當月三類檔案丟進 input 資料夾,檔名規則:

  • <廠商名> 對帳單.xlsx
  • <廠商名> 進貨單.xlsx
  • <廠商名> 銷售報表.xlsx

範例(耐嘉這家):

  • input\耐嘉 對帳單.xlsx
  • input\耐嘉 進貨單.xlsx
  • input\耐嘉 銷售報表.xlsx

300 家就把 900 個檔案全部丟在 input 資料夾即可,不用分子資料夾,程式會依檔名自動配對。

步驟 2:雙擊 run.bat

步驟 3:輸入年份(例如 2026)與月份(例如 5),按 Enter

步驟 4:等程式跑完(300 家大約幾分鐘),結果會自動歸檔到 back 資料夾:

back\
├── _執行報告_2026-05.csv   ← 全月彙總
├── 耐嘉05\
│   ├── input\   ← 原始 3 個檔案
│   └── output\  ← 填好的對帳單
└── 友嘉05\...

input 和 output 資料夾跑完會自動清空,下個月直接丟新檔案即可。

八、首次安裝

  1. 裝 Python(https://www.python.org/ ,安裝時勾選 Add to PATH)
  2. 開命令提示字元在本資料夾,執行 pip install openpyxl
  3. 之後每月只要做上面四步即可,不必再裝任何東西。

九、內部處理邏輯(monthly.py)

對每家廠商跑三段:

  1. 進貨統計:讀 <廠商> 進貨單.xlsx 的「進貨單統計」sheet,用「結案日期」年月過濾,依「品項條碼」sum「進貨數量」
  2. 銷售統計:讀 <廠商> 銷售報表.xlsx 的「銷售統計」sheet(已預先按月匯出),依「品項條碼」sum「銷售數量」
  3. 回填對帳單:讀 <廠商> 對帳單.xlsx 的「商品資料」sheet,依「品項條碼」把進貨數量寫入「進貨」欄、把銷售數量寫入「本月銷售」欄

配對 key:品項條碼(strip 後字串比對) 不匹配處理:把「進貨單有但對帳單沒對到」與「銷售報表有但對帳單沒對到」的條碼分別列到執行報告,供人工補 歸檔:跑成功的廠商,input 三檔 + output 對帳單自動搬到 back/<廠商>MM/,input output 清空

十、執行報告 CSV 欄位

_執行報告_YYYY-MM.csv(UTF-8 with BOM)欄位:

欄位 意義
廠商 廠商名稱
狀態 OK 或 缺檔
對帳單列數 對帳單商品資料 sheet 的有效列數
進貨對到 對到筆數/進貨單總條碼數,例如 56/57
銷售對到 對到筆數/銷售報表總條碼數
未對到的進貨品項條碼 進貨單有但對帳單沒對應品項的條碼
未對到的銷售品項條碼 銷售報表有但對帳單沒對應品項的條碼

十一、規格 vs 落地版 差異

項目 原始需求(2026-05-29) 落地版(2026-06-05)
使用者入口 LINE 傳連結 Windows 本機資料夾 + run.bat
執行環境 瀏覽器(SheetJS) 本機 Python + openpyxl
Hosting Cloudflare Pages 無(純本機)
對帳依據 銷售數量 + 促銷調價額 只做「進貨數量 + 銷售數量」按條碼配對
一般 vs 促銷 需區分 未實作
調價額計算 需自動算 + 回填 未實作
廠商規模 單廠商上傳 一次跑多廠商(300 家設計)
執行報告 未定 CSV,含未對到條碼清單
資料安全 檔案不離開瀏覽器 檔案不離開本機

十二、待釐清風險點(原始需求書列出)

  • 預入處理:採購已下單但貨未到時會手動把預計到貨量入庫,月底對帳要確認是否會把「預入單」誤算進銷售
  • 拋單情境:出貨資料其實在廠商端,對帳基礎是「成立的訂單」而非「實際出貨」,是否需要廠商提供出貨確認?
  • SKU 變動:品項代號若中途改過,比對 key 怎麼處理?
  • 買斷情境:原文件結尾有「2/11 待補買斷流程」,買斷的對帳邏輯尚未定義

十三、待提供素材(若要補齊促銷調價額)

  • 對帳報表 Excel 範本(脫敏版,從莫筆克供應商系統匯出)
  • ERP 商品銷售明細 Excel 範本(脫敏版,從莫筆克 ERP 匯出)
  • 確認「一般商品 vs 促銷商品」的判斷方式(欄位旗標?或進價差異?)
  • 促銷進價與原始進價的來源欄位(在哪份 Excel、哪個欄名)

十四、目前可跑狀態

  • 環境都還在:/home/node/workspace/monthly-reconcile/ 完整保留,input/ output/ 空、隨時可用
  • 打包版:/home/node/workspace/monthly-reconcile.zip
  • 首次使用者需自行裝 Python + pip install openpyxl
  • 目前功能:進貨與銷售數量比對 + 回填 + 未對條碼清單
  • 尚未補:促銷/一般品區分、調價額自動計算

十五、下一步(若開新討論串接著做)

  1. 決定是否補齊「促銷調價額」自動化,或這段仍留人工
  2. 若補,需收集脫敏範例檔 + 確認促銷判斷欄位
  3. 決定是否需要 UI 介面(重啟原始 LINE + Cloudflare Pages 方案),或本機批次即可
  4. 決定拋單/買斷情境是否納入本工具,或另立流程