From 911393fb091fb2dfdc2962a47cec37ec3902cca2 Mon Sep 17 00:00:00 2001 From: weicw1996 Date: Thu, 22 Oct 2026 13:33:45 +0800 Subject: [PATCH 1/4] =?UTF-8?q?:sparkles:=20=E8=BF=90=E5=8D=95=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=BE=85=E5=9B=9E=E5=8D=95=E7=A1=AE=E8=AE=A4=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=B8=B8=E9=87=8F=E5=B9=B6=E7=BA=B3=E5=85=A5=E7=BB=88?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 接单归一在需要确认接单的配置下会把非终态运单改成待执行/进行中,落库后即抹掉待回单确认。 --- .../transport/support/WaybillProcessSupport.java | 5 ++++- .../support/WaybillProcessSupportTest.java | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java index 4462c3a3..3d5ca5a7 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java @@ -49,6 +49,8 @@ public final class WaybillProcessSupport { public static final String STATUS_PENDING = "pending"; public static final String STATUS_RUNNING = "running"; + /** 司机已打完末位卡、回单需业务员确认,尚未生成应收应付 */ + public static final String STATUS_PENDING_RETURN_CONFIRM = "pending_return_confirm"; public static final String ACCEPT_PENDING = "pending"; public static final String ACCEPT_ACCEPTED = "accepted"; public static final String ACCEPT_REJECTED = "rejected"; @@ -213,7 +215,8 @@ public final class WaybillProcessSupport { || "completed".equals(businessStatus) || "cancelled".equals(businessStatus) || "waiting_dispatch".equals(businessStatus) - || "dispatching".equals(businessStatus); + || "dispatching".equals(businessStatus) + || STATUS_PENDING_RETURN_CONFIRM.equals(businessStatus); } /** 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 b09c82c4..8cd89e3c 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 @@ -334,6 +334,20 @@ class WaybillProcessSupportTest { "TRANSPORT_JSON 的回单启用且没有 confirmMode:缺字段当没配「无需确认完成」,否则会跳过本该人工确认的回单"); } + // ------------------------------------------------------------ 待回单确认 + + @Test + @DisplayName("待回单确认落库字面量为 pending_return_confirm,且接单归一不得改写它") + void pendingReturnConfirmIsTerminalStatus() { + assertEquals("pending_return_confirm", WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM, + "库里存的是这个字面量,web 与小程序也按它判断,不能改名"); + assertEquals(WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM, + WaybillProcessSupport.normalizeBusinessStatus(WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM, TRANSPORT_JSON), + "TRANSPORT_JSON 要求确认接单,未接单时归一结果本是 pending;运单已跑完全程,不能被改回待执行"); + assertEquals(WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM, + WaybillProcessSupport.normalizeBusinessStatus(WaybillProcessSupport.STATUS_PENDING_RETURN_CONFIRM, TRANSPORT_JSON, "accepted")); + } + // ------------------------------------------------------------ 结束门禁 @Test From e0c65f44805ebf507824aeb495b9def78060c66c Mon Sep 17 00:00:00 2001 From: weicw1996 Date: Thu, 22 Oct 2026 13:35:03 +0800 Subject: [PATCH 2/4] =?UTF-8?q?:sparkles:=20=E5=BE=85=E5=9B=9E=E5=8D=95?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E8=BF=90=E5=8D=95=E5=BD=92=E5=85=A5=E5=B7=B2?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=EF=BC=8C=E6=89=93=E5=8D=A1=E9=97=A8=E7=A6=81?= =?UTF-8?q?=E7=BB=99=E5=87=BA=E4=B8=93=E9=97=A8=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/support/WaybillProcessSupport.java | 11 ++++++++--- .../transport/support/WaybillProcessSupportTest.java | 9 ++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java index 3d5ca5a7..aad6b3e5 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java @@ -136,14 +136,16 @@ public final class WaybillProcessSupport { } /** - * 运单已结束:已完成或已取消。此后不再接受司机打卡。 + * 运单已结束:已完成、已取消,或已打完末位卡停在待回单确认。此后不再接受司机打卡。 *

- * 只认这两个状态,大小写不敏感。草稿、待执行、待调度、调度中的运单司机仍要能打卡, + * 只认这三个状态,大小写不敏感。草稿、待执行、待调度、调度中的运单司机仍要能打卡, * 所以不能按 {@link #isTerminalBusinessStatus} 的「终态或调度中间态」口径判定。 */ public static boolean isPunchEnded(String businessStatus) { String status = stringVal(businessStatus); - return "completed".equalsIgnoreCase(status) || "cancelled".equalsIgnoreCase(status); + return "completed".equalsIgnoreCase(status) + || "cancelled".equalsIgnoreCase(status) + || STATUS_PENDING_RETURN_CONFIRM.equalsIgnoreCase(status); } /** @@ -157,6 +159,9 @@ public final class WaybillProcessSupport { if ("cancelled".equalsIgnoreCase(status)) { return "运单已取消"; } + if (STATUS_PENDING_RETURN_CONFIRM.equalsIgnoreCase(status)) { + return "运单待业务员确认回单"; + } return null; } 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 8cd89e3c..2398cf2d 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 @@ -351,12 +351,14 @@ class WaybillProcessSupportTest { // ------------------------------------------------------------ 结束门禁 @Test - @DisplayName("结束门禁:只认已完成与已取消,大小写不敏感") - void punchEndedOnlyForCompletedAndCancelled() { + @DisplayName("结束门禁:已完成、已取消与待回单确认都算结束,大小写不敏感") + void punchEndedForCompletedCancelledAndPendingReturnConfirm() { assertTrue(WaybillProcessSupport.isPunchEnded("completed")); assertTrue(WaybillProcessSupport.isPunchEnded("COMPLETED")); assertTrue(WaybillProcessSupport.isPunchEnded("cancelled")); assertTrue(WaybillProcessSupport.isPunchEnded("Cancelled")); + assertTrue(WaybillProcessSupport.isPunchEnded("pending_return_confirm"), + "司机已打完末位卡,不能再打卡"); } @Test @@ -372,11 +374,12 @@ class WaybillProcessSupportTest { } @Test - @DisplayName("结束门禁文案:完成与取消各一句,非结束态没有文案") + @DisplayName("结束门禁文案:完成、取消与待回单确认各一句,非结束态没有文案") void punchEndedReasonOnlyForEndedStatuses() { assertEquals("运单已完成", WaybillProcessSupport.punchEndedReason("completed")); assertEquals("运单已完成", WaybillProcessSupport.punchEndedReason(" COMPLETED ")); assertEquals("运单已取消", WaybillProcessSupport.punchEndedReason("cancelled")); + assertEquals("运单待业务员确认回单", WaybillProcessSupport.punchEndedReason("pending_return_confirm")); assertNull(WaybillProcessSupport.punchEndedReason(null)); assertNull(WaybillProcessSupport.punchEndedReason("")); assertNull(WaybillProcessSupport.punchEndedReason(" ")); From 3c230eafed674c39f5666e30e3ad9e659a653325 Mon Sep 17 00:00:00 2001 From: weicw1996 Date: Thu, 22 Oct 2026 13:36:01 +0800 Subject: [PATCH 3/4] =?UTF-8?q?:white=5Fcheck=5Fmark:=20=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E5=BE=85=E5=9B=9E=E5=8D=95=E7=A1=AE=E8=AE=A4=E8=BF=90=E5=8D=95?= =?UTF-8?q?=E7=9A=84=E4=B8=8A=E6=8A=A5=E5=BC=82=E5=B8=B8=E9=97=A8=E7=A6=81?= =?UTF-8?q?=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springblade/transport/support/WaybillProcessSupport.java | 2 +- .../transport/support/WaybillProcessSupportTest.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java index aad6b3e5..3b9d920e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/WaybillProcessSupport.java @@ -202,7 +202,7 @@ public final class WaybillProcessSupport { * 上报异常前的运单状态门禁原因;可上报时返回 null。 *

* 与打卡共用「已开始运输」判据,但文案说的是能不能报,不是能不能打。 - * 结束优先于未开始:已完成/已取消的运单先说结束,不再提「等你上路」。 + * 结束优先于未开始:已结束的运单先说结束,不再提「等你上路」。 */ public static String reportBlockedReason(String businessStatus) { String endedReason = punchEndedReason(businessStatus); 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 2398cf2d..568372be 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 @@ -472,9 +472,11 @@ class WaybillProcessSupportTest { assertNull(WaybillProcessSupport.reportBlockedReason("running")); assertEquals("运单尚未开始运输,暂不可上报异常", WaybillProcessSupport.reportBlockedReason("pending")); assertEquals("运单尚未开始运输,暂不可上报异常", WaybillProcessSupport.reportBlockedReason("dispatching")); - // 结束优先:已完成/已取消先说结束,不提「等你上路」 + // 结束优先:已结束态先说结束,不提「等你上路」 assertEquals("运单已完成,不能上报异常", WaybillProcessSupport.reportBlockedReason("completed")); assertEquals("运单已取消,不能上报异常", WaybillProcessSupport.reportBlockedReason("cancelled")); + assertEquals("运单待业务员确认回单,不能上报异常", + WaybillProcessSupport.reportBlockedReason("pending_return_confirm")); } } From 646d8513d2eb7ee2212eaa888b7a9e1d710e1a0b Mon Sep 17 00:00:00 2001 From: weicw1996 Date: Thu, 22 Oct 2026 13:36:36 +0800 Subject: [PATCH 4/4] =?UTF-8?q?:white=5Fcheck=5Fmark:=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E5=BE=85=E5=9B=9E=E5=8D=95=E7=A1=AE=E8=AE=A4=E8=BF=90=E5=8D=95?= =?UTF-8?q?=E7=9A=84=E3=80=8C=E6=9C=AA=E5=BC=80=E5=A7=8B=E8=BF=90=E8=BE=93?= =?UTF-8?q?=E3=80=8D=E6=96=87=E6=A1=88=E4=B8=8E=E5=9C=A8=E9=80=94=E5=8D=A1?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E6=89=93=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 两处都由 isPunchEnded 自动覆盖,测试只锁住它们不得回到「尚未开始运输」分支。 --- .../support/WaybillProcessSupportTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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 568372be..9408bfd6 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 @@ -438,6 +438,22 @@ class WaybillProcessSupportTest { // 结束态由结束文案负责,两句话不能抢 assertNull(WaybillProcessSupport.punchNotStartedReason("completed")); assertNull(WaybillProcessSupport.punchNotStartedReason("cancelled")); + assertNull(WaybillProcessSupport.punchNotStartedReason("pending_return_confirm"), + "司机已打完末位卡,不能再被说成「尚未开始运输」"); + } + + @Test + @DisplayName("在途卡:待回单确认的运单与已完成同样不可打卡") + void transitCardOnPendingReturnConfirmWaybillIsVisibleButNotPunchable() { + LocalDateTime now = LocalDateTime.of(2026, 10, 20, 12, 0); + + WaybillProcessSupport.TransitCheckinDecision decision = + WaybillProcessSupport.evaluateTransitCheckin(TRANSPORT_JSON, "pending_return_confirm", null, now); + + assertTrue(decision.visible(), "卡片仍要下发,司机能回看"); + assertFalse(decision.punchEnabled(), "末位卡已打完,在途卡不能再提交"); + assertFalse(decision.doneToday()); + assertFalse(decision.dueToday()); } @Test