fix(cost-center): 将自动发货价格基线转为内建常量并修复参数类型

- 提取并内建 38 条自动发货采购成本基线常量,消除生产镜像缺失 scripts 目录的 ENOENT 问题
- 在 jsonb_build_object 中增加 $5::text 类型显式强转,避免 Postgres 参数类型推断错误
- 增加同生效日期的版本就地更新逻辑,保障基线可重复无损导入
- 验证方式:npm run typecheck、npm test、生产镜像容器内真实触发导入接口返回 200
This commit is contained in:
yml2213
2026-10-25 16:03:16 +08:00
parent b7ad69831a
commit e61d003342
2 changed files with 65 additions and 11 deletions
@@ -0,0 +1,47 @@
export interface AffiliateDashPriceBaselineItem {
sku: string
name: string
category: string
costAmountFen: number
}
export const AFFILIATE_DASH_PRICES_BASELINE: AffiliateDashPriceBaselineItem[] = [
{ sku: 'rock_blue_sportswear', name: '蓝色运动服上衣', category: '服饰', costAmountFen: 2100 },
{ sku: 'rock_black_tshirt', name: '黑色ROCK长袖T恤', category: '服饰', costAmountFen: 2100 },
{ sku: 'suit_jester_face', name: '套装-花面小丑', category: '套装', costAmountFen: 20000 },
{ sku: 'suit_dune_song', name: '套装-沙丘之歌', category: '套装', costAmountFen: 10200 },
{ sku: 'pack_dragon_palace', name: '龙宫之主大礼包', category: '礼包', costAmountFen: 80000 },
{ sku: 'lucky_coin_x90', name: '幸运币90个', category: '道具', costAmountFen: 9000 },
{ sku: 'lucky_coin_x30', name: '幸运币30个', category: '道具', costAmountFen: 3000 },
{ sku: 'lucky_coin_x2', name: '幸运币2个', category: '道具', costAmountFen: 200 },
{ sku: 'honor_medal_x90', name: '荣耀勋章90个', category: '道具', costAmountFen: 9000 },
{ sku: 'honor_medal_x30', name: '荣耀勋章30个', category: '道具', costAmountFen: 3000 },
{ sku: 'honor_medal_x2', name: '荣耀勋章2个', category: '道具', costAmountFen: 200 },
{ sku: 'suit_cloud_bear', name: '套装-绵云熊熊', category: '套装', costAmountFen: 13480 },
{ sku: 'pack_star_roam_weapon', name: '星际漫游枪械礼包', category: '礼包', costAmountFen: 51600 },
{ sku: 'pack_star_roam_outfit', name: '星际漫游服装礼包', category: '礼包', costAmountFen: 83600 },
{ sku: 'suit_sand_dancer', name: '套装-狂沙舞者', category: '套装', costAmountFen: 8400 },
{ sku: 'pack_lava_ranger', name: '熔岩游骑兵礼包', category: '礼包', costAmountFen: 9600 },
{ sku: 'suit_panda_tuan', name: '套装-胖达团团', category: '套装', costAmountFen: 23400 },
{ sku: 'suit_panda_round', name: '套装-胖达圆圆', category: '套装', costAmountFen: 23400 },
{ sku: 'helmet_panda_treasure', name: '国宝胖达头盔', category: '头盔', costAmountFen: 23400 },
{ sku: 'suit_western_mystery', name: '套装-西部谜踪', category: '套装', costAmountFen: 11500 },
{ sku: 'helmet_hamster_gray', name: '仓鼠灰灰头盔', category: '头盔', costAmountFen: 16800 },
{ sku: 'bag_hamster_gray', name: '仓鼠灰灰背包', category: '背包', costAmountFen: 16800 },
{ sku: 'helmet_pink_sheep', name: '糯粉咩咩头盔', category: '头盔', costAmountFen: 16800 },
{ sku: 'bag_pink_sheep', name: '糯粉咩咩背包', category: '背包', costAmountFen: 16800 },
{ sku: 'suit_cute_bear', name: '套装-萌熊伴侣', category: '套装', costAmountFen: 16800 },
{ sku: 'suit_hamster_gray', name: '套装-仓鼠灰灰', category: '套装', costAmountFen: 12800 },
{ sku: 'frag_pink_sheep', name: '破片手榴弹-糯粉咩咩', category: '投掷物', costAmountFen: 4880 },
{ sku: 'smoke_pink_sheep', name: '烟雾弹-糯粉咩咩', category: '投掷物', costAmountFen: 4880 },
{ sku: 'pack_western_cowboy', name: '西部牛仔大礼包', category: '礼包', costAmountFen: 32000 },
{ sku: 'suit_romantic_destiny', name: '套装-浪漫天命', category: '套装', costAmountFen: 3600 },
{ sku: 'suit_first_peach', name: '套装-恋恋初桃', category: '套装', costAmountFen: 9880 },
{ sku: 'suit_pink_sheep', name: '套装-糯粉咩咩', category: '套装', costAmountFen: 18800 },
{ sku: 'suit_dual_fluffy', name: '套装-双彩绵绵', category: '套装', costAmountFen: 11240 },
{ sku: 'bag_cute_bear', name: '萌熊伴侣背包', category: '背包', costAmountFen: 28800 },
{ sku: 'm416_hamster_gray', name: 'M416-仓鼠灰灰', category: '枪械', costAmountFen: 16800 },
{ sku: 'top_black_elite_trainer', name: '黑色高级特训官上衣', category: '上衣', costAmountFen: 3600 },
{ sku: 'suit_shadow_gothic', name: '套装-暗影哥特', category: '套装', costAmountFen: 8880 },
{ sku: 'suit_alan_walker', name: '套装-Alan Walker', category: '套装', costAmountFen: 3600 },
]
@@ -1,5 +1,3 @@
import fs from 'node:fs'
import { query } from '../../db/client.js'
import type { AdminSession } from '../admin/admin-auth-service.js'
import type { JsonObject } from '../../types/json.js'
@@ -8,6 +6,7 @@ import { shiftDate } from '../../utils/finance-date-range.js'
import { nowIso } from '../../utils/time.js'
import { rebuildSalesDailyFacts } from '../finance/sales-facts-service.js'
import { syncEstimatedOrderItemCostSnapshots } from './cost-snapshot-sync-service.js'
import { AFFILIATE_DASH_PRICES_BASELINE } from './affiliate-dash-prices-baseline.js'
export async function syncAdminAffiliateDashProducts() {
const now = nowIso()
@@ -348,14 +347,7 @@ export async function setAdminAffiliateProductPrice(
* 批量从上游基线导入 38 条自动发货采购成本。
*/
export async function importAdminAffiliateDashPricesBaseline(session: AdminSession) {
const filePath = new URL('../../../scripts/data/affiliate-dash-prices.json', import.meta.url)
const rawData = fs.readFileSync(filePath, 'utf8')
const rows = JSON.parse(rawData) as Array<{
sku: string
name: string
category: string
costAmountFen: number
}>
const rows = AFFILIATE_DASH_PRICES_BASELINE
const costItemResult = await query<{ id: number }>(
"SELECT id FROM cost_items WHERE code = 'sys_affiliate_purchase' OR cost_model = 'affiliate_purchase' ORDER BY (code = 'sys_affiliate_purchase') DESC LIMIT 1",
@@ -381,7 +373,7 @@ export async function importAdminAffiliateDashPricesBaseline(session: AdminSessi
attributes_json, created_at, updated_at
) VALUES (
$1, $2, $3, $4, 'active',
jsonb_build_object('source', 'affiliate_dash_price_import', 'skuCode', $5),
jsonb_build_object('source', 'affiliate_dash_price_import', 'skuCode', $5::text),
$6, $6
)
ON CONFLICT (canonical_sku) DO UPDATE
@@ -417,6 +409,21 @@ export async function importAdminAffiliateDashPricesBaseline(session: AdminSessi
continue
}
if (current && Date.parse(effectiveFrom) <= Date.parse(current.effective_from)) {
await query(
`UPDATE cost_versions
SET amount_fen = $1,
change_reason = '从上游价格基线导入',
created_by_admin_user_id = $2,
approved_by_admin_user_id = $2,
updated_at = $3
WHERE id = $4`,
[row.costAmountFen, session.userId, now, current.id],
)
updatedVersionCount += 1
continue
}
if (current) {
await query(
"UPDATE cost_versions SET status = 'retired', effective_to = $1, updated_at = $2 WHERE id = $3",