From 676aa47e6f7038812902c2e78d258372096ff1dd Mon Sep 17 00:00:00 2001 From: longbot <444693295@qq.com> Date: Sat, 9 Aug 2025 10:41:13 +0800 Subject: [PATCH] =?UTF-8?q?Fix:=20=E5=A2=9E=E5=8A=A0=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加了删除接口,同步了woocommerce订单状态,部分bug修复 --- src/controller/logistics.controller.ts | 12 ++++- src/entity/shipment.entity.ts | 5 ++ src/service/logistics.service.ts | 63 ++++++++++++++++++++++---- src/service/wp.service.ts | 27 ++++++++++- 4 files changed, 95 insertions(+), 12 deletions(-) diff --git a/src/controller/logistics.controller.ts b/src/controller/logistics.controller.ts index d2b46f5..2f47ae5 100644 --- a/src/controller/logistics.controller.ts +++ b/src/controller/logistics.controller.ts @@ -145,6 +145,16 @@ export class LogisticsController { } } + @Del('deleteShipment/id') + async deleteShipment(@Param('id') id: number) { + try { + const res = await this.logisticsService.removeShipment(id); + return successResponse(res); + } catch (error) { + return errorResponse(error?.message || '删除运单失败' ); + } + } + @ApiOkResponse({ type: BooleanRes, }) @@ -162,7 +172,7 @@ export class LogisticsController { } } - @ApiOkResponse( + @ApiOkResponse( {type: BooleanRes} ) @Post('/getShipmentFee') diff --git a/src/entity/shipment.entity.ts b/src/entity/shipment.entity.ts index d106315..75201c8 100644 --- a/src/entity/shipment.entity.ts +++ b/src/entity/shipment.entity.ts @@ -39,6 +39,11 @@ export class Shipment { @Expose() fee: number; + @ApiProperty() + @Column({ nullable: true }) + @Expose() + tracking_id: string; + @ApiProperty() @Column({ nullable: true }) @Expose() diff --git a/src/service/logistics.service.ts b/src/service/logistics.service.ts index b0a2602..fd025a7 100644 --- a/src/service/logistics.service.ts +++ b/src/service/logistics.service.ts @@ -204,6 +204,44 @@ export class LogisticsService { } } + async removeShipment(shipmentId) { + try { + const shipment:Shipment = await this.shipmentModel.findOneBy({id: shipmentId}); + const order = shipment.order; + // todo 同步到wooccommerce + const site = await this.geSite(order.siteId); + await this.wpService.deleteShipment(site, order.externalOrderId, shipment.tracking_id, { + tracking_number: shipment.return_tracking_number, + tracking_provider: shipment?.tracking_provider, + }); + + const dataSource = this.dataSourceManager.getDataSource('default'); + let transactionError = undefined; + await dataSource.transaction(async manager => { + const orderRepo = manager.getRepository(Order); + const shipmentRepo = manager.getRepository(Shipment); + + order.shipmentId = null; + orderRepo.save(order); + + shipmentRepo.remove(shipment); + + const res = await this.uniExpressService.deleteShipment(shipment.return_tracking_number); + console.log('res', res.data); + }).catch(error => { + transactionError = error; + }); + + if (transactionError !== undefined) { + throw new Error(`数据库同步错误: ${transactionError.message}`); + } + + return true; + } catch { + throw new Error('删除运单失败'); + } + } + async getShipmentFee(data: ShipmentBookDTO) { try { const stock_point = await this.stockPointModel.findOneBy({ id: data.stockPointId}); @@ -269,13 +307,16 @@ export class LogisticsService { receiver_phone: data.details.destination.phone_number.number, receiver_email: data.details.destination.email_addresses, // item_description: data.sales, // todo: 货品信息 - length: data.details.packaging_properties.packages[0].measurements.cuboid.l, // todo, (只能一个包) + length: data.details.packaging_properties.packages[0].measurements.cuboid.l, width: data.details.packaging_properties.packages[0].measurements.cuboid.w, height: data.details.packaging_properties.packages[0].measurements.cuboid.h, dimension_uom: data.details.packaging_properties.packages[0].measurements.cuboid.unit, weight: data.details.packaging_properties.packages[0].measurements.weight.value, weight_uom: data.details.packaging_properties.packages[0].measurements.weight.unit, currency: 'CAD', + custom_field: { + 'order_id': order.externalOrderId + } } // 添加运单 @@ -292,23 +333,27 @@ export class LogisticsService { await dataSource.transaction(async manager => { const orderRepo = manager.getRepository(Order); const shipmentRepo = manager.getRepository(Shipment); + const tracking_provider = 'UniUni'; // todo: id未确定,后写进常数 + + // 同步物流信息到woocommerce + const site = await this.geSite(order.siteId); + const res = await this.wpService.createShipment(site, order.externalOrderId, { + tracking_number: resShipmentOrder.data.tno, + tracking_provider: tracking_provider, + }); + if (order.orderStatus === ErpOrderStatus.COMPLETED) { const shipment = await shipmentRepo.save({ - tracking_provider: 'uniuni-express', // todo: id未确定,后写进常数 + tracking_provider: tracking_provider, + tracking_id: res.data.tracking_id, unique_id: resShipmentOrder.data.uni_order_sn, stockPointId: String(data.stockPointId), // todo state: resShipmentOrder.data.uni_status_code, return_tracking_number: resShipmentOrder.data.tno, fee: data.details.shipmentFee, - order_id: orderId + order: order }); order.shipmentId = shipment.id; - // 同步物流信息到woocommerce - const site = await this.geSite(order.siteId); - await this.wpService.createShipment(site, order.externalOrderId, { - tracking_number: shipment.return_tracking_number, - tracking_provider: shipment?.tracking_provider, - }); } await orderRepo.save(order); diff --git a/src/service/wp.service.ts b/src/service/wp.service.ts index 742892c..a0b09eb 100644 --- a/src/service/wp.service.ts +++ b/src/service/wp.service.ts @@ -261,7 +261,7 @@ export class WPService { site: WpSite, orderId: string, data: Record - ): Promise { + ) { const { wpApiUrl, consumerKey, consumerSecret } = site; const auth = Buffer.from(`${consumerKey}:${consumerSecret}`).toString( 'base64' @@ -276,4 +276,27 @@ export class WPService { }; return await axios.request(config); } -} + + async deleteShipment( + site: WpSite, + orderId: string, + trackingId: string, + data: Record + ): Promise { + const { wpApiUrl, consumerKey, consumerSecret } = site; + const auth = Buffer.from(`${consumerKey}:${consumerSecret}`).toString( + 'base64' + ); + + // 删除接口: DELETE /wp-json/wc-shipment-tracking/v3/orders//shipment-trackings/ + const config: AxiosRequestConfig = { + method: 'DELETE', + url: `${wpApiUrl}/wp-json/wc-ast/v3/orders/${orderId}/shipment-trackings/${trackingId}`, + headers: { + Authorization: `Basic ${auth}`, + }, + data, + }; + return await axios.request(config); + } +} \ No newline at end of file