diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java index 4348f65b..428c4398 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java @@ -124,8 +124,8 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM, STATUS_COMPLETED ); /** - * 进行中口径:司机手上还没走完的单。 - * 待回单确认也算进行中——司机侧已打完末位卡,等业务员确认回单才变已完成。 + * 进行中口径:司机手上还没走完的单,含待回单确认。 + * 待回单确认指司机已打完末位卡、等业务员确认回单,此时业务状态还不是 completed。 */ private static final List ACTIVE_STATUSES = Arrays.asList( STATUS_RUNNING, STATUS_PENDING, STATUS_WAITING_DISPATCH, STATUS_DISPATCHING, @@ -525,9 +525,9 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { nodePunchMapper.insert(punch); advanceCurrentProcessNode(waybill, nodeCfg); - // 末位打卡节点是到货/卸货/签收、且运单本身允许完成时,本次打卡就是运单的去向决定点: - // 回单无需确认 → 一并完成;回单需业务员确认 → 停在待回单确认等业务员确认。 - // isLastDriverPunchNode 与 returnNeedsNoConfirmation 传的就是上面那份 processJson,未再调 resolveProcessJson 取过程配置。 + // 末位打卡节点为到货/卸货/签收、且运单允许完成时:回单无需确认则本次打卡一并完成运单, + // 回单需业务员确认则停在待回单确认。 + // isLastDriverPunchNode 与 returnNeedsNoConfirmation 传的是上面那份 processJson,未再调 resolveProcessJson 取过程配置。 String nodeKey = WaybillProcessSupport.nodeKey(nodeCfg); String nodeName = WaybillProcessSupport.nodeName(nodeCfg); String waybillBusinessStatus = waybill.getBusinessStatus(); @@ -540,9 +540,9 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { if (completed) { waybillBusinessStatus = STATUS_COMPLETED; } - } else if (WaybillProcessSupport.STATUS_RUNNING.equals(waybill.getBusinessStatus())) { - // 只有进行中能进入:canAutoCompleteWaybill 的状态口径含待执行/待调度等,不能替代这一条; - // 待回单确认在 isPunchEnded 里算已结束,不能从结束态重进。 + } else if (WaybillProcessSupport.STATUS_RUNNING.equalsIgnoreCase(waybill.getBusinessStatus())) { + // 当前业务状态为 running 才置为待回单确认;canAutoCompleteWaybill 的状态口径还含待执行/待调度。 + // 待回单确认在 isPunchEnded 里与已完成、已取消同属结束态。 waybill.setBusinessStatus(WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM); waybillService.updateById(waybill); waybillBusinessStatus = WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM; @@ -1113,6 +1113,13 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { card.setId(parseId(children.isEmpty() ? trip.getId() : children.get(0).getId())); card.setWaybillNo(children.isEmpty() ? card.getTripNo() : Func.toStr(children.get(0).getWaybillNo(), "")); card.setStatus(trip.getStatus()); + // 原始业务状态只在整趟车子单状态唯一时下发:配载车混状态时一趟车没有唯一原始状态,给 null 由前端按数字态展示 + List childBusinessStatuses = children.stream() + .map(TripVO.TripWaybillVO::getBusinessStatus) + .filter(Func::isNotBlank) + .distinct() + .collect(Collectors.toList()); + card.setBusinessStatus(childBusinessStatuses.size() == 1 ? childBusinessStatuses.get(0) : null); card.setRequireAccept(trip.getRequireAccept()); card.setAcceptStatus(trip.getAcceptStatus()); card.setTransportOrgType(trip.getTransportOrgType()); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ManageWaybillServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ManageWaybillServiceImpl.java index 0f692983..a0ee73f3 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ManageWaybillServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ManageWaybillServiceImpl.java @@ -996,8 +996,8 @@ public class ManageWaybillServiceImpl implements IManageWaybillService { } return switch (businessStatus) { case STATUS_PENDING, "waiting_dispatch", "dispatching" -> 0; - // 与司机端 toAppStatus 同一份数字枚举(0 待接单 / 1 运输中 / 2 已完成 / 3 已取消),待回单确认属进行中: - // 两处对同一状态必须给同一个数字,给 null 前端只能落到「未知」兜底 + // 数字枚举与司机端 toAppStatus 同源:0 待接单 / 1 运输中 / 2 已完成 / 3 已取消; + // 待回单确认属进行中,落 1。给 null 时前端显示「未知」。 case STATUS_RUNNING, WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM -> 1; case STATUS_COMPLETED -> 2; case STATUS_CANCELLED -> 3; diff --git a/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/DriverTripCardTest.java b/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/DriverTripCardTest.java index 7bdcbba1..41189b41 100644 --- a/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/DriverTripCardTest.java +++ b/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/DriverTripCardTest.java @@ -30,6 +30,7 @@ import org.springblade.transport.service.ITransportVehicleService; import org.springblade.transport.service.ITripQueryService; import org.springblade.transport.service.IWaybillService; import org.springblade.transport.support.CertificationGate; +import org.springblade.transport.support.WaybillProcessSupport; import java.math.BigDecimal; import java.util.Date; @@ -147,6 +148,34 @@ class DriverTripCardTest { assertEquals("桂A32523", card.getVehicleNo()); } + @Test + @DisplayName("运次卡片带唯一原始业务状态:子单都在待回单确认时下发 pending_return_confirm,数字态仍是 1") + void tripCardCarriesUniqueChildBusinessStatus() { + TripVO trip = loadingTrip(); + trip.getWaybills().forEach(child -> child.setBusinessStatus(WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM)); + stubTripPage(1, trip); + + IPage page = runAsDriver(() -> service.tripPage(1, 10, null, null)); + + DriverWaybillCardVO card = page.getRecords().get(0); + assertEquals(WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM, card.getBusinessStatus()); + assertEquals(trip.getStatus(), card.getStatus(), "运次数字态口径不变,仍取运次状态"); + } + + @Test + @DisplayName("运次卡片原始业务状态:配载车混状态时给 null,由前端回退数字态") + void tripCardWithoutUniqueChildBusinessStatusGivesNull() { + TripVO trip = loadingTrip(); + trip.getWaybills().get(0).setBusinessStatus(WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM); + stubTripPage(1, trip); + + IPage page = runAsDriver(() -> service.tripPage(1, 10, null, null)); + + DriverWaybillCardVO card = page.getRecords().get(0); + assertNull(card.getBusinessStatus(), "一趟车里两种原始状态,没有唯一值可下发"); + assertEquals(1, card.getStatus(), "混状态不影响运次数字态"); + } + @Test @DisplayName("运次列表不因配载卡去回查运单,也不写库") void tripPageDoesNotLookUpWaybillsOrWrite() { diff --git a/blade-service/blade-transport/src/test/java/org/springblade/transport/support/WaybillProcessSupportTest.java b/blade-service/blade-transport/src/test/java/org/springblade/transport/support/WaybillProcessSupportTest.java index 9408bfd6..d8830c8a 100644 --- a/blade-service/blade-transport/src/test/java/org/springblade/transport/support/WaybillProcessSupportTest.java +++ b/blade-service/blade-transport/src/test/java/org/springblade/transport/support/WaybillProcessSupportTest.java @@ -337,8 +337,8 @@ class WaybillProcessSupportTest { // ------------------------------------------------------------ 待回单确认 @Test - @DisplayName("待回单确认落库字面量为 pending_return_confirm,且接单归一不得改写它") - void pendingReturnConfirmIsTerminalStatus() { + @DisplayName("待回单确认落库字面量为 pending_return_confirm,且接单归一不改写它") + void pendingReturnConfirmLiteralSurvivesAcceptanceNormalization() { assertEquals("pending_return_confirm", WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM, "库里存的是这个字面量,web 与小程序也按它判断,不能改名"); assertEquals(WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM,