From 748ee51ae1555364837275a2e48ad6ba074d0c9e Mon Sep 17 00:00:00 2001 From: ogt Date: Thu, 25 Jun 2026 18:05:48 +0800 Subject: [PATCH] fix: unify pchome price wording --- config.py | 2 +- docs/AI_INTELLIGENCE_MODULE_SOT.md | 1 + routes/dashboard_routes.py | 4 ++-- routes/openclaw_bot_routes.py | 24 ++++++++++++------------ routes/sales_routes.py | 2 +- services/telegram_templates.py | 2 +- templates/ai_intelligence.html | 12 ++++++------ templates/daily_sales.html | 2 +- templates/growth_analysis.html | 2 +- tests/test_competitor_intel_cache.py | 2 +- 10 files changed, 27 insertions(+), 26 deletions(-) diff --git a/config.py b/config.py index ae75fb5..dfefac7 100644 --- a/config.py +++ b/config.py @@ -402,7 +402,7 @@ YOUTUBE_API_KEY = os.getenv('YOUTUBE_API_KEY', '') # ========================================== # 系統版本與路徑 # ========================================== -SYSTEM_VERSION = "V10.690" +SYSTEM_VERSION = "V10.691" LOG_FILE_PATH = os.path.join(BASE_DIR, 'logs/system.log') public_url = PUBLIC_URL # 用於模板顯示 diff --git a/docs/AI_INTELLIGENCE_MODULE_SOT.md b/docs/AI_INTELLIGENCE_MODULE_SOT.md index a2a7471..6866336 100644 --- a/docs/AI_INTELLIGENCE_MODULE_SOT.md +++ b/docs/AI_INTELLIGENCE_MODULE_SOT.md @@ -767,3 +767,4 @@ POSTGRES_HOST=momo-db | 2026-06-25 | 覆核 note 不得保留反向價格詞 | V10.688 起單位價覆核 note 不再使用「不應誤判為 PChome 價格壓力」這類否定式錯誤詞,改用「需先檢查 PChome 售價、折扣與組合」等可執行語句。 | | 2026-06-25 | 舊覆核資料輸出層也要清洗價格語意 | V10.689 起 dashboard template 會在輸出 `unit_price_insight.summary` 時清除舊資料殘留的反向價格詞,避免快取或歷史 row 繼續把錯誤字句顯示給營運使用者。 | | 2026-06-25 | Google Drive 背景匯入不得尋找本機瀏覽器 | V10.690 起 `GoogleDriveService.authenticate()` 預設拒絕背景 OAuth;即使人工明確開啟互動授權,也使用 `open_browser=False` 並輸出授權網址,不在 scheduler/app 容器內尋找 runnable browser。 | +| 2026-06-25 | 全頁價格方向統一為 PChome 成長視角 | V10.691 起 AI Intelligence、Daily Sales、Growth Analysis、Dashboard、Telegram 與 AI 報告 prompt 不再使用「PChome 價格壓力 / MOMO 價格優勢 / MOMO 更便宜 / PChome 有優勢」等易混淆詞;統一為「PChome 價格優勢」與「MOMO 低價壓力」。 | diff --git a/routes/dashboard_routes.py b/routes/dashboard_routes.py index 0fc5392..0e46bd0 100644 --- a/routes/dashboard_routes.py +++ b/routes/dashboard_routes.py @@ -1414,7 +1414,7 @@ def _load_pchome_growth_command_center(session): 'key': 'price_pressure', 'label': '價格壓力', 'value': review_price_count, - 'decision': 'MOMO 更便宜', + 'decision': 'MOMO 低價壓力', 'action': '檢查售價、券或組合', 'tone': 'danger', }, @@ -1422,7 +1422,7 @@ def _load_pchome_growth_command_center(session): 'key': 'price_advantage', 'label': '價格優勢', 'value': amplify_count, - 'decision': 'PChome 有優勢', + 'decision': 'PChome 價格優勢', 'action': '放大曝光與主推位置', 'tone': 'success', }, diff --git a/routes/openclaw_bot_routes.py b/routes/openclaw_bot_routes.py index 7f0f198..189626a 100644 --- a/routes/openclaw_bot_routes.py +++ b/routes/openclaw_bot_routes.py @@ -2437,20 +2437,20 @@ def _ppt_ai_analysis(prompt_data: str, report_type: str = '') -> str: "台灣消費者行為與美妝/保健品類購買決策模式。\n\n" "═══════════════════════════════\n" "角色設定(絕對不可違反)\n" - " 視角 = EwoooC 商品營運決策,不預設單一平台永遠正確\n" + " 視角 = PChome 業績成長決策,不預設單一平台永遠正確\n" " price_diff = MOMO售價 − PChome售價\n" - " 正值 → MOMO較貴 / PChome低價壓力 → 需評估促銷、組合或服務差異化\n" - " 負值 → MOMO較便宜 / MOMO具價格優勢 → 可放大 MOMO 價格賣點\n" + " 正值 → PChome較便宜 / PChome價格優勢 → 可放大曝光、主推位置與商品頁賣點\n" + " 負值 → MOMO較便宜 / MOMO低價壓力 → 需檢查 PChome 售價、券、組合或毛利\n" " 待補資料不可當成成功配對;必須明確列為資料品質風險\n" "═══════════════════════════════\n\n" f"請以 EwoooC 商品營運視角,針對以下{report_type}輸出一份專業競品分析報告:\n\n" "【整體競爭態勢】(3-4句)\n" - "引用平均價差、比對成功件數、待補資料件數,指出價格壓力、MOMO 優勢與資料覆蓋風險。\n\n" - "【PChome 低價壓力商品深度解析】(4-5句)\n" + "引用平均價差、比對成功件數、待補資料件數,指出 PChome 價格優勢、MOMO 低價壓力與資料覆蓋風險。\n\n" + "【PChome 價格優勢商品放大策略】(4-5句)\n" "點名 PChome 較便宜的具體商品與品類,判斷可能原因(活動定價、組合包、會員回饋或清庫存)," - "提出 MOMO 端可採取的促銷、組合、內容曝光或服務差異化做法,避免只用降價犧牲毛利。\n\n" - "【MOMO 價格優勢商品放大策略】(4-5句)\n" - "點名 MOMO 較便宜的商品,提出可放大的搜尋關鍵字、站內陳列、檔期素材與推薦理由。\n\n" + "提出 PChome 可放大的搜尋關鍵字、站內陳列、檔期素材與推薦理由。\n\n" + "【MOMO 低價壓力商品解決方案】(4-5句)\n" + "點名 MOMO 較便宜的商品,提出 PChome 可採取的售價檢查、折扣券、組合包、內容曝光或服務差異化做法,避免只用降價犧牲毛利。\n\n" "【美妝/保健/母嬰品類專項洞察】(3-4句)\n" "針對本期出現的具體商品,結合台灣市場趨勢深度分析:\n" "美妝:成分透明化趨勢、敏感肌/無添加需求、社群口碑行銷;\n" @@ -3385,12 +3385,12 @@ def _generate_ppt_cmd(sub_type: str, sub_arg: str, _chat_id: int, target: str, f"【可信資料源=指定期間 competitor_price_history;即時報表才用 competitor_prices,MOMO vs PChome】\n" f"分析週期:{period_label}\n" f"掃描商品:{len(results)} 件 | 高信心比對:{len(found_c)} 件 | 需單位價比較:{len(unit_comparable_c)} 件 | 待補身份/價格:{len(not_found_c)} 件\n" - f"PChome 低價壓力(PChome 比 MOMO 便宜):{len(pchome_low_price_c)} 件 | MOMO 價格優勢(MOMO 比 PChome 便宜):{len(momo_low_price_c)} 件\n" - f"平均價差:{avg_diff_c:+.1f}%(正值=MOMO較貴、PChome低價壓力;負值=MOMO具價格優勢)\n\n" - f"PChome低價壓力 TOP3(需研擬因應):" + " / ".join( + f"PChome 價格優勢(PChome 比 MOMO 便宜):{len(pchome_low_price_c)} 件 | MOMO 低價壓力(MOMO 比 PChome 便宜):{len(momo_low_price_c)} 件\n" + f"平均價差:{avg_diff_c:+.1f}%(正值=PChome價格優勢;負值=MOMO低價壓力)\n\n" + f"PChome 價格優勢 TOP3(可放大曝光):" + " / ".join( f"{r['momo_name'][:15]}(PChome便宜NT${abs(r['price_diff']):,.0f})" for r in pchome_low_price_c[:3]) + "\n" - f"MOMO價格優勢 TOP3(可加強曝光):" + " / ".join( + f"MOMO 低價壓力 TOP3(需檢查售價與組合):" + " / ".join( f"{r['momo_name'][:15]}(MOMO便宜NT${abs(r['price_diff']):,.0f})" for r in momo_low_price_c[:3]) + "\n" f"單位價覆核樣本:" + " / ".join( diff --git a/routes/sales_routes.py b/routes/sales_routes.py index 65f9393..2eeb7ad 100644 --- a/routes/sales_routes.py +++ b/routes/sales_routes.py @@ -407,7 +407,7 @@ def _build_growth_chart_data(monthly_rows): def _attach_growth_competitor_intel(engine, chart_data): - """把 PChome 價格壓力對齊 growth_analysis 月份序列。""" + """把 MOMO 低價壓力對齊 growth_analysis 月份序列。""" if not chart_data: return chart_data enriched = dict(chart_data) diff --git a/services/telegram_templates.py b/services/telegram_templates.py index 960221c..bba6317 100644 --- a/services/telegram_templates.py +++ b/services/telegram_templates.py @@ -690,7 +690,7 @@ def _format_ea_escalation_alert( "", "✅ 建議處置", "• 先人工確認 PChome identity_v2 與規格一致", - "• 同款:評估跟價、組合促銷或加強 MOMO 價格優勢曝光", + "• 同款:評估跟價、組合促銷或加強 PChome 價格優勢曝光", "• 非同款:標記待審,避免進入自動調價或簡報決策", ] elif generic_actions: diff --git a/templates/ai_intelligence.html b/templates/ai_intelligence.html index a9b6b7b..7eb7fff 100644 --- a/templates/ai_intelligence.html +++ b/templates/ai_intelligence.html @@ -2774,12 +2774,12 @@
- PChome 有優勢 + PChome 價格優勢
- MOMO 更便宜 + MOMO 低價壓力
@@ -3755,8 +3755,8 @@ function renderGrowthCommandCenter(stats = {}, rows = []) { ); } else { setCommandTask( - '今天先做:檢查價格壓力商品', - `可處理 ${formatCount(mappedCount)} 件,先看 MOMO 更便宜。`, + '今天先做:檢查 MOMO 低價壓力商品', + `可處理 ${formatCount(mappedCount)} 件,先看 MOMO 價格較低的商品。`, '檢查價格', () => showGrowthDetail('risk') ); @@ -4103,7 +4103,7 @@ function growthDetailConfig(kind) { ready: ['可立即處理商品', '已有 MOMO 參考價,可以直接檢查售價、活動或曝光。'], needs: ['缺比價商品', '有 PChome 業績,但還沒有可用 MOMO 參考。'], review: ['MOMO 候選待確認', '候選已找到,確認同款後才會進入價格判斷。'], - risk: ['MOMO 更便宜商品', 'MOMO 參考價較低,優先檢查 PChome 售價、券或組合。'], + risk: ['MOMO 低價壓力商品', 'MOMO 參考價較低,優先檢查 PChome 售價、券或組合。'], advantage: ['PChome 價格優勢商品', 'PChome 目前較有價格優勢,適合檢查曝光與主推位置。'], bundle: ['組合 / 單位價商品', '需要檢查組合包、入數、容量或單位價,避免只看總價誤判。'], source: ['外部價格來源明細', '只列出已接到 MOMO 外部參考價的商品。'], @@ -4711,7 +4711,7 @@ function growthDecisionConfig(kind) { actionLabel: '檢查價格', }, risk: { - title: '先檢查 PChome 價格壓力', + title: '先檢查 MOMO 低價壓力', copy: 'MOMO 參考價較低,優先檢查售價、折扣券、組合包與頁面曝光。', actionLabel: '看價格', }, diff --git a/templates/daily_sales.html b/templates/daily_sales.html index e392f6f..b9672f6 100644 --- a/templates/daily_sales.html +++ b/templates/daily_sales.html @@ -431,7 +431,7 @@ {% endfor %} {% else %} -

目前沒有高信心 PChome 價格壓力商品。

+

目前沒有高信心 MOMO 低價壓力商品。

{% endif %}
diff --git a/templates/growth_analysis.html b/templates/growth_analysis.html index 0e49c3b..fa69542 100644 --- a/templates/growth_analysis.html +++ b/templates/growth_analysis.html @@ -127,7 +127,7 @@
- PChome 價格壓力趨勢 + MOMO 低價壓力趨勢
diff --git a/tests/test_competitor_intel_cache.py b/tests/test_competitor_intel_cache.py index 3e7042e..6f2853d 100644 --- a/tests/test_competitor_intel_cache.py +++ b/tests/test_competitor_intel_cache.py @@ -158,7 +158,7 @@ def test_competitor_ppt_and_ai_use_momo_minus_pchome_gap_direction(): assert 'mo_wins = [r for r in found if r.get("price_diff", 0) < -10]' in ppt_source assert "平均價差 {avg_pct:+.1f}%(momo - PChome)" in ppt_source assert "price_diff = MOMO售價 − PChome售價" in route_source - assert "正值=MOMO較貴、PChome低價壓力" in route_source + assert "正值=PChome價格優勢" in route_source def test_competitor_review_queue_is_canonical_unit_price_handoff():