优化feifei商品名映射

This commit is contained in:
yml2213
2026-07-07 15:12:48 +08:00
parent 6af2fe2e23
commit 177f72dd2c
11 changed files with 235 additions and 144 deletions
@@ -3,6 +3,7 @@ import {
createKuaishouFeifeiOrder,
listKuaishouFeifeiProducts,
queryKuaishouFeifeiOrder,
type KuaishouFeifeiProductListResult,
} from '../../platforms/kuaishou-feifei/order-service.js'
import { resolveKuaishouFeifeiProductByName } from '../../platforms/kuaishou-feifei/product-rule-service.js'
import {
@@ -64,6 +65,52 @@ export async function listAdminKuaishouFeifeiProducts(payload: JsonObject = {})
})
}
export async function syncAdminKuaishouFeifeiProductRules(payload: JsonObject = {}) {
const source = getAdminEditableKuaishouFeifeiConfig()
const status = String(payload.status || 'on_sale').trim() || 'on_sale'
const supplyProductName = String(payload.supplyProductName || payload.supply_product_name || '').trim()
const products = await listAllKuaishouFeifeiProducts({
status,
supplyProductName,
})
const productRules = products
.map((product) => {
const productName = String(product.name || '').trim()
const productCode = String(product.productCode || '').trim()
if (!productName || !productCode) {
return null
}
return {
id: normalizeCloudtentaclesMatchName(productName) || productCode,
enabled: product.status !== 'off_sale' && product.supplyStatus !== 'off_sale',
productName,
normalizedProductName: normalizeCloudtentaclesMatchName(productName),
productCode,
skuName: productName,
notes: `feifei 商品目录同步:${product.channel || 'unknown'}`,
}
})
.filter((rule): rule is NonNullable<typeof rule> => Boolean(rule))
const saved = saveKuaishouFeifeiSourceConfig({
...source,
productRules,
})
const effective = getKuaishouFeifeiConfig()
return {
filePath: getKuaishouFeifeiConfigFilePath(),
source: saved,
effective: mapEffectiveKuaishouFeifeiConfig(effective),
sync: {
productCount: products.length,
ruleCount: saved.productRules.length,
status,
supplyProductName,
},
}
}
export async function createAdminKuaishouFeifeiTestOrder(payload: JsonObject = {}) {
const platformOrderNo = String(payload.platformOrderNo || payload.platform_order_no || '').trim()
const productCode = String(payload.productCode || payload.product_code || '').trim()
@@ -139,6 +186,34 @@ function mapEffectiveKuaishouFeifeiConfig(config: ReturnType<typeof getKuaishouF
}
}
async function listAllKuaishouFeifeiProducts(input: {
status: string
supplyProductName: string
}) {
const perPage = 100
const firstPage = await listKuaishouFeifeiProducts({
page: 1,
perPage,
status: input.status,
supplyProductName: input.supplyProductName,
})
const products = [...firstPage.items]
const total = Number(firstPage.total || products.length) || products.length
const pageCount = Math.max(1, Math.ceil(total / perPage))
for (let page = 2; page <= pageCount; page += 1) {
const result: KuaishouFeifeiProductListResult = await listKuaishouFeifeiProducts({
page,
perPage,
status: input.status,
supplyProductName: input.supplyProductName,
})
products.push(...result.items)
}
return products
}
function normalizeOptionalNumber(value: unknown) {
if (value == null || String(value).trim() === '') {
return undefined