採購對帳自動化
開發規格+操作手冊 整合摘要(新討論串起點)
一、背景
採購部目前的對帳作業仰賴人工從兩個系統撈 Excel,再用人眼比對、手動計算促銷調價額後回填。流程穩定但耗時、易錯,促銷品差額計算特別容易漏。
原始作業流程文件來源:Notion「採購部作業流程」。
二、現況對帳 SOP(六步驟)
- 登入莫筆克供應商查詢系統
- 執行結算作業:選廠商 + 選對帳月份 → 執行結算
- 等結算完成
- 結算完成 → 產出對帳報表(Excel A)
- 切換到莫筆克 ERP > 商品銷售,輸入條件(出貨日/時段/指定廠商/店鋪:全部),撈出銷售明細(Excel B)
- 兩份 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 + openpyxlrun.bat:Windows 雙擊執行入口requirements.txt:只有openpyxl>=3.1使用說明.txt:給採購看的操作手冊input/、output/:每月三類 xlsx 丟進去back/(執行後才建立):歷月歸檔與執行報告
七、每月操作 SOP(採購版)
步驟 1:把當月三類檔案丟進 input 資料夾,檔名規則:
<廠商名> 對帳單.xlsx<廠商名> 進貨單.xlsx<廠商名> 銷售報表.xlsx
範例(耐嘉這家):
input\耐嘉 對帳單.xlsxinput\耐嘉 進貨單.xlsxinput\耐嘉 銷售報表.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 資料夾跑完會自動清空,下個月直接丟新檔案即可。
八、首次安裝
- 裝 Python(
https://www.python.org/,安裝時勾選 Add to PATH) - 開命令提示字元在本資料夾,執行
pip install openpyxl - 之後每月只要做上面四步即可,不必再裝任何東西。
九、內部處理邏輯(monthly.py)
對每家廠商跑三段:
- 進貨統計:讀
<廠商> 進貨單.xlsx的「進貨單統計」sheet,用「結案日期」年月過濾,依「品項條碼」sum「進貨數量」 - 銷售統計:讀
<廠商> 銷售報表.xlsx的「銷售統計」sheet(已預先按月匯出),依「品項條碼」sum「銷售數量」 - 回填對帳單:讀
<廠商> 對帳單.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 - 目前功能:進貨與銷售數量比對 + 回填 + 未對條碼清單
- 尚未補:促銷/一般品區分、調價額自動計算
十五、下一步(若開新討論串接著做)
- 決定是否補齊「促銷調價額」自動化,或這段仍留人工
- 若補,需收集脫敏範例檔 + 確認促銷判斷欄位
- 決定是否需要 UI 介面(重啟原始 LINE + Cloudflare Pages 方案),或本機批次即可
- 決定拋單/買斷情境是否納入本工具,或另立流程