{{ tabTitle }}

🏠 本地版 ☁ 雲端版
🔔 {{ notifTotalCount }}
前台預覽 ↗ {{ currentUser.email }} 登出

🔔 通知中心

共 {{ notifTotalCount }} 項待處理
目前沒有需要處理的事項,繼續加油!
⚠ 低庫存警示({{ lowStock.length }} 項)
{{ lowStock.slice(0,3).map(p => p.name).join('、') }}{{ lowStock.length > 3 ? '...' : '' }}
📦 待出貨訂單({{ pendingShipOrders }} 張)
已付款待安排出貨
📜 7 天內到期支票({{ upcomingChecksAcrossBooks(7).length }} 張)
點看明細與一鍵兌現
💌 客票 7 天內到期({{ customerChecks.filter(c => c.status === 'pending' && c.dueDate && new Date(c.dueDate).getTime() <= Date.now() + 7*86400000).length }} 張)
點去兌現存入銀行
⚠ 近 30 天退票({{ recentBouncedBills.length }} 張)
需追討或催補開票
🐌 滯銷商品({{ slowMovingProducts.length }} 項)
{{ settings.slowMovingDays || 90 }} 天沒賣,建議促銷
📥 應收帳款(NT$ {{ accountsReceivable.toLocaleString() }})
點去對帳中心追款

👋 歡迎,{{ currentUser ? currentUser.email : '管理員' }}

🏭 暘基五金商城 · 進銷存系統 · 今天是 {{ new Date().toLocaleDateString('zh-TW', { year:'numeric', month:'long', day:'numeric', weekday:'long' }) }}
📋 該處理的事項(共 {{ dashboardNudges.length }} 項)
{{ n.icon }} {{ n.title }} {{ n.desc }}
⚡ 待出貨訂單
{{ pendingShipOrders }}
尚未出貨(含待處理/已付款/處理中)
⚠ 低庫存警示
{{ lowStock.length }}
≤5 件,需進貨補貨
📝 草稿待上架
{{ productStatusCounts.draft }}
已進貨但未上架商品
💰 本月營業額
NT$ {{ (monthRevenue || 0).toLocaleString() }}
今日 NT$ {{ (todayRevenue || 0).toLocaleString() }} · 累計 NT$ {{ (totalRevenue || 0).toLocaleString() }}({{ orders.length }} 單)
📥 應收帳款
NT$ {{ (accountsReceivable || 0).toLocaleString() }}
顧客還沒收回的
📤 應付帳款
NT$ {{ (accountsPayable || 0).toLocaleString() }}
廠商還沒付給的
📜 待到期票據
{{ upcomingBills.length }}
{{ checkDueDays }} 天內到期 · 逾期 {{ overdueBills.length }} 張
⚠ 近 30 天退票
{{ recentBouncedBills.length }}
需追討或催補開票
🐌 滯銷商品
{{ slowMovingProducts.length }}
{{ settings.slowMovingDays || 90 }} 天沒賣 · 該促銷或處理

🐌 滯銷商品(最後一次出貨 > {{ settings.slowMovingDays || 90 }} 天)

建議:促銷出清 / 退回廠商 / 改廣告打點 / 改入紅利贈品

商品內部編碼分類庫存成本佔資最後出貨距今動作
{{ r.product.name }} {{ r.product.internalCode || '—' }} {{ categoryName(r.product.categoryId) }} {{ r.product.stock }} NT$ {{ ((r.product.cost || 0) * (r.product.stock || 0)).toLocaleString() }} {{ r.lastSoldAt ? formatDate(r.lastSoldAt) : '從未售出' }} {{ r.daysSince === null ? '從未' : r.daysSince + ' 天' }}

📜 票據明細

暫無待到期票據或退票

⏰ {{ checkDueDays }} 天內到期 / 逾期({{ upcomingBills.length }} 張)

類別 到期日 距今 對象 票據 金額 操作
{{ b.kind === 'order' ? '應收' : '應付' }} {{ b.dueDate }} {{ b.daysLeft < 0 ? '逾 '+(-b.daysLeft)+' 天' : (b.daysLeft === 0 ? '今天' : b.daysLeft+' 天') }} {{ b.payee }} {{ b.label }}
{{ b.payment.checkBank || '' }}
NT$ {{ (b.amount || 0).toLocaleString() }}

📊 月份票期預估(前 1 月 + 未來 6 月)

月份 應收(票期 / 月結) 應付(票期 / 月結) 淨流入 張數
{{ b.month }} NT$ {{ Math.round(b.incoming).toLocaleString() }} NT$ {{ Math.round(b.outgoing).toLocaleString() }} {{ b.net >= 0 ? '+' : '' }}NT$ {{ Math.round(b.net).toLocaleString() }} {{ b.items.length }}
💡 用於現金流規劃。例:6 月應付 NT$ 50 萬、應收 NT$ 30 萬 → 6 月底要備 20 萬週轉金

⚠ 近 30 天退票({{ recentBouncedBills.length }} 張)

類別 對象 票號 金額 退票原因 操作
{{ b.kind === 'order' ? '應收' : '應付' }} {{ b.kind === 'order' ? (b.target.userName || '客戶') : (b.target.supplier || '廠商') }} {{ b.payment.checkNo || '—' }} NT$ {{ (b.payment.amount || 0).toLocaleString() }} {{ b.payment.bouncedReason || '—' }}

🔍 營業額計算明細

⚠ 沒有任何訂單資料!

可能原因:
1️⃣ 您前台是用 file:/// 開的,訂單存在那邊的 localStorage(跟後台 http://localhost 不通)
2️⃣ 還沒有人下單
3️⃣ Firebase 沒設定,雲端訂單沒同步進來

