From 12dc5ac876315d5e614c817a3303bc4980bb9649 Mon Sep 17 00:00:00 2001 From: tikkhun Date: Fri, 21 Nov 2025 11:28:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=AE=A2=E5=8D=95=E6=9C=8D=E5=8A=A1):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=A2=E5=8D=95=E5=85=B3=E8=81=94=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9F=A5=E8=AF=A2=E5=B9=B6=E7=AE=80=E5=8C=96=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E8=AE=A2=E5=8D=95=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在订单详情中增加关联数据查询,包括订阅和相关订单,用于前端展示 简化getRelatedByOrder方法的实现,移除不必要的查询条件 --- src/service/order.service.ts | 67 +++++++++--------------------------- 1 file changed, 16 insertions(+), 51 deletions(-) diff --git a/src/service/order.service.ts b/src/service/order.service.ts index e5dd3f3..ba23cc3 100644 --- a/src/service/order.service.ts +++ b/src/service/order.service.ts @@ -1295,79 +1295,44 @@ export class OrderService { console.log('create order sale origin error: ', error.message); } + // 关联数据:订阅与相关订单(用于前端关联展示) + let relatedList: any[] = []; + try { + const related = await this.getRelatedByOrder(id); + relatedList = [ + ...(Array.isArray(related?.subscriptions) ? related.subscriptions : []), + ...(Array.isArray(related?.orders) ? related.orders : []), + ]; + } catch (error) { + // 关联查询失败不影响详情返回 + } + return { ...order, - siteName: site.siteName, - email: site.email, + siteName: site?.siteName, + email: site?.email, items, sales, refundItems, notes, shipment, + related: relatedList, }; } async getRelatedByOrder(orderId: number) { const order = await this.orderModel.findOne({ where: { id: orderId } }); if (!order) throw new Error('订单不存在'); - const items = await this.orderItemModel.find({ where: { orderId } }); const siteId = order.siteId; - const productIds = items.map(i => i.externalProductId).filter(Boolean); - const variationIds = items.map(i => i.externalVariationId).filter(Boolean); - const subSql = ` SELECT * FROM subscription s WHERE s.siteId = ? AND s.parent_id = ? `; const subscriptions = await this.orderModel.query(subSql, [siteId, order.externalOrderId]); - let conds: string[] = []; - let params: any[] = [siteId, orderId]; - if (productIds.length > 0) { - conds.push(`oi.externalProductId IN (${productIds.map(() => '?').join(',')})`); - params = [...productIds, ...params]; - } - if (variationIds.length > 0) { - conds.push(`oi.externalVariationId IN (${variationIds.map(() => '?').join(',')})`); - params = [...variationIds, ...params]; - } - const whereCond = conds.length ? `AND (${conds.join(' OR ')})` : ''; - const relatedItemOrdersSql = ` - SELECT DISTINCT o.* - FROM order_item oi - INNER JOIN \`order\` o ON o.id = oi.orderId - WHERE oi.siteId = ? - ${whereCond} - AND o.id <> ? - ORDER BY o.date_created DESC - LIMIT 100 - `; - const relatedByItems = await this.orderItemModel.query(relatedItemOrdersSql, params); - - const relatedBySubscriptionSql = ` - SELECT DISTINCT o.* - FROM \`order\` o - WHERE o.siteId = ? - AND o.customer_email = ? - AND o.id <> ? - AND EXISTS ( - SELECT 1 FROM order_item oi - WHERE oi.orderId = o.id - AND ( - JSON_CONTAINS(JSON_EXTRACT(oi.meta_data, '$[*].key'), '"is_subscription"') - OR JSON_CONTAINS(JSON_EXTRACT(oi.meta_data, '$[*].key'), '"_wcs_bought_as_subscription"') - OR JSON_CONTAINS(JSON_EXTRACT(oi.meta_data, '$[*].key'), '"_wcsatt_scheme"') - OR JSON_CONTAINS(JSON_EXTRACT(oi.meta_data, '$[*].key'), '"_subscription"') - ) - ) - ORDER BY o.date_created DESC - LIMIT 100 - `; - const relatedBySubscription = await this.orderModel.query(relatedBySubscriptionSql, [siteId, order.customer_email, orderId]); const allOrdersMap = new Map(); - relatedByItems.forEach(o => allOrdersMap.set(o.id, o)); - relatedBySubscription.forEach(o => allOrdersMap.set(o.id, o)); + subscriptions.forEach(o => allOrdersMap.set(o.id, o)); return { order,