feat(product-commerce): 款式主键统一 style_id 并下线评价采集

采集端与 data-hub 统一用 style_id (= dim_style.id) 关联款式,style_name 降级为显示冗余。

款式主键:
- 14 张采集表加 style_id BIGINT + style_match_method + *_style_id_idx 索引
- 一律逻辑外键:不建 FOREIGN KEY,早期 10 个 *_style_id_fk 在 schema.sql 里幂等 DROP
- loader 下发 dim_style.id;db 层 attach_style_ids / resolve_style_ids_by_product 兜底
- 新增 backfill_style_id.py 三段回填(款名 / 日报按商品 ID / 广告表按 spu_id)
- 新增视图 v_style_id_coverage、v_style_unmatched_product、v_style_unmatched_source
- 实库补录 199 个商品 ID 到 67 款 spus;日报 style_id 覆盖 49.1% -> 79.0%,
  tm 广告 99.4% / jd 92.4% / dy 83.2%,其余 11 张 100%

评价采集下线:
- product_reviews 归档为 product_reviews_archived_20261101
- 差评改由 shop.{tmall,jd,dy}_negative_reviews.daily 采集,消费方读 v_negative_reviews
- 删除 import_product_reviews.py / orchestrate_review_collection.py 及相关命令与绑定
- dy_product_scraping 默认流程摘除评论采集,保留 --reviews-only

天猫广告:
- 迁移到独立表 tm_product_ad_daily_metrics,不再写 product_daily_metrics.raw_data

同批附带:
- 光合上传支持天猫新店 new_bag(仅黑曜石系列)
- 京东商智双月日历排除 -diff-month 补位格
- 万相主体搜索词覆盖 STYLE_SEARCH_KEYWORDS
- ERP 部分编码失败时用已成功编码销量兜底,避免整款归零
This commit is contained in:
wangyunlong committed 2026-11-01 16:43:27 +08:00
1 parent 622a609800
commit 6f1c193f4b
50 files changed
+3301 -1150

No files matched your search

+26
View File
@@ -1709,6 +1709,28 @@ def test_tmall_video_trigger_routes_only_the_selected_store(
assert flagship["store"] == "flagship"
assert flagship["topic_keyword"] == "我的夏日焕新清单"
assert launcher.calls[-1]["store"] == "flagship"
launcher.complete("product.video_upload")
new_bag = service.trigger(
"product.video_upload",
{"business_date": "2026-08-11", "store": "new_bag"},
)
assert new_bag["store"] == "new_bag"
assert launcher.calls[-1]["store"] == "new_bag"
def test_tmall_video_trigger_rejects_unknown_store(console_settings: Settings) -> None:
service = WorkflowConsoleService(
console_settings,
launcher=FakeConsoleLauncher(),
)
with pytest.raises(ConsoleRequestError, match="店铺参数无效"):
service.trigger(
"product.video_upload",
{"business_date": "2026-08-11", "store": "obsidian"},
)
@pytest.mark.parametrize("value", [123, True, "x" * 121])
@@ -2824,6 +2846,8 @@ def test_http_home_assets_and_overview_have_security_headers(
assert "强制重跑:忽略幂等跳过与已有结果,重新采集并正式执行" in page
assert '<option value="flagship">光影行星旗舰店</option>' in page
assert '<option value="luggage">光影行星鑫华达专卖店:龙虾仔</option>' in page
assert '<option value="new_bag">' in page
assert "天猫新店 · gyxx箱包旗舰店:龙虾仔" in page
assert 'id="run-tmall-topic-field"' in page
assert 'id="run-tmall-topic-keyword"' in page
assert "存在未上传附件时才登录该店铺账号" in page
@@ -2915,6 +2939,8 @@ def test_http_home_assets_and_overview_have_security_headers(
assert "tmall_topic_keyword" in decoded_asset
assert "syncTmallTopicField" in decoded_asset
assert "光影行星鑫华达专卖店:龙虾仔" in decoded_asset
assert "天猫新店" in decoded_asset
assert 'value: "new_bag"' in decoded_asset
assert "renderCardLiveState" in decoded_asset
assert 'data-live-progress="${completed}/${steps.length}"' in decoded_asset
assert 'data-current-step="${esc(currentNames.join("、"))}"' in decoded_asset