diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/entity/HaiAnNotifyDataToWcs.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/entity/HaiAnNotifyDataToWcs.java index a4cf4645..b7909e75 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/entity/HaiAnNotifyDataToWcs.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/entity/HaiAnNotifyDataToWcs.java @@ -21,6 +21,16 @@ public class HaiAnNotifyDataToWcs { */ private String notifyNo; + /** + * 必填WMS任务单号,取自已写入海安任务主表的taskNo;本报文字段不单独落库,供WCS执行及回调关联任务 - rqrq + */ + private String taskNo; + + /** + * 必填WMS任务行号,取自海安任务主表itemNo的正整数值,当前领料和合托均为1;非申请单订单行号,本报文字段不单独落库,供WCS定位任务行 - rqrq + */ + private Integer itemNo; + /** * 业务类型:1生产 2分切 3销售 4手工盘点 5循环盘点 6委外 7合托 - rqrq */ @@ -41,4 +51,3 @@ public class HaiAnNotifyDataToWcs { */ private String targetArea; } - 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 9007543a..5d0a633d 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 @@ -153,11 +153,23 @@ public class HaiAnWcsApiServiceImpl implements HaiAnWcsApiService { /** * @author rqrq - * @Description 领料申请单推送,逻辑与老pushNotifyToWcsApi保持一致 - rqrq + * @Description 海安领料及合托推送,要求携带已创建任务的单号和正整数行号;校验或WCS调用失败抛异常,由调用方事务回滚 - rqrq */ @Override public void pushNotifyToWcsApi(HaiAnNotifyDataToWcs inData) { + // 序列化和HTTP短路前校验必填任务标识,防止空请求或无效任务被当作推送成功;失败交由上游回滚业务事务 - rqrq + if (inData == null) { + throw new RuntimeException("海安领料申请单推送失败:请求参数不能为空"); + } + // 检查taskNo是否包含有效文本,确保WCS能关联海安任务;缺失时不记录成功或发送请求 - rqrq + if (!StringUtils.hasText(inData.getTaskNo())) { + throw new RuntimeException("海安领料申请单推送失败:WMS任务单号taskNo不能为空"); + } + if (inData.getItemNo() == null || inData.getItemNo() <= 0) { + throw new RuntimeException("海安领料申请单推送失败:WMS任务行号itemNo必须为正整数"); + } ObjectMapper objectMapper2 = new ObjectMapper(); + // 将包含taskNo和itemNo的海安实体转为顶层请求字段,供后续日志和HTTP共用;转换失败向上抛出以回滚本地事务 - rqrq Map request = objectMapper2.convertValue(inData, new TypeReference>() {}); Long logId = null; diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnIssueNotifyPushTransactionServiceImpl.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnIssueNotifyPushTransactionServiceImpl.java index 41fd4240..ad1422b1 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnIssueNotifyPushTransactionServiceImpl.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnIssueNotifyPushTransactionServiceImpl.java @@ -198,6 +198,9 @@ public class HaiAnIssueNotifyPushTransactionServiceImpl implements HaiAnIssueNot HaiAnNotifyDataToWcs wcsData = new HaiAnNotifyDataToWcs(); wcsData.setSite(site); wcsData.setNotifyNo(notifyNo); + // 传递已落库任务的单号和行号,避免误用申请单订单行号造成WCS回调无法定位;缺失时由接口层拒绝并回滚本订单 - rqrq + wcsData.setTaskNo(task.getTaskNo()); + wcsData.setItemNo(task.getItemNo()); wcsData.setOrderType(1); wcsData.setOrderNo(StringUtils.defaultString(order.getSoorderNo()).trim()); wcsData.setTargetArea(targetAreaWcsCode); diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPalletMergeQueryServiceImpl.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPalletMergeQueryServiceImpl.java index 2524ca6b..ce2accb2 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPalletMergeQueryServiceImpl.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnPalletMergeQueryServiceImpl.java @@ -219,6 +219,9 @@ public class HaiAnPalletMergeQueryServiceImpl implements HaiAnPalletMergeQuerySe HaiAnNotifyDataToWcs notifyDataToWcs = new HaiAnNotifyDataToWcs(); notifyDataToWcs.setSite(site != null ? site.trim() : null); notifyDataToWcs.setNotifyNo(taskNo != null ? taskNo.trim() : null); + // 传递已落库合托主任务的单号和行号,多个托盘共用同一任务行;缺失时由接口层拒绝并回滚合托占用和任务 - rqrq + notifyDataToWcs.setTaskNo(orderTask.getTaskNo()); + notifyDataToWcs.setItemNo(orderTask.getItemNo()); notifyDataToWcs.setOrderNo(taskNo != null ? taskNo.trim() : null); notifyDataToWcs.setOrderType(7); diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/staticData/HaiAnStationStaticData.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/staticData/HaiAnStationStaticData.java index 05a94710..01b0f82f 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/staticData/HaiAnStationStaticData.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/staticData/HaiAnStationStaticData.java @@ -18,17 +18,17 @@ public final class HaiAnStationStaticData { /** * 海安唯一入库口。空托盘通知入库、直接组盘下发 WCS assemblyPosition 固定用此值,禁止再拆入库口1/2。 - rqrq */ - public static final String INBOUND_PORT = "入库口"; + public static final String INBOUND_PORT = "ST-INO1"; /** * 主动叫料固定站点:Call料、合托、盘点拉板下发 WCS targetPosition。已确认为整托出库口,与普通出库口不是同一点。 - rqrq */ - public static final String DIRECT_OUTBOUND_PORT = "整托出库口"; + public static final String DIRECT_OUTBOUND_PORT = "ST-FO-01"; /** * 普通出库口站点名。主动叫料本阶段不用;WCS「到达出库口」回传点位可能是此值,按回传原样落托盘。待确认站点实际编码。 - rqrq */ - public static final String NORMAL_OUTBOUND_PORT = "出库口"; + public static final String NORMAL_OUTBOUND_PORT = "ST-OUTO1"; /** * 立库内允许人工移出/作为地面运输端点的三个口;区域均为A01,不包含货架、输送线、异常位或分拣位。 - rqrq @@ -75,7 +75,7 @@ public final class HaiAnStationStaticData { * 异常位白名单。到达异常位必须命中本数组才落托盘位置,禁止写死单一编码;1101 仅兼容历史托盘。待确认站点实际编码。 - rqrq */ public static final List ERROR_STATIONS = Collections.unmodifiableList( - Arrays.asList("异常位1", "异常位2", "1101") + Arrays.asList("EXCP-01", "EXCP-02", "EXCP-03", "EXCP-04") ); /** @@ -97,21 +97,21 @@ public final class HaiAnStationStaticData { * 自动分拣组盘位白名单。pickingFeedback 命中记“自动分拣”。与手工分拣位、被分拣位都不是同一组。待确认站点实际编码,当前为旧暂定值 J1–J4。 - rqrq 海安自动分拣就2个位置 */ public static final List AUTO_SORT_STATIONS = Collections.unmodifiableList( - Arrays.asList("J1H", "J2H") + Arrays.asList("ST-RP-03", "ST-RP-04") ); /** * 手工分拣区站点白名单。原有人工分拣组盘工作盘点位,R1 属于本组,不是被分拣位。分拣页按工作盘逻辑:卡清单、扫回还原原托盘、无增量跳过、endFlag=N。 - rqrq */ public static final List MANUAL_SORT_STATIONS = Collections.unmodifiableList( - Arrays.asList("R1H", "R2H", "R3H", "R4H") + Arrays.asList("ST-MP-05", "ST-MP-06", "ST-MP-07", "ST-MP-08") ); /** * 海安新增被分拣源盘站点白名单。老模块没有这个站点概念,禁止复用手工分拣 R1–R4。分拣页命中后按放回标签/通知回库处理。站点实际编码待现场确认后只改本数组。 - rqrq */ public static final List SORTED_SOURCE_STATIONS = Collections.unmodifiableList( - Arrays.asList("R5H", "R6H", "R7H", "R8H") + Arrays.asList("ST-MP-01", "ST-MP-02", "ST-MP-03", "ST-MP-04") ); /**