删除旧履约配置逻辑
This commit is contained in:
@@ -27,28 +27,6 @@ type FulfillmentProfileRequirementRow = {
|
||||
updated_at: string
|
||||
}
|
||||
|
||||
type SkuFulfillmentBindingRow = {
|
||||
id: number
|
||||
sku_code: string
|
||||
provider: string
|
||||
platform: string
|
||||
shop_id: string
|
||||
profile_id: number
|
||||
enabled: boolean
|
||||
priority: number
|
||||
config_json: string | Record<string, unknown>
|
||||
created_at: string
|
||||
updated_at: string
|
||||
profile_key?: string
|
||||
name?: string
|
||||
profile_name?: string
|
||||
executor_key?: string
|
||||
requires_claim?: boolean
|
||||
auto_dispatch?: boolean
|
||||
inventory_strategy?: string
|
||||
profile_config_json?: string | Record<string, unknown>
|
||||
}
|
||||
|
||||
type FulfillmentProfileUpsertInput = {
|
||||
profileKey: string
|
||||
name: string
|
||||
@@ -69,26 +47,6 @@ export type FulfillmentProfileRequirementInput = {
|
||||
configJson?: string | Record<string, unknown>
|
||||
}
|
||||
|
||||
type SkuFulfillmentBindingUpsertInput = {
|
||||
skuCode: string
|
||||
provider?: string
|
||||
platform?: string
|
||||
shopId?: string
|
||||
profileId: number | string
|
||||
enabled?: boolean
|
||||
priority?: number | string
|
||||
configJson?: string | Record<string, unknown>
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
|
||||
type FulfillmentBindingResolveInput = {
|
||||
skuCode: string
|
||||
provider?: string
|
||||
platform?: string
|
||||
shopId?: string
|
||||
}
|
||||
|
||||
export async function getFulfillmentProfileByKey(profileKey: string): Promise<FulfillmentProfileRow | null> {
|
||||
const result = await query<FulfillmentProfileRow>(
|
||||
'SELECT * FROM fulfillment_profiles WHERE profile_key = $1 LIMIT 1',
|
||||
@@ -195,113 +153,3 @@ export async function listFulfillmentProfileRequirements(
|
||||
|
||||
return result.rows
|
||||
}
|
||||
|
||||
export async function upsertSkuFulfillmentBinding(
|
||||
input: SkuFulfillmentBindingUpsertInput,
|
||||
): Promise<SkuFulfillmentBindingRow | null> {
|
||||
const existing = await query<SkuFulfillmentBindingRow>(
|
||||
`
|
||||
SELECT *
|
||||
FROM sku_fulfillment_bindings
|
||||
WHERE sku_code = $1 AND provider = $2 AND platform = $3 AND shop_id = $4
|
||||
LIMIT 1
|
||||
`,
|
||||
[input.skuCode, input.provider || '', input.platform || '', input.shopId || ''],
|
||||
)
|
||||
|
||||
if (!existing.rows[0]) {
|
||||
const inserted = await query<SkuFulfillmentBindingRow>(
|
||||
`
|
||||
INSERT INTO sku_fulfillment_bindings (
|
||||
sku_code,
|
||||
provider,
|
||||
platform,
|
||||
shop_id,
|
||||
profile_id,
|
||||
enabled,
|
||||
priority,
|
||||
config_json,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8::jsonb, $9, $10)
|
||||
RETURNING *
|
||||
`,
|
||||
[
|
||||
input.skuCode,
|
||||
input.provider || '',
|
||||
input.platform || '',
|
||||
input.shopId || '',
|
||||
Number(input.profileId),
|
||||
input.enabled !== false,
|
||||
Number(input.priority || 100),
|
||||
input.configJson || '{}',
|
||||
input.createdAt,
|
||||
input.updatedAt,
|
||||
],
|
||||
)
|
||||
|
||||
return inserted.rows[0] || null
|
||||
}
|
||||
|
||||
const updated = await query<SkuFulfillmentBindingRow>(
|
||||
`
|
||||
UPDATE sku_fulfillment_bindings
|
||||
SET
|
||||
profile_id = $1,
|
||||
enabled = $2,
|
||||
priority = $3,
|
||||
config_json = $4::jsonb,
|
||||
updated_at = $5
|
||||
WHERE id = $6
|
||||
RETURNING *
|
||||
`,
|
||||
[
|
||||
Number(input.profileId),
|
||||
input.enabled !== false,
|
||||
Number(input.priority || 100),
|
||||
input.configJson || '{}',
|
||||
input.updatedAt,
|
||||
Number(existing.rows[0].id),
|
||||
],
|
||||
)
|
||||
|
||||
return updated.rows[0] || null
|
||||
}
|
||||
|
||||
export async function resolveFulfillmentBinding({
|
||||
skuCode,
|
||||
provider = '',
|
||||
platform = '',
|
||||
shopId = '',
|
||||
}: FulfillmentBindingResolveInput): Promise<SkuFulfillmentBindingRow | null> {
|
||||
const result = await query<SkuFulfillmentBindingRow>(
|
||||
`
|
||||
SELECT
|
||||
sfb.*,
|
||||
fp.profile_key,
|
||||
fp.name AS profile_name,
|
||||
fp.executor_key,
|
||||
fp.requires_claim,
|
||||
fp.auto_dispatch,
|
||||
fp.inventory_strategy,
|
||||
fp.config_json AS profile_config_json
|
||||
FROM sku_fulfillment_bindings sfb
|
||||
JOIN fulfillment_profiles fp ON fp.id = sfb.profile_id
|
||||
WHERE sfb.enabled = TRUE
|
||||
AND sfb.sku_code = $1
|
||||
AND (sfb.provider = '' OR sfb.provider = $2)
|
||||
AND (sfb.platform = '' OR sfb.platform = $3)
|
||||
AND (sfb.shop_id = '' OR sfb.shop_id = $4)
|
||||
ORDER BY
|
||||
CASE WHEN sfb.shop_id = '' THEN 1 ELSE 0 END,
|
||||
CASE WHEN sfb.platform = '' THEN 1 ELSE 0 END,
|
||||
CASE WHEN sfb.provider = '' THEN 1 ELSE 0 END,
|
||||
sfb.priority ASC,
|
||||
sfb.id ASC
|
||||
LIMIT 1
|
||||
`,
|
||||
[skuCode, provider, platform, shopId],
|
||||
)
|
||||
|
||||
return result.rows[0] || null
|
||||
}
|
||||
|
||||
@@ -17,13 +17,6 @@ type OrderPlatformLookupInput = {
|
||||
platformOrderId: string
|
||||
}
|
||||
|
||||
type OrderPlatformCandidateLookupInput = {
|
||||
provider?: string
|
||||
platform?: string
|
||||
shopIds?: unknown[]
|
||||
platformOrderId?: string
|
||||
}
|
||||
|
||||
export async function findOrderByPlatformOrderId({
|
||||
provider = '91kaquan',
|
||||
platform,
|
||||
@@ -43,34 +36,6 @@ export async function findOrderByPlatformOrderId({
|
||||
return result.rows[0] || null
|
||||
}
|
||||
|
||||
export async function findOrderByPlatformOrderIdCandidates({
|
||||
provider = '91kaquan',
|
||||
platform,
|
||||
shopIds = [],
|
||||
platformOrderId,
|
||||
}: OrderPlatformCandidateLookupInput): Promise<OrderRow | null> {
|
||||
const normalizedShopIds = [...new Set((Array.isArray(shopIds) ? shopIds : [])
|
||||
.map((item) => String(item || '').trim())
|
||||
.filter(Boolean))]
|
||||
|
||||
if (!platform || !platformOrderId || normalizedShopIds.length === 0) {
|
||||
return null
|
||||
}
|
||||
|
||||
const result = await query<OrderRow>(
|
||||
`
|
||||
SELECT *
|
||||
FROM orders
|
||||
WHERE provider = $1 AND platform = $2 AND shop_id = ANY($3::text[]) AND platform_order_id = $4
|
||||
ORDER BY id DESC
|
||||
LIMIT 1
|
||||
`,
|
||||
[provider, platform, normalizedShopIds, platformOrderId],
|
||||
)
|
||||
|
||||
return result.rows[0] || null
|
||||
}
|
||||
|
||||
export async function createOrder(input: OrderCreateInput): Promise<OrderRow | null> {
|
||||
const result = await query<OrderRow>(
|
||||
`
|
||||
|
||||
@@ -1,169 +0,0 @@
|
||||
import { query } from '../db/client.js'
|
||||
|
||||
type ProductMatchRuleRow = {
|
||||
id: number
|
||||
provider: string
|
||||
platform: string
|
||||
shop_id: string
|
||||
external_item_id: string
|
||||
external_sku_code: string
|
||||
external_sku_name: string
|
||||
external_sku_name_normalized: string
|
||||
resolved_sku_code: string
|
||||
enabled: boolean
|
||||
priority: number
|
||||
config_json: string | Record<string, unknown>
|
||||
created_at: string
|
||||
updated_at: string
|
||||
matched_by?: string
|
||||
match_score?: number
|
||||
}
|
||||
|
||||
type ProductMatchRuleUpsertInput = {
|
||||
provider?: string
|
||||
platform?: string
|
||||
shopId?: string
|
||||
externalItemId?: string
|
||||
externalSkuCode?: string
|
||||
externalSkuName?: string
|
||||
externalSkuNameNormalized?: string
|
||||
resolvedSkuCode: string
|
||||
enabled?: boolean
|
||||
priority?: number | string
|
||||
configJson?: string | Record<string, unknown>
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
|
||||
type ProductMatchRuleResolveInput = {
|
||||
provider?: string
|
||||
platform?: string
|
||||
shopId?: string
|
||||
externalItemId?: string
|
||||
externalSkuCode?: string
|
||||
externalSkuNameNormalized?: string
|
||||
}
|
||||
|
||||
export async function upsertProductMatchRule(
|
||||
input: ProductMatchRuleUpsertInput,
|
||||
): Promise<ProductMatchRuleRow | null> {
|
||||
const result = await query<ProductMatchRuleRow>(
|
||||
`
|
||||
INSERT INTO product_match_rules (
|
||||
provider,
|
||||
platform,
|
||||
shop_id,
|
||||
external_item_id,
|
||||
external_sku_code,
|
||||
external_sku_name,
|
||||
external_sku_name_normalized,
|
||||
resolved_sku_code,
|
||||
enabled,
|
||||
priority,
|
||||
config_json,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11::jsonb, $12, $13
|
||||
)
|
||||
ON CONFLICT (
|
||||
provider,
|
||||
platform,
|
||||
shop_id,
|
||||
external_item_id,
|
||||
external_sku_code,
|
||||
external_sku_name_normalized,
|
||||
resolved_sku_code
|
||||
) DO UPDATE
|
||||
SET
|
||||
external_sku_name = EXCLUDED.external_sku_name,
|
||||
enabled = EXCLUDED.enabled,
|
||||
priority = EXCLUDED.priority,
|
||||
config_json = EXCLUDED.config_json,
|
||||
updated_at = EXCLUDED.updated_at
|
||||
RETURNING *
|
||||
`,
|
||||
[
|
||||
input.provider || '',
|
||||
input.platform || '',
|
||||
input.shopId || '',
|
||||
input.externalItemId || '',
|
||||
input.externalSkuCode || '',
|
||||
input.externalSkuName || '',
|
||||
input.externalSkuNameNormalized || '',
|
||||
input.resolvedSkuCode,
|
||||
input.enabled !== false,
|
||||
Number(input.priority || 100),
|
||||
input.configJson || '{}',
|
||||
input.createdAt,
|
||||
input.updatedAt,
|
||||
],
|
||||
)
|
||||
|
||||
return result.rows[0] || null
|
||||
}
|
||||
|
||||
export async function resolveProductMatchRule({
|
||||
provider = '',
|
||||
platform = '',
|
||||
shopId = '',
|
||||
externalItemId = '',
|
||||
externalSkuCode = '',
|
||||
externalSkuNameNormalized = '',
|
||||
}: ProductMatchRuleResolveInput): Promise<ProductMatchRuleRow | null> {
|
||||
const result = await query<ProductMatchRuleRow>(
|
||||
`
|
||||
SELECT
|
||||
pmr.*,
|
||||
CASE
|
||||
WHEN $4 != '' AND pmr.external_sku_code = $4 THEN 'external_sku_code'
|
||||
WHEN $5 != '' AND pmr.external_item_id = $5 THEN 'external_item_id'
|
||||
WHEN $6 != '' AND pmr.external_sku_name_normalized = $6 THEN 'external_sku_name_exact'
|
||||
WHEN $6 != '' AND pmr.external_sku_name_normalized != '' AND (
|
||||
position(pmr.external_sku_name_normalized in $6) > 0
|
||||
OR position($6 in pmr.external_sku_name_normalized) > 0
|
||||
) THEN 'external_sku_name_contains'
|
||||
ELSE ''
|
||||
END AS matched_by,
|
||||
CASE
|
||||
WHEN $4 != '' AND pmr.external_sku_code = $4 THEN 400
|
||||
WHEN $5 != '' AND pmr.external_item_id = $5 THEN 300
|
||||
WHEN $6 != '' AND pmr.external_sku_name_normalized = $6 THEN 200
|
||||
WHEN $6 != '' AND pmr.external_sku_name_normalized != '' AND (
|
||||
position(pmr.external_sku_name_normalized in $6) > 0
|
||||
OR position($6 in pmr.external_sku_name_normalized) > 0
|
||||
) THEN 100
|
||||
ELSE 0
|
||||
END AS match_score
|
||||
FROM product_match_rules pmr
|
||||
WHERE pmr.enabled = TRUE
|
||||
AND (pmr.provider = '' OR pmr.provider = $1)
|
||||
AND (pmr.platform = '' OR pmr.platform = $2)
|
||||
AND (pmr.shop_id = '' OR pmr.shop_id = $3)
|
||||
AND (
|
||||
($4 != '' AND pmr.external_sku_code = $4)
|
||||
OR ($5 != '' AND pmr.external_item_id = $5)
|
||||
OR (
|
||||
$6 != ''
|
||||
AND pmr.external_sku_name_normalized != ''
|
||||
AND (
|
||||
pmr.external_sku_name_normalized = $6
|
||||
OR position(pmr.external_sku_name_normalized in $6) > 0
|
||||
OR position($6 in pmr.external_sku_name_normalized) > 0
|
||||
)
|
||||
)
|
||||
)
|
||||
ORDER BY
|
||||
match_score DESC,
|
||||
CASE WHEN pmr.shop_id = '' THEN 1 ELSE 0 END,
|
||||
CASE WHEN pmr.platform = '' THEN 1 ELSE 0 END,
|
||||
CASE WHEN pmr.provider = '' THEN 1 ELSE 0 END,
|
||||
pmr.priority ASC,
|
||||
pmr.id ASC
|
||||
LIMIT 1
|
||||
`,
|
||||
[provider, platform, shopId, externalSkuCode, externalItemId, externalSkuNameNormalized],
|
||||
)
|
||||
|
||||
return result.rows[0] || null
|
||||
}
|
||||
Reference in New Issue
Block a user