👋 歡迎,{{ currentUser ? currentUser.email : '管理員' }}
🐌 滯銷商品(最後一次出貨 > {{ 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 }} |
⚠ 近 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 開、下一筆假訂單測試。
| 訂單編號 | 狀態 | 金額來源 | 金額 | 原始 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」是否都空 → 該訂單沒存金額。
🚀 快速操作(依進銷存流程)
最近訂單
| 訂單 | 會員 | 金額 | 狀態 |
|---|---|---|---|
| {{ (o.orderNo || '').slice(-8) }} | {{ o.userName }} | NT$ {{ o.total }} | {{ statusText(o.status) }} |
⚠ 低庫存警示(≤5)
| 商品 | 庫存 | 動作 |
|---|---|---|
| {{ p.name }} | {{ p.stock }} |
① 訂單建立時間不在這個時段內 → 試試切換到「全部」
② 訂單沒有 createdAt 時間欄位(舊資料/手動建立的)→ 這些訂單在儀表板總額看得到,但時段分析看不到
③ 訂單狀態是「已取消」或「已退款」→ 不會列入統計
📊 每日營業額趨勢(點 bar 跳該日訂單)
🏆 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() }} |
📦 此時段沒有銷售 | |||
| 圖片 | 商品名稱 | 分類 | 價格 | 庫存 | 📍 位置 | 狀態 | 動作 | |
|---|---|---|---|---|---|---|---|---|
|
📦
|
{{ 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) }} | ||
📋 沒有訂單 |
|||||||
| 姓名 | 電話 | 等級 | 角色 | 下單數 | 累積消費 | 狀態 | 動作 | |
|---|---|---|---|---|---|---|---|---|
|
{{ 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 ? '已停用' : '正常' }} | ||
👥 還沒有會員 — 顧客可從前台「註冊」自助加入,或您可以點「+ 新增會員」手動建立 |
||||||||
批次匯入商品
① 選擇匯入方式
點擊或拖曳檔案到這裡
② 計價設定(直接輸入,數字立即生效)
例:成本 ¥{{ 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 欄名 | 第一筆值 | → 對應到系統欄位 | 狀態 |
|---|---|---|---|
| {{ col.excelKey }} | {{ col.sampleValue || '—' }} | ✋ ✓ — |
預覽({{ importPreview.length }} 筆 · 公式算售價 · 上架到「{{ importTargetCategoryName }}」)
| ⊘ | 圖 | 名稱 | 貨號 | 成本 | 售價(公式) | 庫存 | 單位 | 重量(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] }} |
📖 欄位對應說明(點開查看)
系統會自動辨識以下欄位名稱:
- 商品名稱:
name/title/商品名稱/goodsName - 價格:
price/單價/salePrice - 庫存:
stock/庫存/qty/inventory - 單位:
unit/單位 - 分類:
categoryId/分類 - 圖片:
images/image/imgUrl/圖片網址 - 說明:
description/desc/說明
Excel 操作:第一列是欄位名稱,第二列起為資料。可用中文或英文。
未知分類:如 categoryId 不存在,商品會落在「未分類」,您可在商品管理用批次調整或編輯方式重新指定。
📤 匯出資料
| 代碼 | 廠商名稱 | 聯絡人/電話 | 付款條件 | 已建單 | 狀態 | 動作 |
|---|---|---|---|---|---|---|
{{ 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 ? '停用' : '啟用' }} | |
🏭 沒有廠商,按右上「+ 新增廠商」開始 |
||||||
| 進貨單號 | 進貨日期 | 供應商 | 項目 | 總金額 | 狀態 | 付款 | 動作 |
|---|---|---|---|---|---|---|---|
| {{ p.purchaseNo }} | {{ p.date }} | {{ p.supplier || '—' }} | {{ p.items.length }} 項 · 共 {{ purchaseQty(p) }} 件 | NT$ {{ (p.total || 0).toLocaleString() }} | {{ p.confirmed ? '已入庫' : '待確認' }} | {{ purchasePaymentStatus(p).label }} — | |
🚚 還沒有進貨記錄,點「+ 新增進貨單」開始 |
|||||||
⚖️ 對帳中心 — 應收 / 應付彙總
📥 {{ reconcileFilter==='open' ? '未收款' : (reconcileFilter==='closed' ? '已收清' : '全部') }}(按客戶分組)
| 訂單 | 日期 | 商品 | 數量 | 單價 | 小計/總額 | 已收 | 未收 | 動作 | |
|---|---|---|---|---|---|---|---|---|---|
| {{ (o.orderNo||'').slice(-8) }} | {{ formatDate(o.createdAt) }} | {{ (o.items || []).length }} 項:{{ (o.items || []).map(it => it.name).slice(0,3).join('、') }}{{ (o.items||[]).length > 3 ? '...' : '' }} | {{ sumOrders([o]).toLocaleString() }} | {{ orderPaidAmount(o).toLocaleString() }} | {{ orderRemain(o).toLocaleString() }} | ||||
| └ {{ it.name }} | {{ it.qty }} | {{ (it.price || 0).toLocaleString() }} | {{ (it.subtotal || (it.price * it.qty) || 0).toLocaleString() }} | ||||||
| 📜 待兌支票 {{ p.checkNo }} · 票期 {{ p.checkDueDate }} · NT$ {{ (p.amount||0).toLocaleString() }} | |||||||||
📤 {{ reconcileFilter==='open' ? '未付款' : (reconcileFilter==='closed' ? '已付清' : '全部') }}(按廠商分組)
| 進貨單 | 日期 | 商品 | 數量 | 成本 | 小計/總額 | 已付 | 未付 | 動作 | |||
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ (p.id||'').slice(-8) }} | {{ formatDate(p.confirmedAt || p.createdAt) }} | {{ (p.items || []).length }} 項:{{ (p.items || []).map(it => (products.find(pp=>pp.id===it.productId)||{}).name).filter(Boolean).slice(0,3).join('、') }}{{ (p.items||[]).length > 3 ? '...' : '' }} | {{ purchaseTotal(p).toLocaleString() }} | {{ purchasePaidAmount(p).toLocaleString() }} | {{ purchaseRemain(p).toLocaleString() }} | ||||||
| └ {{ (products.find(pp=>pp.id===it.productId)||{}).name || it.productName || '?' }} | {{ it.qty }} | {{ (it.cost || 0).toLocaleString() }} | {{ (((it.cost || 0) * (it.qty || 0))).toLocaleString() }} | ||||||||
| 📜 待兌支票 {{ x.checkNo }} · 票期 {{ x.checkDueDate }} · NT$ {{ (x.amount||0).toLocaleString() }} | |||||||||||
📒 支票本管理
💡 拿到新支票本時,先在這裡建一本(指定銀行 + 起始號 + 張數,自動產生 50 張票號)。
之後付款時點 「📜 支票」→ 從票本挑下一張,會自動帶銀行/票號,並標記該張為已開。
退票會自動回沖應收帳款,整本一目瞭然。
| 票號 | 票期 | 距今 | 對象 | 用途 | 金額 | |
|---|---|---|---|---|---|---|
| {{ 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() }} |
📊 支票統計(按來源分類 + 期間篩選)
| 票本 | 票號 | 票期 | 對象/用途 | 狀態 | 銀行戶頭 | 金額 |
|---|---|---|---|---|---|---|
| {{ 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() }} |
| 此期間無資料 | ||||||
票號:{{ b.prefix }}{{ b.startNo }} ~ {{ b.prefix }}{{ b.startNo + b.count - 1 }}(共 {{ b.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 三聯式)
💡 國稅局領的發票本,建一本(指定字軌 + 起始號 + 張數,自動產生 50 張)。
訂單詳情按 「✅ 開立發票」,系統依客戶有無統編自動挑 B2C/B2B 發票本,下一張發票號自動帶入 + 品項自動帶 + 5% 稅自動算。
發票作廢有獨立按鈕(國稅局規定作廢需保留記錄)。
📥 進項發票記錄(加油 / 文具 / 餐費等廠商開給我們的發票,給營業稅進項憑證用)
| 日期 | 發票號 | 類別 | 廠商 | 未稅 | 稅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.track }}-{{ String(b.startNo + b.count - 1).padStart(b.digits, '0') }}
📧 訂閱者管理
- member:會員註冊時自動加入
- guest:訪客在前台「訂閱新品」表單填 Email 加入
- manual:你在這頁手動加
| 來源 | 訂閱時間 | 狀態 | 動作 | |
|---|---|---|---|---|
| {{ s.email }} | 會員 訪客 手動 | {{ s.subscribedAt ? new Date(s.subscribedAt).toLocaleString('zh-TW') : '—' }} | ✅ 訂閱中 ❌ 已取消 | |
| 沒有符合條件的訂閱者。 | ||||
📣 新品通知(手動寄信給訂閱者)
- 下方勾選要通知的商品(可多選)
- 看右邊「預覽」確認主旨 / 內容
- 選一種寄送方式:
- 📧 開啟 Gmail/Outlook — 系統幫你開信件 client,BCC 已塞好,你按寄即可
- 📋 複製全部 — BCC + 主旨 + 內容打包到剪貼簿,你自己貼進 Gmail compose
- 客戶收信後,商品的「最後通知時間」會被記下,避免重寄
勾選要通知的商品(目前選 {{ notifySelectedProducts.length }} 件)
📨 信件預覽(會寄給 {{ activeSubscriberCount }} 位訂閱者)
{{ notifyBuildBody() }}
🎉 促銷活動管理(在此新增/修改活動)
所有促銷活動會即時影響前台購物車。可設定生效時間範圍。
{{ promo.name || '(未命名)' }}
編輯活動細節
🎁 贈品階梯(含照片與吸引文案)
最高階:客買 NT$ 6,000 → 只給滿 5k 那一階(一樣)
🏬 倉庫盤點
此倉品項:{{ 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}) }}| 圖 | 商品名稱 | 貨號 | 本倉庫存 | 總庫存 | 成本 | 操作 |
|---|---|---|---|---|---|---|
|
📦
|
{{ 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 }} |
| 角色 | 姓名 | 登入信箱 | 密碼 | 狀態 | 動作 |
|---|---|---|---|---|---|
| {{ (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
| 授權碼 | 客戶 | 天數 | 狀態 | 啟用時間 | 到期日 | 動作 | |
|---|---|---|---|---|---|---|---|
| {{ lc.code }} | {{ lc.customerName || '—' }} {{ lc.note }} |
{{ lc.customerEmail || '—' }} | {{ lc.trialDays || '—' }} | {{ licenseStatusLabel(lc) }} | {{ fmtLicenseTime(lc.usedAt) }} 啟用 Email 不符:{{ lc.usedByEmail }} |
{{ fmtLicenseExpiry(lc.expiry) }} | |
| 尚無授權碼。用上方表單產第一筆。 | |||||||
🌐 翻譯中心
管理所有商品 / 分類 / 促銷的多語翻譯。每張卡顯示該語言完成度,按「一鍵補滿」會自動機翻所有還沒填的欄位(已填的不動)。
機翻品質一般,補滿後建議到各品項編輯器挑重要的手動校正。
請到「系統設定 → 商城基本設定 → 🌍 啟用前台多語」勾選要支援的語言。
繁體中文是原文,永遠不會被翻譯動到。
💾 資料備份 / 還原(強烈建議定期備份)
建議:每週下載一次備份 .json 檔放桌面 / 雲端。意外時用「還原」秒救回。
商城基本設定
📞 聯絡方式
🚚 運送與公告
💱 計價公式設定(成本 → 售價)
從原始成本(CNY)一路算到建議售價(NT$),系統會自動套用此公式。改了之後請按「↻ 全站重算售價」更新所有商品。
① 採購成本 = 原始成本(¥) × 匯率
② 關稅 = 採購成本 × 關稅%
③ 運費 = 重量(kg) × 海/空運/kg OR 件運/件(依商品設定)
④ 進貨總成本 = ① + ② + ③
⑤ 建議售價 = 進貨總成本 × (1 + 利潤%)
🌍 幣別 & 匯率(每件商品可指定來源幣別)
| 代碼 | 名稱 | 符號 | 1 單位 = NT$ | 商品數 | 動作 |
|---|---|---|---|---|---|
| {{ products.filter(p => (p.costCurrency || settings.pricing.defaultCurrency) === c.code).length }} |
📑 關稅級距預設集(編輯商品時可從下拉選擇)
| 類別名稱 | 關稅 % | 動作 |
|---|---|---|
⚙ 預設值
運費(三種方式擇一)
📊 試算範例(用預設幣別 / 預設關稅 / 預設運送)
① 採購成本:{{ 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 }} | s.trim()).filter(Boolean)" placeholder="例:紙杯, 塑杯" style="width:100%;padding:5px;border:1px solid var(--border);border-radius:3px;font-size:12px"> | → |
🎨 品牌設計(公司名 / 配色 / Logo)
💡 公司名稱、配色、Logo 都可自訂。改完按 💾 儲存後 **前後台同時換色**。
📛 公司名
🎨 配色
點下方模板一鍵套用,或手動微調 4 個顏色:
🖼 Logo(選填)
📅 單號編碼格式(訂單 / 進貨單)
💡 自動產生的訂單號 / 進貨單號格式 — 改了之後**只影響新單**,舊單號不變。
訂單:{{ generateDocCode(settings.codeNumberOrderPrefix || 'O', orders, settings.codeNumberFormat, 'orderNo') }}
進貨:{{ generateDocCode(settings.codeNumberPurchasePrefix || 'P', purchases, settings.codeNumberFormat, 'purchaseNo') }}
💳 銀行戶頭管理(收/付款選擇用)
💡 公司有幾個銀行帳戶(往來銀行)就建幾個。
收款時可選「存入哪個帳戶」,付款時可選「從哪個帳戶付出」 → 對帳中心會分類統計,銀行對帳超方便。
🧭 頂部分類列(前台上方那一排)
💡 控制前台「全部商品 / 外貿新品 / ... / 活動 / 關於」這一排的順序、顯示、自訂連結。
↑↓ 拖排序,☐ 取消顯示,可加自訂分類連結 / 上新 / 外部 URL。
🏢 形象官網(關於我們)
⭐ 為什麼選我們(4 個特色卡)
每個特色一張卡,前台會用鋼板樣式顯示。emoji 直接打字(🏭 💎 🚚 💰 等都可以)。
🖼 產品介紹卡(首頁 6 張卡 · 可放實品照)
💡 想試圖片但不想刪文案 → 取消「使用圖片」,不刪 URL;覺得圖片不好看再切回 SVG 預設樣。建議圖比例 4:3,最少 480×320。
👑 會員等級與折扣
會員依「累積消費(不含取消訂單)」自動晉級。等級對應折扣會在前台顧客瀏覽時自動套用。
改了之後請按「↻ 全站重算等級」更新所有會員。
| 圖示 | 等級名稱 | 折扣 | 累積消費門檻 | 顏色 | 會員數 | 動作 |
|---|---|---|---|---|---|---|
| {{ Math.round((L.discount||1)*100) }}% | NT$ | {{ users.filter(u => userLevelOf(u.uid).id === L.id).length }} |
💡 商品的「VIP 價」(編輯商品時設定)會優先於折扣百分比,可針對個別商品給特殊優惠。
🏬 倉庫管理(檢貨/出貨用)
管理多倉庫位置。商品編輯時可指定所屬倉庫與貨架編號。出貨時系統會在訂單詳情列出每件商品的取貨位置(檢貨單)。
{{ (w.zones||[])[0] || 'A' }} 區第 1 貨架{{ (w.layerLabels||[])[0] || '上' }}
🎉 促銷活動 & 折扣
5 種促銷類型:全館折扣、滿額折扣、N 件特價、滿額贈、滿額免運。每個活動可設定生效時間範圍。
💳 銀行轉帳資訊
顧客選「銀行轉帳」付款時會看到這裡的資訊。下單成功的訂單詳情頁也會顯示。
💬 LINE 連動
讓顧客可以加 LINE 詢問或下單。LIFF 是進階功能 — 啟用後顧客可用 LINE 帳號一鍵登入商城,下單會自動綁 LINE userId(您可以從 LINE 直接回覆訂單)。
填了之後顧客在 LINE 內開啟商城,會自動以 LINE 帳號登入並綁訂單。如不會設定可先留空。
🔔 通知設定
① Discord Webhook — 免費,最簡單,您手機裝 Discord 即可收通知
② Make.com / Zapier — 把 Webhook 轉成 LINE / Email / SMS
③ Google Sheet Webhook(Apps Script)— 自動寫進試算表
📊 庫存週轉率 / 滯銷商品警示
🔧 資料維護
繁體中文化
把所有商品名稱、規格、說明、分類名稱從簡體字 → 繁體字(一次性處理)。
新匯入的 Excel 也會自動套用此轉換,不需再做。
🖼 圖片本地化
把外部 URL 圖片(http/https)下載到本地存成 base64,避免來源消失後圖片掛掉。
⚠ 透過本地伺服器代理(繞過 CORS),需要 Python 伺服器在執行才能用。
目前狀態: ✅ {{ imageStats.localCount }} 件已本地化 · ⚠ {{ imageStats.externalCount }} 件外部 URL · 📦 {{ imageStats.noImgCount }} 件無圖
⚠ 危險區域
這些動作 無法復原,請小心使用。建議先「📥 下載完整備份」再操作。
局部清除(保留其他資料)
🆕 自訂清除 — 給新公司 / 新行業
勾選**要清除**的項目,沒勾的會保留: