diff --git a/src/entity/shipment.entity.ts b/src/entity/shipment.entity.ts index f119f8d..5d3b4f6 100644 --- a/src/entity/shipment.entity.ts +++ b/src/entity/shipment.entity.ts @@ -62,6 +62,10 @@ export class Shipment { @Expose() state?: string; + @Column({ nullable: false, default: false }) + @Expose() + finished: boolean; + @Column({ nullable: true }) @Expose() type?: string; diff --git a/src/job/sync_shipment.job.ts b/src/job/sync_shipment.job.ts index 264d4eb..2b52bfb 100644 --- a/src/job/sync_shipment.job.ts +++ b/src/job/sync_shipment.job.ts @@ -1,6 +1,9 @@ import { FORMAT, ILogger, Inject, Logger } from '@midwayjs/core'; import { IJob, Job } from '@midwayjs/cron'; import { LogisticsService } from '../service/logistics.service'; +import { Repository } from 'typeorm'; +import { Shipment } from '../entity/shipment.entity'; +import { InjectEntityModel } from '@midwayjs/typeorm'; @Job({ cronTime: FORMAT.CRONTAB.EVERY_PER_30_MINUTE, @@ -20,3 +23,65 @@ export class SyncShipmentJob implements IJob { } onComplete?(result: any) {} } + +@Job({ + cronTime: '0 0 12 * * *', // 每天12点执行 + start: true +}) +export class SyncUniuniShipmentJob implements IJob{ + @Logger() + logger: ILogger; + + @Inject() + logisticsService: LogisticsService; + + @InjectEntityModel(Shipment) + shipmentModel: Repository + + uniuniStateCodes = { + '190': 'ORDER_RECEIVED', + '192': 'CUSTOM_HOLD', + '195': 'GATEWAY_TRANSIT_OUT', + '198': 'CUSTOM_RELEASE_DIRECT', + '199': 'GATEWAY_TRANSIT', + '200': 'PARCEL_SCANNED', + '202': 'IN_TRANSIT', + '203': 'DELIVERED', + '204': 'TRANSSHIPMENT', + '206': 'WRONG_ADDRESS_FROM_TRANSIT', + '207': 'PARCEL_LOST', + '209': 'OTHER_EXCEPTION', + '211': 'RETURN_OFFICE_FROM_TRANSIT', + '212': 'WRONG_ADDRESS_FROM_RECEIVE', + '213': 'STORAGE_30_DAYS_FROM_OFFICE', + '214': 'STORAGE_30_DAYS_AFTER_SCAN', + '215': 'PARCEL_ABANDONED', + '216': 'SELF_PICK_UP', + '217': 'TRANSSHIPMENT_COMPLETE', + '218': 'SCANNED_PARCEL_MISSING', + '219': 'WRONG_ROUTE_PARCEL', + '220': 'SECOND_DELIVERY', + '221': 'RETURNED_PARCEL_SCANNED', + '222': 'REJECTED_PARCEL_FROM_TRANSIT', + '223': 'CHANGED_ORDER_RESENT', + '224': 'RESENT_ORDER_VOIDED', + '225': 'FORWARDED_3RDPARTY', + '226': 'STORAGE_3RDPARTY_SERVICE_POINT', + '228': 'SECOND_DELIVERED', + '229': 'DROP_OFF_SERVICE_POINTS', + '230': 'RETURN TO SENDER WAREHOUSE', + '231': 'FAILED_DELIVERY_RETRY1', + '232': 'FAILED_DELIVERY_RETRY2', + '255': 'Gateway_To_Gateway_Transit' + }; + async onTick() { + const shipments:Shipment[] = await this.shipmentModel.findBy({ finished: false }); + shipments.forEach(shipment => { + this.logisticsService.updateShipmentState(Number(shipment.id)); + }); + } + + onComplete(result: any) { + + } +} \ No newline at end of file diff --git a/src/service/logistics.service.ts b/src/service/logistics.service.ts index c4baf0e..55c58d8 100644 --- a/src/service/logistics.service.ts +++ b/src/service/logistics.service.ts @@ -121,6 +121,10 @@ export class LogisticsService { return await this.shippingAddressModel.save(shippingAddress); } + async updateShipmentState(id: number) { + + } + async updateShippingAddress(id: number, shippingAddress: ShippingAddress) { const address = await this.shippingAddressModel.findOneBy({ id }); if (!address) { @@ -208,10 +212,6 @@ export class LogisticsService { try { const shipment:Shipment = await this.shipmentModel.findOneBy({id: shipmentId}); const order:Order = await this.orderModel.findOneBy({id: shipment.order_id}); - // todo 同步到wooccommerce删除运单信息 - const site = await this.geSite(order.siteId); - await this.wpService.deleteShipment(site, order.externalOrderId, shipment.tracking_id); - const dataSource = this.dataSourceManager.getDataSource('default'); let transactionError = undefined; await dataSource.transaction(async manager => { @@ -226,15 +226,6 @@ export class LogisticsService { const res = await this.uniExpressService.deleteShipment(shipment.return_tracking_number); console.log('res', res.data); - // 同步订单状态到woocommerce - if (order.status === OrderStatus.COMPLETED) { - await this.wpService.updateOrder(site, order.externalOrderId, { - status: OrderStatus.PROCESSING, - }); - order.status = OrderStatus.PROCESSING; - } - order.orderStatus = ErpOrderStatus.PROCESSING; - await orderRepo.save(order); }).catch(error => { @@ -245,6 +236,25 @@ export class LogisticsService { throw new Error(`数据库同步错误: ${transactionError.message}`); } + try { + // 同步订单状态到woocommerce + const site = await this.geSite(order.siteId); + if (order.status === OrderStatus.COMPLETED) { + await this.wpService.updateOrder(site, order.externalOrderId, { + status: OrderStatus.PROCESSING, + }); + order.status = OrderStatus.PROCESSING; + } + order.orderStatus = ErpOrderStatus.PROCESSING; + this.orderModel.save(order); + + // todo 同步到wooccommerce删除运单信息 + await this.wpService.deleteShipment(site, order.externalOrderId, shipment.tracking_id); + } catch (error) { + console.log('同步到woocommerce失败', error); + return true; + } + return true; } catch { throw new Error('删除运单失败'); diff --git a/src/service/uni_express.service.ts b/src/service/uni_express.service.ts index fe78e0a..5cece53 100644 --- a/src/service/uni_express.service.ts +++ b/src/service/uni_express.service.ts @@ -124,6 +124,7 @@ export class UniExpressService { headers: { 'Authorization': `Bearer ${token}` }, + url: `${this.url}/orders`, params: { from, to, page, perPage } @@ -135,4 +136,22 @@ export class UniExpressService { } } + async getOrderStatus(tracking_number: string) { + try { + const key = 'SMq45nJhQuNR3WHsJA6N'; // todo,写进常数 + const config: AxiosRequestConfig= { + method: 'GET', + url: `${this.url}/orders/trackinguniuni`, + params: { + key, + tracking_number + } + }; + const res = (await axios.request(config)).data; + console.log('res', res); + return res; + } catch (error) { + console.log(error); + } + } }