建議:前台用 http://localhost:8000/index.html 開、下一筆假訂單測試。
📊 共 {{ orders.length }} 張訂單 · 排除取消/退款後 {{ orders.filter(o => o.status !== 'cancelled' && o.status !== 'refunded').length }} 張 · 加總 NT$ {{ (totalRevenue || 0).toLocaleString() }}
訂單編號狀態金額來源金額原始 total原始 itemTotal項數
{{ r.orderNo }} {{ r.status }} {{ r.excluded ? '🚫 已排除' : r.src }} NT$ {{ r.amt }} {{ r.rawTotal === undefined ? '—' : r.rawTotal }} {{ r.rawItemTotal === undefined ? '—' : r.rawItemTotal }} {{ r.itemsCount }}
💡 金額來源欄會告訴您系統是從哪個欄位抓金額的:
· o.total = 訂單頂層 total · o.itemTotal = 商品小計欄 · items 加總 = 從每項商品 subtotal/price×qty 算
如果某筆訂單金額為 0,看「原始 total / itemTotal」是否都空 → 該訂單沒存金額。

🚀 快速操作(依進銷存流程)

🚚
① 新進貨
廠商→商品→入庫
📝
② 上架草稿
檢查圖片、規格 → 上架
📋
③ 揀貨出貨
印揀貨單→改已出貨
🏬
④ 倉庫盤點
看庫存、列印盤點表
📥
批次匯入
Excel/CSV 上百件
🏭
廠商管理
新增/管理供應商

最近訂單

訂單會員金額狀態
{{ (o.orderNo || '').slice(-8) }} {{ o.userName }} NT$ {{ o.total }} {{ statusText(o.status) }}
📋
還沒有訂單

⚠ 低庫存警示(≤5)

商品庫存動作
{{ p.name }} {{ p.stock }}
所有商品庫存充足
~ 系統總計 {{ orders.length }} 張訂單 · 此時段 {{ analyticsData.orderCount }}
🔍 系統有 {{ orders.length }} 張訂單,但此時段顯示 0 筆
可能原因:
① 訂單建立時間不在這個時段內 → 試試切換到「全部
② 訂單沒有 createdAt 時間欄位(舊資料/手動建立的)→ 這些訂單在儀表板總額看得到,但時段分析看不到
③ 訂單狀態是「已取消」或「已退款」→ 不會列入統計
訂單數 →
{{ analyticsData.orderCount }}
營業額 →
NT$ {{ (analyticsData.revenue || 0).toLocaleString() }}
平均客單價 → 應收
NT$ {{ (analyticsData.avgOrderValue || 0).toLocaleString() }}
售出商品數 →
{{ analyticsData.itemsSold }}

📊 每日營業額趨勢(點 bar 跳該日訂單)

{{ d.revenue >= 10000 ? (d.revenue/1000).toFixed(0)+'k' : d.revenue.toLocaleString() }}
{{ d.count }} 單
{{ d.date.slice(5) }}

🏆 Top 10 顧客

#會員訂單消費
{{ i+1 }}
{{ u.name || '—' }}
{{ u.email }}
{{ u.orderCount }} NT$ {{ (u.total || 0).toLocaleString() }}
👥
此時段沒有訂單

🔥 Top 10 熱銷商品

#商品銷量營收
{{ i+1 }} {{ p.name }} {{ p.qty }} NT$ {{ (p.revenue || 0).toLocaleString() }}
📦
此時段沒有銷售
共 {{ filteredProducts.length }} 件 · 庫存 {{ (totalStock || 0).toLocaleString() }}
已選 {{ selectedIds.length }} 件
圖片商品名稱分類價格庫存📍 位置狀態動作
📦
{{ p.name }}
🏷 {{ p.internalCode }}
🌐 {{ productI18nStatus(p) }}
ID: {{ p.id.slice(-8) }}
{{ categoryName(p.categoryId) }}
NT$ {{ p.price }}
VIP NT$ {{ p.vipPrice }}
{{ p.stock }}
{{ loc.whCode }} {{ loc.shelf || '—' }} ×{{ loc.qty }}
{{ p.isActive===false ? '📝 草稿' : '✅ 上架' }}
📦
尚無商品,點「+ 新增商品」開始建立
支援父子兩層分類
順序分類名稱父分類排序商品數動作
{{ c.name }} {{ c.parentId ? categoryName(c.parentId) : '— 頂層 —' }} {{ c.sortOrder !== undefined ? c.sortOrder : 0 }} {{ products.filter(p=>p.categoryId===c.id).length }}
📁
尚無分類
~
訂單編號收件人商品金額狀態付款下單時間動作
{{ o.orderNo }}
{{ o.userName }}
{{ o.userPhone }}
{{ o.items.length }} 項 NT$ {{ o.total }} {{ orderPaymentStatus(o).label }} {{ formatDate(o.createdAt) }}
📋
沒有訂單
共 {{ filteredUsers.length }} 名會員 · VIP {{ users.filter(u=>u.level==='vip').length }} · 已停用 {{ users.filter(u=>u.blocked).length }}
姓名Email電話等級角色下單數累積消費狀態動作
{{ u.name || '—' }}
📝 {{ u.note.slice(0,15) }}{{ u.note.length>15?'...':'' }}
{{ u.email }} {{ u.phone || '—' }} {{ userLevelOf(u.uid).icon }} {{ userLevelOf(u.uid).name }}
{{ Math.round(userLevelOf(u.uid).discount * 100) }} 折
{{ userOrderCount(u.uid) }} NT$ {{ (userOrderTotal(u.uid) || 0).toLocaleString() }} {{ u.blocked ? '已停用' : '正常' }}
👥
還沒有會員 — 顧客可從前台「註冊」自助加入,或您可以點「+ 新增會員」手動建立

批次匯入商品

① 選擇匯入方式

📁
上傳檔案
支援 .xlsx · .xls · .csv · .json
點擊或拖曳檔案到這裡
📎 {{ importFileName }}
或直接貼上文字

② 計價設定(直接輸入,數字立即生效)

