Some checks failed
CD Pipeline / deploy (push) Failing after 59s
- 建立 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>
198 lines
6.2 KiB
Python
198 lines
6.2 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
修復廠商郵件資料
|
||
如果您之前匯入的廠商沒有郵件資料,可以使用此腳本重新匯入
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
import pandas as pd
|
||
|
||
# 加入專案路徑
|
||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||
|
||
from database.vendor_manager import VendorDatabaseManager
|
||
|
||
def import_vendor_emails_from_excel(excel_path):
|
||
"""
|
||
從 Excel 匯入廠商郵件
|
||
|
||
Args:
|
||
excel_path: Excel 檔案路徑
|
||
|
||
預期欄位:
|
||
- 來源供應商編號 (必填)
|
||
- 來源供應商名稱 (必填)
|
||
- Mail (選填)
|
||
"""
|
||
|
||
print("=" * 60)
|
||
print("廠商郵件資料匯入工具")
|
||
print("=" * 60)
|
||
|
||
# 檢查檔案是否存在
|
||
if not os.path.exists(excel_path):
|
||
print(f"\n❌ 檔案不存在: {excel_path}")
|
||
return
|
||
|
||
print(f"\n讀取檔案: {excel_path}")
|
||
|
||
try:
|
||
# 讀取 Excel
|
||
df = pd.read_excel(excel_path)
|
||
print(f"總行數: {len(df)}")
|
||
print(f"欄位: {list(df.columns)}")
|
||
|
||
# 驗證欄位
|
||
required_columns = ['來源供應商編號', '來源供應商名稱']
|
||
missing = [col for col in required_columns if col not in df.columns]
|
||
if missing:
|
||
print(f"\n❌ 缺少必要欄位: {', '.join(missing)}")
|
||
return
|
||
|
||
if 'Mail' not in df.columns:
|
||
print(f"\n⚠️ 未找到 'Mail' 欄位,無法匯入郵件資料")
|
||
return
|
||
|
||
# 初始化資料庫
|
||
db = VendorDatabaseManager()
|
||
|
||
# 統計
|
||
vendor_updated = 0
|
||
email_added = 0
|
||
email_skipped = 0
|
||
vendor_not_found = 0
|
||
|
||
print(f"\n開始處理...")
|
||
|
||
# 逐行處理
|
||
for idx, row in df.iterrows():
|
||
vendor_code = str(row.get('來源供應商編號', '')).strip()
|
||
vendor_name = str(row.get('來源供應商名稱', '')).strip()
|
||
|
||
# 支援多種郵件欄位名稱(Mail, MAIL, mail, 郵件 等)
|
||
email = ''
|
||
for mail_col in ['Mail', 'MAIL', 'mail', 'E-mail', 'EMAIL', 'email', '郵件', 'E-Mail']:
|
||
if mail_col in df.columns and pd.notna(row.get(mail_col)):
|
||
email = str(row.get(mail_col, '')).strip()
|
||
break
|
||
|
||
if not vendor_code or not vendor_name:
|
||
continue
|
||
|
||
# 檢查廠商是否存在
|
||
vendor = db.get_vendor_by_code(vendor_code)
|
||
if not vendor:
|
||
print(f" ⚠️ 廠商不存在: {vendor_code} - {vendor_name}")
|
||
vendor_not_found += 1
|
||
|
||
# 詢問是否要新增
|
||
if idx == 0 or vendor_not_found <= 3: # 只問前幾個
|
||
response = input(f" 是否要新增此廠商? (y/n): ").lower()
|
||
if response == 'y':
|
||
new_vendor = db.add_vendor(vendor_code, vendor_name)
|
||
if new_vendor:
|
||
print(f" ✅ 已新增廠商")
|
||
vendor_updated += 1
|
||
else:
|
||
print(f" ❌ 新增失敗")
|
||
continue
|
||
else:
|
||
continue
|
||
else:
|
||
continue
|
||
else:
|
||
vendor_updated += 1
|
||
|
||
# 如果有郵件地址,新增到廠商郵件表
|
||
if email and '@' in email:
|
||
# 可能有多個郵件(用逗號或分號分隔)
|
||
emails = email.replace(';', ',').split(',')
|
||
for single_email in emails:
|
||
single_email = single_email.strip()
|
||
if single_email and '@' in single_email:
|
||
result = db.add_vendor_email(
|
||
vendor_code=vendor_code,
|
||
email=single_email,
|
||
email_type='primary'
|
||
)
|
||
if result:
|
||
print(f" ✅ {vendor_code} | 新增郵件: {single_email}")
|
||
email_added += 1
|
||
else:
|
||
print(f" ⚠️ {vendor_code} | 郵件已存在: {single_email}")
|
||
email_skipped += 1
|
||
|
||
# 顯示結果
|
||
print("\n" + "=" * 60)
|
||
print("匯入完成")
|
||
print("=" * 60)
|
||
print(f"處理廠商數: {vendor_updated}")
|
||
print(f"廠商不存在: {vendor_not_found}")
|
||
print(f"新增郵件數: {email_added}")
|
||
print(f"跳過郵件數: {email_skipped} (重複)")
|
||
print("=" * 60)
|
||
|
||
except Exception as e:
|
||
print(f"\n❌ 處理失敗: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
|
||
|
||
def show_current_status():
|
||
"""顯示目前廠商郵件狀況"""
|
||
|
||
print("\n" + "=" * 60)
|
||
print("目前廠商郵件狀況")
|
||
print("=" * 60)
|
||
|
||
from database.vendor_models import VendorList, VendorEmail
|
||
|
||
db = VendorDatabaseManager()
|
||
session = db.get_session()
|
||
|
||
try:
|
||
vendors = session.query(VendorList).all()
|
||
total_emails = session.query(VendorEmail).count()
|
||
|
||
print(f"\n總廠商數: {len(vendors)}")
|
||
print(f"總郵件數: {total_emails}")
|
||
|
||
vendors_with_email = 0
|
||
vendors_without_email = 0
|
||
|
||
for vendor in vendors:
|
||
emails = session.query(VendorEmail).filter_by(vendor_id=vendor.id).all()
|
||
if emails:
|
||
vendors_with_email += 1
|
||
else:
|
||
vendors_without_email += 1
|
||
|
||
print(f"有郵件的廠商: {vendors_with_email}")
|
||
print(f"無郵件的廠商: {vendors_without_email}")
|
||
|
||
if vendors_without_email > 0:
|
||
print(f"\n⚠️ 有 {vendors_without_email} 個廠商沒有設定郵件地址")
|
||
print(" 建議使用此工具匯入郵件資料")
|
||
|
||
finally:
|
||
session.close()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
# 顯示目前狀況
|
||
show_current_status()
|
||
|
||
# 詢問是否要匯入
|
||
print("\n" + "=" * 60)
|
||
excel_path = input("請輸入 Excel 檔案路徑 (或按 Enter 跳過): ").strip()
|
||
|
||
if excel_path:
|
||
import_vendor_emails_from_excel(excel_path)
|
||
|
||
# 再次顯示狀況
|
||
show_current_status()
|
||
else:
|
||
print("\n已取消")
|