PC收货修改
This commit is contained in:
+59
-4
@@ -724,6 +724,8 @@ public class StockReceiptOrderDomainService {
|
||||
|
||||
/**
|
||||
* 收货单完成时:按累计已收与计划数量比较,更新明细 receipt_status(3 正常收完 / 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;
|
||||
|
||||
Reference in New Issue
Block a user