feat: 对订单状态进行自动变更 #26
|
|
@ -31,16 +31,18 @@ export enum StockRecordOperationType {
|
||||||
IN = 'in',
|
IN = 'in',
|
||||||
OUT = 'out',
|
OUT = 'out',
|
||||||
}
|
}
|
||||||
|
// Order status. Options: pending, processing, on-hold, completed, cancelled, refunded, failed and trash. Default is pending.
|
||||||
|
// 原始订单状态
|
||||||
export enum OrderStatus {
|
export enum OrderStatus {
|
||||||
PENDING = 'pending',
|
PENDING = 'pending', // default // 待付款
|
||||||
PROCESSING = 'processing',
|
PROCESSING = 'processing', // 正在处理
|
||||||
COMPLETED = 'completed',
|
ON_HOLD = 'on-hold', // 保留
|
||||||
ON_HOLD = 'on-hold',
|
COMPLETED = 'completed', // 已完成
|
||||||
CANCEL = 'cancelled',
|
CANCEL = 'cancelled', // 已取消
|
||||||
REFUNDED = 'refunded',
|
REFUNDED = 'refunded', // 已退款
|
||||||
FAILED = 'failed',
|
FAILED = 'failed', // 失败订单
|
||||||
DRAFT = 'draft',
|
DRAFT = 'draft', // 草稿
|
||||||
|
// TRASH = 'trash',
|
||||||
REFUND_REQUESTED = 'refund_requested', // 已申请退款
|
REFUND_REQUESTED = 'refund_requested', // 已申请退款
|
||||||
REFUND_APPROVED = 'refund_approved', // 退款申请已通过
|
REFUND_APPROVED = 'refund_approved', // 退款申请已通过
|
||||||
REFUND_CANCELLED = 'refund_cancelled', // 已取消退款
|
REFUND_CANCELLED = 'refund_cancelled', // 已取消退款
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,37 @@ export class OrderService {
|
||||||
const order = await this.wPService.getOrder(siteId, orderId);
|
const order = await this.wPService.getOrder(siteId, orderId);
|
||||||
await this.syncSingleOrder(siteId, order, true);
|
await this.syncSingleOrder(siteId, order, true);
|
||||||
}
|
}
|
||||||
|
// 订单状态切换表
|
||||||
|
orderAutoNextStatusMap = {
|
||||||
|
[OrderStatus.REFUND_APPROVED]: OrderStatus.ON_HOLD, // 退款申请已通过转为 on-hold
|
||||||
|
[OrderStatus.REFUND_CANCELLED]: OrderStatus.REFUNDED // 已取消退款转为 refunded
|
||||||
|
}
|
||||||
|
// 由于 wordpress 订单状态和 我们的订单状态 不一致,需要做转换
|
||||||
|
async autoUpdateOrderStatus(siteId: string, order: any) {
|
||||||
|
console.log('更新订单状态', order)
|
||||||
|
// 其他状态保持不变
|
||||||
|
const originStatus = order.status;
|
||||||
|
// 如果有值就赋值
|
||||||
|
if (this.orderAutoNextStatusMap[originStatus]) {
|
||||||
|
order.status = this.orderAutoNextStatusMap[originStatus];
|
||||||
|
}
|
||||||
|
const shouldSync = originStatus !== order.status;
|
||||||
|
if (!shouldSync) return;
|
||||||
|
try {
|
||||||
|
const site = this.sites.find(v => v.id === siteId);
|
||||||
|
if (!site) {
|
||||||
|
throw new Error(`更新订单信息,但失败,原因为 ${siteId} 的站点信息不存在`)
|
||||||
|
}
|
||||||
|
// 同步更新回 wordpress 的 order 状态
|
||||||
|
await this.wPService.updateOrder(site, order.id, { status: order.status });
|
||||||
|
} catch (error) {
|
||||||
|
console.error('更新订单状态失败,原因为:', error)
|
||||||
|
// 回滚到原始状态
|
||||||
|
order.status = originStatus;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// wordpress 发来,
|
||||||
async syncSingleOrder(siteId: string, order: any, forceUpdate = false) {
|
async syncSingleOrder(siteId: string, order: any, forceUpdate = false) {
|
||||||
let {
|
let {
|
||||||
line_items,
|
line_items,
|
||||||
|
|
@ -121,9 +151,12 @@ export class OrderService {
|
||||||
refunds,
|
refunds,
|
||||||
...orderData
|
...orderData
|
||||||
} = order;
|
} = order;
|
||||||
|
console.log('同步进单个订单', order)
|
||||||
const existingOrder = await this.orderModel.findOne({
|
const existingOrder = await this.orderModel.findOne({
|
||||||
where: { externalOrderId: order.id, siteId: siteId },
|
where: { externalOrderId: order.id, siteId: siteId },
|
||||||
});
|
});
|
||||||
|
// 更新状态
|
||||||
|
await this.autoUpdateOrderStatus(siteId, order);
|
||||||
const orderId = (await this.saveOrder(siteId, orderData)).id;
|
const orderId = (await this.saveOrder(siteId, orderData)).id;
|
||||||
const externalOrderId = order.id;
|
const externalOrderId = order.id;
|
||||||
if (
|
if (
|
||||||
|
|
@ -213,7 +246,7 @@ export class OrderService {
|
||||||
el => el.key === '_wc_order_attribution_utm_source'
|
el => el.key === '_wc_order_attribution_utm_source'
|
||||||
)?.value || '';
|
)?.value || '';
|
||||||
order.customer_email = order?.billing?.email || order?.shipping?.email;
|
order.customer_email = order?.billing?.email || order?.shipping?.email;
|
||||||
// order.billing_phone = order?.billing?.phone || order?.shipping?.phone;
|
// order.billing_phone = order?.billing?.phone || order?.shipping?.phone;
|
||||||
const entity = plainToClass(Order, order);
|
const entity = plainToClass(Order, order);
|
||||||
const existingOrder = await this.orderModel.findOne({
|
const existingOrder = await this.orderModel.findOne({
|
||||||
where: { externalOrderId: order.externalOrderId, siteId: siteId },
|
where: { externalOrderId: order.externalOrderId, siteId: siteId },
|
||||||
|
|
@ -230,7 +263,7 @@ export class OrderService {
|
||||||
const customer = await this.customerModel.findOne({
|
const customer = await this.customerModel.findOne({
|
||||||
where: { email: order.customer_email },
|
where: { email: order.customer_email },
|
||||||
});
|
});
|
||||||
if(!customer) {
|
if (!customer) {
|
||||||
await this.customerModel.save({
|
await this.customerModel.save({
|
||||||
email: order.customer_email,
|
email: order.customer_email,
|
||||||
rate: 0,
|
rate: 0,
|
||||||
|
|
@ -333,7 +366,7 @@ export class OrderService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async saveOrderItemsG(orderItem: OrderItem) {
|
async saveOrderItemsG(orderItem: OrderItem) {
|
||||||
const existingOrderItem = await this.orderItemModel.findOne({
|
const existingOrderItem = await this.orderItemModel.findOne({
|
||||||
where: {
|
where: {
|
||||||
externalOrderId: orderItem.externalOrderId,
|
externalOrderId: orderItem.externalOrderId,
|
||||||
|
|
@ -673,7 +706,7 @@ export class OrderService {
|
||||||
sqlQuery += ` AND o.payment_method like "%${payment_method}%" `;
|
sqlQuery += ` AND o.payment_method like "%${payment_method}%" `;
|
||||||
totalQuery += ` AND o.payment_method like "%${payment_method}%" `;
|
totalQuery += ` AND o.payment_method like "%${payment_method}%" `;
|
||||||
}
|
}
|
||||||
const user = await this.userModel.findOneBy({id: userId});
|
const user = await this.userModel.findOneBy({ id: userId });
|
||||||
if (user?.permissions?.includes('order-10-days')) {
|
if (user?.permissions?.includes('order-10-days')) {
|
||||||
sqlQuery += ` AND o.date_created >= ?`;
|
sqlQuery += ` AND o.date_created >= ?`;
|
||||||
totalQuery += ` AND o.date_created >= ?`;
|
totalQuery += ` AND o.date_created >= ?`;
|
||||||
|
|
@ -992,7 +1025,7 @@ export class OrderService {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async getOrderItems({
|
async getOrderItems({
|
||||||
siteId,
|
siteId,
|
||||||
startDate,
|
startDate,
|
||||||
|
|
@ -1157,19 +1190,19 @@ export class OrderService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// update order_item_origin if not exist
|
// update order_item_origin if not exist
|
||||||
const order_item_origin_count = await this.orderItemOriginalModel.countBy({ orderId: id });
|
const order_item_origin_count = await this.orderItemOriginalModel.countBy({ orderId: id });
|
||||||
if (order_item_origin_count === 0 && items.length!=0) {
|
if (order_item_origin_count === 0 && items.length != 0) {
|
||||||
items.forEach(async sale => {
|
items.forEach(async sale => {
|
||||||
const { id: saleId, ...saleData } = sale;
|
const { id: saleId, ...saleData } = sale;
|
||||||
await this.orderItemOriginalModel.save(saleData);
|
await this.orderItemOriginalModel.save(saleData);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log('create order sale origin error: ', error.message);
|
console.log('create order sale origin error: ', error.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...order,
|
...order,
|
||||||
siteName: site.siteName,
|
siteName: site.siteName,
|
||||||
|
|
@ -1368,10 +1401,10 @@ export class OrderService {
|
||||||
const productRepo = manager.getRepository(Product);
|
const productRepo = manager.getRepository(Product);
|
||||||
|
|
||||||
const order = await orderRepo.findOneBy({ id: orderId });
|
const order = await orderRepo.findOneBy({ id: orderId });
|
||||||
let product:Product;
|
let product: Product;
|
||||||
await orderSaleRepo.delete({ orderId });
|
await orderSaleRepo.delete({ orderId });
|
||||||
for (const sale of sales) {
|
for (const sale of sales) {
|
||||||
product = await productRepo.findOneBy({ sku: sale.sku });
|
product = await productRepo.findOneBy({ sku: sale.sku });
|
||||||
await orderSaleRepo.save({
|
await orderSaleRepo.save({
|
||||||
orderId,
|
orderId,
|
||||||
siteId: order.siteId,
|
siteId: order.siteId,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue