- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml) - 部署模式: rsync Python 檔案至 188 → docker restart (volume mount) - Dockerfile/requirements 變動時自動重建 Docker image - 部署通知: Telegram (開始/成功/失敗) - 健康檢查: https://mo.wooo.work/health (最多 5 次重試) - 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
20 KiB
工作日誌 - 2026年01月12日
📅 日期
2026-01-12 (週日)
👤 執行者
Claude Code (AI Assistant)
📋 工作概要
今日主要完成兩大任務:
- MOMO 商品圖片修復與驗證 - 修復錯誤的商品圖片 URL,提升正確率從 86% 到 92%
- 每日業績儀表板需求規劃 - 完整規劃新功能的需求、設計與實作計畫
🎯 任務一:商品圖片修復專案
背景說明
從上次會話延續,系統中有大量商品的圖片 URL 不正確,主要問題是:
- 圖片 URL 格式錯誤(使用舊的 img2.momoshop.com.tw 格式)
- 圖片 URL 不包含對應的 i_code,導致圖片與商品不匹配
- 之前的全量更新已完成 4,526 個商品,但仍有許多錯誤
執行步驟
1. 初始狀態確認
時間: 上午 動作: 檢查圖片更新任務完成狀態
✅ 完成狀態:
- 全量更新已完成(4,526/4,529 商品)
- 成功更新: 2,834 個
- 跳過(已正確): 332 個
- 失敗: 1,360 個(主要為已下架商品)
2. 驗證圖片覆蓋率
檔案: check_missing_images.py
結果:
一般商品: 4,529 總數
- 有圖片: 4,151 (91.7%)
- 缺圖片: 378 (8.3%)
EDM 促銷: 4,931 (100%)
購物節: 662 (100%)
3. 驗證圖片正確性
檔案: verify_image_urls.py
方法: 抽樣 200 個商品檢查
結果:
✅ 正確: 198/200 (99.0%)
❌ 錯誤: 2/200 (1.0%)
4. 用戶反饋 - 第一批錯誤商品
商品編號: 9 個
14672839, 9216349, 13261678, 6676895, 13240823,
13240822, 10911080, 3876337, 8863611
處理:
- 建立
fix_specific_products.py - 逐一獲取正確圖片 URL
- ✅ 9/9 全部修復成功
修復範例:
❌ 舊: https://img4.momoshop.com.tw/ecm/img/online/341/2025/12/30/162906531/...
✅ 新: https://og.momoshop.com.tw/1767837323/goodsimg/0014/672/839/14672839_L.jpg
5. 用戶反饋 - 第二批錯誤商品
商品編號: 13 個
5939587, 14713987, 14237189, 13759520, 13330513, 13731019,
14049583, 14695038, 14373672, 13646926, 4633943, 6271461, 13559833
處理:
- 建立
fix_batch2_products.py - ✅ 13/13 全部修復成功
- 所有圖片 URL 已包含正確 i_code
6. 用戶反饋 - 第三批錯誤商品
商品編號: 31 個
6323590, 7904362, 5954422, 6009343, 4248163, 3331634, 7351198,
12589232, 11118441, 10755887, 9009264, 9562474, 11038732, 10901361,
9250857, 5477268, 9600967, 10440331, 10080994, 9900915, 3821684,
10567236, 13351736, 13351734, 12777975, 11640264, 5894654, 10050962,
8318051, 11593427, 9857434
處理:
- 建立
fix_batch3_products.py - ✅ 31/31 全部修復成功
- 驗證通過率 100%
7. 全面檢查與批量修復
用戶要求: "你再去檢查全部商品,再重新修復一次"
執行流程:
步驟 1: 全面檢查所有商品
python3 check_all_products.py
檢查結果:
總商品數(有圖片): 4,151
✅ 正確: 3,596 (86%)
❌ 錯誤: 555 (13%)
錯誤清單保存: incorrect_images.txt
步驟 2: 批量修復
python3 fix_all_incorrect.py
修復結果:
處理商品: 555 個
✅ 成功修復: 263 個 (47%)
❌ 修復失敗: 292 個 (53%)
失敗原因: 商品已下架或頁面無法訪問
步驟 3: 再次驗證
修復前: 3,596/4,151 正確 (86%)
修復後: 3,858/4,151 正確 (92%)
改善: +262 個商品 (+6%)
8. 完整備份
用戶要求: "全部處理完,請幫我完整備份起來,備份檔案名稱要加上日期和版本號"
備份執行:
備份名稱: momo_backup_20260112_v2.0
備份位置: backups/momo_backup_20260112_v2.0.tar.gz
備份大小: 41M (原 186M,壓縮率 78%)
備份內容:
- ✅ 資料庫 (momo_database.db)
- ✅ 修復報告 (repair_report_20260112.md)
- ✅ 檢查腳本 (check_all_products.py)
- ✅ 修復腳本 (fix_all_incorrect.py)
- ✅ 驗證腳本 (verify_image_urls.py)
- ✅ 工具模組 (utils/image_url_builder.py)
- ✅ 錯誤商品清單 (incorrect_images_20260112.txt)
- ✅ 說明文件 (README.md)
最終成果
數據統計
| 指標 | 修復前 | 修復後 | 改善 |
|---|---|---|---|
| 正確圖片 | 3,596 (86%) | 3,858 (92%) | +262 |
| 錯誤圖片 | 555 (13%) | 293 (7%) | -262 |
| 總商品數 | 4,151 | 4,151 | - |
手動修復統計
- 第一批: 9 個 ✅ 100% 成功
- 第二批: 13 個 ✅ 100% 成功
- 第三批: 31 個 ✅ 100% 成功
- 小計: 53 個全部成功
自動修復統計
- 檢測錯誤: 555 個
- 成功修復: 263 個 (47%)
- 修復失敗: 292 個 (53% - 主要為已下架商品)
剩餘問題分析
剩餘 293 個錯誤商品:
- 99% 使用舊格式 URL (img2.momoshop.com.tw)
- 主要原因: 商品已下架或頁面無法訪問
- 建議: 標記為「已下架」狀態
技術要點
核心解決方案
使用 utils/image_url_builder.py 中的 get_product_image_url() 函數:
def get_product_image_url(i_code: str) -> Optional[str]:
"""
從商品詳情頁的 og:image meta 標籤獲取正確圖片 URL
這確保圖片 URL 包含對應的 i_code
"""
detail_url = f"https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code={i_code}"
response = requests.get(detail_url, headers=headers, timeout=10)
pattern = r'<meta property="og:image" content="([^"]+)"'
match = re.search(pattern, response.text)
if match:
return match.group(1)
return None
圖片 URL 格式
錯誤格式(舊):
https://img2.momoshop.com.tw/ecm/img/online/341/2025/12/18/115728399/...
特徵: 不包含 i_code,無法確保圖片正確性
正確格式(新):
https://og.momoshop.com.tw/1767837323/goodsimg/0014/672/839/14672839_L.jpg
特徵: URL 路徑包含 i_code,確保圖片對應正確
驗證邏輯
def check_image_url_match(i_code: str, image_url: str) -> bool:
"""檢查圖片 URL 是否包含對應的 i_code"""
# TP 開頭商品: 檢查完整 i_code
if i_code.startswith('TP'):
return i_code in image_url
# 數字商品: 檢查路徑格式
# 格式1: /14672839_L.jpg
# 格式2: /0014/672/839/
code_num = str(int(i_code))
if f"/{code_num}_" in image_url or f"/{code_num}." in image_url:
return True
# 分段格式檢查
code_str = code_num.zfill(8)
part3 = code_str[-3:]
part2 = code_str[-6:-3]
part1 = code_str[:-6].zfill(4)
path_pattern = f"/{part1}/{part2}/{part3}/"
return path_pattern in image_url
建立的檔案
腳本檔案
check_specific_products.py- 檢查特定商品fix_specific_products.py- 修復特定商品fix_batch2_products.py- 修復第二批商品fix_batch3_products.py- 修復第三批商品check_all_products.py- 檢查全部商品fix_all_incorrect.py- 批量修復錯誤商品analyze_remaining.py- 分析剩餘錯誤
報告檔案
final_report.md- 完整修復報告incorrect_images.txt- 錯誤商品清單backups/momo_backup_20260112_v2.0/README.md- 備份說明
🎯 任務二:每日業績儀表板需求規劃
背景說明
時間: 下午/傍晚 用戶需求: 建立新的每日業績追蹤系統
需求內容
核心功能需求
-
Excel 匯入功能
- 匯入欄位對應
realtime_sales_monthly所有欄位 - 支援資料驗證和錯誤處理
- 顯示匯入進度和結果
- 匯入欄位對應
-
行事曆式儀表板
- UI/UX 風格延續現有頁面
- 每日業績卡片顯示
- 點擊展開詳細資料
-
業績對比分析
- 每日 vs 每日對比
- 每週同日對比(週一 vs 週一)
- 計算成長率和趨勢
-
資料整合
- 每日業績累加到現有業績分析儀表板
- 自動化統計計算
-
其他考量
- 完整流程設計
- 專業建議和最佳實踐
執行成果
1. TODO 任務建立
建立 12 項開發任務:
需求分析階段
- 需求分析:研究現有業績分析頁面和資料結構
資料庫設計階段
- 設計資料庫:新增 daily_sales 表格(欄位參考 realtime_sales_monthly)
後端開發階段
- 後端開發:實作 Excel 匯入功能(支援 realtime_sales_monthly 所有欄位)
- 後端開發:建立每日業績 API(CRUD + 統計計算)
- 業績對比邏輯:實作每日 vs 每日對比功能
- 業績對比邏輯:實作每週同日對比(週一 vs 週一等)
- 業績對比邏輯:計算成長率、趨勢分析
前端開發階段
- 前端開發:建立每日業績儀表板頁面(行事曆樣式)
- 前端開發:實作 Excel 匯入上傳介面
- 前端開發:設計業績對比視覺化圖表(日對比、週對比)
整合測試階段
- 整合功能:每日業績累加到現有業績分析儀表板
- 測試:完整流程測試(匯入、查看、對比、累加)
2. 完整需求規格書
檔案: docs/daily_sales_dashboard_spec.md
內容: 48 KB,包含 10 大章節
章節概要:
- 需求概述 - 專案背景和目標
- 核心功能 - Excel 匯入、行事曆儀表板、業績對比
- UI/UX 設計 - 視覺風格、行事曆樣式、互動設計
- 業績對比分析 - DoD, WoW, MoM, YoY 對比邏輯
- 資料庫設計 - daily_sales 和 daily_sales_summary 表格結構
- 後端 API 設計 - 7 個 API 端點規格
- 與現有儀表板整合 - 資料累加邏輯和顯示方式
- 技術建議 - 前後端技術選型和實作建議
- 開發階段規劃 - 4 個 Phase,預計 9-13 天
- 待討論事項 - 目標設定、權限管理、通知功能等
技術選型建議:
- 前端:FullCalendar.js + Chart.js + Bootstrap 5.3
- 後端:Flask + pandas + openpyxl
- 資料庫:SQLite(新增 2 張表)
- 排程:APScheduler
資料庫設計亮點:
daily_sales 表格
CREATE TABLE daily_sales (
id INTEGER PRIMARY KEY AUTOINCREMENT,
狀態, 日期, 時間, 訂單編號, 序號, 商品館, 小分類,
出貨方式, 商品ID, 商品名稱, 數量, 退貨數量,
總業績, 總成本, 付款, 是否超取,
使用P幣, 使用Hami_point, 使用儲值, 使用禮券,
created_at, updated_at,
INDEX idx_date (日期),
INDEX idx_product_id (商品ID),
INDEX idx_order_number (訂單編號)
);
daily_sales_summary 表格
CREATE TABLE daily_sales_summary (
id INTEGER PRIMARY KEY AUTOINCREMENT,
日期 TEXT UNIQUE NOT NULL,
總業績, 總成本, 毛利, 毛利率,
訂單數, 商品件數, 平均客單價,
日成長率, 週同日成長率, 月成長率, 年成長率,
created_at, updated_at
);
API 設計:
POST /api/daily_sales/import - 匯入 Excel
POST /api/daily_sales/validate - 驗證檔案
GET /api/daily_sales/calendar - 月度資料
GET /api/daily_sales/detail - 單日詳情
GET /api/daily_sales/compare - 業績對比
GET /api/daily_sales/trends - 趨勢資料
GET /api/daily_sales/top_products - 熱銷商品
3. 實作檢查清單
檔案: docs/daily_sales_implementation_checklist.md
內容: 完整的開發檢查清單
檢查項目統計:
- Phase 1 (後端基礎): 23 個檢查點
- Phase 2 (前端開發): 22 個檢查點
- Phase 3 (對比分析): 17 個檢查點
- Phase 4 (整合優化): 17 個檢查點
- 上線前檢查: 15 個檢查點
- 總計: 94 個檢查點
開發時程規劃:
Phase 1: 資料庫與後端基礎 - 2-3 天
Phase 2: 前端開發 - 3-4 天
Phase 3: 對比分析與視覺化 - 2-3 天
Phase 4: 整合與優化 - 2-3 天
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
總計: 9-13 天
建議開始時間: 2026-01-13(明天) 預計完成時間: 2026-01-24
專業建議重點
1. UI/UX 設計
行事曆樣式範例:
┌─────────────────────────────────────────────┐
│ 2026年 1月 [<] [今天] [>] │
├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
│ 日 │ 一 │ 二 │ 三 │ 四 │ 五 │ 六 │
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ │ │ │ 01 │ 02 │ 03 │ 04 │
│ │ │ │$123K│$145K│$167K│$189K│
│ │ │ │📈5% │📈8% │📈12%│📈15%│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
狀態顏色規則:
- 🟢 綠色: 成長 > 5%
- 🔴 紅色: 衰退 > 5%
- ⚪ 灰色: 變動 <= 5%
2. 業績對比邏輯
DoD (Day-over-Day) 日對日:
- 今日 vs 昨日
- 用於短期趨勢追蹤
WoW (Week-over-Week) 週同日:
- 本週一 vs 上週一
- 消除週末/平日差異
- 發現週期性趨勢
MoM (Month-over-Month) 月對月:
- 本月 vs 上月
- 中期趨勢分析
YoY (Year-over-Year) 年對年:
- 今年 vs 去年
- 長期趨勢和季節性分析
成長率計算公式:
成長率 = ((本期 - 前期) / 前期) * 100%
移動平均成長率 (7日) = SUM(過去7日成長率) / 7
3. 資料整合方案
方案 A: 定時累加(推薦)
# 每日凌晨 00:30 執行
def accumulate_daily_sales():
yesterday = get_yesterday()
daily_data = fetch_daily_sales(yesterday)
for record in daily_data:
upsert_to_monthly(record)
refresh_dashboard_cache()
優點:
- 不影響匯入速度
- 可以批次驗證
- 易於除錯
方案 B: 即時累加
- 匯入時同步寫入 realtime_sales_monthly
- 優點: 即時性高
- 缺點: 匯入速度較慢
4. 效能優化建議
大量資料匯入:
# 使用批次處理
batch_size = 1000
for i in range(0, len(data), batch_size):
batch = data[i:i+batch_size]
with db.begin():
batch.to_sql('daily_sales', con=db,
if_exists='append', index=False)
資料庫索引:
- 日期欄位:加速日期範圍查詢
- 商品ID:加速商品分析
- 訂單編號:加速去重檢查
API 快取:
# 使用 Redis 快取月度資料
@cache.cached(timeout=300) # 5 分鐘
def get_calendar_data(year, month):
return query_monthly_summary(year, month)
5. 安全性考量
檔案上傳驗證:
- 限制檔案大小(10MB)
- 限制檔案類型(.xlsx, .xls)
- 檔案內容掃描(防毒)
SQL Injection 防護:
# 使用參數化查詢
cursor.execute(
"SELECT * FROM daily_sales WHERE 日期 = ?",
(date,)
)
權限控制:
- 匯入功能需要管理員權限
- 查看功能可開放給一般用戶
待討論事項
用戶需要後續確認的問題:
-
目標設定功能
- 是否需要設定每日/週/月業績目標?
- 目標設定介面如何設計?
-
權限管理
- 誰可以匯入 Excel?
- 誰可以查看業績數據?
-
通知功能
- 業績達標/未達標時是否發送通知?
- 通知方式:Email / LINE / 站內訊息?
-
匯出功能
- 是否需要將對比分析結果匯出為 Excel/PDF?
-
行動裝置支援
- 行事曆在手機上的呈現方式?
- 是否需要開發 App?
📊 今日工作統計
時間分配
商品圖片修復: ~6-7 小時
- 用戶反饋修復: 2 小時
- 全面檢查修復: 3 小時
- 備份與報告: 1-2 小時
業績儀表板規劃: ~3-4 小時
- 需求理解: 0.5 小時
- 規格書撰寫: 2 小時
- 檢查清單建立: 1 小時
- TODO 記錄: 0.5 小時
總計: ~9-11 小時
建立檔案統計
腳本檔案: 7 個
- check_specific_products.py
- fix_specific_products.py
- fix_batch2_products.py
- fix_batch3_products.py
- check_all_products.py
- fix_all_incorrect.py
- analyze_remaining.py
報告文件: 3 個
- final_report.md
- incorrect_images.txt
- backups/.../README.md
規劃文件: 2 個
- docs/daily_sales_dashboard_spec.md (48KB)
- docs/daily_sales_implementation_checklist.md
備份檔案: 1 個
- backups/momo_backup_20260112_v2.0.tar.gz (41MB)
總計: 13 個檔案
程式碼執行統計
Python 腳本執行: 15+ 次
資料庫查詢: 4,151+ 商品
修復商品數: 315 個(手動53 + 自動262)
備份資料: 186 MB → 41 MB
文件撰寫統計
需求規格書: ~8,000 字
實作清單: ~3,000 字
修復報告: ~2,000 字
工作日誌: ~4,000 字(本文件)
總計: ~17,000 字
🎯 成果交付
任務一交付物
- ✅ 修復後資料庫(正確率 92%)
- ✅ 完整備份檔案(momo_backup_20260112_v2.0.tar.gz)
- ✅ 修復報告(final_report.md)
- ✅ 錯誤商品清單(incorrect_images_20260112.txt, 293個)
- ✅ 7 個修復/檢查腳本
- ✅ 工具模組(utils/image_url_builder.py)
任務二交付物
- ✅ TODO 任務清單(12 項)
- ✅ 完整需求規格書(48KB, 10章節)
- ✅ 實作檢查清單(94 個檢查點)
- ✅ 開發時程規劃(9-13 天)
- ✅ 技術選型建議
- ✅ 資料庫設計方案
- ✅ API 設計規格
💡 重要決策記錄
圖片修復專案
-
採用 og:image meta 標籤方案
- 理由: 確保圖片 URL 包含正確 i_code
- 效果: 成功率 47%,正確率提升至 92%
-
保留 293 個修復失敗的商品
- 理由: 主要為已下架商品,無法獲取有效圖片
- 建議: 標記為 INACTIVE 狀態
-
定期驗證機制
- 建議: 每月執行一次全面檢查
- 工具: check_all_products.py
業績儀表板專案
-
採用 FullCalendar.js
- 理由: 功能完整、文件齊全、社群活躍
- 替代方案: Toast UI Calendar(輕量級)
-
採用定時累加方案
- 理由: 不影響匯入速度,易於維護
- 時間: 每日凌晨 00:30 執行
-
MVP 優先策略
- 優先: Excel 匯入 + 行事曆顯示
- 其次: 業績對比分析
- 最後: 進階功能(目標設定、通知等)
-
資料庫設計雙表方案
- daily_sales: 存放訂單明細
- daily_sales_summary: 存放統計摘要
- 理由: 分離明細和統計,提升查詢效能
📌 待辦事項(明日)
高優先級
- 與用戶確認業績儀表板需求細節
- 決定待討論事項(目標設定、權限、通知等)
- 開始 Phase 1 開發(資料庫設計)
中優先級
- 處理剩餘 293 個錯誤商品(標記狀態)
- 更新 scheduler.py 使用新的圖片獲取方法
低優先級
- 建立定期圖片驗證排程
- 優化現有業績分析頁面效能
📝 學習與心得
技術收穫
-
圖片 URL 驗證邏輯
- 學習如何驗證 URL 與 i_code 的對應關係
- 處理數字和 TP 開頭商品的不同邏輯
-
批量資料處理
- 使用 pandas 進行大量資料的讀取和驗證
- 交易 (transaction) 確保資料一致性
-
需求分析與規劃
- 完整的需求規格書撰寫
- 開發時程估算和階段規劃
- 技術選型的考量因素
溝通要點
-
即時回應用戶反饋
- 用戶提供錯誤商品時立即處理
- 每批處理完畢立即驗證
-
完整的交付文件
- 備份包含完整說明
- 報告清楚列出成果和剩餘問題
-
前瞻性規劃
- 為新需求提供多種方案
- 列出待討論事項供用戶決策
🔗 相關檔案連結
圖片修復相關
- 備份檔案:
backups/momo_backup_20260112_v2.0.tar.gz - 修復報告:
final_report.md - 錯誤清單:
incorrect_images.txt - 檢查腳本:
check_all_products.py - 修復腳本:
fix_all_incorrect.py - 驗證腳本:
verify_image_urls.py - 工具模組:
utils/image_url_builder.py
業績儀表板相關
- 需求規格:
docs/daily_sales_dashboard_spec.md - 實作清單:
docs/daily_sales_implementation_checklist.md - TODO 系統: 已記錄 12 項任務
資料庫
- 主資料庫:
data/momo_database.db(186MB) - 備份資料庫:
backups/momo_backup_20260112_v2.0/momo_database.db
✅ 簽核
執行者: Claude Code (AI Assistant) 日期: 2026-01-12 狀態: ✅ 全部完成 下次工作: 2026-01-13(開始每日業績儀表板開發)
文件版本: 1.0 最後更新: 2026-01-12 23:59