From 91e0bc8c9a68d7f24a1863097aeea1a03048cb82 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Fri, 6 Nov 2026 17:27:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(orders):=20=E8=AE=A2=E5=8D=95=E9=A1=B9?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=BB=9F=E4=B8=80=E5=88=86=E6=91=8A=E6=94=B6?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/repositories/order-item-repo.test.ts | 17 +++++++++++++++++ .../src/repositories/order-item-repo.ts | 19 ++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/apps/backend/src/repositories/order-item-repo.test.ts b/apps/backend/src/repositories/order-item-repo.test.ts index 34f31e42..560d5414 100644 --- a/apps/backend/src/repositories/order-item-repo.test.ts +++ b/apps/backend/src/repositories/order-item-repo.test.ts @@ -1,5 +1,6 @@ import test from 'node:test' import assert from 'node:assert/strict' +import { readFile } from 'node:fs/promises' import { preserveAssignedOrderItemState, @@ -202,3 +203,19 @@ test('已分配订单重推写库时不会用平台新 SKU 覆盖冻结值', asy assert.equal(updateParams[0]?.[0], 'lucky_coin_x2') assert.equal(updateParams[0]?.[1], '幸运币2个') }) + +test('所有替换订单项入口都在同一事务内分摊订单收入', async () => { + const source = await readFile(new URL('./order-item-repo.ts', import.meta.url), 'utf8') + const replaceSource = source.slice( + source.indexOf('export async function replaceOrderItems('), + source.indexOf('export async function applyOrderItemRevenueAllocationWithExecutor('), + ) + + assert.ok(replaceSource.includes('withTransaction')) + assert.ok(replaceSource.includes('applyOrderItemRevenueAllocationWithExecutor')) + assert.ok(replaceSource.includes('SELECT total_amount FROM orders')) + assert.ok( + replaceSource.indexOf('replaceOrderItemsWithExecutor') < + replaceSource.indexOf('applyOrderItemRevenueAllocationWithExecutor'), + ) +}) diff --git a/apps/backend/src/repositories/order-item-repo.ts b/apps/backend/src/repositories/order-item-repo.ts index 3d218507..326e6a9c 100644 --- a/apps/backend/src/repositories/order-item-repo.ts +++ b/apps/backend/src/repositories/order-item-repo.ts @@ -42,9 +42,22 @@ export async function replaceOrderItems( orderId: number | string, items: OrderItemReplaceInput[], ): Promise { - return withTransaction((client: PoolClient) => - replaceOrderItemsWithExecutor(client.query.bind(client), orderId, items), - ) + return withTransaction(async (client: PoolClient) => { + const executor = client.query.bind(client) + await replaceOrderItemsWithExecutor(executor, orderId, items) + const order = await client.query<{ total_amount: string | number }>( + `SELECT total_amount FROM orders WHERE id = $1`, + [orderId], + ) + if (order.rows[0]) { + await applyOrderItemRevenueAllocationWithExecutor( + executor, + orderId, + Number(order.rows[0].total_amount) || 0, + ) + } + return listOrderItemsByOrderIdWithExecutor(executor, orderId) + }) } export async function applyOrderItemRevenueAllocationWithExecutor(