{{ importCurrency }} → TWD
NT$ / {{ importShippingMode === 'item' ? '件' : 'kg' }}
毛利率
💡 售價公式:成本 × {{ importExchangeRate }}(匯率) × (1 + {{ importTariff }}%關稅) + {{ importShippingMode === 'item' ? '運費 ' + importShipRate + ' NT$/件' : '重量×' + importShipRate + ' NT$/kg' }}, 再 × (1 + {{ importMargin }}% 利潤) = 售價
例:成本 ¥{{ pricingDemoCost }} × {{ importExchangeRate }} × (1+{{ importTariff }}%) + 運費 = NT${{ Math.round(pricingDemoCost * importExchangeRate * (1 + importTariff/100)) }} → ×(1+{{ importMargin }}%) = NT$ {{ Math.round(pricingDemoCost * importExchangeRate * (1 + importTariff/100) * (1 + importMargin/100)) }}

③ 上架到哪個分類

✅ 圖片網址會一併匯入

※ 此設定會「覆蓋」資料中的原始分類欄位 — 所有匯入的商品都會放到您選的分類,方便您後續整理。

④ 預設值(Excel 無此欄位時自動填入)

💡 您的 Excel 若沒有「庫存」「單位」欄位,會自動套用這裡的預設值。 售價會以 ② 計價設定的「成本×匯率×關稅+運費 ×(1+利潤%)」公式計算。匯入後可在「商品管理 → 批次調整」一次調全部售價。

⑤ 分析資料

