diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/vo/ReservedInventory.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/vo/ReservedInventory.java index a6b5c2830..1e86c733b 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/vo/ReservedInventory.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/vo/ReservedInventory.java @@ -68,4 +68,9 @@ public class ReservedInventory { * 验证结果(导入后自动填充,不映射Excel) */ private String validationResult; + + /** + * WMS物料id(解析预览接口根据货物名称匹配后自动填充,匹配不到为空,不映射Excel) + */ + private Long materialBaseInfoId; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderApplicationService.java index 571dfa51c..fe2015eb2 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderApplicationService.java @@ -1972,6 +1972,35 @@ public class ReserveStockInOrderApplicationService { return stockInOrderDomainService.queryNoticePrintDetail(stockInOrderDO); } + /** + * Excel解析预览:根据货物名称匹配WMS对应物料并填充物料id, + * 匹配不到物料id保持为空,不阻断解析 + */ + public void fillMaterialBaseInfoId(List dataList) { + if (dataList == null || dataList.isEmpty()) { + return; + } + // 物料名称匹配结果缓存,避免同名重复查库 + Map materialCache = new HashMap<>(); + for (ReservedInventory reservedInventory : dataList) { + String goodsName = reservedInventory.getGoodsName(); + if (StringUtils.isBlank(goodsName)) { + continue; + } + MaterialBaseInfoPO materialBaseInfoPO = materialCache.get(goodsName); + if (materialBaseInfoPO == null && !materialCache.containsKey(goodsName)) { + List materialBaseInfoPOS = reserveStockInOrderMapper.getByName(goodsName); + if (materialBaseInfoPOS != null && !materialBaseInfoPOS.isEmpty()) { + materialBaseInfoPO = materialBaseInfoPOS.get(0); + } + materialCache.put(goodsName, materialBaseInfoPO); + } + if (materialBaseInfoPO != null) { + reservedInventory.setMaterialBaseInfoId(materialBaseInfoPO.getMaterialBaseInfoId()); + } + } + } + public void importInData(List dataList) { LoginUser loginUser = SecurityUtils.getLoginUser(); ReserveStockInOrderDO reserveStockInOrder = new ReserveStockInOrderDO(); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/entity/ReserveStockOutOrder.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/entity/ReserveStockOutOrder.java index 464ccbb11..df53789da 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/entity/ReserveStockOutOrder.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/entity/ReserveStockOutOrder.java @@ -444,4 +444,9 @@ public class ReserveStockOutOrder extends BaseVOEntity { @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date outboundTime; + @ApiModelProperty("预约业务类型") + private String reserveBusinessType; + @ApiModelProperty("预约业务类型名称") + private String reserveBusinessTypeName; + } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/po/ReserveStockOutOrderPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/po/ReserveStockOutOrderPO.java index 6a1049f85..42a258d5c 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/po/ReserveStockOutOrderPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/po/ReserveStockOutOrderPO.java @@ -452,4 +452,8 @@ public class ReserveStockOutOrderPO extends BaseVOEntity { @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date outboundTime; + @ApiModelProperty("预约业务类型") + private String reserveBusinessType; + @ApiModelProperty("预约业务类型名称") + private String reserveBusinessTypeName; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/todo/ReserveStockOutOrderDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/todo/ReserveStockOutOrderDO.java index 1e7a27c9c..e15ccd96b 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/todo/ReserveStockOutOrderDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/todo/ReserveStockOutOrderDO.java @@ -490,4 +490,8 @@ public class ReserveStockOutOrderDO extends BaseVOEntity { @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date outboundTime; + @ApiModelProperty("预约业务类型") + private String reserveBusinessType; + @ApiModelProperty("预约业务类型名称") + private String reserveBusinessTypeName; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/todo/ReserveStockOutOrderDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/todo/ReserveStockOutOrderDTO.java index 677164a2d..41fa9e8c1 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/todo/ReserveStockOutOrderDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/todo/ReserveStockOutOrderDTO.java @@ -479,4 +479,8 @@ public class ReserveStockOutOrderDTO extends ReserveStockOutOrderBaseDTO { @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date outboundTime; + @ApiModelProperty("预约业务类型") + private String reserveBusinessType; + @ApiModelProperty("预约业务类型名称") + private String reserveBusinessTypeName; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/vo/ReservedInventoryOut.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/vo/ReservedInventoryOut.java index 618ef5324..bc2638873 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/vo/ReservedInventoryOut.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/vo/ReservedInventoryOut.java @@ -1,5 +1,6 @@ package com.mhd.oms.domain.reserveStockOutOrder.repository.vo; +import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.mhd.oms.domain.reserveStockInOrder.repository.util.StringToBigDecimalConverter; import com.mhd.oms.domain.reserveStockInOrder.repository.util.StringToDateConverter; @@ -35,6 +36,15 @@ public class ReservedInventoryOut { /** * 验证结果(导入后自动填充,不映射Excel) + * @ExcelIgnore:排除在Excel列映射之外,避免被自动分配列索引 */ + @ExcelIgnore private String validationResult; + + /** + * WMS库存id(解析预览接口根据货物名称查询可用库存后自动填充,不映射Excel) + * @ExcelIgnore:Long类型字段若被自动映射到非数字列,会抛出ExcelDataConvertException + */ + @ExcelIgnore + private Long materialInventoryId; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderApplicationService.java index 4dc2f9a89..160b18a08 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderApplicationService.java @@ -841,7 +841,7 @@ public class ReserveStockOutOrderApplicationService { * @description 审核入库单 * @author ZhouGY * @date 2024/5/21 13:53 - * @param stockInOrderDO + * @param stockOutOrderDO * @return Boolean */ public Boolean auditState(ReserveStockOutOrderDO stockOutOrderDO){ @@ -852,7 +852,7 @@ public class ReserveStockOutOrderApplicationService { * @description 下发入库单 * @author ZhouGY * @date 2024/5/21 13:53 - * @param stockInOrderDO + * @param stockOutOrderDO * @return Boolean */ public Boolean issueOrder(ReserveStockOutOrderDO stockOutOrderDO){ @@ -862,7 +862,7 @@ public class ReserveStockOutOrderApplicationService { * @description 审核入库单 * @author ZhouGY * @date 2024/5/21 13:53 - * @param stockInOrderDO + * @param stockOutOrderDO * @return Boolean */ public Boolean orderReject(ReserveStockOutOrderDO stockOutOrderDO){ @@ -1355,6 +1355,42 @@ public class ReserveStockOutOrderApplicationService { return result; } + /** + * Excel解析预览:根据货物名称查询WMS对应物料的库存信息, + * 可用数量大于导入数据件数的填充库存id; + * 物料不存在、无库存或可用数量不足时库存id保持为空,不抛异常 + */ + public void fillMaterialInventoryId(List dataList) { + if (CollectionUtils.isEmpty(dataList)) { + return; + } + for (ReservedInventoryOut reservedInventory : dataList) { + String goodsName = reservedInventory.getGoodsName(); + BigDecimal importQuantity = reservedInventory.getQuantity() == null ? BigDecimal.ZERO : reservedInventory.getQuantity(); + // 根据货物名称查询对应物料,匹配不到则库存id为空 + List materialBaseInfoPOS = reserveStockInOrderMapper.getByName(goodsName); + if (materialBaseInfoPOS == null || materialBaseInfoPOS.isEmpty()) { + continue; + } + Long materialBaseInfoId = materialBaseInfoPOS.get(0).getMaterialBaseInfoId(); + // 根据物料id查询对应库存,无库存则库存id为空 + List reservationMaterialInventories = reservationMaterialInventoryMapper.selectList( + new LambdaQueryWrapper() + .eq(ReservationMaterialInventory::getMaterialBaseInfoId, materialBaseInfoId)); + if (reservationMaterialInventories == null || reservationMaterialInventories.isEmpty()) { + continue; + } + // 取可用数量大于导入数据件数的库存,填充库存id;都不满足则库存id为空 + for (ReservationMaterialInventory inventory : reservationMaterialInventories) { + BigDecimal allocationQuantity = inventory.getAllocationQuantity() == null ? BigDecimal.ZERO : inventory.getAllocationQuantity(); + if (allocationQuantity.compareTo(importQuantity) > 0) { + reservedInventory.setMaterialInventoryId(inventory.getMaterialInventoryId()); + break; + } + } + } + } + public void importInData(List dataList) { LoginUser loginUser = SecurityUtils.getLoginUser(); ReserveStockOutOrderDO reserveStockOutOrder = new ReserveStockOutOrderDO(); diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReserveStockOutOrder/ReserveStockOutOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReserveStockOutOrder/ReserveStockOutOrderApi.java index 14e6d1f9e..5be6eb209 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReserveStockOutOrder/ReserveStockOutOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReserveStockOutOrder/ReserveStockOutOrderApi.java @@ -296,6 +296,31 @@ public class ReserveStockOutOrderApi extends BaseController { } } + /** + * 仅解析Excel文件内容并返回,不执行入库 + * 同时根据货物名称查询WMS对应物料库存,可用数量大于件数的返回库存id,匹配不到库存id返回空 + */ + @ApiOperation("解析导入Excel(仅解析不入库)") + @PostMapping("/parseExcel") + public ResponseEntity> parseExcel(@RequestParam("file") MultipartFile file) { + List dataList = null; + try { + dataList = ExcelParseUtil.parseExcel(file); + } catch (IOException e) { + throw new RuntimeException(e); + } + + // 根据货物名称查询WMS库存并填充库存id,匹配不到库存id返回空 + stockOutOrderApplicationService.fillMaterialInventoryId(dataList); + + Map successResponse = new HashMap<>(); + successResponse.put("code", 200); + successResponse.put("message", "Excel解析成功"); + successResponse.put("dataCount", dataList.size()); + successResponse.put("details", dataList); + return ResponseEntity.ok(successResponse); + } + /** * 生成出库预约单号 */ diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reserveStockInOrder/ReserveStockInOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reserveStockInOrder/ReserveStockInOrderApi.java index f1526fe43..66a8e66a6 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reserveStockInOrder/ReserveStockInOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reserveStockInOrder/ReserveStockInOrderApi.java @@ -260,6 +260,52 @@ public class ReserveStockInOrderApi extends BaseController { } } + /** + * 仅解析Excel文件内容并返回,不执行入库 + * 同时根据货物名称匹配WMS物料并返回物料id,匹配不到返回空 + */ + @ApiOperation("解析导入Excel(仅解析不入库)") + @PostMapping("/parseExcel") + public ResponseEntity> parseExcel(@RequestParam("file") MultipartFile file) { + try { + List dataList = ExcelParseUtil.parseExcel(file); + + // 根据货物名称匹配WMS物料并填充物料id,匹配不到返回空 + stockInOrderApplicationService.fillMaterialBaseInfoId(dataList); + + Map successResponse = new HashMap<>(); + successResponse.put("code", 200); + successResponse.put("message", "Excel解析成功"); + successResponse.put("dataCount", dataList.size()); + successResponse.put("details", dataList); + return ResponseEntity.ok(successResponse); + + } catch (ValidationException e) { + // 数据验证失败响应 + Map errorResponse = new HashMap<>(); + errorResponse.put("code", 400); + errorResponse.put("message", "数据验证失败"); + errorResponse.put("errorDetails", e.getMessage()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse); + + } catch (IOException e) { + // 文件处理失败响应 + Map errorResponse = new HashMap<>(); + errorResponse.put("code", 500); + errorResponse.put("message", "文件处理失败"); + errorResponse.put("errorDetails", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse); + + } catch (Exception e) { + // 其他未知错误响应 + Map errorResponse = new HashMap<>(); + errorResponse.put("code", 500); + errorResponse.put("message", e.getMessage()); + errorResponse.put("errorDetails", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse); + } + } + /** * 老系统入库预约单数据导入(主表+明细两个Excel文件批量导入,按名称匹配基础数据) */ diff --git a/mhd_oms/src/main/resources/mapper/reserveStockOutOrder/ReserveStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reserveStockOutOrder/ReserveStockOutOrderMapper.xml index 5d27761f8..f73673720 100644 --- a/mhd_oms/src/main/resources/mapper/reserveStockOutOrder/ReserveStockOutOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reserveStockOutOrder/ReserveStockOutOrderMapper.xml @@ -95,6 +95,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -112,7 +114,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.COMPLETE_TIME,a.ORDER_DATE,a.TRANSPORT_MODE_CODE,a.TRANSPORT_MODE_NAME,a.SUPERVISION_MODE_CODE,a.SUPERVISION_MODE_NAME, a.CUSTOMS_INSPECTION_FLAG,a.NEED_DECLARE_FLAG,a.NEED_TRANSPORT_FLAG,a.picture_app,a.reservation_audit_time,a.reservation_audit_name ,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.tms_order_number, - a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.RESERVATION_ORDER_SOURCE,a.OUTBOUND_TIME + a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.RESERVATION_ORDER_SOURCE,a.OUTBOUND_TIME,a.RESERVE_BUSINESS_TYPE,a.RESERVE_BUSINESS_TYPE_NAME diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/entity/MaterialBaseInfo.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/entity/MaterialBaseInfo.java index 127ea97b2..7250d613b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/entity/MaterialBaseInfo.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/entity/MaterialBaseInfo.java @@ -240,4 +240,7 @@ public class MaterialBaseInfo extends BaseVOEntity { @ApiModelProperty(name = "组织(多个用,分开)") private String orgId; + @ApiModelProperty(name = "是否正常物料: 0-是 1-否") + private Integer isNormalMaterial; + } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/po/MaterialBaseInfoPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/po/MaterialBaseInfoPO.java index a07dbd095..0f7b436ba 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/po/MaterialBaseInfoPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/po/MaterialBaseInfoPO.java @@ -289,4 +289,7 @@ public class MaterialBaseInfoPO extends BaseVOEntity { @ApiModelProperty(name = "组织(多个用,分开)") private String orgId; + + @ApiModelProperty(name = "是否正常物料: 0-是 1-否") + private Integer isNormalMaterial; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/todo/MaterialBaseInfoDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/todo/MaterialBaseInfoDO.java index 4f12be185..a0976ccac 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/todo/MaterialBaseInfoDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/todo/MaterialBaseInfoDO.java @@ -262,4 +262,7 @@ public class MaterialBaseInfoDO extends BaseVOEntity { @ApiModelProperty(name = "组织(多个用,分开)") private String orgId; + + @ApiModelProperty(name = "是否正常物料: 0-是 1-否") + private Integer isNormalMaterial; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBaseInfo/MaterialBaseInfoDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBaseInfo/MaterialBaseInfoDTO.java index 94f769e21..85c38d9e5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBaseInfo/MaterialBaseInfoDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBaseInfo/MaterialBaseInfoDTO.java @@ -314,4 +314,6 @@ public class MaterialBaseInfoDTO extends BaseVOEntity { @ApiModelProperty(name = "组织(多个用,分开)") private String orgId; + @ApiModelProperty(name = "是否正常物料: 0-是 1-否") + private Integer isNormalMaterial; } \ No newline at end of file diff --git a/mhd_wms/src/main/resources/mapper/materialBaseInfo/MaterialBaseInfoMapper.xml b/mhd_wms/src/main/resources/mapper/materialBaseInfo/MaterialBaseInfoMapper.xml index e2fd31cd5..3a6054c5d 100644 --- a/mhd_wms/src/main/resources/mapper/materialBaseInfo/MaterialBaseInfoMapper.xml +++ b/mhd_wms/src/main/resources/mapper/materialBaseInfo/MaterialBaseInfoMapper.xml @@ -68,6 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -77,7 +78,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" material_shape_name, a.material_size, a.material_length, a.material_width, a.material_height, a.remark, a.nullify, a.create_time, a.create_by, a.create_by_name, a.update_time, a.update_by, a.update_by_name, a.del_flag, a.common, sku_code, a.unit_price, a.currency, a.origin_country, a.hs_code, a.declaration_unit, a.statutory_unit, a.statutory_second_unit, a.copy_code, a.push_status,a.push_time,a.push_by,a.goods_type,a.gross_weight,a.push_by_name,a.unit,a.INSURE_AMOUNT,a.CHARGE_STANDARD, - specification_model as specification_model,nvl(b.stock_qty,0) as stock_quantity,c.charge_standard as charge_standard_class + specification_model as specification_model,nvl(b.stock_qty,0) as stock_quantity,c.charge_standard as charge_standard_class,a.is_normal_material from material_base_info a left join ( select material_base_info_id, sum(INVENTORY_QUANTITY) as stock_qty from MATERIAL_INVENTORY group by material_base_info_id