fix(wms):total_volume,total_area字段可为空

This commit is contained in:
zhaoqing
2026-08-12 17:53:31 +08:00
parent 5cf46604fa
commit df51abe33f
@@ -492,6 +492,8 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
}
//保存物料明细信息
saveOrUpdateBatch(receiptMaterialDetailList);
// total_volume/total_area 为空时强制落库 NULL(绕开 MyBatis-Plus NOT_NULL 更新策略)
applyForcedNullTotalMetrics(receiptMaterialDetailList);
//批量新增/更新物料更多属性:保留已有值,仅更新有值的属性,不再先删后插
mergeMaterialMoreDetail(materialMoreDetailList, stockReceiptOrderDO, receiptMaterialDetailDOList);
//批量新增/更新物料更多属性:先删除该收货单下所有明细的旧批次属性,再插入新值,避免重复插入导致更新失效
@@ -657,6 +659,49 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
return val != null && val.compareTo(BigDecimal.ZERO) == 0;
}
/**
* total_volume / total_area 为空时强制 UPDATE 置 NULL。
* 仅对已存在明细(material_detail_id 非空)生效;新插入行由实体空值自然得到 null。
*/
private void applyForcedNullTotalMetrics(List<ReceiptMaterialDetail> receiptMaterialDetailList) {
if (CollectionUtils.isEmpty(receiptMaterialDetailList)) {
return;
}
// 列名组合 -> materialDetailId 列表(total_volume / total_area / 两者)
Map<String, List<Long>> columnsToIds = new HashMap<>();
for (ReceiptMaterialDetail detail : receiptMaterialDetailList) {
if (detail == null || detail.getMaterialDetailId() == null) {
continue;
}
StringBuilder columns = new StringBuilder();
if (detail.getTotalVolume() == null) {
columns.append("total_volume");
}
if (detail.getTotalArea() == null) {
if (columns.length() > 0) {
columns.append(",");
}
columns.append("total_area");
}
if (columns.length() == 0) {
continue;
}
columnsToIds.computeIfAbsent(columns.toString(), k -> new ArrayList<>())
.add(detail.getMaterialDetailId());
}
if (columnsToIds.isEmpty()) {
return;
}
for (Map.Entry<String, List<Long>> entry : columnsToIds.entrySet()) {
UpdateWrapper<ReceiptMaterialDetail> wrapper = new UpdateWrapper<>();
for (String column : entry.getKey().split(",")) {
wrapper.set(column, null);
}
wrapper.in("material_detail_id", entry.getValue());
receiptMaterialDetailMapper.update(null, wrapper);
}
}
private void setMore(ReceiptMaterialDetailDO receiptMaterialDetailDO) {
List<MaterialMoreDetailDO> materialMoreDetailList = receiptMaterialDetailDO.getMaterialMoreDetailList();
if (!CollectionUtils.isEmpty(materialMoreDetailList)) {