diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java index d5f32c3f8..9ffe616d9 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java @@ -53,10 +53,11 @@ public interface IExecutionStockInOrderService extends IService 0) { + String warehouseName = reservationStockInOrderMapper.getWarehouseName(warehouseId); + List wrongWarehouseMaterials = new ArrayList<>(); + for (ProductDetail productDetail : productDetailList) { + MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productDetail.getProductCode()); + if (materialBaseInfoPO == null) { + continue; + } + int count = reservationStockInOrderMapper.countInventoryByWarehouse(materialBaseInfoPO.getMaterialBaseInfoId(), warehouseId); + if (count <= 0) { + wrongWarehouseMaterials.add(productDetail.getProductCode()); + } + } + if (!wrongWarehouseMaterials.isEmpty()) { + throw new Exception("物料[" + String.join("、", wrongWarehouseMaterials) + "]在当前仓库[" + + (warehouseName == null ? warehouseId : warehouseName) + "]没有库存记录,无法从该仓库出库,请确认导入仓库是否正确"); + } + } + ExecutionStockOutOrderDO reservationStockOutOrderDO = new ExecutionStockOutOrderDO(); reservationStockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK")); reservationStockOutOrderDO.setShipperId((Long) shipperIds.get(0).get("shipperId")); @@ -263,6 +286,12 @@ public class ExecutionStockInOrderImpl extends ServiceImpl 0) { + reservationStockOutOrderDO.setWarehouseId(warehouseId); + reservationStockOutOrderDO.setWarehouseCode(reservationStockInOrderMapper.getWarehouseCode(warehouseId)); + reservationStockOutOrderDO.setWarehouseName(reservationStockInOrderMapper.getWarehouseName(warehouseId)); + } reservationStockOutOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); reservationStockOutOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); reservationStockOutOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java index 02a633c5f..364e0bb55 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java @@ -174,40 +174,41 @@ public class ReservationMaterialInventoryPO extends MaterialBasePO { @Excel(name = "扩展字段2") private String extAttr2; + // 以下业务日期字段只保留年月日:导出复用 /list 接口,前端取 JSON 值直接进 Excel,去掉时分秒(与 WMS 库存查询一致) @ApiModelProperty("生产日期") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd") private Date productionDate; @ApiModelProperty("过期日期") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "过期日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "过期日期", width = 30, dateFormat = "yyyy-MM-dd") private Date expiryDate; @ApiModelProperty("存货日期") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd") private Date inventoryDate; @ApiModelProperty("进货日期") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd") private Date purchaseDate; @ApiModelProperty("ExtAttr3") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "ExtAttr3", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "ExtAttr3", width = 30, dateFormat = "yyyy-MM-dd") private Date extAttr3; @ApiModelProperty("ExtAttr4") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "ExtAttr4", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "ExtAttr4", width = 30, dateFormat = "yyyy-MM-dd") private Date extAttr4; diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java index 5e62c95f9..d2963405b 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java @@ -53,10 +53,11 @@ public interface IReservationStockInOrderService extends IService getMaterialBaseInfoList(@Param("id") String id); - public List getkcId(@Param("id") Long id,@Param("q") BigDecimal q); + public List getkcId(@Param("id") Long id,@Param("q") BigDecimal q, @Param("warehouseId") Long warehouseId); + + /** + * 出库导入校验:物料在指定仓库是否存在库存记录(存在即视为归属该仓库,不限数量) + * @return 库存记录数 + */ + public int countInventoryByWarehouse(@Param("id") Long id, @Param("warehouseId") Long warehouseId); public MaterialWarehouseControlPO getInfoByMaterialBaseInfoIds(@Param("id") Long id); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java index 20176fe04..44e1cf151 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java @@ -220,7 +220,7 @@ public class ReservationStockInOrderImpl extends ServiceImpl 0) { + String warehouseName = stockInOrderMapper.getWarehouseName(warehouseId); + List wrongWarehouseMaterials = new ArrayList<>(); + for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { + int count = stockInOrderMapper.countInventoryByWarehouse(materialBaseInfoPO.getMaterialBaseInfoId(), warehouseId); + if (count <= 0) { + wrongWarehouseMaterials.add(materialBaseInfoPO.getMaterialCode()); + } + } + if (!wrongWarehouseMaterials.isEmpty()) { + throw new Exception("物料[" + String.join("、", wrongWarehouseMaterials) + "]在当前仓库[" + + (warehouseName == null ? warehouseId : warehouseName) + "]没有库存记录,无法从该仓库出库,请确认导入仓库是否正确"); + } + } + // ====== 后续处理(编号均已存在):货主归属校验、建单落库 ====== for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { if (materialBaseInfoPO.getShipperId() != null && processedShipperIds.add(materialBaseInfoPO.getShipperId())) { @@ -343,6 +360,12 @@ public class ReservationStockInOrderImpl extends ServiceImpl 0) { + reservationStockOutOrderDO.setWarehouseId(warehouseId); + reservationStockOutOrderDO.setWarehouseCode(stockInOrderMapper.getWarehouseCode(warehouseId)); + reservationStockOutOrderDO.setWarehouseName(stockInOrderMapper.getWarehouseName(warehouseId)); + } reservationStockOutOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); reservationStockOutOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); reservationStockOutOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); @@ -382,13 +405,14 @@ public class ReservationStockInOrderImpl extends ServiceImpl reservationMaterialInventoryPOS = stockInOrderMapper.getkcId(materialBaseInfoId, new BigDecimal(productDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP)); + List reservationMaterialInventoryPOS = stockInOrderMapper.getkcId(materialBaseInfoId, new BigDecimal(productDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP), warehouseId); if (reservationMaterialInventoryPOS != null&&reservationMaterialInventoryPOS.size() > 0) { ReservationMaterialInventoryPO reservationMaterialInventoryPO = reservationMaterialInventoryPOS.get(0); Long materialInventoryId = reservationMaterialInventoryPO.getMaterialInventoryId(); String batchNumber = reservationMaterialInventoryPO.getBatchNumber(); String lotNumber = reservationMaterialInventoryPO.getLotNumber(); - Long warehouseId = reservationMaterialInventoryPO.getWarehouseId(); + // 库存记录所在仓库(指定导入仓库时,getkcId 已按该仓库过滤,两者一致) + Long invWarehouseId = reservationMaterialInventoryPO.getWarehouseId(); String warehouseCode = reservationMaterialInventoryPO.getWarehouseCode(); String warehouseName = reservationMaterialInventoryPO.getWarehouseName(); String inOrderNumber = reservationMaterialInventoryPO.getInOrderNumber(); @@ -398,7 +422,7 @@ public class ReservationStockInOrderImpl extends ServiceImpl 0 ? "在当前仓库" : "") + "批次库存数量少于出库数量!"); } reservationOutMaterialDetailDO.setMaterialBaseInfoId(materialBaseInfoPO.getMaterialBaseInfoId()); reservationOutMaterialDetailDO.setMaterialCode(materialBaseInfoPO.getMaterialCode()); diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java index 6426b6b74..6406a2472 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java @@ -203,13 +203,15 @@ public class ExecutionStockInOrderApi extends BaseController { * 上传并解析Excel文件 * @param file Excel文件 * @param sheetName 工作表名称(出库导入/参考数据) + * @param warehouseId 当前仓库id(非空时校验导入物料是否属于该仓库,并按该仓库过滤批次库存) * @return 解析后的出库数据 */ @PostMapping("/parseExcel") public ResponseEntity> parseExcel( - @RequestParam("file") MultipartFile file) { + @RequestParam("file") MultipartFile file, + @RequestParam(value = "warehouseId", required = false) Long warehouseId) { try { - DeliveryDataDTO deliveryDataDTO = reservationStockInOrderService.parseExcelFile(file, ""); + DeliveryDataDTO deliveryDataDTO = reservationStockInOrderService.parseExcelFile(file, "", warehouseId); Map result = new HashMap<>(); result.put("result", deliveryDataDTO); result.put("code",200); diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java index e7894a630..3573345ea 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java @@ -211,14 +211,16 @@ public class ReservationStockInOrderApi extends BaseController { /** * 上传并解析Excel文件(默认读取"出库导入"工作表) * @param file Excel文件 + * @param warehouseId 当前仓库id(非空时校验导入物料是否属于该仓库,并按该仓库过滤批次库存) * @return 解析后的出库数据 */ @PostMapping("/parseExcel") public ResponseEntity> parseExcel( - @RequestParam("file") MultipartFile file) { + @RequestParam("file") MultipartFile file, + @RequestParam(value = "warehouseId", required = false) Long warehouseId) { Map result = new HashMap<>(); try { - DeliveryDataDTO deliveryDataDTO = reservationStockInOrderService.parseExcelFile(file, ""); + DeliveryDataDTO deliveryDataDTO = reservationStockInOrderService.parseExcelFile(file, "", warehouseId); result.put("result", deliveryDataDTO); result.put("code", 200); result.put("msg", "解析成功"); diff --git a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml index 19c04380f..f2d601503 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml @@ -556,6 +556,14 @@ + +