feat(trade): complete order on courier signed callback (v3.4.13)

When XFX route callback reports status=5 or statusName containing 签收, map to COMPLETED instead of PENDING_RECEIVE; document in v3.4.13 docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-05 23:46:37 +08:00
parent 672a995c59
commit 8df0a2bea7
7 changed files with 26 additions and 11 deletions
@@ -73,7 +73,10 @@ export class DeliveryCallbackService {
return this.courier.buildTrackCallbackResponse(false);
}
const targetStatus = this.xiaofeixiaProvider.mapTrackStatus(payload.status);
const targetStatus = this.xiaofeixiaProvider.mapTrackStatus(
payload.status,
payload.statusName,
);
let applied = false;
if (targetStatus && targetStatus !== order.status) {
await this.tradeService.applyStatusTransition(
@@ -67,7 +67,7 @@ export class CourierService {
return this.provider.parseTrackCallback(body);
}
mapTrackStatus(status: string): CourierMappedOrderStatus | null {
return this.provider.mapTrackStatus(status);
mapTrackStatus(status: string, statusName?: string): CourierMappedOrderStatus | null {
return this.provider.mapTrackStatus(status, statusName);
}
}
@@ -128,6 +128,6 @@ export interface ICourierProvider {
checkDeliveryCoverage(toAddress: string, options?: CourierCallOptions): Promise<DeliveryCoverageResult>;
estimateFreight(weight: number, options?: CourierCallOptions): Promise<FreightEstimateResult>;
parseTrackCallback(body: unknown): TrackCallbackPayload | null;
mapTrackStatus(status: string): CourierMappedOrderStatus | null;
mapTrackStatus(status: string, statusName?: string): CourierMappedOrderStatus | null;
buildTrackCallbackResponse(success?: boolean): TrackCallbackResponse;
}
@@ -157,7 +157,11 @@ export class XiaofeixiaProvider implements ICourierProvider {
};
}
mapTrackStatus(status: string): CourierMappedOrderStatus | null {
mapTrackStatus(status: string, statusName?: string): CourierMappedOrderStatus | null {
const name = (statusName || '').trim();
if (status === '5' || /签收/.test(name)) {
return 'COMPLETED';
}
switch (String(status).trim()) {
case '1':
return 'OUT_WAREHOUSE';
@@ -165,8 +169,6 @@ export class XiaofeixiaProvider implements ICourierProvider {
case '3':
case '4':
return 'SHIPPING';
case '5':
return 'PENDING_RECEIVE';
case '7':
return null;
default: