forked from yoone/API
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);
|
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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue