From eb83d1cb9c0c8d544470d9e9bebaf9aeece88037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=B8=E7=86=9F=E5=90=B4=E5=BD=A6=E7=A5=96?= Date: Tue, 10 Nov 2026 09:21:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E6=8B=A3=E5=9B=9E=E5=BA=93=E9=AB=98?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/HaiAnWcsApiServiceImpl.java | 20 ++++++++++------- .../HaiAnPdaAutoWarehouseServiceImpl.java | 22 +++++++++++-------- .../staticData/HaiAnHeightStaticData.java | 15 +++++++++++++ 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/service/impl/HaiAnWcsApiServiceImpl.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/service/impl/HaiAnWcsApiServiceImpl.java index d42e224c..da8135fd 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/service/impl/HaiAnWcsApiServiceImpl.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/service/impl/HaiAnWcsApiServiceImpl.java @@ -111,17 +111,21 @@ public class HaiAnWcsApiServiceImpl implements HaiAnWcsApiService { && !HaiAnAssembleTypeStaticData.TYPE_SORT_OUTBOUND.equals(assembleType)) { throw new IllegalArgumentException("组盘业务类型type仅支持1入库组盘、2分拣放回、3分拣出库"); } - // 最终出口只保留通知回库的高度。其它组盘即使上游带了高度也改成空串,避免再补低于600 - rqrq - if (HaiAnAssembleTypeStaticData.TYPE_SORT_RETURN.equals(assembleType)) { - if (inData == null || !HaiAnHeightStaticData.isAllowed(inData.getHeight())) { - throw new IllegalArgumentException("通知回库必须选择托盘高度,仅支持低于600、600-1100、1100-1650"); - } - inData.setHeight(inData.getHeight().trim().toUpperCase()); - } else if (inData != null) { - inData.setHeight(""); + // 出站只卡通知回库。组盘入库和提交分拣的空高度必须保留成空串,不能在这里补档或拒绝 - rqrq + String outboundHeight = HaiAnHeightStaticData.resolveAssembleHeight( + assembleType, inData == null ? null : inData.getHeight()); + if (outboundHeight == null) { + throw new IllegalArgumentException("通知回库必须选择托盘高度,仅支持低于600、600-1100、1100-1650"); + } + if (inData != null) { + inData.setHeight(outboundHeight); } ObjectMapper objectMapper2 = new ObjectMapper(); Map request = objectMapper2.convertValue(inData, new TypeReference>() {}); + // 空串可能在转 Map 时丢掉,组盘入库和提交分拣仍要把 height 显式写成空串传给立库 - rqrq + if (request != null) { + request.put("height", outboundHeight); + } Long logId = null; // 保留已收到的响应原文供失败回填;未获得响应时保持null,避免伪造WCS回执 - rqrq diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPdaAutoWarehouseServiceImpl.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPdaAutoWarehouseServiceImpl.java index df163ecb..1f12e6f7 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPdaAutoWarehouseServiceImpl.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPdaAutoWarehouseServiceImpl.java @@ -1805,13 +1805,10 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe throw new RuntimeException("组盘业务类型type仅支持1入库组盘、2分拣放回、3分拣出库"); } - // 3. 只有通知回库(type=2)必须使用页面选择的高度。组盘入库、分拣出库、结束分拣和直接组盘都传空,不复用托盘旧高度,也不补低于600 - rqrq - String height = ""; - if (HaiAnAssembleTypeStaticData.TYPE_SORT_RETURN.equals(assembleType)) { - if (!HaiAnHeightStaticData.isAllowed(request.getHeight())) { - throw new RuntimeException("通知回库必须选择托盘高度,仅支持低于600、600-1100、1100-1650"); - } - height = request.getHeight().trim().toUpperCase(); + // 3. 只有通知回库(type=2)校验高度。组盘入库、提交分拣、结束分拣、直接组盘传空串,空值合法 - rqrq + String height = HaiAnHeightStaticData.resolveAssembleHeight(assembleType, request.getHeight()); + if (height == null) { + throw new RuntimeException("通知回库必须选择托盘高度,仅支持低于600、600-1100、1100-1650"); } // 4. 统一解析endFlag:显式值必须是Y/N;未传时按Type推导(1=Y,其它=N) - rqrq @@ -2188,13 +2185,14 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe request.setItemNo(1); request.setOriBarcode(oriBarcode); if (sortedSourcePallet) { - // 被分拣放回:type=2,endFlag=Y 告诉立库本包闭环可走 - rqrq + // 被分拣放回:type=2,endFlag=Y 告诉立库本包闭环可走。这一条才校验高度 - rqrq request.setType(HaiAnAssembleTypeStaticData.TYPE_SORT_RETURN); request.setEndFlag(HaiAnAssembleTypeStaticData.END_FLAG_YES); } else { - // 人工工作盘提交增量属于分拣出库,显式传type=3;endFlag=N表示本次尚未结束分拣 - rqrq + // 工作盘提交分拣是 type=3,不选高度。先清掉入参,避免空值被通知回库规则拦住 - rqrq request.setType(HaiAnAssembleTypeStaticData.TYPE_SORT_OUTBOUND); request.setEndFlag(HaiAnAssembleTypeStaticData.END_FLAG_NO); + request.setHeight(""); } HaiAnAssemblePalletRequest assembleRequest = buildAssembleRequest(request, palletInfo, detailRows); // 本次有增量才联动申请单立库取出及海安任务状态;与WCS下发处于同一事务,外呼失败回滚标记 - rqrq @@ -2800,6 +2798,8 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe request.setItemNo(1); request.setType(HaiAnAssembleTypeStaticData.TYPE_INBOUND); // 入库组盘 - rqrq request.setEndFlag(HaiAnAssembleTypeStaticData.END_FLAG_YES); // 运输入库为本次组盘闭环动作 - rqrq + // 组盘入库不选高度,空串合法,不能沿用托盘上一次通知回库留下的档位 - rqrq + request.setHeight(""); // 报文构建在单一方法完成:必填type校验、endFlag规则和cargoInfos组装统一核对,失败不外呼 - rqrq HaiAnAssemblePalletRequest assembleRequest = buildAssembleRequest(request, palletInfo, newDetailRows); // 运输入库高度固定空串;A0206空盘传空cargoInfos,其余按位置/层数/条码组装,组包失败不下发WCS - rqrq @@ -2938,6 +2938,8 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe request.setItemNo(1); request.setType(HaiAnAssembleTypeStaticData.TYPE_INBOUND); request.setEndFlag(HaiAnAssembleTypeStaticData.END_FLAG_YES); + // 直接组盘不选高度,报文固定空串 - rqrq + request.setHeight(""); HaiAnAssemblePalletRequest assembleRequest = buildAssembleRequest(request, palletInfo, newDetailRows); // 直接组盘目标位置固定为入库口,不使用托盘当前location_code - rqrq assembleRequest.setAssemblyPosition(assemblyPosition); @@ -3058,6 +3060,8 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe request.setOriBarcode(oriBarcode); request.setType(HaiAnAssembleTypeStaticData.TYPE_SORT_OUTBOUND); request.setEndFlag(HaiAnAssembleTypeStaticData.END_FLAG_YES); + // 结束分拣不选高度,空串合法 - rqrq + request.setHeight(""); // 组装报文沿用生成的taskNo、type=3、endFlag=Y及增量或空cargoInfos;组包失败回滚本地状态且不外呼 - rqrq HaiAnAssemblePalletRequest assembleRequest = buildAssembleRequest(request, palletInfo, detailRows); // 结束分拣本次带增量时同样回写申请单立库取出与海安任务状态;空包不更新,外呼失败回滚 - rqrq diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/staticData/HaiAnHeightStaticData.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/staticData/HaiAnHeightStaticData.java index 5220219d..ec94c868 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/staticData/HaiAnHeightStaticData.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/staticData/HaiAnHeightStaticData.java @@ -34,4 +34,19 @@ public final class HaiAnHeightStaticData { public static boolean isAllowed(String height) { return height != null && ALLOWED_HEIGHTS.contains(height.trim().toUpperCase()); } + + /** + * 组盘下发高度。只有通知回库 type=2 必须是允许档位,不合法时返回 null,由调用方拒绝。 + * 组盘入库、提交分拣、结束分拣、直接组盘一律返回空串:空值合法,不读托盘旧高度,也不补低于600。- rqrq + */ + public static String resolveAssembleHeight(Integer assembleType, String height) { + if (assembleType != null + && HaiAnAssembleTypeStaticData.TYPE_SORT_RETURN.intValue() == assembleType.intValue()) { + if (!isAllowed(height)) { + return null; + } + return height.trim().toUpperCase(); + } + return ""; + } }