diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java index 23e590a41..343bb6042 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java @@ -135,4 +135,6 @@ public interface IBstIvtStockingivtService extends IService { PdmBiOrderbominfo showBom2(Map param); List getMoveTaskPoints(); + + List getPointByVehicle(String vehicleCode, String pointCode); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java index 41d162682..6efca9e93 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java @@ -398,4 +398,12 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl getMoveTaskPoints() { return bstIvtStockingivtMapper.getMoveTaskPoints(); } + + @Override + public List getPointByVehicle(String vehicleCode, String pointCode) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.eq(BstIvtStockingivt::getVehicle_code, vehicleCode) + .ne(BstIvtStockingivt::getPoint_code, pointCode); + return list(lam); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java index ebd06b652..3494b60da 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java @@ -273,5 +273,29 @@ public class SlitterPdaController { public ResponseEntity getTubeLength(@RequestBody JSONObject param) { return new ResponseEntity<>(slitterService.getTubeLength(param), HttpStatus.OK); } + @PostMapping("/fullTubeVehicleIn") + @Log("托盘搬入") + @SaIgnore + public ResponseEntity fullTubeVehicleIn(@RequestBody JSONObject param) { + return new ResponseEntity<>(slitterService.fullTubeVehicleIn(param), HttpStatus.OK); + } + @PostMapping("/emptyTubeVehicleOut") + @Log("托盘搬出") + @SaIgnore + public ResponseEntity emptyTubeVehicleOut(@RequestBody JSONObject param) { + return new ResponseEntity<>(slitterService.emptyTubeVehicleOut(param), HttpStatus.OK); + } + @PostMapping("/taskTubeVehicle") + @Log("任务") + @SaIgnore + public ResponseEntity taskTubeVehicle(@RequestBody JSONObject param) { + return new ResponseEntity<>(slitterService.taskTubeVehicle(param), HttpStatus.OK); + } + @PostMapping("/getTubeVehicleInfo") + @Log("任务") + @SaIgnore + public ResponseEntity getTubeVehicleInfo(@RequestBody JSONObject param) { + return new ResponseEntity<>(slitterService.getTubeVehicleInfo(param), HttpStatus.OK); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java index 3848d8d63..2bcadb5db 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java @@ -96,6 +96,8 @@ public interface IschBaseTaskService extends IService { List checkHaveStartTask(String pointCode); List checkHaveTrussTask(List codes); + + List checkHaveVehicle(String vehicleCode); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java index 70a27265f..ed2542dbd 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -181,6 +181,16 @@ public class SchBaseTaskServiceImpl extends ServiceImpl checkHaveVehicle(String vehicleCode) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.lt(SchBaseTask::getTask_status, "07") + .eq(SchBaseTask::getIs_delete, "0") + .and(ll -> ll.eq(SchBaseTask::getVehicle_code, vehicleCode).or() + .eq(SchBaseTask::getVehicle_code2, vehicleCode)); + return this.list(lam); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/StockAreaInOutTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/StockAreaInOutTask.java new file mode 100644 index 000000000..650c95e61 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/StockAreaInOutTask.java @@ -0,0 +1,153 @@ +package org.nl.b_lms.sch.tasks.slitter; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.stockingivt.service.IBstIvtStockingivtService; +import org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt; +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.slitter.constant.SlitterEnum; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 备货区进出任务(备货入库进出) + * @Author: lyd + * @Date: 2025/9/17 + */ +@Slf4j +@Component +public class StockAreaInOutTask extends AbstractAcsTask { + private final String THIS_CLASS = StockAreaInOutTask.class.getName(); + + @Autowired + private IschBaseTaskService taskService; + @Autowired + private IBstIvtStockingivtService stockingivtService; + + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + List taskList = taskService.getIssueTasks(THIS_CLASS); + + ArrayList resultList = new ArrayList<>(); + String agv_system_type = "2"; + for (SchBaseTask task : taskList) { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(task.getTask_id()) + .task_code(task.getTask_code()) + .task_type(task.getAcs_task_type()) + .start_device_code(task.getPoint_code1()) + .next_device_code(task.getPoint_code2()) + .start_device_code2(task.getPoint_code3()) + .next_device_code2(task.getPoint_code4()) + .vehicle_code(task.getVehicle_code()) + .interaction_json(JSONObject.parseObject(task.getRequest_param())) + .agv_system_type(agv_system_type) + .priority(task.getPriority()) + .product_area(task.getProduct_area()) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask task = taskService.getById(taskObj.getString("task_id")); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + task.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + task.setTask_status(TaskStatusEnum.FINISHED.getCode()); + String startPoint = task.getPoint_code1(); + String endPoint = task.getPoint_code2(); + BstIvtStockingivt startPointObj = stockingivtService.getPointByCode(startPoint, false); + BstIvtStockingivt endPointObj = stockingivtService.getPointByCode(endPoint, false); + if (SlitterEnum.TASK_TYPE.code("备货区托盘入库").equals(task.getTask_type())) { + endPointObj.setIvt_status("1"); + endPointObj.setVehicle_code(task.getVehicle_code()); + endPointObj.setUpdate_time(DateUtil.now()); + stockingivtService.updateById(endPointObj); + } + startPointObj.setIvt_status("0"); + startPointObj.setVehicle_code(""); + startPointObj.setUpdate_time(DateUtil.now()); + stockingivtService.updateById(startPointObj); + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + task.setTask_status(TaskStatusEnum.FINISHED.getCode()); + } + task.setUpdate_time(DateUtil.now()); + taskService.updateById(task); + } + + @Override + public String createTask(JSONObject form) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + task.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr()); + task.setTask_status(ObjectUtil.isNotEmpty(form.getString("task_status")) + ? form.getString("task_status") + : TaskStatusEnum.START_AND_POINT.getCode()); + task.setPoint_code1(form.getString("point_code1")); + task.setPoint_code2(form.getString("point_code2")); + task.setVehicle_code(form.getString("vehicle_code")); + task.setAcs_task_type("3"); + task.setIs_delete("0"); + task.setRequest_param(form.toJSONString()); + task.setTask_type(form.getString("task_type")); + task.setProduct_area(form.getString("product_area")); + task.setCreate_id(currentUserId); + task.setCreate_name(currentUsername); + task.setCreate_time(DateUtil.now()); + task.setHandle_class(THIS_CLASS); + //根据类型获取对应的任务优先级 + JSONObject priority_jo = WQL.getWO("PDA_COOLIN").addParam("flag", "3").addParam("task_type", task.getTask_type()).process().uniqueResult(0); + if (ObjectUtil.isEmpty(priority_jo)) { + task.setPriority("1"); + } else { + task.setPriority(priority_jo.getString("value")); + } + taskService.save(task); + this.immediateNotifyAcs(null); + return task.getTask_id(); + } + + @Override + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, "0"); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/constant/SlitterEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/constant/SlitterEnum.java index b1af1fbe6..f998dae51 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/constant/SlitterEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/constant/SlitterEnum.java @@ -26,7 +26,8 @@ public enum SlitterEnum { , "套轴异常处理AGV任务", "010811", "套轴异常处理桁架任务", "010812", "送气胀轴到分切机任务", "010813" , "拔轴完毕出轴", "010814", "穿拔轴缓存<>气胀轴缓存位", "010815", "备货区单独送空载具", "010816" , "拼单送轴", "010817", "拆单两点移动任务", "010818", "拆单四点移动任务", "010819" - , "满轴拼单桁架任务", "010820", "送空轴AGV任务", "010821", "人工叫空轴桁架任务", "010822") + , "满轴拼单桁架任务", "010820", "送空轴AGV任务", "010821", "人工叫空轴桁架任务", "010822" + , "备货区托盘入库", "010823", "备货区托盘出库", "010824") ), /** * 二次请求 diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java index b35c7bb38..2683eeef9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java @@ -400,4 +400,12 @@ public interface SlitterService { JSONObject getTubeLength(JSONObject param); JSONObject callShaft(JSONObject entity); + + JSONObject fullTubeVehicleIn(JSONObject param); + + JSONObject emptyTubeVehicleOut(JSONObject param); + + JSONObject taskTubeVehicle(JSONObject param); + + JSONObject getTubeVehicleInfo(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java index d1e589727..32dbaaa55 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java @@ -150,6 +150,8 @@ public class SlitterServiceImpl implements SlitterService { private StockAreaSendVehicleTask stockAreaSendVehicleTask; @Autowired private TrussCallShaftManuallyTask trussCallShaftManuallyTask; + @Autowired + private StockAreaInOutTask stockAreaInOutTask; @Override public JSONObject acsRequestShaftLoadTube(JSONObject param) { @@ -3118,6 +3120,151 @@ public class SlitterServiceImpl implements SlitterService { return res; } + @Override + public JSONObject fullTubeVehicleIn(JSONObject param) { + // param: + log.info("备货入库:{}", param); + JSONObject res = new JSONObject(); + RLock open = redissonClient.getLock("lockFullTubeVehicleIn"); + boolean openLock; + try { + openLock = open.tryLock(0, TimeUnit.SECONDS); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + try { + if (openLock) { + String pointCode = param.getString("point_code"); + String vehicleCode = param.getString("vehicle_code"); +// List taskList = taskService.checkHaveTask(pointCode); +// if (taskList.size() > 0) { +// throw new BadRequestException("点位「" + pointCode + "」存在任务!"); +// } + List taskList2 = taskService.checkHaveVehicle(vehicleCode); + if (taskList2.size() > 0) { + throw new BadRequestException("托盘「" + vehicleCode + "」存在任务!"); + } + List stocks = stockingivtService.getPointByVehicle(vehicleCode, pointCode); + if (stocks.size() > 0) { + List collect = stocks.stream().map(BstIvtStockingivt::getPoint_code).collect(Collectors.toList()); + throw new BadRequestException("托盘「" + vehicleCode + "」存在点位" + collect + "上!"); + } + BstIvtStockingivt rkPoint = stockingivtService.getPointByCode(pointCode, false); + if (ObjectUtil.isEmpty(rkPoint)) { + throw new BadRequestException("点位「" + pointCode + "」不存在!"); + } + // 找一个没任务的空位 + List list = stockingivtService.getEmptyPointNotTask(rkPoint.getPoint_location(), "0"); + if (list.size() == 0) { + throw new BadRequestException("备货区找不到对应的空点位,请确认是否有任务!"); + } + BstIvtStockingivt moveEmptyPoint = list.get(0); + JSONObject moveTaskParam = new JSONObject(); + moveTaskParam.put("point_code1", pointCode); + moveTaskParam.put("point_code2", moveEmptyPoint.getPoint_code()); + moveTaskParam.put("vehicle_code", vehicleCode); + moveTaskParam.put("task_type", SlitterEnum.TASK_TYPE.code("备货区托盘入库")); + moveTaskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + stockAreaInOutTask.createTask(moveTaskParam); + } else { + throw new BadRequestException("系统繁忙,稍后在试!!"); + } + } finally { + if (open.isLocked() && open.isHeldByCurrentThread()) { + open.unlock(); + } + } + res.put("status", HttpStatus.HTTP_OK); + res.put("message", "请求成功"); + return res; + } + + @Override + public JSONObject emptyTubeVehicleOut(JSONObject param) { + log.info("备货出库:{}", param); + JSONObject res = new JSONObject(); + RLock open = redissonClient.getLock("lockFullTubeVehicleOut"); + boolean openLock; + try { + openLock = open.tryLock(0, TimeUnit.SECONDS); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + try { + if (openLock) { + String pointCode = param.getString("point_code"); + String vehicleCode = param.getString("vehicle_code"); + List taskList = taskService.checkHaveTask(pointCode); + if (taskList.size() > 0) { + throw new BadRequestException("点位「" + pointCode + "」存在任务!"); + } + BstIvtStockingivt outPoint = stockingivtService.getPointByCode(pointCode, false); + if (ObjectUtil.isEmpty(outPoint)) { + throw new BadRequestException("点位「" + pointCode + "」不存在!"); + } + if ("0".equals(outPoint.getIvt_status())) { + throw new BadRequestException("点位「" + pointCode + "」是空位,请确认!"); + } + if ("2".equals(outPoint.getPoint_type())) { + throw new BadRequestException("点位「" + pointCode + "」是出库终点,请扫需要出库的备货点位!"); + } + // 找一个没任务的空位 + List list = stockingivtService.getEmptyPointNotTask(outPoint.getPoint_location(), "2"); + if (list.size() == 0) { + throw new BadRequestException("备货区找不到出库点,请确认!"); + } + BstIvtStockingivt moveEmptyPoint = list.get(0); + JSONObject moveTaskParam = new JSONObject(); + moveTaskParam.put("point_code1", pointCode); + moveTaskParam.put("point_code2", moveEmptyPoint.getPoint_code()); + moveTaskParam.put("vehicle_code", vehicleCode); + moveTaskParam.put("task_type", SlitterEnum.TASK_TYPE.code("备货区托盘出库")); + moveTaskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + stockAreaInOutTask.createTask(moveTaskParam); + + } else { + throw new BadRequestException("系统繁忙,稍后在试!!"); + } + } finally { + if (open.isLocked() && open.isHeldByCurrentThread()) { + open.unlock(); + } + } + res.put("status", HttpStatus.HTTP_OK); + res.put("message", "请求成功"); + return res; + } + + @Override + public JSONObject taskTubeVehicle(JSONObject param) { + JSONObject res = new JSONObject(); + List tasks = taskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getIs_delete, "0") + .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .in(SchBaseTask::getTask_type, Arrays.asList(SlitterEnum.TASK_TYPE.code("备货区托盘出库") + , SlitterEnum.TASK_TYPE.code("备货区托盘入库")))); + res.put("data", tasks); + res.put("status", HttpStatus.HTTP_OK); + res.put("message", "请求成功"); + return res; + } + + @Override + public JSONObject getTubeVehicleInfo(JSONObject param) { + JSONObject res = new JSONObject(); + res.put("status", HttpStatus.HTTP_OK); + res.put("message", "请求成功"); + if (ObjectUtil.isEmpty(param.getString("point_code"))) { + return res; + } + BstIvtStockingivt one = stockingivtService.getPointByCode(param.getString("point_code"), false); + if (ObjectUtil.isEmpty(one)) { + return res; + } + res.put("data", one.getVehicle_code()); + return res; + } + public List getRedisListValue(String key) { List stepTipLogs = (List) redisUtils.get(key); if (CollectionUtil.isEmpty(stepTipLogs)) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/BakingController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/BakingController.java index f244b8e5e..5309aa739 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/BakingController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/BakingController.java @@ -5,6 +5,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.modules.logging.annotation.Log; import org.nl.wms.pda.mps.service.BakingService; +import org.redisson.api.RedissonClient; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -20,6 +21,7 @@ import org.springframework.web.bind.annotation.RestController; public class BakingController { private final BakingService bakingService; + private final RedissonClient redissonClient; @PostMapping("/ovenInAndOut") @Log("烘箱出入")