入库单明细收货数量
This commit is contained in:
+6
-21
@@ -73,28 +73,13 @@ public class StockInOrderApplicationService {
|
||||
if (topOrganizationId != null && topOrganizationId != 1){
|
||||
stockInOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
|
||||
}
|
||||
try {
|
||||
// 直接从数据库查询当前登录用户选择的仓库,不使用缓存
|
||||
AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoFromDb(loginUser.getUserid());
|
||||
if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) {
|
||||
AssociationWarehouseCacheDO associationWarehouseCacheDO = JSON.parseObject(
|
||||
JSONObject.toJSONString(ajaxResult.get("data")),
|
||||
AssociationWarehouseCacheDO.class);
|
||||
if (associationWarehouseCacheDO != null) {
|
||||
if (associationWarehouseCacheDO.getWarehouseId() != null) {
|
||||
stockInOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId());
|
||||
}
|
||||
if (StringUtils.isNotBlank(associationWarehouseCacheDO.getWarehouseCode())) {
|
||||
stockInOrderDO.setWarehouseCode(associationWarehouseCacheDO.getWarehouseCode());
|
||||
}
|
||||
if (StringUtils.isNotBlank(associationWarehouseCacheDO.getWarehouseName())) {
|
||||
stockInOrderDO.setWarehouseName(associationWarehouseCacheDO.getWarehouseName());
|
||||
}
|
||||
}
|
||||
// 前端有传warehouseId则优先使用传参;未传时才使用"用户关联仓库"作为默认值
|
||||
if (stockInOrderDO.getWarehouseId() == null) {
|
||||
AssociationWarehouseCacheDO associationWarehouseCacheDO =
|
||||
SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid());
|
||||
if (associationWarehouseCacheDO != null) {
|
||||
stockInOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// 如果获取仓库信息失败,记录日志但不影响查询(允许查询所有仓库)
|
||||
log.warn("获取用户关联仓库信息失败,将查询所有仓库数据,用户ID:{},错误:{}", loginUser.getUserid(), e.getMessage());
|
||||
}
|
||||
}
|
||||
return stockInOrderDomainService.queryList(stockInOrderDO);
|
||||
|
||||
+165
@@ -26,7 +26,12 @@ import com.mhd.wms.domain.materialWarehouseControl.repository.facade.IMaterialWa
|
||||
import com.mhd.wms.domain.materialWarehouseControl.repository.po.MaterialWarehouseControlPO;
|
||||
import com.mhd.wms.domain.qualityInspection.repository.facade.IQualityInspectionService;
|
||||
import com.mhd.wms.domain.qualityInspection.repository.todo.QualityInspectionDO;
|
||||
import com.mhd.wms.domain.receiptMaterialDetail.repository.facade.IReceiptMaterialDetailService;
|
||||
import com.mhd.wms.domain.receiptMaterialDetail.repository.po.ReceiptMaterialDetailPO;
|
||||
import com.mhd.wms.domain.receiptMaterialDetail.repository.todo.ReceiptMaterialDetailDO;
|
||||
import com.mhd.wms.domain.shelfMaterialDetail.repository.facade.IShelfMaterialDetailService;
|
||||
import com.mhd.wms.domain.shelfMaterialDetail.repository.po.ShelfMaterialDetailPO;
|
||||
import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetailDO;
|
||||
import com.mhd.wms.domain.stockInOrder.entity.StockInOrder;
|
||||
import com.mhd.wms.domain.stockInOrder.repository.facade.IStockInOrderService;
|
||||
import com.mhd.wms.domain.stockInOrder.repository.po.StockInOrderPO;
|
||||
@@ -34,6 +39,9 @@ import com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO;
|
||||
import com.mhd.wms.domain.stockReceiptOrder.repository.po.StockReceiptOrderPO;
|
||||
import com.mhd.wms.domain.stockReceiptOrder.repository.todo.StockReceiptOrderDO;
|
||||
import com.mhd.wms.domain.stockReceiptOrder.service.StockReceiptOrderDomainService;
|
||||
import com.mhd.wms.domain.stockShelfOrder.repository.po.StockShelfOrderPO;
|
||||
import com.mhd.wms.domain.stockShelfOrder.repository.todo.StockShelfOrderDO;
|
||||
import com.mhd.wms.domain.stockShelfOrder.service.StockShelfOrderDomainService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -62,6 +70,8 @@ public class StockInOrderDomainService {
|
||||
@Autowired
|
||||
private StockReceiptOrderDomainService stockReceiptOrderDomainService;
|
||||
@Autowired
|
||||
private StockShelfOrderDomainService stockShelfOrderDomainService;
|
||||
@Autowired
|
||||
private IQualityInspectionService qualityInspectionService;
|
||||
@Autowired
|
||||
private IMaterialBaseInfoService materialBaseInfoService;
|
||||
@@ -71,6 +81,10 @@ public class StockInOrderDomainService {
|
||||
private IMaterialWarehouseControlService materialWarehouseControlService;
|
||||
@Autowired
|
||||
private SystemServiceFeign systemServiceFeign;
|
||||
@Autowired
|
||||
private IReceiptMaterialDetailService receiptMaterialDetailService;
|
||||
@Autowired
|
||||
private IShelfMaterialDetailService shelfMaterialDetailService;
|
||||
|
||||
/**
|
||||
* 分页查询入库单列表
|
||||
@@ -180,10 +194,161 @@ public class StockInOrderDomainService {
|
||||
inMaterialDetailDO.setInOrderNumber(stockInOrderPO.getInOrderNumber());
|
||||
inMaterialDetailDO.setLevel(1);
|
||||
List<InMaterialDetailPO> inMaterialDetailPOList = materialDetailService.queryList(inMaterialDetailDO);
|
||||
|
||||
// 先通过入库单号查询收货单列表
|
||||
StockReceiptOrderDO stockReceiptOrderDO = new StockReceiptOrderDO();
|
||||
stockReceiptOrderDO.setInOrderNumber(stockInOrderPO.getInOrderNumber());
|
||||
List<StockReceiptOrderPO> stockReceiptOrderPOList = stockReceiptOrderDomainService.queryList(stockReceiptOrderDO);
|
||||
|
||||
// 先通过入库单号查询上架单列表
|
||||
StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO();
|
||||
stockShelfOrderDO.setInOrderNumber(stockInOrderPO.getInOrderNumber());
|
||||
List<StockShelfOrderPO> stockShelfOrderPOList = stockShelfOrderDomainService.queryList(stockShelfOrderDO);
|
||||
|
||||
// 查询收货单明细,用于填充收货数量和更新毛重、净重、面积、体积
|
||||
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOList = new ArrayList<>();
|
||||
if (!CollectionUtils.isEmpty(stockReceiptOrderPOList)) {
|
||||
List<String> receiptOrderNumberList = stockReceiptOrderPOList.stream()
|
||||
.map(StockReceiptOrderPO::getReceiptOrderNumber)
|
||||
.filter(StringUtils::isNotBlank)
|
||||
.collect(Collectors.toList());
|
||||
if (!CollectionUtils.isEmpty(receiptOrderNumberList)) {
|
||||
ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO();
|
||||
receiptMaterialDetailDO.setReceiptOrderNumberList(receiptOrderNumberList);
|
||||
receiptMaterialDetailPOList = receiptMaterialDetailService.queryList(receiptMaterialDetailDO);
|
||||
}
|
||||
}
|
||||
|
||||
// 查询上架单明细,用于填充上架数量
|
||||
List<ShelfMaterialDetailPO> shelfMaterialDetailPOList = new ArrayList<>();
|
||||
if (!CollectionUtils.isEmpty(stockShelfOrderPOList)) {
|
||||
for (StockShelfOrderPO stockShelfOrderPO : stockShelfOrderPOList) {
|
||||
if (StringUtils.isNotBlank(stockShelfOrderPO.getShelfOrderNumber())) {
|
||||
ShelfMaterialDetailDO shelfMaterialDetailDO = new ShelfMaterialDetailDO();
|
||||
shelfMaterialDetailDO.setShelfOrderNumber(stockShelfOrderPO.getShelfOrderNumber());
|
||||
List<ShelfMaterialDetailPO> shelfDetails = shelfMaterialDetailService.queryList(shelfMaterialDetailDO);
|
||||
if (!CollectionUtils.isEmpty(shelfDetails)) {
|
||||
shelfMaterialDetailPOList.addAll(shelfDetails);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 按 materialDetailId 分组汇总收货数量和上架数量,以及更新毛重、净重、面积、体积
|
||||
if (!CollectionUtils.isEmpty(inMaterialDetailPOList)) {
|
||||
// 按 materialDetailId 分组汇总收货数量(实际收货数量)、毛重、净重、面积、体积
|
||||
// 收货数量:入库单对应的收货单实际收货数量汇总
|
||||
Map<Long, ReceiptMaterialDetailPO> receiptDetailMap = new HashMap<>();
|
||||
if (!CollectionUtils.isEmpty(receiptMaterialDetailPOList)) {
|
||||
// 递归处理所有层级的收货单明细(包括子明细)
|
||||
for (ReceiptMaterialDetailPO receiptDetail : receiptMaterialDetailPOList) {
|
||||
processReceiptDetail(receiptDetail, receiptDetailMap);
|
||||
}
|
||||
}
|
||||
|
||||
// 按 materialDetailId 分组汇总上架数量(实际上架数量)
|
||||
// 上架数量:入库单对应的上架单实际上架数量汇总
|
||||
Map<Long, BigDecimal> shelfQuantityMap = new HashMap<>();
|
||||
if (!CollectionUtils.isEmpty(shelfMaterialDetailPOList)) {
|
||||
for (ShelfMaterialDetailPO shelfDetail : shelfMaterialDetailPOList) {
|
||||
if (shelfDetail.getMaterialDetailId() != null && shelfDetail.getShelvesQuantity() != null) {
|
||||
Long materialDetailId = shelfDetail.getMaterialDetailId();
|
||||
BigDecimal shelvesQuantity = shelfQuantityMap.getOrDefault(materialDetailId, BigDecimal.ZERO);
|
||||
shelfQuantityMap.put(materialDetailId, shelvesQuantity.add(shelfDetail.getShelvesQuantity()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 填充入库单明细的收货数量、上架数量,以及更新毛重、净重、面积、体积
|
||||
for (InMaterialDetailPO inMaterialDetail : inMaterialDetailPOList) {
|
||||
Long materialDetailId = inMaterialDetail.getMaterialDetailId();
|
||||
if (materialDetailId != null) {
|
||||
// 填充收货数量(入库单对应的收货单实际收货数量)
|
||||
ReceiptMaterialDetailPO receiptDetail = receiptDetailMap.get(materialDetailId);
|
||||
if (receiptDetail != null) {
|
||||
// 更新收货数量
|
||||
if (receiptDetail.getReceiptQuantity() != null) {
|
||||
inMaterialDetail.setReceiptQuantity(receiptDetail.getReceiptQuantity());
|
||||
}
|
||||
|
||||
// 更新毛重、净重、面积、体积(根据收货时所填的明细行数据更新到入库单明细中)
|
||||
// 将收货单明细中填写的数据汇总后更新到入库单明细
|
||||
if (receiptDetail.getTotalGrossWeight() != null) {
|
||||
inMaterialDetail.setTotalGrossWeight(receiptDetail.getTotalGrossWeight());
|
||||
}
|
||||
if (receiptDetail.getTotalNetWeight() != null) {
|
||||
inMaterialDetail.setTotalNetWeight(receiptDetail.getTotalNetWeight());
|
||||
}
|
||||
if (receiptDetail.getTotalArea() != null) {
|
||||
inMaterialDetail.setTotalArea(receiptDetail.getTotalArea());
|
||||
}
|
||||
if (receiptDetail.getTotalVolume() != null) {
|
||||
inMaterialDetail.setTotalVolume(receiptDetail.getTotalVolume());
|
||||
}
|
||||
}
|
||||
|
||||
// 填充上架数量(入库单对应的上架单实际上架数量)
|
||||
BigDecimal shelvesQuantity = shelfQuantityMap.get(materialDetailId);
|
||||
if (shelvesQuantity != null) {
|
||||
inMaterialDetail.setShelvesQuantity(shelvesQuantity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stockInOrderPO.setMaterialDetailList(inMaterialDetailPOList);
|
||||
return stockInOrderPO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归处理收货单明细,汇总毛重、净重、面积、体积
|
||||
* @param receiptDetail 收货单明细
|
||||
* @param receiptDetailMap 收货单明细汇总Map
|
||||
*/
|
||||
private void processReceiptDetail(ReceiptMaterialDetailPO receiptDetail, Map<Long, ReceiptMaterialDetailPO> receiptDetailMap) {
|
||||
if (receiptDetail == null || receiptDetail.getMaterialDetailId() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Long materialDetailId = receiptDetail.getMaterialDetailId();
|
||||
ReceiptMaterialDetailPO existing = receiptDetailMap.get(materialDetailId);
|
||||
|
||||
if (existing == null) {
|
||||
// 如果不存在,直接放入Map
|
||||
receiptDetailMap.put(materialDetailId, receiptDetail);
|
||||
} else {
|
||||
// 如果已存在,汇总收货数量、毛重、净重、面积、体积
|
||||
// 汇总收货数量(实际收货数量)
|
||||
BigDecimal receiptQuantity = existing.getReceiptQuantity() != null ? existing.getReceiptQuantity() : BigDecimal.ZERO;
|
||||
BigDecimal newReceiptQuantity = receiptDetail.getReceiptQuantity() != null ? receiptDetail.getReceiptQuantity() : BigDecimal.ZERO;
|
||||
existing.setReceiptQuantity(receiptQuantity.add(newReceiptQuantity));
|
||||
|
||||
// 汇总毛重、净重、面积、体积(根据收货时填写的数据)
|
||||
// 累加所有收货单明细的毛重、净重、面积、体积
|
||||
BigDecimal existingGrossWeight = existing.getTotalGrossWeight() != null ? existing.getTotalGrossWeight() : BigDecimal.ZERO;
|
||||
BigDecimal newGrossWeight = receiptDetail.getTotalGrossWeight() != null ? receiptDetail.getTotalGrossWeight() : BigDecimal.ZERO;
|
||||
existing.setTotalGrossWeight(existingGrossWeight.add(newGrossWeight));
|
||||
|
||||
BigDecimal existingNetWeight = existing.getTotalNetWeight() != null ? existing.getTotalNetWeight() : BigDecimal.ZERO;
|
||||
BigDecimal newNetWeight = receiptDetail.getTotalNetWeight() != null ? receiptDetail.getTotalNetWeight() : BigDecimal.ZERO;
|
||||
existing.setTotalNetWeight(existingNetWeight.add(newNetWeight));
|
||||
|
||||
BigDecimal existingArea = existing.getTotalArea() != null ? existing.getTotalArea() : BigDecimal.ZERO;
|
||||
BigDecimal newArea = receiptDetail.getTotalArea() != null ? receiptDetail.getTotalArea() : BigDecimal.ZERO;
|
||||
existing.setTotalArea(existingArea.add(newArea));
|
||||
|
||||
BigDecimal existingVolume = existing.getTotalVolume() != null ? existing.getTotalVolume() : BigDecimal.ZERO;
|
||||
BigDecimal newVolume = receiptDetail.getTotalVolume() != null ? receiptDetail.getTotalVolume() : BigDecimal.ZERO;
|
||||
existing.setTotalVolume(existingVolume.add(newVolume));
|
||||
}
|
||||
|
||||
// 递归处理子明细
|
||||
if (!CollectionUtils.isEmpty(receiptDetail.getChildren())) {
|
||||
for (ReceiptMaterialDetailPO child : receiptDetail.getChildren()) {
|
||||
processReceiptDetail(child, receiptDetailMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 审核入库单
|
||||
|
||||
+194
@@ -24,6 +24,7 @@ import com.mhd.wms.domain.containerUsageRecord.repository.facade.IContainerUsage
|
||||
import com.mhd.wms.domain.containerUsageRecord.repository.todo.ContainerUsageRecordDO;
|
||||
import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskService;
|
||||
import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO;
|
||||
import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail;
|
||||
import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailService;
|
||||
import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO;
|
||||
import com.mhd.wms.domain.inMaterialDetailSerialNumber.repository.facade.IInMaterialDetailSerialNumberService;
|
||||
@@ -388,6 +389,8 @@ public class StockReceiptOrderDomainService {
|
||||
genInventoryStandingReport(stockReceiptOrderPO, stockReceiptOrderDO);
|
||||
//修改物料明细信息
|
||||
receiptMaterialDetailService.batchReceiptUpdate(stockReceiptOrderDO);
|
||||
//同步更新入库单明细的收货数量、总毛重、总净重、总面积、总体积
|
||||
syncUpdateInMaterialDetailFromReceipt(stockReceiptOrderDO, stockReceiptOrderPO);
|
||||
//生成 收货作业单
|
||||
genStockReceiptTaskOrderByReceivingGoods(stockReceiptOrderPO,stockReceiptOrderDO);
|
||||
//收货后上架前 生成质检
|
||||
@@ -400,6 +403,197 @@ public class StockReceiptOrderDomainService {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 同步更新入库单明细的收货数量、总毛重、总净重、总面积、总体积
|
||||
* 根据收货单明细中填写的数据,按materialDetailId分组汇总后更新到入库单明细
|
||||
* @param stockReceiptOrderDO 收货单DO
|
||||
* @param stockReceiptOrderPO 收货单PO(可选,如果为null则从DO中获取)
|
||||
*/
|
||||
private void syncUpdateInMaterialDetailFromReceipt(StockReceiptOrderDO stockReceiptOrderDO, StockReceiptOrderPO stockReceiptOrderPO) {
|
||||
if (stockReceiptOrderDO == null || StringUtils.isBlank(stockReceiptOrderDO.getReceiptOrderNumber())) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取入库单号
|
||||
String inOrderNumber = stockReceiptOrderDO.getInOrderNumber();
|
||||
if (StringUtils.isBlank(inOrderNumber) && stockReceiptOrderPO != null) {
|
||||
inOrderNumber = stockReceiptOrderPO.getInOrderNumber();
|
||||
}
|
||||
if (StringUtils.isBlank(inOrderNumber) && stockReceiptOrderDO.getReceiptOrderId() != null) {
|
||||
// 如果收货单DO中没有入库单号,从收货单PO中获取
|
||||
StockReceiptOrderPO receiptOrderPO = stockReceiptOrderService.getInfo(stockReceiptOrderDO.getReceiptOrderId());
|
||||
if (receiptOrderPO != null) {
|
||||
inOrderNumber = receiptOrderPO.getInOrderNumber();
|
||||
}
|
||||
}
|
||||
|
||||
if (StringUtils.isBlank(inOrderNumber)) {
|
||||
log.warn("收货单【{}】没有关联的入库单号,无法同步更新入库单明细", stockReceiptOrderDO.getReceiptOrderNumber());
|
||||
return;
|
||||
}
|
||||
|
||||
log.info("开始同步更新入库单【{}】的明细,收货单号:{}", inOrderNumber, stockReceiptOrderDO.getReceiptOrderNumber());
|
||||
|
||||
// 查询该入库单对应的所有收货单
|
||||
StockReceiptOrderDO queryReceiptOrderDO = new StockReceiptOrderDO();
|
||||
queryReceiptOrderDO.setInOrderNumber(inOrderNumber);
|
||||
List<StockReceiptOrderPO> receiptOrderPOList = stockReceiptOrderService.queryList(queryReceiptOrderDO);
|
||||
|
||||
if (CollectionUtils.isEmpty(receiptOrderPOList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取所有收货单号
|
||||
List<String> receiptOrderNumberList = receiptOrderPOList.stream()
|
||||
.map(StockReceiptOrderPO::getReceiptOrderNumber)
|
||||
.filter(StringUtils::isNotBlank)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (CollectionUtils.isEmpty(receiptOrderNumberList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 从数据库查询该入库单对应的所有收货单明细(包括已更新的数据)
|
||||
ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO();
|
||||
receiptMaterialDetailDO.setReceiptOrderNumberList(receiptOrderNumberList);
|
||||
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOList = receiptMaterialDetailService.queryList(receiptMaterialDetailDO);
|
||||
|
||||
if (CollectionUtils.isEmpty(receiptMaterialDetailPOList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 按unique_id(入库单明细的唯一标识)分组汇总收货数量、总毛重、总净重、总面积、总体积
|
||||
// 注意:收货单明细的material_detail_id和入库单明细的material_detail_id是不同的
|
||||
// 需要通过in_unique_id(收货单明细)关联到unique_id(入库单明细)
|
||||
Map<Long, Map<String, BigDecimal>> uniqueIdSummaryMap = new HashMap<>();
|
||||
|
||||
// 递归处理所有层级的收货单明细
|
||||
for (ReceiptMaterialDetailPO receiptDetail : receiptMaterialDetailPOList) {
|
||||
processReceiptDetailPOForSync(receiptDetail, uniqueIdSummaryMap);
|
||||
}
|
||||
|
||||
// 批量更新入库单明细
|
||||
if (!uniqueIdSummaryMap.isEmpty()) {
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
Date updateTime = new Date();
|
||||
|
||||
log.info("开始同步更新入库单【{}】的明细,共{}个明细需要更新", inOrderNumber, uniqueIdSummaryMap.size());
|
||||
|
||||
for (Map.Entry<Long, Map<String, BigDecimal>> entry : uniqueIdSummaryMap.entrySet()) {
|
||||
Long uniqueId = entry.getKey(); // 这是入库单明细的unique_id
|
||||
Map<String, BigDecimal> summary = entry.getValue();
|
||||
|
||||
UpdateWrapper<InMaterialDetail> updateWrapper = new UpdateWrapper<>();
|
||||
updateWrapper.eq("unique_id", uniqueId);
|
||||
updateWrapper.eq("in_order_number", inOrderNumber);
|
||||
updateWrapper.eq("del_flag", 1);
|
||||
|
||||
boolean hasUpdate = false;
|
||||
|
||||
// 更新收货数量
|
||||
if (summary.containsKey("receiptQuantity") && summary.get("receiptQuantity") != null) {
|
||||
updateWrapper.set("receipt_quantity", summary.get("receiptQuantity"));
|
||||
hasUpdate = true;
|
||||
}
|
||||
|
||||
// 更新总毛重
|
||||
if (summary.containsKey("totalGrossWeight") && summary.get("totalGrossWeight") != null) {
|
||||
updateWrapper.set("total_gross_weight", summary.get("totalGrossWeight"));
|
||||
hasUpdate = true;
|
||||
}
|
||||
|
||||
// 更新总净重
|
||||
if (summary.containsKey("totalNetWeight") && summary.get("totalNetWeight") != null) {
|
||||
updateWrapper.set("total_net_weight", summary.get("totalNetWeight"));
|
||||
hasUpdate = true;
|
||||
}
|
||||
|
||||
// 更新总面积
|
||||
if (summary.containsKey("totalArea") && summary.get("totalArea") != null) {
|
||||
updateWrapper.set("total_area", summary.get("totalArea"));
|
||||
hasUpdate = true;
|
||||
}
|
||||
|
||||
// 更新总体积
|
||||
if (summary.containsKey("totalVolume") && summary.get("totalVolume") != null) {
|
||||
updateWrapper.set("total_volume", summary.get("totalVolume"));
|
||||
hasUpdate = true;
|
||||
}
|
||||
|
||||
if (hasUpdate) {
|
||||
updateWrapper.set("update_by", loginUser.getUserid());
|
||||
updateWrapper.set("update_by_name", loginUser.getUsername());
|
||||
updateWrapper.set("update_time", updateTime);
|
||||
boolean updateResult = iInMaterialDetailService.update(updateWrapper);
|
||||
if (updateResult) {
|
||||
log.info("成功更新入库单明细,uniqueId: {}, 收货数量: {}, 总毛重: {}, 总净重: {}, 总面积: {}, 总体积: {}",
|
||||
uniqueId,
|
||||
summary.get("receiptQuantity"),
|
||||
summary.get("totalGrossWeight"),
|
||||
summary.get("totalNetWeight"),
|
||||
summary.get("totalArea"),
|
||||
summary.get("totalVolume"));
|
||||
} else {
|
||||
log.warn("更新入库单明细失败,uniqueId: {}, inOrderNumber: {}", uniqueId, inOrderNumber);
|
||||
}
|
||||
} else {
|
||||
log.debug("入库单明细无需更新,uniqueId: {}", uniqueId);
|
||||
}
|
||||
}
|
||||
log.info("完成同步更新入库单【{}】的明细", inOrderNumber);
|
||||
} else {
|
||||
log.warn("入库单【{}】没有需要更新的明细数据", inOrderNumber);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归处理收货单明细,汇总收货数量、总毛重、总净重、总面积、总体积
|
||||
* @param receiptDetail 收货单明细PO
|
||||
* @param uniqueIdSummaryMap 汇总Map,key为入库单明细的unique_id(即收货单明细的in_unique_id),value为字段汇总Map
|
||||
*/
|
||||
private void processReceiptDetailPOForSync(ReceiptMaterialDetailPO receiptDetail,
|
||||
Map<Long, Map<String, BigDecimal>> uniqueIdSummaryMap) {
|
||||
if (receiptDetail == null || receiptDetail.getInUniqueId() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 使用in_unique_id作为key,因为这是关联到入库单明细的unique_id
|
||||
Long uniqueId = receiptDetail.getInUniqueId();
|
||||
Map<String, BigDecimal> summary = uniqueIdSummaryMap.computeIfAbsent(uniqueId, k -> new HashMap<>());
|
||||
|
||||
// 汇总收货数量
|
||||
BigDecimal receiptQuantity = summary.getOrDefault("receiptQuantity", BigDecimal.ZERO);
|
||||
BigDecimal newReceiptQuantity = receiptDetail.getReceiptQuantity() != null ? receiptDetail.getReceiptQuantity() : BigDecimal.ZERO;
|
||||
summary.put("receiptQuantity", receiptQuantity.add(newReceiptQuantity));
|
||||
|
||||
// 汇总总毛重
|
||||
BigDecimal totalGrossWeight = summary.getOrDefault("totalGrossWeight", BigDecimal.ZERO);
|
||||
BigDecimal newGrossWeight = receiptDetail.getTotalGrossWeight() != null ? receiptDetail.getTotalGrossWeight() : BigDecimal.ZERO;
|
||||
summary.put("totalGrossWeight", totalGrossWeight.add(newGrossWeight));
|
||||
|
||||
// 汇总总净重
|
||||
BigDecimal totalNetWeight = summary.getOrDefault("totalNetWeight", BigDecimal.ZERO);
|
||||
BigDecimal newNetWeight = receiptDetail.getTotalNetWeight() != null ? receiptDetail.getTotalNetWeight() : BigDecimal.ZERO;
|
||||
summary.put("totalNetWeight", totalNetWeight.add(newNetWeight));
|
||||
|
||||
// 汇总总面积
|
||||
BigDecimal totalArea = summary.getOrDefault("totalArea", BigDecimal.ZERO);
|
||||
BigDecimal newArea = receiptDetail.getTotalArea() != null ? receiptDetail.getTotalArea() : BigDecimal.ZERO;
|
||||
summary.put("totalArea", totalArea.add(newArea));
|
||||
|
||||
// 汇总总体积
|
||||
BigDecimal totalVolume = summary.getOrDefault("totalVolume", BigDecimal.ZERO);
|
||||
BigDecimal newVolume = receiptDetail.getTotalVolume() != null ? receiptDetail.getTotalVolume() : BigDecimal.ZERO;
|
||||
summary.put("totalVolume", totalVolume.add(newVolume));
|
||||
|
||||
// 递归处理子明细
|
||||
if (!CollectionUtils.isEmpty(receiptDetail.getChildren())) {
|
||||
for (ReceiptMaterialDetailPO child : receiptDetail.getChildren()) {
|
||||
processReceiptDetailPOForSync(child, uniqueIdSummaryMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param stockReceiptOrderDO
|
||||
* @return StockReceiptOrder
|
||||
|
||||
Reference in New Issue
Block a user