v110-v112 自定义模式完善 + 模板导出增强 + 多模态兼容优化
- 自定义模式:分析模型输出 delta 唯一改动指令,生图模板 custom_image_prompt.md({delta} 占位符),不再使用负向提示词;generate_design 按 custom_mode 分支,Pinterest 模式保留原创化指令,两模式互不影响
- 多模态分析 response_format 三级回退(json_schema → json_object → none),兼容 DeepSeek
- 模板导出:details 扩展列(细节1/2/3)、target_audience 扩展列(适用人群1)、固定值风格1=休闲/风格2=运动
- 童装特征库更新 + 标题模板外部化 + 图源映射增强
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
# 2026-09-03 工作日志
|
||||
|
||||
## 新增:Inkreach 商城款号爬取脚本 `crawl_style_codes.py`
|
||||
- 需求:按【国家 + 品类】爬取款号(如 DG505 / JPTM001 / PLTK005),去重输出。
|
||||
- 接口探查结论(重要,见 MEMORY.md 已固化):后端走 **mapi.sdspod.com**(`api.sdspod.com` 在本机 DNS 解析不到,勿用)。
|
||||
- 端点:`/products/pageOptionGroup`(国家列表 14 国)、`/products/page`(商品分页)、`/categories`(品类树 26 顶层)。
|
||||
- 坑:`overseasArea`(国家)与 `id`(品类)筛选参数**实测不生效**(各国 totalCount 恒为 536)→ 改为全量分页拉取 + 本地聚合。
|
||||
- 商品 `categories` 标签顺序固定:`[国家/工厂标签, 品类, "款号 品名"]`(如 `美国工厂直发 | 男士T恤 | DG505 180g男士纯棉长袖`),这是国家/品类/款号最可靠的来源。
|
||||
- 款号提取三个坑及修复:
|
||||
1. `SFB`(墨西哥运动短裤)是**纯字母无数字**款号 → 改为优先用 categories 的「款号 品名」标签识别,不再强制要求含数字。
|
||||
2. 「中东本地工厂直发」属沙特,但正式国名是「沙特阿拉伯」→ 加 `COUNTRY_ALIASES` 别名表(中东→SA、国内工厂→CN)。
|
||||
3. 尺码串(S/M/XL/2XL/3XL)会被旧规则误当款号 → 加 `SIZE_WORDS` 黑名单(US 因此由 60 校正为 56)。
|
||||
- CN(国内工厂)4 条商品 name 无国家前缀、且本身无款号 → 用 `shipmentArea` 兜底归国家,款号留空。
|
||||
- 结果:在架商品 540(海外 536 + 国内 4)→ **13 国 / 65 个品类组合 / 150 条;全局去重款号 149 个**。
|
||||
- 产物:`style_codes_by_country.json`(按国家→品类→款号)、`style_codes_by_country.csv`(country_code,country,category,style_code,utf-8-sig)。
|
||||
|
||||
## 数据维护(同日早些时候)
|
||||
- SPU 表新增 `kids_type`、`kids_age` 两字段(TEXT,默认 NULL 空),`create_db.py` 已同步;SPU 现 39 字段。备份 `spu_sku.db.bak_spu_kids`。
|
||||
- SKU:按 `PLTK005-WH01` 复制生成 6 行 `PLTK005-BL01`(6Y/7Y/8Y/9Y/10Y/11-12Y),code 与 color=黑色 覆盖,其余字段照抄;PLTK005 SKU 由 12 → 18。备份 `spu_sku.db.bak_pltk005_bl01`。
|
||||
- SKU `color` 规范化(单字 → 「X色」):
|
||||
- 纯「黑」256 + 纯「白」149 = 405 行(备份 `spu_sku.db.bak_color_fix`)。
|
||||
- 其余单字 杏68/棕8/灰136/粉23/紫32/红76/绿45/蓝30/黄3 = 421 行(备份 `spu_sku.db.bak_color_single`)。
|
||||
- 未动:多字与组合色(`黑色 白色`、`白色 蓝色 红色 皇家蓝`、`黑胡椒色`、`象牙白`、`米白` 等)。
|
||||
|
||||
## 品类白名单过滤(同日追加)
|
||||
- 需求:只保留 T恤/卫衣/长袖/背心/夹克,删除下装与家居类,**对应款号一并删除**。
|
||||
- 实现:`crawl_style_codes.py` 加常量 `KEEP_CATEGORY_KEYWORDS = ("T恤","卫衣","长袖","背心","夹克")`,在按品类聚合前过滤(品类名含任一关键词才保留);**置空该常量即恢复全量输出**。
|
||||
- 剔除 80 条商品,涉及品类:下装(短裤 & 长裤)20、男士短裤 16、女士短裤 14、家居配饰 10、内衣 6、家居 5、桌面用品 2、配饰 2、男士长裤 2、童装短裤 2、印花烫贴 1。
|
||||
- 结果:13 国 / 10 个品类(女士T恤/女士卫衣/女士背心/男士T恤/男士T恤·GBTM011长袖T/男士卫衣/男士夹克/男士背心/童装T恤/童装卫衣)/ 116 条;**全局去重款号 149 → 115**。
|
||||
- 注:此过滤只作用于爬取产物(json/csv),未改动 SQLite 数据库。
|
||||
|
||||
## 按爬取清单清洗数据库(删除非清单款号)
|
||||
- 备份:`spu_sku.db.bak_before_style_filter`(删前状态 SPU 143 / SKU 2864)。
|
||||
- 规则:以 `style_codes_by_country.json` 的 115 个款号为准,`spu.code`(UPPER+TRIM)不在清单内的 SPU 及其 SKU 全部删除。
|
||||
- 结果:删除 **37 个 SPU / 476 条 SKU**;剩余 **SPU 106 / SKU 2388**;孤儿 SKU = 0。
|
||||
- 被删主力:US 的 DG201/202/204/205/206/210(下装)、JSD001~007(短裤)、JSA002/003/007/010(内衣·短裤)、USIU002/005/012(家居)、YSM01/02(配饰);JP 的 JPIU014/020/021(家居配饰)、JPPM011/JPSM018(下装)、JPJF005;PL 的 PLHM011/PLPM014/PLSU025(下装);GB 的 GBIU009/014/015;DE 的 DEPM004;MX 的 SFB。
|
||||
- 清单有但库里未入库的 9 个款号(本次未补,后续可从 PG 同步):BRTF004、DG505、GBHK007、GBTK012、GBTM010、GBTM011、JPPX012、JPPX013、PLTM031。
|
||||
- 审计文件:`delete_non_keep_codes.sql`(含完整 115 款号 IN 清单,可复核/重放)。
|
||||
|
||||
## 童装T恤款号字段批量更新
|
||||
- 依据:`style_codes_by_country.csv/json` 中品类含「童装T恤」的款号共 19 个,库中命中 **18 个**(GBTK012 尚未入库)。
|
||||
- 更新 4 个字段:`target_audience='男童'`、`season='ALL/全球/所有'`、`kids_type='上衣'`、`kids_age='12岁及以下'`,影响 18 行。
|
||||
- 覆盖国家:US(5000B/DG012/DG014/DG301/DG503/JSA004)、PL(PLHM012/PLHM013/PLTK005/PLTK015/PLTK016)、GB(GBTK005/GBTK008)、JP(JPTK015)、MX(METN001)、SA(SATK004)、ES(ESTK005)、IT(ITTK002);清单国家与库内 country 全部一致。
|
||||
- 备份:`spu_sku.db.bak_kids_tshirt`;审计 SQL:`kids_tshirt_update.sql`。
|
||||
- 备注:GBHM002/GBHM003 的 season 早就是 'ALL/全球/所有'(历史值,非本次改动);**童装卫衣**品类(清单 5 个 / 库中 4 个)本次未改,待用户决定是否同样套用童装字段。
|
||||
|
||||
## 男士卫衣款号字段批量更新
|
||||
- 依据:清单中品类含「男士卫衣」的款号共 21 个,库中命中 **19 个**(JPPX012/JPPX013 尚未入库);国家一致性全部 OK。
|
||||
- 更新 5 个字段:`details='抽绳'`、`collar_style='连帽'`、`target_audience='男士'`、`season='秋/冬'`、`sleeve_length_type='长袖'`,影响 19 行。
|
||||
- 覆盖:US(DF009/DF010/JSB001/JSB002/JSB003)、PL(PLHM002/PLHM003)、GB(GBHM002/GBHM003)、JP(JPHM009/JPHM010)、KR(KRHM002/KRHM003)、ES(ESHM003/ESHM004)、MX(HM01)、CA(CAHM002)、DE(DEHM003)、SA(SAHM003)。
|
||||
- 备份:`spu_sku.db.bak_men_hoodie`;审计 SQL:`men_hoodie_update.sql`。
|
||||
- 备注:GBHM002/GBHM003 原 season='ALL/全球/所有'(历史值)已被本次覆盖为 '秋/冬';当前全表 season 分布 = 秋/冬 19 + ALL/全球/所有 18(童装T恤)+ 四季 69。
|
||||
|
||||
## 品类→字段批量套用模板(可复用)
|
||||
- 数据源固定:`style_codes_by_country.json`(按 国家→品类→款号 组织),脚本 `crawl_style_codes.py` 可重跑刷新。
|
||||
- 标准流程:备份 → 从 json 取「品类含关键词」的款号 → 与 spu.code(UPPER+TRIM) 比对(列出命中/缺失/国家是否一致)→ 事务 UPDATE → 验证明细与全表分布 → 审计 SQL 落盘。
|
||||
- 已套用:童装T恤(18 个,男童/ALL全球/上衣/12岁及以下)、男士卫衣(19 个,抽绳/连帽/男士/秋·冬/长袖)。
|
||||
|
||||
## 新增袖长列 sleeve_length(用户选「加一列」方案)
|
||||
- 背景:商城无袖长分类字段(见 MEMORY.md 三套分类体系),长袖信息只写在商品 name 里,故按分类筛不出长袖。
|
||||
- 实现:`crawl_style_codes.py` 新增 `guess_sleeve_length(name, category)`,判定优先级:
|
||||
1. name 含「无袖/背心/吊带」或品类含「背心」→ 无袖
|
||||
2. name 含「长袖」→ 长袖
|
||||
3. name 含「短袖」→ 短袖
|
||||
4. 品类含「卫衣/夹克」→ 长袖(推断)
|
||||
5. 其余普通 T 恤 → 短袖(默认)
|
||||
- 产出:CSV 由 4 列扩为 5 列(country_code, country, category, style_code, **sleeve_length**);JSON 每个国家下新增 `sleeve_length` 与 `sleeve_source`(判定来源,便于审计修正)。
|
||||
- 结果:长袖 37(name 标注 9 + 品类推断 28)、短袖 69(name 标注 6 + 默认 63)、无袖 9,合计 115 个款号全覆盖、无空值。
|
||||
- 注意:63 个「默认短袖」与 28 个「卫衣/夹克推断长袖」属推断值,如需人工校正以 `sleeve_source` 列筛选即可。
|
||||
|
||||
## 袖长回填 SPU.sleeve_length_type(区分长袖)
|
||||
- 用户需求:「先帮我把长袖给区分出来」→ 把清单 sleeve_length 回填到 SPU 表,让库里能直接筛出长袖。
|
||||
- 执行:以 `style_codes_by_country.csv` 的 sleeve_length 为准回填全部 106 个款号;**更新 20 行**:
|
||||
- 12 个 **短袖→长袖**(藏在 T恤/卫衣/夹克里):DG501/DG502/DG503/DG504/GBHK006/JPTM006/KRTM004/PLHF029/PLHM009/PLHM010/PLJM030/PLTF026
|
||||
- 8 个 **短袖→无袖**(背心款):AUTM003/JPTM008/JSA009/TBB001/VS001/VS002/VS003/VS004
|
||||
- 更新后分布:**长袖 31 / 短袖 66 / 无袖 9**(=106)。清单长袖 37 − 6 个未入库长袖款(DG505/GBTM011/GBTK012/JPPX012/JPPX013 等)= 31。
|
||||
- 备份:`spu_sku.db.bak_sleeve_backfill`;审计 SQL:`sleeve_backfill.sql`(106 条逐款 UPDATE)。
|
||||
|
||||
## 长袖T恤细化(品类含 T恤 且 长袖 → season=秋/冬)
|
||||
- 规则:清单 category 含「T恤」且 sleeve_length='长袖' 的款号 → SPU `sleeve_length_type='长袖'`、`season='秋/冬'`。
|
||||
- 清单共 8 款(DG502/DG503/DG505/GBTK012/GBTM011/JPTM006/KRTM004/PLTF026),库中命中 **5 个**(DG505/GBTK012/GBTM011 未入库)。
|
||||
- sleeve_length_type 上一步回填时已为长袖;本次主要把 season 改「秋/冬」;注意 DG503(童装T恤)season 由「ALL/全球/所有」被覆盖为「秋/冬」(用户指定)。
|
||||
- 全表 season 分布更新为:秋/冬 24(男士卫衣 19 + 长袖T恤 5)/ ALL/全球/所有 17 / 四季 65。
|
||||
- 备份:`spu_sku.db.bak_tee_long`;审计 SQL:`tee_long_update.sql`。
|
||||
|
||||
## 童装款 SKU size_type 统一为「欧美尺码年龄码」
|
||||
- 范围:清单 category 含「童装」的款号 = 童装T恤 19 + 童装卫衣 5 = 24 个;库中命中 **22 个**(GBHK007/GBTK012 未入库)。
|
||||
- 更新:22 款对应 **508 条 SKU** 的 `size_type='欧美尺码年龄码'`。
|
||||
- 注意:① JPTK015(JP) 的 size_group 仍为「亚洲尺码」、size_type 现在是「欧美尺码年龄码」——组合不一致,待用户确认是否妥当;② 部分童装款实际 size 是 XS-XL(5000B/METN001/SATK004/DG012 等)或 90~170 体码(DG014/DG503/DG504/JSA004/JPTK015),本次仅统一 size_type 文案、未改 size。
|
||||
- 备份:`spu_sku.db.bak_kids_sizetype`;审计 SQL:`kids_size_type_update.sql`。
|
||||
|
||||
## 背心款 sleeve_length_type 幂等确认
|
||||
- 范围:清单品类含「背心」共 9 款(男士背心 AUTM003/JPTM002/JPTM008/TBB001/VS001/VS003;女士背心 JSA009/VS002/VS004),库中全部命中。
|
||||
- 结果:9 款在「袖长回填」那步已统一为「无袖」,本轮幂等 UPDATE 确认状态正确(值无实际变化)。
|
||||
- 备份:`spu_sku.db.bak_vest`;审计 SQL:`vest_update.sql`(可复用)。
|
||||
@@ -23,3 +23,20 @@
|
||||
- 部分品类 colors.code 为脏数据(如 'METB001-S-3XL黑色'、'5000B-黑色'、'SFB-黑色')→ 兜底补全
|
||||
- 部分品类无 product_extra(如 SFB/5000B)→ 尺码走 size_chart 回退,包装/重量留空
|
||||
- 家居类尺码格式不一致('30*40/76.2*101.6' vs '30*40')、均码叫法不同(Onesize vs 均码)→ 已加归一化兜底
|
||||
|
||||
## Inkreach 商城公开 API(供 crawl_style_codes.py 复用)
|
||||
- 域名:`https://mapi.sdspod.com`(**坑:前端 JS 里写的 `api.sdspod.com` 在本机 DNS 解析不到,不可用**)
|
||||
- 端点(无需鉴权,带 Referer: https://www.inkreach.cn/ 即可):
|
||||
- `/products/pageOptionGroup` → shipmentCountryList:14 国(US/PL/GB/JP/MX/SA/CA/ES/AU/DE/KR/BR/IT/CN,含各国商品数)
|
||||
- `/products/page` → 商品分页,参数 `shipmentArea=overseas|CN`、`page`、`size`(size 可到 100)
|
||||
- `/categories` → 品类树,26 个顶层(含「美国/欧洲/日本…本地直发」这类国家维度)
|
||||
- **大坑**:`overseasArea`(国家)与 `id`(品类)筛选参数实测**不生效**(各国 totalCount 恒等)→ 只能全量分页拉取后本地聚合。
|
||||
- 商品结构:`categories` 标签顺序固定 = `[国家/工厂标签, 品类, "款号 品名"]`,例:`美国工厂直发 | 男士T恤 | DG505 180g男士纯棉长袖`——国家/品类/款号最可靠的来源。
|
||||
- 款号提取:优先 categories 的「款号 品名」标签(能覆盖纯字母款号如 `SFB`),其次 name 的 `-` 分段;必须用 `SIZE_WORDS` 排除尺码串(S/M/XL/2XL/3XL 会被误判)。
|
||||
- 国家别名:中东→SA(沙特,站点文案非「沙特阿拉伯」)、国内工厂→CN;CN 商品 name 无国家前缀,用 `shipmentArea` 兜底。
|
||||
- 规模参考:在架商品 540(海外 536 + 国内 4)→ 13 国、**149 个去重款号**(CN 4 条本身无款号)。
|
||||
- **三套分类体系(大坑,已查证)**:
|
||||
1. `/categories` 品类树:625 个节点,含「长袖T恤」等 14 个长袖节点,但**没有任何商品挂在上面**(商品 category_id 全都不在这棵树里)。
|
||||
2. 商品 `category_id`:取值在 8186~8741 区间,**不属于** `/categories` 树(树节点 id 是 1295~8659 另一套),无法互相映射。
|
||||
3. 商品 `categories` 标签(脚本用的就是它):`[国家/工厂, 人群款式, "款号 品名"]`,按国家+人群款式组织。
|
||||
- **「长袖/短袖」不是分类,只写在商品 name 里**:全站 name 含"长袖"的商品 30 条 → 9 个款号(DG502/DG503/DG505/GBTK012/GBTM011/JPTM006/KRTM004/PLHF029/PLTF026),它们被并入 男士T恤/女士T恤/童装T恤/女士卫衣 品类。要按长袖筛选只能从 name 判断。
|
||||
|
||||
@@ -0,0 +1,350 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
按【国家 + 品类】爬取 Inkreach 商城商品款号(如 DG505、JPTM001、PLTK005),去重后输出。
|
||||
|
||||
数据源(均为公开只读接口):
|
||||
- 国家列表 : GET {BASE}/products/pageOptionGroup -> shipmentCountryList (code / 中文名 / 商品数)
|
||||
- 品类树 : GET {BASE}/categories -> 品类层级(辅助,商品自带品类标签优先)
|
||||
- 商品列表 : GET {BASE}/products/page -> 分页商品(shipmentArea=overseas / CN)
|
||||
|
||||
说明:
|
||||
- 服务端 overseasArea / id 筛选参数实测不生效,因此采用「全量分页拉取 + 本地按国家/品类聚合」。
|
||||
- 款号从商品 name 中提取:name 形如 "美国(不包邮)180g男士纯棉长袖-DG505-单面印花-美西洛杉矶一仓",
|
||||
取被 "-" 分隔、且满足「纯大写字母+数字、长度 3~8、同时含字母和数字」的段。
|
||||
- 国家由商品 categories[0](如"美国工厂直发"/"巴西本地工厂直发")与 name 前缀匹配中文国家名得到。
|
||||
|
||||
品类白名单:
|
||||
- 只输出品类名含 T恤 / 卫衣 / 长袖 / 背心 / 夹克 的款号(见 KEEP_CATEGORY_KEYWORDS);
|
||||
下装(短裤/长裤)、家居、家居配饰、内衣、配饰、印花烫贴、桌面用品等品类连同其款号一并剔除。
|
||||
- 恢复全量:把 KEEP_CATEGORY_KEYWORDS 改成空元组 () 重跑即可。
|
||||
|
||||
输出(与脚本同目录):
|
||||
- style_codes_by_country.json {国家代码: {country, categories: {品类: [款号...]}}}
|
||||
- style_codes_by_country.csv 国家代码,国家,品类,款号
|
||||
"""
|
||||
|
||||
import csv
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
from collections import defaultdict
|
||||
|
||||
try:
|
||||
sys.stdout.reconfigure(encoding="utf-8")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
BASE = "https://mapi.sdspod.com"
|
||||
HEADERS = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
|
||||
"Accept": "application/json",
|
||||
"Referer": "https://www.inkreach.cn/",
|
||||
}
|
||||
PAGE_SIZE = 100 # 实测服务端允许的最大分页大小
|
||||
REQUEST_DELAY = 0.3 # 请求间隔(秒),礼貌爬取
|
||||
TIMEOUT = 30
|
||||
RETRIES = 3
|
||||
|
||||
OUT_JSON = "style_codes_by_country.json"
|
||||
OUT_CSV = "style_codes_by_country.csv"
|
||||
|
||||
# 品类白名单:品类名包含任一关键词才保留,其余(下装/短裤/长裤/家居/家居配饰/内衣/
|
||||
# 配饰/印花烫贴/桌面用品 等)连同其款号一并剔除。想恢复全量,把这里改成空元组即可。
|
||||
KEEP_CATEGORY_KEYWORDS = ("T恤", "卫衣", "长袖", "背心", "夹克")
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- 基础请求
|
||||
def http_get_json(path, params=None):
|
||||
"""GET 请求,返回 dict;失败自动重试。"""
|
||||
url = BASE + path
|
||||
if params:
|
||||
url += "?" + urllib.parse.urlencode(params)
|
||||
last_err = None
|
||||
for attempt in range(1, RETRIES + 1):
|
||||
try:
|
||||
req = urllib.request.Request(url, headers=HEADERS)
|
||||
with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:
|
||||
return json.loads(resp.read().decode("utf-8"))
|
||||
except Exception as e: # noqa: BLE001
|
||||
last_err = e
|
||||
if attempt < RETRIES:
|
||||
time.sleep(1.0 * attempt)
|
||||
raise RuntimeError(f"请求失败 {url} -> {last_err}")
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- 数据抓取
|
||||
def fetch_countries():
|
||||
"""返回 [(countryCode, 中文名, 商品数), ...],按名称长度降序(便于长名优先匹配)。"""
|
||||
d = http_get_json("/products/pageOptionGroup")
|
||||
lst = d.get("shipmentCountryList") or []
|
||||
out = [(c.get("countryCode") or "", c.get("country") or "", c.get("num") or 0) for c in lst]
|
||||
out.sort(key=lambda x: -len(x[1]))
|
||||
return out
|
||||
|
||||
|
||||
def fetch_all_products():
|
||||
"""分页拉取全部商品(海外 + 中国两个发货区域),按 id 去重。"""
|
||||
products, seen = [], set()
|
||||
for area in ("overseas", "CN"):
|
||||
page, got = 1, 0
|
||||
while True:
|
||||
d = http_get_json("/products/page", {"shipmentArea": area, "page": page, "size": PAGE_SIZE})
|
||||
items = d.get("items") or []
|
||||
if not items:
|
||||
break
|
||||
for it in items:
|
||||
pid = it.get("id")
|
||||
if pid in seen:
|
||||
continue
|
||||
seen.add(pid)
|
||||
it["_shipmentArea"] = area
|
||||
products.append(it)
|
||||
total = int(d.get("totalCount") or 0)
|
||||
got += len(items)
|
||||
print(f" [{area}] page={page:<3} +{len(items):<4} 本区累计 {got}/{total}")
|
||||
if got >= total or len(items) < PAGE_SIZE:
|
||||
break
|
||||
page += 1
|
||||
time.sleep(REQUEST_DELAY)
|
||||
return products
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- 解析规则
|
||||
CODE_SEG = re.compile(r"^[A-Z0-9]{2,8}$")
|
||||
CODE_LABEL = re.compile(r"^([A-Z0-9]{2,8})\s+") # "DG505 180g男士纯棉长袖"
|
||||
CODE_INLINE = re.compile(r"\b([A-Z]{1,5}\d{2,6}[A-Z]?|\d{2,5}[A-Z]{1,3})\b")
|
||||
|
||||
# 尺码词:避免把 S / M / XL / 3XL 之类误判成款号
|
||||
SIZE_WORDS = {"S", "M", "L", "XL", "XXL", "XXXL", "XXXXL", "XXXXXL",
|
||||
"XS", "XXS", "2XL", "3XL", "4XL", "5XL", "6XL", "SML", "ML", "OS"}
|
||||
|
||||
# 国家别名:站点文案与 pageOptionGroup 的正式国名不一致时的映射
|
||||
COUNTRY_ALIASES = {
|
||||
"中东": "SA", # "中东本地工厂直发" -> 沙特阿拉伯(SA)
|
||||
"国内工厂": "CN", # "国内工厂" -> 中国(CN)
|
||||
}
|
||||
|
||||
|
||||
def is_valid_code(s):
|
||||
"""款号合法性:2~8 位大写字母/数字,含字母,且不是尺码词。"""
|
||||
s = (s or "").upper()
|
||||
if s in SIZE_WORDS:
|
||||
return False
|
||||
if not CODE_SEG.match(s):
|
||||
return False
|
||||
return bool(re.search(r"[A-Z]", s)) # 必须含字母,排除 "180" 之类纯数字
|
||||
|
||||
|
||||
def extract_style_code(name, cats):
|
||||
"""提取款号:优先 categories 的『款号 品名』标签,其次 name 的 '-' 分段,最后全局正则。"""
|
||||
# 1) categories 里的 "DG505 180g男士纯棉长袖" / "SFB 运动短裤"(最可靠,纯字母款号也能拿到)
|
||||
for c in cats:
|
||||
m = CODE_LABEL.match(c.strip())
|
||||
if m and is_valid_code(m.group(1)):
|
||||
return m.group(1).upper()
|
||||
# 2) name 按 '-' 分段
|
||||
for seg in (name or "").split("-"):
|
||||
s = seg.strip().upper()
|
||||
if is_valid_code(s):
|
||||
return s
|
||||
# 3) 兜底:全局正则
|
||||
m = CODE_INLINE.search(name or "")
|
||||
if m and is_valid_code(m.group(1)):
|
||||
return m.group(1).upper()
|
||||
return None
|
||||
|
||||
|
||||
def match_country(text, head, countries, area=None):
|
||||
"""匹配国家:别名 -> name 前段 -> 全文 -> shipmentArea 兜底。"""
|
||||
cn_by_code = {code: cn for code, cn, _ in countries}
|
||||
for alias, code in COUNTRY_ALIASES.items():
|
||||
if alias in head or alias in text:
|
||||
return code, cn_by_code.get(code, alias)
|
||||
for scope in (head, text):
|
||||
for code, cn, _ in countries:
|
||||
if cn and cn in scope:
|
||||
return code, cn
|
||||
if area == "CN":
|
||||
return "CN", cn_by_code.get("CN", "中国")
|
||||
return "UNKNOWN", "未识别"
|
||||
|
||||
|
||||
def pick_category(cats, cn_name, style_code):
|
||||
"""品类 = categories 中去掉『国家/工厂标签』与『款号+品名标签』后剩下的部分。"""
|
||||
rest = []
|
||||
for c in cats:
|
||||
c_stripped = c.strip()
|
||||
if not c_stripped:
|
||||
continue
|
||||
if cn_name and cn_name in c_stripped: # 国家标签,如"美国工厂直发"
|
||||
continue
|
||||
if "直发" in c_stripped or "工厂" in c_stripped:
|
||||
continue
|
||||
head = c_stripped.split(" ")[0]
|
||||
if style_code and head.upper() == style_code.upper(): # "DG505 180g男士纯棉长袖"
|
||||
continue
|
||||
rest.append(c_stripped)
|
||||
return " / ".join(rest) if rest else "未分类"
|
||||
|
||||
|
||||
def guess_sleeve_length(name, category):
|
||||
"""推断袖长,返回 (袖长, 来源)。
|
||||
|
||||
商城没有袖长分类字段,只能从商品名/品类推断,来源用于审计:
|
||||
- 商品名明确写「长袖/短袖/无袖」 -> 来源 "name"
|
||||
- 品类是背心/吊带 -> 无袖,来源 "品类"
|
||||
- 品类是卫衣/夹克 -> 长袖,来源 "品类推断"(卫衣、夹克默认长袖)
|
||||
- 其余(普通 T 恤,名里没写) -> 短袖,来源 "默认(T恤)"
|
||||
"""
|
||||
n, c = name or "", category or ""
|
||||
if "无袖" in n or "背心" in n or "吊带" in n or "背心" in c:
|
||||
return "无袖", "品类" if ("背心" in c and "背心" not in n and "无袖" not in n) else "name"
|
||||
if "长袖" in n:
|
||||
return "长袖", "name"
|
||||
if "短袖" in n:
|
||||
return "短袖", "name"
|
||||
if "卫衣" in c or "夹克" in c:
|
||||
return "长袖", "品类推断"
|
||||
return "短袖", "默认(T恤)"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- 主流程
|
||||
def main():
|
||||
print("=" * 66)
|
||||
print("Inkreach 款号爬取:按国家 + 品类,去重")
|
||||
print("=" * 66)
|
||||
|
||||
print("\n[1/4] 获取国家列表 ...")
|
||||
countries = fetch_countries()
|
||||
for code, cn, num in countries:
|
||||
print(f" {code:<8} {cn:<10} {num:>4} 个商品")
|
||||
print(f" 共 {len(countries)} 个国家/地区")
|
||||
|
||||
print("\n[2/4] 获取品类树 ...")
|
||||
try:
|
||||
cat_tree = http_get_json("/categories").get("items") or []
|
||||
leaf = sum(len(c.get("subcategory") or []) for c in cat_tree)
|
||||
print(f" 顶层品类 {len(cat_tree)} 个,二级品类 {leaf} 个(商品自带品类标签优先,此树仅参考)")
|
||||
except Exception as e: # noqa: BLE001
|
||||
print(f" 品类树获取失败(不影响主流程): {e}")
|
||||
|
||||
print("\n[3/4] 分页拉取全部商品 ...")
|
||||
products = fetch_all_products()
|
||||
print(f" 商品总数(去重后): {len(products)}")
|
||||
|
||||
print("\n[4/4] 解析并按 国家 / 品类 聚合款号 ...")
|
||||
# country_code -> category -> {style_code}
|
||||
data = dict()
|
||||
country_cn = {}
|
||||
no_code = []
|
||||
dropped = defaultdict(int) # 被品类白名单剔除的品类 -> 商品条数
|
||||
sleeve_map = {} # 款号 -> (袖长, 来源)
|
||||
|
||||
for it in products:
|
||||
name = it.get("name") or ""
|
||||
cats = [c.get("name", "") for c in (it.get("categories") or [])]
|
||||
text = " ".join([name] + cats)
|
||||
head = name[:12] # 国家一般写在 name 最前面
|
||||
|
||||
code, cn = match_country(text, head, countries, it.get("_shipmentArea"))
|
||||
style = extract_style_code(name, cats)
|
||||
if not style:
|
||||
no_code.append(name)
|
||||
continue
|
||||
style = style.upper()
|
||||
|
||||
category = pick_category(cats, cn, style)
|
||||
# 品类白名单过滤:只保留 T恤/卫衣/长袖/背心/夹克,其余品类及其款号一并剔除
|
||||
if KEEP_CATEGORY_KEYWORDS and not any(k in category for k in KEEP_CATEGORY_KEYWORDS):
|
||||
dropped[category] += 1
|
||||
continue
|
||||
country_cn.setdefault(code, cn)
|
||||
data.setdefault(code, {}).setdefault(category, set()).add(style)
|
||||
if style not in sleeve_map:
|
||||
sleeve_map[style] = guess_sleeve_length(name, category)
|
||||
|
||||
if no_code:
|
||||
print(f" ⚠ {len(no_code)} 条商品未提取到款号(见控制台样例):")
|
||||
for n in no_code[:5]:
|
||||
print(f" - {n}")
|
||||
|
||||
if dropped:
|
||||
print(f" 已按品类白名单剔除 {sum(dropped.values())} 条商品,涉及品类:")
|
||||
for c, n in sorted(dropped.items(), key=lambda x: -x[1]):
|
||||
print(f" - {c}({n} 条)")
|
||||
|
||||
# ---------------- 汇总输出 ----------------
|
||||
print("\n" + "=" * 66)
|
||||
print("汇总:各国品类数 / 款号数(去重)")
|
||||
print("=" * 66)
|
||||
print(f"{'国家':<12}{'代码':<8}{'品类数':>8}{'款号数':>10}")
|
||||
print("-" * 66)
|
||||
total_cats = total_codes = 0
|
||||
all_codes = set()
|
||||
for code in sorted(data, key=lambda c: -sum(len(v) for v in data[c].values())):
|
||||
cats_map = data[code]
|
||||
n_codes = sum(len(v) for v in cats_map.values())
|
||||
total_cats += len(cats_map)
|
||||
total_codes += n_codes
|
||||
for v in cats_map.values():
|
||||
all_codes |= v
|
||||
print(f"{country_cn.get(code,''):<12}{code:<8}{len(cats_map):>8}{n_codes:>10}")
|
||||
print("-" * 66)
|
||||
print(f"{'合计':<20}{total_cats:>8}{total_codes:>10} (全局去重款号 {len(all_codes)} 个)")
|
||||
|
||||
# ---------------- 袖长分布 ----------------
|
||||
if sleeve_map:
|
||||
print("\n=== 袖长分布(按款号去重)===")
|
||||
sl_cnt, src_cnt = defaultdict(int), defaultdict(int)
|
||||
for v, s in sleeve_map.values():
|
||||
sl_cnt[v] += 1
|
||||
src_cnt[s] += 1
|
||||
for k, v in sorted(sl_cnt.items(), key=lambda x: -x[1]):
|
||||
print(f" {k:<6} {v:>4} 个款号")
|
||||
print(" 判定来源:", dict(sorted(src_cnt.items(), key=lambda x: -x[1])))
|
||||
|
||||
# ---------------- 写 JSON ----------------
|
||||
out = {}
|
||||
for code, cats_map in data.items():
|
||||
codes_here = sorted({c for v in cats_map.values() for c in v})
|
||||
out[code] = {
|
||||
"country": country_cn.get(code, ""),
|
||||
"categories": {c: sorted(v) for c, v in sorted(cats_map.items())},
|
||||
"sleeve_length": {c: sleeve_map.get(c, ("", ""))[0] for c in codes_here},
|
||||
"sleeve_source": {c: sleeve_map.get(c, ("", ""))[1] for c in codes_here},
|
||||
}
|
||||
with open(OUT_JSON, "w", encoding="utf-8") as f:
|
||||
json.dump(out, f, ensure_ascii=False, indent=2)
|
||||
print(f"\n✅ 已写出 {OUT_JSON}")
|
||||
|
||||
# ---------------- 写 CSV ----------------
|
||||
rows = []
|
||||
for code in sorted(out):
|
||||
for cat, codes in out[code]["categories"].items():
|
||||
for c in codes:
|
||||
rows.append([code, country_cn.get(code, ""), cat, c,
|
||||
sleeve_map.get(c, ("", ""))[0]])
|
||||
with open(OUT_CSV, "w", encoding="utf-8-sig", newline="") as f:
|
||||
w = csv.writer(f)
|
||||
w.writerow(["country_code", "country", "category", "style_code", "sleeve_length"])
|
||||
w.writerows(rows)
|
||||
print(f"✅ 已写出 {OUT_CSV}({len(rows)} 行)")
|
||||
|
||||
# ---------------- 样例预览 ----------------
|
||||
print("\n样例预览(每个国家取 1 个品类,最多 8 个款号):")
|
||||
for code in list(sorted(out))[:6]:
|
||||
cats_map = out[code]["categories"]
|
||||
if not cats_map:
|
||||
continue
|
||||
cat0 = sorted(cats_map)[0]
|
||||
codes = cats_map[cat0][:8]
|
||||
print(f" [{code}] {country_cn.get(code,'')} / {cat0}: {', '.join(codes)}"
|
||||
+ (" ..." if len(cats_map[cat0]) > 8 else ""))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,18 @@
|
||||
-- 以爬取清单(剔除后 115 个款号)为准,
|
||||
-- 删除 spu.code 不在清单内的 SPU 及其对应 SKU。
|
||||
-- 执行顺序:先删子表 sku,再删主表 spu。
|
||||
|
||||
-- 1) 删除非清单款号对应的 SKU
|
||||
DELETE FROM sku
|
||||
WHERE spu_id IN (
|
||||
SELECT id FROM spu
|
||||
WHERE UPPER(TRIM(code)) NOT IN ('5000B', 'AUTM001', 'AUTM002', 'AUTM003', 'BRTF004', 'BRTF007', 'BRTM001', 'BRTM002', 'C1717', 'CAHM002', 'CATM001', 'CATM006', 'CATM007', 'DEHM003', 'DETM001', 'DETM002', 'DF009', 'DF010', 'DG001', 'DG004', 'DG012', 'DG013', 'DG014', 'DG015', 'DG100', 'DG101', 'DG102', 'DG110', 'DG120', 'DG150', 'DG301', 'DG501', 'DG502', 'DG503', 'DG504', 'DG505', 'DG601', 'ESHM003', 'ESHM004', 'ESTK005', 'ESTM002', 'GBHK006', 'GBHK007', 'GBHM002', 'GBHM003', 'GBTF004', 'GBTK005', 'GBTK008', 'GBTK012', 'GBTM001', 'GBTM010', 'GBTM011', 'GBTM013', 'HM01', 'ITFM005', 'ITTK002', 'ITTM001', 'JPHM009', 'JPHM010', 'JPPX012', 'JPPX013', 'JPTK015', 'JPTM001', 'JPTM002', 'JPTM004', 'JPTM006', 'JPTM007', 'JPTM008', 'JSA004', 'JSA006', 'JSA008', 'JSA009', 'JSA011', 'JSB001', 'JSB002', 'JSB003', 'JSE008', 'JSS001', 'KRHM002', 'KRHM003', 'KRTM001', 'KRTM004', 'MESXT001', 'METB001', 'METN001', 'METP001', 'PET001', 'PLHF029', 'PLHM002', 'PLHM003', 'PLHM009', 'PLHM010', 'PLHM012', 'PLHM013', 'PLJM030', 'PLTF004', 'PLTF026', 'PLTF027', 'PLTF028', 'PLTK005', 'PLTK015', 'PLTK016', 'PLTM001', 'PLTM006', 'PLTM008', 'PLTM024', 'PLTM031', 'SAHM003', 'SATK004', 'SATU001', 'TBB001', 'VS001', 'VS002', 'VS003', 'VS004')
|
||||
);
|
||||
|
||||
-- 2) 删除非清单款号的 SPU
|
||||
DELETE FROM spu
|
||||
WHERE UPPER(TRIM(code)) NOT IN ('5000B', 'AUTM001', 'AUTM002', 'AUTM003', 'BRTF004', 'BRTF007', 'BRTM001', 'BRTM002', 'C1717', 'CAHM002', 'CATM001', 'CATM006', 'CATM007', 'DEHM003', 'DETM001', 'DETM002', 'DF009', 'DF010', 'DG001', 'DG004', 'DG012', 'DG013', 'DG014', 'DG015', 'DG100', 'DG101', 'DG102', 'DG110', 'DG120', 'DG150', 'DG301', 'DG501', 'DG502', 'DG503', 'DG504', 'DG505', 'DG601', 'ESHM003', 'ESHM004', 'ESTK005', 'ESTM002', 'GBHK006', 'GBHK007', 'GBHM002', 'GBHM003', 'GBTF004', 'GBTK005', 'GBTK008', 'GBTK012', 'GBTM001', 'GBTM010', 'GBTM011', 'GBTM013', 'HM01', 'ITFM005', 'ITTK002', 'ITTM001', 'JPHM009', 'JPHM010', 'JPPX012', 'JPPX013', 'JPTK015', 'JPTM001', 'JPTM002', 'JPTM004', 'JPTM006', 'JPTM007', 'JPTM008', 'JSA004', 'JSA006', 'JSA008', 'JSA009', 'JSA011', 'JSB001', 'JSB002', 'JSB003', 'JSE008', 'JSS001', 'KRHM002', 'KRHM003', 'KRTM001', 'KRTM004', 'MESXT001', 'METB001', 'METN001', 'METP001', 'PET001', 'PLHF029', 'PLHM002', 'PLHM003', 'PLHM009', 'PLHM010', 'PLHM012', 'PLHM013', 'PLJM030', 'PLTF004', 'PLTF026', 'PLTF027', 'PLTF028', 'PLTK005', 'PLTK015', 'PLTK016', 'PLTM001', 'PLTM006', 'PLTM008', 'PLTM024', 'PLTM031', 'SAHM003', 'SATK004', 'SATU001', 'TBB001', 'VS001', 'VS002', 'VS003', 'VS004');
|
||||
|
||||
-- 校验:应返回 0
|
||||
SELECT COUNT(*) AS orphan_sku FROM sku
|
||||
WHERE spu_id NOT IN (SELECT id FROM spu);
|
||||
@@ -0,0 +1,10 @@
|
||||
-- 童装款号(22 个)对应 SKU 的 size_type 统一改为『欧美尺码年龄码』
|
||||
UPDATE sku
|
||||
SET size_type = '欧美尺码年龄码'
|
||||
WHERE spu_id IN (SELECT id FROM spu WHERE UPPER(TRIM(code)) IN ('5000B', 'DG012', 'DG014', 'DG301', 'DG503', 'DG504', 'ESTK005', 'GBHK006', 'GBTK005', 'GBTK008', 'ITTK002', 'JPTK015', 'JSA004', 'METN001', 'PLHM009', 'PLHM010', 'PLHM012', 'PLHM013', 'PLTK005', 'PLTK015', 'PLTK016', 'SATK004'));
|
||||
|
||||
-- 校验
|
||||
SELECT s.code, s.country, k.size_type, COUNT(*) AS n
|
||||
FROM sku k JOIN spu s ON k.spu_id = s.id
|
||||
WHERE UPPER(TRIM(s.code)) IN ('5000B', 'DG012', 'DG014', 'DG301', 'DG503', 'DG504', 'ESTK005', 'GBHK006', 'GBTK005', 'GBTK008', 'ITTK002', 'JPTK015', 'JSA004', 'METN001', 'PLHM009', 'PLHM010', 'PLHM012', 'PLHM013', 'PLTK005', 'PLTK015', 'PLTK016', 'SATK004')
|
||||
GROUP BY s.code, s.country, k.size_type;
|
||||
@@ -0,0 +1,15 @@
|
||||
-- 以 style_codes_by_country.csv 中『童装T恤』品类的 19 个款号为准,
|
||||
-- 更新对应 SPU 的 target_audience / season / kids_type / kids_age。
|
||||
|
||||
UPDATE spu
|
||||
SET target_audience = '男童',
|
||||
season = 'ALL/全球/所有',
|
||||
kids_type = '上衣',
|
||||
kids_age = '12岁及以下'
|
||||
WHERE UPPER(TRIM(code)) IN ('5000B', 'DG012', 'DG014', 'DG301', 'DG503', 'ESTK005', 'GBTK005', 'GBTK008', 'GBTK012', 'ITTK002', 'JPTK015', 'JSA004', 'METN001', 'PLHM012', 'PLHM013', 'PLTK005', 'PLTK015', 'PLTK016', 'SATK004');
|
||||
|
||||
-- 校验(应返回被更新行数与取值分布)
|
||||
SELECT target_audience, season, kids_type, kids_age, COUNT(*)
|
||||
FROM spu
|
||||
WHERE UPPER(TRIM(code)) IN ('5000B', 'DG012', 'DG014', 'DG301', 'DG503', 'ESTK005', 'GBTK005', 'GBTK008', 'GBTK012', 'ITTK002', 'JPTK015', 'JSA004', 'METN001', 'PLHM012', 'PLHM013', 'PLTK005', 'PLTK015', 'PLTK016', 'SATK004')
|
||||
GROUP BY target_audience, season, kids_type, kids_age;
|
||||
@@ -0,0 +1,16 @@
|
||||
-- 以 style_codes_by_country.csv 中『男士卫衣』品类的 21 个款号为准,
|
||||
-- 更新对应 SPU 的 details / collar_style / target_audience / season / sleeve_length_type。
|
||||
|
||||
UPDATE spu
|
||||
SET details = '抽绳',
|
||||
collar_style = '连帽',
|
||||
target_audience = '男士',
|
||||
season = '秋/冬',
|
||||
sleeve_length_type = '长袖'
|
||||
WHERE UPPER(TRIM(code)) IN ('CAHM002', 'DEHM003', 'DF009', 'DF010', 'ESHM003', 'ESHM004', 'GBHM002', 'GBHM003', 'HM01', 'JPHM009', 'JPHM010', 'JPPX012', 'JPPX013', 'JSB001', 'JSB002', 'JSB003', 'KRHM002', 'KRHM003', 'PLHM002', 'PLHM003', 'SAHM003');
|
||||
|
||||
-- 校验
|
||||
SELECT details, collar_style, target_audience, season, sleeve_length_type, COUNT(*)
|
||||
FROM spu
|
||||
WHERE UPPER(TRIM(code)) IN ('CAHM002', 'DEHM003', 'DF009', 'DF010', 'ESHM003', 'ESHM004', 'GBHM002', 'GBHM003', 'HM01', 'JPHM009', 'JPHM010', 'JPPX012', 'JPPX013', 'JSB001', 'JSB002', 'JSB003', 'KRHM002', 'KRHM003', 'PLHM002', 'PLHM003', 'SAHM003')
|
||||
GROUP BY details, collar_style, target_audience, season, sleeve_length_type;
|
||||
@@ -0,0 +1,109 @@
|
||||
-- 以 style_codes_by_country.csv 的 sleeve_length 为准,回填 SPU.sleeve_length_type
|
||||
-- 逐个款号 UPDATE(防误伤)
|
||||
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = '5000B';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'AUTM001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'AUTM002';
|
||||
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'AUTM003';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'BRTF007';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'BRTM001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'BRTM002';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'C1717';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'CAHM002';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'CATM001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'CATM006';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'CATM007';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DEHM003';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DETM001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DETM002';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DF009';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DF010';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG004';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG012';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG013';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG014';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG015';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG100';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG101';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG102';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG110';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG120';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG150';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG301';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DG501';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DG502';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DG503';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DG504';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG601';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'ESHM003';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'ESHM004';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'ESTK005';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'ESTM002';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'GBHK006';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'GBHM002';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'GBHM003';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'GBTF004';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'GBTK005';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'GBTK008';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'GBTM001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'GBTM013';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'HM01';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'ITFM005';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'ITTK002';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'ITTM001';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JPHM009';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JPHM010';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JPTK015';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JPTM001';
|
||||
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'JPTM002';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JPTM004';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JPTM006';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JPTM007';
|
||||
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'JPTM008';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSA004';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSA006';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSA008';
|
||||
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'JSA009';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSA011';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JSB001';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JSB002';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JSB003';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSE008';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSS001';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'KRHM002';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'KRHM003';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'KRTM001';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'KRTM004';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'MESXT001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'METB001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'METN001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'METP001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PET001';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLHF029';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLHM002';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLHM003';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLHM009';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLHM010';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLHM012';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLHM013';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLJM030';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTF004';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLTF026';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTF027';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTF028';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTK005';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTK015';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTK016';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTM001';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTM006';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTM008';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTM024';
|
||||
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'SAHM003';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'SATK004';
|
||||
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'SATU001';
|
||||
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'TBB001';
|
||||
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'VS001';
|
||||
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'VS002';
|
||||
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'VS003';
|
||||
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'VS004';
|
||||
Binary file not shown.
@@ -0,0 +1,117 @@
|
||||
country_code,country,category,style_code,sleeve_length
|
||||
AU,澳大利亚,男士T恤,AUTM001,短袖
|
||||
AU,澳大利亚,男士T恤,AUTM002,短袖
|
||||
AU,澳大利亚,男士背心,AUTM003,无袖
|
||||
BR,巴西,女士T恤,BRTF004,短袖
|
||||
BR,巴西,女士T恤,BRTF007,短袖
|
||||
BR,巴西,男士T恤,BRTM001,短袖
|
||||
BR,巴西,男士T恤,BRTM002,短袖
|
||||
CA,加拿大,男士T恤,CATM001,短袖
|
||||
CA,加拿大,男士T恤,CATM006,短袖
|
||||
CA,加拿大,男士T恤,CATM007,短袖
|
||||
CA,加拿大,男士卫衣,CAHM002,长袖
|
||||
DE,德国,男士T恤,DETM001,短袖
|
||||
DE,德国,男士T恤,DETM002,短袖
|
||||
DE,德国,男士卫衣,DEHM003,长袖
|
||||
ES,西班牙,男士T恤,ESTM002,短袖
|
||||
ES,西班牙,男士卫衣,ESHM003,长袖
|
||||
ES,西班牙,男士卫衣,ESHM004,长袖
|
||||
ES,西班牙,童装T恤,ESTK005,短袖
|
||||
GB,英国,女士T恤,GBTF004,短袖
|
||||
GB,英国,男士T恤,GBTM001,短袖
|
||||
GB,英国,男士T恤,GBTM010,短袖
|
||||
GB,英国,男士T恤,GBTM013,短袖
|
||||
GB,英国,男士T恤 / GBTM011长袖T,GBTM011,长袖
|
||||
GB,英国,男士卫衣,GBHM002,长袖
|
||||
GB,英国,男士卫衣,GBHM003,长袖
|
||||
GB,英国,童装T恤,GBTK005,短袖
|
||||
GB,英国,童装T恤,GBTK008,短袖
|
||||
GB,英国,童装T恤,GBTK012,长袖
|
||||
GB,英国,童装卫衣,GBHK006,长袖
|
||||
GB,英国,童装卫衣,GBHK007,长袖
|
||||
IT,意大利,女士T恤,ITFM005,短袖
|
||||
IT,意大利,男士T恤,ITTM001,短袖
|
||||
IT,意大利,童装T恤,ITTK002,短袖
|
||||
JP,日本,男士T恤,JPTM001,短袖
|
||||
JP,日本,男士T恤,JPTM004,短袖
|
||||
JP,日本,男士T恤,JPTM006,长袖
|
||||
JP,日本,男士T恤,JPTM007,短袖
|
||||
JP,日本,男士卫衣,JPHM009,长袖
|
||||
JP,日本,男士卫衣,JPHM010,长袖
|
||||
JP,日本,男士卫衣,JPPX012,长袖
|
||||
JP,日本,男士卫衣,JPPX013,长袖
|
||||
JP,日本,男士背心,JPTM002,无袖
|
||||
JP,日本,男士背心,JPTM008,无袖
|
||||
JP,日本,童装T恤,JPTK015,短袖
|
||||
KR,韩国,男士T恤,KRTM001,短袖
|
||||
KR,韩国,男士T恤,KRTM004,长袖
|
||||
KR,韩国,男士卫衣,KRHM002,长袖
|
||||
KR,韩国,男士卫衣,KRHM003,长袖
|
||||
MX,墨西哥,女士T恤,METP001,短袖
|
||||
MX,墨西哥,男士T恤,MESXT001,短袖
|
||||
MX,墨西哥,男士T恤,METB001,短袖
|
||||
MX,墨西哥,男士T恤,PET001,短袖
|
||||
MX,墨西哥,男士卫衣,HM01,长袖
|
||||
MX,墨西哥,男士背心,TBB001,无袖
|
||||
MX,墨西哥,童装T恤,METN001,短袖
|
||||
PL,波兰,女士T恤,PLTF004,短袖
|
||||
PL,波兰,女士T恤,PLTF026,长袖
|
||||
PL,波兰,女士T恤,PLTF027,短袖
|
||||
PL,波兰,女士T恤,PLTF028,短袖
|
||||
PL,波兰,女士卫衣,PLHF029,长袖
|
||||
PL,波兰,男士T恤,PLTM001,短袖
|
||||
PL,波兰,男士T恤,PLTM006,短袖
|
||||
PL,波兰,男士T恤,PLTM008,短袖
|
||||
PL,波兰,男士T恤,PLTM024,短袖
|
||||
PL,波兰,男士T恤,PLTM031,短袖
|
||||
PL,波兰,男士卫衣,PLHM002,长袖
|
||||
PL,波兰,男士卫衣,PLHM003,长袖
|
||||
PL,波兰,男士夹克,PLJM030,长袖
|
||||
PL,波兰,童装T恤,PLHM012,短袖
|
||||
PL,波兰,童装T恤,PLHM013,短袖
|
||||
PL,波兰,童装T恤,PLTK005,短袖
|
||||
PL,波兰,童装T恤,PLTK015,短袖
|
||||
PL,波兰,童装T恤,PLTK016,短袖
|
||||
PL,波兰,童装卫衣,PLHM009,长袖
|
||||
PL,波兰,童装卫衣,PLHM010,长袖
|
||||
SA,沙特阿拉伯,女士T恤,SATU001,短袖
|
||||
SA,沙特阿拉伯,男士T恤,SATU001,短袖
|
||||
SA,沙特阿拉伯,男士卫衣,SAHM003,长袖
|
||||
SA,沙特阿拉伯,童装T恤,SATK004,短袖
|
||||
US,美国,女士T恤,DG100,短袖
|
||||
US,美国,女士T恤,DG101,短袖
|
||||
US,美国,女士T恤,DG102,短袖
|
||||
US,美国,女士T恤,DG110,短袖
|
||||
US,美国,女士T恤,DG120,短袖
|
||||
US,美国,女士T恤,DG150,短袖
|
||||
US,美国,女士T恤,DG502,长袖
|
||||
US,美国,女士T恤,DG601,短袖
|
||||
US,美国,女士T恤,JSA008,短袖
|
||||
US,美国,女士T恤,JSA011,短袖
|
||||
US,美国,女士T恤,JSE008,短袖
|
||||
US,美国,女士卫衣,DG501,长袖
|
||||
US,美国,女士背心,JSA009,无袖
|
||||
US,美国,女士背心,VS002,无袖
|
||||
US,美国,女士背心,VS004,无袖
|
||||
US,美国,男士T恤,C1717,短袖
|
||||
US,美国,男士T恤,DG001,短袖
|
||||
US,美国,男士T恤,DG004,短袖
|
||||
US,美国,男士T恤,DG013,短袖
|
||||
US,美国,男士T恤,DG015,短袖
|
||||
US,美国,男士T恤,DG505,长袖
|
||||
US,美国,男士T恤,JSA006,短袖
|
||||
US,美国,男士T恤,JSS001,短袖
|
||||
US,美国,男士卫衣,DF009,长袖
|
||||
US,美国,男士卫衣,DF010,长袖
|
||||
US,美国,男士卫衣,JSB001,长袖
|
||||
US,美国,男士卫衣,JSB002,长袖
|
||||
US,美国,男士卫衣,JSB003,长袖
|
||||
US,美国,男士背心,VS001,无袖
|
||||
US,美国,男士背心,VS003,无袖
|
||||
US,美国,童装T恤,5000B,短袖
|
||||
US,美国,童装T恤,DG012,短袖
|
||||
US,美国,童装T恤,DG014,短袖
|
||||
US,美国,童装T恤,DG301,短袖
|
||||
US,美国,童装T恤,DG503,长袖
|
||||
US,美国,童装T恤,JSA004,短袖
|
||||
US,美国,童装卫衣,DG504,长袖
|
||||
|
@@ -0,0 +1,565 @@
|
||||
{
|
||||
"US": {
|
||||
"country": "美国",
|
||||
"categories": {
|
||||
"女士T恤": [
|
||||
"DG100",
|
||||
"DG101",
|
||||
"DG102",
|
||||
"DG110",
|
||||
"DG120",
|
||||
"DG150",
|
||||
"DG502",
|
||||
"DG601",
|
||||
"JSA008",
|
||||
"JSA011",
|
||||
"JSE008"
|
||||
],
|
||||
"女士卫衣": [
|
||||
"DG501"
|
||||
],
|
||||
"女士背心": [
|
||||
"JSA009",
|
||||
"VS002",
|
||||
"VS004"
|
||||
],
|
||||
"男士T恤": [
|
||||
"C1717",
|
||||
"DG001",
|
||||
"DG004",
|
||||
"DG013",
|
||||
"DG015",
|
||||
"DG505",
|
||||
"JSA006",
|
||||
"JSS001"
|
||||
],
|
||||
"男士卫衣": [
|
||||
"DF009",
|
||||
"DF010",
|
||||
"JSB001",
|
||||
"JSB002",
|
||||
"JSB003"
|
||||
],
|
||||
"男士背心": [
|
||||
"VS001",
|
||||
"VS003"
|
||||
],
|
||||
"童装T恤": [
|
||||
"5000B",
|
||||
"DG012",
|
||||
"DG014",
|
||||
"DG301",
|
||||
"DG503",
|
||||
"JSA004"
|
||||
],
|
||||
"童装卫衣": [
|
||||
"DG504"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"5000B": "短袖",
|
||||
"C1717": "短袖",
|
||||
"DF009": "长袖",
|
||||
"DF010": "长袖",
|
||||
"DG001": "短袖",
|
||||
"DG004": "短袖",
|
||||
"DG012": "短袖",
|
||||
"DG013": "短袖",
|
||||
"DG014": "短袖",
|
||||
"DG015": "短袖",
|
||||
"DG100": "短袖",
|
||||
"DG101": "短袖",
|
||||
"DG102": "短袖",
|
||||
"DG110": "短袖",
|
||||
"DG120": "短袖",
|
||||
"DG150": "短袖",
|
||||
"DG301": "短袖",
|
||||
"DG501": "长袖",
|
||||
"DG502": "长袖",
|
||||
"DG503": "长袖",
|
||||
"DG504": "长袖",
|
||||
"DG505": "长袖",
|
||||
"DG601": "短袖",
|
||||
"JSA004": "短袖",
|
||||
"JSA006": "短袖",
|
||||
"JSA008": "短袖",
|
||||
"JSA009": "无袖",
|
||||
"JSA011": "短袖",
|
||||
"JSB001": "长袖",
|
||||
"JSB002": "长袖",
|
||||
"JSB003": "长袖",
|
||||
"JSE008": "短袖",
|
||||
"JSS001": "短袖",
|
||||
"VS001": "无袖",
|
||||
"VS002": "无袖",
|
||||
"VS003": "无袖",
|
||||
"VS004": "无袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"5000B": "默认(T恤)",
|
||||
"C1717": "默认(T恤)",
|
||||
"DF009": "品类推断",
|
||||
"DF010": "品类推断",
|
||||
"DG001": "默认(T恤)",
|
||||
"DG004": "默认(T恤)",
|
||||
"DG012": "默认(T恤)",
|
||||
"DG013": "默认(T恤)",
|
||||
"DG014": "默认(T恤)",
|
||||
"DG015": "默认(T恤)",
|
||||
"DG100": "默认(T恤)",
|
||||
"DG101": "默认(T恤)",
|
||||
"DG102": "默认(T恤)",
|
||||
"DG110": "默认(T恤)",
|
||||
"DG120": "默认(T恤)",
|
||||
"DG150": "默认(T恤)",
|
||||
"DG301": "默认(T恤)",
|
||||
"DG501": "品类推断",
|
||||
"DG502": "name",
|
||||
"DG503": "name",
|
||||
"DG504": "品类推断",
|
||||
"DG505": "name",
|
||||
"DG601": "默认(T恤)",
|
||||
"JSA004": "默认(T恤)",
|
||||
"JSA006": "默认(T恤)",
|
||||
"JSA008": "默认(T恤)",
|
||||
"JSA009": "name",
|
||||
"JSA011": "默认(T恤)",
|
||||
"JSB001": "品类推断",
|
||||
"JSB002": "品类推断",
|
||||
"JSB003": "品类推断",
|
||||
"JSE008": "默认(T恤)",
|
||||
"JSS001": "默认(T恤)",
|
||||
"VS001": "name",
|
||||
"VS002": "name",
|
||||
"VS003": "name",
|
||||
"VS004": "name"
|
||||
}
|
||||
},
|
||||
"BR": {
|
||||
"country": "巴西",
|
||||
"categories": {
|
||||
"女士T恤": [
|
||||
"BRTF004",
|
||||
"BRTF007"
|
||||
],
|
||||
"男士T恤": [
|
||||
"BRTM001",
|
||||
"BRTM002"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"BRTF004": "短袖",
|
||||
"BRTF007": "短袖",
|
||||
"BRTM001": "短袖",
|
||||
"BRTM002": "短袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"BRTF004": "默认(T恤)",
|
||||
"BRTF007": "默认(T恤)",
|
||||
"BRTM001": "默认(T恤)",
|
||||
"BRTM002": "默认(T恤)"
|
||||
}
|
||||
},
|
||||
"AU": {
|
||||
"country": "澳大利亚",
|
||||
"categories": {
|
||||
"男士T恤": [
|
||||
"AUTM001",
|
||||
"AUTM002"
|
||||
],
|
||||
"男士背心": [
|
||||
"AUTM003"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"AUTM001": "短袖",
|
||||
"AUTM002": "短袖",
|
||||
"AUTM003": "无袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"AUTM001": "默认(T恤)",
|
||||
"AUTM002": "默认(T恤)",
|
||||
"AUTM003": "name"
|
||||
}
|
||||
},
|
||||
"PL": {
|
||||
"country": "波兰",
|
||||
"categories": {
|
||||
"女士T恤": [
|
||||
"PLTF004",
|
||||
"PLTF026",
|
||||
"PLTF027",
|
||||
"PLTF028"
|
||||
],
|
||||
"女士卫衣": [
|
||||
"PLHF029"
|
||||
],
|
||||
"男士T恤": [
|
||||
"PLTM001",
|
||||
"PLTM006",
|
||||
"PLTM008",
|
||||
"PLTM024",
|
||||
"PLTM031"
|
||||
],
|
||||
"男士卫衣": [
|
||||
"PLHM002",
|
||||
"PLHM003"
|
||||
],
|
||||
"男士夹克": [
|
||||
"PLJM030"
|
||||
],
|
||||
"童装T恤": [
|
||||
"PLHM012",
|
||||
"PLHM013",
|
||||
"PLTK005",
|
||||
"PLTK015",
|
||||
"PLTK016"
|
||||
],
|
||||
"童装卫衣": [
|
||||
"PLHM009",
|
||||
"PLHM010"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"PLHF029": "长袖",
|
||||
"PLHM002": "长袖",
|
||||
"PLHM003": "长袖",
|
||||
"PLHM009": "长袖",
|
||||
"PLHM010": "长袖",
|
||||
"PLHM012": "短袖",
|
||||
"PLHM013": "短袖",
|
||||
"PLJM030": "长袖",
|
||||
"PLTF004": "短袖",
|
||||
"PLTF026": "长袖",
|
||||
"PLTF027": "短袖",
|
||||
"PLTF028": "短袖",
|
||||
"PLTK005": "短袖",
|
||||
"PLTK015": "短袖",
|
||||
"PLTK016": "短袖",
|
||||
"PLTM001": "短袖",
|
||||
"PLTM006": "短袖",
|
||||
"PLTM008": "短袖",
|
||||
"PLTM024": "短袖",
|
||||
"PLTM031": "短袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"PLHF029": "name",
|
||||
"PLHM002": "品类推断",
|
||||
"PLHM003": "品类推断",
|
||||
"PLHM009": "品类推断",
|
||||
"PLHM010": "品类推断",
|
||||
"PLHM012": "默认(T恤)",
|
||||
"PLHM013": "name",
|
||||
"PLJM030": "品类推断",
|
||||
"PLTF004": "默认(T恤)",
|
||||
"PLTF026": "name",
|
||||
"PLTF027": "默认(T恤)",
|
||||
"PLTF028": "默认(T恤)",
|
||||
"PLTK005": "默认(T恤)",
|
||||
"PLTK015": "默认(T恤)",
|
||||
"PLTK016": "name",
|
||||
"PLTM001": "默认(T恤)",
|
||||
"PLTM006": "默认(T恤)",
|
||||
"PLTM008": "name",
|
||||
"PLTM024": "默认(T恤)",
|
||||
"PLTM031": "默认(T恤)"
|
||||
}
|
||||
},
|
||||
"KR": {
|
||||
"country": "韩国",
|
||||
"categories": {
|
||||
"男士T恤": [
|
||||
"KRTM001",
|
||||
"KRTM004"
|
||||
],
|
||||
"男士卫衣": [
|
||||
"KRHM002",
|
||||
"KRHM003"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"KRHM002": "长袖",
|
||||
"KRHM003": "长袖",
|
||||
"KRTM001": "短袖",
|
||||
"KRTM004": "长袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"KRHM002": "品类推断",
|
||||
"KRHM003": "品类推断",
|
||||
"KRTM001": "默认(T恤)",
|
||||
"KRTM004": "name"
|
||||
}
|
||||
},
|
||||
"SA": {
|
||||
"country": "沙特阿拉伯",
|
||||
"categories": {
|
||||
"女士T恤": [
|
||||
"SATU001"
|
||||
],
|
||||
"男士T恤": [
|
||||
"SATU001"
|
||||
],
|
||||
"男士卫衣": [
|
||||
"SAHM003"
|
||||
],
|
||||
"童装T恤": [
|
||||
"SATK004"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"SAHM003": "长袖",
|
||||
"SATK004": "短袖",
|
||||
"SATU001": "短袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"SAHM003": "品类推断",
|
||||
"SATK004": "默认(T恤)",
|
||||
"SATU001": "默认(T恤)"
|
||||
}
|
||||
},
|
||||
"MX": {
|
||||
"country": "墨西哥",
|
||||
"categories": {
|
||||
"女士T恤": [
|
||||
"METP001"
|
||||
],
|
||||
"男士T恤": [
|
||||
"MESXT001",
|
||||
"METB001",
|
||||
"PET001"
|
||||
],
|
||||
"男士卫衣": [
|
||||
"HM01"
|
||||
],
|
||||
"男士背心": [
|
||||
"TBB001"
|
||||
],
|
||||
"童装T恤": [
|
||||
"METN001"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"HM01": "长袖",
|
||||
"MESXT001": "短袖",
|
||||
"METB001": "短袖",
|
||||
"METN001": "短袖",
|
||||
"METP001": "短袖",
|
||||
"PET001": "短袖",
|
||||
"TBB001": "无袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"HM01": "品类推断",
|
||||
"MESXT001": "默认(T恤)",
|
||||
"METB001": "默认(T恤)",
|
||||
"METN001": "默认(T恤)",
|
||||
"METP001": "默认(T恤)",
|
||||
"PET001": "默认(T恤)",
|
||||
"TBB001": "name"
|
||||
}
|
||||
},
|
||||
"IT": {
|
||||
"country": "意大利",
|
||||
"categories": {
|
||||
"女士T恤": [
|
||||
"ITFM005"
|
||||
],
|
||||
"男士T恤": [
|
||||
"ITTM001"
|
||||
],
|
||||
"童装T恤": [
|
||||
"ITTK002"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"ITFM005": "短袖",
|
||||
"ITTK002": "短袖",
|
||||
"ITTM001": "短袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"ITFM005": "name",
|
||||
"ITTK002": "name",
|
||||
"ITTM001": "默认(T恤)"
|
||||
}
|
||||
},
|
||||
"GB": {
|
||||
"country": "英国",
|
||||
"categories": {
|
||||
"女士T恤": [
|
||||
"GBTF004"
|
||||
],
|
||||
"男士T恤": [
|
||||
"GBTM001",
|
||||
"GBTM010",
|
||||
"GBTM013"
|
||||
],
|
||||
"男士T恤 / GBTM011长袖T": [
|
||||
"GBTM011"
|
||||
],
|
||||
"男士卫衣": [
|
||||
"GBHM002",
|
||||
"GBHM003"
|
||||
],
|
||||
"童装T恤": [
|
||||
"GBTK005",
|
||||
"GBTK008",
|
||||
"GBTK012"
|
||||
],
|
||||
"童装卫衣": [
|
||||
"GBHK006",
|
||||
"GBHK007"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"GBHK006": "长袖",
|
||||
"GBHK007": "长袖",
|
||||
"GBHM002": "长袖",
|
||||
"GBHM003": "长袖",
|
||||
"GBTF004": "短袖",
|
||||
"GBTK005": "短袖",
|
||||
"GBTK008": "短袖",
|
||||
"GBTK012": "长袖",
|
||||
"GBTM001": "短袖",
|
||||
"GBTM010": "短袖",
|
||||
"GBTM011": "长袖",
|
||||
"GBTM013": "短袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"GBHK006": "品类推断",
|
||||
"GBHK007": "品类推断",
|
||||
"GBHM002": "品类推断",
|
||||
"GBHM003": "品类推断",
|
||||
"GBTF004": "默认(T恤)",
|
||||
"GBTK005": "默认(T恤)",
|
||||
"GBTK008": "name",
|
||||
"GBTK012": "name",
|
||||
"GBTM001": "默认(T恤)",
|
||||
"GBTM010": "默认(T恤)",
|
||||
"GBTM011": "name",
|
||||
"GBTM013": "默认(T恤)"
|
||||
}
|
||||
},
|
||||
"ES": {
|
||||
"country": "西班牙",
|
||||
"categories": {
|
||||
"男士T恤": [
|
||||
"ESTM002"
|
||||
],
|
||||
"男士卫衣": [
|
||||
"ESHM003",
|
||||
"ESHM004"
|
||||
],
|
||||
"童装T恤": [
|
||||
"ESTK005"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"ESHM003": "长袖",
|
||||
"ESHM004": "长袖",
|
||||
"ESTK005": "短袖",
|
||||
"ESTM002": "短袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"ESHM003": "品类推断",
|
||||
"ESHM004": "品类推断",
|
||||
"ESTK005": "默认(T恤)",
|
||||
"ESTM002": "默认(T恤)"
|
||||
}
|
||||
},
|
||||
"CA": {
|
||||
"country": "加拿大",
|
||||
"categories": {
|
||||
"男士T恤": [
|
||||
"CATM001",
|
||||
"CATM006",
|
||||
"CATM007"
|
||||
],
|
||||
"男士卫衣": [
|
||||
"CAHM002"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"CAHM002": "长袖",
|
||||
"CATM001": "短袖",
|
||||
"CATM006": "短袖",
|
||||
"CATM007": "短袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"CAHM002": "品类推断",
|
||||
"CATM001": "默认(T恤)",
|
||||
"CATM006": "默认(T恤)",
|
||||
"CATM007": "默认(T恤)"
|
||||
}
|
||||
},
|
||||
"JP": {
|
||||
"country": "日本",
|
||||
"categories": {
|
||||
"男士T恤": [
|
||||
"JPTM001",
|
||||
"JPTM004",
|
||||
"JPTM006",
|
||||
"JPTM007"
|
||||
],
|
||||
"男士卫衣": [
|
||||
"JPHM009",
|
||||
"JPHM010",
|
||||
"JPPX012",
|
||||
"JPPX013"
|
||||
],
|
||||
"男士背心": [
|
||||
"JPTM002",
|
||||
"JPTM008"
|
||||
],
|
||||
"童装T恤": [
|
||||
"JPTK015"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"JPHM009": "长袖",
|
||||
"JPHM010": "长袖",
|
||||
"JPPX012": "长袖",
|
||||
"JPPX013": "长袖",
|
||||
"JPTK015": "短袖",
|
||||
"JPTM001": "短袖",
|
||||
"JPTM002": "无袖",
|
||||
"JPTM004": "短袖",
|
||||
"JPTM006": "长袖",
|
||||
"JPTM007": "短袖",
|
||||
"JPTM008": "无袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"JPHM009": "品类推断",
|
||||
"JPHM010": "品类推断",
|
||||
"JPPX012": "品类推断",
|
||||
"JPPX013": "品类推断",
|
||||
"JPTK015": "默认(T恤)",
|
||||
"JPTM001": "默认(T恤)",
|
||||
"JPTM002": "name",
|
||||
"JPTM004": "默认(T恤)",
|
||||
"JPTM006": "name",
|
||||
"JPTM007": "默认(T恤)",
|
||||
"JPTM008": "name"
|
||||
}
|
||||
},
|
||||
"DE": {
|
||||
"country": "德国",
|
||||
"categories": {
|
||||
"男士T恤": [
|
||||
"DETM001",
|
||||
"DETM002"
|
||||
],
|
||||
"男士卫衣": [
|
||||
"DEHM003"
|
||||
]
|
||||
},
|
||||
"sleeve_length": {
|
||||
"DEHM003": "长袖",
|
||||
"DETM001": "短袖",
|
||||
"DETM002": "短袖"
|
||||
},
|
||||
"sleeve_source": {
|
||||
"DEHM003": "品类推断",
|
||||
"DETM001": "默认(T恤)",
|
||||
"DETM002": "默认(T恤)"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
-- 清单『品类含 T恤 且 长袖』的 5 个款号:
|
||||
-- sleeve_length_type='长袖',season='秋/冬'
|
||||
UPDATE spu
|
||||
SET sleeve_length_type = '长袖',
|
||||
season = '秋/冬'
|
||||
WHERE UPPER(TRIM(code)) IN ('DG502', 'DG503', 'JPTM006', 'KRTM004', 'PLTF026');
|
||||
|
||||
-- 校验
|
||||
SELECT code, sleeve_length_type, season FROM spu
|
||||
WHERE UPPER(TRIM(code)) IN ('DG502', 'DG503', 'JPTM006', 'KRTM004', 'PLTF026');
|
||||
@@ -0,0 +1,7 @@
|
||||
-- 背心款号(9 个)sleeve_length_type 统一为『无袖』
|
||||
UPDATE spu SET sleeve_length_type = '无袖'
|
||||
WHERE UPPER(TRIM(code)) IN ('AUTM003', 'JPTM002', 'JPTM008', 'JSA009', 'TBB001', 'VS001', 'VS002', 'VS003', 'VS004');
|
||||
|
||||
-- 校验
|
||||
SELECT code, country, sleeve_length_type FROM spu
|
||||
WHERE UPPER(TRIM(code)) IN ('AUTM003', 'JPTM002', 'JPTM008', 'JSA009', 'TBB001', 'VS001', 'VS002', 'VS003', 'VS004');
|
||||
Reference in New Issue
Block a user