优化订单流程与数据库关闭
This commit is contained in:
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user