From acecd3bef4737a4d441c04c28893a43991e4c6ae Mon Sep 17 00:00:00 2001 From: zhuotianyuan Date: Thu, 22 Jan 2026 14:37:46 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(logistics):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=89=A9=E6=B5=81=E6=9C=8D=E5=8A=A1=E4=B8=AD=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=92=8C=E5=94=AF=E4=B8=80ID=E7=9A=84?= =?UTF-8?q?=E8=B5=8B=E5=80=BC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正uniuni和其他平台下unique_id和state的赋值问题,确保不同平台使用正确的值 同时将partnerOrderNumber格式修改为siteId-externalOrderId组合 --- src/service/logistics.service.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/service/logistics.service.ts b/src/service/logistics.service.ts index 2ca180a..19c0ed9 100644 --- a/src/service/logistics.service.ts +++ b/src/service/logistics.service.ts @@ -398,11 +398,17 @@ export class LogisticsService { const shipmentRepo = manager.getRepository(Shipment); const tracking_provider = data.shipmentPlatform; // todo: id未确定,后写进常数 - let co:any; + let co:any; + let unique_id:any; + let state:any; if (data.shipmentPlatform === 'uniuni') { co = resShipmentOrder.data.tno; + unique_id = resShipmentOrder.data.uni_order_sn; + state = resShipmentOrder.data.uni_status_code; }else{ co = resShipmentOrder.data?.shipOrderId; + unique_id = resShipmentOrder.data?.shipOrderId; + state = ErpOrderStatus.COMPLETED; } // 同步物流信息到woocommerce const site = await this.siteService.get(Number(order.siteId), true); @@ -415,10 +421,10 @@ export class LogisticsService { const shipment = await shipmentRepo.save({ tracking_provider: tracking_provider, tracking_id: res.data.tracking_id, - unique_id: resShipmentOrder.data.uni_order_sn, + unique_id: unique_id, stockPointId: String(data.stockPointId), // todo - state: resShipmentOrder.data.uni_status_code, - return_tracking_number: resShipmentOrder.data.tno, + state: state, + return_tracking_number: co, fee: data.details.shipmentFee, order: order }); @@ -729,7 +735,7 @@ export class LogisticsService { // 根据TMS系统对接说明文档格式化参数 const reqBody: any = { shipCompany: 'UPSYYZ7000NEW', - partnerOrderNumber: order.externalOrderId , + partnerOrderNumber: order.siteId+'-'+order.externalOrderId , warehouseId: '25072621030107400060', shipper: { name: data.details.origin.contact_name, // 姓名 -- 2.40.1 From c592310fa97ccbaedc6795277936bce6586853c7 Mon Sep 17 00:00:00 2001 From: zhuotianyuan Date: Thu, 22 Jan 2026 14:49:22 +0800 Subject: [PATCH 2/3] =?UTF-8?q?style:=20=E4=BF=AE=E5=A4=8D=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BC=A9=E8=BF=9B=E5=92=8C=E6=A0=BC=E5=BC=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 统一调整代码缩进格式,删除多余空格和空行,保持代码风格一致 --- src/job/sync_tms.job.ts | 24 ++++++++--------- src/service/freightwaves.service.ts | 40 ++++++++++++++--------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/job/sync_tms.job.ts b/src/job/sync_tms.job.ts index ece6af6..a45896e 100644 --- a/src/job/sync_tms.job.ts +++ b/src/job/sync_tms.job.ts @@ -15,20 +15,20 @@ export class SyncTmsJob implements IJob { logger: ILogger; @Inject() - logisticsService: LogisticsService; - - @InjectEntityModel(Shipment) - shipmentModel: Repository + logisticsService: LogisticsService; + + @InjectEntityModel(Shipment) + shipmentModel: Repository async onTick() { - const shipments:Shipment[] = await this.shipmentModel.findBy({ tracking_provider: 'freightwaves',finished: false }); - const results = await Promise.all( - shipments.map(async shipment => { - return await this.logisticsService.updateFreightwavesShipmentState(shipment); - }) - ) - this.logger.info(`更新运单状态完毕 ${JSON.stringify(results)}`); - return results + const shipments: Shipment[] = await this.shipmentModel.findBy({ tracking_provider: 'freightwaves', finished: false }); + const results = await Promise.all( + shipments.map(async shipment => { + return await this.logisticsService.updateFreightwavesShipmentState(shipment); + }) + ) + this.logger.info(`更新运单状态完毕 ${JSON.stringify(results)}`); + return results } onComplete(result: any) { diff --git a/src/service/freightwaves.service.ts b/src/service/freightwaves.service.ts index 6719629..4f5bc4b 100644 --- a/src/service/freightwaves.service.ts +++ b/src/service/freightwaves.service.ts @@ -140,20 +140,20 @@ interface QueryOrderResponseData { } // 修改订单响应数据接口 -interface ModifyOrderResponseData extends CreateOrderResponseData {} +interface ModifyOrderResponseData extends CreateOrderResponseData { } // 订单退款响应数据接口 -interface RefundOrderResponseData {} +interface RefundOrderResponseData { } @Provide() export class FreightwavesService { @Inject() logger; - // 默认配置 + // 默认配置 private config: FreightwavesConfig = { appSecret: 'gELCHguGmdTLo!zfihfM91hae8G@9Sz23Mh6pHrt', - apiBaseUrl: 'http://tms.freightwaves.ca:8901/', - partner: '25072621035200000060' + apiBaseUrl: 'http://tms.freightwaves.ca:8901/', + partner: '25072621035200000060' }; // 初始化配置 @@ -180,19 +180,19 @@ export class FreightwavesService { }; // 记录请求前的详细信息 - console.log(`Sending request to: ${this.config.apiBaseUrl}${url}`,JSON.stringify({ + console.log(`Sending request to: ${this.config.apiBaseUrl}${url}`, JSON.stringify({ headers, data })) - console.log('Request data:', `${this.config.apiBaseUrl}${url}`, data,headers); + console.log('Request data:', `${this.config.apiBaseUrl}${url}`, data, headers); // 发送请求 - 临时禁用SSL证书验证以解决UNABLE_TO_VERIFY_LEAF_SIGNATURE错误 const response = await axios.post>( `${this.config.apiBaseUrl}${url}`, data, - { + { headers, - httpsAgent: new (require('https').Agent)({ - rejectUnauthorized: false + httpsAgent: new (require('https').Agent)({ + rejectUnauthorized: false }) } ); @@ -400,12 +400,12 @@ export class FreightwavesService { // 调用创建订单方法 this.log('开始测试创建订单...'); this.log('测试参数:', testParams); - + // 注意:在实际环境中取消注释以下行来执行真实请求 const result = await this.createOrder(testParams); - this.log('创建订单成功:', result); - - + this.log('创建订单成功:', result); + + // 返回模拟结果 return { partnerOrderNumber: testParams.partnerOrderNumber, @@ -485,14 +485,14 @@ export class FreightwavesService { // 调用费用试算方法 this.log('开始测试费用试算...'); this.log('测试参数:', testParams); - + // 注意:在实际环境中取消注释以下行来执行真实请求 const result = await this.rateTry(testParams); this.log('费用试算成功:', result); - + this.log('测试完成:费用试算方法调用成功(模拟)'); this.log('提示:在实际环境中,取消注释代码中的rateTry调用行来执行真实请求'); - + // 返回模拟结果 return { shipCompany: 'DHL', @@ -529,13 +529,13 @@ export class FreightwavesService { // 调用查询订单方法 this.log('开始测试查询订单...'); this.log('测试参数:', testParams); - + // 注意:在实际环境中取消注释以下行来执行真实请求 const result = await this.queryOrder(testParams); this.log('查询订单成功:', result); - + this.log('测试完成:查询订单方法调用成功(模拟)'); - + // 返回模拟结果 return { thirdOrderId: 'thirdOrder-123456789', -- 2.40.1 From 7a25a685a5ae9c0ed94a8be28a6220a821021a04 Mon Sep 17 00:00:00 2001 From: zhuotianyuan Date: Thu, 22 Jan 2026 14:52:14 +0800 Subject: [PATCH 3/3] =?UTF-8?q?style(logistics):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E5=92=8C=E7=BC=A9=E8=BF=9B?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/service/logistics.service.ts | 52 ++++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/service/logistics.service.ts b/src/service/logistics.service.ts index 19c0ed9..997bd17 100644 --- a/src/service/logistics.service.ts +++ b/src/service/logistics.service.ts @@ -73,7 +73,7 @@ export class LogisticsService { @Inject() uniExpressService: UniExpressService; - @Inject() + @Inject() freightwavesService: FreightwavesService; @Inject() @@ -141,7 +141,7 @@ export class LogisticsService { } -//"expressFinish": 0, //是否快递创建完成(1:完成 0:未完成,需要轮询 2:失败) + //"expressFinish": 0, //是否快递创建完成(1:完成 0:未完成,需要轮询 2:失败) async updateFreightwavesShipmentState(shipment: Shipment) { try { const data = await this.freightwavesService.queryOrder({ shipOrderId: shipment.order_id.toString() }); @@ -151,9 +151,9 @@ export class LogisticsService { throw new Error('获取运单状态失败,原因为' + data.expressFailMsg) } - if (data.expressFinish === 0) { - shipment.state = '203'; - shipment.finished = true; + if (data.expressFinish === 0) { + shipment.state = '203'; + shipment.finished = true; } this.shipmentModel.save(shipment); @@ -372,7 +372,7 @@ export class LogisticsService { // } // } - resShipmentOrder =await this.mepShipment(data,order); + resShipmentOrder = await this.mepShipment(data, order); // if (data.shipmentPlatform === 'uniuni') { // // 添加运单 @@ -385,7 +385,7 @@ export class LogisticsService { // } // 记录物流信息,并将订单状态转到完成 - if (resShipmentOrder.status === 'SUCCESS'||resShipmentOrder.code === '00000200') { + if (resShipmentOrder.status === 'SUCCESS' || resShipmentOrder.code === '00000200') { order.orderStatus = ErpOrderStatus.COMPLETED; } else { throw new Error('运单生成失败'); @@ -398,18 +398,18 @@ export class LogisticsService { const shipmentRepo = manager.getRepository(Shipment); const tracking_provider = data.shipmentPlatform; // todo: id未确定,后写进常数 - let co:any; - let unique_id:any; - let state:any; - if (data.shipmentPlatform === 'uniuni') { + let co: any; + let unique_id: any; + let state: any; + if (data.shipmentPlatform === 'uniuni') { co = resShipmentOrder.data.tno; unique_id = resShipmentOrder.data.uni_order_sn; state = resShipmentOrder.data.uni_status_code; - }else{ + } else { co = resShipmentOrder.data?.shipOrderId; unique_id = resShipmentOrder.data?.shipOrderId; state = ErpOrderStatus.COMPLETED; - } + } // 同步物流信息到woocommerce const site = await this.siteService.get(Number(order.siteId), true); const res = await this.wpService.createFulfillment(site, order.externalOrderId, { @@ -433,15 +433,15 @@ export class LogisticsService { } // 同步订单状态到woocommerce - if(order.source_type!="shopyy"){ - if (order.status !== OrderStatus.COMPLETED) { - await this.wpService.updateOrder(site, order.externalOrderId, { - status: OrderStatus.COMPLETED, - }); - order.status = OrderStatus.COMPLETED; + if (order.source_type != "shopyy") { + if (order.status !== OrderStatus.COMPLETED) { + await this.wpService.updateOrder(site, order.externalOrderId, { + status: OrderStatus.COMPLETED, + }); + order.status = OrderStatus.COMPLETED; + } } - } - + order.orderStatus = ErpOrderStatus.COMPLETED; await orderRepo.save(order); @@ -693,7 +693,7 @@ export class LogisticsService { - async mepShipment(data: ShipmentBookDTO,order:Order) { + async mepShipment(data: ShipmentBookDTO, order: Order) { try { const stock_point = await this.stockPointModel.findOneBy({ id: data.stockPointId }); let resShipmentOrder; @@ -734,9 +734,9 @@ export class LogisticsService { if (data.shipmentPlatform === 'freightwaves') { // 根据TMS系统对接说明文档格式化参数 const reqBody: any = { - shipCompany: 'UPSYYZ7000NEW', - partnerOrderNumber: order.siteId+'-'+order.externalOrderId , - warehouseId: '25072621030107400060', + shipCompany: 'UPSYYZ7000NEW', + partnerOrderNumber: order.siteId + '-' + order.externalOrderId, + warehouseId: '25072621030107400060', shipper: { name: data.details.origin.contact_name, // 姓名 phone: data.details.origin.phone_number.number, // 电话(提取number属性转换为字符串) @@ -778,7 +778,7 @@ export class LogisticsService { weightUnit: (data.details.packaging_properties.packages[0].measurements.weight.unit === 'kg' ? 'KG' : 'LB') as 'KG' | 'LB' // 重量单位(LB,KG) }, currency: 'CAD', // 币种(默认CAD) - description: '订单编号:'+order.externalOrderId // 包裹描述(确保是字符串类型) + description: '订单编号:' + order.externalOrderId // 包裹描述(确保是字符串类型) } ], signService: 0 -- 2.40.1