PC上架数量修改

This commit is contained in:
秦鸿展
2026-04-01 15:05:19 +08:00
parent 04875e1715
commit f83b9c8756
2 changed files with 67 additions and 17 deletions
@@ -1033,7 +1033,8 @@ public class StockShelfOrderApplicationService {
//未进行上架直接跳过
continue;
}
BigDecimal actualQuantity = BigDecimal.ZERO;//当前作业上架数
BigDecimal mainItemActualQuantity = shelvesQuantity;//主项本次上架数(不含子项)
BigDecimal childrenActualQuantity = BigDecimal.ZERO;//子项本次上架总数
// PDA 权重/体积/面积:记录“本次增量”
BigDecimal netIncrement = BigDecimal.ZERO;
BigDecimal grossIncrement = BigDecimal.ZERO;
@@ -1047,8 +1048,7 @@ public class StockShelfOrderApplicationService {
// setContainerInfo(shelfMaterialDetailDO);
//上架后 设置该记录不允许被修改
shelfMaterialDetailDO.setAllowModify(2);
//未上过架 统计到当前收货单作业收货数
actualQuantity = shelfMaterialDetailDO.getShelvesQuantity();
// 未上过架:主项本次上架数量已由 shelvesQuantity 表示
}
//判断是否存在子项
List<ShelfMaterialDetailDO> returnShelfMaterialDetailDOChildList = new ArrayList<>();
@@ -1058,7 +1058,7 @@ public class StockShelfOrderApplicationService {
// 从而 alreadyShelvesQuantity 不累计(覆盖问题的根因)。
// 当没有子项时,actualQuantity 应直接等于本次上架数量 shelvesQuantity。
if (CollectionUtils.isEmpty(shelfMaterialDetailDOChildList)) {
actualQuantity = shelvesQuantity;
mainItemActualQuantity = shelvesQuantity;
if (fromApp) {
// 若本次未上架数量(shelvesQuantity=0),则不允许用 PDA 提交的重量更新累计值
// 否则会出现:数量仍为 0,但 total_* 已经被累加到计划值 => pending 全 0
@@ -1100,11 +1100,16 @@ public class StockShelfOrderApplicationService {
areaIncrement = areaIncrement.add(childAreaInc);
}
if (shelfMaterialDetailPOChildDb != null){
// 子项已存在:累加上架数量,并加入返回列表供 batchShelfUpdate 更新(与收货一致,避免重复提交/漏更新)
actualQuantity = actualQuantity.add(childShelvesQty);
// 子项已存在:仅累计到子项总量,不能并到主项累计
childrenActualQuantity = childrenActualQuantity.add(childShelvesQty);
ShelfMaterialDetailDO returnShelfMaterialDetailDOChild = new ShelfMaterialDetailDO();
BeanUtils.copyProperties(shelfMaterialDetailPOChildDb, returnShelfMaterialDetailDOChild);
BeanUtils.copyProperties(shelfMaterialDetailDOChild, returnShelfMaterialDetailDOChild, IgnoreNullUtil.getNullPropertyNames(shelfMaterialDetailDOChild));
BigDecimal childDbAlreadyQty = shelfMaterialDetailPOChildDb.getAlreadyShelvesQuantity() != null
? shelfMaterialDetailPOChildDb.getAlreadyShelvesQuantity()
: BigDecimal.ZERO;
// PCalready_shelves_quantity 使用本次上架量;PDA 保持累计口径
returnShelfMaterialDetailDOChild.setAlreadyShelvesQuantity(fromApp ? childDbAlreadyQty.add(childShelvesQty) : childShelvesQty);
if (fromApp) {
// 子项已存在:total* 回传的是“本次增量”,需要累加到已有 already(并不超过计划)
// oldAlready:优先用 DB 的累计值 total_*。
@@ -1177,6 +1182,8 @@ public class StockShelfOrderApplicationService {
returnShelfMaterialDetailDOChild.setAllowModify(2);
returnShelfMaterialDetailDOChild.setLevel(2);
returnShelfMaterialDetailDOChild.setParentUniqueId(shelfMaterialDetailPO.getUniqueId());
// 子项不维护独立计划数量,计划量仅由主项承载
returnShelfMaterialDetailDOChild.setQuantity(null);
returnShelfMaterialDetailDOChild.setActualQuantity(childShelvesQty);
returnShelfMaterialDetailDOChildList.add(returnShelfMaterialDetailDOChild);
continue;
@@ -1232,6 +1239,8 @@ public class StockShelfOrderApplicationService {
returnShelfMaterialDetailDOChild.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId));
returnShelfMaterialDetailDOChild.setLevel(2);
returnShelfMaterialDetailDOChild.setParentUniqueId(shelfMaterialDetailPO.getUniqueId());
// 子项不维护独立计划数量,计划量仅由主项承载
returnShelfMaterialDetailDOChild.setQuantity(null);
if (shelfMaterialDetailPO.getSerialNumberManage() == 1){
if (CollectionUtils.isEmpty(shelfMaterialDetailPO.getMaterialDetailSerialNumberList())){
throw new ServiceException("物料【" + shelfMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空");
@@ -1239,12 +1248,15 @@ public class StockShelfOrderApplicationService {
}
returnShelfMaterialDetailDOChild.setMaterialDetailSerialNumberList(shelfMaterialDetailDO.getMaterialDetailSerialNumberList());
returnShelfMaterialDetailDOChild.setActualQuantity(returnShelfMaterialDetailDOChild.getShelvesQuantity());
returnShelfMaterialDetailDOChild.setAlreadyShelvesQuantity(childShelvesQty);
returnShelfMaterialDetailDOChildList.add(returnShelfMaterialDetailDOChild);
actualQuantity = actualQuantity.add(returnShelfMaterialDetailDOChild.getShelvesQuantity());
childrenActualQuantity = childrenActualQuantity.add(returnShelfMaterialDetailDOChild.getShelvesQuantity());
}
}
//现在已上架数量=之前已上架数量+现在作业数量
shelfMaterialDetailDO.setAlreadyShelvesQuantity(shelfMaterialDetailPO.getAlreadyShelvesQuantity().add(actualQuantity));
BigDecimal dbParentAlready = shelfMaterialDetailPO.getAlreadyShelvesQuantity() != null
? shelfMaterialDetailPO.getAlreadyShelvesQuantity() : BigDecimal.ZERO;
// PCalready_shelves_quantity 使用本次上架量;PDA 保持累计口径
shelfMaterialDetailDO.setAlreadyShelvesQuantity(fromApp ? dbParentAlready.add(mainItemActualQuantity) : mainItemActualQuantity);
if (fromApp) {
// 父项:total* 回传的是“本次增量”,需要累加到已有 already(并不超过计划)
// oldAlready:优先用 DB 的累计值 total_*。
@@ -1297,11 +1309,25 @@ public class StockShelfOrderApplicationService {
shelfMaterialDetailDO.setTotalVolume(newAlreadyVol);
shelfMaterialDetailDO.setTotalArea(newAlreadyArea);
}
//记录本次上架单上架总数
totalActualQuantity = totalActualQuantity.add(actualQuantity);
//判断上架数量是否大于计划数量
Integer shelvesStatus = judgeShelfQuantity(shelfMaterialDetailDO.getAlreadyShelvesQuantity(), shelfMaterialDetailPO.getQuantity());
// 记录本次上架单上架总数:主项 + 子项(与收货口径一致)
totalActualQuantity = totalActualQuantity.add(mainItemActualQuantity.add(childrenActualQuantity));
// 主项上架状态按「主项 + 子项」组内累计与主项计划比较(子项不单独维护计划量)
BigDecimal groupShelved = shelfMaterialDetailDO.getAlreadyShelvesQuantity() != null
? shelfMaterialDetailDO.getAlreadyShelvesQuantity() : BigDecimal.ZERO;
if (!CollectionUtils.isEmpty(returnShelfMaterialDetailDOChildList)) {
for (ShelfMaterialDetailDO ch : returnShelfMaterialDetailDOChildList) {
BigDecimal childAlready = ch.getAlreadyShelvesQuantity() != null ? ch.getAlreadyShelvesQuantity() : BigDecimal.ZERO;
groupShelved = groupShelved.add(childAlready);
}
}
Integer shelvesStatus = judgeShelfQuantity(groupShelved, shelfMaterialDetailPO.getQuantity());
shelfMaterialDetailDO.setShelvesStatus(shelvesStatus);
// 子项状态与所属主项一致(主子共用主项计划量)
if (!CollectionUtils.isEmpty(returnShelfMaterialDetailDOChildList)) {
for (ShelfMaterialDetailDO ch : returnShelfMaterialDetailDOChildList) {
ch.setShelvesStatus(shelvesStatus);
}
}
if (shelvesStatus > 2){
totalActualShelfMaterialQuantity += 1;
}
@@ -542,11 +542,15 @@ public class StockShelfOrderDomainService {
stockShelfOrder.setShelfOrderId(stockShelfOrderDO.getShelfOrderId());
stockShelfOrder.setStatus(2);
BigDecimal currentShelvesQuantity = stockShelfOrderPO.getShelvesQuantity() != null ? stockShelfOrderPO.getShelvesQuantity() : BigDecimal.ZERO;
BigDecimal actualQuantity = stockShelfOrderDO.getActualQuantity() != null ? stockShelfOrderDO.getActualQuantity() : BigDecimal.ZERO;
BigDecimal reduce = stockShelfOrderDO.getMaterialDetailList().stream().map(ShelfMaterialDetailDO::getShelvesQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
// PDAfromApp=true)累加已有上架数量;PC 直接覆盖
BigDecimal orderIncrementQuantity = stockShelfOrderDO.getActualQuantity() != null ? stockShelfOrderDO.getActualQuantity() : BigDecimal.ZERO;
// PDAfromApp=true):本单本次作业量 = assembleParamByShelf 汇总的 actualQuantity(含主行+子行),累加到单头
// PC:单头「上架数量」= 各明细累计已上架数量之和(递归含子行),不可仅顶层 shelvesQuantity 汇总,否则子行数量漏计、统计与完成判断错误
boolean fromApp = Boolean.TRUE.equals(stockShelfOrderDO.getFromApp());
stockShelfOrder.setShelvesQuantity(fromApp ? currentShelvesQuantity.add(reduce) : reduce);
if (fromApp) {
stockShelfOrder.setShelvesQuantity(currentShelvesQuantity.add(orderIncrementQuantity));
} else {
stockShelfOrder.setShelvesQuantity(sumShelfDetailAlreadyShelvesQuantityRecursive(stockShelfOrderDO.getMaterialDetailList()));
}
stockShelfOrder.setShelvesMaterialQuantity(stockShelfOrderPO.getShelvesMaterialQuantity() + stockShelfOrderDO.getActualReceiptMaterialQuantity());
stockShelfOrder.setUpdateBy(loginUser.getUserid());
stockShelfOrder.setUpdateByName(loginUser.getUsername());
@@ -560,6 +564,26 @@ public class StockShelfOrderDomainService {
return true;
}
/**
* 递归汇总上架明细的累计已上架数量(主行 + 子行),用于 PC 端写入上架单头 shelves_quantity。
*/
private BigDecimal sumShelfDetailAlreadyShelvesQuantityRecursive(List<ShelfMaterialDetailDO> list) {
if (CollectionUtils.isEmpty(list)) {
return BigDecimal.ZERO;
}
BigDecimal sum = BigDecimal.ZERO;
for (ShelfMaterialDetailDO d : list) {
if (d == null) {
continue;
}
if (d.getAlreadyShelvesQuantity() != null) {
sum = sum.add(d.getAlreadyShelvesQuantity());
}
sum = sum.add(sumShelfDetailAlreadyShelvesQuantityRecursive(d.getChildren()));
}
return sum;
}
/**
* @param stockShelfOrderPO
* @param status 入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入