优化订单流程与数据库关闭

This commit is contained in:
yml2213
2026-08-30 13:15:47 +08:00
parent 04dc363320
commit dcb0fa4c76
5 changed files with 243 additions and 113 deletions
@@ -1,9 +1,10 @@
import {
createOrder,
findLatestOrderByPlatformOrderId,
updateOrder,
createOrderWithExecutor,
findLatestOrderByPlatformOrderIdWithExecutor,
updateOrderWithExecutor,
} from '../../repositories/order-repo.js'
import { replaceOrderItems } from '../../repositories/order-item-repo.js'
import { replaceOrderItemsWithExecutor } from '../../repositories/order-item-repo.js'
import { withTransaction } from '../../db/client.js'
import { syncDeliveryTasksForOrder } from './delivery-task-service.js'
import { resolveOrderItemForFulfillment } from '../fulfillment/product-resolution-service.js'
import {
@@ -98,11 +99,6 @@ export async function upsertOrderFromSource(
{ sourceLabel = 'source' }: UpsertOrderSourceOptions = {},
): Promise<UpsertOrderResult> {
const now = nowIso()
const existing = await findLatestOrderByPlatformOrderId({
provider: event.provider,
platform: event.platform,
platformOrderId: event.platformOrderId,
})
logIntegration('[order-service]', `开始处理 ${sourceLabel} 订单 upsert`, {
provider: event.provider,
@@ -110,7 +106,6 @@ export async function upsertOrderFromSource(
shopId: event.shopId,
shopName: event.shopName,
platformOrderId: event.platformOrderId,
existingOrderId: existing?.id || null,
})
const resolvedItems = await Promise.all(
@@ -125,56 +120,71 @@ export async function upsertOrderFromSource(
const resolvedFulfillmentItems = resolvedItems as FulfillmentOrderItem[]
const configuredItems = resolvedFulfillmentItems.filter((item) => item.isConfigured)
const basePayload = {
provider: event.provider,
platform: event.platform,
shopId: String(existing?.shop_id || event.shopId || '').trim(),
shopName: String(existing?.shop_name || event.shopName || '').trim(),
platformOrderId: event.platformOrderId,
orderStatus: event.orderStatus,
payStatus: event.payStatus,
buyerId: event.buyerId,
buyerName: event.buyerName,
receiverContact: event.receiverContact,
totalAmount: event.totalAmount,
currency: event.currency,
rawPayloadJson: JSON.stringify(event.rawPayload),
...(event.paidAt !== undefined ? { paidAt: event.paidAt } : {}),
}
const mergedPayload = mergeSourceOrderState(existing, basePayload)
const persisted = await withTransaction(async (client) => {
const executor = client.query.bind(client)
const lockKey = [event.provider, event.platform, event.platformOrderId].join('|')
await executor('SELECT pg_advisory_xact_lock(hashtextextended($1, 0))', [lockKey])
const order = existing
? await updateOrder(existing.id, {
...basePayload,
...mergedPayload,
updatedAt: now,
const existing = await findLatestOrderByPlatformOrderIdWithExecutor(executor, {
provider: event.provider,
platform: event.platform,
platformOrderId: event.platformOrderId,
})
const basePayload = {
provider: event.provider,
platform: event.platform,
shopId: String(existing?.shop_id || event.shopId || '').trim(),
shopName: String(existing?.shop_name || event.shopName || '').trim(),
platformOrderId: event.platformOrderId,
orderStatus: event.orderStatus,
payStatus: event.payStatus,
buyerId: event.buyerId,
buyerName: event.buyerName,
receiverContact: event.receiverContact,
totalAmount: event.totalAmount,
currency: event.currency,
rawPayloadJson: JSON.stringify(event.rawPayload),
...(event.paidAt !== undefined ? { paidAt: event.paidAt } : {}),
}
const mergedPayload = mergeSourceOrderState(existing, basePayload)
const order = existing
? await updateOrderWithExecutor(executor, existing.id, {
...basePayload,
...mergedPayload,
updatedAt: now,
})
: await createOrderWithExecutor(executor, {
...basePayload,
...mergedPayload,
createdAt: now,
updatedAt: now,
})
if (!order) {
throw createHttpError('订单写入失败', {
statusCode: 500,
errorCode: 'order_write_failed',
})
: await createOrder({
...basePayload,
...mergedPayload,
}
const orderItems = await replaceOrderItemsWithExecutor(
executor,
order.id,
resolvedFulfillmentItems.map((item) => ({
skuCode: item.skuCode,
skuName: item.skuName,
quantity: item.quantity,
specJson: JSON.stringify(item.spec || {}),
itemSnapshotJson: JSON.stringify(item.snapshot || item.spec || {}),
createdAt: now,
updatedAt: now,
})
})),
)
if (!order) {
throw createHttpError('订单写入失败', {
statusCode: 500,
errorCode: 'order_write_failed',
})
}
return { order, orderItems }
})
const orderItems = await replaceOrderItems(
order.id,
resolvedFulfillmentItems.map((item) => ({
skuCode: item.skuCode,
skuName: item.skuName,
quantity: item.quantity,
specJson: JSON.stringify(item.spec || {}),
itemSnapshotJson: JSON.stringify(item.snapshot || item.spec || {}),
createdAt: now,
updatedAt: now,
})),
)
const { order, orderItems } = persisted
const configuredOrderItems = orderItems.filter(isOrderItemConfiguredForFulfillment)
const readiness =