From 7c367b3cdf17c04fd8ba9453bd3efbc6ffafb089 Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Tue, 23 Jun 2026 10:42:13 +0800 Subject: [PATCH] =?UTF-8?q?rev:MES=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/dao/mapper/StructattrMapper.java | 2 + .../service/dao/mapper/StructattrMapper.xml | 16 ++++ .../controller/MesToWmsController.java | 7 ++ .../dto/mes/MesBackMaterialRequestDto.java | 5 ++ .../ext_manage/service/MesToWmsService.java | 7 ++ .../service/impl/MesToWmsServiceImpl.java | 78 +++++++++++++++++-- .../service/impl/PdaIosInServiceImpl.java | 33 +++++++- 7 files changed, 142 insertions(+), 6 deletions(-) diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.java index 9b858d4..a1691a5 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.java @@ -19,4 +19,6 @@ public interface StructattrMapper extends BaseMapper{ List collectVehicleNoGroup(Map query); + List> queryEmptyLocation(); + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml index 27ed86d..a527e34 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml @@ -87,4 +87,20 @@ + + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/controller/MesToWmsController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/controller/MesToWmsController.java index 4aac563..49f7200 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/controller/MesToWmsController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/controller/MesToWmsController.java @@ -58,6 +58,13 @@ public class MesToWmsController { return new ResponseEntity<>(mesToWmsService.getStructivt(whereJson), HttpStatus.OK); } + @PostMapping("/getLocation") + @Log("查询空仓位") + @SaIgnore + public ResponseEntity getLocation() { + return new ResponseEntity<>(mesToWmsService.getLocation(), HttpStatus.OK); + } + @PostMapping("/updateTask") @Log("修改任务") diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesBackMaterialRequestDto.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesBackMaterialRequestDto.java index 865ce5f..641a112 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesBackMaterialRequestDto.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesBackMaterialRequestDto.java @@ -34,4 +34,9 @@ public class MesBackMaterialRequestDto { * */ private Boolean mes_is_manual; + + /** + * 手工或AGV任务都可以指定库位 + */ + private String struct_code; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/MesToWmsService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/MesToWmsService.java index 6554a31..fd65312 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/MesToWmsService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/MesToWmsService.java @@ -36,6 +36,13 @@ public interface MesToWmsService { */ MesResponse getStructivt(JSONObject whereJson); + /** + * MES 查询空仓位 + * @param whereJson + * @return MesResponse + */ + MesResponse getLocation(); + /** * MES 更新任务 * @param diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/MesToWmsServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/MesToWmsServiceImpl.java index 7c103b1..a3e30b7 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/MesToWmsServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/MesToWmsServiceImpl.java @@ -23,6 +23,7 @@ import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo; import org.nl.wms.basedata_manage.service.dao.Sectattr; import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper; +import org.nl.wms.basedata_manage.service.dao.mapper.StructattrMapper; import org.nl.wms.ext_manage.dto.mes.MesBackMaterialRequestDto; import org.nl.wms.ext_manage.dto.mes.MesCallMaterialRequestDto; import org.nl.wms.ext_manage.dto.mes.MesResponse; @@ -83,6 +84,9 @@ public class MesToWmsServiceImpl implements MesToWmsService { @Autowired private IStructattrService structattrService; + @Resource + private StructattrMapper structattrMapper; + @Autowired private ISectattrService sectattrService; @@ -504,6 +508,8 @@ public class MesToWmsServiceImpl implements MesToWmsService { throw new BadRequestException("未找到载具编码为" + point.getVehicle_code() + "的载具入库库区,请检查字典中" + dict.getCode() + "是否维护参数1!"); } + Structattr targetStruct = resolveBackTargetStruct(dto, sectattr); + JSONObject param = new JSONObject(); if (dto.getIsManual() != null && dto.getIsManual()) { param.put("create_mode", IOSEnum.CREATE_MODE.code("手动")); @@ -514,6 +520,13 @@ public class MesToWmsServiceImpl implements MesToWmsService { param.put("mes_is_manual",dto.getMes_is_manual()); param.put("ext_task_code", dto.getTask_code()); + param.put("struct_id", targetStruct.getStruct_id()); + param.put("struct_code", targetStruct.getStruct_code()); + param.put("struct_name", targetStruct.getStruct_name()); + param.put("sect_id", targetStruct.getSect_id()); + param.put("sect_code", targetStruct.getSect_code()); + param.put("stor_id", targetStruct.getStor_id()); + param.put("stor_code", targetStruct.getStor_code()); //退料 if ("1".equals(dto.getTask_type())) { //查询组盘 @@ -535,8 +548,6 @@ public class MesToWmsServiceImpl implements MesToWmsService { MdMeMaterialbase materDao = materialbaseService.getByCode(groupPlate.getMaterial_id(), true); //通过托盘号查找组盘信息 - param.put("sect_code", sectattr.getSect_code()); - param.put("sect_id", sectattr.getSect_id()); param.put("vehicle_code", point.getVehicle_code()); param.put("storagevehicle_code", param.getString("vehicle_code")); param.put("site_code", pointCode); @@ -546,7 +557,6 @@ public class MesToWmsServiceImpl implements MesToWmsService { param.put("group_id", groupPlate.getGroup_id()); param.put("qty", dto.getQty()); param.put("qty_unit_name", groupPlate.getQty_unit_name()); - param.put("stor_id", sectattr.getStor_id()); param.put("supp_code", groupPlate.getSupp_code()); param.put("supp_name", groupPlate.getSupp_name()); return MesResponse.requestParamOk(pdaIosInService.zwConfirmReturnMaterial(param)); @@ -556,8 +566,6 @@ public class MesToWmsServiceImpl implements MesToWmsService { param.put("vehicle_code", point.getVehicle_code()); param.put("storagevehicle_code", param.getString("vehicle_code")); param.put("site_code", pointCode); - param.put("sect_id", sectattr.getSect_id()); - param.put("sect_code", sectattr.getSect_code()); param.put("back_material_flag", true); pdaIosInService.vehicleInConfirm(param); } else { @@ -576,11 +584,71 @@ public class MesToWmsServiceImpl implements MesToWmsService { } } + private Structattr resolveBackTargetStruct(MesBackMaterialRequestDto dto, Sectattr defaultSect) { + boolean mesManual = Boolean.TRUE.equals(dto.getMes_is_manual()); + String structCode = StringUtils.trimToEmpty(dto.getStruct_code()); + + if (mesManual && StringUtils.isBlank(structCode)) { + throw new BadRequestException("人工搬运时目标仓位struct_code不可为空!"); + } + + if (!mesManual && StringUtils.isBlank(structCode)) { + return findAvailableTargetStruct(defaultSect.getSect_code(), Collections.singleton("LT"), Collections.singleton("LTXN")); + } + + Structattr targetStruct = structattrService.getOne(new QueryWrapper() + .eq("struct_code", structCode) + .eq("is_used", 1) + .eq("lock_type", "0") + .eq("occupancy_state", 1) + .and(wrapper -> wrapper.isNull("task_code").or().eq("task_code", "")) + .and(wrapper -> wrapper.isNull("storagevehicle_code").or().eq("storagevehicle_code", ""))); + if (ObjectUtil.isEmpty(targetStruct)) { + throw new BadRequestException("目标仓位【" + structCode + "】不是可入库空仓位,请核对!"); + } + + if (!mesManual) { + if (!"LT".equals(targetStruct.getStor_code())) { + throw new BadRequestException("AGV搬运时目标仓位【" + structCode + "】只能属于料筒库(LT)!"); + } + if ("LTXN".equals(targetStruct.getSect_code())) { + throw new BadRequestException("AGV搬运时目标仓位【" + structCode + "】不能属于虚拟区(LTXN)!"); + } + } + + return targetStruct; + } + + private Structattr findAvailableTargetStruct(String sectCode, Set allowStorCodes, Set excludeSectCodes) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("is_used", 1) + .eq("lock_type", "0") + .eq("occupancy_state", 1) + .eq("sect_code", sectCode) + .in("stor_code", allowStorCodes) + .and(wrapper -> wrapper.isNull("task_code").or().eq("task_code", "")) + .and(wrapper -> wrapper.isNull("storagevehicle_code").or().eq("storagevehicle_code", "")) + .last("order by struct_code limit 1"); + if (excludeSectCodes != null && !excludeSectCodes.isEmpty()) { + queryWrapper.notIn("sect_code", excludeSectCodes); + } + Structattr targetStruct = structattrService.getOne(queryWrapper); + if (ObjectUtil.isEmpty(targetStruct)) { + throw new BadRequestException("当前库区【" + sectCode + "】无可用空仓位,请核对!"); + } + return targetStruct; + } + @Override public MesResponse getStructivt(JSONObject whereJson) { return MesResponse.requestParamOk(mdPbStoragevehicleextMapper.queryAllIn(whereJson)); } + @Override + public MesResponse getLocation() { + return MesResponse.requestParamOk(structattrMapper.queryEmptyLocation()); + } + @Override public MesResponse getTaskList(MesUpdateTaskDto dto) { return MesResponse.requestParamOk(iSchBaseTaskService.list(new LambdaQueryWrapper() diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java index 9ae1002..c50d018 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java @@ -821,7 +821,12 @@ public class PdaIosInServiceImpl implements PdaIosInService { params.put("pcsn", whereJson.getString("pcsn")); params.put("stragegy_type", whereJson.getString("stragegy_type")); params.put("is_empty_vehicle", true); - Structattr attrDao = iRawAssistIStorService.getStructattr(params); + Structattr attrDao; + if (StringUtils.isNotBlank(whereJson.getString("struct_code"))) { + attrDao = getSpecifiedTargetStruct(whereJson); + } else { + attrDao = iRawAssistIStorService.getStructattr(params); + } //确定起点 SchBasePoint schBasePoint = iSchBasePointService.getOne(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_code, whereJson.getString("site_code"))); if (ObjectUtil.isEmpty(schBasePoint)) { @@ -1310,11 +1315,37 @@ public class PdaIosInServiceImpl implements PdaIosInService { disDtl.forEach(item -> { tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class)); }); + if (StringUtils.isNotBlank(whereJson.getString("struct_code")) && !tableMater.isEmpty()) { + Structattr targetStruct = getSpecifiedTargetStruct(whereJson); + jsonMst.put("checked", false); + LinkedHashMap row = tableMater.get(0); + row.put("sect_id", targetStruct.getSect_id()); + row.put("sect_code", targetStruct.getSect_code()); + row.put("sect_name", targetStruct.getSect_name()); + row.put("struct_id", targetStruct.getStruct_id()); + row.put("struct_code", targetStruct.getStruct_code()); + row.put("struct_name", targetStruct.getStruct_name()); + } jsonMst.put("tableMater", tableMater); return jsonMst; } + private Structattr getSpecifiedTargetStruct(JSONObject whereJson) { + String structCode = whereJson.getString("struct_code"); + Structattr targetStruct = iStructattrService.getOne(new QueryWrapper() + .eq("struct_code", structCode) + .eq("is_used", 1) + .eq("lock_type", "0") + .eq("occupancy_state", 1) + .and(wrapper -> wrapper.isNull("task_code").or().eq("task_code", "")) + .and(wrapper -> wrapper.isNull("storagevehicle_code").or().eq("storagevehicle_code", ""))); + if (ObjectUtil.isEmpty(targetStruct)) { + throw new BadRequestException("目标仓位【" + structCode + "】不是可入库空仓位,请核对!"); + } + return targetStruct; + } + /** * 下发任务 * @param whereJson {