From fcb997d4ca0af3620fabe21913a96ec23d894e7d 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 11:20:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=B8=B8BUG=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mhd/system/api/SystemServiceFeign.java | 6 ++ .../RemoteSystemFeignFallbackFactory.java | 5 ++ ...ssociationWarehouseApplicationService.java | 11 +++ .../AssociationWarehouseDomainService.java | 33 +++++++ .../AssociationWarehouseApi.java | 10 +++ .../StockInOrderApplicationService.java | 85 ++++++++++++++----- .../StockReceiptOrderDomainService.java | 14 +++ .../stockInOrder/StockInOrderApi.java | 8 +- 8 files changed, 150 insertions(+), 22 deletions(-) diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/SystemServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/SystemServiceFeign.java index bfd94ccba..57439c719 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/SystemServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/SystemServiceFeign.java @@ -218,6 +218,12 @@ public interface SystemServiceFeign { @GetMapping("/associationWarehouseApi/getWarehouseInfo/{correlationId}") public AjaxResult getWarehouseInfo(@PathVariable("correlationId") Long correlationId); + /** + * 直接从数据库获取指定用户设置的仓库(不使用缓存) + */ + @GetMapping("/associationWarehouseApi/getWarehouseInfoFromDb/{correlationId}") + public AjaxResult getWarehouseInfoFromDb(@PathVariable("correlationId") Long correlationId); + /** * 根据warehouseId获取对仓库信息 */ diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteSystemFeignFallbackFactory.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteSystemFeignFallbackFactory.java index 4b199c215..d14acfcc5 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteSystemFeignFallbackFactory.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteSystemFeignFallbackFactory.java @@ -169,6 +169,11 @@ public class RemoteSystemFeignFallbackFactory implements FallbackFactory().lambda() + .eq(AssociationWarehouse::getCorrelationId, loginUser.getUserid()) + .eq(AssociationWarehouse::getIsDefault, 2) + .eq(AssociationWarehouse::getDelFlag, 1)); + AssociationWarehouseCacheDO associationWarehouseCacheDO = null; + if (ObjectUtil.isNotNull(associationWarehouse)){ + associationWarehouseCacheDO = new AssociationWarehouseCacheDO(); + BeanUtils.copyProperties(associationWarehouse, associationWarehouseCacheDO); + }else { + //首次 没有查到默认取第一条数据 + List associationWarehouseList = associationWarehouseService.list(new QueryWrapper().lambda() + .eq(AssociationWarehouse::getCorrelationId, loginUser.getUserid()) + .orderByAsc(AssociationWarehouse::getAssociationWarehouseId)); + if (CollectionUtils.isEmpty(associationWarehouseList)){ + return null; // 返回null,不抛异常,允许查询所有仓库 + } + AssociationWarehouse associationWarehouseAsc = associationWarehouseList.get(0); + associationWarehouseCacheDO = new AssociationWarehouseCacheDO(); + BeanUtils.copyProperties(associationWarehouseAsc, associationWarehouseCacheDO); + } + return associationWarehouseCacheDO; + } + } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/associationWarehouse/AssociationWarehouseApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/associationWarehouse/AssociationWarehouseApi.java index bee23a3f5..a37c2e795 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/associationWarehouse/AssociationWarehouseApi.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/associationWarehouse/AssociationWarehouseApi.java @@ -134,4 +134,14 @@ public class AssociationWarehouseApi extends BaseController{ return AjaxResult.success(associationWarehouseCacheDO); } + /** + * 直接从数据库获取指定用户设置的仓库(不使用缓存) + */ + @ApiOperation("直接从数据库获取指定用户设置的仓库(不使用缓存)") + @GetMapping("/getWarehouseInfoFromDb/{correlationId}") + public AjaxResult getWarehouseInfoFromDb(@PathVariable("correlationId") Long correlationId) { + AssociationWarehouseCacheDO associationWarehouseCacheDO = associationWarehouseApplicationService.getWarehouseInfoFromDb(correlationId); + return AjaxResult.success(associationWarehouseCacheDO); + } + } 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 e3ab3b68d..002ed078e 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 @@ -74,16 +74,22 @@ public class StockInOrderApplicationService { stockInOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); } try { - AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); - 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()); + // 直接从数据库查询当前登录用户选择的仓库,不使用缓存 + 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()); + } } } } catch (Exception e) { @@ -139,10 +145,46 @@ public class StockInOrderApplicationService { /** * 批量删除入库单 + * 只有已创建状态(status = 1)的入库单可以删除 */ public boolean delete(Long[] inOrderIds) { + if (inOrderIds == null || inOrderIds.length == 0) { + throw new ServiceException("删除的入库单ID不能为空"); + } + + // 查询入库单信息,检查状态 + for (Long inOrderId : inOrderIds) { + StockInOrderPO stockInOrderPO = stockInOrderDomainService.getInfo(inOrderId); + if (stockInOrderPO == null) { + throw new ServiceException("入库单不存在,入库单ID:" + inOrderId); + } + // 只有已创建状态(status = 1)的入库单可以删除 + if (stockInOrderPO.getStatus() == null || !stockInOrderPO.getStatus().equals(1)) { + throw new ServiceException("只有已创建状态的入库单可以删除,入库单号:" + stockInOrderPO.getInOrderNumber() + ",当前状态:" + getStatusName(stockInOrderPO.getStatus())); + } + } + return stockInOrderDomainService.delete(inOrderIds); } + + /** + * 获取入库状态名称 + */ + private String getStatusName(Integer status) { + if (status == null) { + return "未知"; + } + switch (status) { + case 1: return "已创建"; + case 2: return "已审核"; + case 3: return "收货中"; + case 4: return "上架中"; + case 5: return "已入库"; + case 6: return "已取消"; + case 7: return "已关闭"; + default: return "未知"; + } + } /** * 获取入库单详细信息 @@ -195,7 +237,7 @@ public class StockInOrderApplicationService { * - 第13行:明细表列名 * - 第14行开始:明细数据 */ - public Boolean importData(MultipartFile file) { + public Boolean importData(MultipartFile file, Long warehouseId, String warehouseCode, String warehouseName) { if (file == null || file.isEmpty()) { throw new ServiceException("导入文件不能为空"); } @@ -1046,13 +1088,16 @@ public class StockInOrderApplicationService { List groupRows = entry.getValue(); StockInOrderImportRowDTO h = groupRows.get(0); - // 获取仓库ID(使用登录人当前关联仓库) - Long warehouseId; - AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); - if (associationWarehouseCacheDO == null || associationWarehouseCacheDO.getWarehouseId() == null) { - throw new ServiceException("导入失败:未配置用户关联仓库,请先配置仓库"); + // 使用传入的仓库信息(与出库单导入保持一致) + if (warehouseId == null) { + throw new ServiceException("导入失败:仓库ID不能为空"); + } + if (StringUtils.isBlank(warehouseCode)) { + throw new ServiceException("导入失败:仓库编码不能为空"); + } + if (StringUtils.isBlank(warehouseName)) { + throw new ServiceException("导入失败:仓库名称不能为空"); } - warehouseId = associationWarehouseCacheDO.getWarehouseId(); // 客户名称应该从表头获取(优先使用表头,如果表头为空则使用明细行) String customerName = StringUtils.isNotBlank(headerInfo.getShipperName()) ? headerInfo.getShipperName() : h.getShipperName(); @@ -1074,10 +1119,10 @@ public class StockInOrderApplicationService { // 设置创建时间为当前时间 order.setCreateTime(new Date()); - // 必填/基础字段 + // 必填/基础字段(使用传入的仓库信息,与出库单导入保持一致) order.setWarehouseId(warehouseId); - // 设置仓库完整信息(warehouseCode 和 warehouseName) - setWarehouseInfo(order); + order.setWarehouseCode(warehouseCode); + order.setWarehouseName(warehouseName); // 货主信息:优先使用表头,如果表头为空则使用明细行 String shipperName = StringUtils.isNotBlank(headerInfo.getShipperName()) ? headerInfo.getShipperName() : h.getShipperName(); String shipperCode = StringUtils.isNotBlank(headerInfo.getShipperCode()) ? headerInfo.getShipperCode() : h.getShipperCode(); 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 d9e0dfb9b..189eecbe6 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 @@ -11,6 +11,7 @@ import com.mhd.common.core.constant.SnowFlakeConstants; import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.utils.IgnoreNullUtil; import com.mhd.common.core.utils.OrderSequence; +import com.mhd.common.core.utils.StringUtils; import com.mhd.common.core.utils.bean.BeanUtils; import com.mhd.common.core.utils.uuid.IdGenerator; import com.mhd.common.core.web.domain.AjaxResult; @@ -471,6 +472,19 @@ public class StockReceiptOrderDomainService { //根据收货数量生成上架 genStockShelfOrder(stockReceiptOrderPO); + //生成上架单后,更新入库单状态为4(上架中) + if (StringUtils.isNotBlank(stockReceiptOrderPO.getInOrderNumber())) { + StockInOrder stockInOrder = new StockInOrder(); + stockInOrder.setInOrderNumber(stockReceiptOrderPO.getInOrderNumber()); + stockInOrder.setStatus(4); // 4-上架中 + stockInOrder.setUpdateBy(loginUser.getUserid()); + stockInOrder.setUpdateByName(loginUser.getUsername()); + stockInOrder.setUpdateTime(new Date()); + stockInOrderService.update(stockInOrder, + new QueryWrapper().lambda() + .eq(StockInOrder::getInOrderNumber, stockReceiptOrderPO.getInOrderNumber())); + } + //收货完成后自动生成上架任务 try { //查询刚生成的上架单 diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockInOrder/StockInOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockInOrder/StockInOrderApi.java index 8b9d7f666..8d4f913a0 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockInOrder/StockInOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockInOrder/StockInOrderApi.java @@ -88,9 +88,13 @@ public class StockInOrderApi extends BaseController { */ @ApiOperation("导入入库单") @PostMapping(value = "/importData") - public AjaxResult importData(MultipartFile file) + public AjaxResult importData( + @RequestParam("file") MultipartFile file, + @RequestParam("warehouseId") Long warehouseId, + @RequestParam("warehouseCode") String warehouseCode, + @RequestParam("warehouseName") String warehouseName) { - return AjaxResult.success(stockInOrderApplicationService.importData(file)); + return AjaxResult.success(stockInOrderApplicationService.importData(file, warehouseId, warehouseCode, warehouseName)); } /**