diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/VehicleTwoController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/VehicleTwoController.java index 3f83421..844f457 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/VehicleTwoController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/VehicleTwoController.java @@ -51,6 +51,13 @@ public class VehicleTwoController { return new ResponseEntity<>(vehicleTwoService.twoVehicleIn(whereJson), HttpStatus.OK); } + @PostMapping("/inventoryCheckIn") + @Log("盘点入库") + @SaIgnore + public ResponseEntity inventoryCheckIn(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(vehicleTwoService.inventoryCheckIn(whereJson), HttpStatus.OK); + } + @PostMapping("/boxIn") @Log("木箱入库") @SaIgnore diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/VehicleTwoService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/VehicleTwoService.java index 3a2aff0..9747a1b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/VehicleTwoService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/VehicleTwoService.java @@ -20,6 +20,17 @@ public interface VehicleTwoService { */ JSONObject twoVehicleIn(JSONObject whereJson); + /** + * + * @param whereJson { + * vehicle_code: 载具号 + * point_code: 点位 + * box_no: 木箱号 + * } + * @return :JSONObject:返回前端参数 + */ + JSONObject inventoryCheckIn(JSONObject whereJson); + /** * 一楼入库空载具入库 * @param whereJson { diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/VehicleTwoServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/VehicleTwoServiceImpl.java index acbf3d4..c30f904 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/VehicleTwoServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/VehicleTwoServiceImpl.java @@ -21,6 +21,7 @@ import org.nl.b_lms.sch.point.service.IschBasePointService; import org.nl.b_lms.sch.task.dao.SchBaseTask; import org.nl.b_lms.sch.task.service.IschBaseTaskService; import org.nl.b_lms.sch.tasks.TwoInEmpExcepTask; +import org.nl.b_lms.sch.tasks.boxstack.BoxSSXTask; import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; @@ -32,6 +33,7 @@ import org.nl.b_lms.storage_manage.md.dao.MdPdStorageVehicleInfo; import org.nl.b_lms.storage_manage.md.dao.MdPdStoragevehicleext; import org.nl.b_lms.storage_manage.md.dao.mapper.MdPdStoragevehicleextMapper; import org.nl.b_lms.storage_manage.md.dao.mapper.MdStorageVehicleInfoMapper; +import org.nl.b_lms.storage_manage.st.dao.StIvtStructattr; import org.nl.common.enums.SpecEnum; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.RedisUtils; @@ -43,6 +45,7 @@ import org.nl.system.service.param.impl.SysParamServiceImpl; import org.nl.wms.basedata.st.service.StructattrService; import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.ext.mes.service.LmsToMesService; +import org.nl.wms.sch.manage.AutoSendFeiShu; import org.nl.wms.sch.manage.TaskStatusEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -50,10 +53,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; @Service @@ -122,6 +122,9 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { @Resource private IschBaseTaskService taskService; + @Autowired + private BoxSSXTask boxSSXTask; + /** * 空载具出库处理服务 @@ -227,6 +230,107 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { } + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject inventoryCheckIn(JSONObject whereJson) { + JSONObject result = new JSONObject(); + + String point_code = whereJson.getString("point_code"); + + // 判断起点是否存在 + SchBasePoint pointDao = ischBasePointService.getOne( + new QueryWrapper().lambda() + .eq(SchBasePoint::getPoint_code, point_code) + .eq(SchBasePoint::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) + .eq(SchBasePoint::getIs_used, IOSEnum.IS_NOTANDYES.code("是")) + ); + + if (ObjectUtil.isEmpty(pointDao)) { + throw new BadRequestException("点位:" + point_code + "不存在或未启用!"); + } + + int count = taskService.count(new QueryWrapper() + .eq("point_code1", point_code) + .eq("vehicle_code2", whereJson.getString("vehicle_code")) + .eq("is_delete", "0") + .lt("task_status", TaskStatusEnum.EXECUTING.getCode())); + + MdPdStorageVehicleInfo mdPdStorageVehicleInfo = mdStorageVehicleInfoMapper.selectOne(new QueryWrapper().eq("storagevehicle_code", whereJson.getString("vehicle_code"))); + if (ObjectUtil.isEmpty(mdPdStorageVehicleInfo)) { + throw new BadRequestException("载具不存在!"); + } + + MdPdStoragevehicleext mdPdStoragevehicleext = mdPdStoragevehicleextMapper.selectOne(new QueryWrapper().eq("storagevehicle_code", mdPdStorageVehicleInfo.getStoragevehicle_code())); + + if (ObjectUtil.isEmpty(mdPdStoragevehicleext)) { + + MdPdStoragevehicleext mdPdStoragevehicleextInsert = new MdPdStoragevehicleext(); + mdPdStoragevehicleextInsert.setStoragevehicleext_id(org.nl.common.utils.IdUtil.getStringId()); + mdPdStoragevehicleextInsert.setStoragevehicle_code(mdPdStorageVehicleInfo.getStoragevehicle_code()); + mdPdStoragevehicleextInsert.setStoragevehicle_id(mdPdStorageVehicleInfo.getStoragevehicle_id()); + mdPdStoragevehicleextInsert.setStoragevehicle_type(mdPdStorageVehicleInfo.getStoragevehicle_type()); + mdPdStoragevehicleextInsert.setPcsn(whereJson.getString("box_no")); + mdPdStoragevehicleextInsert.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId()); + mdPdStoragevehicleextInsert.setUpdate_time(DateUtil.now()); + mdPdStoragevehicleextInsert.setQty("1"); + mdPdStoragevehicleextMapper.insert(mdPdStoragevehicleextInsert); + + } else { + String pcsn = mdPdStoragevehicleext.getPcsn(); + if (StringUtils.isNotEmpty(pcsn)) { + JSONArray stIvtStructattr = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + pcsn + "'").getResultJSONArray(0); + if (stIvtStructattr != null && stIvtStructattr.size() > 0) { + throw new BadRequestException("当前托盘" + whereJson.getString("vehicle_code") + "已经绑定木箱" + pcsn); + } + } + + if(StringUtils.isBlank(mdPdStoragevehicleext.getQty())){ + mdPdStoragevehicleext.setQty("1"); + } + mdPdStoragevehicleext.setPcsn(whereJson.getString("box_no")); + mdPdStoragevehicleext.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId()); + mdPdStoragevehicleext.setUpdate_time(DateUtil.now()); + mdPdStoragevehicleextMapper.updateById(mdPdStoragevehicleext); + } + + if (count > 0) { + throw new BadRequestException(whereJson.getString("vehicle_code") + "存在任务"); + } + + if(!mdPdStoragevehicleext.getPcsn().equals(whereJson.getString("box_no"))){ + throw new BadRequestException("输入的箱号有误,请确认!"); + } + + List subList = ipdmBiSubpackagerelationService.list(new LambdaQueryWrapper() + .eq(PdmBiSubpackagerelation::getPackage_box_sn, mdPdStoragevehicleext.getPcsn()) + .eq(PdmBiSubpackagerelation::getStatus, "3")); + + if (null == subList || subList.size() == 0) { + throw new BadRequestException("已出库的子卷包装关系不存在,箱号:" + mdPdStoragevehicleext.getPcsn()); + } + + List material_barcode = subList.stream() + .filter(Objects::nonNull) + .map(PdmBiSubpackagerelation::getContainer_name) + .filter(str -> str != null && !str.trim().isEmpty()) + .collect(Collectors.toList()); + + whereJson.put("material_barcode", material_barcode); + whereJson.put("bill_type", IOSEnum.IN_TYPE.code("盘点入库")); + if (whereJson.getString("vehicle_code").startsWith("YNY")) { + whereJson.put("move_block_num", "4"); + } + if (!whereJson.containsKey("point_code")) { + whereJson.put("point_code", whereJson.getString("device_code")); + } + whereJson.put("device_code", whereJson.getString("point_code")); + inBussManageService.inTask(whereJson); + result.put("message", "入库成功!"); + return result; + } + + + @Override @Transactional(rollbackFor = Exception.class) public JSONObject vehicleOut(JSONObject whereJson) { @@ -260,6 +364,14 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { whereJson.put("point_code","RK2026"); } + if("RK2005".equals(whereJson.getString("point_code"))){ + whereJson.put("point_code","RK2027"); + } + + if("RK2008".equals(whereJson.getString("point_code"))){ + whereJson.put("point_code","RK2028"); + } + String point_code = whereJson.getString("point_code"); String vehicle_type = whereJson.getString("vehicle_type"); if( whereJson.getIntValue("layer") >4 || whereJson.getIntValue("layer")<1){ @@ -478,7 +590,9 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { if (bill_type.equals("0001") || bill_type.equals("0009")) { //此时执行临时方案 - if (IOSEnum.SPECIAL_POINTS.code("2楼手工生产点位").equals(whereJson.getString("point_code")) + if (IOSEnum.SPECIAL_POINTS.code("2楼异常点位").equals(whereJson.getString("point_code")) + ||IOSEnum.SPECIAL_POINTS.code("2楼装箱入库点1").equals(whereJson.getString("point_code")) + ||IOSEnum.SPECIAL_POINTS.code("2楼装箱入库点2").equals(whereJson.getString("point_code")) ||IOSEnum.VEHICLE_TYPE_SCAN_POINT.code("1").equals(whereJson.getString("point_code"))) { return reBackIn(whereJson); } @@ -553,6 +667,7 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { mdPdStoragevehicleextInsert.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId()); mdPdStoragevehicleextInsert.setUpdate_time(DateUtil.now()); mdPdStoragevehicleextInsert.setRemark("reBackIn"); + mdPdStoragevehicleextInsert.setQty("1"); mdPdStoragevehicleextMapper.insert(mdPdStoragevehicleextInsert); } else { @@ -563,6 +678,9 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { throw new BadRequestException("当前托盘" + whereJson.getString("vehicle_code") + "已经绑定木箱" + pcsn); } } + if (StringUtils.isBlank(mdPdStoragevehicleext.getQty())) { + mdPdStoragevehicleext.setQty("1"); + } mdPdStoragevehicleext.setPcsn(whereJson.getString("box_no")); mdPdStoragevehicleext.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId()); mdPdStoragevehicleext.setUpdate_time(DateUtil.now()); @@ -574,40 +692,71 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { whereJson.put("device_code","RK2026"); } - JSONArray rows = new JSONArray(); + if("RK2005".equals(whereJson.getString("device_code"))){ + whereJson.put("device_code","RK2027"); + } - JSONObject jsonObject = new JSONObject(); - jsonObject.put("device_code", whereJson.getString("device_code")); - jsonObject.put("code", "to_back_up_1"); - jsonObject.put("value", "4"); - jsonObject.put("product_area", "BLK"); - rows.add(jsonObject); + if("RK2008".equals(whereJson.getString("device_code"))){ + whereJson.put("device_code","RK2028"); + } - JSONObject jsonObject1 = new JSONObject(); - jsonObject1.put("device_code", whereJson.getString("device_code")); - jsonObject1.put("code", "to_container_type"); - jsonObject1.put("value", mdPdStorageVehicleInfo.getStoragevehicle_type().substring(mdPdStorageVehicleInfo.getStoragevehicle_type().length() - 1)); - jsonObject1.put("product_area", "BLK"); + if(!"RK2026".equals(whereJson.getString("device_code")) + && !"RK2027".equals(whereJson.getString("device_code")) + && !"RK2028".equals(whereJson.getString("device_code"))) { + JSONArray rows = new JSONArray(); - rows.add(jsonObject1); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("device_code", whereJson.getString("device_code")); + jsonObject.put("code", "to_back_up_1"); + jsonObject.put("value", "4"); + jsonObject.put("product_area", "BLK"); + rows.add(jsonObject); - JSONObject jsonObject2 = new JSONObject(); - jsonObject2.put("device_code", whereJson.getString("device_code")); - jsonObject2.put("code", "material_barcode"); - jsonObject2.put("value", whereJson.getString("box_no") +"-" + whereJson.getString("bill_type").replace("0","")); - jsonObject2.put("product_area", "BLK"); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("device_code", whereJson.getString("device_code")); + jsonObject1.put("code", "to_container_type"); + jsonObject1.put("value", mdPdStorageVehicleInfo.getStoragevehicle_type().substring(mdPdStorageVehicleInfo.getStoragevehicle_type().length() - 1)); + jsonObject1.put("product_area", "BLK"); - rows.add(jsonObject2); + rows.add(jsonObject1); - JSONObject jsonObject3 = new JSONObject(); - jsonObject3.put("device_code", whereJson.getString("device_code")); - jsonObject3.put("code", "barcode"); - jsonObject3.put("value", whereJson.getString("vehicle_code")); - jsonObject3.put("product_area", "BLK"); + JSONObject jsonObject2 = new JSONObject(); + jsonObject2.put("device_code", whereJson.getString("device_code")); + jsonObject2.put("code", "material_barcode"); + jsonObject2.put("value", whereJson.getString("box_no") + "-" + whereJson.getString("bill_type").replace("0", "")); + jsonObject2.put("product_area", "BLK"); - rows.add(jsonObject3); + rows.add(jsonObject2); + + JSONObject jsonObject3 = new JSONObject(); + jsonObject3.put("device_code", whereJson.getString("device_code")); + jsonObject3.put("code", "barcode"); + jsonObject3.put("value", whereJson.getString("vehicle_code")); + jsonObject3.put("product_area", "BLK"); + + rows.add(jsonObject3); + + wmsToAcsService.action(rows); + } else { + JSONObject param = new JSONObject(); + param.put("type", "4"); + param.put("container_type", mdPdStorageVehicleInfo.getStoragevehicle_type().substring(mdPdStorageVehicleInfo.getStoragevehicle_type().length() - 1)); + param.put("material_barcode", whereJson.getString("box_no") + "-" + whereJson.getString("bill_type").replace("0", "")); + param.put("barcode", whereJson.getString("vehicle_code")); + param.put("isUncap",whereJson.getString("is_un_cap")); + + JSONObject jsonParam = new JSONObject(); + jsonParam.put("start_device_code", whereJson.getString("device_code")); + jsonParam.put("next_device_code", "RK2011"); + jsonParam.put("vehicle_code2", whereJson.getString("box_no")); + jsonParam.put("vehicle_code", mdPdStorageVehicleInfo.getStoragevehicle_code()); + jsonParam.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + jsonParam.put("task_type", "010713"); + jsonParam.put("request_param", param.toString()); + boxSSXTask.createTask(jsonParam); + boxSSXTask.immediateNotifyAcs(null); + } - wmsToAcsService.action(rows); JSONObject result = new JSONObject(); result.put("message", "入库成功!"); return result; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java index 7fb92ca..bee8722 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.sch.task.dao.SchBaseTask; @@ -16,6 +17,8 @@ import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdisMapper; import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvOutServiceImpl; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.LashManageServiceImpl; +import org.nl.b_lms.storage_manage.md.dao.MdPdStoragevehicleext; +import org.nl.b_lms.storage_manage.md.dao.mapper.MdPdStoragevehicleextMapper; import org.nl.b_lms.storage_manage.st.dao.StIvtStructattr; import org.nl.b_lms.storage_manage.st.dao.mapper.StIvtStructattrMapper; import org.nl.common.utils.RedissonUtils; @@ -55,6 +58,9 @@ public class TwoOutTask extends AbstractAcsTask { @Autowired StIvtStructattrMapper stIvtStructattrMapper; + @Autowired + private MdPdStoragevehicleextMapper mdPdStoragevehicleextMapper; + @Override @@ -218,6 +224,7 @@ public class TwoOutTask extends AbstractAcsTask { } if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { RedissonUtils.lock(c -> { + StIvtIostorinvOutServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvOutServiceImpl.class); JSONObject jsonObject = (JSONObject) JSONObject.toJSON(jsonTask); bean.finishTask(jsonObject); @@ -235,6 +242,12 @@ public class TwoOutTask extends AbstractAcsTask { stIvtStructattrMapper.updateById(stIvtStructattr); } + // 更新载具信息表 + MdPdStoragevehicleext mdPdStoragevehicleext = mdPdStoragevehicleextMapper.selectOne(new LambdaQueryWrapper() + .eq(MdPdStoragevehicleext::getPcsn, jsonTask.getVehicle_code())); + mdPdStoragevehicleext.setPcsn(""); + mdPdStoragevehicleextMapper.updateById(mdPdStoragevehicleext); + JSONObject parse = (JSONObject) JSONObject.parse(jsonTask.getRequest_param()); JSONObject jsonParam = new JSONObject(); jsonParam.put("device_code",jsonTask.getPoint_code2()); @@ -262,7 +275,9 @@ public class TwoOutTask extends AbstractAcsTask { if (!"RK2009".equals(jsonTask.getPoint_code2()) &&!"RK1010".equals(jsonTask.getPoint_code2()) - &&!"RK1003".equals(jsonTask.getPoint_code2())) { + &&!"RK1003".equals(jsonTask.getPoint_code2()) + && !"RK2005".equals(jsonTask.getPoint_code2()) + && !"RK2008".equals(jsonTask.getPoint_code2())) { LashManageServiceImpl bean1 = SpringContextHolder.getBean(LashManageServiceImpl.class); bean1.createHeapTask(jsonParam); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/auto/AutoSendTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/auto/AutoSendTask.java new file mode 100644 index 0000000..e25c16a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/auto/AutoSendTask.java @@ -0,0 +1,82 @@ +package org.nl.b_lms.sch.tasks.auto; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.dao.mapper.SchBaseTaskMapper; +import org.nl.b_lms.sch.tasks.first_floor_area.auto.Prun; +import org.nl.common.utils.RedissonUtils; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Slf4j +@Component +public class AutoSendTask extends Prun { + + // 注入spring上下文 获取所有任务子类Bean + @Autowired + private ApplicationContext applicationContext; + + @Autowired + private SchBaseTaskMapper schBaseTaskMapper; + + @Override + public void run() { + try { + RedissonUtils.lock(c -> { + log.info("start_immediateNotifyAcs task......"); + // 获取全部继承AbstractAcsTask的Bean + Map allTaskBeans = applicationContext.getBeansOfType(AbstractAcsTask.class); + List totalAllTask = new ArrayList<>(); + + List waitingTaskList = schBaseTaskMapper.selectList(new LambdaQueryWrapper() + .eq(SchBaseTask::getTask_status,"04").eq(SchBaseTask::getIs_delete, "0")); + + + // 遍历采集所有业务任务 + for (AbstractAcsTask task : allTaskBeans.values()) { + String cc = task.getClass().getSimpleName(); + int count = (int) waitingTaskList.stream() + .filter(a -> !StringUtils.isEmpty(a.getHandle_class() ) + && task.getClass().getName().contains(a.getHandle_class())) + .count(); + + if(count == 0){ + continue; + } + + try { + List taskList = task.schedule(); + if (CollectionUtil.isNotEmpty(taskList)) { + totalAllTask.addAll(taskList); + log.info("{} 读取待下发任务数量:{}", task.getClass().getSimpleName(), taskList.size()); + } + } catch (Exception e) { + log.error("{} 任务查询异常", task.getClass().getSimpleName(), e); + } + } + + if (CollectionUtil.isEmpty(totalAllTask)) { + log.info("暂无ACS任务需要下发"); + return; + } + + // 取出任意一个任务实例调用父类下发过滤方法(父类通用逻辑,任意实例均可) + AbstractAcsTask anyTaskInstance = allTaskBeans.values().iterator().next(); + anyTaskInstance.immediateNotifyAcsList(totalAllTask); + + }, "AutoSendTask", 30, this); + } catch (Exception ex) { + log.error("定时下发ACS任务整体异常:", ex); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/auto/AutoTwoFloorSendTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/auto/AutoTwoFloorSendTask.java deleted file mode 100644 index 5769eec..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/auto/AutoTwoFloorSendTask.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.nl.b_lms.sch.tasks.auto; - -import lombok.extern.slf4j.Slf4j; -import org.nl.b_lms.sch.tasks.TwoOutHeapTask; -import org.nl.b_lms.sch.tasks.first_floor_area.auto.Prun; -import org.nl.common.utils.RedissonUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -public class AutoTwoFloorSendTask extends Prun { - - @Autowired - private TwoOutHeapTask twoOutHeapTask; - @Override - public void run() { - try { - RedissonUtils.lock(c -> { - log.info("start_sendTaskAcs task......"); - twoOutHeapTask.sendTaskAcs(null,true); - },"resendrgv", 30, this); - }catch (Exception ex){ - log.error(ex.getMessage()); - } - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java index d81ad97..c416ac8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java @@ -37,13 +37,13 @@ public enum IOSEnum { //入库单据类型 IN_TYPE(MapOf.of("生产入库", "0001", "退货入库", "0002", "报废入库", "0003", "调拨入库", "0004", - "拆箱入库", "0005", "返检入库", "0006", "改切入库", "0007", "手工入库", "0009","换标入库", "0012" + "拆箱入库", "0005", "返检入库", "0006", "改切入库", "0007", "手工入库", "0009","换标入库", "0012","盘点入库", "0016" )), //出库单据类型 OUT_TYPE(MapOf.of("发货出库", "1001", "改切出库", "1003", "调拨出库", "1004", "拆箱出库", "1005", "返检出库", "1006", "超期报废", "1007", "退货报废", "1008", "质量问题报废", "1010", "其他报废", "1002", - "手工出库", "1009","转单出库", "1020","贴标出库", "1021","管控出库", "1099","换标出库", "1012" + "手工出库", "1009","转单出库", "1020","贴标出库", "1021","管控出库", "1099","换标出库", "1012","盘点出库","1016" )), //移库单据类型 @@ -123,9 +123,9 @@ public enum IOSEnum { OUT_HANGER(MapOf.of("行架位1", "CK1134","行架位2", "CK1138")), // 点位 - POINT_CODE(MapOf.of("退货入库位", "KMXRKW2", "1125","CK1125", "1124","CK1124","木箱装箱开盒盖位","CK2024","空木箱上二楼终点","RK2004")), + POINT_CODE(MapOf.of("退货入库位", "KMXRKW2", "1125","CK1125", "1124","CK1124","空木箱上二楼终点","RK2004")), - TYPE_POINT_CODE(MapOf.of("RK1005", "KMXRKW1", "RK1012","KMXRKW1","木箱装箱开盒盖位","CK2024")), + TYPE_POINT_CODE(MapOf.of("RK1005", "KMXRKW1", "RK1012","KMXRKW1")), //acs申请任务 @@ -141,6 +141,10 @@ public enum IOSEnum { ,"退货异常申请行架对接位至NG位","9", "1楼换标入库","10")), + LMSTOACS_TYPE(MapOf.of( + "盘点出库","11" + )), + // acs外部系统用户 EXT_ACS(MapOf.of("acs", "2","kc","康成")), @@ -156,7 +160,9 @@ public enum IOSEnum { )), //特殊出入库点位 - SPECIAL_POINTS(MapOf.of("异常出库口", "CKYC","退货入库口","CKTH","退货行架对接位","THHJDJ","2楼手工生产点位","RK2009","2楼扫码称称重点位","RK2026")), + SPECIAL_POINTS(MapOf.of("异常出库口", "CKYC","退货入库口","CKTH","退货行架对接位","THHJDJ","2楼异常点位","RK2009", + "2楼装箱入库点1","RK2005", + "2楼装箱入库点2","RK2008","2楼扫码称称重点位","RK2026")), diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java index 1beed4e..7f2cf30 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java @@ -1039,6 +1039,7 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl split ; - if(StringUtils.isNotBlank(up_box_no)) { - split = Arrays.asList(down_box_no, up_box_no); + if (middleNotBlank) { + // 有中条码,上条码必填 + if (!upNotBlank) { + throw new BadRequestException("录入中条码时,上条码不能为空"); + } } else { - split = Collections.singletonList(down_box_no); - } - - - //查询仓库是否存在相同木箱 - for (String boxSn : split) { - JSONArray stIvtStructattr = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + boxSn + "'").getResultJSONArray(0); - if (stIvtStructattr != null && stIvtStructattr.size() > 0) { - throw new BadRequestException("当前木箱已经存在库中" + stIvtStructattr.getJSONObject(0).getString("struct_code")); + // 中条码为空,上条码必须也为空 + if (upNotBlank) { + throw new BadRequestException("未录入中条码,不允许填写上条码"); } } +// ========== 规则3:存在重复木箱号校验(只校验非空条码之间) ========== + List tempAll = Arrays.asList(up_box_no, middle_box_no, down_box_no); +// 过滤空值后判断是否存在重复 + List noBlankList = new ArrayList<>(); + for (String code : tempAll) { + if (StringUtils.isNotBlank(code)) { + noBlankList.add(code); + } + } +// 去重后长度和原长度不一致 = 有重复 + long distinctCount = noBlankList.stream().distinct().count(); + if (distinctCount != noBlankList.size()) { + throw new BadRequestException("木箱号有相同,请重新扫码!"); + } + +// ========== 最终组装List:顺序【上、中、下】,自动剔除空字符串 ========== + List split = new ArrayList<>(); + if (StringUtils.isNotBlank(up_box_no)) { + split.add(up_box_no); + } + if (StringUtils.isNotBlank(middle_box_no)) { + split.add(middle_box_no); + } + if (StringUtils.isNotBlank(down_box_no)) { + split.add(down_box_no); + } + + //查询仓库是否存在相同木箱 + // for (String boxSn : split) { + // JSONArray stIvtStructattr = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + boxSn + "'").getResultJSONArray(0); + // if (stIvtStructattr != null && stIvtStructattr.size() > 0) { + // throw new BadRequestException("当前木箱已经存在库中" + stIvtStructattr.getJSONObject(0).getString("struct_code")); + // } + // } + for (int i = 0; i < split.size(); i++) { String boxNO = split.get(i); + if(StringUtils.isBlank(boxNO)){ + continue; + } JSONObject jo = new JSONObject(); jo.put("box_no", boxNO); //调用MES接口插入或更新木箱信息 @@ -259,6 +297,9 @@ public class InBoxManageServiceImpl implements InBoxManageService { for (int i = 0; i < split.size(); i++) { String boxNo = split.get(i); + if(StringUtils.isBlank(boxNo)){ + continue; + } BstIvtBoxinfo boxinfo = iBstIvtBoxinfoService.getOne( new QueryWrapper().lambda() .eq(BstIvtBoxinfo::getBox_no, boxNo)); @@ -278,6 +319,8 @@ public class InBoxManageServiceImpl implements InBoxManageService { } //如果小木箱入库时没有小托盘时候是否考虑叫大托盘 // 查询木箱信息 + TwoInBoxTrussTask taskBean = SpringContextHolder.getBean(TwoInBoxTrussTask.class); + BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.getOne( new QueryWrapper().lambda() .eq(BstIvtBoxinfo::getBox_no, split.get(0)) @@ -286,6 +329,7 @@ public class InBoxManageServiceImpl implements InBoxManageService { throw new BadRequestException("木箱不存在!"); } + //查询当前入库拆叠盘位的托盘类型是否一致如果一致 String vehicle_type = boxDao.getVehicle_type(); @@ -296,40 +340,8 @@ public class InBoxManageServiceImpl implements InBoxManageService { JSONArray device_ja = new JSONArray(); device_ja.add(device_jo); - // JSONObject device_data = wmsToAcsService.getPointStatus(device_ja); - // JSONObject data = device_data.getJSONArray("data").getJSONObject(0); - // AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsService.class); - //如果此时拆叠盘位为空 - // if (data.getIntValue("qty") == 0 && data.getIntValue("move") == 0) { - // //生成空托盘出库任务 - // JSONObject apply_jo = new JSONObject(); - // apply_jo.put("device_code", IOSEnum.VEHICLE_TYPE_POINT.code(vehicle_type)); - // apply_jo.put("type", "3"); - // apply_jo.put("container_type", vehicle_type); - // acsToWmsService.applyTwo(apply_jo); - // } else { - // if (!data.getString("container_type").equals(vehicle_type)) { - // // if (data.getString("container_type").equals("0")) { - // // throw new BadRequestException("当前电气反馈的托盘类型为0,请检查!"); - // // } - // //给ACS下发拆叠盘位的空托盘入库信号,并进行空托盘出库 - // JSONArray action_rows = new JSONArray(); - // JSONObject action_jo = new JSONObject(); - // action_jo.put("device_code", IOSEnum.VEHICLE_TYPE_POINT.code(vehicle_type)); - // action_jo.put("code", "to_command"); - // action_jo.put("product_area", IOSEnum.PRODUCT_AREA.code("BLK")); - // action_jo.put("value", "4"); - // action_rows.add(action_jo); - // wmsToAcsService.action(action_rows); -// - // //生成空托盘出库任务 - // JSONObject apply_jo = new JSONObject(); - // apply_jo.put("device_code", IOSEnum.VEHICLE_TYPE_POINT.code(vehicle_type)); - // apply_jo.put("type", "3"); - // apply_jo.put("container_type", vehicle_type); - // acsToWmsService.applyTwo(apply_jo); - // } - // } + + String boxListString = split.stream().collect(Collectors.joining(",")); JSONObject taskParam = new JSONObject(); taskParam.put("task_type", "010713"); @@ -337,14 +349,14 @@ public class InBoxManageServiceImpl implements InBoxManageService { //都强制到1005 taskParam.put("next_device_code", IOSEnum.VEHICLE_TYPE_SCAN_POINT.code("1")); - taskParam.put("vehicle_code", down_box_no); + taskParam.put("vehicle_code", boxListString); JSONObject param = new JSONObject(); param.put("layer", split.size()); param.put("length", boxDao.getBox_length()); param.put("width", boxDao.getBox_width()); param.put("height", boxDao.getBox_high()); param.put("containerType", boxDao.getVehicle_type()); - param.put("barcode",down_box_no + "-9"); + param.put("barcode", boxListString); //新增逻辑 需要确认 param.put("type", "1"); //根据木箱高度,判断入库仓位的高度 @@ -361,8 +373,8 @@ public class InBoxManageServiceImpl implements InBoxManageService { } param.put("heightLevel", height); taskParam.put("request_param", param.toString()); - TwoInBoxTrussTask taskBean = SpringContextHolder.getBean(TwoInBoxTrussTask.class); taskBean.createTask(taskParam); + taskBean.immediateNotifyAcs(null); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java index 07fc064..1a8c704 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java @@ -84,7 +84,8 @@ public class InVehicleManageServiceImpl implements InVehicleManageService { jsonParam.put("sect_id", RegionTypeEnum.TWO_BZC01.getId()); jsonParam.put("vehicle_type", whereJson.getString("vehicle_type")); if("2".equals(whereJson.getString("vehicle_type"))) { - jsonParam.put("move_block_num","3"); + //todo 默认需要调整,根据当前的出库任务确认,如果是2楼入库,则需要判断出库任务,如果出库任务 + //jsonParam.put("move_block_num","3"); } else { jsonParam.put("move_block_num","4"); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 3cd39c5..8e1c96b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -1322,8 +1322,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { whereJson.put("bill_type", IOSEnum.IN_TYPE.code("生产入库")); whereJson.put("material_barcode",containers); if(whereJson.getString("vehicle_code").startsWith("YNX")) { - //todo 默认需要调整 - whereJson.put("move_block_num", "1"); + //todo 默认需要调整,根据当前的出库任务确认,如果是2楼入库,则需要判断出库任务,如果出库任务 + //whereJson.put("move_block_num", "1"); } else if(whereJson.getString("vehicle_code").startsWith("YNY")) { whereJson.put("move_block_num", "4"); } @@ -1457,6 +1457,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { mdPdStoragevehicleextInsert.setPcsn(whereJson.getString("box_no")); mdPdStoragevehicleextInsert.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId()); mdPdStoragevehicleextInsert.setUpdate_time(DateUtil.now()); + mdPdStoragevehicleextInsert.setQty("1"); mdPdStoragevehicleextMapper.insert(mdPdStoragevehicleextInsert); } else { @@ -1467,6 +1468,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { throw new BadRequestException("当前托盘" + whereJson.getString("vehicle_code") + "已经绑定木箱" + pcsn); } } + + if(StringUtils.isBlank(mdPdStoragevehicleext.getQty())){ + mdPdStoragevehicleext.setQty("1"); + } mdPdStoragevehicleext.setPcsn(whereJson.getString("box_no")); mdPdStoragevehicleext.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId()); mdPdStoragevehicleext.setUpdate_time(DateUtil.now()); @@ -1474,7 +1479,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } //优先巷道 if(whereJson.getString("vehicle_code").startsWith("YNX")) { - whereJson.put("move_block_num", "1"); + //todo 默认需要调整,根据当前的出库任务确认,如果是2楼入库,则需要判断出库任务,如果出库任务 + //whereJson.put("move_block_num", "1"); } else if(whereJson.getString("vehicle_code").startsWith("YNY")) { whereJson.put("move_block_num", "4"); } @@ -1484,12 +1490,12 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("木箱装箱开盒盖位"))) { //校验 String next_device_code; - if (StringUtils.isNotBlank(whereJson.getString("material_barcode")) && whereJson.getString("material_barcode").contains("-")) { + // if (StringUtils.isNotBlank(whereJson.getString("material_barcode")) && whereJson.getString("material_barcode").contains("-")) { next_device_code = IOSEnum.POINT_CODE.code("空木箱上二楼终点"); whereJson.put("material_barcode", whereJson.getString("material_barcode").split("-")[0]); - } else { - next_device_code = IOSEnum.POINT_CODE.code("木箱装箱开盒盖位"); - } + // } else { + // next_device_code = IOSEnum.POINT_CODE.code("木箱装箱开盒盖位"); + // } BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.getOne( new QueryWrapper().lambda() @@ -1521,6 +1527,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { mdPdStoragevehicleextInsert.setPcsn(boxDao.getBox_no()); mdPdStoragevehicleextInsert.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId()); mdPdStoragevehicleextInsert.setUpdate_time(DateUtil.now()); + mdPdStoragevehicleextInsert.setQty("1"); mdPdStoragevehicleextMapper.insert(mdPdStoragevehicleextInsert); } else { @@ -1531,6 +1538,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { throw new BadRequestException("当前托盘" + whereJson.getString("vehicle_code") + "已经绑定木箱" + pcsn); } } + + if(StringUtils.isBlank(mdPdStoragevehicleext.getQty())){ + mdPdStoragevehicleext.setQty("1"); + } mdPdStoragevehicleext.setPcsn(boxDao.getBox_no()); mdPdStoragevehicleext.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId()); mdPdStoragevehicleext.setUpdate_time(DateUtil.now()); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java index 247987a..0de94ff 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java @@ -1,14 +1,28 @@ package org.nl.wms.sch.manage; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.dao.mapper.SchBaseTaskMapper; +import org.nl.b_lms.sch.tasks.TwoOutHeapTask; +import org.nl.common.utils.CollectionUtils; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.system.service.param.impl.SysParamServiceImpl; import org.nl.wms.sch.AcsTaskDto; import org.nl.wms.sch.AcsUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Title: AbstractAcsTask.java Description:任务抽象类 @@ -23,6 +37,19 @@ public abstract class AbstractAcsTask { @Autowired AcsUtil acsUtil; + private SchBaseTaskMapper schBaseTaskMapper; + + @Autowired + private ApplicationContext applicationContext; + + public SchBaseTaskMapper getSchBaseTaskMapper() { + if (schBaseTaskMapper == null) { + schBaseTaskMapper = applicationContext.getBean(SchBaseTaskMapper.class); + } + return schBaseTaskMapper; + } + + /** * @discription 在如果任务无法形成会一直定时刷新判断 * @author ldjun @@ -111,13 +138,63 @@ public abstract class AbstractAcsTask { /** * */ + public JSONObject immediateNotifyAcs(String task_id) { + List singleTaskList = this.schedule(); + return immediateNotifyAcsList(singleTaskList); + } + + public JSONObject immediateNotifyAcsList(List taskList) { + try { Thread.sleep(1000); } catch (Exception ex) { } - List taskList = this.schedule(); + + //查询正在执行中的任务 + List status = Stream.of("05","06") + .collect(Collectors.toList()); + List workingTaskList = SpringContextHolder.getBean(SchBaseTaskMapper.class).selectList(new LambdaQueryWrapper() + .in(SchBaseTask::getTask_status, status).eq(SchBaseTask::getIs_delete, "0")); + + List oneFloorReturnBigVehicleInTaskStartPoint = Arrays.asList("KMXRKW1","KMXRKW2","KMXRKW3","KMXRKW4","RK1012","RK1005","RK1010","RK1003"); + List oneFloorReturnSmallVehicleInTaskStartPoint = Arrays.asList("KMXRKW1","KMXRKW2","KMXRKW3","KMXRKW4","RK1005","RK1003"); + + List oneFloorReturnBigVehicleOutTaskStartPoint = Arrays.asList("KMXRKW1","RK1010"); + List oneFloorReturnSmallVehicleOutTaskStartPoint = Arrays.asList("KMXRKW1","RK1003"); + + //查询正在执行中的1楼大托盘入库任务 + List inBigTaskList = workingTaskList.stream() + .filter(task->oneFloorReturnBigVehicleInTaskStartPoint.contains(task.getPoint_code1()) + && !task.getPoint_code2().contains("KMXRKW")).collect(Collectors.toList()); + List inSmallTaskList = workingTaskList.stream() + .filter(task->oneFloorReturnSmallVehicleInTaskStartPoint.contains(task.getPoint_code1()) + && !task.getPoint_code2().contains("KMXRKW")).collect(Collectors.toList()); + + List outBigTaskList = workingTaskList.stream().filter(task->oneFloorReturnBigVehicleOutTaskStartPoint.contains(task.getPoint_code2())).collect(Collectors.toList()); + List outSmallTaskList = workingTaskList.stream().filter(task->oneFloorReturnSmallVehicleOutTaskStartPoint.contains(task.getPoint_code2())).collect(Collectors.toList()); + + + + Iterator it = taskList.iterator(); + while (it.hasNext()) { + AcsTaskDto acsTaskDto = it.next(); + if(CollectionUtil.isNotEmpty(inBigTaskList) && oneFloorReturnBigVehicleOutTaskStartPoint.contains(acsTaskDto.getNext_device_code())){ + it.remove(); // + } + else if(CollectionUtil.isNotEmpty(inSmallTaskList)&& oneFloorReturnSmallVehicleOutTaskStartPoint.contains(acsTaskDto.getNext_device_code())){ + it.remove(); // + } + else if(CollectionUtil.isNotEmpty(outBigTaskList)&& oneFloorReturnBigVehicleInTaskStartPoint.contains(acsTaskDto.getStart_device_code())){ + it.remove(); + } + else if(CollectionUtil.isNotEmpty(outSmallTaskList)&& oneFloorReturnSmallVehicleInTaskStartPoint.contains(acsTaskDto.getStart_device_code())){ + it.remove(); + } + } + + if (ObjectUtil.isNotEmpty(taskList)) { JSONArray arr = JSONArray.parseArray(JSON.toJSONString(taskList)); if (acsUtil == null) {