refactor(catalog): 废弃 LEWAN_ 镜像,统一英文 SKU 与积分价,商品图按 SKU 缓存

对外目录只保留英文主 sku;迁移硬删镜像并校准 1元=100积分;发货页/凭证优先使用 local {sku}.webp。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yml2213
2026-09-14 20:00:26 +08:00
co-authored by Cursor
parent bf9614569e
commit df1a170d44
57 changed files with 1052 additions and 171 deletions
@@ -0,0 +1,166 @@
-- ============================================================================
-- 商品目录收敛(幂等,可在开发库反复执行前先清 schema_migrations.011)
-- 1) 补齐乐玩独有品英文主 sku
-- 2) 硬删除全部 LEWAN_* / lewan_* 镜像(含已软删行)
-- 3) 统一积分价为 1元=100积分(按权威目录绝对值校准)
-- ============================================================================
-- 1) 乐玩独有 → 英文主商品
WITH lewan_only(new_sku, display_name, category, legacy_sku, default_price) AS (
VALUES
('pack_dragon_palace', '龙宫之主大礼包', '礼包', 'LEWAN_46524A53', 80000),
('suit_dune_song', '套装-沙丘之歌', '套装', 'LEWAN_F3B83B85', 10200),
('suit_jester_face', '套装-花面小丑', '套装', 'LEWAN_B3891176', 20000)
)
INSERT INTO products (code, name, category, status)
SELECT v.new_sku, v.display_name, v.category, 'active'
FROM lewan_only v
ON CONFLICT (code) DO NOTHING;
WITH lewan_only(new_sku, display_name, category, legacy_sku, default_price) AS (
VALUES
('pack_dragon_palace', '龙宫之主大礼包', '礼包', 'LEWAN_46524A53', 80000),
('suit_dune_song', '套装-沙丘之歌', '套装', 'LEWAN_F3B83B85', 10200),
('suit_jester_face', '套装-花面小丑', '套装', 'LEWAN_B3891176', 20000)
),
self_merchant AS (
SELECT id FROM merchants WHERE code = 'self-operated' LIMIT 1
),
legacy AS (
SELECT
v.new_sku,
v.display_name,
v.default_price,
mp.price_amount,
mp.cost_amount,
mp.fulfillment_config,
p.id AS product_id
FROM lewan_only v
JOIN products p ON p.code = v.new_sku
LEFT JOIN merchant_products mp
ON mp.sku = v.legacy_sku
AND mp.merchant_id = (SELECT id FROM self_merchant)
)
INSERT INTO merchant_products (
merchant_id, product_id, sku, display_name,
price_amount, cost_amount, currency, stock, status, fulfillment_config
)
SELECT
sm.id,
l.product_id,
l.new_sku,
l.display_name,
COALESCE(NULLIF(l.price_amount, 0), l.default_price),
COALESCE(NULLIF(l.cost_amount, 0), l.default_price),
'POINT',
-1,
'active',
COALESCE(
NULLIF(l.fulfillment_config, ''),
CASE l.new_sku
WHEN 'pack_dragon_palace' THEN
'{"routing_mode":"lewan","priority":["lewan","dlc"],"dlc_good_id":"","lewan_product_id":"46524a53-068d-4bee-97ff-d5e7873818e0","lewan_name":"龙宫之主大礼包","delivery_type":"LINK_BINDING"}'
WHEN 'suit_dune_song' THEN
'{"routing_mode":"lewan","priority":["lewan","dlc"],"dlc_good_id":"","lewan_product_id":"f3b83b85-c664-4440-94ac-a4b0cd7cf0f3","lewan_name":"套装-沙丘之歌","delivery_type":"LINK_BINDING"}'
WHEN 'suit_jester_face' THEN
'{"routing_mode":"lewan","priority":["lewan","dlc"],"dlc_good_id":"","lewan_product_id":"b3891176-5ffa-40cb-8c58-7e46eac3f381","lewan_name":"套装-花面小丑","delivery_type":"LINK_BINDING"}'
END
)
FROM legacy l
CROSS JOIN self_merchant sm
ON CONFLICT (merchant_id, sku) DO UPDATE
SET
display_name = EXCLUDED.display_name,
price_amount = EXCLUDED.price_amount,
cost_amount = EXCLUDED.cost_amount,
fulfillment_config = COALESCE(NULLIF(merchant_products.fulfillment_config, ''), EXCLUDED.fulfillment_config),
status = 'active',
deleted_at = NULL;
-- 已持有对应 LEWAN_* 的其它商户同步英文 sku
WITH mapping(new_sku, legacy_sku) AS (
VALUES
('pack_dragon_palace', 'LEWAN_46524A53'),
('suit_dune_song', 'LEWAN_F3B83B85'),
('suit_jester_face', 'LEWAN_B3891176')
),
template AS (
SELECT mp.*
FROM merchant_products mp
JOIN merchants m ON m.id = mp.merchant_id AND m.code = 'self-operated'
JOIN mapping map ON map.new_sku = mp.sku
WHERE mp.deleted_at IS NULL
)
INSERT INTO merchant_products (
merchant_id, product_id, sku, display_name,
price_amount, cost_amount, currency, stock, status, fulfillment_config
)
SELECT
legacy.merchant_id,
t.product_id,
t.sku,
t.display_name,
COALESCE(NULLIF(legacy.price_amount, 0), t.price_amount),
COALESCE(NULLIF(legacy.cost_amount, 0), t.cost_amount),
'POINT',
-1,
'active',
COALESCE(NULLIF(t.fulfillment_config, ''), legacy.fulfillment_config)
FROM merchant_products legacy
JOIN mapping map ON map.legacy_sku = legacy.sku
JOIN template t ON t.sku = map.new_sku
JOIN merchants m ON m.id = legacy.merchant_id AND m.code <> 'self-operated'
ON CONFLICT (merchant_id, sku) DO NOTHING;
-- 2) 硬删除全部 LEWAN_* 镜像(含软删)
DELETE FROM merchant_products WHERE sku ILIKE 'lewan_%';
DELETE FROM products WHERE code ILIKE 'lewan_%';
-- 3) 权威价格校准:1元=100积分(docs/商品目录.md 2026-09-14)
WITH prices(sku, amount) AS (
VALUES
('suit_alan_walker', 3600),
('suit_shadow_gothic', 8880),
('top_black_elite_trainer', 3600),
('m416_hamster_gray', 16800),
('bag_cute_bear', 28800),
('suit_dual_fluffy', 11240),
('suit_pink_sheep', 18800),
('suit_first_peach', 9880),
('suit_romantic_destiny', 3600),
('pack_western_cowboy', 32000),
('smoke_pink_sheep', 4880),
('frag_pink_sheep', 4880),
('suit_hamster_gray', 12800),
('suit_cute_bear', 16800),
('bag_pink_sheep', 16800),
('helmet_pink_sheep', 16800),
('bag_hamster_gray', 16800),
('helmet_hamster_gray', 16800),
('suit_western_mystery', 11500),
('helmet_panda_treasure', 23400),
('suit_panda_round', 23400),
('suit_panda_tuan', 23400),
('pack_lava_ranger', 9600),
('suit_sand_dancer', 8400),
('pack_star_roam_outfit', 83600),
('pack_star_roam_weapon', 51600),
('suit_cloud_bear', 13480),
('honor_medal_x2', 200),
('honor_medal_x30', 3000),
('honor_medal_x90', 9000),
('lucky_coin_x2', 200),
('lucky_coin_x30', 3000),
('lucky_coin_x90', 9000),
('pack_dragon_palace', 80000),
('suit_dune_song', 10200),
('suit_jester_face', 20000)
)
UPDATE merchant_products mp
SET
price_amount = p.amount,
cost_amount = p.amount,
updated_at = NOW()
FROM prices p
WHERE mp.sku = p.sku
AND mp.deleted_at IS NULL;