hub-gif 614d631261 feat(pipeline): 竞品简报与策略管线、报告导出及 JD 前端联动
补充策略决策键、fixture 与相关单测;分析/营销包本地存储与任务状态;竞品简报 schema 与 LLM 章节生成、促销与导出调整;并纳入 Cursor 工程规则 user-dev-style。

Made-with: Cursor
2026-04-27 15:48:09 +08:00

102 lines
3.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""CSV 表头键、运行默认调参与关注词/场景配置(与 ``pipeline.competitor_report.jd_report`` 顶层一致)。"""
from __future__ import annotations
from pipeline.csv.schema import (
COMMENT_CSV_COLUMNS,
JD_SEARCH_CSV_HEADERS,
MERGED_FIELD_TO_CSV_HEADER,
)
_JD_LIST_PRICE_KEY = JD_SEARCH_CSV_HEADERS["price"]
_COUPON_SHOW_PRICE_KEY = JD_SEARCH_CSV_HEADERS["coupon_price"]
_ORIGINAL_LIST_PRICE_KEY = JD_SEARCH_CSV_HEADERS["original_price"]
_SELLING_POINT_KEY = JD_SEARCH_CSV_HEADERS["selling_point"]
_RANK_TAGLINE_KEY = JD_SEARCH_CSV_HEADERS["hot_list_rank"]
# 历史批次 CSV 表头(括号英文);新批次为纯中文,读取时新键优先
_LEGACY_JD_LIST_PRICE_KEY = "标价(jdPrice,jdPriceText,realPrice)"
_LEGACY_COUPON_SHOW_PRICE_KEY = (
"券后到手价(couponPrice,subsidyPrice,finalPrice.estimatedPrice,priceShow)"
)
_LEGACY_SHOP_NAME_KEY = "店铺名(shopName)"
_LEGACY_RANK_TAGLINE_KEY = "榜单类文案(标签/腰带/标题数组中的榜、TOP 等)"
_LEGACY_COMMENT_FUZZ_KEY = "评价量(commentFuzzy)"
_LEGACY_SELLING_POINT_KEY = "卖点(sellingPoint)"
_LIST_BRAND_TITLE_HEADER = "店铺信息标题"
_LEGACY_LIST_BRAND_TITLE_KEY = "店铺信息标题(shopInfoTitle,brandName)"
_DETAIL_PRICE_FINAL_CSV_KEYS: tuple[str, ...] = (
MERGED_FIELD_TO_CSV_HEADER["detail_price_final"],
"detail_price_final",
)
_LIST_PRICE_AND_COUPON_KEYS: tuple[str, ...] = (
*_DETAIL_PRICE_FINAL_CSV_KEYS,
_JD_LIST_PRICE_KEY,
_LEGACY_JD_LIST_PRICE_KEY,
_COUPON_SHOW_PRICE_KEY,
_LEGACY_COUPON_SHOW_PRICE_KEY,
)
# 报告摘录「标价」:列表标价优先,缺省时用商详到手价列兜底
_LIST_SHOW_PRICE_CELL_KEYS: tuple[str, ...] = (
_JD_LIST_PRICE_KEY,
_LEGACY_JD_LIST_PRICE_KEY,
MERGED_FIELD_TO_CSV_HEADER["detail_price_final"],
"detail_price_final",
)
_MERGED_SHOP_CELL_KEYS: tuple[str, ...] = (
MERGED_FIELD_TO_CSV_HEADER["detail_shop_name"],
"detail_shop_name",
JD_SEARCH_CSV_HEADERS["shop_name"],
_LEGACY_SHOP_NAME_KEY,
)
_COMMENT_FUZZ_KEYS: tuple[str, ...] = (
MERGED_FIELD_TO_CSV_HEADER["comment_fuzzy"],
_LEGACY_COMMENT_FUZZ_KEY,
)
_COMMENT_CSV_SKU = COMMENT_CSV_COLUMNS[0]
_COMMENT_CSV_BODY = COMMENT_CSV_COLUMNS[3]
_COMMENT_CSV_SCORE = COMMENT_CSV_COLUMNS[7] # 「评分」→ commentScore
# 评价星级分桶comment_sentiment 模块):仍用于可选的情感 LLM 载荷;报告正文与 brief 已不再输出同口径图
_COMMENT_SCORE_NEG_MAX = 2 # 12 星 → 偏负向
_COMMENT_SCORE_POS_MIN = 4 # 45 星 → 偏正向3 星为中评,归入中性)
_DETAIL_CATEGORY_PATH_KEY = MERGED_FIELD_TO_CSV_HEADER["detail_category_path"]
_K_CAT_COL = JD_SEARCH_CSV_HEADERS["leaf_category"]
_K_PROP_COL = JD_SEARCH_CSV_HEADERS["attributes"]
EXTERNAL_MARKET_TABLE_ROWS: tuple[tuple[str, str, str, str], ...] = ()
__all__ = [
"_COMMENT_CSV_BODY",
"_COMMENT_CSV_SCORE",
"_COMMENT_CSV_SKU",
"EXTERNAL_MARKET_TABLE_ROWS",
"_COMMENT_FUZZ_KEYS",
"_COMMENT_SCORE_NEG_MAX",
"_COMMENT_SCORE_POS_MIN",
"_COUPON_SHOW_PRICE_KEY",
"_DETAIL_CATEGORY_PATH_KEY",
"_DETAIL_PRICE_FINAL_CSV_KEYS",
"_JD_LIST_PRICE_KEY",
"_K_CAT_COL",
"_K_PROP_COL",
"_LEGACY_COUPON_SHOW_PRICE_KEY",
"_LEGACY_JD_LIST_PRICE_KEY",
"_LEGACY_LIST_BRAND_TITLE_KEY",
"_LEGACY_RANK_TAGLINE_KEY",
"_LEGACY_SELLING_POINT_KEY",
"_LEGACY_SHOP_NAME_KEY",
"_LIST_BRAND_TITLE_HEADER",
"_LIST_PRICE_AND_COUPON_KEYS",
"_LIST_SHOW_PRICE_CELL_KEYS",
"_MERGED_SHOP_CELL_KEYS",
"_ORIGINAL_LIST_PRICE_KEY",
"_RANK_TAGLINE_KEY",
"_SELLING_POINT_KEY",
]