From f260b73b80e9170f148e639fd1d4686ead1e2f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Tue, 10 Feb 2026 10:12:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=93=E5=AD=98=E5=88=86=E9=85=8D=E6=97=B6?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E6=B2=A1=E6=9C=89=E5=BA=93=E5=AD=98=E6=8A=9B?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=20=E5=AF=BC=E5=85=A5=E6=A8=A1=E7=89=88?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E7=89=A9=E6=96=99=E6=8A=9B=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/StorageLocationDomainService.java | 2 +- .../StockInOrderApplicationService.java | 145 ++++-------------- .../MaterialInventoryApi.java | 67 +++++++- 3 files changed, 97 insertions(+), 117 deletions(-) diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageLocation/service/StorageLocationDomainService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageLocation/service/StorageLocationDomainService.java index a3c032520..fd7c37052 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageLocation/service/StorageLocationDomainService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageLocation/service/StorageLocationDomainService.java @@ -308,7 +308,7 @@ public class StorageLocationDomainService { updateWrapper.in("storage_location_group_id", storageLocationGroupIds); updateWrapper.set("update_by", loginUser.getUserid()); updateWrapper.set("update_by_name", loginUser.getUsername()); - updateWrapper.set("update_by", new Date()); + updateWrapper.set("update_time", new Date()); updateWrapper.setSql("storage_location_count = storage_location_count - 1"); storageLocationGroupService.update(updateWrapper); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java index ad72c6048..e3ab3b68d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java @@ -1202,124 +1202,45 @@ public class StockInOrderApplicationService { } } - // 根据明细表中的字段查询物料基础信息(优先:料号 > 商品SKU码 > 商品名称) - // 注意:查询时必须加上货主ID条件,确保查询到的是该货主绑定的物料 + // 导入文件中必须填写料号,根据料号获取商品信息,必须是货主下有的才可以匹配 + // 如果没有填写,提示用户:请在导入文件中填写正确的料号 + if (StringUtils.isBlank(r.getMaterialCode())) { + String errorMsg = String.format("导入失败:请在导入文件中填写正确的料号", + r.getMaterialName()); + log.error(errorMsg); + throw new ServiceException(errorMsg); + } + + // 根据料号查询物料基础信息,必须是货主下有的才可以匹配 Long materialBaseInfoId = null; LoginUser currentLoginUser = SecurityUtils.getLoginUser(); Long topOrganizationId = currentLoginUser != null && currentLoginUser.getUserPo() != null ? currentLoginUser.getUserPo().getTopOrganizationId() : null; - // 优先使用料号查询 - if (StringUtils.isNotBlank(r.getMaterialCode())) { - MaterialBaseInfoDO queryDO = new MaterialBaseInfoDO(); - queryDO.setMaterialCode(r.getMaterialCode()); - if (topOrganizationId != null) { - queryDO.setTopOrganizationId(topOrganizationId); - } - // 加上货主ID条件,确保查询到的是该货主绑定的物料 - if (shipperId != null) { - queryDO.setShipperId(shipperId); - } - log.info("尝试通过料号查询物料基础信息,料号: [{}], topOrganizationId: {}, shipperId: {}", - r.getMaterialCode(), topOrganizationId, shipperId); - List materialList = materialBaseInfoService.queryList(queryDO); - log.info("料号查询结果,查询到 {} 条记录", materialList != null ? materialList.size() : 0); - if (materialList != null && !materialList.isEmpty()) { - materialBaseInfoId = materialList.get(0).getMaterialBaseInfoId(); - log.info("通过料号查询到物料基础信息,料号: {}, 物料ID: {}, 货主ID: {}", - r.getMaterialCode(), materialBaseInfoId, shipperId); - } else { - // 如果提供了料号但查询不到,直接报错,不允许导入 - String errorMsg = String.format("导入失败:该货主下不存在该料号(委托编号NO=%s,货主名称=%s,料号=%s)。请确保该料号已在物料管理中创建,且属于该货主", - h.getConsignmentNo(), order.getShipperName(), r.getMaterialCode()); - log.error(errorMsg); - throw new ServiceException(errorMsg); - } + // 使用料号查询,必须加上货主ID条件,确保查询到的是该货主绑定的物料 + MaterialBaseInfoDO queryDO = new MaterialBaseInfoDO(); + queryDO.setMaterialCode(r.getMaterialCode()); + if (topOrganizationId != null) { + queryDO.setTopOrganizationId(topOrganizationId); + } + // 加上货主ID条件,确保查询到的是该货主绑定的物料 + if (shipperId != null) { + queryDO.setShipperId(shipperId); + } + log.info("尝试通过料号查询物料基础信息,料号: [{}], topOrganizationId: {}, shipperId: {}", + r.getMaterialCode(), topOrganizationId, shipperId); + List materialList = materialBaseInfoService.queryList(queryDO); + log.info("料号查询结果,查询到 {} 条记录", materialList != null ? materialList.size() : 0); + if (materialList != null && !materialList.isEmpty()) { + materialBaseInfoId = materialList.get(0).getMaterialBaseInfoId(); + log.info("通过料号查询到物料基础信息,料号: {}, 物料ID: {}, 货主ID: {}", + r.getMaterialCode(), materialBaseInfoId, shipperId); } else { - log.warn("料号为空,跳过料号查询,将尝试使用SKU码或商品名称查询"); - } - - // 只有在料号为空的情况下,才使用商品SKU码查询 - if (materialBaseInfoId == null && StringUtils.isNotBlank(r.getSkuCode())) { - MaterialBaseInfoDO queryDO = new MaterialBaseInfoDO(); - queryDO.setBarCode(r.getSkuCode()); - if (topOrganizationId != null) { - queryDO.setTopOrganizationId(topOrganizationId); - } - // 加上货主ID条件,确保查询到的是该货主绑定的物料 - if (shipperId != null) { - queryDO.setShipperId(shipperId); - } - log.info("尝试通过商品SKU码查询物料基础信息,SKU码: [{}], topOrganizationId: {}, shipperId: {}", - r.getSkuCode(), topOrganizationId, shipperId); - List materialList = materialBaseInfoService.queryList(queryDO); - log.info("SKU码查询结果,查询到 {} 条记录", materialList != null ? materialList.size() : 0); - if (materialList != null && !materialList.isEmpty()) { - materialBaseInfoId = materialList.get(0).getMaterialBaseInfoId(); - log.info("通过商品SKU码查询到物料基础信息,SKU码: {}, 物料ID: {}, 货主ID: {}", - r.getSkuCode(), materialBaseInfoId, shipperId); - } else { - log.warn("通过SKU码未查询到物料基础信息,SKU码: [{}], 货主ID: [{}]", r.getSkuCode(), shipperId); - } - } else if (materialBaseInfoId == null) { - log.warn("SKU码为空,跳过SKU码查询"); - } - - // 如果料号和SKU码都查询不到,使用商品名称查询 - if (materialBaseInfoId == null && StringUtils.isNotBlank(r.getMaterialName())) { - MaterialBaseInfoDO queryDO = new MaterialBaseInfoDO(); - queryDO.setMaterialName(r.getMaterialName()); - if (topOrganizationId != null) { - queryDO.setTopOrganizationId(topOrganizationId); - } - // 加上货主ID条件,确保查询到的是该货主绑定的物料 - if (shipperId != null) { - queryDO.setShipperId(shipperId); - } - log.info("尝试通过商品名称查询物料基础信息,商品名称: [{}], topOrganizationId: {}, shipperId: {}", - r.getMaterialName(), topOrganizationId, shipperId); - List materialList = materialBaseInfoService.queryList(queryDO); - log.info("商品名称查询结果,查询到 {} 条记录", materialList != null ? materialList.size() : 0); - if (materialList != null && !materialList.isEmpty()) { - materialBaseInfoId = materialList.get(0).getMaterialBaseInfoId(); - log.info("通过商品名称查询到物料基础信息,商品名称: {}, 物料ID: {}, 货主ID: {}", - r.getMaterialName(), materialBaseInfoId, shipperId); - } else { - log.warn("通过商品名称未查询到物料基础信息,商品名称: [{}], 货主ID: [{}]", r.getMaterialName(), shipperId); - } - } else if (materialBaseInfoId == null) { - log.warn("商品名称为空,跳过商品名称查询"); - } - - // 如果都查询不到物料基础信息,阻止导入并抛出异常 - if (materialBaseInfoId == null) { - // 检查是否至少有一个查询条件 - boolean hasQueryCondition = StringUtils.isNotBlank(r.getMaterialCode()) - || StringUtils.isNotBlank(r.getSkuCode()) - || StringUtils.isNotBlank(r.getMaterialName()); - - // 构建错误信息,说明物料在物料管理中不存在 - StringBuilder errorMsg = new StringBuilder(); - errorMsg.append("导入失败:物料在物料管理中不存在(委托编号NO=").append(h.getConsignmentNo()); - errorMsg.append(",货主名称=").append(order.getShipperName()); - if (StringUtils.isNotBlank(r.getMaterialCode())) { - errorMsg.append(",料号=").append(r.getMaterialCode()); - } - if (StringUtils.isNotBlank(r.getSkuCode())) { - errorMsg.append(",SKU码=").append(r.getSkuCode()); - } - if (StringUtils.isNotBlank(r.getMaterialName())) { - errorMsg.append(",商品名称=").append(r.getMaterialName()); - } - errorMsg.append(")"); - - if (!hasQueryCondition) { - errorMsg.append("。明细行缺少物料标识信息(料号、SKU码或商品名称至少需要填写一个)"); - } else { - errorMsg.append("。请确保该物料已在物料管理中创建,且料号、SKU码或商品名称与货主信息匹配"); - } - log.error(errorMsg.toString()); - throw new ServiceException(errorMsg.toString()); + // 如果提供了料号但查询不到(或不属于该货主),直接报错,不允许导入 + String errorMsg = String.format("导入失败:该货主下不存在该料号(货主名称=%s,料号=%s)。请确保该料号已在物料管理中创建,且属于该货主", + order.getShipperName(), r.getMaterialCode()); + log.error(errorMsg); + throw new ServiceException(errorMsg); } // 数量已在前面检查过,这里直接使用 diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java index a306612b0..3dd66441b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java @@ -1,9 +1,14 @@ package com.mhd.wms.interfaces.facadeApi.materialInventory; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.mhd.common.core.domain.po.UserPo; +import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.utils.StringUtils; import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.core.web.page.TableDataInfo; +import com.mhd.system.api.UserServiceFeign; import com.mhd.wms.application.service.materialInventory.MaterialInventoryApplicationService; import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO; import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryQueryListPO; @@ -13,6 +18,7 @@ import com.mhd.wms.interfaces.assember.materialInventory.MaterialInventoryAssemb import com.mhd.wms.interfaces.dto.materialInventory.MaterialInventoryDTO; import com.mhd.wms.interfaces.dto.materialInventory.MaterialInventoryQueryListDTO; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -27,6 +33,7 @@ import java.util.List; */ @RestController @RequestMapping("/materialInventoryApi") +@Slf4j public class MaterialInventoryApi extends BaseController { @Autowired private MaterialInventoryApplicationService materialInventoryApplicationService; @@ -34,6 +41,9 @@ public class MaterialInventoryApi extends BaseController { @Resource private MaterialInventoryAssembler materialInventoryAssembler; + @Autowired + private UserServiceFeign userServiceFeign; + /** * 分页查询物料库存列表 */ @@ -42,9 +52,26 @@ public class MaterialInventoryApi extends BaseController { public TableDataInfo list(MaterialInventoryDTO materialInventoryDTO, @RequestParam(value = "customerName", required = false) String customerName) { - // 出库分配前端传的是客户名称 customerName,这里转成货主筛选条件(模糊匹配货主编码 / 名称) - if (StringUtils.isNotBlank(customerName) && StringUtils.isBlank(materialInventoryDTO.getShipperInfo())) { - materialInventoryDTO.setShipperInfo(customerName); + // 出库分配前端传的是客户名称 customerName,这里通过名称查询货主ID,使用精确匹配(不模糊匹配) + String shipperName = null; // 保存查询到的货主名称 + if (StringUtils.isNotBlank(customerName) && materialInventoryDTO.getShipperId() == null) { + try { + AjaxResult ajaxResult = userServiceFeign.getInfoByName(customerName); + if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) { + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + if (userPo != null && userPo.getUserId() != null) { + materialInventoryDTO.setShipperId(userPo.getUserId()); + // 获取货主名称:优先使用企业名称,如果没有则使用用户名称 + shipperName = StringUtils.isNotBlank(userPo.getShipperEnterpriseName()) + ? userPo.getShipperEnterpriseName() + : userPo.getUserName(); + log.info("根据客户名称查询到货主信息,客户名称:{},货主ID:{},货主名称:{}", + customerName, userPo.getUserId(), shipperName); + } + } + } catch (Exception e) { + log.warn("根据客户名称查询货主ID失败,客户名称:{},错误:{}", customerName, e.getMessage()); + } } //转换实体 @@ -52,7 +79,39 @@ public class MaterialInventoryApi extends BaseController { startPage(); // 使用带批次属性的查询方法,批次属性值从库存表中获取 List list = materialInventoryApplicationService.queryListWithBatchAttributes(materialInventoryDO); - return getDataTable(list); + TableDataInfo tableDataInfo = getDataTable(list); + // 如果查询结果为空,抛出异常提示用户该物料在库存中不存在 + if (tableDataInfo.getTotal() == 0) { + StringBuilder errorMsg = new StringBuilder("该物料在库存中不存在"); + // 如果有物料信息,添加到提示中 + if (StringUtils.isNotBlank(materialInventoryDTO.getMaterialName())) { + errorMsg.append(",物料名称:").append(materialInventoryDTO.getMaterialName()); + } else if (StringUtils.isNotBlank(materialInventoryDTO.getMaterialCode())) { + errorMsg.append(",物料编码:").append(materialInventoryDTO.getMaterialCode()); + } else if (StringUtils.isNotBlank(materialInventoryDTO.getBarCode())) { + errorMsg.append(",物料条码:").append(materialInventoryDTO.getBarCode()); + } + // 如果有货主信息,添加到提示中(优先显示查询到的货主名称,否则显示客户名称) + if (StringUtils.isNotBlank(shipperName)) { + errorMsg.append(",货主:").append(shipperName); + } else if (StringUtils.isNotBlank(customerName)) { + errorMsg.append(",货主:").append(customerName); + } + // 如果有批次参考号,添加到提示中 + if (StringUtils.isNotBlank(materialInventoryDTO.getBatchRefNo())) { + errorMsg.append(",Batch Ref NO's:").append(materialInventoryDTO.getBatchRefNo()); + } + // 如果有单据参考号,添加到提示中 + if (StringUtils.isNotBlank(materialInventoryDTO.getSheetRefNo())) { + errorMsg.append(",Sheet Ref NO's:").append(materialInventoryDTO.getSheetRefNo()); + } + // 如果有箱号/卡板号,添加到提示中 + if (StringUtils.isNotBlank(materialInventoryDTO.getBoxPalletNo())) { + errorMsg.append(",箱号/卡板号:").append(materialInventoryDTO.getBoxPalletNo()); + } + throw new ServiceException(errorMsg.toString()); + } + return tableDataInfo; } @ApiOperation("查询物料库存列表不分页")