diff --git a/modules/EcommerceFinance/Services/Jushuitan/ShippingReplicaSynchronizer.php b/modules/EcommerceFinance/Services/Jushuitan/ShippingReplicaSynchronizer.php index 097a0e9b..f55fdfe8 100644 --- a/modules/EcommerceFinance/Services/Jushuitan/ShippingReplicaSynchronizer.php +++ b/modules/EcommerceFinance/Services/Jushuitan/ShippingReplicaSynchronizer.php @@ -1292,15 +1292,16 @@ class ShippingReplicaSynchronizer } /** - * 工作平台的快递名称/仓库即发货数据视图的 expressName / wareHoursName(抽样 14/14 一致): - * 视图有值时以视图为准;视图无该出库单时保留出库单/发货明细推断的值。 + * 仓库以发货数据视图的 wareHoursName 为准(工作平台口径);快递名称以出库单/发货明细当前值为准,视图仅兜底。 */ private function withViewCarrier(string $io, array $pkg, int $pkgId): array { if ($io === '') { return $pkg; } - if (! empty($this->ioExpress[$io])) { + // 快递名称以出库单/发货明细的当前值为准:聚水潭换单、改快递公司后出库单与发货明细会更新,工作平台跟着变, + // 发货数据视图的 expressName 却停在旧值(如 崔桥顺丰干配→常州德邦)。视图只在出库单/发货明细没有快递名称时兜底。 + if (trim((string) ($pkg['express_name1'] ?? '')) === '' && ! empty($this->ioExpress[$io])) { $pkg['express_name1'] = $this->ioExpress[$io]; } if (! empty($this->ioWare[$io])) { diff --git a/tests/Unit/EcommerceFinance/ShippingReplicaSynchronizerTest.php b/tests/Unit/EcommerceFinance/ShippingReplicaSynchronizerTest.php index 9fd60ebe..41fafcc6 100644 --- a/tests/Unit/EcommerceFinance/ShippingReplicaSynchronizerTest.php +++ b/tests/Unit/EcommerceFinance/ShippingReplicaSynchronizerTest.php @@ -1300,8 +1300,11 @@ class ShippingReplicaSynchronizerTest extends TestCase $carrier->setAccessible(true); // 视图有值:快递名称、仓库按视图(工作平台口径),不再按发货主体回填 + // 快递名称:出库单/发货明细已有当前值(换单后)时不被视图旧值覆盖;没有时用视图兜底 $pkg = $carrier->invoke($sync, '12', ['express_name1' => '崔桥顺丰干配', 'warehouse_name' => '工厂-河北浩浦代发仓'], 1); - $this->assertSame('常州德邦', $pkg['express_name1']); + $this->assertSame('崔桥顺丰干配', $pkg['express_name1']); + $blank = $carrier->invoke($sync, '12', ['express_name1' => '', 'warehouse_name' => ''], 5); + $this->assertSame('常州德邦', $blank['express_name1']); $this->assertSame('工厂-河南千优代发仓', $pkg['warehouse_name']); $this->assertArrayNotHasKey(1, $pending->getValue($sync));