diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java index 45d11776a..8879dc1c6 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java @@ -23,6 +23,8 @@ import com.mhd.wms.domain.materialBaseInfo.repository.facade.IMaterialBaseInfoSe import com.mhd.wms.domain.materialBaseInfo.repository.po.MaterialBaseInfoPO; import com.mhd.wms.domain.materialBaseInfo.repository.todo.MaterialBaseInfoDO; import com.mhd.wms.domain.materialBaseInfo.service.MaterialBaseInfoDomainService; +import com.mhd.wms.domain.materialCommon.repository.facade.IMaterialCommonService; +import com.mhd.wms.domain.materialCommon.repository.po.MaterialCommonPO; import com.mhd.wms.domain.materialCommon.repository.todo.MaterialCommonDO; import com.mhd.wms.domain.materialCommon.service.MaterialCommonDomainService; import com.mhd.wms.domain.materialGoodsRule.entity.MaterialGoodsRule; @@ -33,6 +35,8 @@ import com.mhd.wms.domain.materialGoodsRule.service.MaterialGoodsRuleDomainServi import com.mhd.wms.domain.materialInventoryWarning.repository.facade.IMaterialInventoryWarningService; import com.mhd.wms.domain.materialInventoryWarning.repository.po.MaterialInventoryWarningPO; import com.mhd.wms.domain.materialInventoryWarning.service.MaterialInventoryWarningDomainService; +import com.mhd.wms.domain.materialWarehouseControl.repository.facade.IMaterialWarehouseControlService; +import com.mhd.wms.domain.materialWarehouseControl.repository.po.MaterialWarehouseControlPO; import com.mhd.wms.domain.materialWarehouseControl.repository.todo.MaterialWarehouseControlDO; import com.mhd.wms.domain.materialWarehouseControl.service.MaterialWarehouseControlDomainService; import com.mhd.wms.interfaces.dto.materialBaseInfo.MaterialBaseInfoDTO; @@ -88,6 +92,10 @@ public class MaterialBaseInfoApplicationService { private UserServiceFeign userServiceFeign; @Autowired private IMaterialBaseInfoService materialBaseInfoService; + @Autowired + private IMaterialCommonService materialCommonService; + @Autowired + private IMaterialWarehouseControlService materialWarehouseControlService; /** * 分页查询物料基础信息列表 @@ -268,20 +276,38 @@ public class MaterialBaseInfoApplicationService { */ public Boolean update(MaterialBaseInfoDO materialBaseInfoDO) { materialBaseInfoDomainService.update(materialBaseInfoDO); + Long materialBaseInfoId = materialBaseInfoDO.getMaterialBaseInfoId(); + // 商品/公共/仓控 子表:Feign/前端常只带业务字段、未带子表主键,需按 material_base_info_id 补全后再 update,否则 WHERE xxx_id=? 为 null 导致 Updates: 0 + mergeSubEntityPrimaryKeysForMaterialUpdate(materialBaseInfoDO); //商品规则 MaterialGoodsRuleDO materialGoodsRuleDO = materialBaseInfoDO.getMaterialGoodsRule(); if (materialGoodsRuleDO != null) { - materialGoodsRuleDomainService.update(materialGoodsRuleDO); + if (materialGoodsRuleDO.getMaterialGoodsRuleId() == null && materialBaseInfoId != null) { + materialGoodsRuleDO.setMaterialBaseInfoId(materialBaseInfoId); + materialGoodsRuleDomainService.insert(materialGoodsRuleDO); + } else { + materialGoodsRuleDomainService.update(materialGoodsRuleDO); + } } //公共信息 MaterialCommonDO materialCommonDO = materialBaseInfoDO.getMaterialCommon(); if (materialCommonDO != null) { - materialCommonDomainService.update(materialCommonDO); + if (materialCommonDO.getMaterialCommonId() == null && materialBaseInfoId != null) { + materialCommonDO.setMaterialBaseInfoId(materialBaseInfoId); + materialCommonDomainService.insert(materialCommonDO); + } else { + materialCommonDomainService.update(materialCommonDO); + } } //仓库控制信息 MaterialWarehouseControlDO materialWarehouseControlDO = materialBaseInfoDO.getMaterialWarehouseControl(); if (materialWarehouseControlDO != null) { - materialWarehouseControlDomainService.update(materialWarehouseControlDO); + if (materialWarehouseControlDO.getMaterialWarehouseControlId() == null && materialBaseInfoId != null) { + materialWarehouseControlDO.setMaterialBaseInfoId(materialBaseInfoId); + materialWarehouseControlDomainService.insert(materialWarehouseControlDO); + } else { + materialWarehouseControlDomainService.update(materialWarehouseControlDO); + } } //库存预警 materialInventoryWarningDomainService.batchInsertOrUpdate(materialBaseInfoDO); @@ -290,6 +316,42 @@ public class MaterialBaseInfoApplicationService { return true; } + /** + * 编辑物料时从库中反查子表主键,避免仅传 batchId 等字段时子表主键为 null 无法 UPDATE。 + */ + private void mergeSubEntityPrimaryKeysForMaterialUpdate(MaterialBaseInfoDO materialBaseInfoDO) { + if (materialBaseInfoDO == null) { + return; + } + Long mid = materialBaseInfoDO.getMaterialBaseInfoId(); + if (mid == null) { + return; + } + MaterialGoodsRuleDO gr = materialBaseInfoDO.getMaterialGoodsRule(); + if (gr != null && gr.getMaterialGoodsRuleId() == null) { + MaterialGoodsRule one = materialGoodsRuleMapper.selectOne(new LambdaQueryWrapper() + .eq(MaterialGoodsRule::getMaterialBaseInfoId, mid) + .eq(MaterialGoodsRule::getDelFlag, 1)); + if (one != null) { + gr.setMaterialGoodsRuleId(one.getMaterialGoodsRuleId()); + } + } + MaterialCommonDO common = materialBaseInfoDO.getMaterialCommon(); + if (common != null && common.getMaterialCommonId() == null) { + MaterialCommonPO ex = materialCommonService.getInfoByMaterialBaseInfoIds(mid); + if (ex != null) { + common.setMaterialCommonId(ex.getMaterialCommonId()); + } + } + MaterialWarehouseControlDO wh = materialBaseInfoDO.getMaterialWarehouseControl(); + if (wh != null && wh.getMaterialWarehouseControlId() == null) { + MaterialWarehouseControlPO ex = materialWarehouseControlService.getInfoByMaterialBaseInfoIds(mid); + if (ex != null) { + wh.setMaterialWarehouseControlId(ex.getMaterialWarehouseControlId()); + } + } + } + /** * 批量删除物料基础信息 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java index 145a35b11..7f111bb4a 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java @@ -46,6 +46,7 @@ import com.mhd.wms.domain.stockReceiptOrder.repository.todo.NoReceiptOrderDO; import com.mhd.wms.domain.stockReceiptOrder.repository.todo.StockReceiptOrderDO; import com.mhd.wms.domain.stockReceiptOrder.service.StockReceiptOrderDomainService; import com.mhd.wms.interfaces.dto.stockReceiptOrder.StockReceiptOrderDTO; +import com.mhd.wms.util.ReceiptBatchDetailFilter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -220,6 +221,9 @@ public class StockReceiptOrderApplicationService { if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { List batchDetailFeignPOList = JSON.parseArray( JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); + // 与物料商品规则中的 batchId 对齐,避免多批次模板的 isDisplay=1 行全部合并成几十条 + batchDetailFeignPOList = ReceiptBatchDetailFilter.filterByMaterialGoodsRule( + materialBaseInfoId, batchDetailFeignPOList, materialGoodsRuleService); if (!CollectionUtils.isEmpty(batchDetailFeignPOList)) { // 过滤isDisplay=1的属性 List filteredList = batchDetailFeignPOList.stream() @@ -338,7 +342,8 @@ public class StockReceiptOrderApplicationService { if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { List batchDetailFeignPOList = JSON.parseArray( JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); - + batchDetailFeignPOList = ReceiptBatchDetailFilter.filterByMaterialGoodsRule( + materialBaseInfoId, batchDetailFeignPOList, materialGoodsRuleService); if (!CollectionUtils.isEmpty(batchDetailFeignPOList)) { // 过滤isDisplay=1的属性 batchDetailFeignPOList.stream() diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java index 3b1ba6640..77c8daccf 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java @@ -49,6 +49,7 @@ import com.mhd.wms.domain.shiftMaterialDetail.repository.todo.ShiftMaterialDetai 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 com.mhd.wms.util.ReceiptBatchDetailFilter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -232,6 +233,9 @@ public class StockShelfOrderApplicationService { if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { List batchDetailFeignPOList = JSON.parseArray( JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); + // 与物料商品规则中的 batchId 对齐,同收货单详情,避免多批次 isDisplay=1 并集 + batchDetailFeignPOList = ReceiptBatchDetailFilter.filterByMaterialGoodsRule( + materialBaseInfoId, batchDetailFeignPOList, materialGoodsRuleService); if (!CollectionUtils.isEmpty(batchDetailFeignPOList)) { // 过滤isDisplay=1的属性 List filteredList = batchDetailFeignPOList.stream() diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java index ef5dc2610..c905a10ba 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java @@ -17,6 +17,8 @@ import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.domain.BatchDetailFeignPO; import com.mhd.system.api.model.LoginUser; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mhd.wms.domain.materialGoodsRule.repository.facade.IMaterialGoodsRuleService; +import com.mhd.wms.util.ReceiptBatchDetailFilter; 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; @@ -81,6 +83,8 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl batchList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); + batchList = ReceiptBatchDetailFilter.filterByMaterialGoodsRule(materialBaseInfoId, batchList, materialGoodsRuleService); result = filterAndConvertToMaterialMoreDetail(batchList); if (CollectionUtils.isEmpty(result)) { return result; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java index 38e23765f..0b2d915c2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java @@ -19,6 +19,8 @@ import com.mhd.wms.domain.shelfMaterialDetail.repository.facade.IShelfMaterialDe import com.mhd.wms.domain.shelfMaterialDetail.repository.mapper.ShelfMaterialDetailMapper; import com.mhd.wms.domain.shelfMaterialDetail.repository.po.ShelfMaterialDetailPO; import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetailDO; +import com.mhd.wms.domain.materialGoodsRule.repository.facade.IMaterialGoodsRuleService; +import com.mhd.wms.util.ReceiptBatchDetailFilter; import com.mhd.wms.domain.stockInOrder.repository.facade.IStockInOrderService; import com.mhd.wms.domain.stockShelfOrder.repository.facade.IStockShelfOrderService; import com.mhd.wms.domain.stockShelfOrder.repository.todo.StockShelfOrderDO; @@ -54,6 +56,8 @@ public class ShelfMaterialDetailImpl extends ServiceImpl materialMoreDetailList = IMaterialMoreDetailService.queryList(materialMoreDetailDO); if (CollectionUtils.isEmpty(materialMoreDetailList)) { - AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(shelfMaterialDetailPO.getMaterialBaseInfoId()); - if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { - List batchList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); - materialMoreDetailList = filterAndConvertToMaterialMoreDetail(batchList); - } + materialMoreDetailList = loadTemplateMoreFromSystem(shelfMaterialDetailPO.getMaterialBaseInfoId()); } fillAttributeValueFromShelfMaterialDetail(shelfMaterialDetailPO, materialMoreDetailList); shelfMaterialDetailPO.setMaterialMoreDetailList(materialMoreDetailList); @@ -113,11 +113,7 @@ public class ShelfMaterialDetailImpl extends ServiceImpl materialMoreDetailList = IMaterialMoreDetailService.queryList(materialMoreDetailDO); if (CollectionUtils.isEmpty(materialMoreDetailList)) { - AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(childrenDetailPO.getMaterialBaseInfoId()); - if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { - List batchList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); - materialMoreDetailList = filterAndConvertToMaterialMoreDetail(batchList); - } + materialMoreDetailList = loadTemplateMoreFromSystem(childrenDetailPO.getMaterialBaseInfoId()); } fillAttributeValueFromShelfMaterialDetail(childrenDetailPO, materialMoreDetailList); childrenDetailPO.setMaterialMoreDetailList(materialMoreDetailList); @@ -211,11 +207,7 @@ public class ShelfMaterialDetailImpl extends ServiceImpl materialMoreDetailList = IMaterialMoreDetailService.queryList(materialMoreDetailDO); if (CollectionUtils.isEmpty(materialMoreDetailList)) { - AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(row.getMaterialBaseInfoId()); - if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { - List batchList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); - materialMoreDetailList = filterAndConvertToMaterialMoreDetail(batchList); - } + materialMoreDetailList = loadTemplateMoreFromSystem(row.getMaterialBaseInfoId()); } if (materialMoreDetailList == null) { materialMoreDetailList = new ArrayList<>(); @@ -224,6 +216,22 @@ public class ShelfMaterialDetailImpl extends ServiceImpl loadTemplateMoreFromSystem(Long materialBaseInfoId) { + if (materialBaseInfoId == null) { + return new ArrayList<>(); + } + AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId); + if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) { + return new ArrayList<>(); + } + List batchList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); + batchList = ReceiptBatchDetailFilter.filterByMaterialGoodsRule(materialBaseInfoId, batchList, materialGoodsRuleService); + return filterAndConvertToMaterialMoreDetail(batchList); + } + /** * 过滤 isDisplay=1 的批次属性并转换为 MaterialMoreDetailPO,与收货/PC 端一致 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java index 6990779be..387b5703c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java @@ -44,6 +44,7 @@ import com.mhd.wms.domain.materialMoreDetail.repository.facade.IMaterialMoreDeta import com.mhd.wms.domain.materialMoreDetail.repository.po.MaterialMoreDetailPO; import com.mhd.wms.domain.materialMoreDetail.repository.todo.MaterialMoreDetailDO; import com.mhd.wms.domain.qualityInspection.repository.facade.IQualityInspectionService; +import com.mhd.wms.util.ReceiptBatchDetailFilter; import com.mhd.wms.domain.qualityInspection.repository.todo.QualityInspectionDO; import com.mhd.wms.domain.receiptMaterialDetail.entity.ReceiptMaterialDetail; import com.mhd.wms.domain.receiptMaterialDetail.repository.facade.IReceiptMaterialDetailService; @@ -303,6 +304,8 @@ public class StockReceiptOrderDomainService { return materialMoreDetailPOList; } List batchDetailFeignPOList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); + batchDetailFeignPOList = ReceiptBatchDetailFilter.filterByMaterialGoodsRule( + materialBaseInfoId, batchDetailFeignPOList, materialGoodsRuleService); if (CollectionUtils.isEmpty(batchDetailFeignPOList)) { return materialMoreDetailPOList; }