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,