84 lines
2.3 KiB
TypeScript
84 lines
2.3 KiB
TypeScript
/**
|
|
* 从平台 SKU 非中文、但商品名含中文的订单项回填中文内部 SKU 映射。
|
|
*
|
|
* 数字码、英文码一视同仁;找不到中文名的平台码会列出来,等运营补映射。
|
|
*
|
|
* 用法:npx tsx scripts/backfill-internal-sku-mappings.ts [--apply]
|
|
*/
|
|
import { closeDb, query } from '../src/db/client.js'
|
|
import { upsertInternalSkuMapping } from '../src/services/fulfillment/internal-sku-mapping-service.js'
|
|
|
|
async function main() {
|
|
const apply = process.argv.includes('--apply')
|
|
const rows = await query<{
|
|
provider: string
|
|
shop_id: string
|
|
sku_code: string
|
|
sku_name: string
|
|
total: number
|
|
}>(
|
|
`
|
|
SELECT o.provider, o.shop_id, oi.sku_code, MIN(oi.sku_name) AS sku_name, count(*)::int AS total
|
|
FROM order_items oi
|
|
JOIN orders o ON o.id = oi.order_id
|
|
WHERE COALESCE(canonicalize_internal_sku(oi.manual_sku_key), '') !~ '[㐀-䶿一-鿿豈-𠀀-𰀀-𲎯]'
|
|
AND btrim(COALESCE(oi.sku_name, '')) ~ '[㐀-䶿一-鿿豈-𠀀-𰀀-𲎯]'
|
|
GROUP BY 1, 2, 3
|
|
ORDER BY 5 DESC
|
|
`,
|
|
)
|
|
const unresolved = await query<{
|
|
provider: string
|
|
shop_id: string
|
|
sku_code: string
|
|
total: number
|
|
}>(
|
|
`
|
|
SELECT o.provider, o.shop_id, oi.sku_code, count(*)::int AS total
|
|
FROM order_items oi
|
|
JOIN orders o ON o.id = oi.order_id
|
|
WHERE COALESCE(canonicalize_internal_sku(oi.manual_sku_key), '') !~ '[㐀-䶿一-鿿豈-𠀀-𰀀-𲎯]'
|
|
AND btrim(COALESCE(oi.sku_name, '')) !~ '[㐀-䶿一-鿿豈-𠀀-𰀀-𲎯]'
|
|
GROUP BY 1, 2, 3
|
|
ORDER BY 4 DESC
|
|
`,
|
|
)
|
|
|
|
let written = 0
|
|
for (const row of rows.rows) {
|
|
if (apply) {
|
|
await upsertInternalSkuMapping({
|
|
provider: row.provider,
|
|
shopId: row.shop_id,
|
|
matchType: 'sku_code',
|
|
matchValue: row.sku_code,
|
|
internalSku: row.sku_name,
|
|
priority: 100,
|
|
source: 'backfill',
|
|
note: `从 ${row.total} 条订单项回填`,
|
|
})
|
|
}
|
|
if (apply) written += 1
|
|
}
|
|
|
|
console.log(
|
|
JSON.stringify(
|
|
{
|
|
apply,
|
|
canBackfill: rows.rows.length,
|
|
backfilled: written,
|
|
unresolved: unresolved.rows,
|
|
},
|
|
null,
|
|
2,
|
|
),
|
|
)
|
|
}
|
|
|
|
main()
|
|
.catch((error) => {
|
|
console.error(error)
|
|
process.exitCode = 1
|
|
})
|
|
.finally(() => closeDb())
|