📋 欄位對應檢視({{ importDetectedColumns.length }} 個 Excel 欄位 · {{ importDetectedColumns.filter(c => c.suggestedField !== 'auto').length }} 個自動對應 · {{ importDetectedColumns.filter(c => c.isOverridden).length }} 個您調整過
💡 系統自動把每個 Excel 欄對應到商城欄位。如果有抓錯,下拉手動改 → 按下面「重新預覽」即生效。
您改過的對應會記憶到下次匯入(同欄名自動套用),按「♻ 全部恢復自動」清除記憶。
Excel 欄名 第一筆值 → 對應到系統欄位 狀態
{{ col.excelKey }} {{ col.sampleValue || '—' }}

預覽({{ importPreview.length }} 筆 · 公式算售價 · 上架到「{{ importTargetCategoryName }}」)

{{ importPreviewStats.ok }} 完美 {{ importPreviewStats.warn }} 警告 {{ importPreviewStats.err }} 錯誤 {{ importPreviewStats.skipped }} 已跳過 將匯入 {{ importPreviewStats.willImport }}
🖼 含圖片 {{ importPreview.filter(p=>p.images && p.images.length>0).length }} 件 · ⚪ 無圖 {{ importPreview.filter(p=>!p.images || p.images.length===0).length }} 件 · 已抓到外貿運費欄位
💡 紅底=錯誤(缺成本/名稱/分類)將不匯入;黃底=警告(虧本/缺圖)會匯入但建議檢查。可勾「⊘」逐筆跳過。F12 看 Console 對應細節。
名稱 貨號 成本 售價(公式) 庫存 單位 重量(g) 一箱 箱CBM 件CBM 狀態
📦
{{ p.name }} {{ p.tag || '—' }} {{ p.cost ? '¥'+p.cost : '⚠ 未抓到' }} NT$ {{ p.price }} {{ p.stock }} {{ p.unit }} {{ p.weightG ? p.weightG + 'g' : '—' }} {{ p.pcsPerCarton || '—' }} {{ p.cbm ? p.cbm + 'm³' : '—' }} {{ p.unitCbm ? p.unitCbm.toFixed(5)+'m³' : '—' }} ✓ 完美 ⚠ {{ importPreviewStatus[i].issues[0] }} ✗ {{ importPreviewStatus[i].issues[0] }}
⚠ 還有 {{ importPreviewStats.err }} 筆紅色錯誤未跳過 — 自動排除
📖 欄位對應說明(點開查看)

系統會自動辨識以下欄位名稱:

  • 商品名稱:name / title / 商品名稱 / goodsName
  • 價格:price / 單價 / salePrice
  • 庫存:stock / 庫存 / qty / inventory
  • 單位:unit / 單位
  • 分類:categoryId / 分類
  • 圖片:images / image / imgUrl / 圖片網址
  • 說明:description / desc / 說明

Excel 操作:第一列是欄位名稱,第二列起為資料。可用中文或英文。

未知分類:如 categoryId 不存在,商品會落在「未分類」,您可在商品管理用批次調整或編輯方式重新指定。


📤 匯出資料

共 {{ filteredSuppliers.length }} 家廠商 · 啟用 {{ suppliers.filter(s => s.isActive).length }}
代碼 廠商名稱 聯絡人/電話 付款條件 已建單 狀態 動作
{{ s.code }}
{{ s.name }}
{{ s.nameEn }}
{{ s.notes }}
{{ s.contact }}
📞 {{ s.phone }}
✉ {{ s.email }}
💬 LINE: {{ s.lineId }}
{{ {monthly:'月結', shipment:'貨到付款', cod:'貨到收款', advance:'預付', custom:'其他'}[s.paymentTerm] || '—' }} {{ supplierUsage[s.id] }} 張 {{ s.isActive === false ? '停用' : '啟用' }}
🏭
沒有廠商,按右上「+ 新增廠商」開始
~
篩選 {{ filteredPurchases.length }} / 共 {{ purchases.length }} 筆 · 本月 {{ thisMonthPurchases }} · 累計 NT$ {{ (totalPurchaseAmount || 0).toLocaleString() }}
進貨單號進貨日期供應商項目總金額狀態付款動作
{{ p.purchaseNo }} {{ p.date }} {{ p.supplier || '—' }} {{ p.items.length }} 項 · 共 {{ purchaseQty(p) }} 件 NT$ {{ (p.total || 0).toLocaleString() }} {{ p.confirmed ? '已入庫' : '待確認' }} {{ purchasePaymentStatus(p).label }}
🚚
還沒有進貨記錄,點「+ 新增進貨單」開始

⚖️ 對帳中心 — 應收 / 應付彙總

🔍 查品項: 已過濾含此品項的 {{ reconcileSide==='ar' ? reconcileARGroups.length : reconcileAPGroups.length }} 個{{ reconcileSide==='ar' ? '客戶' : '廠商' }}
📥 應收總額
NT$ {{ accountsReceivable.toLocaleString() }}
共 {{ reconcileARGroups.length }} 客戶
📤 應付總額
NT$ {{ accountsPayable.toLocaleString() }}
共 {{ reconcileAPGroups.length }} 廠商
💰 淨應收
NT$ {{ (accountsReceivable - accountsPayable).toLocaleString() }}
應收 - 應付
⏰ 逾期票據
{{ overdueBills.length }}
過期未兌
💼 期間{{ reconcileSide==='ar' ? '收款' : '付款' }}方式總計 用於銀行對帳 / 信用卡公司對帳 合計 NT$ {{ reconcileMethodTotals.grand.toLocaleString() }}
{{ m.label }}
NT$ {{ (reconcileMethodTotals[m.k] || 0).toLocaleString() }}

📥 {{ reconcileFilter==='open' ? '未收款' : (reconcileFilter==='closed' ? '已收清' : '全部') }}(按客戶分組)

{{ reconcileFilter==='open' ? '✓' : '📋' }}
🎉 沒有未收款訂單,全部結清! 此期間沒有已結清訂單 此期間沒有任何訂單
→ 改看全部期間
{{ g.expanded ? '▼' : '▶' }} {{ g.name }} {{ g.phone }} 信用 {{ g.creditPct }}%
累計成交 NT$ {{ g.gross.toLocaleString() }} 已收 NT$ {{ g.paid.toLocaleString() }} 未收 NT$ {{ g.total.toLocaleString() }} {{ g.orders.length }} 筆
💰 收款分類(總額 NT$ {{ g.paid.toLocaleString() }})
{{ m.label }}
NT$ {{ (g.byMethod[m.k] || 0).toLocaleString() }}
訂單日期商品數量單價小計/總額已收未收動作

📤 {{ reconcileFilter==='open' ? '未付款' : (reconcileFilter==='closed' ? '已付清' : '全部') }}(按廠商分組)

{{ reconcileFilter==='open' ? '✓' : '📋' }}
🎉 沒有未付款進貨單,全部結清! 此期間沒有已結清進貨單 此期間沒有任何進貨單
→ 改看全部期間
{{ g.expanded ? '▼' : '▶' }} {{ g.name }}
累計進貨 NT$ {{ g.gross.toLocaleString() }} 已付 NT$ {{ g.paid.toLocaleString() }} 未付 NT$ {{ g.total.toLocaleString() }} {{ g.purchases.length }} 筆
💰 付款分類(總額 NT$ {{ g.paid.toLocaleString() }})
{{ m.label }}
NT$ {{ (g.byMethod[m.k] || 0).toLocaleString() }}
進貨單日期商品數量成本小計/總額已付未付動作

📒 支票本管理

💡 拿到新支票本時,先在這裡建一本(指定銀行 + 起始號 + 張數,自動產生 50 張票號)。
之後付款時點 「📜 支票」→ 從票本挑下一張,會自動帶銀行/票號,並標記該張為已開。
退票會自動回沖應收帳款,整本一目瞭然。

🔔 近 7 天內到期 / 已逾期支票(共 {{ upcomingChecksAcrossBooks(7).length }} 張)
票號票期距今對象用途金額
{{ it.check.no }} {{ it.check.dueDate }} {{ it.daysLeft < 0 ? '逾 '+(-it.daysLeft)+' 天' : (it.daysLeft === 0 ? '今天' : it.daysLeft+' 天') }} {{ it.check.payee || '—' }} {{ it.check.purpose || '—' }} {{ (it.check.amount || 0).toLocaleString() }}

📊 支票統計(按來源分類 + 期間篩選)

~
{{ blk.label }} {{ checkbookStatsExpanded === blk.key ? '▼' : '▶' }}
NT$ {{ checkbookStats(checkbookStatsFrom, checkbookStatsTo)[blk.key].total.toLocaleString() }}
{{ checkbookStats(checkbookStatsFrom, checkbookStatsTo)[blk.key].count }} 張
{{ ({ordersIncoming:'📥 訂單收款明細', purchasesOutgoing:'📤 進貨付款明細', miscIncoming:'💰 雜項收入明細', miscOutgoing:'💸 雜項支出明細'})[checkbookStatsExpanded] }} ({{ checkbookStats(checkbookStatsFrom, checkbookStatsTo)[checkbookStatsExpanded].count }} 張)
票本 票號 票期 對象/用途 狀態 銀行戶頭 金額
{{ it.book.code }} {{ it.check.no }} {{ it.check.dueDate || '—' }}
{{ it.check.payee || '—' }}
{{ it.check.purpose || '' }}
{{ ({issued:'待兌',cleared:'已兌',bounced:'退票',voided:'作廢'})[it.check.status] }} {{ bankAccountLabel(it.check.bankAccountId) }} {{ (it.check.amount || 0).toLocaleString() }}
此期間無資料
未開 {{ checkbookStats(checkbookStatsFrom, checkbookStatsTo).byStatus.blank }} 待兌 {{ checkbookStats(checkbookStatsFrom, checkbookStatsTo).byStatus.issued }} 已兌 {{ checkbookStats(checkbookStatsFrom, checkbookStatsTo).byStatus.cleared }} 退票 {{ checkbookStats(checkbookStatsFrom, checkbookStatsTo).byStatus.bounced }} 作廢 {{ checkbookStats(checkbookStatsFrom, checkbookStatsTo).byStatus.voided }}
💡 點上方任一卡 → 展開該類明細在線預覽 → 確認後再按「📥 匯出統計表」
{{ r.check.no }} @ {{ r.book.code }}({{ r.book.bankName }})· 狀態 {{ ({blank:'未開',issued:'待兌',cleared:'已兌',bounced:'退票',voided:'作廢'})[r.check.status] }} NT$ {{ r.check.amount.toLocaleString() }}
…還有 {{ searchCheckByNo(checkbookSearch).length - 10 }} 筆
📒
還沒建立任何支票本,點上面「+ 新增支票本」開始
{{ b.code }}
[{{ b.bankCode }}] {{ b.bankName }} [{{ b.branchCode }}] {{ b.branchName }}
戶名:{{ b.accountName }}
票號:{{ b.prefix }}{{ b.startNo }} ~ {{ b.prefix }}{{ b.startNo + b.count - 1 }}(共 {{ b.count }} 張)
已用 {{ checkbookProgress(b).used }} / {{ checkbookProgress(b).total }} {{ checkbookProgress(b).pct }}%

💌 客票記錄(客戶開來的支票)

💡 客票是客戶開來付貨款的支票(戶頭/票號是客戶銀行的,不是我們的)。
收下後三條路:① 等票期到 → 兌現存入我方銀行 ② 退票 → 自動回沖訂單應收 ③ 背書轉讓 → 拿去付廠商貨款

📜 待兌
NT$ {{ customerCheckStats().pending.total.toLocaleString() }}
{{ customerCheckStats().pending.count }} 張
✓ 已兌
NT$ {{ customerCheckStats().cleared.total.toLocaleString() }}
{{ customerCheckStats().cleared.count }} 張
⚠ 退票
NT$ {{ customerCheckStats().bounced.total.toLocaleString() }}
{{ customerCheckStats().bounced.count }} 張
📤 背書轉讓
NT$ {{ customerCheckStats().endorsed.total.toLocaleString() }}
{{ customerCheckStats().endorsed.count }} 張
~
票號 客戶 客戶銀行 收到日 票期 金額 狀態 / 去向 動作
{{ c.no }} {{ c.payerName }}
[{{ c.payerVAT }}]
[{{ c.payerBankCode }}] {{ c.payerBank || '—' }} {{ c.receiveDate || '—' }} {{ c.dueDate || '—' }} {{ (c.amount || 0).toLocaleString() }} {{ ({pending:'待兌',cleared:'已兌',bounced:'退票',endorsed:'背書'})[c.status] }}
→ {{ bankAccountLabel(c.clearedToBankAccountId) }}
→ {{ (suppliers.find(s => s.id === c.endorsedToSupplierId) || {}).name || '廠商' }}
{{ c.bouncedReason }}
還沒記錄客票
客戶用支票付貨款時,可在訂單收款選「📜 客票」自動建立 — 或在這裡手動新增

📄 發票本管理(B2C 二聯式 / B2B 三聯式)

{{ r.invoice.no }} {{ ({blank:'未開',issued:'已開',voided:'作廢'})[r.invoice.status] }} → {{ r.invoice.buyerName }} NT$ {{ r.invoice.total.toLocaleString() }} {{ r.book.code }}
…還有 {{ searchInvoiceByNo(invoiceSearchQ).length - 15 }} 筆

💡 國稅局領的發票本,建一本(指定字軌 + 起始號 + 張數,自動產生 50 張)。
訂單詳情按 「✅ 開立發票」,系統依客戶有無統編自動挑 B2C/B2B 發票本,下一張發票號自動帶入 + 品項自動帶 + 5% 稅自動算
發票作廢有獨立按鈕(國稅局規定作廢需保留記錄)。

📥 進項發票記錄(加油 / 文具 / 餐費等廠商開給我們的發票,給營業稅進項憑證用)

~
期間共 {{ filteredInputInvoices().length }} 含稅總額 NT$ {{ inputInvoiceTotal().toLocaleString() }} 進項稅額 NT$ {{ inputInvoiceTaxTotal().toLocaleString() }}(可扣抵)
日期發票號類別廠商 未稅稅5% 含稅用途動作
{{ inv.date }} {{ inv.no }} {{ inv.category || '其他' }} {{ inv.vendorName }}
[{{ inv.vendorVAT }}]
{{ (inv.subtotal || 0).toLocaleString() }} {{ (inv.tax5 || 0).toLocaleString() }} {{ (inv.total || 0).toLocaleString() }} {{ inv.note || '—' }}
還沒登錄進項發票
用途:加油費、辦公用品、餐費、維修費等廠商開來的發票,記下來才能扣抵進項稅
📄
還沒建立任何發票本,點上面「+ 新增發票本」開始
{{ b.code }}
{{ b.type === 'B2B' ? '三聯式 B2B' : '二聯式 B2C' }}
{{ b.track }}-{{ String(b.startNo).padStart(b.digits, '0') }}
~ {{ b.track }}-{{ String(b.startNo + b.count - 1).padStart(b.digits, '0') }}
期別:{{ b.period || '—' }} · 共 {{ b.count }} 張
已開 {{ invoiceBookProgress(b).used }} / {{ invoiceBookProgress(b).total }} {{ invoiceBookProgress(b).pct }}%

📧 訂閱者管理

📖 訂閱者來源
  • member:會員註冊時自動加入
  • guest:訪客在前台「訂閱新品」表單填 Email 加入
  • manual:你在這頁手動加
客戶可隨時取消訂閱(前台連結或會員中心)。已取消者不會收到新品通知。
訂閱中 {{ activeSubscriberCount }} 位 / 共 {{ subscribers.length }} 筆
Email 來源 訂閱時間 狀態 動作
{{ s.email }} 會員 訪客 手動 {{ s.subscribedAt ? new Date(s.subscribedAt).toLocaleString('zh-TW') : '—' }} ✅ 訂閱中 ❌ 已取消
沒有符合條件的訂閱者。

📣 新品通知(手動寄信給訂閱者)

📖 怎麼用
  1. 下方勾選要通知的商品(可多選)
  2. 看右邊「預覽」確認主旨 / 內容
  3. 選一種寄送方式:
    • 📧 開啟 Gmail/Outlook — 系統幫你開信件 client,BCC 已塞好,你按寄即可
    • 📋 複製全部 — BCC + 主旨 + 內容打包到剪貼簿,你自己貼進 Gmail compose
  4. 客戶收信後,商品的「最後通知時間」會被記下,避免重寄
⚠ 純前端不會自動寄,你必須親自在 Gmail/Outlook 按「寄出」

勾選要通知的商品(目前選 {{ notifySelectedProducts.length }} 件)

{{ p.name }} NT$ {{ p.price }} 📨
尚無商品

📨 信件預覽(會寄給 {{ activeSubscriberCount }} 位訂閱者)

主旨:{{ notifyBuildSubject() }}
{{ notifyBuildBody() }}
訂閱中 {{ activeSubscriberCount }} 位 · 已選 {{ notifySelectedProducts.length }} 件商品

🎉 促銷活動管理(在此新增/修改活動)

所有促銷活動會即時影響前台購物車。可設定生效時間範圍。

{{ ({sitewide_discount:'🌐', spend_discount:'💸', bundle:'📦', gift:'🎁', free_shipping:'🚚'})[promo.type] || '🎯' }} {{ promo.enabled ? '進行中' : '停用' }}

{{ promo.name || '(未命名)' }}

全館 {{ 100 - (promo.value || 0) }} 折 滿 NT$ {{ promo.threshold }} 享 {{ 100 - (promo.value||0) }} 折 {{ promo.qty }} 件 NT$ {{ promo.fixedPrice }}({{ bundleScopeLabel(promo) }}) 滿額贈 ({{ (promo.tiers||[]).length }} 階) 滿 NT$ {{ promo.threshold }} 免運
⏰ {{ promo.startAt ? promo.startAt.replace('T',' ') : '立即' }} ~ {{ promo.endAt ? promo.endAt.replace('T',' ') : '永久' }}

編輯活動細節

還沒有促銷活動。點上方按鈕新增第一個。

🎁 贈品階梯(含照片與吸引文案)

📐 階梯排版:
🎁 給贈規則:
累贈:客買 NT$ 6,000 → 給滿 1k 贈品 + 滿 5k 贈品(兩樣)
最高階:客買 NT$ 6,000 → 只給滿 5k 那一階(一樣)
🎁
👁 前台預覽(顧客會看到的樣子):
🎁
滿 NT$ {{ t.threshold }} 加贈
{{ t.gift || '(贈品名)' }}
{{ t.description }}

🏬 倉庫盤點

此倉品項:{{ stocktakeRows.length }} 種 · 庫存:{{ (stocktakeRows.reduce((s,r) => s + (r.qty||0), 0) || 0).toLocaleString() }} 件 · 估值:NT$ {{ (stocktakeRows.reduce((s,r) => s + (r.qty||0) * (r.cost || 0) * ((settings.pricing.exchangeRates||[]).find(c => c.code === r.costCurrency)?.rate || 5), 0) || 0).toLocaleString(undefined,{maximumFractionDigits:0}) }}
此倉庫沒有商品紀錄(或被搜尋條件過濾掉)
📍 {{ shelf || '(未指定貨架)' }} {{ group.length }} 種商品 · 共 {{ (group.reduce((s,r)=>s+(r.qty||0),0) || 0).toLocaleString() }} 件
商品名稱 貨號 本倉庫存 總庫存 成本 操作
📦
{{ r.name }} {{ r.tag || '—' }} {{ r.qty }} {{ r.totalStock }} {{ r.costCurrency || '¥' }}{{ r.cost || '—' }}

🔄 倉庫調撥(A 倉商品搬到 B 倉)

選來源倉、目標倉、商品、數量,按確認執行調撥。會更新商品「庫存 by 倉庫」並記錄調撥單。

📦 調撥項目

商品來源倉現有調撥數量
{{ getProductStock(item.productId) }}

📜 調撥記錄

🔄
還沒有調撥記錄
單號日期來源目標項目備註
{{ t.transferNo }} {{ t.date }} {{ warehouseName(t.fromWarehouse) }} {{ warehouseName(t.toWarehouse) }} {{ t.items.length }} 項 · {{ t.items.reduce((s,i)=>s+i.qty, 0) }} 件 {{ t.note }}
共 {{ adminUsers.length }} 個帳號
📖 5 個角色說明
{{ r.label }}
{{ r.desc }}
角色 姓名 登入信箱 密碼 狀態 動作
{{ (ROLES[u.role] || {}).label || u.role }} {{ u.name || '—' }} {{ u.email }} {{ u.password ? '•'.repeat(Math.max(6, u.password.length)) : '—' }} {{ u.isActive === false ? '停用' : '啟用' }} (自己)

💎 雲端授權管理

📖 怎麼用
  • 產碼後把碼用 LINE/Email 給買受人,他們在自家後台「我有授權碼」啟用
  • 啟用碼綁 Email — 只能給你指定的那個 Email 啟用,別人拿到也無法用
  • 狀態:⚪ 未啟用 / 🟢 使用中 / 🔴 已撤銷 / ⌛ 已過期
  • 撤銷後買受人有 7 天離線寬限,期間內仍可使用(下一輪做)
⚠ 目前是本地版模式,無法產碼。請右上角切到 ☁ 雲端版後再操作。

🎟 產生新授權碼

產出格式範例:YJC-XXXX-XXXX-XXXX
共 {{ filteredLicenseCodes.length }} 筆(總 {{ licenseCodes.length }})
授權碼 客戶 Email 天數 狀態 啟用時間 到期日 動作
{{ lc.code }} {{ lc.customerName || '—' }}
{{ lc.note }}
{{ lc.customerEmail || '—' }} {{ lc.trialDays || '—' }} {{ licenseStatusLabel(lc) }} {{ fmtLicenseTime(lc.usedAt) }}
啟用 Email 不符:{{ lc.usedByEmail }}
{{ fmtLicenseExpiry(lc.expiry) }}
尚無授權碼。用上方表單產第一筆。

🌐 翻譯中心

管理所有商品 / 分類 / 促銷的多語翻譯。每張卡顯示該語言完成度,按「一鍵補滿」會自動機翻所有還沒填的欄位(已填的不動)。
機翻品質一般,補滿後建議到各品項編輯器挑重要的手動校正。

🌍 尚未啟用任何外語。
請到「系統設定 → 商城基本設定 → 🌍 啟用前台多語」勾選要支援的語言。
{{ LANGUAGES[lang].emoji }} {{ LANGUAGES[lang].label }}
幣別 {{ LANGUAGES[lang].defaultCurrency }} · {{ LANGUAGES[lang].dir==='rtl' ? '右至左' : '左至右' }}
📦 商品:{{ i18nLangStats(lang).pDone }} / {{ i18nLangStats(lang).pTotal }}
📁 分類:{{ i18nLangStats(lang).cDone }} / {{ i18nLangStats(lang).cTotal }}
🎉 促銷:{{ i18nLangStats(lang).prDone }} / {{ i18nLangStats(lang).prTotal }}
💡 上架流程建議:新增商品打完中文 → 商品編輯器按「🌐 翻所有語言」當下翻完並檢查 → 偶爾來這頁「一鍵補滿」掃漏網的。
繁體中文是原文,永遠不會被翻譯動到。

💾 資料備份 / 還原(強烈建議定期備份)

⚠ 為什麼必備:系統資料存在瀏覽器 localStorage, 清除瀏覽器資料、換瀏覽器、換電腦都會消失。
建議:每週下載一次備份 .json 檔放桌面 / 雲端。意外時用「還原」秒救回。
上次備份:{{ lastBackupAt ? new Date(lastBackupAt).toLocaleString('zh-TW') : '從未備份' }}
備份內容: 廠商({{ suppliers.length }})· 商品({{ products.length }})· 分類({{ categories.length }})· 訂單({{ orders.length }})· 進貨單({{ purchases.length }})· 倉庫調撥({{ transfers.length }})· 會員({{ users.length }})· 系統設定(含計價/倉庫/促銷/Webhook)

商城基本設定


📞 聯絡方式

英文版地址建議手動填(機翻地址品質差)。可寫格式:No.X, X Rd., X Township, X County, Taiwan

🚚 運送與公告

關閉後前台不顯示跑馬燈;預設開啟,自動結合公告 + 啟用中促銷活動文字
繁體中文(預設語)不能關。啟用一種語言後,在商品/分類/促銷編輯器會出現該語言 tab。
只翻「該語言還沒填」的欄位,已填的不動。MyMemory 免費機翻,翻完建議挑重要品項手動校正。先勾上面的語言才會出現在選單。
1 NTD = {{ cur }}
語言→幣別自動對應:en→USD · es/fr/de→EUR · ja→JPY · ko→KRW · th→THB · vi→VND · ar→USD。建議每季更新 · 參考台銀

💱 計價公式設定(成本 → 售價)

從原始成本(CNY)一路算到建議售價(NT$),系統會自動套用此公式。改了之後請按「↻ 全站重算售價」更新所有商品。

📐 計算公式:
① 採購成本 = 原始成本(¥) × 匯率
② 關稅 = 採購成本 × 關稅%
③ 運費 = 重量(kg) × 海/空運/kg OR 件運/件(依商品設定)
進貨總成本 = ① + ② + ③
建議售價 = 進貨總成本 × (1 + 利潤%)

🌍 幣別 & 匯率(每件商品可指定來源幣別)

代碼名稱符號1 單位 = NT$商品數動作
{{ products.filter(p => (p.costCurrency || settings.pricing.defaultCurrency) === c.code).length }}

📑 關稅級距預設集(編輯商品時可從下拉選擇)

類別名稱關稅 %動作

⚙ 預設值

售價 = 進貨成本 × (1 + 此值/100)

運費(三種方式擇一)

便宜慢,重物適用
貴快,輕急件
不論重量按件

📊 試算範例(用預設幣別 / 預設關稅 / 預設運送)

範例商品:成本 7.13 {{ getCurrencyInfo(settings.pricing.defaultCurrency).symbol }}{{ settings.pricing.defaultCurrency }}、重 300 g、{{ ({sea:'🚢海運', air:'✈空運', item:'📦件運'})[settings.pricing.defaultMode] || '海運' }}
① 採購成本:{{ getCurrencyInfo(settings.pricing.defaultCurrency).symbol }}7.13 × {{ getCurrencyRate(settings.pricing.defaultCurrency) }} = NT$ {{ pricingDemoData.procureCost }}
② 關稅 ({{ pricingDemoData.tariffPct }}%):NT$ {{ pricingDemoData.tariff }}
③ 運費:NT$ {{ pricingDemoData.shipping }}
④ 進貨總成本:NT$ {{ pricingDemoData.totalCost }}
⑤ 建議售價(×{{ (1 + (settings.pricing.defaultMargin || 30)/100).toFixed(2) }}):NT$ {{ pricingDemoData.suggestedPrice }}

🤖 智慧分類規則(關鍵字 → 分類)

依商品名稱(含貨號、規格)的關鍵字自動分類。預設已內建 28 條規則對應 taohuo999 的常見類別。
⚠ 規則由上往下比對,第一個命中的就套用 → 把更精確的關鍵字放上面(例:「塑膠衣架」要在「衣架」前面)。

#關鍵字(多個用逗號分隔)目標分類動作
{{ i+1 }}

🎨 品牌設計(公司名 / 配色 / Logo)

💡 公司名稱、配色、Logo 都可自訂。改完按 💾 儲存後 **前後台同時換色**。

📛 公司名

🎨 配色

點下方模板一鍵套用,或手動微調 4 個顏色:

{{ settings.brandPrimary }}
{{ settings.brandAccent }}
{{ settings.brandAccentLight }}
{{ settings.brandAccentDark }}
{{ settings.shopName || '公司名稱' }}
{{ settings.shopNameEn || 'COMPANY NAME EN' }}
↑ 即時預覽

🖼 Logo(選填)

📅 單號編碼格式(訂單 / 進貨單)

💡 自動產生的訂單號 / 進貨單號格式 — 改了之後**只影響新單**,舊單號不變。

建議 1-2 個英文字母(O=Order)
建議 1-2 個英文字母(P=Purchase)
📋 預覽今天的下一個單號:
訂單:{{ generateDocCode(settings.codeNumberOrderPrefix || 'O', orders, settings.codeNumberFormat, 'orderNo') }}
進貨:{{ generateDocCode(settings.codeNumberPurchasePrefix || 'P', purchases, settings.codeNumberFormat, 'purchaseNo') }}

💳 銀行戶頭管理(收/付款選擇用)

💡 公司有幾個銀行帳戶(往來銀行)就建幾個。
收款時可選「存入哪個帳戶」,付款時可選「從哪個帳戶付出」 → 對帳中心會分類統計,銀行對帳超方便。

🧭 頂部分類列(前台上方那一排)

💡 控制前台「全部商品 / 外貿新品 / ... / 活動 / 關於」這一排的順序、顯示、自訂連結。
↑↓ 拖排序,☐ 取消顯示,可加自訂分類連結 / 上新 / 外部 URL。

🏢 形象官網(關於我們)

空白時前台 fallback 顯示繁中。

⭐ 為什麼選我們(4 個特色卡)

每個特色一張卡,前台會用鋼板樣式顯示。emoji 直接打字(🏭 💎 🚚 💰 等都可以)。


🖼 產品介紹卡(首頁 6 張卡 · 可放實品照)

💡 想試圖片但不想刪文案 → 取消「使用圖片」,不刪 URL;覺得圖片不好看再切回 SVG 預設樣。建議圖比例 4:3,最少 480×320。

無圖 SVG模式

會在前台顯示為小膠囊標籤

👑 會員等級與折扣

會員依「累積消費(不含取消訂單)」自動晉級。等級對應折扣會在前台顧客瀏覽時自動套用。
改了之後請按「↻ 全站重算等級」更新所有會員。

圖示等級名稱折扣累積消費門檻顏色會員數動作
{{ Math.round((L.discount||1)*100) }}% NT$ {{ users.filter(u => userLevelOf(u.uid).id === L.id).length }}
💡 折扣 1.00 = 不打折、0.95 = 95% 折扣 = 9.5 折、0.90 = 9 折、0.85 = 8.5 折…
💡 商品的「VIP 價」(編輯商品時設定)會優先於折扣百分比,可針對個別商品給特殊優惠。

🏬 倉庫管理(檢貨/出貨用)

管理多倉庫位置。商品編輯時可指定所屬倉庫與貨架編號。出貨時系統會在訂單詳情列出每件商品的取貨位置(檢貨單)。

例:A 區、B 區、C 區
例:10 = 第 1~10 貨架
例:上,中,下 或 1,2,3,4
商品數:{{ products.filter(p => p.warehouseId === w.id).length }} 件 · 容量:{{ (w.zones || []).length }} 區 × {{ w.shelvesPerZone || 0 }} 貨架 × {{ (w.layerLabels || []).length }} 層 = {{ (((w.zones || []).length * (w.shelvesPerZone || 0) * (w.layerLabels || []).length) || 0).toLocaleString() }} 個位置 · 範例:{{ (w.zones||[])[0] || 'A' }} 區第 1 貨架{{ (w.layerLabels||[])[0] || '上' }}
📍 自訂貨架清單({{ (w.shelves || []).length }} 個) {{ (w.shelves || []).length === 0 ? '— 留空時系統自動產生上方「區×架×層」' : '— 取代上方自動產生' }}
💡 商品編輯頁會依此倉庫的可用區號 / 層 / 號**自動生成下拉選單**,不用手動打。

🎉 促銷活動 & 折扣

5 種促銷類型:全館折扣、滿額折扣、N 件特價、滿額贈、滿額免運。每個活動可設定生效時間範圍。

還沒有促銷活動。點下方按鈕新增第一個。

💳 銀行轉帳資訊

顧客選「銀行轉帳」付款時會看到這裡的資訊。下單成功的訂單詳情頁也會顯示。

💬 LINE 連動

讓顧客可以加 LINE 詢問或下單。LIFF 是進階功能 — 啟用後顧客可用 LINE 帳號一鍵登入商城,下單會自動綁 LINE userId(您可以從 LINE 直接回覆訂單)。

會在前台顯示「📲 加 LINE 詢問」按鈕
在 LINE Official Account Manager 取得
⚠ 此功能需在 LINE Developers 申請 Channel + LIFF App。
填了之後顧客在 LINE 內開啟商城,會自動以 LINE 帳號登入並綁訂單。如不會設定可先留空。

🔔 通知設定

儀表板會顯示低於此數量的商品
⚠ LINE Notify 已於 2025/3 停止服務。建議使用:
Discord Webhook — 免費,最簡單,您手機裝 Discord 即可收通知
Make.com / Zapier — 把 Webhook 轉成 LINE / Email / SMS
Google Sheet Webhook(Apps Script)— 自動寫進試算表

📊 庫存週轉率 / 滯銷商品警示

儀表板會顯示有庫存但 N 天沒賣出的商品
週轉率 = 期間銷售量 ÷ 平均庫存(推薦 ≥ 4)

🔧 資料維護

繁體中文化

把所有商品名稱、規格、說明、分類名稱從簡體字 → 繁體字(一次性處理)。
新匯入的 Excel 也會自動套用此轉換,不需再做。


🖼 圖片本地化

把外部 URL 圖片(http/https)下載到本地存成 base64,避免來源消失後圖片掛掉。
⚠ 透過本地伺服器代理(繞過 CORS),需要 Python 伺服器在執行才能用。

目前狀態: ✅ {{ imageStats.localCount }} 件已本地化 · ⚠ {{ imageStats.externalCount }} 件外部 URL · 📦 {{ imageStats.noImgCount }} 件無圖

⚠ 危險區域

這些動作 無法復原,請小心使用。建議先「📥 下載完整備份」再操作。

局部清除(保留其他資料)


🆕 自訂清除 — 給新公司 / 新行業

勾選**要清除**的項目,沒勾的會保留:

{{ toast.msg }}