优化feifei商品名映射
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user