feat: 添加对订阅的显示与支持 #29

Merged
longbot merged 12 commits from dev_szk into main 2025-11-21 09:31:19 +00:00
1 changed files with 16 additions and 51 deletions
Showing only changes of commit 12dc5ac876 - Show all commits

View File

@ -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,