From 86fd31ac124dfb6d139b3d04d6fd7fb99f751a61 Mon Sep 17 00:00:00 2001 From: zhuotianyuan Date: Tue, 6 Jan 2026 18:43:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(webhook):=20=E6=B7=BB=E5=8A=A0=E5=AF=B9sho?= =?UTF-8?q?ppy=E5=B9=B3=E5=8F=B0webhook=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在site.entity.ts中添加webhookUrl字段 - 在auth.middleware.ts中添加/shoppy路由到白名单 - 在webhook.controller.ts中实现shoppy平台webhook处理逻辑 fix(webhook): 更新webhook控制器中的密钥值 refactor(entity): 将可选字段明确标记为可选类型 feat(adapter): 公开映射方法以支持统一接口调用 将各适配器中的私有映射方法改为公开,并在接口中定义统一方法签名 修改webhook控制器以使用适配器映射方法处理订单数据 feat: 添加订单支付日期字段并支持国家筛选 - 在ShopyyOrder接口中添加date_paid字段 - 在OrderStatisticsParams中添加country数组字段用于国家筛选 - 修改统计服务以支持按国家筛选订单数据 - 更新数据库配置和同步设置 - 优化订单服务中的类型定义和查询条件 refactor(webhook): 移除未使用的shoppy webhook处理逻辑 fix(订单服务): 修复订单内容括号处理并添加同步日志 添加订单同步过程的调试日志 修复订单内容中括号内容的处理逻辑 修正控制器方法名拼写错误 --- src/adapter/shopyy.adapter.ts | 1 + src/dto/shopyy.dto.ts | 1 + src/service/order.service.ts | 33 +++++++++++++++++++++++++-------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/adapter/shopyy.adapter.ts b/src/adapter/shopyy.adapter.ts index 9a3894d..1e1af3b 100644 --- a/src/adapter/shopyy.adapter.ts +++ b/src/adapter/shopyy.adapter.ts @@ -393,6 +393,7 @@ export class ShopyyAdapter implements ISiteAdapter { tracking_number: f.tracking_number || '', shipping_provider: f.tracking_company || '', shipping_method: f.tracking_company || '', + date_created: typeof f.created_at === 'number' ? new Date(f.created_at * 1000).toISOString() : f.created_at || '', diff --git a/src/dto/shopyy.dto.ts b/src/dto/shopyy.dto.ts index bd708ab..671711d 100644 --- a/src/dto/shopyy.dto.ts +++ b/src/dto/shopyy.dto.ts @@ -1211,6 +1211,7 @@ export interface ShopyyOrder { // 时间戳信息 // ======================================== // 订单创建时间 + date_paid?: number | string; created_at?: number | string; // 订单添加时间 date_added?: string; diff --git a/src/service/order.service.ts b/src/service/order.service.ts index 0cc42ed..adc6b0a 100644 --- a/src/service/order.service.ts +++ b/src/service/order.service.ts @@ -142,6 +142,7 @@ export class OrderService { errors: [] }; console.log('开始进入循环同步订单', result.length, '个订单') + console.log('开始进入循环同步订单', result.length, '个订单') // 遍历每个订单进行同步 for (const order of result) { try { @@ -329,16 +330,33 @@ export class OrderService { this.logger.debug('订单状态为 AUTO_DRAFT,跳过处理', siteId, order.id) return; } - // 这里其实不用过滤不可编辑的行为,而是应在 save 中做判断 - // if(!order.is_editable && !forceUpdate){ - // this.logger.debug('订单不可编辑,跳过处理', siteId, order.id) - // return; - // } - // 自动转换远程订单的状态(如果需要) + // 检查数据库中是否已存在该订单 + const existingOrder = await this.orderModel.findOne({ + where: { externalOrderId: String(order.id), siteId: siteId }, + }); + // 自动更新订单状态(如果需要) await this.autoUpdateOrderStatus(siteId, order); + + if(existingOrder){ + // 矫正数据库中的订单数据 + const updateData: any = { status: order.status }; + if (this.canUpdateErpStatus(existingOrder.orderStatus)) { + updateData.orderStatus = this.mapOrderStatus(order.status as any); + } + // 更新订单主数据 + await this.orderModel.update({ externalOrderId: String(order.id), siteId: siteId }, updateData); + // 更新 fulfillments 数据 + await this.saveOrderFulfillments({ + siteId, + orderId: existingOrder.id, + externalOrderId:order.id, + fulfillments: fulfillments, + }); + } + const externalOrderId = String(order.id); // 这里的 saveOrder 已经包括了创建订单和更新订单 let orderRecord: Order = await this.saveOrder(siteId, orderData); - // 如果订单从未完成变为完成状态,则更新库存 + // 如果订单从未完成变为完成状态,则更新库存 if ( orderRecord && orderRecord.orderStatus !== ErpOrderStatus.COMPLETED && @@ -347,7 +365,6 @@ export class OrderService { await this.updateStock(orderRecord); // 不再直接返回,继续执行后续的更新操作 } - const externalOrderId = String(order.id); const orderId = orderRecord.id; // 保存订单项 await this.saveOrderItems({