diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/HAIAN_AI_CONTEXT.md b/src/main/java/com/gaotao/modules/autoWareHourceHaian/HAIAN_AI_CONTEXT.md index 53f73b6a..b188f0cf 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/HAIAN_AI_CONTEXT.md +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/HAIAN_AI_CONTEXT.md @@ -109,7 +109,7 @@ - 自动发料标签新增落库快照 `order_no/release_no/sequence_no`:定时RFID建单按site+标签号+预定领料单号,经领料明细item_no关联`haian_SOIssueNotifyOrderList`取soorder_no/release_no/sequence_no;无来源留空,不同工单多匹配拒绝建单。PC申请单号后三列展示快照,移库失败也可看工单;存量升级执行`sql/20260920_haian_auto_issue_label_order_snapshot.sql`,仅补54工厂全空且唯一匹配的历史快照,不覆盖发料状态。- rqrq - 海安 `wcsWareHouse` 回调同样采用“两段式”:第一段接口只写 `haian_wcs_callback_task(status=已录入)`;第二段由 `HaianWcsSchedule.scheduleHaianWcsTaskProcessing(2.6秒)` 乐观锁消费,并按 `入货架(原入库)/出货架(原出库)/离开入库口(原取走栈板)/到达异常位(原异常位处理)/到达出库口(原取货通知)/到达手工分拣区` 分流处理(到达出库口不再依赖transportTask分支,且不执行 `palletAutoGoToWCS.goToWCS` 回库逻辑;离开入库口释放calling_flag并把托盘落到A01+立库输送线、不改wcs_location;到达手工分拣区仅把 `haian_pallet.location_code` 改成回传点位,不改 calling_flag、不做移库) - rqrq - 海安手工分拣区写死为 `R1/R2/R3/R4`(`HaiAnStationStaticData.MANUAL_SORT_STATIONS`)。被分拣源盘是海安新增概念,站点写死在 `HaiAnStationStaticData.SORTED_SOURCE_STATIONS`(当前 `R5/R6/R7/R8`),禁止把 R1–R4 填进被分拣数组。组盘入库/手工组盘扫盘扫标签必须传 `sortFlag=0`,命中手工分拣区或被分拣站一律拒绝;人工分拣页传 `sortFlag=1` 才允许这两类栈板。禁止用“不是 J1-J4 就算被分拣” - rqrq -- 被分拣源盘(`sortedSourceFlag=true`):扫进=把允许回库的标签放回本盘(不卡分拣清单、拦 `reserve_flag=Y`、明细 `wcs_flag=1`);扫回=解绑本盘明细,禁止 `restorePalletDetail` 写回错误托盘;提交分拣=组盘 `Type=2` 且 `endFlag=Y`,无增量也发空 `cargoInfos` 通知回库。手工分拣工作盘保持原逻辑(卡分拣清单、扫回恢复原托盘、无增量跳过、`endFlag=N`) - rqrq +- 被分拣源盘(`sortedSourceFlag=true`):扫进=把允许回库的标签放回本盘(不卡分拣清单、拦 `reserve_flag=Y`、明细 `wcs_flag=1`),不回写领料取出标记;扫回=解绑本盘明细,禁止 `restorePalletDetail` 写回错误托盘;提交分拣=组盘 `Type=2` 且 `endFlag=Y`,无增量也发空 `cargoInfos` 通知回库。手工分拣工作盘仍卡分拣清单、扫回恢复原托盘、无增量跳过、`endFlag=N`;工作盘扫入成功后立即回写领料取出标记,提交时继续推进任务状态 - rqrq - 海安 `pickingFeedback` 回调采用独立“两段式”消费:第一段接口只写 `haian_wcs_callback_pallet_scan(process_status=PENDING)`;第二段由 `HaianWcsSchedule.scheduleInventoryDiscrepancyProcessing(7.745秒)` 按 `actionType` 分流处理(`被分拣回传` 写库存差异表、`自动分拣` 回写增量标签与任务状态) - rqrq - 海安自动分拣回调不启用“endFlag=Y自动发起任务”语义:无增量数据时仅结束本条回调,不自动创建空托盘任务或下发额外配送任务 - rqrq - 海安到达出库口(原取货通知)在“来源=领料申请单/发货通知单”且“托盘无预约取走任务 + 存在预定标签”时,必须批量回写 `haian_SOIssueNotifyOrderMaterialList_detail.out_wcs_flag='Y'`,并联动对应 `haian_wms_order_task_detail` 置 `已完成/直接出库`、主任务在明细全完成后置 `已完成` - rqrq @@ -145,7 +145,10 @@ - 扫入不比较标签与栈板区域的仓库/库位;已绑定站点的栈板也允许跨仓标签扫入,扫入只保存栈板明细,不立即改写标签库存位置 - rqrq - 栈板后续随 AGV 放货、手工绑定站点或 WCS 入货架等现有流程触发移库;移库入队和 IFS 处理仍按目标区域配置及标签实时库存状态执行 - rqrq - 海安PDA组盘入库页的托盘高度为选填,允许清空选择并提交运输入库;已选高度随请求保存并下发,未选时复用托盘已保存高度,托盘也无高度时仅在WCS报文默认低于600,不写默认值到主表。- rqrq -- 所有“扫入/扫出/扫回”标签操作前,若栈板 `area` 非空,必须按 `site+area` 联查 `haian_area.pack_able`;当 `pack_able='N'` 时必须拒绝并提示“该区域禁止扫标签操作”。组盘入库/手工组盘不得跳过本校验。仅人工分拣页被分拣源盘允许跳过 `pack_able` - rqrq +- 所有“扫入/扫出/扫回”标签操作前,若栈板 `area` 非空,必须按 `site+area` 联查 `haian_area.pack_able`;当 `pack_able='N'` 时必须拒绝并提示“该区域禁止扫标签操作”。组盘入库/手工组盘不得跳过本校验。人工分拣页(`sortFlag=1`)扫入时,工作盘和被分拣源盘都跳过 `pack_able`;扫出仍只对被分拣源盘跳过,工作盘扫出继续校验。分拣场景的扫回跳过 `pack_able` - rqrq +- 手工分拣工作盘扫入(`sortFlag=1` 且站点命中 `HaiAnStationStaticData.MANUAL_SORT_STATIONS`)落盘成功后,按 `site+标签号` 把 `haian_SOIssueNotifyOrderMaterialList_detail` 中 `out_wcs_flag='N'` 的行改成 `Y` 并写 `out_wcs_time`。无匹配申请单或已是 `Y` 时更新 0 行,不阻断扫入;写入失败回滚本次扫入。被分拣放回和组盘扫入不回写 - rqrq +- 分拣扫回(`sortFlag=1` 的 `restorePalletDetail`)按 `site+标签号` 把已取出的 `out_wcs_flag='Y'` 改回 `N` 并清空 `out_wcs_time`;已是 `N` 的行不改。写入失败回滚本次扫回 - rqrq +- 手工分拣提交或结束仍按本次 `wcs_flag=1` 增量推进海安任务明细和主任务。查询申请单明细不再排除已取出行,扫入时已写成 `Y` 的标签也要继续推进任务;`out_wcs_flag` 回写仍只改 `N` - rqrq - 若栈板 `area` 为空或空串,跳过 `pack_able` 校验,保持离站栈板可操作语义 - rqrq ## 8. 托盘类型特殊规则 diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/entity/HaiAnAutoSortingInfoRequest.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/entity/HaiAnAutoSortingInfoRequest.java index 26a9cd33..31a2fa15 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/entity/HaiAnAutoSortingInfoRequest.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/api/entity/HaiAnAutoSortingInfoRequest.java @@ -20,7 +20,7 @@ public class HaiAnAutoSortingInfoRequest { private String palletId; /** - * 查询点位。手工分拣传当前托盘站点,不再换成被分拣源盘位;看板传 ALL。不落库,HTTP 体序列化为 JSON 字符串。 - rqrq + * 查询点位,立库按该值原样返回对应清单。分拣盘传当前工作位;被分拣盘通知回库传配对工作位,不传源盘位;看板传 ALL。不落库,HTTP 体序列化为 JSON 字符串。 - rqrq */ private String locationCode; } 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 8baa7b09..b05e8c2b 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 @@ -1987,10 +1987,10 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe * 任一查询失败或校验不通过均中断当前事务,不生成WOT且不下发WCS。- rqrq * @param site 海安工厂,限定托盘与明细范围 - rqrq * @param palletId 当前被分拣源盘编码 - rqrq - * @param sourceStation 当前源盘实际位置,供WCS查询和工作位映射 - rqrq + * @param sourceStation 当前源盘实际位置,只用于映射配对工作位,不直接作为立库查询点位 - rqrq */ private void validateSortedSourceReturn(String site, String palletId, String sourceStation) throws Exception { - // 用源盘当前位置实时获取WCS拣选清单,不能依赖PDA扫码时缓存;接口或报文异常阻断回库。- rqrq + // 立库按请求点位原样返回清单;源盘位查不到工作位任务,必须先换成配对工作位再查。失败阻断回库。- rqrq List pickingLabels = querySourceSortingLabels(site, palletId, sourceStation); // 在已锁定的本盘明细范围内查当前标签,只有清单标签仍在本源盘时才提示未分拣。- rqrq List palletDetails = haiAnPdaAutoWarehouseMapper.getPalletDetails(site, palletId, "", null); @@ -2028,11 +2028,13 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe } /** - * 按源盘位置请求WCS拣选清单,响应按配对工作位识别并兼容返回源盘位的旧报文。- rqrq - * 空站点数组代表无待拣标签;非空报文缺少本组站点、重复站点或标签无效时失败,防止误放行。- rqrq + * 通知回库按配对工作位请求WCS拣选清单。立库传什么点位就返回什么点位,不能把 ST-MP-01 当成 ST-MP-05 去查。- rqrq + * 空站点数组代表无待拣标签;非空报文缺少所查工作位、重复站点或标签无效时失败,防止误放行。- rqrq + * @param sourceStation 被分拣源盘当前位置,仅用于映射工作位 - rqrq * @return 本组待拣标签号,按WCS顺序去重 - rqrq */ private List querySourceSortingLabels(String site, String palletId, String sourceStation) throws Exception { + // ST-MP-01→05、02→06、03→07、04→08;映射失败说明站点未配置,不能拿源盘位硬查。- rqrq String workStation = HaiAnStationStaticData.resolveSortingWorkStation(sourceStation); if (!StringUtils.hasText(workStation)) { throw new RuntimeException("被分拣托盘位置未配置对应分拣工作位:" + sourceStation); @@ -2040,8 +2042,9 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe HaiAnAutoSortingInfoRequest queryRequest = new HaiAnAutoSortingInfoRequest(); queryRequest.setSite(site); queryRequest.setPalletId(palletId); - queryRequest.setLocationCode(sourceStation); - // WCS查询入参是源盘位置,接口失败直接抛错;不得把失败当成空清单放行回库。- rqrq + // HTTP体只有这一个点位字符串;传源盘位会原样返回源盘清单,待拣标签会对错工作位。- rqrq + queryRequest.setLocationCode(workStation); + // 按工作位查清单,接口失败直接抛错;不得把失败当成空清单放行回库。- rqrq String response = haiAnWcsApiService.queryAutoSortingInfo(queryRequest); JsonNode root = new ObjectMapper().readTree(response); if (root == null) { @@ -2064,7 +2067,8 @@ public class HaiAnPdaAutoWarehouseServiceImpl implements HaiAnPdaAutoWarehouseSe if (!StringUtils.hasText(stationCode)) { stationCode = station.path("stationCode").asText(""); } - if (!workStation.equals(HaiAnStationStaticData.resolveSortingWorkStation(stationCode))) { + // 立库回显的就是请求点位,只收本次发出的工作位,不再把源盘位反查成工作位。- rqrq + if (!workStation.equalsIgnoreCase(stationCode.trim())) { continue; } if (matched) {