From 05aaa5396b15218a6ee3fed2eb81da4ccc2be99c Mon Sep 17 00:00:00 2001 From: weicw <594098497@qq.com> Date: Mon, 26 Oct 2026 00:45:54 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E8=BF=90=E6=AC=A1=E4=B8=8E?= =?UTF-8?q?=E8=BF=90=E5=8D=95=E4=B8=8B=E5=8F=91=E5=A4=9A=E5=BC=8F=E8=81=94?= =?UTF-8?q?=E8=BF=90=E6=A0=87=E5=BF=97=EF=BC=8C=E8=BF=90=E8=BE=93=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=AD=9B=E9=80=89=E5=88=86=E4=B8=89=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit transportOrgType 仍是 common/load 二值(组织形态维),另加 Boolean multimodal 表示挂了多联总单;两者可叠加,文案由前端组合。visibleRows 补选 master_no,否则派生永远为空。配载档筛选排掉挂总单的行,多式联运档只看 master_no。 --- .../pojo/vo/AdminWaybillDetailVO.java | 5 +- .../pojo/vo/DriverWaybillCardVO.java | 5 +- .../springblade/transport/pojo/vo/TripVO.java | 5 +- .../impl/DriverWaybillServiceImpl.java | 2 + .../impl/ManageWaybillServiceImpl.java | 4 ++ .../service/impl/TripQueryServiceImpl.java | 24 ++++++-- .../service/impl/DriverTripCardTest.java | 13 ++++ .../impl/ManageTripListDetailTest.java | 13 ++++ .../impl/TripQueryServiceImplTest.java | 61 ++++++++++++++++++- 9 files changed, 121 insertions(+), 11 deletions(-) diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillDetailVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillDetailVO.java index e874df68..0a95b2a1 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillDetailVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillDetailVO.java @@ -90,9 +90,12 @@ public class AdminWaybillDetailVO implements Serializable { @Schema(description = "运输方式字典值:road 等") private String transportMode; - @Schema(description = "运输组织:common普通 / load配载") + @Schema(description = "运输类型:common普通运输 / load配载运输") private String transportOrgType; + @Schema(description = "是否挂多联总单:为真表示这趟含多式联运,与配载运输可叠加(不与 transportOrgType 互斥)") + private Boolean multimodal; + @Schema(description = "计划发货时间") private String planShipTime; diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/DriverWaybillCardVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/DriverWaybillCardVO.java index a4be3625..2b4c2914 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/DriverWaybillCardVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/DriverWaybillCardVO.java @@ -156,9 +156,12 @@ public class DriverWaybillCardVO implements Serializable { @Schema(description = "运输方式文案:公路运输等") private String transportType; - @Schema(description = "运输组织:common普通 / load配载") + @Schema(description = "运输类型:common普通运输 / load配载运输") private String transportOrgType; + @Schema(description = "是否挂多联总单:为真表示这趟含多式联运,与配载运输可叠加(不与 transportOrgType 互斥)") + private Boolean multimodal; + /* ===== 运次(一趟车)字段:运次接口返回,旧运单接口不填 ===== */ @Schema(description = "运次主键:配载单主键或运单主键,按字符串下发(19 位雪花号按数字下发会被前端取整)") diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/TripVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/TripVO.java index a6523dfb..304addeb 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/TripVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/TripVO.java @@ -54,9 +54,12 @@ public class TripVO implements Serializable { @Schema(description = "配载单号,未配载为空") private String loadingNo; - @Schema(description = "运输组织类型:load 公路配载 / common 普通运输") + @Schema(description = "运输类型:load 配载运输 / common 普通运输") private String transportOrgType; + @Schema(description = "是否挂多联总单:为真表示这趟含多式联运,与配载运输可叠加(不与 transportOrgType 互斥)") + private Boolean multimodal; + @Schema(description = "状态:0待接单/1运输中/2已完成/3已取消,子单集合为空时为空") private Integer status; 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 22bab55a..afd82e56 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 @@ -1055,6 +1055,7 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { card.setCargos(withDetail ? cargoLines(cargos) : null); card.setTransportType(toTransportTypeLabel(waybill.getTransportType())); card.setTransportOrgType(Func.isNotBlank(waybill.getLoadingNo()) ? TRANSPORT_LOAD : TRANSPORT_COMMON); + card.setMultimodal(Func.isNotBlank(waybill.getMasterNo())); card.setPlanShipTime(formatLocalDateYmd(waybill.getEstimatedStartTime())); card.setPlanFinishTime(formatLocalDateYmd(waybill.getEstimatedEndTime())); card.setRemark(Func.toStr(waybill.getRemark(), "")); @@ -1141,6 +1142,7 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { card.setRequireAccept(trip.getRequireAccept()); card.setAcceptStatus(trip.getAcceptStatus()); card.setTransportOrgType(trip.getTransportOrgType()); + card.setMultimodal(trip.getMultimodal()); card.setTransportType(toTransportTypeLabel(trip.getTransportType())); card.setDriverName(Func.toStr(trip.getDriverName(), "")); card.setDriverPhone(Func.toStr(trip.getDriverPhone(), "")); 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 8b82d417..3707fc75 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 @@ -445,6 +445,7 @@ public class ManageWaybillServiceImpl implements IManageWaybillService { detail.setTransportMode(Func.toStr(trip.getTransportType(), "")); detail.setTransportType(toTransportTypeLabel(Func.toStr(trip.getTransportType(), ""))); detail.setTransportOrgType(Func.isEmpty(trip.getLoadingNo()) ? TRANSPORT_COMMON : TRANSPORT_LOAD); + detail.setMultimodal(Boolean.TRUE.equals(trip.getMultimodal())); detail.setTripId(trip.getId()); detail.setLoadingNo(Func.toStr(trip.getLoadingNo(), "")); detail.setTripNo(Func.toStr(trip.getTripNo(), "")); @@ -504,6 +505,7 @@ public class ManageWaybillServiceImpl implements IManageWaybillService { detail.setLoadingNo(loading.getLoadingNo()); detail.setTripNo(loading.getLoadingNo()); detail.setTransportOrgType(TRANSPORT_LOAD); + detail.setMultimodal(children.stream().anyMatch(child -> Func.isNotBlank(child.getMasterNo()))); detail.setViaName(TripStationAssembler.transitName(stations)); detail.setStationCount(stations.size()); detail.setStations(stations); @@ -538,6 +540,7 @@ public class ManageWaybillServiceImpl implements IManageWaybillService { detail.setTransportMode(Func.toStr(loading.getTransportType(), "")); detail.setTransportType(toTransportTypeLabel(Func.toStr(loading.getTransportType(), ""))); detail.setTransportOrgType(TRANSPORT_LOAD); + detail.setMultimodal(children.stream().anyMatch(child -> Func.isNotBlank(child.getMasterNo()))); detail.setTripId(String.valueOf(loading.getId())); detail.setLoadingNo(loading.getLoadingNo()); detail.setTripNo(loading.getLoadingNo()); @@ -777,6 +780,7 @@ public class ManageWaybillServiceImpl implements IManageWaybillService { detail.setTransportMode(mode); detail.setTransportType(toTransportTypeLabel(mode)); detail.setTransportOrgType(Func.isNotBlank(waybill.getLoadingNo()) ? TRANSPORT_LOAD : TRANSPORT_COMMON); + detail.setMultimodal(Func.isNotBlank(waybill.getMasterNo())); detail.setFromName(formatPlaceName(waybill.getDepartureName(), mode)); detail.setToName(formatPlaceName(waybill.getArrivalName(), mode)); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TripQueryServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TripQueryServiceImpl.java index 56a2a5d3..892d0d00 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TripQueryServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TripQueryServiceImpl.java @@ -79,9 +79,10 @@ public class TripQueryServiceImpl implements ITripQueryService { private static final int DEFAULT_PAGE_SIZE = 10; private static final int MAX_PAGE_SIZE = 50; - /** 运输组织类型:有配载单为公路配载,否则普通运输 */ + /** 运输类型:有配载单为配载运输,挂多联总单为多式联运,两者都没有为普通运输 */ private static final String TRANSPORT_LOAD = "load"; private static final String TRANSPORT_COMMON = "common"; + private static final String TRANSPORT_MULTIMODAL = "multimodal"; /** 未配载运次的键前缀:与 TripAggregation.SQL_TRIP_KEY 的 W 前缀同一个口径 */ private static final String LONE_KEY_PREFIX = "W"; @@ -244,6 +245,8 @@ public class TripQueryServiceImpl implements ITripQueryService { Waybill::getDepartureName, Waybill::getDepartureAddress, Waybill::getArrivalName, Waybill::getArrivalAddress, Waybill::getDriverName, Waybill::getDriverPhone, Waybill::getVehicleNo, Waybill::getCustomerName, Waybill::getTransportType, Waybill::getTaskRemark, + // 运输类型的三态靠它派生,行级筛选也按它判,必须随行取回 + Waybill::getMasterNo, // 未配载运次没有配载单可依,计划时间要取运单自己的,故必须随行取回 Waybill::getEstimatedStartTime, Waybill::getEstimatedEndTime, Waybill::getCreateTime) .in(Waybill::getBusinessStatus, TripAggregation.CHILD_STATUSES) @@ -285,14 +288,20 @@ public class TripQueryServiceImpl implements ITripQueryService { } /** - * 运输组织类型按子单行筛:它在同一趟车里必然是同一个值(配载的每张子单带同一个配载单号, - * 未配载的每张自成一趟车),所以这一层不会把一趟车拆开。 + * 运输类型按子单行筛,三态分区且不重叠:普通 = 两列都空,配载 = 挂配载单且未挂总单, + * 多式联运 = 挂多联总单(不问有没有配载)。配载这一档必须排掉挂总单的行, + * 否则叠加态的行会同时落进两档。 + *
+ * 与配载/普通两档不同,多式联运在同一趟车里不保证是同一个值:一张配载单可以混装来自不同总单的运单,
+ * 这一档按行筛会把那趟车缩小成只命中总单的那几张子单。混装是少数,此处不为它另走整趟车判据。
*/
private void applyOrgTypeFilter(LambdaQueryWrapper