refactor(fulfillment): 固化 91 中文名→英文 SKU 权威映射表

91 继续用中文编码;解析优先查内置常量表,配置仅作临时覆盖,Admin 改为展示权威表。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yml2213
2026-09-14 20:33:42 +08:00
co-authored by Cursor
parent 745eeaee35
commit 4a3b4ec14d
7 changed files with 159 additions and 40 deletions
@@ -0,0 +1,62 @@
/**
* 91 中文商品编码 → affiliate_dash 英文 SKU 权威映射表。
*
* 91 店 productNo 使用中文名(方便运营);建单时在此转换为平台英文 sku。
* 与 affiliate_dash/docs/商品目录.md 保持同步;新增商品改此常量即可。
*/
export const AFFILIATE_DASH_SKU_MAPPING: Readonly<Record<string, string>> = Object.freeze({
'套装-花面小丑': 'suit_jester_face',
'套装-沙丘之歌': 'suit_dune_song',
'龙宫之主大礼包': 'pack_dragon_palace',
'幸运币90个': 'lucky_coin_x90',
'幸运币30个': 'lucky_coin_x30',
'幸运币2个': 'lucky_coin_x2',
'荣耀勋章90个': 'honor_medal_x90',
'荣耀勋章30个': 'honor_medal_x30',
'荣耀勋章2个': 'honor_medal_x2',
'套装-绵云熊熊': 'suit_cloud_bear',
'星际漫游枪械礼包': 'pack_star_roam_weapon',
'星际漫游服装礼包': 'pack_star_roam_outfit',
'套装-狂沙舞者': 'suit_sand_dancer',
'熔岩游骑兵礼包': 'pack_lava_ranger',
'套装-胖达团团': 'suit_panda_tuan',
'套装-胖达圆圆': 'suit_panda_round',
'国宝胖达头盔': 'helmet_panda_treasure',
'套装-西部谜踪': 'suit_western_mystery',
'仓鼠灰灰头盔': 'helmet_hamster_gray',
'仓鼠灰灰背包': 'bag_hamster_gray',
'糯粉咩咩头盔': 'helmet_pink_sheep',
'糯粉咩咩背包': 'bag_pink_sheep',
'套装-萌熊伴侣': 'suit_cute_bear',
'套装-仓鼠灰灰': 'suit_hamster_gray',
'破片手榴弹-糯粉咩咩': 'frag_pink_sheep',
'烟雾弹-糯粉咩咩': 'smoke_pink_sheep',
'西部牛仔大礼包': 'pack_western_cowboy',
'套装-浪漫天命': 'suit_romantic_destiny',
'套装-恋恋初桃': 'suit_first_peach',
'套装-糯粉咩咩': 'suit_pink_sheep',
'套装-双彩绵绵': 'suit_dual_fluffy',
'萌熊伴侣背包': 'bag_cute_bear',
'M416-仓鼠灰灰': 'm416_hamster_gray',
'黑色高级特训官上衣': 'top_black_elite_trainer',
'套装-暗影哥特': 'suit_shadow_gothic',
'套装-Alan Walker': 'suit_alan_walker',
})
/** 合并权威表与运行时增量覆盖(覆盖同名键)。 */
export function mergeAffiliateDashSkuMapping(
overlay?: Record<string, string> | null,
): Record<string, string> {
const merged: Record<string, string> = { ...AFFILIATE_DASH_SKU_MAPPING }
if (!overlay) {
return merged
}
for (const [key, value] of Object.entries(overlay)) {
const productNo = String(key || '').trim()
const sku = String(value || '').trim()
if (productNo && sku) {
merged[productNo] = sku
}
}
return merged
}