fix: shorten governance pages around growth decisions
All checks were successful
CD Pipeline / deploy (push) Successful in 1m7s
All checks were successful
CD Pipeline / deploy (push) Successful in 1m7s
This commit is contained in:
@@ -402,7 +402,7 @@ YOUTUBE_API_KEY = os.getenv('YOUTUBE_API_KEY', '')
|
||||
# ==========================================
|
||||
# 系統版本與路徑
|
||||
# ==========================================
|
||||
SYSTEM_VERSION = "V10.663"
|
||||
SYSTEM_VERSION = "V10.664"
|
||||
LOG_FILE_PATH = os.path.join(BASE_DIR, 'logs/system.log')
|
||||
public_url = PUBLIC_URL # 用於模板顯示
|
||||
|
||||
|
||||
@@ -740,3 +740,4 @@ POSTGRES_HOST=momo-db
|
||||
| 2026-05-20 | 部分舊 Telegram 入口繞過中央 sanitizer,且 RAG awaiting review 使用錯誤 `chat_id=` 參數會讓人工審核推播失敗 | V10.322 起 Bot API price decision 走 `send_telegram_with_result()`;`price_decision()` 補 `report_url` 相容並 escape 動態欄位;RAG awaiting review 改用 `chat_ids=[...]` 呼叫 `_send_telegram_raw()` |
|
||||
| 2026-06-25 | UI/UX 不可只修首頁,導覽主入口必須同一套 PChome 業績提升語言 | V10.662 起作戰、分析、營運、AI 助手主入口與廠商缺貨子工具都使用短句對齊「評估、分析、建議、解法、治理」流程;首頁今日行動卡維持 980px 上限與高對比主按鈕,禁止回到全寬長文說明。 |
|
||||
| 2026-06-25 | 首頁今日行動 CTA 不可被全域 Bootstrap guard 蓋成透明或低對比 | V10.663 起 `#commandTaskButton.growth-command-alert-action` 使用精準 selector 與 `background-color` hard override,正式 smoke 必須量測按鈕背景與卡片寬度。 |
|
||||
| 2026-06-25 | 系統、舊入口與觀測台頁首不可用長篇工程說明取代決策用途 | V10.664 起舊入口、系統管理與 AI 觀測台頁首統一改為短句,聚焦資料新鮮度、成本、品質、RAG 與自癒如何支援 PChome 業績判斷。 |
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
</style>
|
||||
|
||||
<div class="container-fluid mt-3">
|
||||
<section class="agent-hero"><div class="agent-kicker"><i class="fas fa-network-wired me-1"></i> Agent 指揮矩陣 · {{ hours }} 小時視窗</div><h1 class="agent-title">Agent 指揮矩陣</h1><p class="agent-subtitle">這頁回答 AI 中樞如何分工:誰在用 Ollama、誰還在吃付費 LLM、哪些 Agent 有 RAG 命中、哪些工作流已經接上 MCP。這不是列表,是指揮官視角。</p><form method="get" class="agent-filter"><select name="hours" class="form-select form-select-sm" onchange="this.form.submit()">{% for h in [1,6,24,72,168] %}<option value="{{ h }}" {% if hours == h %}selected{% endif %}>{% if h < 24 %}過去 {{ h }} 小時{% else %}過去 {{ h//24 }} 天{% endif %}</option>{% endfor %}</select></form>{% if overall %}<div class="agent-command"><div class="agent-signal"><div class="agent-label">呼叫總量</div><span class="agent-value">{{ "{:,}".format(overall.total_calls) }}</span><small class="text-muted">{{ "{:,}".format(overall.total_tokens) }} 權杖</small></div><div class="agent-signal"><div class="agent-label">Ollama 占比</div><span class="agent-value status-good">{{ "%.0f"|format(overall.local_pct) }}%</span><small class="text-muted">{{ "{:,}".format(overall.local_calls) }} 次本地呼叫</small></div><div class="agent-signal"><div class="agent-label">付費成本</div><span class="agent-value {% if overall.total_cost > 0 %}status-warn{% else %}status-good{% endif %}">${{ "%.2f"|format(overall.total_cost) }}</span><small class="text-muted">{{ "{:,}".format(overall.paid_calls) }} 次付費呼叫</small></div><div class="agent-signal"><div class="agent-label">RAG 命中率</div><span class="agent-value status-blue">{{ "%.0f"|format(overall.rag_rate) }}%</span><small class="text-muted">{{ "{:,}".format(overall.rag_hits) }} 次命中</small></div></div>{% endif %}</section>
|
||||
<section class="agent-hero"><div class="agent-kicker"><i class="fas fa-network-wired me-1"></i> Agent 指揮矩陣 · {{ hours }} 小時視窗</div><h1 class="agent-title">Agent 指揮矩陣</h1><p class="agent-subtitle">確認 AI 分工、Ollama 占比、RAG 命中與 MCP 編排是否支撐業績決策。</p><form method="get" class="agent-filter"><select name="hours" class="form-select form-select-sm" onchange="this.form.submit()">{% for h in [1,6,24,72,168] %}<option value="{{ h }}" {% if hours == h %}selected{% endif %}>{% if h < 24 %}過去 {{ h }} 小時{% else %}過去 {{ h//24 }} 天{% endif %}</option>{% endfor %}</select></form>{% if overall %}<div class="agent-command"><div class="agent-signal"><div class="agent-label">呼叫總量</div><span class="agent-value">{{ "{:,}".format(overall.total_calls) }}</span><small class="text-muted">{{ "{:,}".format(overall.total_tokens) }} 權杖</small></div><div class="agent-signal"><div class="agent-label">Ollama 占比</div><span class="agent-value status-good">{{ "%.0f"|format(overall.local_pct) }}%</span><small class="text-muted">{{ "{:,}".format(overall.local_calls) }} 次本地呼叫</small></div><div class="agent-signal"><div class="agent-label">付費成本</div><span class="agent-value {% if overall.total_cost > 0 %}status-warn{% else %}status-good{% endif %}">${{ "%.2f"|format(overall.total_cost) }}</span><small class="text-muted">{{ "{:,}".format(overall.paid_calls) }} 次付費呼叫</small></div><div class="agent-signal"><div class="agent-label">RAG 命中率</div><span class="agent-value status-blue">{{ "%.0f"|format(overall.rag_rate) }}%</span><small class="text-muted">{{ "{:,}".format(overall.rag_hits) }} 次命中</small></div></div>{% endif %}</section>
|
||||
{% if error %}<div class="alert alert-warning mt-3"><strong><i class="fas fa-triangle-exclamation me-1"></i></strong>{{ error }}</div>{% endif %}
|
||||
|
||||
<section class="agent-grid">
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
<section class="calls-hero">
|
||||
<div class="calls-kicker"><i class="fas fa-chart-bar me-1"></i> AI 流量管制 · {{ hours }} 小時視窗</div>
|
||||
<h1 class="calls-title">AI 流量控制塔</h1>
|
||||
<p class="calls-subtitle">這裡不是流水帳,而是 AI 中樞的飛航管制台:看呼叫量、權杖量、成本、錯誤率、RAG 命中與 MCP 編排,並在異常時一鍵派出程式碼審查管線。</p>
|
||||
<p class="calls-subtitle">看成本、錯誤率與 RAG 命中,確保 AI 建議穩定支援業績判斷。</p>
|
||||
<div class="calls-actions">
|
||||
<button class="btn btn-warning btn-sm" onclick="triggerCodeReview()"><i class="fas fa-microscope me-1"></i>觸發程式碼審查管線</button>
|
||||
<form method="get" class="calls-filter">
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
<section class="gov-hero">
|
||||
<div class="gov-kicker"><i class="fas fa-wallet me-1"></i> AI 成本治理 · 預算 / 節流 / RAG 策略</div>
|
||||
<h1 class="gov-title">AI 成本治理艙</h1>
|
||||
<p class="gov-subtitle">這頁回答一個問題:AI 中樞花錢是否仍在治理邊界內?預算、實際支出、月底推估、節流狀態與 RAG 策略建議集中在同一個工作台。</p>
|
||||
<div class="gov-actions"><button class="btn btn-warning btn-sm" onclick="forceThrottle()"><i class="fas fa-bolt me-1"></i>立即重算節流狀態</button><span class="text-muted small">超過 110% 時不用等排程,直接重算供應商節流。</span></div>
|
||||
<p class="gov-subtitle">控制 AI 花費與節流狀態,把預算留給能推動業績的任務。</p>
|
||||
<div class="gov-actions"><button class="btn btn-warning btn-sm" onclick="forceThrottle()"><i class="fas fa-bolt me-1"></i>立即重算節流狀態</button><span class="text-muted small">預算超線時立即重算節流。</span></div>
|
||||
<div class="gov-command">
|
||||
<div class="gov-signal"><div class="gov-label">當月花費</div><span class="gov-value">${{ "%.2f"|format(total_spent.value) }}</span><div class="gov-note">預算 ${{ "%.2f"|format(total_budget.value) }}</div></div>
|
||||
<div class="gov-signal"><div class="gov-label">預算使用率</div><span class="gov-value {% if total_ratio >= 110 %}status-bad{% elif total_ratio >= 80 %}status-warn{% else %}status-good{% endif %}">{{ "%.0f"|format(total_ratio) }}%</span><div class="gov-note">全供應商加總</div></div>
|
||||
|
||||
@@ -442,10 +442,7 @@
|
||||
<section class="biz-command">
|
||||
<span class="biz-kicker"><i class="fas fa-store"></i> 商業情報</span>
|
||||
<h1 class="biz-title">商業 AI 戰果室</h1>
|
||||
<p>
|
||||
這一頁不再只是資料列表,而是把價格建議、未跟進警示、閉環學習與競品監測收成一個商業決策控制台。
|
||||
先看 AI 是否真的推動結果,再往下追每一筆策略與市場訊號。
|
||||
</p>
|
||||
<p>先看價格建議是否被採用,再追蹤閉環結果與競品訊號。</p>
|
||||
<div class="biz-meta-row">
|
||||
<span class="biz-meta-pill"><i class="fas fa-calendar-day"></i> 近 {{ days }} 天</span>
|
||||
<span class="biz-meta-pill"><i class="fas fa-brain"></i> {{ rec_total }} 筆價格建議</span>
|
||||
@@ -464,7 +461,7 @@
|
||||
<div class="mt-4">
|
||||
<div class="text-muted small fw-bold text-uppercase">決策節奏</div>
|
||||
<div class="h4 fw-black mb-1">先警示,再追因</div>
|
||||
<p class="text-muted mb-0">未跟進高信心建議會被拉到第一層;其餘資訊按策略、閉環、競品三條線拆解。</p>
|
||||
<p class="text-muted mb-0">高信心未跟進先處理,再看策略與競品訊號。</p>
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
<section class="runtime-hero">
|
||||
<div class="runtime-kicker"><i class="fas fa-heartbeat me-1"></i> 基礎設施生命線 · Ollama / MCP / AIOps</div>
|
||||
<h1 class="runtime-title">基礎設施生命線</h1>
|
||||
<p class="runtime-subtitle">這頁是 AI 中樞的底盤監控:三主機 Ollama 級聯、MCP 工具層、成本節流與 ADR-013 AutoHeal 閉環。先看能不能活,再看要不要修。</p>
|
||||
<p class="runtime-subtitle">先看 Ollama、MCP 與自癒是否正常,避免 AI 建議與比價流程中斷。</p>
|
||||
<div class="runtime-command">
|
||||
<div class="runtime-signal"><div class="runtime-label">Ollama 離線</div><span class="runtime-value {% if down.count > 0 %}status-bad{% else %}status-good{% endif %}">{{ down.count }}</span><small class="text-muted">{{ ollama_hosts|length }} 台即時探測</small></div>
|
||||
<div class="runtime-signal"><div class="runtime-label">AIOps 未解</div><span class="runtime-value {% if aiops_summary and aiops_summary.incidents_open > 0 %}status-bad{% else %}status-good{% endif %}">{{ aiops_summary.incidents_open if aiops_summary else '—' }}</span><small class="text-muted">7 日事件未解決</small></div>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<section class="gate-hero">
|
||||
<div class="gate-kicker"><i class="fas fa-brain me-1"></i> RAG 知識晉升閘 · 人工審核 / 去重 / 防污染</div>
|
||||
<h1 class="gate-title">RAG 知識晉升閘</h1>
|
||||
<p class="gate-subtitle">這頁是 RAG 不被污染的最後關卡。高權重 學習片段 不能直接進知識庫,必須先看品質、相似知識、人工拒絕與晉升分布,再決定是否寫入 ai_insights。</p>
|
||||
<p class="gate-subtitle">先審核高權重學習片段,避免錯誤知識污染業績建議。</p>
|
||||
<div class="gate-command">
|
||||
<div class="gate-signal"><div class="gate-label">待審核</div><span class="gate-value {% if episodes|length > 0 %}status-warn{% else %}status-good{% endif %}">{{ episodes|length }}</span><small class="text-muted">高權重待審片段</small></div>
|
||||
<div class="gate-signal"><div class="gate-label">知識庫</div><span class="gate-value">{{ kb_size or 0 }}</span><small class="text-muted">ai_insights 已晉升</small></div>
|
||||
@@ -59,7 +59,7 @@
|
||||
<article class="gate-panel">
|
||||
<div class="gate-panel-head"><div><div class="gate-label">審核佇列</div><h2 class="gate-panel-title">待審核片段</h2></div><span class="badge {% if episodes %}bg-warning{% else %}bg-success{% endif %}">{{ episodes|length }} 筆</span></div>
|
||||
<div class="gate-panel-body">
|
||||
<p class="text-muted small mb-0"><i class="fas fa-shield-halved me-1"></i>晉升守門第 4 階段:權重 ≥ 0.8 必經統帥審核;24 小時無回應自動降權,不直接污染知識庫。</p>
|
||||
<p class="text-muted small mb-0"><i class="fas fa-shield-halved me-1"></i>權重 ≥ 0.8 必經審核;24 小時無回應自動降權。</p>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
{% set rag_total = (rag_overall_dist | sum(attribute='count')) if rag_overall_dist else 0 %}
|
||||
|
||||
<div class="container-fluid mt-3">
|
||||
<section class="quality-hero"><div class="quality-kicker"><i class="fas fa-comments me-1"></i> 品質診斷 · {{ days }} 日視窗</div><h1 class="quality-title">AI 品質診斷台</h1><p class="quality-subtitle">這裡看 AI 的回答到底有沒有變好:呼叫端反饋、RAG 分數、學習片段流量、行動計畫與結果閉環全部聚合到同一張品質雷達。</p><form method="get" class="quality-filter"><select name="days" class="form-select form-select-sm">{% for d in [7,14,30,90] %}<option value="{{ d }}" {% if days == d %}selected{% endif %}>{{ d }} 日</option>{% endfor %}</select><button class="btn btn-primary btn-sm">查詢</button></form><div class="quality-command"><div class="quality-signal"><div class="quality-label">反饋總量</div><span class="quality-value">{{ total_feedback.value }}</span><small class="text-muted">呼叫端反饋總量</small></div><div class="quality-signal"><div class="quality-label">最差均分</div><span class="quality-value {% if worst_avg.value >= 4 %}status-good{% elif worst_avg.value >= 3 %}status-warn{% else %}status-bad{% endif %}">{{ "%.2f"|format(worst_avg.value) }}</span><small class="text-muted">最差呼叫端平均分</small></div><div class="quality-signal"><div class="quality-label">蒸餾樣本</div><span class="quality-value status-blue">{{ episode_total }}</span><small class="text-muted">蒸餾池 {{ days }} 日</small></div><div class="quality-signal"><div class="quality-label">RAG 評分</div><span class="quality-value">{{ rag_total }}</span><small class="text-muted">已回饋 RAG 查詢</small></div></div></section>
|
||||
<section class="quality-hero"><div class="quality-kicker"><i class="fas fa-comments me-1"></i> 品質診斷 · {{ days }} 日視窗</div><h1 class="quality-title">AI 品質診斷台</h1><p class="quality-subtitle">用反饋、RAG 分數與行動閉環檢查 AI 建議是否可靠。</p><form method="get" class="quality-filter"><select name="days" class="form-select form-select-sm">{% for d in [7,14,30,90] %}<option value="{{ d }}" {% if days == d %}selected{% endif %}>{{ d }} 日</option>{% endfor %}</select><button class="btn btn-primary btn-sm">查詢</button></form><div class="quality-command"><div class="quality-signal"><div class="quality-label">反饋總量</div><span class="quality-value">{{ total_feedback.value }}</span><small class="text-muted">呼叫端反饋總量</small></div><div class="quality-signal"><div class="quality-label">最差均分</div><span class="quality-value {% if worst_avg.value >= 4 %}status-good{% elif worst_avg.value >= 3 %}status-warn{% else %}status-bad{% endif %}">{{ "%.2f"|format(worst_avg.value) }}</span><small class="text-muted">最差呼叫端平均分</small></div><div class="quality-signal"><div class="quality-label">蒸餾樣本</div><span class="quality-value status-blue">{{ episode_total }}</span><small class="text-muted">蒸餾池 {{ days }} 日</small></div><div class="quality-signal"><div class="quality-label">RAG 評分</div><span class="quality-value">{{ rag_total }}</span><small class="text-muted">已回饋 RAG 查詢</small></div></div></section>
|
||||
{% if error %}<div class="alert alert-warning mt-3"><strong><i class="fas fa-triangle-exclamation me-1"></i></strong>{{ error }}</div>{% endif %}
|
||||
|
||||
<section class="quality-grid">
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<section class="qa-hero">
|
||||
<div class="qa-kicker"><i class="fas fa-magnifying-glass-chart me-1"></i> RAG 召回雷達 · {{ hours }} 小時視窗</div>
|
||||
<h1 class="qa-title">RAG 召回雷達</h1>
|
||||
<p class="qa-subtitle">這裡追蹤每次 RAG 查詢是否真的命中、是否省下 LLM 呼叫、哪些呼叫端用得好、哪些查詢沒找到知識。RAG 如果要成為武器,這裡就是雷達螢幕。</p>
|
||||
<p class="qa-subtitle">追蹤 RAG 是否命中、是否省下 LLM 呼叫,避免業績建議缺少根據。</p>
|
||||
<form method="get" class="qa-filter"><select name="hours" class="form-select form-select-sm" onchange="this.form.submit()">{% for h in [1,6,24,72,168] %}<option value="{{ h }}" {% if hours == h %}selected{% endif %}>{% if h < 24 %}{{ h }} 小時{% else %}{{ h//24 }} 天{% endif %}</option>{% endfor %}</select><select name="caller" class="form-select form-select-sm" onchange="this.form.submit()"><option value="">全部呼叫端</option>{% for c in callers %}<option value="{{ c }}" {% if caller_filter == c %}selected{% endif %}>{{ c }}</option>{% endfor %}</select><label class="form-check-label small d-flex align-items-center gap-2"><input class="form-check-input" type="checkbox" name="saved_only" value="1" {% if saved_only %}checked{% endif %} onchange="this.form.submit()">僅看已省下 LLM 呼叫</label></form>
|
||||
{% if summary and summary.total > 0 %}<div class="qa-command"><div class="qa-signal"><div class="qa-label">查詢數</div><span class="qa-value">{{ "{:,}".format(summary.total) }}</span><div class="qa-note">{{ summary.distinct_callers }} 個呼叫端</div></div><div class="qa-signal"><div class="qa-label">命中率</div><span class="qa-value {% if summary.hit_rate >= 70 %}status-good{% elif summary.hit_rate >= 40 %}status-warn{% else %}status-bad{% endif %}">{{ "%.1f"|format(summary.hit_rate) }}%</span><div class="qa-note">{{ summary.with_hits }} 次命中 · {{ summary.no_hits }} 次未命中</div></div><div class="qa-signal"><div class="qa-label">省下呼叫</div><span class="qa-value status-blue">{{ "%.1f"|format(summary.saved_rate) }}%</span><div class="qa-note">{{ summary.saved }} 次省下 LLM</div></div><div class="qa-signal"><div class="qa-label">反饋分</div><span class="qa-value {% if summary.avg_score >= 4 %}status-good{% elif summary.avg_score >= 3 %}status-warn{% else %}status-bad{% endif %}">{{ "%.2f"|format(summary.avg_score) }}</span><div class="qa-note">{{ summary.feedback_count }} 筆 · 平均 {{ summary.avg_hits }} 次命中</div></div></div>{% endif %}
|
||||
</section>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<span>{{ legacy_bridge_kicker|default('MIGRATED PAGE') }}</span>
|
||||
</div>
|
||||
<h1>{{ legacy_bridge_heading|default(legacy_bridge_title|default('頁面已升級')) }}</h1>
|
||||
<p>{{ legacy_bridge_body|default('這個舊入口已接到新版 EwoooC V3 設計系統。') }}</p>
|
||||
<p>{{ legacy_bridge_body|default('請前往新版工作台完成同一個業績任務。') }}</p>
|
||||
<div class="momo-dot-divider is-accent is-soft" aria-hidden="true"></div>
|
||||
<div class="legacy-bridge__actions">
|
||||
<a class="btn btn-primary" href="{{ legacy_bridge_target|default('/') }}">
|
||||
@@ -23,7 +23,7 @@
|
||||
<aside class="legacy-bridge__status" aria-label="頁面狀態">
|
||||
<span class="legacy-bridge__status-label">STATUS</span>
|
||||
<strong>V3 READY</strong>
|
||||
<span>{{ legacy_bridge_meta|default('Design guard active') }}</span>
|
||||
<span>{{ legacy_bridge_meta|default('Growth workflow active') }}</span>
|
||||
</aside>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% set legacy_bridge_kicker = 'SYSTEM OPERATIONS' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-gear' %}
|
||||
{% set legacy_bridge_heading = '爬蟲管理已移到系統管理' %}
|
||||
{% set legacy_bridge_body = '舊版 crawler_management.html 已停用;爬蟲啟停、排程資訊與系統設定統一收斂到新版系統管理頁。' %}
|
||||
{% set legacy_bridge_body = '到系統管理確認爬蟲與排程,讓比價與業績判斷保持新鮮。' %}
|
||||
{% set legacy_bridge_target = '/settings' %}
|
||||
{% set legacy_bridge_cta = '開啟系統管理' %}
|
||||
{% set legacy_bridge_secondary_target = '/logs' %}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% set legacy_bridge_kicker = 'MIGRATED DASHBOARD' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-border-all' %}
|
||||
{% set legacy_bridge_heading = '請使用業績成長指揮台' %}
|
||||
{% set legacy_bridge_body = '舊版 dashboard.html 已停用;正式入口現在是 PChome 業績成長指揮台,商品看板僅保留為舊資料檢視入口。' %}
|
||||
{% set legacy_bridge_body = '先回業績成長指揮台,從業績、價差與下一步決定今天要處理的商品。' %}
|
||||
{% set legacy_bridge_target = '/ai_intelligence' %}
|
||||
{% set legacy_bridge_cta = '開啟業績成長指揮台' %}
|
||||
{% set legacy_bridge_secondary_target = '/observability/overview' %}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% set legacy_bridge_kicker = 'MIGRATED CAMPAIGN' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-bullhorn' %}
|
||||
{% set legacy_bridge_heading = '請使用新版活動看板' %}
|
||||
{% set legacy_bridge_body = '舊版 edm_dashboard.html 已停用,正式入口現在由 edm_dashboard_v2.html 與新版響應式表格負責。' %}
|
||||
{% set legacy_bridge_body = '用新版活動看板查看價格異動,決定主推、補貨與曝光位置。' %}
|
||||
{% set legacy_bridge_target = '/edm' %}
|
||||
{% set legacy_bridge_cta = '開啟活動看板' %}
|
||||
{% set legacy_bridge_secondary_target = '/festival' %}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-clock-rotate-left' %}
|
||||
{% set legacy_bridge_heading = '請使用新版發送歷史' %}
|
||||
{% set legacy_bridge_body = '舊版 history.html 已停用,正式入口現在使用新版廠商缺貨工具頁與一致的營運視覺規範。' %}
|
||||
{% set legacy_bridge_body = '查看缺貨處理紀錄,先補救會影響主推商品的供貨風險。' %}
|
||||
{% set legacy_bridge_target = '/vendor-stockout/history' %}
|
||||
{% set legacy_bridge_cta = '開啟發送歷史' %}
|
||||
{% set legacy_bridge_secondary_target = '/vendor-stockout/list' %}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-file-import' %}
|
||||
{% set legacy_bridge_heading = '請使用新版雲端匯入入口' %}
|
||||
{% set legacy_bridge_body = '舊版 import.html 已停用;廠商缺貨匯入與 Google Drive 自動匯入都已接到新版 V3 shell。' %}
|
||||
{% set legacy_bridge_body = '先補齊缺貨與業績資料,讓分析、建議與解法有可靠來源。' %}
|
||||
{% set legacy_bridge_target = '/vendor-stockout/import' %}
|
||||
{% set legacy_bridge_cta = '開啟廠商匯入' %}
|
||||
{% set legacy_bridge_secondary_target = '/auto_import' %}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-paper-plane' %}
|
||||
{% set legacy_bridge_heading = '請使用新版郵件發送' %}
|
||||
{% set legacy_bridge_body = '舊版 send_email.html 已停用,正式入口現在由新版廠商缺貨工具頁負責,包含響應式排版與新版字型規範。' %}
|
||||
{% set legacy_bridge_body = '先處理缺貨通知失敗,避免補貨協調中斷。' %}
|
||||
{% set legacy_bridge_target = '/vendor-stockout/send-email' %}
|
||||
{% set legacy_bridge_cta = '開啟郵件發送' %}
|
||||
{% set legacy_bridge_secondary_target = '/vendor-stockout/vendor-management' %}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<header class="page-header">
|
||||
<div>
|
||||
<h1><i class="fas fa-robot me-2"></i>爬蟲管理中心</h1>
|
||||
<p class="text-muted mb-0">管理爬蟲開關、執行頻率與分類網址</p>
|
||||
<p class="text-muted mb-0">守住比價資料新鮮度,支援 PChome 業績判斷。</p>
|
||||
</div>
|
||||
<button class="refresh-btn" onclick="refreshData()">
|
||||
<i class="fas fa-sync-alt me-2"></i>刷新狀態
|
||||
@@ -51,15 +51,13 @@
|
||||
{# 爬蟲卡片 (JS 動態插入) #}
|
||||
<div id="crawlers-container"></div>
|
||||
|
||||
{# 使用說明 #}
|
||||
{# 操作重點 #}
|
||||
<div class="info-section">
|
||||
<h5><i class="fas fa-info-circle"></i>使用說明</h5>
|
||||
<h5><i class="fas fa-info-circle"></i>操作重點</h5>
|
||||
<ul>
|
||||
<li>使用右側切換開關可以快速啟用或停用爬蟲</li>
|
||||
<li>停用的爬蟲程式碼和資料會完整保留,可隨時重新啟用</li>
|
||||
<li>點擊「修改頻率」按鈕可調整爬蟲的執行間隔時間</li>
|
||||
<li>變更執行頻率後,需要重啟排程器服務才會生效:<code>sudo systemctl restart momo-scheduler</code></li>
|
||||
<li>點擊右上角「刷新狀態」按鈕可即時更新所有爬蟲狀態</li>
|
||||
<li>優先確保 PChome / MOMO 比價來源保持啟用。</li>
|
||||
<li>資料過舊時先調整頻率,再重啟排程器讓設定生效。</li>
|
||||
<li>修改分類後,下一輪爬蟲會自動使用新設定。</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -116,7 +114,7 @@
|
||||
<div class="empty-state">
|
||||
<div class="empty-state-icon"><i class="fas fa-folder-open"></i></div>
|
||||
<h5>尚未建立任何分類</h5>
|
||||
<p>開始建立您的第一個爬蟲分類,追蹤 MOMO 商城的商品變化</p>
|
||||
<p>建立分類後,系統才能持續補齊比價資料。</p>
|
||||
<button class="empty-state-btn" onclick="prepareAddModal()">
|
||||
<i class="fas fa-plus-circle"></i>立即新增分類
|
||||
</button>
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
<header class="system-import-head">
|
||||
<div>
|
||||
<h1><i class="fas fa-cogs me-2"></i>系統設定與資料匯入</h1>
|
||||
<p>集中管理備份、月總表、即時業績與一般 Excel 匯入。</p>
|
||||
<p>先補齊業績與備份,讓分析、建議與解法有可靠資料。</p>
|
||||
</div>
|
||||
<span class="system-version-pill">版本 {{ system_version }}</span>
|
||||
</header>
|
||||
@@ -114,7 +114,7 @@
|
||||
<div class="row align-items-center g-3">
|
||||
<div class="col-md-9">
|
||||
<h6 class="fw-bold mb-1">月份業績匯總分析 (42 欄位版)</h6>
|
||||
<p class="text-muted small mb-3">此功能專用於匯入「月份總表數據分析」Excel。系統會自動根據「年」與「月」欄位,<strong class="text-danger">覆蓋更新</strong>該月份之歷史數據,適合大批量資料。</p>
|
||||
<p class="text-muted small mb-3">匯入月結業績,更新成長、毛利與品類結構判斷。</p>
|
||||
<input class="form-control" type="file" id="monthlySummaryFile" accept=".xlsx, .xls">
|
||||
</div>
|
||||
<div class="col-md-3 text-end">
|
||||
@@ -138,7 +138,7 @@
|
||||
<div class="row align-items-center g-3">
|
||||
<div class="col-md-9">
|
||||
<h6 class="fw-bold mb-1">匯入即時業績 (全月版)</h6>
|
||||
<p class="text-muted small mb-3">請上傳檔名包含「即時業績」且為「全月」版本之 Excel。資料將自動匯入至專屬分析明細表。</p>
|
||||
<p class="text-muted small mb-3">匯入全月即時業績,補齊當日與月度分析來源。</p>
|
||||
<input class="form-control" type="file" id="salesReportFile" accept=".xlsx, .xls">
|
||||
</div>
|
||||
<div class="col-md-3 text-end">
|
||||
@@ -154,7 +154,7 @@
|
||||
<h5 class="mb-3">一般 Excel 匯入 (自動建表)</h5>
|
||||
<div class="row align-items-end g-3">
|
||||
<div class="col-md-8">
|
||||
<label for="excelFile" class="form-label text-muted small">選擇任何 Excel 檔,系統將依據檔名自動建立新資料表;若表名重複將會覆蓋。</label>
|
||||
<label for="excelFile" class="form-label text-muted small">匯入指定 Excel,補齊分析或營運需要的資料表。</label>
|
||||
<input class="form-control" type="file" id="excelFile" accept=".xlsx, .xls">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
|
||||
@@ -608,3 +608,48 @@ def test_homepage_next_action_cta_keeps_visible_primary_contrast():
|
||||
assert "background-color: #8f442b !important" in template
|
||||
assert "color: #fff !important" in template
|
||||
assert "width: min(100%, 980px)" in template
|
||||
|
||||
|
||||
def test_secondary_and_governance_pages_keep_growth_decision_copy_concise():
|
||||
from pathlib import Path
|
||||
|
||||
expected = {
|
||||
"templates/dashboard.html": "先回業績成長指揮台",
|
||||
"templates/edm_dashboard.html": "決定主推、補貨與曝光位置",
|
||||
"templates/crawler_management.html": "讓比價與業績判斷保持新鮮",
|
||||
"templates/history.html": "補救會影響主推商品的供貨風險",
|
||||
"templates/import.html": "讓分析、建議與解法有可靠來源",
|
||||
"templates/send_email.html": "避免補貨協調中斷",
|
||||
"templates/settings.html": "守住比價資料新鮮度",
|
||||
"templates/system_settings.html": "先補齊業績與備份",
|
||||
"templates/admin/agent_orchestration.html": "是否支撐業績決策",
|
||||
"templates/admin/ai_calls_dashboard.html": "支援業績判斷",
|
||||
"templates/admin/budget.html": "留給能推動業績的任務",
|
||||
"templates/admin/host_health.html": "避免 AI 建議與比價流程中斷",
|
||||
"templates/admin/rag_queries.html": "避免業績建議缺少根據",
|
||||
"templates/admin/quality_trend.html": "AI 建議是否可靠",
|
||||
"templates/admin/promotion_review.html": "避免錯誤知識污染業績建議",
|
||||
"templates/admin/business_intel.html": "追蹤閉環結果與競品訊號",
|
||||
}
|
||||
|
||||
forbidden = [
|
||||
"舊版 dashboard.html 已停用",
|
||||
"舊版 edm_dashboard.html 已停用",
|
||||
"舊版 crawler_management.html 已停用",
|
||||
"舊版 history.html 已停用",
|
||||
"舊版 import.html 已停用",
|
||||
"舊版 send_email.html 已停用",
|
||||
"這頁回答",
|
||||
"這頁是 AI 中樞",
|
||||
"這頁是 RAG",
|
||||
"這裡不是流水帳",
|
||||
"這裡追蹤每次 RAG",
|
||||
"這裡看 AI 的回答",
|
||||
"資料列表",
|
||||
]
|
||||
|
||||
for path, marker in expected.items():
|
||||
text = Path(path).read_text(encoding="utf-8")
|
||||
assert marker in text
|
||||
for bad in forbidden:
|
||||
assert bad not in text
|
||||
|
||||
Reference in New Issue
Block a user