forked from yoone/API
1
0
Fork 0

feat(订单服务): 添加订单关联数据查询并简化相关订单查询逻辑

在订单详情中增加关联数据查询,包括订阅和相关订单,用于前端展示
简化getRelatedByOrder方法的实现,移除不必要的查询条件
This commit is contained in:
tikkhun 2025-11-21 11:28:42 +08:00
parent 8778b8138d
commit 12dc5ac876
1 changed files with 16 additions and 51 deletions

View File

@ -1295,79 +1295,44 @@ export class OrderService {
console.log('create order sale origin error: ', error.message); 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 { return {
...order, ...order,
siteName: site.siteName, siteName: site?.siteName,
email: site.email, email: site?.email,
items, items,
sales, sales,
refundItems, refundItems,
notes, notes,
shipment, shipment,
related: relatedList,
}; };
} }
async getRelatedByOrder(orderId: number) { async getRelatedByOrder(orderId: number) {
const order = await this.orderModel.findOne({ where: { id: orderId } }); const order = await this.orderModel.findOne({ where: { id: orderId } });
if (!order) throw new Error('订单不存在'); if (!order) throw new Error('订单不存在');
const items = await this.orderItemModel.find({ where: { orderId } });
const siteId = order.siteId; const siteId = order.siteId;
const productIds = items.map(i => i.externalProductId).filter(Boolean);
const variationIds = items.map(i => i.externalVariationId).filter(Boolean);
const subSql = ` const subSql = `
SELECT * FROM subscription s SELECT * FROM subscription s
WHERE s.siteId = ? AND s.parent_id = ? WHERE s.siteId = ? AND s.parent_id = ?
`; `;
const subscriptions = await this.orderModel.query(subSql, [siteId, order.externalOrderId]); 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<number, any>(); const allOrdersMap = new Map<number, any>();
relatedByItems.forEach(o => allOrdersMap.set(o.id, o)); subscriptions.forEach(o => allOrdersMap.set(o.id, o));
relatedBySubscription.forEach(o => allOrdersMap.set(o.id, o));
return { return {
order, order,