🐛 运输类型筛选改按整趟车判,修正配载与多式联运双重计数
行级 SQL 筛会把混装挂总单与不挂总单的配载单劈成两档:同一趟车同时出现在配载运输与多式联运,两档各只剩命中的子单,卡片上的运单数、货物与重量缩水,三档数目之和大于全部。判据移到服务层 matchesOrgType,按整趟车的子单集合分档。
This commit is contained in:
+19
-16
@@ -186,8 +186,8 @@ public class TripQueryServiceImpl implements ITripQueryService {
|
||||
/**
|
||||
* 全部可见运次:一次取回运单行后在服务层分组、分档、筛选并按排序键倒序
|
||||
* <p>
|
||||
* 分档用过程配置与接单态推导,于是 Tab 与卡片必然同档;行级筛选(组织类型 / 异常 / 创建时间)落在库层,
|
||||
* 命中的行同时决定这一趟车的子单集合与分档。
|
||||
* 分档用过程配置与接单态推导,于是 Tab 与卡片必然同档;异常与创建时间按整趟车的子单集合判,
|
||||
* 运输类型也在这里判——三者都不在库层筛行,否则一趟车会被劈成两半、三档数目加起来对不上全部。
|
||||
*/
|
||||
private List<TripRows> trips(TripQueryVO condition) {
|
||||
Map<String, List<Waybill>> grouped = new LinkedHashMap<>();
|
||||
@@ -203,7 +203,7 @@ public class TripQueryServiceImpl implements ITripQueryService {
|
||||
return;
|
||||
}
|
||||
List<Waybill> children = sortedChildren(rows);
|
||||
if (!inScope(children, condition)) {
|
||||
if (!matchesOrgType(children, condition.getTransportOrgType()) || !inScope(children, condition)) {
|
||||
return;
|
||||
}
|
||||
boolean requireAccept = TripAggregation.requiresAccept(children);
|
||||
@@ -255,7 +255,6 @@ public class TripQueryServiceImpl implements ITripQueryService {
|
||||
applyScope(wrapper, condition);
|
||||
applyDeptScope(wrapper, condition);
|
||||
applyProjectScope(wrapper, condition);
|
||||
applyOrgTypeFilter(wrapper, condition);
|
||||
applyKeyword(wrapper, condition.getKeyword());
|
||||
List<Waybill> rows = waybillService.list(wrapper);
|
||||
applyLiveProcessConfig(rows);
|
||||
@@ -288,21 +287,25 @@ public class TripQueryServiceImpl implements ITripQueryService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 运输类型按子单行筛,三态分区且不重叠:普通 = 两列都空,配载 = 挂配载单且未挂总单,
|
||||
* 多式联运 = 挂多联总单(不问有没有配载)。配载这一档必须排掉挂总单的行,
|
||||
* 否则叠加态的行会同时落进两档。
|
||||
* 运输类型按整趟车判,三档互斥且覆盖全部运次:普通 = 不挂配载单也不挂总单,
|
||||
* 配载 = 挂配载单且整趟车没挂总单,多式联运 = 任一子单挂总单(不问有没有配载)。
|
||||
* <p>
|
||||
* 与配载/普通两档不同,多式联运在同一趟车里不保证是同一个值:一张配载单可以混装来自不同总单的运单,
|
||||
* 这一档按行筛会把那趟车缩小成只命中总单的那几张子单。混装是少数,此处不为它另走整趟车判据。
|
||||
* 不能按子单行筛:一张配载单可以混装挂总单与不挂总单的运单,行级筛会让同一趟车同时落进
|
||||
* 配载与多式联运两档,而每档里只剩命中的那部分子单——卡片上的运单数、货物与重量都会缩水,
|
||||
* 三个档的数目加起来也对不上「全部」。判据只能落在取回后的整趟车集合上。
|
||||
*/
|
||||
private void applyOrgTypeFilter(LambdaQueryWrapper<Waybill> wrapper, TripQueryVO condition) {
|
||||
if (TRANSPORT_MULTIMODAL.equals(condition.getTransportOrgType())) {
|
||||
wrapper.apply("IFNULL(master_no, '') <> ''");
|
||||
} else if (TRANSPORT_LOAD.equals(condition.getTransportOrgType())) {
|
||||
wrapper.apply("IFNULL(loading_no, '') <> '' AND IFNULL(master_no, '') = ''");
|
||||
} else if (TRANSPORT_COMMON.equals(condition.getTransportOrgType())) {
|
||||
wrapper.apply("IFNULL(loading_no, '') = '' AND IFNULL(master_no, '') = ''");
|
||||
private static boolean matchesOrgType(List<Waybill> children, String transportOrgType) {
|
||||
if (Func.isBlank(transportOrgType)) {
|
||||
return true;
|
||||
}
|
||||
boolean multimodal = children.stream().anyMatch(child -> Func.isNotBlank(child.getMasterNo()));
|
||||
boolean loaded = children.stream().anyMatch(child -> Func.isNotBlank(child.getLoadingNo()));
|
||||
return switch (transportOrgType) {
|
||||
case TRANSPORT_MULTIMODAL -> multimodal;
|
||||
case TRANSPORT_LOAD -> loaded && !multimodal;
|
||||
case TRANSPORT_COMMON -> !loaded && !multimodal;
|
||||
default -> true;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user