PC收货修改

This commit is contained in:
秦鸿展
2026-04-01 13:46:05 +08:00
parent 11196e7cf5
commit 2fe868bc51
3 changed files with 219 additions and 61 deletions
@@ -724,6 +724,8 @@ public class StockReceiptOrderDomainService {
/**
* 收货单完成时:按累计已收与计划数量比较,更新明细 receipt_status3 正常收完 / 4 少收 / 5 超收)
* <p>PC 主子行拆分收货时:计划数量只在主行(level=1),子行 quantity 常为 0;须按「主行已收 + 其下子行已收」与主行计划比较,
* 主、子行使用同一状态,避免主行判少收、子行判超收。</p>
*/
private void updateReceiptMaterialDetailReceiptStatusWhenOrderCompleted(StockReceiptOrderPO stockReceiptOrderPO,
LoginUser loginUser, String userRealName) {
@@ -738,15 +740,68 @@ public class StockReceiptOrderDomainService {
if (CollectionUtils.isEmpty(details)) {
return;
}
Map<Long, List<ReceiptMaterialDetail>> childrenByParentUniqueId = new HashMap<>();
for (ReceiptMaterialDetail d : details) {
d.setReceiptStatus(resolveReceiptDetailStatusOnOrderComplete(d.getAlreadyReceiptQuantity(), d.getQuantity()));
d.setUpdateBy(loginUser.getUserid());
d.setUpdateByName(userRealName);
d.setUpdateTime(updateTime);
if (isReceiptDetailChildRow(d) && d.getParentUniqueId() != null) {
childrenByParentUniqueId.computeIfAbsent(d.getParentUniqueId(), k -> new ArrayList<>()).add(d);
}
}
Set<Long> parentUniqueIdsInOrder = details.stream()
.filter(d -> !isReceiptDetailChildRow(d))
.map(ReceiptMaterialDetail::getUniqueId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
for (ReceiptMaterialDetail parent : details) {
if (isReceiptDetailChildRow(parent)) {
continue;
}
Integer status;
List<ReceiptMaterialDetail> children = parent.getUniqueId() == null ? null
: childrenByParentUniqueId.get(parent.getUniqueId());
if (!CollectionUtils.isEmpty(children)) {
BigDecimal groupReceived = nz(parent.getAlreadyReceiptQuantity());
for (ReceiptMaterialDetail ch : children) {
groupReceived = groupReceived.add(nz(ch.getAlreadyReceiptQuantity()));
}
status = resolveReceiptDetailStatusOnOrderComplete(groupReceived, parent.getQuantity());
} else {
status = resolveReceiptDetailStatusOnOrderComplete(parent.getAlreadyReceiptQuantity(), parent.getQuantity());
}
parent.setReceiptStatus(status);
parent.setUpdateBy(loginUser.getUserid());
parent.setUpdateByName(userRealName);
parent.setUpdateTime(updateTime);
if (!CollectionUtils.isEmpty(children)) {
for (ReceiptMaterialDetail ch : children) {
ch.setReceiptStatus(status);
ch.setUpdateBy(loginUser.getUserid());
ch.setUpdateByName(userRealName);
ch.setUpdateTime(updateTime);
}
}
}
// 子行的 parent_unique_id 在本单明细中找不到对应主行时:无法按组合计,仍按单行口径更新
for (ReceiptMaterialDetail d : details) {
if (isReceiptDetailChildRow(d) && d.getParentUniqueId() != null
&& !parentUniqueIdsInOrder.contains(d.getParentUniqueId())) {
d.setReceiptStatus(resolveReceiptDetailStatusOnOrderComplete(d.getAlreadyReceiptQuantity(), d.getQuantity()));
d.setUpdateBy(loginUser.getUserid());
d.setUpdateByName(userRealName);
d.setUpdateTime(updateTime);
}
}
receiptMaterialDetailService.updateBatchById(details);
}
private static boolean isReceiptDetailChildRow(ReceiptMaterialDetail d) {
return d.getLevel() != null && d.getLevel() == 2
&& d.getParentUniqueId() != null && d.getParentUniqueId() != 0L;
}
private static BigDecimal nz(BigDecimal v) {
return v != null ? v : BigDecimal.ZERO;
}
/** 3=已收足 4=少收 5=超收 */
private static Integer resolveReceiptDetailStatusOnOrderComplete(BigDecimal alreadyReceiptQuantity, BigDecimal quantity) {
BigDecimal already = alreadyReceiptQuantity != null ? alreadyReceiptQuantity : BigDecimal.ZERO;