feat(订单服务): 添加订单关联数据查询并简化相关订单查询逻辑
在订单详情中增加关联数据查询,包括订阅和相关订单,用于前端展示 简化getRelatedByOrder方法的实现,移除不必要的查询条件
This commit is contained in:
parent
8778b8138d
commit
12dc5ac876
|
|
@ -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<number, any>();
|
||||
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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue