feat(delivery): 新增钢卷绑定信息查询功能并优化发货单明细校验
- 在 WmsDeliveryWaybillDetailMapper 中新增按钢卷ID批量查询和单个查询绑定来源信息的方法 - 在 Mapper XML 文件中新增 WmsCoilBindInfoResult 结果映射和两个查询SQL - 在 WmsDeliveryWaybillDetailServiceImpl 的数据校验方法中实现钢卷重复绑定检查 - 新增 WmsCoilBindInfoVo 类用于封装钢卷绑定信息 - 在 WmsMaterialCoilBo 中新增 excludeBound 和 includeBindInfo 参数控制绑定逻辑 - 在 WmsMaterialCoilServiceImpl 中实现钢卷列表的绑定信息查询和排除逻辑 - 在 WmsMaterialCoilVo 中新增绑定相关字段用于前端显示 - 优化发货单明细保存前的数据校验,防止钢卷重复绑定并提供详细的绑定来源提示
This commit is contained in:
@@ -70,6 +70,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
private final WmsDeliveryPlanMapper deliveryPlanMapper;
|
||||
private final WmsProductMapper productMapper;
|
||||
private final WmsRawMaterialMapper rawMaterialMapper;
|
||||
private final WmsDeliveryWaybillDetailMapper deliveryWaybillDetailMapper;
|
||||
|
||||
/**
|
||||
* 查询钢卷物料表
|
||||
@@ -305,6 +306,47 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
// 批量查询当前页钢卷的“发货单明细绑定”信息(用于禁选/置灰/提示来源)
|
||||
// 仅当前端明确需要时才查询,避免不必要的性能开销
|
||||
if (Boolean.TRUE.equals(bo.getIncludeBindInfo())) {
|
||||
try {
|
||||
List<Long> coilIds = records.stream()
|
||||
.map(WmsMaterialCoilVo::getCoilId)
|
||||
.filter(Objects::nonNull)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (!coilIds.isEmpty()) {
|
||||
Map<Long, WmsCoilBindInfoVo> bindMap = deliveryWaybillDetailMapper
|
||||
.selectBindInfoByCoilIds(coilIds)
|
||||
.stream()
|
||||
.collect(Collectors.toMap(
|
||||
WmsCoilBindInfoVo::getCoilId,
|
||||
v -> v,
|
||||
(a, b) -> a
|
||||
));
|
||||
|
||||
for (WmsMaterialCoilVo vo : records) {
|
||||
WmsCoilBindInfoVo bind = bindMap.get(vo.getCoilId());
|
||||
if (bind != null) {
|
||||
vo.setBound(Boolean.TRUE);
|
||||
vo.setBindDetailId(bind.getDetailId());
|
||||
vo.setBindWaybillId(bind.getWaybillId());
|
||||
vo.setBindWaybillNo(bind.getWaybillNo());
|
||||
vo.setBindWaybillName(bind.getWaybillName());
|
||||
vo.setBindPlanId(bind.getPlanId());
|
||||
vo.setBindPlanName(bind.getPlanName());
|
||||
vo.setBindPlanDate(bind.getPlanDate());
|
||||
} else {
|
||||
vo.setBound(Boolean.FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception ignore) {
|
||||
// 绑定信息属于增强字段,查询失败时不影响钢卷列表主流程
|
||||
}
|
||||
}
|
||||
|
||||
Set<String> userNames = records.stream()
|
||||
.flatMap(v -> java.util.stream.Stream.of(v.getCreateBy(), v.getUpdateBy(), v.getExportBy()))
|
||||
.filter(StringUtils::isNotBlank)
|
||||
@@ -408,6 +450,11 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
qw.in("mc.quality_status", java.util.Arrays.asList("C+", "C", "C-", "D+", "D", "D-"));
|
||||
}
|
||||
|
||||
// 排除已被发货单明细绑定的钢卷(SQL级过滤,分页总数准确)
|
||||
if (Boolean.TRUE.equals(bo.getExcludeBound())) {
|
||||
qw.apply("NOT EXISTS (SELECT 1 FROM wms_delivery_waybill_detail d WHERE d.del_flag = 0 AND d.coil_id = mc.coil_id)");
|
||||
}
|
||||
|
||||
// 组合 item_id 条件:改为使用 EXISTS 子查询,替代预查询 + IN
|
||||
boolean hasSelectType = StringUtils.isNotBlank(bo.getSelectType());
|
||||
boolean hasAnyItemFilter = StringUtils.isNotBlank(bo.getItemMaterial())
|
||||
|
||||
Reference in New Issue
Block a user