refactor(catalog): 废弃 LEWAN_ 镜像,统一英文 SKU 与积分价,商品图按 SKU 缓存
对外目录只保留英文主 sku;迁移硬删镜像并校准 1元=100积分;发货页/凭证优先使用 local {sku}.webp。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user