From 9c6c32b7edd6ffd3577f7a1ce6f2f31fbac8c148 Mon Sep 17 00:00:00 2001 From: liuhanqing Date: Thu, 26 Feb 2026 09:46:54 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E7=8E=B0=E5=9C=BA=E8=B0=83=E5=BA=A6?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/api/domain/wcs2wms/ReceiveJob.java | 1 + .../api/service/impl/ApiServiceImpl.java | 1 + .../service/impl/RoadCacheServiceImpl.java | 12 +- .../java/com/ruoyi/job/domain/MydoJob.java | 1 + .../queue/srgv/mapper/WcsSrgvQueueMapper.java | 3 + .../srgv/service/IWcsSrgvQueueService.java | 2 + .../service/impl/WcsSrgvQueueServiceImpl.java | 5 + .../schedule/plcRead/srgv/PlcSrgvRead.java | 29 + .../schedule/plcRead/ssj/PlcSsjRead.java | 1 + .../scheduleTask/monit/MonitoringThread.java | 4 +- .../scheduleTask/srgv/BaseSRgvThread.java | 65 +- .../scheduleTask/srgv/BaseSRgvThread1.java | 754 ++++++++++++++++++ .../schedule/scheduleTask/ssj/SsjThread.java | 8 +- .../schedule/scheduleTask/tsj/TsjThread.java | 3 +- .../mapper/queue/WcsSrgvQueueMapper.xml | 22 +- 15 files changed, 888 insertions(+), 23 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread1.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java index a8d968a..a1dfada 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java @@ -16,5 +16,6 @@ public class ReceiveJob { private String inOrOut; private String jobId; private String roadwayId; + private String classId; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java index 87e90ea..540fe86 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java @@ -360,6 +360,7 @@ public class ApiServiceImpl implements IApiService { mydoJob.setRoadwayId(receiveOutJob.getRoadwayId()); mydoJob.setCreateTime(DateUtils.getNowDate()); mydoJob.setExecutionPhase("0"); + mydoJob.setTheFloor(receiveOutJob.getClassId()); int i = mydoJobService.insertMydoJob(mydoJob); if (i > 0) { return AjaxResult.success(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java index 76f8ab1..39983a6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java @@ -143,7 +143,17 @@ public class RoadCacheServiceImpl implements RoadCacheService { HashSet otherCarSiteList = new HashSet<>(); for (WcsSrgvQueue wcsSrgvQueue : otherCarQueue) { if (wcsSrgvQueue.getPathInfo()!=null) { - otherCarSiteList.addAll(Arrays.asList(wcsSrgvQueue.getPathInfo().split(","))); + //根据小车当前点位去除已走路径 + DeviceSrgv otherCarCurrStatus = deviceSrgvService.selectDeviceSrgvByGuid(wcsSrgvQueue.getAgvId()); + String currSite = otherCarCurrStatus.getCurrSite(); + List allSiteList = Arrays.asList(wcsSrgvQueue.getPathInfo().split(",")); + int i = allSiteList.indexOf(currSite); + if (i==-1){ + i=0; + } + List resultSiteList = allSiteList.subList(i, allSiteList.size()); + otherCarSiteList.addAll(resultSiteList); + //otherCarSiteList.addAll(Arrays.asList(wcsSrgvQueue.getPathInfo().split(","))); } } //锁定其他小车路径 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/domain/MydoJob.java b/ruoyi-admin/src/main/java/com/ruoyi/job/domain/MydoJob.java index c4a12e5..84eb50d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/domain/MydoJob.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/domain/MydoJob.java @@ -94,4 +94,5 @@ public class MydoJob extends BaseEntity private String productId; private String productName; + private String classId; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java index 933a320..f515d2e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.queue.srgv.mapper; import java.util.List; import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; +import org.apache.ibatis.annotations.Param; /** * 四向小车任务队列Mapper接口 @@ -70,4 +71,6 @@ public interface WcsSrgvQueueMapper * @return 结果 */ public int deleteWcsSrgvQueueByGuids(String[] guids); + + String selectMinCountJob(@Param("list") List outModelSSJ); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java index 40f836a..21c2367 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java @@ -77,4 +77,6 @@ public interface IWcsSrgvQueueService * @param taskNo */ public WcsSrgvQueue insertHistory(String taskNo); + + String selectMinCountJob(List outModelSSJ); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java index 81a2070..d4e7926 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java @@ -115,6 +115,11 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuid(guid); } + @Override + public String selectMinCountJob( List outModelSSJ) { + return wcsSrgvQueueMapper.selectMinCountJob(outModelSSJ) ; + } + @Override public WcsSrgvQueue insertHistory(String taskNo) { WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java index 2291b28..4d14932 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java @@ -90,6 +90,12 @@ public class PlcSrgvRead implements Runnable { if (read2.IsSuccess) { setValueByByte2(read2.Content, deviceSrgv); } + + // //读取双字,路径 + OperateResultExOne read4 = modbusTcpNet.Read("6000", (short) 800);// 5000-5799 路径 400个 + if (read4.IsSuccess) { + setValueByByte4(read4.Content, deviceSrgv); + } } //单字 @@ -150,6 +156,29 @@ public class PlcSrgvRead implements Runnable { agvData.setCurrFloor(floor); } + private void setValueByByte4(byte[] content, DeviceSrgv agvData) { + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < content.length; i += 4) { + // 检查剩余字节是否足够4个 + if (i + 4 > content.length) break; + // TODO 注意双字反转 + int value = byteTransform.TransInt32(content, i); + + // 如果值为0,终止循环 + if (value == 0) { + break; + } + sb.append(String.format("%06d", value)).append(","); // 用逗号分隔每个int值 + } + + // 移除最后多余的 "," + if (sb.length() > 0) { + sb.setLength(sb.length() - 1); + } + agvData.setPath(sb.toString()); + } + public void ConnectServer() { modbusTcpNet = new ModbusTcpNet();//创建一个Modbus对象 log.info("创建连接对象,IP{}", this.ip); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java index 458e775..4bc6775 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java @@ -99,6 +99,7 @@ public class PlcSsjRead implements Runnable { ssjDevice.setKx(ParseUtil.optInt(4, ddsx1)); ssjDevice.setDw(ParseUtil.optInt(6, ddsx1)); ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1)); + ssjDevice.setModel(ParseUtil.optInt(8, ddsx1));//出入库模式 1入 2出 } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java index 0dbcc7e..e3a1162 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java @@ -51,7 +51,9 @@ public class MonitoringThread implements Runnable { } for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(srgvCode); - deviceSrgvService.updateDeviceSrgv(deviceSrgv); + if (!deviceSrgv.getCurrSite().equals("000000")){ + deviceSrgvService.updateDeviceSrgv(deviceSrgv); + } } for (String tsjCode : PlcTsjRead.deviceTsjMap.keySet()) { DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(tsjCode); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java index 384a4f9..67f8f06 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java @@ -18,6 +18,7 @@ import com.ruoyi.common.domain.SendData2; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.device.srgv.domain.DeviceSrgv; import com.ruoyi.device.srgv.service.IDeviceSrgvService; +import com.ruoyi.device.ssj.domain.DeviceSsj; import com.ruoyi.job.charg.domain.SrgvChargingJob; import com.ruoyi.job.charg.service.ISrgvChargingJobService; import com.ruoyi.job.domain.JobCallBack; @@ -30,6 +31,7 @@ import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; import com.ruoyi.schedule.ScheduleThread; import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead; import com.ruoyi.schedule.plcRead.srgv.roadUtil.PathFinder; +import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead; import lombok.extern.slf4j.Slf4j; import java.text.SimpleDateFormat; @@ -65,7 +67,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { private IBasCargoSpaceService basCargoSpaceService; public IDeviceSrgvService deviceSrgvService; - private int taskCache = 450001; + private int taskCache = 30001; public void init() { sRgvCodeList = new HashMap<>(); @@ -280,14 +282,35 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { endSite = "tsj"; } WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); + String cargoPlaceSite =""; + ConcurrentHashMap deviceSsjMap = PlcSsjRead.deviceSsjMap; + List outModelSSJ=new ArrayList<>(); + for (String deviceSsj : deviceSsjMap.keySet()) { + if (deviceSsj.equals("TD1001")||deviceSsj.equals("TD1008")) { + DeviceSsj deviceSsj1=deviceSsjMap.get(deviceSsj); + if (deviceSsj1.getModel()==2){ + String s=""; + if (deviceSsj1.equals("TD1001")){ + s="050101"; + }else { + s="070101"; + } + outModelSSJ.add(s); + } + } + } + cargoPlaceSite= wcsSagvQueueMapper.selectMinCountJob(outModelSSJ); + if (Objects.equals(cargoPlaceSite, "")){ + return; + } wcsSrgvMap1.setRemark(mydoJob1.getExitId()); + //TODO 读取输送机入出库模式分配出口 List wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1); - String cargoPlaceSite = wcsSrgvMaps1.get(0).getSiteId(); - + String cargoPlaceSite1 =cargoPlaceSite; List sameSiteDevices = deviceSrgvMap.values().stream() .filter(d -> d.getWorkMode() == 5 && d.getStatus() == 1 - && d.getCurrSite().equals(cargoPlaceSite)) + && d.getCurrSite().equals(cargoPlaceSite1)) .collect(Collectors.toList()); if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); @@ -458,7 +481,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //生成占位小车到缓存点队列 WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue(); wcsSrgvQueue3.setGuid(UUID.randomUUID().toString()); - wcsSrgvQueue3.setTaskNo(mydoJob1.getTaskNo()); + wcsSrgvQueue3.setTaskNo(String.valueOf(taskCache)); wcsSrgvQueue3.setTaskType("1"); wcsSrgvQueue3.setPriority(Long.parseLong("2")); wcsSrgvQueue3.setCargo("1"); @@ -474,6 +497,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSrgvQueue3.setDefault02("4"); wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString()); wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3); + taskCache++; return; } } @@ -578,11 +602,12 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //计算最短路径 List shortestPath = PathFinder.findShortestPath(emptyMap, arrByRoadSite.get(startSite).getX(), arrByRoadSite.get(startSite).getY(), arrByRoadSite.get(endSite).getX(), arrByRoadSite.get(endSite).getY()); + // TODO 小车避让 目前只针对同层最多两台车 并且点位设置到了050201 判断地图中取的路径 不能直达说明有车阻挡 直接返回-1 用-1判断小车阻挡调离小车 if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1 && shortestPath.get(0)[1] == -1) { shortestPath = null; String endBlockAgv = null; DeviceSrgv endBlockDevice = null; - // TODO 通过arrByRoadSite 中的站点 查询是否存在其他车的站点,如果存在则生成其他车到避让点的队列 + if (arrByRoadSite != null && !arrByRoadSite.isEmpty()) { // 将arrByRoadSite转为String类型的Set(统一类型,方便匹配) Set roadSiteSet = arrByRoadSite.keySet().stream() @@ -621,19 +646,19 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { // 生成纯数字任务号(PLC要求),9 + HHmmss taskB.setTaskNo(String.valueOf(taskCache)); taskB.setAgvId(endBlockAgv); - taskB.setTaskType("1"); // 点到点移动 + taskB.setTaskType("4"); // 避让任务 taskB.setDefault02("4"); // 业务类型标识为点到点 taskB.setPriority(9L); // 高优先级,尽快避让 taskB.setIssued("0"); // 未下发 taskB.setExecutionStatus("1");// 初始状态 taskB.setStartSite(endBlockDevice.getCurrSite()); taskB.setCargoPickSite(endBlockDevice.getCurrSite()); - taskB.setCargoPlaceSite("05020" + endBlockDevice.getCurrFloor()); - taskB.setEndSite("05020" + endBlockDevice.getCurrFloor()); + taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId()); + taskB.setEndSite(cacheMaps.get(0).getSiteId()); taskB.setTheFloor(floor.toString()); - taskB.setDefault03(endBlockDevice.getCurrSite()); +// taskB.setDefault03(endBlockDevice.getCurrSite()); taskB.setDefault07(floor.toString()); - taskB.setDefault08("1");//避让任务,直接完成 +// taskB.setDefault08("1");//避让任务,直接完成 taskB.setCreateDate(DateUtil.now()); wcsSagvQueueMapper.insertWcsSrgvQueue(taskB); taskCache++; @@ -901,7 +926,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); //换层任务不修改执行阶段 - if (!wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) { + if (mydoJob!=null && !wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) { mydoJob.setExecutionPhase("3"); mydoJob.setStatus("3"); mydoJobService.updateMydoJob(mydoJob); @@ -1176,6 +1201,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); jobCallBack.setCreateTime(new Date()); jobCallBackService.insertJobCallBack(jobCallBack); + mydoJobService.insertHistory(mydoJob.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId()); } break; @@ -1183,6 +1209,13 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { case "2": MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); if (mydoJobOut != null) { + JobCallBack jobCallBack = new JobCallBack(); + jobCallBack.setType(wcsSrgvQueue.getDefault02()); + jobCallBack.setMydojobId(mydoJobOut.getJobId()); + jobCallBack.setStatus("0"); + jobCallBack.setTaskNo(Convert.toLong(mydoJobOut.getTaskNo())); + jobCallBack.setCreateTime(new Date()); + jobCallBackService.insertJobCallBack(jobCallBack); mydoJobService.insertHistory(mydoJobOut.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId()); } @@ -1207,9 +1240,15 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //充电之类的,不知道用不用 + } else if ("4".equals(taskType)) { + { + wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); + } + } + //更新小车待机时间 - deviceSrgvService.updateLastTimeByAgvId(wcsSrgvQueue.getAgvId()); +// deviceSrgvService.updateLastTimeByAgvId(wcsSrgvQueue.getAgvId()); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread1.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread1.java new file mode 100644 index 0000000..2cd541a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread1.java @@ -0,0 +1,754 @@ +package com.ruoyi.schedule.scheduleTask.srgv; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import com.ruoyi.bas.port.service.IWcsPortService; +import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; +import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService; +import com.ruoyi.bas.srgvmap.service.RoadCacheService; +import com.ruoyi.common.TaskStage; +import com.ruoyi.common.domain.SendData2; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.device.srgv.domain.DeviceSrgv; +import com.ruoyi.job.charg.service.ISrgvChargingJobService; +import com.ruoyi.job.domain.JobCallBack; +import com.ruoyi.job.domain.MydoJob; +import com.ruoyi.job.service.IJobCallBackService; +import com.ruoyi.job.service.IMydoJobService; +import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; +import com.ruoyi.queue.srgv.service.IWcsSrgvQueueFinishService; +import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; +import com.ruoyi.queue.tsj.domain.TsjDeviceExecutionQueue; +import com.ruoyi.queue.tsj.service.ITsjDeviceExecutionQueueService; +import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead; +import com.ruoyi.schedule.plcRead.srgv.roadUtil.PathFinder; +import lombok.extern.slf4j.Slf4j; + +import java.util.*; +import java.util.stream.Collectors; + +import static com.ruoyi.common.TaskStage.FINISHED; +import static com.ruoyi.common.TaskStage.STAGE7; + +@Slf4j +public class BaseSRgvThread1 implements Runnable, SRgvThreadInterface { + + private IWcsSrgvMapService wcsSrgvMapService; + private IWcsSrgvQueueService wcsSrgvQueueService; + private ITsjDeviceExecutionQueueService tsjDeviceExecutionQueueService; + + private IMydoJobService mydoJobService; + + private RoadCacheService roadCacheService; + private IJobCallBackService jobCallBackService; + + public IWcsSrgvQueueFinishService wcsSagvQueueFinishMapper; + + public IWcsPortService wcsPortService; + + public ISrgvChargingJobService srgvChargingJobMapper; + + public boolean isRun = true; + + public HashMap> sRgvCodeList; + + public void init() { + sRgvCodeList = new HashMap<>(); + ArrayList sRgvCodes = new ArrayList<>(); + sRgvCodes.add("1"); + /*sRgvCodes.add("2"); + sRgvCodes.add("3");*/ + sRgvCodeList.put("srgv", sRgvCodes); + + wcsSagvQueueFinishMapper = SpringUtils.getBean(IWcsSrgvQueueFinishService.class); + wcsPortService = SpringUtils.getBean(IWcsPortService.class); + srgvChargingJobMapper = SpringUtils.getBean(ISrgvChargingJobService.class); + mydoJobService = SpringUtils.getBean(IMydoJobService.class); + wcsSrgvMapService = SpringUtils.getBean(IWcsSrgvMapService.class); + roadCacheService = SpringUtils.getBean(RoadCacheService.class); + wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); + tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class); + } + + @Override + public void run() { + init(); + while (isRun) { + + for (String code : sRgvCodeList.get("srgv")) { + + try { + if (PlcSrgvRead.deviceSrgvMap.containsKey(code)) { + if (ObjUtil.isNotNull(PlcSrgvRead.deviceSrgvMap.get(code))) { + + DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(code); + + //selectCarForTask(); + createSrgvInOutQueue(); + srgvTask(deviceSrgv); + + } else { + log.error("小车设备为空"); + } + } + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + } + + + } + + try { + Thread.sleep(1500); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + + + public void selectCarForTask() { + MydoJob mydoJob = mydoJobService.selectNoAllocatCar(); + /* + 选择执行任务的小车 + 优先级 目标层已有小车 > 1 层空闲小车 > 其他无任务层空闲小车 + */ + if (ObjUtil.isNotNull(mydoJob)) { + for (String srgvId : PlcSrgvRead.deviceSrgvMap.keySet()) { + DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(srgvId); + //如果小车空闲,选择小车 + if (deviceSrgv.getStatus() == 0) { + mydoJob.setCarId(srgvId); + mydoJob.setStatus("3"); + mydoJob.setStartTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + /* + 根据选择的小车当前位置 确定mydojob的任务阶段 + */ + Integer floor = deviceSrgv.getCurrFloor(); + String currSite = deviceSrgv.getCurrSite(); + if (floor.equals(Convert.toInt(mydoJob.getRoadwayId()))) { + //小车所在楼层和任务开始楼层一致 3 5 + if (!currSite.equals(mydoJob.getCargoSpaceId())) { + mydoJob.setExecutionPhase("3"); + } else { + //判断目标楼层是不是1层 + if (!"1".equals(mydoJob.getTargetRoadwayId())) { + mydoJob.setExecutionPhase("5"); + } else { + mydoJob.setExecutionPhase("7"); + } + } + } else { + mydoJob.setExecutionPhase("1"); + } + mydoJobService.updateMydoJob(mydoJob); + } + } + } + + } + + /* 出库 + 1-2-3-5-6-7 车在其它层 && 取货目标在其它层 + 1-2-3-7 车在其它层 && 取货目标在1层 + 3-5-6-7 车在取货层 && 取货目标在其它层 + 3-7 车在取货层 && 层数为1 && 放货目标在1层 + */ + public void outQueue() { + } + + /* 入库 + 1-2-3-5-6-7 车在其它层 && 放货目标在其它层 + 1-2-3-7 车在其它层 && 放货目标在1层 + 3-5-6-7 车在1层 && 放货目标在其它层 + 3-7 车在1层 && 放货目标在1层 + 任务类型 方式 + 1 srgv 点对点 当前位置→本层电梯口 + 2 tsj 换层 取放 当前层→起点层 + 3 srgv 点对点 取货 当前位置->取货点 + 5 srgv 点对点 取货点->本层电梯口 + 6 tsj 换层 取放 取货层->放货层 + 7 srgv 点对点 放货 本层电梯口->放货点 + */ + public void createSrgvInOutQueue() { + MydoJob param = new MydoJob(); + param.setStatus("3"); + List mydoJobs = mydoJobService.selectMydoJobList(param); + if (CollUtil.isNotEmpty(mydoJobs)) { + for (MydoJob mydoJob : mydoJobs) { + if (StrUtil.isNotEmpty(mydoJob.getCarId())) { + //绑定任务小车 + DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(mydoJob.getCarId()); + //开始小车任务阶段 + if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE1.getCode())) { + /* + 当前位置→本层电梯口 srgv + 1. 调用 A * 算法规划层内最优路径(避开墙 0/4,走通道 2) + 2. 实时检测通道冲突(与其他小车路径不重叠) + 3. 移动到本层电梯口 + */ + String startSite = deviceSrgv.getCurrSite(); + Integer floor = deviceSrgv.getCurrFloor(); + String endSite = getTsjSiteIdByFloor(floor); + if (StrUtil.isEmpty(endSite)) { + log.info("生成tsj队列失败,未找到层数为{}电梯口", floor); + } else { + String rwlx = "4"; + int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); + if (srgvQueue > 0) { + log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); + } + } + } + if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE2.getCode())) { + /* + 本层电梯口→起点层电梯口 tsj + 1. 加入电梯排队队列(按任务优先级 + 到电梯口距离排序) + 2. 等待电梯空闲后占用电梯,跨层到 1 层 + 3. 电梯到达后,更新小车位置为(1,8,8) + */ + //生成tsj队列 + //根据位置判断列数 + String srcColumn = ""; + String tarColumn = ""; + Integer srcFloor = deviceSrgv.getCurrFloor(); + Integer tarFloor = Convert.toInt(mydoJob.getRoadwayId()); + String rwlx = ""; + int tsjQueue = createTsjQueue(Convert.toLong(mydoJob.getTaskNo()), srcFloor, srcColumn, tarFloor, tarColumn, mydoJob.getCarId(), rwlx); + if (tsjQueue > 0) { + log.info("生成tsj队列成功 rwh:{},srcC:{},srcF:{},tarC:{},tarF:{},rwlx:{}", mydoJob.getTaskNo(), srcColumn, srcFloor, tarColumn, tarFloor, rwlx); + } + } + if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE3.getCode())) { + /* + 起点层电梯口(小车当前位置)→起点层作业点 srgv + 1. 规划 1 层电梯口到作业点的路径(1 层通道拥堵高发,优先走预设单向通道) + 2. 检查作业点占用状态(同一时间仅 1 台小车作业) + 3. 移动到作业点并锁定作业点 + */ + //生成srgv队列 + String startSite = getTsjSiteIdByFloor(Convert.toInt(mydoJob.getRoadwayId())); + String endSite = mydoJob.getCargoSpaceId(); + String rwlx = "4"; + int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); + if (srgvQueue > 0) { + log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); + } + } + /*if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE4.getCode())) { + *//* + 作业点执行取/放货-> srgv + 1. 触发取货传感器,确认货物已装载 + 2. 更新任务状态为取货完成 + 3. 释放作业点(供其他小车使用) + *//* + String startSite = ""; + String endSite = ""; + String rwlx = "4"; + int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); + if (srgvQueue > 0) { + log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); + } + }*/ + if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE5.getCode())) { + /* + 作业点->起点层电梯口 srgv + 1. 规划作业点到电梯口的返程路径 + 2. 再次检测 1 层通道冲突(避免与新任务小车对向拥堵) + 3. 移动到 1 层电梯口 + */ + String startSite = ""; + String endSite = ""; + String rwlx = "4"; + int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); + if (srgvQueue > 0) { + log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); + } + } + if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE6.getCode())) { + /* + 起点层电梯口→目标层电梯口 tsj + 1. 加入电梯队列(按任务优先级排序,优先高优先级任务) + 2. 占用电梯跨层到目标层 + 3. 电梯到达后,更新小车位置为(目标层,8,8) + */ + //生成tsj队列 + String srcColumn = ""; + String tarColumn = ""; + Integer srcFloor = 0; + Integer tarFloor = 0; + String rwlx = ""; + int tsjQueue = createTsjQueue(Convert.toLong(mydoJob.getTaskNo()), srcFloor, srcColumn, tarFloor, tarColumn, mydoJob.getCarId(), rwlx); + if (tsjQueue > 0) { + log.info("生成tsj队列成功 rwh:{},srcC:{},srcF:{},tarC:{},tarF:{},rwlx:{}", mydoJob.getTaskNo(), srcColumn, srcFloor, tarColumn, tarFloor, rwlx); + } + } + if (mydoJob.getExecutionPhase().equals(STAGE7.getCode())) { + /* + 当前位置→目标货位 srgv + 1. 规划目标层电梯口到目标货位的路径 + 2. 检查目标货位状态(是否空闲,避免重复放货) + 3. 移动到目标货位,触发放货传感器 + */ + //生成srgv队列 + String startSite = deviceSrgv.getCurrSite(); + String endSite = mydoJob.getTargetCargoSpaceId(); + String rwlx = "4"; + int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); + if (srgvQueue > 0) { + log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); + } + } + if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE8.getCode())) { + /* + . 可选两种待命策略: + - 策略 1(优先高效):回到目标层电梯口(就近待命,减少下一次任务跨层成本) + - 策略 2(优先均衡):回到1 层作业点附近(适配高频 1 层出发任务) + 2. 更新小车状态为idle,清空当前任务 + */ + //生成srgv队列 + String startSite = ""; + String endSite = ""; + String rwlx = "4"; + int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); + if (srgvQueue > 0) { + log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); + } + } + if (mydoJob.getExecutionPhase().equals(FINISHED.getCode())) { + //完成任务 + mydoJob.setFinishTime(DateUtil.formatDateTime(new Date())); + mydoJob.setStatus("4"); + mydoJobService.updateMydoJob(mydoJob); + mydoJobService.insertHistory(mydoJob.getJobId()); + JobCallBack jobCallBack = new JobCallBack(); + jobCallBack.setMydojobId(mydoJob.getJobId()); + jobCallBack.setStatus("0"); + if (Convert.toInt(mydoJob.getInOrOut()) < 20) { + jobCallBack.setType("1"); + } else { + jobCallBack.setType("2"); + } + jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); + jobCallBack.setCreateTime(new Date()); + jobCallBackService.insertJobCallBack(jobCallBack); + } + } + } + + } + } + + /** + * 创建srgv队列 + * + * @param mydoJob 任务 + * @param startSite 源站 + * @param endSite 目的站 + * @param rwlx 任务类型 1-入库 2-出库 3-充电 4-点对点 + */ + private int createSrgvQueue(MydoJob mydoJob, String startSite, String endSite, String rwlx) { + WcsSrgvQueue queue = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(mydoJob.getTaskNo()); + if (queue != null) { + return 0; + } + //生成srgv队列 + WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); + wcsSrgvQueue.setGuid(IdUtil.simpleUUID()); + wcsSrgvQueue.setTaskType("1"); + wcsSrgvQueue.setTaskNo(mydoJob.getTaskNo()); + wcsSrgvQueue.setPriority(2L); + wcsSrgvQueue.setCargo("0"); + wcsSrgvQueue.setIssued("0"); + wcsSrgvQueue.setExecutionStatus("0"); + wcsSrgvQueue.setCargoPickSite(mydoJob.getCargoSpaceId()); + wcsSrgvQueue.setCargoPlaceSite(mydoJob.getTargetCargoSpaceId()); + wcsSrgvQueue.setStartSite(startSite); + wcsSrgvQueue.setEndSite(endSite); + wcsSrgvQueue.setCreateDate(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + wcsSrgvQueue.setAgvId(mydoJob.getCarId()); + wcsSrgvQueue.setDefault02(rwlx); + return wcsSrgvQueueService.insertWcsSrgvQueue(wcsSrgvQueue); + } + //出库 1-2-3-4-5-6-7-4-9 + + + /** + * 创建提升机队列 + * + * @param taskNo 任务编号 + * @param srcColumn 源列 + * @param srcFloor 源层 + * @param tarColumn 目标列 + * @param tarFloor 目标层 + * @param carId 小车id + * @param rwlx 任务类型 + */ + private int createTsjQueue(Long taskNo, Integer srcFloor, String srcColumn, Integer tarFloor, String tarColumn, String carId, String rwlx) { + TsjDeviceExecutionQueue queue = tsjDeviceExecutionQueueService.selectTsjDeviceExecutionQueueByRwh(taskNo); + if (ObjUtil.isNull(queue)) { + TsjDeviceExecutionQueue tsjDeviceExecutionQueue = new TsjDeviceExecutionQueue(); + tsjDeviceExecutionQueue.setGuid(IdUtil.simpleUUID()); + tsjDeviceExecutionQueue.setDeviceId(1L); + tsjDeviceExecutionQueue.setDeviceName("提升机"); + tsjDeviceExecutionQueue.setTaskNo(taskNo); + tsjDeviceExecutionQueue.setSrcColumn(srcColumn); + tsjDeviceExecutionQueue.setSrcLayer(Convert.toStr(srcFloor)); + tsjDeviceExecutionQueue.setTarColumn(tarColumn); + tsjDeviceExecutionQueue.setTarLayer(Convert.toStr(tarFloor)); + tsjDeviceExecutionQueue.setSendType("1"); + tsjDeviceExecutionQueue.setCreateDate(DateUtil.formatDateTime(new Date())); + tsjDeviceExecutionQueue.setSpare1(carId); + tsjDeviceExecutionQueue.setTaskType("1"); + tsjDeviceExecutionQueue.setRwlx(rwlx); + return tsjDeviceExecutionQueueService.insertTsjDeviceExecutionQueue(tsjDeviceExecutionQueue); + } + return 0; + } + + + private String getTsjSiteIdByFloor(int floor) { + String siteId = null; + switch (floor) { + case 1: + siteId = "040801"; + break; + case 2: + siteId = "040802"; + break; + case 3: + siteId = "040803"; + break; + case 4: + siteId = "040804"; + break; + case 5: + siteId = "040805"; + break; + case 6: + siteId = "040806"; + break; + case 7: + siteId = "040807"; + break; + case 8: + siteId = "040808"; + break; + default: + return null; + } + return siteId; + } + + /** + * 小车任务处理 + */ + private void srgvTask(DeviceSrgv deviceSrgv) { + //队列下发成功处理 + resQueue(deviceSrgv); + + //小车完成队列 + completeCarTask(deviceSrgv); + + //小车发送任务 + sendTask(deviceSrgv); + } + + /** + * 队列下发成功处理 + */ + private void resQueue(DeviceSrgv deviceSrgv) { + int taskNo = deviceSrgv.getTaskNo(); + String currSite = deviceSrgv.getCurrSite(); + Integer deviceId = deviceSrgv.getDeviceId(); + + if (taskNo > 999 && !"000000".equals(currSite)) { + WcsSrgvQueue param = new WcsSrgvQueue(); + param.setTaskNo(Convert.toStr(taskNo)); + param.setIssued("0"); + param.setAgvId(String.valueOf(deviceId)); + List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(param); + + if (CollUtil.isNotEmpty(wcsSrgvQueues)) { + WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueues.get(0); + + + wcsSrgvQueue.setIssued("1"); + wcsSrgvQueue.setStartDate(DateUtil.now()); + wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); + + } + } + + } + + + /** + * 小车完成队列 + */ + private void completeCarTask(DeviceSrgv deviceSrgv) { + //联机自动 + if (deviceSrgv.getWorkMode() == 4) { + WcsSrgvQueue param = new WcsSrgvQueue(); + param.setAgvId(Convert.toStr(deviceSrgv.getDeviceId())); + param.setEndSite(deviceSrgv.getCurrSite());//目标点 + param.setIssued("1"); + param.setTaskNo(deviceSrgv.getTaskNo().toString()); + List wcsSagvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(param);//查询到达目标的 + if (CollUtil.isNotEmpty(wcsSagvQueues)) { + WcsSrgvQueue wcsSrgvQueue = wcsSagvQueues.get(0); + MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(wcsSrgvQueue.getTaskNo())); + if (mydoJob != null) { + Integer floor = deviceSrgv.getCurrFloor(); + Integer startFloor = Convert.toInt(mydoJob.getRoadwayId()); + Integer endFloor = Convert.toInt(mydoJob.getTargetRoadwayId()); + if (Convert.toInt(mydoJob.getInOrOut()) < 20) { + //入库 + if ("1".equals(mydoJob.getExecutionPhase())) { + mydoJob.setExecutionPhase("2"); + mydoJobService.updateMydoJob(mydoJob); + } else if ("3".equals(mydoJob.getExecutionPhase())) { + if (floor.equals(endFloor)) { + mydoJob.setExecutionPhase("7"); + mydoJobService.updateMydoJob(mydoJob); + } else { + mydoJob.setExecutionPhase("5"); + mydoJobService.updateMydoJob(mydoJob); + } + } else if ("5".equals(mydoJob.getExecutionPhase())) { + mydoJob.setExecutionPhase("6"); + mydoJobService.updateMydoJob(mydoJob); + } else if ("7".equals(mydoJob.getExecutionPhase())) { + mydoJob.setExecutionPhase("8"); + mydoJobService.updateMydoJob(mydoJob); + } + + } else { + //出库 + if ("1".equals(mydoJob.getExecutionPhase())) { + mydoJob.setExecutionPhase("2"); + mydoJobService.updateMydoJob(mydoJob); + } else if ("3".equals(mydoJob.getExecutionPhase())) { + if (floor.equals(1)) { + mydoJob.setExecutionPhase("7"); + mydoJobService.updateMydoJob(mydoJob); + } else { + mydoJob.setExecutionPhase("5"); + mydoJobService.updateMydoJob(mydoJob); + } + } else if ("5".equals(mydoJob.getExecutionPhase())) { + mydoJob.setExecutionPhase("6"); + mydoJobService.updateMydoJob(mydoJob); + } else if ("7".equals(mydoJob.getExecutionPhase())) { + mydoJob.setExecutionPhase("8"); + mydoJobService.updateMydoJob(mydoJob); + } + } + wcsSrgvQueue.setExecutionStatus("4"); + wcsSrgvQueue.setUpdateTime(DateUtil.date()); + wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); + wcsSrgvQueueService.insertHistory(wcsSrgvQueue.getTaskNo()); + wcsSrgvQueueService.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); + + } + } + } + } + + + /** + * 小车发送任务 + */ + private void sendTask(DeviceSrgv deviceSrgv) { + WcsSrgvQueue param = new WcsSrgvQueue(); + param.setIssued("0"); + param.setAgvId(deviceSrgv.getDeviceId().toString()); + List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(param); + if (CollUtil.isEmpty(wcsSrgvQueues)) { + return; + } + for (WcsSrgvQueue wcsSrgvQueue : wcsSrgvQueues) { + String agvId = wcsSrgvQueue.getAgvId(); + if (agvId.equals(Convert.toStr(deviceSrgv.getDeviceId())) && deviceSrgv.getWorkMode() == 4 && deviceSrgv.getAllowSend() == 1) { + String endSite = wcsSrgvQueue.getEndSite(); + String currSite = deviceSrgv.getCurrSite(); + //判断是否可以下发任务 + if ("0".equals(wcsSrgvQueue.getIssued())) { + sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); + } + } + } + + } + + /** + * 小车发送点对点任务 + */ + private void sendPointToPointTask(DeviceSrgv deviceSrgv, WcsSrgvQueue wcsSrgvQueue, String startSite, String endSite) { + Integer floor = deviceSrgv.getCurrFloor(); + //获取当前地图 + Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); + + //处理地图 + int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv); + + //计算最短路径 + List shortestPath = PathFinder.findShortestPath(emptyMap, arrByRoadSite.get(startSite).getX(), arrByRoadSite.get(startSite).getY(), arrByRoadSite.get(endSite).getX(), arrByRoadSite.get(endSite).getY()); + + //判断是否能规划出最短路径 + if (shortestPath == null || shortestPath.isEmpty()) { + log.error("无法到达指定位置"); + return; + } + + //获取拐点路径 + List trun = PathFinder.extractInflectionPoints2(shortestPath); + + // 路径点拼接 + StringBuilder pathBuilder = new StringBuilder(); + if (!shortestPath.isEmpty()) { + for (int[] ints : shortestPath) { + WcsSrgvMap roadSiteByArr = roadCacheService.selectRoadSiteByArr(ints[0], ints[1], floor); + if (roadSiteByArr == null) { + log.error("无此站点 x y z :{},{},{}", ints[0], ints[1], floor); + throw new RuntimeException("点位信息错误"); + } + String site = roadSiteByArr.getSiteId(); + pathBuilder.append(site).append(","); + } + } + // 拐点拼接 + StringBuilder turnBuilder = new StringBuilder(); + if (!trun.isEmpty()) { + for (int[] ints : trun) { + WcsSrgvMap roadSiteByArr = roadCacheService.selectRoadSiteByArr(ints[0], ints[1], floor); + if (roadSiteByArr == null) { + log.error("无此站点 x y z :{},{},{}", ints[0], ints[1], floor); + throw new RuntimeException("点位信息错误"); + } + String site = roadSiteByArr.getSiteId(); + turnBuilder.append(site).append(","); + } + if (turnBuilder.length() > 0) { + turnBuilder.setLength(turnBuilder.length() - 1); + } + // 当trun长度小于6时,后面用0拼接 + if (trun.size() < 6) { + for (int i = trun.size(); i < 6; i++) { + turnBuilder.append(",0"); + } + } + } + + List sendDataList = new ArrayList<>(); + if (!trun.isEmpty()) { + SendData2 path = new SendData2(); + path.setAddress("4000");//地址 + path.setData(startSite + "," + endSite + "," + turnBuilder); + path.setType(2); + sendDataList.add(path); + } else { + SendData2 path = new SendData2(); + path.setAddress("4000");//地址 + path.setData(startSite + "," + endSite); + path.setType(2); + sendDataList.add(path); + } + + + //任务号、原、目标数据转换 + String siteId = wcsSrgvQueue.getTaskNo() + "1";//+ "," + startSite + "," + endSite; + SendData2 site = new SendData2(); + site.setAddress("4400"); + site.setData(siteId); + site.setType(2); + sendDataList.add(site); + + //任务类型转换 + SendData2 taskType = new SendData2(); + taskType.setAddress("2200"); + taskType.setData(wcsSrgvQueue.getTaskType()); + taskType.setType(1); + sendDataList.add(taskType); + + //下发标志转换 + SendData2 flag = new SendData2(); + flag.setAddress("2202"); + flag.setData("1"); + flag.setType(1); + sendDataList.add(flag); + + //下发数据 + boolean b = sendCarTask(sendDataList, deviceSrgv); + if (b) { + wcsSrgvQueue.setPathInfo(pathBuilder.toString()); + wcsSrgvQueue.setTrunPath(turnBuilder.toString()); + wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); + } else { + log.error("小车下发失败 taskNo:{}", wcsSrgvQueue.getTaskNo()); + } + } + + /** + * 小车发送任务 + */ + private boolean sendCarTask(List sendDataList, DeviceSrgv deviceSrgv) { + + boolean b = true; + + for (SendData2 sendData : sendDataList) { + String address = sendData.getAddress(); + String data = sendData.getData();// + + String[] split = data.split(","); + + int type = sendData.getType();//1单字 2双字 3字符串 + + //双字 + if (type == 2) { + int[] intData = Arrays.stream(split).map(String::trim).mapToInt(Integer::parseInt).toArray(); + boolean write = true;//PlcSrgvRead.Write(address, intData); + + if (!write) { + b = false; + break; + } + } + + + //单字 + if (type == 1) { + //String[]转为 short[] + short[] shortData = new short[split.length]; + for (int i = 0; i < split.length; i++) { + try { + shortData[i] = Short.parseShort(split[i].trim()); + } catch (NumberFormatException e) { + // 记录日志并设置默认值 + shortData[i] = 0; + } + } + + boolean write = true;//PlcSrgvRead.Write(address, shortData); + + if (!write) { + b = false; + break; + } + + } + } + + String collect = sendDataList.stream().map(li -> "{" + li.getAddress() + ":" + li.getData() + "}").collect(Collectors.joining(",")); + + log.info("小车:" + deviceSrgv.getDeviceId() + ",下发值:" + collect + ",,结果:" + b); + + return b; + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java index 307fcb4..883e2d1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java @@ -124,7 +124,7 @@ public class SsjThread implements Runnable { } void inDispatch1(DeviceSsj deviceSsj) { - if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode())) { + if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) { //todo 查是否为入库模式,不是退回,是否超重 HashMap map = new HashMap<>(); map.put("trayCode", deviceSsj.getTrayCode()); @@ -136,6 +136,7 @@ public class SsjThread implements Runnable { mydoJob.setStatus("1"); mydoJob.setExecutionPhase("1"); mydoJob.setCreateTime(new Date()); + mydoJob.setTheFloor(mydoJob.getClassId()); if ("GS1002".equals(deviceSsj.getDeviceCode())) { mydoJob.setEntranceId("L1004"); } else { @@ -158,12 +159,9 @@ public class SsjThread implements Runnable { } else { int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2); if (i == 1) { - log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2"); + log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2 条码"+deviceSsj.getTrayCode()); } - } - - } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java index 94730f4..0a5f680 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java @@ -117,8 +117,7 @@ public class TsjThread implements Runnable { private void createSRgvQueueTsjQd(Long rwh, DeviceTsj tsj) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); - if (deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 2 && tsj.getHczt() == 1) { - + if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) ||deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor()))&& deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 2 && tsj.getHczt() == 1) { SendData rwlxSendData = new SendData(Tools.INT, 1); DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(Convert.toStr(1)); byte[] bytes = Tools.sendData(rwlxSendData); diff --git a/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml b/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml index fa25379..9181a4c 100644 --- a/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml @@ -85,7 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -192,4 +192,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + From 03e30d1db04ac304f320b519120be8b4c680816d Mon Sep 17 00:00:00 2001 From: liuhanqing Date: Mon, 2 Mar 2026 08:40:01 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E7=8E=B0=E5=9C=BA=E8=B0=83=E5=BA=A6?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/api/domain/wcs2wms/ReceiveJob.java | 2 + .../api/service/impl/ApiServiceImpl.java | 2 + .../com/ruoyi/job/mapper/MydoJobMapper.java | 8 + .../ruoyi/job/service/IMydoJobService.java | 8 + .../job/service/impl/MydoJobServiceImpl.java | 20 + .../queue/srgv/mapper/WcsSrgvQueueMapper.java | 2 + .../srgv/service/IWcsSrgvQueueService.java | 2 + .../service/impl/WcsSrgvQueueServiceImpl.java | 6 + .../mapper/TsjDeviceExecutionQueueMapper.java | 2 + .../ITsjDeviceExecutionQueueService.java | 2 + .../TsjDeviceExecutionQueueServiceImpl.java | 5 + .../com/ruoyi/schedule/ScheduleThread.java | 2 +- .../schedule/scheduleTask/cdz/CdzThread.java | 80 +- .../scheduleTask/monit/MonitoringThread.java | 1 + .../scheduleTask/srgv/BaseSRgvThread.java | 704 +++++++++------- .../scheduleTask/srgv/BaseSRgvThread1.java | 754 ------------------ .../schedule/scheduleTask/ssj/SsjThread.java | 84 +- .../schedule/scheduleTask/tsj/TsjThread.java | 5 +- .../src/main/resources/application-druid.yml | 4 +- .../src/main/resources/application.yml | 4 +- .../resources/mapper/job/MydoJobMapper.xml | 71 +- .../queue/TsjDeviceExecutionQueueMapper.xml | 7 + .../mapper/queue/WcsSrgvQueueMapper.xml | 7 + 23 files changed, 668 insertions(+), 1114 deletions(-) delete mode 100644 ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread1.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java index a1dfada..879b0a2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java @@ -10,6 +10,7 @@ import lombok.NoArgsConstructor; public class ReceiveJob { private String taskNo; private String cargoSpaceId; + private String targetCargoSpaceId; private String exitId; private String trayCode; private String entranceId; @@ -17,5 +18,6 @@ public class ReceiveJob { private String jobId; private String roadwayId; private String classId; + private Long priority; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java index 540fe86..05d5bfe 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java @@ -353,6 +353,7 @@ public class ApiServiceImpl implements IApiService { mydoJob.setJobId(receiveOutJob.getJobId()); mydoJob.setTaskNo(receiveOutJob.getTaskNo()); mydoJob.setCargoSpaceId(receiveOutJob.getCargoSpaceId()); + mydoJob.setTargetCargoSpaceId(receiveOutJob.getTargetCargoSpaceId()); mydoJob.setExitId(receiveOutJob.getExitId()); mydoJob.setInOrOut(receiveOutJob.getInOrOut()); mydoJob.setStatus("1"); @@ -361,6 +362,7 @@ public class ApiServiceImpl implements IApiService { mydoJob.setCreateTime(DateUtils.getNowDate()); mydoJob.setExecutionPhase("0"); mydoJob.setTheFloor(receiveOutJob.getClassId()); + mydoJob.setPriority(receiveOutJob.getPriority()); int i = mydoJobService.insertMydoJob(mydoJob); if (i > 0) { return AjaxResult.success(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java index 76aaa74..e0ef2d4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java @@ -81,4 +81,12 @@ public interface MydoJobMapper List selectMydoJobFinishList(MydoJob mydoJob); MydoJob selectRunningMydoJobByExitList(@Param("exitList") List exitList); + + List selectMydoJobOut(); + + MydoJob selectMydoJobByTrayCode(String trayCode); + + Integer selectExit(String ssj); + + Integer selectMydoJobCount(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java b/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java index 98a316a..46581ef 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java @@ -80,4 +80,12 @@ public interface IMydoJobService MydoJob selectRunningMydoJobByExitList(List strings); AjaxResult manualCallback(String jobId); + + List selectMydoJobOut(); + + MydoJob selectMydoJobByTrayCode(String trayCode); + + Integer selectExit(String ssj); + + Integer selectMydoJobCount(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java index d54bcd9..ca527fa 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java @@ -173,4 +173,24 @@ public class MydoJobServiceImpl implements IMydoJobService } return AjaxResult.error("手动回调失败"); } + + @Override + public List selectMydoJobOut() { + return mydoJobMapper.selectMydoJobOut(); + } + + @Override + public MydoJob selectMydoJobByTrayCode(String trayCode) { + return mydoJobMapper.selectMydoJobByTrayCode(trayCode); + } + + @Override + public Integer selectExit(String ssj) { + return mydoJobMapper.selectExit(ssj); + } + + @Override + public Integer selectMydoJobCount() { + return mydoJobMapper.selectMydoJobCount(); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java index f515d2e..6ed150c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java @@ -73,4 +73,6 @@ public interface WcsSrgvQueueMapper public int deleteWcsSrgvQueueByGuids(String[] guids); String selectMinCountJob(@Param("list") List outModelSSJ); + + Integer selectTsj(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java index 21c2367..7c4c424 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java @@ -79,4 +79,6 @@ public interface IWcsSrgvQueueService public WcsSrgvQueue insertHistory(String taskNo); String selectMinCountJob(List outModelSSJ); + + Integer selectTsj(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java index d4e7926..0e56937 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java @@ -120,6 +120,12 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService return wcsSrgvQueueMapper.selectMinCountJob(outModelSSJ) ; } + @Override + public Integer selectTsj() { + + return wcsSrgvQueueMapper.selectTsj(); + } + @Override public WcsSrgvQueue insertHistory(String taskNo) { WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/mapper/TsjDeviceExecutionQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/mapper/TsjDeviceExecutionQueueMapper.java index 0c83eba..62e6066 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/mapper/TsjDeviceExecutionQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/mapper/TsjDeviceExecutionQueueMapper.java @@ -65,4 +65,6 @@ public interface TsjDeviceExecutionQueueMapper * @return 提升机执行队列 */ TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo); + + Integer selectCount(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/ITsjDeviceExecutionQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/ITsjDeviceExecutionQueueService.java index f9cf9d0..db855dd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/ITsjDeviceExecutionQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/ITsjDeviceExecutionQueueService.java @@ -64,4 +64,6 @@ public interface ITsjDeviceExecutionQueueService * @return */ TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo); + + Integer selectCount(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/impl/TsjDeviceExecutionQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/impl/TsjDeviceExecutionQueueServiceImpl.java index 656b6a2..36e5a9a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/impl/TsjDeviceExecutionQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/impl/TsjDeviceExecutionQueueServiceImpl.java @@ -104,5 +104,10 @@ public class TsjDeviceExecutionQueueServiceImpl implements ITsjDeviceExecutionQu return tsjDeviceExecutionQueueMapper.selectTsjDeviceExecutionQueueByRwh(taskNo); } + @Override + public Integer selectCount() { + return tsjDeviceExecutionQueueMapper.selectCount(); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java index b01e2fb..4b69343 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java @@ -177,7 +177,7 @@ public class ScheduleThread { */ public void startAllThread() { plcSsjReadCustomThread.getThread().start(); - plcSrgvReadCustomThread1.getThread().start(); + //plcSrgvReadCustomThread1.getThread().start(); plcSrgvReadCustomThread2.getThread().start(); plcSrgvReadCustomThread3.getThread().start(); plcTsjReadCustomThread.getThread().start(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java index fb59d95..8f374ff 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java @@ -13,6 +13,8 @@ import com.ruoyi.device.srgv.domain.DeviceSrgv; import com.ruoyi.device.srgv.service.IDeviceSrgvService; import com.ruoyi.job.charg.domain.SrgvChargingJob; import com.ruoyi.job.charg.service.ISrgvChargingJobService; +import com.ruoyi.job.mapper.MydoJobMapper; +import com.ruoyi.job.service.IMydoJobService; import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; import com.ruoyi.schedule.plcRead.cdz.PlcCdzRead; @@ -33,18 +35,20 @@ public class CdzThread implements Runnable { public boolean isRun = true; private final Integer LITTLE_BETTERY = 30; - private final Integer MIDDLE_BETTERY = 70; - + private final Integer MIDDLE_BETTERY = 60; + private final Integer MAX_BETTERY = 90; private ISrgvChargingJobService chargingJobService; private IDeviceCdzService deviceCdzService; private IDeviceSrgvService deviceSrgvService; private IWcsSrgvQueueService wcsSrgvQueueService; + public IMydoJobService mydoJobService; public void init() { chargingJobService = SpringUtils.getBean(ISrgvChargingJobService.class); deviceCdzService = SpringUtils.getBean(IDeviceCdzService.class); deviceSrgvService = SpringUtils.getBean(IDeviceSrgvService.class); wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); + mydoJobService = SpringUtils.getBean(IMydoJobService.class); } @Override @@ -71,7 +75,7 @@ public class CdzThread implements Runnable { List middleBatterySRgv = new ArrayList<>(); for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); - if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3) { + if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3 && deviceSrgv.getChargeFlag() != 2) { if (deviceSrgv.getBattery() <= LITTLE_BETTERY) { littleBatterySRgv.add(deviceSrgv); } else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY) { @@ -128,38 +132,50 @@ public class CdzThread implements Runnable { } - //生成断电任务 有任务且电量大于50 todo 代码无效 - WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); - wcsSrgvQueueParam.setIssued("0"); - List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam); - if (CollUtil.isNotEmpty(wcsSrgvQueues)) { - boolean existsKxSRgv = false; - //判断有没有空闲小车 - for (DeviceSrgv x : PlcSrgvRead.deviceSrgvMap.values()) { - if (x.getWorkMode() == 5 && x.getStatus() == 1) { - existsKxSRgv = true; - break; - } - } - if (!existsKxSRgv) { - List deviceCdzs = deviceCdzService.selectDeviceCdzHasSRgvList(); - if (CollUtil.isNotEmpty(deviceCdzs)) { - for (DeviceCdz deviceCdz : deviceCdzs) { - if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1())) { - DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()); - if (deviceSrgv.getBattery() >= 50) { - //生成断电任务 - createChargingOutJob(deviceSrgv, deviceCdz); - break; - } - } - } - } + Integer count = mydoJobService.selectMydoJobCount(); + List deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList(); + for (DeviceCdz deviceCdz : deviceCdzdd) { + if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1()) + && ((PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getBattery() >= MIDDLE_BETTERY && count > 0) || PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getBattery() >= MAX_BETTERY) + && PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getWorkMode() == 5 + && PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getChargeFlag() == 2 && deviceCdz.getStatus() == 1) { + createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz); } } +// //生成断电任务 有任务且电量大于50 todo 代码无效 +// WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); +// wcsSrgvQueueParam.setIssued("0"); +// List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam); +// if (CollUtil.isNotEmpty(wcsSrgvQueues)) { +// boolean existsKxSRgv = false; +// //判断有没有空闲小车 +// for (DeviceSrgv x : PlcSrgvRead.deviceSrgvMap.values()) { +// if (x.getWorkMode() == 5 && x.getStatus() == 1) { +// existsKxSRgv = true; +// break; +// } +// } +// if (!existsKxSRgv) { +// List deviceCdzs = deviceCdzService.selectDeviceCdzHasSRgvList(); +// if (CollUtil.isNotEmpty(deviceCdzs)) { +// for (DeviceCdz deviceCdz : deviceCdzs) { +// if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1())) { +// DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()); +// if (deviceSrgv.getBattery() >= 50) { +// //生成断电任务 +// createChargingOutJob(deviceSrgv, deviceCdz); +// break; +// } +// } +// } +// } +// } +// } + + //断电任务下发 SrgvChargingJob srgvChargingJobDdParam = new SrgvChargingJob(); srgvChargingJobDdParam.setChargingStatus("0"); @@ -212,7 +228,7 @@ public class CdzThread implements Runnable { //寻找最接近的充电桩 Integer floor = deviceSrgv.getCurrFloor(); DeviceCdz cdz = null; - Optional min = cdzList.stream().filter(c -> c.getSzcs().equals(floor)).min((o1, o2) -> { + Optional min = cdzList.stream().min((o1, o2) -> { Integer distance1 = Math.abs(o1.getSzcs()); Integer distance2 = Math.abs(o2.getSzcs()); return distance1 - distance2; @@ -265,7 +281,7 @@ public class CdzThread implements Runnable { srgvChargingJobParamOut.setJobType("2"); List srgvChargingJobOut = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParamOut); - if (CollUtil.isNotEmpty(srgvChargingJobs)&&CollUtil.isEmpty(srgvChargingJobOut)) { + if (CollUtil.isNotEmpty(srgvChargingJobs) && CollUtil.isEmpty(srgvChargingJobOut)) { SrgvChargingJob scj = srgvChargingJobs.get(0); //插入历史 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java index e3a1162..f92a6e8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java @@ -61,6 +61,7 @@ public class MonitoringThread implements Runnable { } for (String cdzCode : PlcCdzRead.deviceCdzMap.keySet()) { DeviceCdz deviceCdz = PlcCdzRead.deviceCdzMap.get(cdzCode); + deviceCdz.setSpare1(null); deviceCdzService.updateDeviceCdz(deviceCdz); } try { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java index 67f8f06..9d90acf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java @@ -32,8 +32,10 @@ import com.ruoyi.schedule.ScheduleThread; import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead; import com.ruoyi.schedule.plcRead.srgv.roadUtil.PathFinder; import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead; +import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; +import java.sql.Struct; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -111,7 +113,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { createCarInQueue(); // 出库队列 createCarOutQueue(); - // 充电任务 + // 充电任务队列 inCharging(deviceSrgv); // 充电完成调离 // outCharging(deviceSrgv); @@ -184,8 +186,14 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } else { wcsSrgvQueue.setEndSite("tsj"); wcsSrgvQueue.setDefault02("8"); +// if (endSite.equals("tsj")){ + Integer count = wcsSagvQueueMapper.selectTsj(); + if (count > 0) { + return; + } +// } } - wcsSrgvQueue.setTaskNo("9999"); + wcsSrgvQueue.setTaskNo(String.valueOf(deviceSrgv.getDeviceId() + 500)); wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); @@ -214,173 +222,240 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { * 生成出库小车队列 */ private void createCarOutQueue() { - MydoJob mydoJob = new MydoJob(); - mydoJob.setInOut("2"); - mydoJob.setExecutionPhase("0"); - mydoJob.setStatus("1"); - List mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob); +// MydoJob mydoJob = new MydoJob(); +// mydoJob.setInOut("2"); +// mydoJob.setExecutionPhase("0"); +// mydoJob.setStatus("1"); +// List mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob); + + + List mydoJobs = mydoJobService.selectMydoJobOut(); + if (!mydoJobs.isEmpty()) { - MydoJob mydoJob1 = mydoJobs.get(0); - // 查询是否有已下发的该任务号队列 - WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); - if (wcsSrgvQueue1 == null) { - ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; - List deviceSrgvList = deviceSrgvMap.values().stream() - .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5) - .filter(deviceSrgv -> deviceSrgv.getBattery() > 30) - .sorted((d1, d2) -> Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d2.getCurrFloor()) - - Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d1.getCurrFloor())) - .collect(Collectors.toList()); - if (!deviceSrgvList.isEmpty()) { - DeviceSrgv deviceSrgv = null; - for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { - //优先出库层,如果没有优先邻近层 - if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { - deviceSrgv = deviceSrgv1; - break; - } else if (deviceSrgv == null || (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv1.getCurrFloor())) < (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv.getCurrFloor()))) { - WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); - if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { + for (MydoJob mydoJob1 : mydoJobs) { + WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); + if (wcsSrgvQueue1 == null) { + ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; + List deviceSrgvList = deviceSrgvMap.values().stream() + .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 1) + .filter(deviceSrgv -> deviceSrgv.getBattery() > 30) + .sorted((d1, d2) -> Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d2.getCurrFloor()) + - Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d1.getCurrFloor())) + .collect(Collectors.toList()); + if (!deviceSrgvList.isEmpty()) { + DeviceSrgv deviceSrgv = null; + /*for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { + //优先出库层,如果没有优先邻近层 + if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { deviceSrgv = deviceSrgv1; + break; + } else if (deviceSrgv == null || (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv1.getCurrFloor())) < (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv.getCurrFloor()))) { + WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); + if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { + deviceSrgv = deviceSrgv1; + } + } + }*/ + WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); + wcsSrgvMap.setCargoSpaceId(mydoJob1.getCargoSpaceId()); + List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); + //取货地址 + String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); + //先找流程相等的小车 + List currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList()); + int z = 100000; + for (DeviceSrgv srgv : currentFloorCarList) { + // 坐标截取和转换(保留你的原有逻辑) + Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2)); + Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2)); + Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4)); + Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4)); + + // 计算当前小车到取货点的曼哈顿距离 + int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY); + + // 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车 + if (tempZ < z) { + z = tempZ; // 把z更新为当前更小的距离 + deviceSrgv = srgv; // 记录这个更近的小车 + log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv); } } - } - if (deviceSrgv != null) { - WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); - WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); + if (deviceSrgv == null) { + //如果未选择到小车,再找其他楼层的小车 + for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { + if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { + WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); + if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { + deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车 + log.info("楼层bu相等:{}", deviceSrgv); - if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) { - //查询小车是否为取货楼层 - String endSite = ""; - String issued = "0"; - String executionStatus = "1"; - String default08 = "";//是否二段任务标识 - String default06 = ""; - WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); - wcsSrgvMap.setCargoSpaceId(mydoJob1.getCargoSpaceId()); - List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); - //取货地址 - String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); - Integer currFloor = deviceSrgv.getCurrFloor(); - Integer theLayer = wcsSrgvMaps.get(0).getPlcLayer(); - if (Objects.equals(deviceSrgv.getCurrFloor(), wcsSrgvMaps.get(0).getPlcLayer())) { - //终点是巷道口到位输送线 - endSite = cargoPickSite; - //生成队列时插入二段下发标识和第二段任务终点 - String groupCodingNo = basCargoSpaceService.selecGroupCodingBySite(endSite); - String siteId = basCargoSpaceService.selectMaxSiteIdByNo(groupCodingNo); - if (!endSite.equals(siteId) && !deviceSrgv.getCurrSite().equals(endSite)) { - default08 = "1"; - default06 = siteId; - } - if (cargoPickSite.equals(deviceSrgv.getCurrSite())) { - issued = "1"; - executionStatus = "3"; - } - } else { - //终点是提升机 - endSite = "tsj"; - } - WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); - String cargoPlaceSite =""; - ConcurrentHashMap deviceSsjMap = PlcSsjRead.deviceSsjMap; - List outModelSSJ=new ArrayList<>(); - for (String deviceSsj : deviceSsjMap.keySet()) { - if (deviceSsj.equals("TD1001")||deviceSsj.equals("TD1008")) { - DeviceSsj deviceSsj1=deviceSsjMap.get(deviceSsj); - if (deviceSsj1.getModel()==2){ - String s=""; - if (deviceSsj1.equals("TD1001")){ - s="050101"; - }else { - s="070101"; - } - outModelSSJ.add(s); } } } - cargoPlaceSite= wcsSagvQueueMapper.selectMinCountJob(outModelSSJ); - if (Objects.equals(cargoPlaceSite, "")){ - return; - } - wcsSrgvMap1.setRemark(mydoJob1.getExitId()); - //TODO 读取输送机入出库模式分配出口 - List wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1); - String cargoPlaceSite1 =cargoPlaceSite; - List sameSiteDevices = deviceSrgvMap.values().stream() - .filter(d -> d.getWorkMode() == 5 - && d.getStatus() == 1 - && d.getCurrSite().equals(cargoPlaceSite1)) - .collect(Collectors.toList()); - if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { - WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); - wcsSrgvMap3.setRemark("cache"); - List wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3); - for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) { - //deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象 - if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) { - //生成小车到缓存点队列 - WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString()); - WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); - wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); - List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue); - if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) { - WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue(); - wcsSrgvQueue3.setGuid(UUID.randomUUID().toString()); - wcsSrgvQueue3.setTaskNo("9999"); - wcsSrgvQueue3.setTaskType("1"); - wcsSrgvQueue3.setPriority(Long.parseLong("2")); - wcsSrgvQueue3.setCargo("1"); - wcsSrgvQueue3.setIssued(issued); - wcsSrgvQueue3.setExecutionStatus(executionStatus); - wcsSrgvQueue3.setCargoPickSite(cargoPickSite); - wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); - wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite()); - wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId()); - wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString()); - wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString()); - wcsSrgvQueue3.setDefault02("4"); - wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString()); - wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3); - } + } + if (deviceSrgv != null) { + WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); + WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); + + if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) { + //查询小车是否为取货楼层 + String endSite = ""; + String issued = "0"; + String executionStatus = "1"; + String default08 = "";//是否二段任务标识 + String default06 = ""; + + Integer currFloor = deviceSrgv.getCurrFloor(); + Integer theLayer = wcsSrgvMaps.get(0).getPlcLayer(); + if (Objects.equals(deviceSrgv.getCurrFloor(), wcsSrgvMaps.get(0).getPlcLayer())) { + //终点是巷道口到位输送线 + endSite = cargoPickSite; + //生成队列时插入二段下发标识和第二段任务终点 + String groupCodingNo = basCargoSpaceService.selecGroupCodingBySite(endSite); + String siteId = basCargoSpaceService.selectMaxSiteIdByNo(groupCodingNo); + if (!endSite.equals(siteId) && !deviceSrgv.getCurrSite().equals(endSite)) { + default08 = "1"; + default06 = siteId; + } + if (cargoPickSite.equals(deviceSrgv.getCurrSite())) { + issued = "1"; + executionStatus = "3"; + } + } else { + //终点是提升机 + endSite = "tsj"; + } + if (endSite.equals("tsj")) { + Integer count = wcsSagvQueueMapper.selectTsj(); + if (count > 0) { + return; } } + + mydoJob1.setExitId(null); + WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); + String cargoPlaceSite = ""; + ConcurrentHashMap deviceSsjMap = PlcSsjRead.deviceSsjMap; + List outModelSSJ = new ArrayList<>(); + if (!mydoJob1.getInOrOut().equals("30")) { + for (String deviceSsj : deviceSsjMap.keySet()) { + if (deviceSsj.equals("TD1001") || deviceSsj.equals("TD1008")) { + DeviceSsj deviceSsj1 = deviceSsjMap.get(deviceSsj); + if (deviceSsj1.getModel() == 2) { + String s = ""; + String ssj = ""; + if (deviceSsj1.getName().equals("TD1001")) { + s = "050101"; + ssj = "L1004"; + } else { + s = "070101"; + ssj = "L1005"; + } + Integer count = mydoJobService.selectExit(ssj); + if (count == 0) { + mydoJob1.setExitId(ssj); + mydoJobService.updateMydoJob(mydoJob1); + outModelSSJ.add(s); + break; + } + } + } + } + cargoPlaceSite = wcsSagvQueueMapper.selectMinCountJob(outModelSSJ); + if (Objects.equals(cargoPlaceSite, "")) { + return; + } + } + + wcsSrgvMap1.setRemark(mydoJob1.getExitId()); + //TODO 读取输送机入出库模式分配出口 + List wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1); + String cargoPlaceSite1 = cargoPlaceSite; + List sameSiteDevices = deviceSrgvMap.values().stream() + .filter(d -> d.getWorkMode() == 5 + && d.getStatus() == 1 + && d.getCurrSite().equals(cargoPlaceSite1)) + .collect(Collectors.toList()); + if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { + WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); + wcsSrgvMap3.setRemark("cache"); +// List wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3); +// for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) { +// //deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象 +// if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) { +// //生成小车到缓存点队列 +// WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString()); +// WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); +// wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); +// List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue); +// if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) { +// WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue(); +// wcsSrgvQueue3.setGuid(UUID.randomUUID().toString()); +// wcsSrgvQueue3.setTaskNo("11111"); +// wcsSrgvQueue3.setTaskType("1"); +// wcsSrgvQueue3.setPriority(Long.parseLong("2")); +// wcsSrgvQueue3.setCargo("1"); +// wcsSrgvQueue3.setIssued(issued); +// wcsSrgvQueue3.setExecutionStatus(executionStatus); +// wcsSrgvQueue3.setCargoPickSite(cargoPickSite); +// wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); +// wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite()); +// wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId()); +// wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString()); +// wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); +// wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString()); +// wcsSrgvQueue3.setDefault02("4"); +// wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString()); +// wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3); +// } +// } +// } + } + + + //生成小车取货队列 + WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); + wcsSrgvQueue.setGuid(UUID.randomUUID().toString()); + wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo()); + wcsSrgvQueue.setTaskType("1"); + wcsSrgvQueue.setPriority(Long.parseLong("2")); + wcsSrgvQueue.setCargo("1"); + wcsSrgvQueue.setIssued(issued); + wcsSrgvQueue.setExecutionStatus(executionStatus); + wcsSrgvQueue.setCargoPickSite(cargoPickSite); + if (mydoJob1.getInOrOut().equals("30")) { + WcsSrgvMap wcsSrgvMapsite = new WcsSrgvMap(); + wcsSrgvMapsite.setCargoSpaceId(mydoJob1.getTargetCargoSpaceId()); + List wcsSrgvSite = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapsite); + cargoPlaceSite = wcsSrgvSite.get(0).getSiteId(); + } + wcsSrgvQueue.setCargoPlaceSite(cargoPlaceSite); + wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); + wcsSrgvQueue.setEndSite(endSite); + wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); + wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); + if (endSite.equals("tsj")) { + wcsSrgvQueue.setDefault02("8"); + mydoJob1.setExitId(null); + mydoJobService.updateMydoJob(mydoJob1); + } else { + wcsSrgvQueue.setDefault02("4"); + } + String cargoSpaceId = mydoJob1.getCargoSpaceId(); + String tarFloor = cargoSpaceId.substring(5, 6); + wcsSrgvQueue.setDefault07(tarFloor); + wcsSrgvQueue.setDefault08(default08); + wcsSrgvQueue.setDefault06(default06); + wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); } - - - //生成小车取货队列 - WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); - wcsSrgvQueue.setGuid(UUID.randomUUID().toString()); - wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo()); - wcsSrgvQueue.setTaskType("1"); - wcsSrgvQueue.setPriority(Long.parseLong("2")); - wcsSrgvQueue.setCargo("1"); - wcsSrgvQueue.setIssued(issued); - wcsSrgvQueue.setExecutionStatus(executionStatus); - wcsSrgvQueue.setCargoPickSite(cargoPickSite); - - wcsSrgvQueue.setCargoPlaceSite(cargoPlaceSite); - wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); - wcsSrgvQueue.setEndSite(endSite); - wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); - wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); - if (endSite.equals("tsj")) { - wcsSrgvQueue.setDefault02("8"); - } else { - wcsSrgvQueue.setDefault02("4"); - } - String cargoSpaceId = mydoJob1.getCargoSpaceId(); - String tarFloor = cargoSpaceId.substring(5, 6); - wcsSrgvQueue.setDefault07(tarFloor); - wcsSrgvQueue.setDefault08(default08); - wcsSrgvQueue.setDefault06(default06); - wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); } } } } + + } } @@ -394,150 +469,186 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { mydoJob.setInOut("1"); List mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob); if (!mydoJobs.isEmpty()) { - MydoJob mydoJob1 = mydoJobs.get(0); - // 查询是否有已下发的该任务号队列 - WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); + for (MydoJob mydoJob1 : mydoJobs) { + // 查询是否有已下发的该任务号队列 + WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); - if (wcsSrgvQueue1 == null) { - ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; + if (wcsSrgvQueue1 == null) { + ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; - List deviceSrgvList = deviceSrgvMap.values().stream() - .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5) - .filter(deviceSrgv -> deviceSrgv.getBattery() > 30) - .filter(deviceSrgv -> deviceSrgv.getCurrFloor() > 0) - .sorted((d1, d2) -> d2.getCurrFloor().compareTo(d1.getCurrFloor())) - .collect(Collectors.toList()); + List deviceSrgvList = deviceSrgvMap.values().stream() + .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5) + .filter(deviceSrgv -> deviceSrgv.getBattery() > 30) + .filter(deviceSrgv -> deviceSrgv.getCurrFloor() > 0) + .filter(deviceSrgv -> deviceSrgv.getStatus() == 1) + .sorted((d1, d2) -> d2.getCurrFloor().compareTo(d1.getCurrFloor())) + .collect(Collectors.toList()); - log.info("list:{}", deviceSrgvList); + log.info("list:{}", deviceSrgvList); - if (!deviceSrgvList.isEmpty()) { - DeviceSrgv deviceSrgv = null; - for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { - if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { - deviceSrgv = deviceSrgv1; - log.info("楼层相等:{}", deviceSrgv); - break; // 找到了相同楼层的直接选它 - } else { - WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); - if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { - deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车 - log.info("楼层bu相等:{}", deviceSrgv); + if (!deviceSrgvList.isEmpty()) { + DeviceSrgv deviceSrgv = null; + //找到入库 + WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); + wcsSrgvMap.setRemark(mydoJob1.getEntranceId()); + if (StrUtil.isEmpty(wcsSrgvMap.getRemark())) { + log.error("入库任务号:{} 入库入口ID为空", mydoJob1.getTaskNo()); + return; + } + List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); + + //取货地址 + String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); + + //先找流程相等的小车 + List currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList()); + int z = 100000; + for (DeviceSrgv srgv : currentFloorCarList) { + // 坐标截取和转换(保留你的原有逻辑) + Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2)); + Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2)); + Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4)); + Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4)); + + // 计算当前小车到取货点的曼哈顿距离 + int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY); + + // 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车 + if (tempZ < z) { + z = tempZ; // 把z更新为当前更小的距离 + deviceSrgv = srgv; // 记录这个更近的小车 + log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv); } } - } + if (deviceSrgv == null) { + //如果未选择到小车,再找其他楼层的小车 + for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { + if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { + WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); + if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { + deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车 + log.info("楼层bu相等:{}", deviceSrgv); - if (deviceSrgv != null) { - - WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); - WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); - - if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) { - - //查询小车是否为1楼,且1楼小车不在入库站点 - String endSite = ""; - String issued = "0"; - String executionStatus = "1"; - WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); - wcsSrgvMap.setRemark(mydoJob1.getEntranceId()); - if (StrUtil.isEmpty(wcsSrgvMap.getRemark())) { - log.error("入库任务号:{} 入库入口ID为空", mydoJob1.getTaskNo()); - return; - } - List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); - //取货地址 - String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); - - if (deviceSrgv.getCurrFloor() == 1) { - endSite = cargoPickSite; - if (cargoPickSite.equals(deviceSrgv.getCurrSite())) { - // 小车已在取货点 - issued = "1"; - executionStatus = "3"; - } - } else { - // 小车不在1楼 - endSite = "tsj"; - } - //筛选出deviceSrgvMap中deviceSrgv.getWorkMode() == 4并且deviceSrgv.getStatus() == 1并且deviceSrgv.getCurrSite() == cargoPickSite得对象,并排除掉其中deviceId与deviceSrgv.getDeviceId()相同的对象 - - List sameSiteDevices = deviceSrgvMap.values().stream() - .filter(d -> d.getWorkMode() == 5 - && d.getStatus() == 1 - && d.getCurrSite().equals(cargoPickSite)) - .collect(Collectors.toList()); - if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { - WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); - wcsSrgvMap3.setRemark("cache"); - List wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3); - for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) { - //deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象 - if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) { - WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString()); - WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); - wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); - List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue); - if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) { - //生成占位小车到缓存点队列 - WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue(); - wcsSrgvQueue3.setGuid(UUID.randomUUID().toString()); - wcsSrgvQueue3.setTaskNo(String.valueOf(taskCache)); - wcsSrgvQueue3.setTaskType("1"); - wcsSrgvQueue3.setPriority(Long.parseLong("2")); - wcsSrgvQueue3.setCargo("1"); - wcsSrgvQueue3.setIssued(issued); - wcsSrgvQueue3.setExecutionStatus(executionStatus); - wcsSrgvQueue3.setCargoPickSite(cargoPickSite); - wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); - wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite()); - wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId()); - wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString()); - wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString()); - wcsSrgvQueue3.setDefault02("4"); - wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString()); - wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3); - taskCache++; - return; - } } - - } } + } + if (deviceSrgv != null) { + + WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); + WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); + + if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 +// && wcsSrgvQueue4 == null + ) { + + //查询小车是否为1楼,且1楼小车不在入库站点 + String endSite = ""; + String issued = "0"; + String executionStatus = "1"; - //生成小车取货队列 - WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); - wcsSrgvQueue.setGuid(UUID.randomUUID().toString()); - wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo()); - wcsSrgvQueue.setTaskType("1"); - wcsSrgvQueue.setPriority(Long.parseLong("2")); - wcsSrgvQueue.setCargo("1"); - wcsSrgvQueue.setIssued(issued); - wcsSrgvQueue.setExecutionStatus(executionStatus); - wcsSrgvQueue.setCargoPickSite(cargoPickSite); - WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); - wcsSrgvMap1.setCargoSpaceId(mydoJob1.getCargoSpaceId()); - List wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1); - wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMaps1.get(0).getSiteId()); - wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); - wcsSrgvQueue.setEndSite(endSite); - wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); - wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); - if (endSite.equals("tsj")) { - wcsSrgvQueue.setDefault02("8"); - } else { - wcsSrgvQueue.setDefault02("4"); + if (deviceSrgv.getCurrFloor() == 1) { + endSite = cargoPickSite; + if (cargoPickSite.equals(deviceSrgv.getCurrSite())) { + // 小车已在取货点 + issued = "1"; + executionStatus = "3"; + } + } else { + // 小车不在1楼 + endSite = "tsj"; + } + if (endSite.equals("tsj")) { + Integer count = wcsSagvQueueMapper.selectTsj(); + if (count > 0) { + return; + } + } + + + //筛选出deviceSrgvMap中deviceSrgv.getWorkMode() == 4并且deviceSrgv.getStatus() == 1并且deviceSrgv.getCurrSite() == cargoPickSite得对象,并排除掉其中deviceId与deviceSrgv.getDeviceId()相同的对象 + + List sameSiteDevices = deviceSrgvMap.values().stream() + .filter(d -> d.getWorkMode() == 5 + && d.getStatus() == 1 + && d.getCurrSite().equals(cargoPickSite)) + .collect(Collectors.toList()); + if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { + WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); + wcsSrgvMap3.setRemark("cache"); + List wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3); + for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) { + //deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象 + //todo +// if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) { +// WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString()); +// WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); +// wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); +// List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue); +// if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) { +// //生成占位小车到缓存点队列 +// WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue(); +// wcsSrgvQueue3.setGuid(UUID.randomUUID().toString()); +// wcsSrgvQueue3.setTaskNo(String.valueOf(taskCache)); +// wcsSrgvQueue3.setTaskType("1"); +// wcsSrgvQueue3.setPriority(Long.parseLong("2")); +// wcsSrgvQueue3.setCargo("1"); +// wcsSrgvQueue3.setIssued(issued); +// wcsSrgvQueue3.setExecutionStatus(executionStatus); +// wcsSrgvQueue3.setCargoPickSite(cargoPickSite); +// wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); +// wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite()); +// wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId()); +// wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString()); +// wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); +// wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString()); +// wcsSrgvQueue3.setDefault02("4"); +// wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString()); +// wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3); +// taskCache++; +// return; +// } +// } + + } + } + + + //生成小车取货队列 + WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); + wcsSrgvQueue.setGuid(UUID.randomUUID().toString()); + wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo()); + wcsSrgvQueue.setTaskType("1"); + wcsSrgvQueue.setPriority(Long.parseLong("2")); + wcsSrgvQueue.setCargo("1"); + wcsSrgvQueue.setIssued(issued); + wcsSrgvQueue.setExecutionStatus(executionStatus); + wcsSrgvQueue.setCargoPickSite(cargoPickSite); + WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); + wcsSrgvMap1.setCargoSpaceId(mydoJob1.getCargoSpaceId()); + List wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1); + wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMaps1.get(0).getSiteId()); + wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); + wcsSrgvQueue.setEndSite(endSite); + wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); + wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); + if (endSite.equals("tsj")) { + wcsSrgvQueue.setDefault02("8"); + } else { + wcsSrgvQueue.setDefault02("4"); + } + wcsSrgvQueue.setDefault07("1"); + wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); + } - wcsSrgvQueue.setDefault07("1"); - wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); - } } } } + } } @@ -867,7 +978,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } - if (wcsSrgvQueue.getDefault08().equals("2") && deviceSrgv.getSpare5().equals("1")) { + if (wcsSrgvQueue.getDefault08().equals("2") + && deviceSrgv.getSpare5().equals("1") + ) { sendDataList = new ArrayList<>(); SendData2 path = new SendData2(); path.setAddress("4404");//地址 @@ -926,7 +1039,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); //换层任务不修改执行阶段 - if (mydoJob!=null && !wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) { + if (mydoJob != null && !wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) { mydoJob.setExecutionPhase("3"); mydoJob.setStatus("3"); mydoJobService.updateMydoJob(mydoJob); @@ -972,6 +1085,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { // 载货任务(出库、入库、移库等) sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); break; + case "7": + // 移库任务(出库、入库、移库等) + sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); + break; } if (sendFlag) { @@ -1163,6 +1280,13 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //不同层,终点为提升机 endSite = "tsj"; } + // 如果终点是提升机需要判断是否有其他任务也是提升机的 这个时候先停一下 + if (endSite.equals("tsj")) { + Integer count = wcsSagvQueueMapper.selectTsj(); + if (count > 0) { + return; + } + } if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) { xfType = "1";//入库 @@ -1208,7 +1332,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { case "2": MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); - if (mydoJobOut != null) { + if (mydoJobOut != null && (cargoPlaceSite.equals(currSite))) { JobCallBack jobCallBack = new JobCallBack(); jobCallBack.setType(wcsSrgvQueue.getDefault02()); jobCallBack.setMydojobId(mydoJobOut.getJobId()); @@ -1220,7 +1344,19 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId()); } case "7"://移库,变动库存 - break; + MydoJob mydoJobyk = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); + if (mydoJobyk != null) { + JobCallBack jobCallBack = new JobCallBack(); + jobCallBack.setType(wcsSrgvQueue.getDefault02()); + jobCallBack.setMydojobId(mydoJobyk.getJobId()); + jobCallBack.setStatus("0"); + jobCallBack.setTaskNo(Convert.toLong(mydoJobyk.getTaskNo())); + jobCallBack.setCreateTime(new Date()); + jobCallBackService.insertJobCallBack(jobCallBack); + mydoJobService.insertHistory(mydoJobyk.getJobId()); + mydoJobService.deleteMydoJobByJobId(mydoJobyk.getJobId()); + } + default: break; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread1.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread1.java deleted file mode 100644 index 2cd541a..0000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread1.java +++ /dev/null @@ -1,754 +0,0 @@ -package com.ruoyi.schedule.scheduleTask.srgv; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.StrUtil; -import com.ruoyi.bas.port.service.IWcsPortService; -import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; -import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService; -import com.ruoyi.bas.srgvmap.service.RoadCacheService; -import com.ruoyi.common.TaskStage; -import com.ruoyi.common.domain.SendData2; -import com.ruoyi.common.utils.spring.SpringUtils; -import com.ruoyi.device.srgv.domain.DeviceSrgv; -import com.ruoyi.job.charg.service.ISrgvChargingJobService; -import com.ruoyi.job.domain.JobCallBack; -import com.ruoyi.job.domain.MydoJob; -import com.ruoyi.job.service.IJobCallBackService; -import com.ruoyi.job.service.IMydoJobService; -import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; -import com.ruoyi.queue.srgv.service.IWcsSrgvQueueFinishService; -import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; -import com.ruoyi.queue.tsj.domain.TsjDeviceExecutionQueue; -import com.ruoyi.queue.tsj.service.ITsjDeviceExecutionQueueService; -import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead; -import com.ruoyi.schedule.plcRead.srgv.roadUtil.PathFinder; -import lombok.extern.slf4j.Slf4j; - -import java.util.*; -import java.util.stream.Collectors; - -import static com.ruoyi.common.TaskStage.FINISHED; -import static com.ruoyi.common.TaskStage.STAGE7; - -@Slf4j -public class BaseSRgvThread1 implements Runnable, SRgvThreadInterface { - - private IWcsSrgvMapService wcsSrgvMapService; - private IWcsSrgvQueueService wcsSrgvQueueService; - private ITsjDeviceExecutionQueueService tsjDeviceExecutionQueueService; - - private IMydoJobService mydoJobService; - - private RoadCacheService roadCacheService; - private IJobCallBackService jobCallBackService; - - public IWcsSrgvQueueFinishService wcsSagvQueueFinishMapper; - - public IWcsPortService wcsPortService; - - public ISrgvChargingJobService srgvChargingJobMapper; - - public boolean isRun = true; - - public HashMap> sRgvCodeList; - - public void init() { - sRgvCodeList = new HashMap<>(); - ArrayList sRgvCodes = new ArrayList<>(); - sRgvCodes.add("1"); - /*sRgvCodes.add("2"); - sRgvCodes.add("3");*/ - sRgvCodeList.put("srgv", sRgvCodes); - - wcsSagvQueueFinishMapper = SpringUtils.getBean(IWcsSrgvQueueFinishService.class); - wcsPortService = SpringUtils.getBean(IWcsPortService.class); - srgvChargingJobMapper = SpringUtils.getBean(ISrgvChargingJobService.class); - mydoJobService = SpringUtils.getBean(IMydoJobService.class); - wcsSrgvMapService = SpringUtils.getBean(IWcsSrgvMapService.class); - roadCacheService = SpringUtils.getBean(RoadCacheService.class); - wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); - tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class); - } - - @Override - public void run() { - init(); - while (isRun) { - - for (String code : sRgvCodeList.get("srgv")) { - - try { - if (PlcSrgvRead.deviceSrgvMap.containsKey(code)) { - if (ObjUtil.isNotNull(PlcSrgvRead.deviceSrgvMap.get(code))) { - - DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(code); - - //selectCarForTask(); - createSrgvInOutQueue(); - srgvTask(deviceSrgv); - - } else { - log.error("小车设备为空"); - } - } - } catch (RuntimeException e) { - log.error(e.getMessage(), e); - } - - - } - - try { - Thread.sleep(1500); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - } - - - public void selectCarForTask() { - MydoJob mydoJob = mydoJobService.selectNoAllocatCar(); - /* - 选择执行任务的小车 - 优先级 目标层已有小车 > 1 层空闲小车 > 其他无任务层空闲小车 - */ - if (ObjUtil.isNotNull(mydoJob)) { - for (String srgvId : PlcSrgvRead.deviceSrgvMap.keySet()) { - DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(srgvId); - //如果小车空闲,选择小车 - if (deviceSrgv.getStatus() == 0) { - mydoJob.setCarId(srgvId); - mydoJob.setStatus("3"); - mydoJob.setStartTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); - /* - 根据选择的小车当前位置 确定mydojob的任务阶段 - */ - Integer floor = deviceSrgv.getCurrFloor(); - String currSite = deviceSrgv.getCurrSite(); - if (floor.equals(Convert.toInt(mydoJob.getRoadwayId()))) { - //小车所在楼层和任务开始楼层一致 3 5 - if (!currSite.equals(mydoJob.getCargoSpaceId())) { - mydoJob.setExecutionPhase("3"); - } else { - //判断目标楼层是不是1层 - if (!"1".equals(mydoJob.getTargetRoadwayId())) { - mydoJob.setExecutionPhase("5"); - } else { - mydoJob.setExecutionPhase("7"); - } - } - } else { - mydoJob.setExecutionPhase("1"); - } - mydoJobService.updateMydoJob(mydoJob); - } - } - } - - } - - /* 出库 - 1-2-3-5-6-7 车在其它层 && 取货目标在其它层 - 1-2-3-7 车在其它层 && 取货目标在1层 - 3-5-6-7 车在取货层 && 取货目标在其它层 - 3-7 车在取货层 && 层数为1 && 放货目标在1层 - */ - public void outQueue() { - } - - /* 入库 - 1-2-3-5-6-7 车在其它层 && 放货目标在其它层 - 1-2-3-7 车在其它层 && 放货目标在1层 - 3-5-6-7 车在1层 && 放货目标在其它层 - 3-7 车在1层 && 放货目标在1层 - 任务类型 方式 - 1 srgv 点对点 当前位置→本层电梯口 - 2 tsj 换层 取放 当前层→起点层 - 3 srgv 点对点 取货 当前位置->取货点 - 5 srgv 点对点 取货点->本层电梯口 - 6 tsj 换层 取放 取货层->放货层 - 7 srgv 点对点 放货 本层电梯口->放货点 - */ - public void createSrgvInOutQueue() { - MydoJob param = new MydoJob(); - param.setStatus("3"); - List mydoJobs = mydoJobService.selectMydoJobList(param); - if (CollUtil.isNotEmpty(mydoJobs)) { - for (MydoJob mydoJob : mydoJobs) { - if (StrUtil.isNotEmpty(mydoJob.getCarId())) { - //绑定任务小车 - DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(mydoJob.getCarId()); - //开始小车任务阶段 - if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE1.getCode())) { - /* - 当前位置→本层电梯口 srgv - 1. 调用 A * 算法规划层内最优路径(避开墙 0/4,走通道 2) - 2. 实时检测通道冲突(与其他小车路径不重叠) - 3. 移动到本层电梯口 - */ - String startSite = deviceSrgv.getCurrSite(); - Integer floor = deviceSrgv.getCurrFloor(); - String endSite = getTsjSiteIdByFloor(floor); - if (StrUtil.isEmpty(endSite)) { - log.info("生成tsj队列失败,未找到层数为{}电梯口", floor); - } else { - String rwlx = "4"; - int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); - if (srgvQueue > 0) { - log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); - } - } - } - if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE2.getCode())) { - /* - 本层电梯口→起点层电梯口 tsj - 1. 加入电梯排队队列(按任务优先级 + 到电梯口距离排序) - 2. 等待电梯空闲后占用电梯,跨层到 1 层 - 3. 电梯到达后,更新小车位置为(1,8,8) - */ - //生成tsj队列 - //根据位置判断列数 - String srcColumn = ""; - String tarColumn = ""; - Integer srcFloor = deviceSrgv.getCurrFloor(); - Integer tarFloor = Convert.toInt(mydoJob.getRoadwayId()); - String rwlx = ""; - int tsjQueue = createTsjQueue(Convert.toLong(mydoJob.getTaskNo()), srcFloor, srcColumn, tarFloor, tarColumn, mydoJob.getCarId(), rwlx); - if (tsjQueue > 0) { - log.info("生成tsj队列成功 rwh:{},srcC:{},srcF:{},tarC:{},tarF:{},rwlx:{}", mydoJob.getTaskNo(), srcColumn, srcFloor, tarColumn, tarFloor, rwlx); - } - } - if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE3.getCode())) { - /* - 起点层电梯口(小车当前位置)→起点层作业点 srgv - 1. 规划 1 层电梯口到作业点的路径(1 层通道拥堵高发,优先走预设单向通道) - 2. 检查作业点占用状态(同一时间仅 1 台小车作业) - 3. 移动到作业点并锁定作业点 - */ - //生成srgv队列 - String startSite = getTsjSiteIdByFloor(Convert.toInt(mydoJob.getRoadwayId())); - String endSite = mydoJob.getCargoSpaceId(); - String rwlx = "4"; - int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); - if (srgvQueue > 0) { - log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); - } - } - /*if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE4.getCode())) { - *//* - 作业点执行取/放货-> srgv - 1. 触发取货传感器,确认货物已装载 - 2. 更新任务状态为取货完成 - 3. 释放作业点(供其他小车使用) - *//* - String startSite = ""; - String endSite = ""; - String rwlx = "4"; - int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); - if (srgvQueue > 0) { - log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); - } - }*/ - if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE5.getCode())) { - /* - 作业点->起点层电梯口 srgv - 1. 规划作业点到电梯口的返程路径 - 2. 再次检测 1 层通道冲突(避免与新任务小车对向拥堵) - 3. 移动到 1 层电梯口 - */ - String startSite = ""; - String endSite = ""; - String rwlx = "4"; - int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); - if (srgvQueue > 0) { - log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); - } - } - if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE6.getCode())) { - /* - 起点层电梯口→目标层电梯口 tsj - 1. 加入电梯队列(按任务优先级排序,优先高优先级任务) - 2. 占用电梯跨层到目标层 - 3. 电梯到达后,更新小车位置为(目标层,8,8) - */ - //生成tsj队列 - String srcColumn = ""; - String tarColumn = ""; - Integer srcFloor = 0; - Integer tarFloor = 0; - String rwlx = ""; - int tsjQueue = createTsjQueue(Convert.toLong(mydoJob.getTaskNo()), srcFloor, srcColumn, tarFloor, tarColumn, mydoJob.getCarId(), rwlx); - if (tsjQueue > 0) { - log.info("生成tsj队列成功 rwh:{},srcC:{},srcF:{},tarC:{},tarF:{},rwlx:{}", mydoJob.getTaskNo(), srcColumn, srcFloor, tarColumn, tarFloor, rwlx); - } - } - if (mydoJob.getExecutionPhase().equals(STAGE7.getCode())) { - /* - 当前位置→目标货位 srgv - 1. 规划目标层电梯口到目标货位的路径 - 2. 检查目标货位状态(是否空闲,避免重复放货) - 3. 移动到目标货位,触发放货传感器 - */ - //生成srgv队列 - String startSite = deviceSrgv.getCurrSite(); - String endSite = mydoJob.getTargetCargoSpaceId(); - String rwlx = "4"; - int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); - if (srgvQueue > 0) { - log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); - } - } - if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE8.getCode())) { - /* - . 可选两种待命策略: - - 策略 1(优先高效):回到目标层电梯口(就近待命,减少下一次任务跨层成本) - - 策略 2(优先均衡):回到1 层作业点附近(适配高频 1 层出发任务) - 2. 更新小车状态为idle,清空当前任务 - */ - //生成srgv队列 - String startSite = ""; - String endSite = ""; - String rwlx = "4"; - int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx); - if (srgvQueue > 0) { - log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite); - } - } - if (mydoJob.getExecutionPhase().equals(FINISHED.getCode())) { - //完成任务 - mydoJob.setFinishTime(DateUtil.formatDateTime(new Date())); - mydoJob.setStatus("4"); - mydoJobService.updateMydoJob(mydoJob); - mydoJobService.insertHistory(mydoJob.getJobId()); - JobCallBack jobCallBack = new JobCallBack(); - jobCallBack.setMydojobId(mydoJob.getJobId()); - jobCallBack.setStatus("0"); - if (Convert.toInt(mydoJob.getInOrOut()) < 20) { - jobCallBack.setType("1"); - } else { - jobCallBack.setType("2"); - } - jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); - jobCallBack.setCreateTime(new Date()); - jobCallBackService.insertJobCallBack(jobCallBack); - } - } - } - - } - } - - /** - * 创建srgv队列 - * - * @param mydoJob 任务 - * @param startSite 源站 - * @param endSite 目的站 - * @param rwlx 任务类型 1-入库 2-出库 3-充电 4-点对点 - */ - private int createSrgvQueue(MydoJob mydoJob, String startSite, String endSite, String rwlx) { - WcsSrgvQueue queue = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(mydoJob.getTaskNo()); - if (queue != null) { - return 0; - } - //生成srgv队列 - WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); - wcsSrgvQueue.setGuid(IdUtil.simpleUUID()); - wcsSrgvQueue.setTaskType("1"); - wcsSrgvQueue.setTaskNo(mydoJob.getTaskNo()); - wcsSrgvQueue.setPriority(2L); - wcsSrgvQueue.setCargo("0"); - wcsSrgvQueue.setIssued("0"); - wcsSrgvQueue.setExecutionStatus("0"); - wcsSrgvQueue.setCargoPickSite(mydoJob.getCargoSpaceId()); - wcsSrgvQueue.setCargoPlaceSite(mydoJob.getTargetCargoSpaceId()); - wcsSrgvQueue.setStartSite(startSite); - wcsSrgvQueue.setEndSite(endSite); - wcsSrgvQueue.setCreateDate(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); - wcsSrgvQueue.setAgvId(mydoJob.getCarId()); - wcsSrgvQueue.setDefault02(rwlx); - return wcsSrgvQueueService.insertWcsSrgvQueue(wcsSrgvQueue); - } - //出库 1-2-3-4-5-6-7-4-9 - - - /** - * 创建提升机队列 - * - * @param taskNo 任务编号 - * @param srcColumn 源列 - * @param srcFloor 源层 - * @param tarColumn 目标列 - * @param tarFloor 目标层 - * @param carId 小车id - * @param rwlx 任务类型 - */ - private int createTsjQueue(Long taskNo, Integer srcFloor, String srcColumn, Integer tarFloor, String tarColumn, String carId, String rwlx) { - TsjDeviceExecutionQueue queue = tsjDeviceExecutionQueueService.selectTsjDeviceExecutionQueueByRwh(taskNo); - if (ObjUtil.isNull(queue)) { - TsjDeviceExecutionQueue tsjDeviceExecutionQueue = new TsjDeviceExecutionQueue(); - tsjDeviceExecutionQueue.setGuid(IdUtil.simpleUUID()); - tsjDeviceExecutionQueue.setDeviceId(1L); - tsjDeviceExecutionQueue.setDeviceName("提升机"); - tsjDeviceExecutionQueue.setTaskNo(taskNo); - tsjDeviceExecutionQueue.setSrcColumn(srcColumn); - tsjDeviceExecutionQueue.setSrcLayer(Convert.toStr(srcFloor)); - tsjDeviceExecutionQueue.setTarColumn(tarColumn); - tsjDeviceExecutionQueue.setTarLayer(Convert.toStr(tarFloor)); - tsjDeviceExecutionQueue.setSendType("1"); - tsjDeviceExecutionQueue.setCreateDate(DateUtil.formatDateTime(new Date())); - tsjDeviceExecutionQueue.setSpare1(carId); - tsjDeviceExecutionQueue.setTaskType("1"); - tsjDeviceExecutionQueue.setRwlx(rwlx); - return tsjDeviceExecutionQueueService.insertTsjDeviceExecutionQueue(tsjDeviceExecutionQueue); - } - return 0; - } - - - private String getTsjSiteIdByFloor(int floor) { - String siteId = null; - switch (floor) { - case 1: - siteId = "040801"; - break; - case 2: - siteId = "040802"; - break; - case 3: - siteId = "040803"; - break; - case 4: - siteId = "040804"; - break; - case 5: - siteId = "040805"; - break; - case 6: - siteId = "040806"; - break; - case 7: - siteId = "040807"; - break; - case 8: - siteId = "040808"; - break; - default: - return null; - } - return siteId; - } - - /** - * 小车任务处理 - */ - private void srgvTask(DeviceSrgv deviceSrgv) { - //队列下发成功处理 - resQueue(deviceSrgv); - - //小车完成队列 - completeCarTask(deviceSrgv); - - //小车发送任务 - sendTask(deviceSrgv); - } - - /** - * 队列下发成功处理 - */ - private void resQueue(DeviceSrgv deviceSrgv) { - int taskNo = deviceSrgv.getTaskNo(); - String currSite = deviceSrgv.getCurrSite(); - Integer deviceId = deviceSrgv.getDeviceId(); - - if (taskNo > 999 && !"000000".equals(currSite)) { - WcsSrgvQueue param = new WcsSrgvQueue(); - param.setTaskNo(Convert.toStr(taskNo)); - param.setIssued("0"); - param.setAgvId(String.valueOf(deviceId)); - List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(param); - - if (CollUtil.isNotEmpty(wcsSrgvQueues)) { - WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueues.get(0); - - - wcsSrgvQueue.setIssued("1"); - wcsSrgvQueue.setStartDate(DateUtil.now()); - wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); - - } - } - - } - - - /** - * 小车完成队列 - */ - private void completeCarTask(DeviceSrgv deviceSrgv) { - //联机自动 - if (deviceSrgv.getWorkMode() == 4) { - WcsSrgvQueue param = new WcsSrgvQueue(); - param.setAgvId(Convert.toStr(deviceSrgv.getDeviceId())); - param.setEndSite(deviceSrgv.getCurrSite());//目标点 - param.setIssued("1"); - param.setTaskNo(deviceSrgv.getTaskNo().toString()); - List wcsSagvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(param);//查询到达目标的 - if (CollUtil.isNotEmpty(wcsSagvQueues)) { - WcsSrgvQueue wcsSrgvQueue = wcsSagvQueues.get(0); - MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(wcsSrgvQueue.getTaskNo())); - if (mydoJob != null) { - Integer floor = deviceSrgv.getCurrFloor(); - Integer startFloor = Convert.toInt(mydoJob.getRoadwayId()); - Integer endFloor = Convert.toInt(mydoJob.getTargetRoadwayId()); - if (Convert.toInt(mydoJob.getInOrOut()) < 20) { - //入库 - if ("1".equals(mydoJob.getExecutionPhase())) { - mydoJob.setExecutionPhase("2"); - mydoJobService.updateMydoJob(mydoJob); - } else if ("3".equals(mydoJob.getExecutionPhase())) { - if (floor.equals(endFloor)) { - mydoJob.setExecutionPhase("7"); - mydoJobService.updateMydoJob(mydoJob); - } else { - mydoJob.setExecutionPhase("5"); - mydoJobService.updateMydoJob(mydoJob); - } - } else if ("5".equals(mydoJob.getExecutionPhase())) { - mydoJob.setExecutionPhase("6"); - mydoJobService.updateMydoJob(mydoJob); - } else if ("7".equals(mydoJob.getExecutionPhase())) { - mydoJob.setExecutionPhase("8"); - mydoJobService.updateMydoJob(mydoJob); - } - - } else { - //出库 - if ("1".equals(mydoJob.getExecutionPhase())) { - mydoJob.setExecutionPhase("2"); - mydoJobService.updateMydoJob(mydoJob); - } else if ("3".equals(mydoJob.getExecutionPhase())) { - if (floor.equals(1)) { - mydoJob.setExecutionPhase("7"); - mydoJobService.updateMydoJob(mydoJob); - } else { - mydoJob.setExecutionPhase("5"); - mydoJobService.updateMydoJob(mydoJob); - } - } else if ("5".equals(mydoJob.getExecutionPhase())) { - mydoJob.setExecutionPhase("6"); - mydoJobService.updateMydoJob(mydoJob); - } else if ("7".equals(mydoJob.getExecutionPhase())) { - mydoJob.setExecutionPhase("8"); - mydoJobService.updateMydoJob(mydoJob); - } - } - wcsSrgvQueue.setExecutionStatus("4"); - wcsSrgvQueue.setUpdateTime(DateUtil.date()); - wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); - wcsSrgvQueueService.insertHistory(wcsSrgvQueue.getTaskNo()); - wcsSrgvQueueService.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); - - } - } - } - } - - - /** - * 小车发送任务 - */ - private void sendTask(DeviceSrgv deviceSrgv) { - WcsSrgvQueue param = new WcsSrgvQueue(); - param.setIssued("0"); - param.setAgvId(deviceSrgv.getDeviceId().toString()); - List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(param); - if (CollUtil.isEmpty(wcsSrgvQueues)) { - return; - } - for (WcsSrgvQueue wcsSrgvQueue : wcsSrgvQueues) { - String agvId = wcsSrgvQueue.getAgvId(); - if (agvId.equals(Convert.toStr(deviceSrgv.getDeviceId())) && deviceSrgv.getWorkMode() == 4 && deviceSrgv.getAllowSend() == 1) { - String endSite = wcsSrgvQueue.getEndSite(); - String currSite = deviceSrgv.getCurrSite(); - //判断是否可以下发任务 - if ("0".equals(wcsSrgvQueue.getIssued())) { - sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); - } - } - } - - } - - /** - * 小车发送点对点任务 - */ - private void sendPointToPointTask(DeviceSrgv deviceSrgv, WcsSrgvQueue wcsSrgvQueue, String startSite, String endSite) { - Integer floor = deviceSrgv.getCurrFloor(); - //获取当前地图 - Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); - - //处理地图 - int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv); - - //计算最短路径 - List shortestPath = PathFinder.findShortestPath(emptyMap, arrByRoadSite.get(startSite).getX(), arrByRoadSite.get(startSite).getY(), arrByRoadSite.get(endSite).getX(), arrByRoadSite.get(endSite).getY()); - - //判断是否能规划出最短路径 - if (shortestPath == null || shortestPath.isEmpty()) { - log.error("无法到达指定位置"); - return; - } - - //获取拐点路径 - List trun = PathFinder.extractInflectionPoints2(shortestPath); - - // 路径点拼接 - StringBuilder pathBuilder = new StringBuilder(); - if (!shortestPath.isEmpty()) { - for (int[] ints : shortestPath) { - WcsSrgvMap roadSiteByArr = roadCacheService.selectRoadSiteByArr(ints[0], ints[1], floor); - if (roadSiteByArr == null) { - log.error("无此站点 x y z :{},{},{}", ints[0], ints[1], floor); - throw new RuntimeException("点位信息错误"); - } - String site = roadSiteByArr.getSiteId(); - pathBuilder.append(site).append(","); - } - } - // 拐点拼接 - StringBuilder turnBuilder = new StringBuilder(); - if (!trun.isEmpty()) { - for (int[] ints : trun) { - WcsSrgvMap roadSiteByArr = roadCacheService.selectRoadSiteByArr(ints[0], ints[1], floor); - if (roadSiteByArr == null) { - log.error("无此站点 x y z :{},{},{}", ints[0], ints[1], floor); - throw new RuntimeException("点位信息错误"); - } - String site = roadSiteByArr.getSiteId(); - turnBuilder.append(site).append(","); - } - if (turnBuilder.length() > 0) { - turnBuilder.setLength(turnBuilder.length() - 1); - } - // 当trun长度小于6时,后面用0拼接 - if (trun.size() < 6) { - for (int i = trun.size(); i < 6; i++) { - turnBuilder.append(",0"); - } - } - } - - List sendDataList = new ArrayList<>(); - if (!trun.isEmpty()) { - SendData2 path = new SendData2(); - path.setAddress("4000");//地址 - path.setData(startSite + "," + endSite + "," + turnBuilder); - path.setType(2); - sendDataList.add(path); - } else { - SendData2 path = new SendData2(); - path.setAddress("4000");//地址 - path.setData(startSite + "," + endSite); - path.setType(2); - sendDataList.add(path); - } - - - //任务号、原、目标数据转换 - String siteId = wcsSrgvQueue.getTaskNo() + "1";//+ "," + startSite + "," + endSite; - SendData2 site = new SendData2(); - site.setAddress("4400"); - site.setData(siteId); - site.setType(2); - sendDataList.add(site); - - //任务类型转换 - SendData2 taskType = new SendData2(); - taskType.setAddress("2200"); - taskType.setData(wcsSrgvQueue.getTaskType()); - taskType.setType(1); - sendDataList.add(taskType); - - //下发标志转换 - SendData2 flag = new SendData2(); - flag.setAddress("2202"); - flag.setData("1"); - flag.setType(1); - sendDataList.add(flag); - - //下发数据 - boolean b = sendCarTask(sendDataList, deviceSrgv); - if (b) { - wcsSrgvQueue.setPathInfo(pathBuilder.toString()); - wcsSrgvQueue.setTrunPath(turnBuilder.toString()); - wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); - } else { - log.error("小车下发失败 taskNo:{}", wcsSrgvQueue.getTaskNo()); - } - } - - /** - * 小车发送任务 - */ - private boolean sendCarTask(List sendDataList, DeviceSrgv deviceSrgv) { - - boolean b = true; - - for (SendData2 sendData : sendDataList) { - String address = sendData.getAddress(); - String data = sendData.getData();// - - String[] split = data.split(","); - - int type = sendData.getType();//1单字 2双字 3字符串 - - //双字 - if (type == 2) { - int[] intData = Arrays.stream(split).map(String::trim).mapToInt(Integer::parseInt).toArray(); - boolean write = true;//PlcSrgvRead.Write(address, intData); - - if (!write) { - b = false; - break; - } - } - - - //单字 - if (type == 1) { - //String[]转为 short[] - short[] shortData = new short[split.length]; - for (int i = 0; i < split.length; i++) { - try { - shortData[i] = Short.parseShort(split[i].trim()); - } catch (NumberFormatException e) { - // 记录日志并设置默认值 - shortData[i] = 0; - } - } - - boolean write = true;//PlcSrgvRead.Write(address, shortData); - - if (!write) { - b = false; - break; - } - - } - } - - String collect = sendDataList.stream().map(li -> "{" + li.getAddress() + ":" + li.getData() + "}").collect(Collectors.joining(",")); - - log.info("小车:" + deviceSrgv.getDeviceId() + ",下发值:" + collect + ",,结果:" + b); - - return b; - } - - -} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java index 883e2d1..7124f95 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java @@ -124,44 +124,58 @@ public class SsjThread implements Runnable { } void inDispatch1(DeviceSsj deviceSsj) { - if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) { - //todo 查是否为入库模式,不是退回,是否超重 - HashMap map = new HashMap<>(); - map.put("trayCode", deviceSsj.getTrayCode()); - //拉取 - AjaxResult ajaxResult = apiService.createInMydoJob(map); - if (ajaxResult.isSuccess()) { - //拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号 - MydoJob mydoJob = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class); - mydoJob.setStatus("1"); - mydoJob.setExecutionPhase("1"); - mydoJob.setCreateTime(new Date()); - mydoJob.setTheFloor(mydoJob.getClassId()); - if ("GS1002".equals(deviceSsj.getDeviceCode())) { - mydoJob.setEntranceId("L1004"); + if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim()) ) { + String trayCode = deviceSsj.getTrayCode().trim(); + MydoJob getMydoJob = mydoJobService.selectMydoJobByTrayCode(trayCode); + if (getMydoJob!=null && deviceSsj.getTaskNo()<1000){ + int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), getMydoJob.getTaskNo(), 1, 1); + if (i == 1) { + getMydoJob.setStatus("3"); + mydoJobService.updateMydoJob(getMydoJob); + log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", getMydoJob.getTaskNo()); + } + }else { + //todo 查是否为入库模式,不是退回,是否超重 + HashMap map = new HashMap<>(); + map.put("trayCode", deviceSsj.getTrayCode()); + //拉取 + AjaxResult ajaxResult = apiService.createInMydoJob(map); + if (ajaxResult.isSuccess()) { + //拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号 + MydoJob mydoJob = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class); + mydoJob.setStatus("1"); + mydoJob.setExecutionPhase("1"); + mydoJob.setCreateTime(new Date()); + mydoJob.setTheFloor(mydoJob.getClassId()); + mydoJob.setTrayCode(trayCode); + if ("GS1002".equals(deviceSsj.getDeviceCode())) { + mydoJob.setEntranceId("L1004"); + } else { + mydoJob.setEntranceId("L1005"); + } + // 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段 + MydoJob mydoJob1 = new MydoJob(); + mydoJob1.setTaskNo(mydoJob.getTaskNo()); + mydoJob1.setTrayCode(mydoJob.getTrayCode()); + List mydoJobs = mydoJobService.selectMydoJobList(mydoJob1); + if (mydoJobs.size() > 0) { + return; + } + mydoJobService.insertMydoJob(mydoJob); + int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1); + if (i == 1) { + mydoJob.setStatus("3"); + mydoJobService.updateMydoJob(mydoJob); + log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo()); + } } else { - mydoJob.setEntranceId("L1005"); - } - // 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段 - MydoJob mydoJob1 = new MydoJob(); - mydoJob1.setTaskNo(mydoJob.getTaskNo()); - List mydoJobs = mydoJobService.selectMydoJobList(mydoJob1); - if (mydoJobs.size() > 0) { - return; - } - mydoJobService.insertMydoJob(mydoJob); - int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1); - if (i == 1) { - mydoJob.setStatus("3"); - mydoJobService.updateMydoJob(mydoJob); - log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo()); - } - } else { - int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2); - if (i == 1) { - log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2 条码"+deviceSsj.getTrayCode()); + int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2); + if (i == 1) { + log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2 条码" + deviceSsj.getTrayCode()); + } } } + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java index 0a5f680..13131d4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java @@ -117,7 +117,7 @@ public class TsjThread implements Runnable { private void createSRgvQueueTsjQd(Long rwh, DeviceTsj tsj) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); - if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) ||deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor()))&& deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 2 && tsj.getHczt() == 1) { + if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) || deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor())) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 2 && tsj.getHczt() == 1) { SendData rwlxSendData = new SendData(Tools.INT, 1); DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(Convert.toStr(1)); byte[] bytes = Tools.sendData(rwlxSendData); @@ -208,7 +208,8 @@ public class TsjThread implements Runnable { private void createQueue(DeviceTsj tsj) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); - if (deviceSrgv.getSpare2().equals("1") && deviceSrgv.getTaskNo() > 0) { + Integer count = tsjDeviceExecutionQueueService.selectCount(); + if (deviceSrgv.getSpare2().equals("1") && deviceSrgv.getTaskNo() > 0 && count == 0) { //请求进入输送机 WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue(); sRgvQueueParam.setAgvId(Convert.toStr(deviceSrgv.getDeviceId())); diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index 79ad5bb..5da72f3 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -6,9 +6,9 @@ spring: druid: #主数据信息 master: - url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT546-WCS; + url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT546-wcs; username: sa - password: 123456 + password: Flrd0914. # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 4720c99..4489d1f 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -34,7 +34,7 @@ server: # 日志配置 logging: level: - com.ruoyi: debug + com.ruoyi: info org.springframework: warn # 用户配置 @@ -64,7 +64,7 @@ spring: devtools: restart: # 热部署开关 - enabled: true + enabled: false # redis 配置 redis: # 地址 diff --git a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml index 38c05cd..146e282 100644 --- a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml @@ -25,13 +25,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name from mydo_job_wcs + select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name,tray_code from mydo_job_wcs - select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor from mydo_job_wcs_finish + select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name,tray_code from mydo_job_wcs_finish @@ -118,6 +120,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" warehouse_id, fault_flag, the_floor, + tray_code, #{jobId}, @@ -138,6 +141,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{warehouseId}, #{faultFlag}, #{theFloor}, + #{trayCode}, @@ -244,4 +248,67 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and status = 3 order by priority desc,create_time + + + + + + + + diff --git a/ruoyi-admin/src/main/resources/mapper/queue/TsjDeviceExecutionQueueMapper.xml b/ruoyi-admin/src/main/resources/mapper/queue/TsjDeviceExecutionQueueMapper.xml index a25cb48..96ef552 100644 --- a/ruoyi-admin/src/main/resources/mapper/queue/TsjDeviceExecutionQueueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/queue/TsjDeviceExecutionQueueMapper.xml @@ -121,6 +121,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + update tsj_device_execution_queue diff --git a/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml b/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml index 9181a4c..f611652 100644 --- a/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml @@ -212,4 +212,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + From 9b008f5fe7f4d178b026a647577268a1e62d1674 Mon Sep 17 00:00:00 2001 From: liuhanqing Date: Wed, 11 Mar 2026 09:02:58 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E7=8E=B0=E5=9C=BA=E8=B0=83=E5=BA=A6?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/api/service/IApiService.java | 4 + .../api/service/impl/ApiServiceImpl.java | 14 + .../bas/srgvmap/mapper/WcsSrgvMapMapper.java | 6 + .../srgvmap/service/IWcsSrgvMapService.java | 3 + .../bas/srgvmap/service/RoadCacheService.java | 5 +- .../service/impl/RoadCacheServiceImpl.java | 24 +- .../service/impl/WcsSrgvMapServiceImpl.java | 42 +- .../main/java/com/ruoyi/common/Constant.java | 1 + .../device/cdz/mapper/DeviceCdzMapper.java | 2 + .../device/cdz/service/IDeviceCdzService.java | 2 + .../service/impl/DeviceCdzServiceImpl.java | 5 + .../queue/srgv/mapper/WcsSrgvQueueMapper.java | 2 + .../srgv/service/IWcsSrgvQueueService.java | 2 + .../service/impl/WcsSrgvQueueServiceImpl.java | 5 + .../com/ruoyi/schedule/ScheduleThread.java | 2 +- .../schedule/plcRead/cdz/PlcCdzRead.java | 4 +- .../schedule/plcRead/srgv/PlcSrgvRead.java | 2 + .../plcRead/srgv/roadUtil/PathFinder.java | 1 + .../schedule/scheduleTask/cdz/CdzThread.java | 147 +++---- .../scheduleTask/monit/MonitoringThread.java | 1 + .../scheduleTask/srgv/BaseSRgvThread.java | 366 ++++++++++++------ .../schedule/scheduleTask/ssj/SsjThread.java | 31 +- .../schedule/scheduleTask/tsj/TsjThread.java | 68 +++- .../java/com/ruoyi/tcp/GetDeviceSrgvMap.java | 6 + .../java/com/ruoyi/tcp/GetDeviceSsjMap.java | 21 +- .../java/com/ruoyi/tcp/GetDeviceTsjMap.java | 2 +- .../resources/mapper/bas/WcsSrgvMapMapper.xml | 25 ++ .../mapper/device/DeviceCdzMapper.xml | 5 + .../resources/mapper/job/MydoJobMapper.xml | 2 +- .../mapper/queue/WcsSrgvQueueMapper.xml | 3 + 30 files changed, 533 insertions(+), 270 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java index 6f13e91..bf04c65 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java @@ -121,6 +121,10 @@ public interface IApiService */ public AjaxResult createInMydoJob(Map param); + public AjaxResult sendCargoSpace(Map param); + + + public AjaxResult selectMydoJobByNoTrayCode(Map param); AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java index 05d5bfe..2278dc5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java @@ -347,6 +347,20 @@ public class ApiServiceImpl implements IApiService { } + @Override + public AjaxResult sendCargoSpace(Map param) { + // 访问请求路径,生成入库作业 ,如果生成返回信息 + RequestLog requestLog = requestLogService.getRequestLog(SEND_CARGOSPACE, "请求分配货位", JSONUtil.toJsonStr(param)); + if ("1".equals(requestLog.getIsSuccessful())) { + InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class); + return AjaxResult.success(bean.getData()); + } else { + return AjaxResult.error(); + } + } + + + @Override public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) { MydoJob mydoJob = new MydoJob(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/mapper/WcsSrgvMapMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/mapper/WcsSrgvMapMapper.java index 610806e..335812d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/mapper/WcsSrgvMapMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/mapper/WcsSrgvMapMapper.java @@ -1,7 +1,9 @@ package com.ruoyi.bas.srgvmap.mapper; +import java.util.ArrayList; import java.util.List; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; +import org.apache.ibatis.annotations.Param; /** * 小车点位地图表Mapper接口 @@ -62,4 +64,8 @@ public interface WcsSrgvMapMapper * @return 结果 */ public int deleteWcsSrgvMapByGuids(String[] guids); + + List selectNotInsite( @Param("cache") String cache, + @Param("floor") Integer floor, + @Param("sites") ArrayList sites); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/IWcsSrgvMapService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/IWcsSrgvMapService.java index 7a2ce6b..4081f5e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/IWcsSrgvMapService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/IWcsSrgvMapService.java @@ -1,5 +1,6 @@ package com.ruoyi.bas.srgvmap.service; +import java.util.ArrayList; import java.util.List; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; @@ -62,4 +63,6 @@ public interface IWcsSrgvMapService * @return 结果 */ public int deleteWcsSrgvMapByGuid(String guid); + + List selectNotInsite(String cache, Integer floor, ArrayList sites); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/RoadCacheService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/RoadCacheService.java index 419543a..1024f89 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/RoadCacheService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/RoadCacheService.java @@ -4,7 +4,6 @@ package com.ruoyi.bas.srgvmap.service; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; import com.ruoyi.device.srgv.domain.DeviceSrgv; -import java.util.List; import java.util.Map; public interface RoadCacheService { @@ -18,11 +17,13 @@ public interface RoadCacheService { /** * 处理地图 + * * @param arrByRoadSite * @param deviceSrgv + * @param floor * @return */ - int[][] handleMap(Map arrByRoadSite, DeviceSrgv deviceSrgv); + int[][] handleMap(Map arrByRoadSite, DeviceSrgv deviceSrgv, Integer floor); /** * 根据x y z 获取指定位置的缓存 * @param x diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java index 39983a6..9d44b47 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java @@ -41,29 +41,27 @@ public class RoadCacheServiceImpl implements RoadCacheService { for (WcsSrgvMap wcsSrgvMap : wcsSrgvMaps) { maps.put(wcsSrgvMap.getSiteId(), wcsSrgvMap); } - param.setAxy("11,9"); - List tsjMap = wcsSrgvMapMapper.selectWcsSrgvMapList(param); - for (WcsSrgvMap wcsSrgvMap : tsjMap) { - maps.put("tsj",wcsSrgvMap); - } + return maps; } @Override - public int[][] handleMap(Map maps, DeviceSrgv deviceSrgv) { + public int[][] handleMap(Map maps, DeviceSrgv deviceSrgv, Integer floor) { //1.锁定其他车任务路径 lockedOtherCarQueuePath(maps, deviceSrgv); //2.锁定无任务小车当前位置 - lockedOtherCarCurrSite(maps, deviceSrgv); +// lockedOtherCarCurrSite(maps, deviceSrgv); //3.锁定离线小车当前位置 lockedOfflineCarCurrSite(maps, deviceSrgv); - + maps.put("tsj", maps.get("07050" + floor)); + //4.锁定满货位的位置 TODO 是否存在移库影响效率 int[][] mapsInt = new int[50][50]; for (String site : maps.keySet()) { WcsSrgvMap wcsSrgvMap = maps.get(site); mapsInt[wcsSrgvMap.getX()][wcsSrgvMap.getY()] = wcsSrgvMap.getValue(); - if (wcsSrgvMap.getAxy().equals("11,8")){ + + if (wcsSrgvMap.getAxy().equals("11,9")) { System.err.println(wcsSrgvMap.getValue()); } } @@ -77,7 +75,7 @@ public class RoadCacheServiceImpl implements RoadCacheService { param.setY(y); param.setZ(z); List wcsSrgvMaps = wcsSrgvMapMapper.selectWcsSrgvMapList(param); - if (CollUtil.isNotEmpty(wcsSrgvMaps)){ + if (CollUtil.isNotEmpty(wcsSrgvMaps)) { return wcsSrgvMaps.get(0); } return null; @@ -142,14 +140,14 @@ public class RoadCacheServiceImpl implements RoadCacheService { //添加其他小车路径列表 HashSet otherCarSiteList = new HashSet<>(); for (WcsSrgvQueue wcsSrgvQueue : otherCarQueue) { - if (wcsSrgvQueue.getPathInfo()!=null) { + if (wcsSrgvQueue.getPathInfo() != null) { //根据小车当前点位去除已走路径 DeviceSrgv otherCarCurrStatus = deviceSrgvService.selectDeviceSrgvByGuid(wcsSrgvQueue.getAgvId()); String currSite = otherCarCurrStatus.getCurrSite(); List allSiteList = Arrays.asList(wcsSrgvQueue.getPathInfo().split(",")); int i = allSiteList.indexOf(currSite); - if (i==-1){ - i=0; + if (i == -1) { + i = 0; } List resultSiteList = allSiteList.subList(i, allSiteList.size()); otherCarSiteList.addAll(resultSiteList); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/WcsSrgvMapServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/WcsSrgvMapServiceImpl.java index 61da9cf..f186f22 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/WcsSrgvMapServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/WcsSrgvMapServiceImpl.java @@ -1,6 +1,8 @@ package com.ruoyi.bas.srgvmap.service.impl; +import java.util.ArrayList; import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.bas.srgvmap.mapper.WcsSrgvMapMapper; @@ -9,25 +11,23 @@ import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService; /** * 小车点位地图表Service业务层处理 - * + * * @author ruoyi * @date 2025-11-21 */ @Service -public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService -{ +public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService { @Autowired private WcsSrgvMapMapper wcsSrgvMapMapper; /** * 查询小车点位地图表 - * + * * @param guid 小车点位地图表主键 * @return 小车点位地图表 */ @Override - public WcsSrgvMap selectWcsSrgvMapByGuid(String guid) - { + public WcsSrgvMap selectWcsSrgvMapByGuid(String guid) { return wcsSrgvMapMapper.selectWcsSrgvMapByGuid(guid); } @@ -38,61 +38,61 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService /** * 查询小车点位地图表列表 - * + * * @param wcsSrgvMap 小车点位地图表 * @return 小车点位地图表 */ @Override - public List selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap) - { + public List selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap) { return wcsSrgvMapMapper.selectWcsSrgvMapList(wcsSrgvMap); } /** * 新增小车点位地图表 - * + * * @param wcsSrgvMap 小车点位地图表 * @return 结果 */ @Override - public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap) - { + public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap) { return wcsSrgvMapMapper.insertWcsSrgvMap(wcsSrgvMap); } /** * 修改小车点位地图表 - * + * * @param wcsSrgvMap 小车点位地图表 * @return 结果 */ @Override - public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap) - { + public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap) { return wcsSrgvMapMapper.updateWcsSrgvMap(wcsSrgvMap); } /** * 批量删除小车点位地图表 - * + * * @param guids 需要删除的小车点位地图表主键 * @return 结果 */ @Override - public int deleteWcsSrgvMapByGuids(String[] guids) - { + public int deleteWcsSrgvMapByGuids(String[] guids) { return wcsSrgvMapMapper.deleteWcsSrgvMapByGuids(guids); } /** * 删除小车点位地图表信息 - * + * * @param guid 小车点位地图表主键 * @return 结果 */ @Override - public int deleteWcsSrgvMapByGuid(String guid) - { + public int deleteWcsSrgvMapByGuid(String guid) { return wcsSrgvMapMapper.deleteWcsSrgvMapByGuid(guid); } + + @Override + public List selectNotInsite(String cache, Integer floor, ArrayList sites) { + return wcsSrgvMapMapper.selectNotInsite(cache, floor, sites); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java b/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java index cb74f18..c608642 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java @@ -12,6 +12,7 @@ public class Constant { public static final String CANCEL_TASK_URL = RCS_BASE_URL+"queryAgvStatus";; public static final String GEN_AGV_SCHEDULING_TASK = RCS_BASE_URL+"genAgvSchedulingTask";; public static final String CREATE_IN_MYDO_JOB_URL = WMS_BASE_URL+"requestEnterByTrayCode"; + public static final String SEND_CARGOSPACE = WMS_BASE_URL+"sendCargoSpace"; public static final String REQUEST_MYDO_JOB_URL = WMS_BASE_URL+"requestByNoTrayCode"; public static final String RE_ASSIGN_URL = WMS_BASE_URL+"reAssign"; public static final String RE_MATERIAL_URL = WMS_BASE_URL+"reMaterial"; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/mapper/DeviceCdzMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/mapper/DeviceCdzMapper.java index 9907314..bfa9d3d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/mapper/DeviceCdzMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/mapper/DeviceCdzMapper.java @@ -68,4 +68,6 @@ public interface DeviceCdzMapper * @return */ List selectDeviceCdzHasSRgvList(); + + void updateDeviceCdzSpare(DeviceCdz deviceCdz); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/IDeviceCdzService.java b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/IDeviceCdzService.java index d4096ae..89f8ef6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/IDeviceCdzService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/IDeviceCdzService.java @@ -68,4 +68,6 @@ public interface IDeviceCdzService * @return */ List selectDeviceCdzHasSRgvList(); + + void updateDeviceCdzSpare(DeviceCdz deviceCdz); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/impl/DeviceCdzServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/impl/DeviceCdzServiceImpl.java index bef24c0..6b24739 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/impl/DeviceCdzServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/impl/DeviceCdzServiceImpl.java @@ -100,4 +100,9 @@ public class DeviceCdzServiceImpl implements IDeviceCdzService public List selectDeviceCdzHasSRgvList() { return deviceCdzMapper.selectDeviceCdzHasSRgvList(); } + + @Override + public void updateDeviceCdzSpare(DeviceCdz deviceCdz) { + deviceCdzMapper.updateDeviceCdzSpare(deviceCdz); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java index 6ed150c..219b0e7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java @@ -75,4 +75,6 @@ public interface WcsSrgvQueueMapper String selectMinCountJob(@Param("list") List outModelSSJ); Integer selectTsj(); + + Integer selectByCaogoPlaceSite(String siteId); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java index 7c4c424..08c2168 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java @@ -81,4 +81,6 @@ public interface IWcsSrgvQueueService String selectMinCountJob(List outModelSSJ); Integer selectTsj(); + + Integer selectByCaogoPlaceSite(String siteId); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java index 0e56937..7769dd6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java @@ -126,6 +126,11 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService return wcsSrgvQueueMapper.selectTsj(); } + @Override + public Integer selectByCaogoPlaceSite(String siteId) { + return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId); + } + @Override public WcsSrgvQueue insertHistory(String taskNo) { WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java index 4b69343..b01e2fb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/ScheduleThread.java @@ -177,7 +177,7 @@ public class ScheduleThread { */ public void startAllThread() { plcSsjReadCustomThread.getThread().start(); - //plcSrgvReadCustomThread1.getThread().start(); + plcSrgvReadCustomThread1.getThread().start(); plcSrgvReadCustomThread2.getThread().start(); plcSrgvReadCustomThread3.getThread().start(); plcTsjReadCustomThread.getThread().start(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/cdz/PlcCdzRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/cdz/PlcCdzRead.java index 0f9eece..1cb1ca9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/cdz/PlcCdzRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/cdz/PlcCdzRead.java @@ -67,12 +67,12 @@ public class PlcCdzRead implements Runnable { } private void plcRead(DeviceCdz deviceCdz) { - OperateResultExOne read2 = readWriteNet.Read(deviceCdz.getPlcDbReadAddress(), Short.parseShort("4")); + OperateResultExOne read2 = readWriteNet.Read(deviceCdz.getPlcDbReadAddress(), Short.parseShort("2")); String ddsx1 = "0"; if (read2.IsSuccess) { ddsx1 = SoftBasic.ByteToHexString(read2.Content); deviceCdz.setStatus(ParseUtil.optInt(0, ddsx1)); - deviceCdz.setModel(ParseUtil.optInt(2, ddsx1)); +// deviceCdz.setModel(ParseUtil.optInt(2, ddsx1)); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java index 4d14932..3a666a3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java @@ -110,6 +110,8 @@ public class PlcSrgvRead implements Runnable { agvData.setAlarm(Convert.toInt(byteTransform.TransInt16(content, 6))); // agvData.setStatus(0); agvData.setStatus(Convert.toInt(byteTransform.TransInt16(content, 8))); + //载货标志 + agvData.setCargoFlag(Convert.toInt(byteTransform.TransInt16(content, 13))); //接收完成标志 // agvData.setFinish(Convert.toInt(byteTransform.TransInt16(content, 10))); // agvData.setFinish(0); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java index a3b267b..d98ad6c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java @@ -198,6 +198,7 @@ public class PathFinder { if (gCost[endX][endY] == Integer.MAX_VALUE) { List path = new ArrayList<>(); path.add(new int[]{-1, -1}); + return path; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java index 8f374ff..9aafc13 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java @@ -34,8 +34,8 @@ public class CdzThread implements Runnable { public boolean isRun = true; - private final Integer LITTLE_BETTERY = 30; - private final Integer MIDDLE_BETTERY = 60; + private final Integer LITTLE_BETTERY = 40; + private final Integer MIDDLE_BETTERY = 70; private final Integer MAX_BETTERY = 90; private ISrgvChargingJobService chargingJobService; private IDeviceCdzService deviceCdzService; @@ -68,7 +68,7 @@ public class CdzThread implements Runnable { void dispatch() { - + Integer count = mydoJobService.selectMydoJobCount(); //获取低电量小车 List littleBatterySRgv = new ArrayList<>(); //获取中电量小车 @@ -78,7 +78,7 @@ public class CdzThread implements Runnable { if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3 && deviceSrgv.getChargeFlag() != 2) { if (deviceSrgv.getBattery() <= LITTLE_BETTERY) { littleBatterySRgv.add(deviceSrgv); - } else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY) { + } else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY && count == 0) { middleBatterySRgv.add(deviceSrgv); } } @@ -96,22 +96,20 @@ public class CdzThread implements Runnable { } //超过30分钟自动生成充电任务 - List deviceSrgvs = deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv()); - List timeOutSrgvList = deviceSrgvs.stream().filter(x -> DateUtil.between(DateUtil.parse(x.getLastTime()), DateUtil.date(), DateUnit.MINUTE) > 30).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(timeOutSrgvList)) { - //生成充电任务 - createChargingInJob(timeOutSrgvList); - } +// List deviceSrgvs = deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv()); +// List timeOutSrgvList = deviceSrgvs.stream().filter(x -> DateUtil.between(DateUtil.parse(x.getLastTime()), DateUtil.date(), DateUnit.MINUTE) > 30).collect(Collectors.toList()); +// if (CollUtil.isNotEmpty(timeOutSrgvList)) { +// //生成充电任务 +// createChargingInJob(timeOutSrgvList); +// } - //充电任务下发 + //充电任务下发 查到充电任务并且充电桩未开启直接开启 SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); srgvChargingJobParam.setChargingStatus("0"); srgvChargingJobParam.setJobType("1"); - srgvChargingJobParam.setJobStatus("3"); List srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); if (CollUtil.isNotEmpty(srgvChargingJobs)) { - for (SrgvChargingJob srgvChargingJob : srgvChargingJobs) { if ("0".equals(srgvChargingJob.getChargingStatus())) { String chargingSite = srgvChargingJob.getChargingSite(); @@ -122,67 +120,39 @@ public class CdzThread implements Runnable { SendData qxSendData = new SendData(Tools.INT, 1); byte[] bytes = Tools.sendData(qxSendData); int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes); + // 查到充电任务,并且充电桩未开启就直接开启 if (i == 1) { + log.info("下发{" + deviceCdzs.get(0).getId() + "}号充电桩开启"); srgvChargingJob.setChargingStatus("2"); srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date())); chargingJobService.updateSrgvChargingJob(srgvChargingJob); } + + } } } - //生成断电任务 有任务且电量大于50 todo 代码无效 - Integer count = mydoJobService.selectMydoJobCount(); + //生成断电任务 有任务且电量大于50 + List deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList(); for (DeviceCdz deviceCdz : deviceCdzdd) { - if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1()) - && ((PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getBattery() >= MIDDLE_BETTERY && count > 0) || PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getBattery() >= MAX_BETTERY) - && PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getWorkMode() == 5 - && PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getChargeFlag() == 2 && deviceCdz.getStatus() == 1) { + DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()); + if (((deviceSrgv.getBattery() >= MIDDLE_BETTERY && count > 0) || deviceSrgv.getBattery() >= MAX_BETTERY) + && deviceSrgv.getWorkMode() == 5 + && deviceSrgv.getChargeFlag() == 2 && deviceCdz.getStatus() == 1) { createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz); } } -// //生成断电任务 有任务且电量大于50 todo 代码无效 -// WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); -// wcsSrgvQueueParam.setIssued("0"); -// List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam); -// if (CollUtil.isNotEmpty(wcsSrgvQueues)) { -// boolean existsKxSRgv = false; -// //判断有没有空闲小车 -// for (DeviceSrgv x : PlcSrgvRead.deviceSrgvMap.values()) { -// if (x.getWorkMode() == 5 && x.getStatus() == 1) { -// existsKxSRgv = true; -// break; -// } -// } -// if (!existsKxSRgv) { -// List deviceCdzs = deviceCdzService.selectDeviceCdzHasSRgvList(); -// if (CollUtil.isNotEmpty(deviceCdzs)) { -// for (DeviceCdz deviceCdz : deviceCdzs) { -// if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1())) { -// DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()); -// if (deviceSrgv.getBattery() >= 50) { -// //生成断电任务 -// createChargingOutJob(deviceSrgv, deviceCdz); -// break; -// } -// } -// } -// } -// } -// } - - //断电任务下发 SrgvChargingJob srgvChargingJobDdParam = new SrgvChargingJob(); srgvChargingJobDdParam.setChargingStatus("0"); srgvChargingJobDdParam.setJobType("2"); List srgvChargingJobDds = chargingJobService.selectSrgvChargingJobList(srgvChargingJobDdParam); if (CollUtil.isNotEmpty(srgvChargingJobDds)) { - for (SrgvChargingJob srgvChargingJob : srgvChargingJobDds) { if ("0".equals(srgvChargingJob.getChargingStatus())) { String chargingSite = srgvChargingJob.getChargingSite(); @@ -194,6 +164,7 @@ public class CdzThread implements Runnable { byte[] bytes = Tools.sendData(qxSendData); int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes); if (i == 1) { + log.info("下发{" + deviceCdzs.get(0).getId() + "}号充电桩关闭"); srgvChargingJob.setChargingStatus("1"); srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date())); chargingJobService.updateSrgvChargingJob(srgvChargingJob); @@ -201,14 +172,11 @@ public class CdzThread implements Runnable { chargingJobService.insertHistory(srgvChargingJob.getGuid()); chargingJobService.deleteSrgvChargingJobByGuid(srgvChargingJob.getGuid()); deviceCdzs.get(0).setSpare1(null); - deviceCdzService.updateDeviceCdz(deviceCdzs.get(0)); + deviceCdzService.updateDeviceCdzSpare(deviceCdzs.get(0)); } } - } - } - } /** @@ -223,42 +191,43 @@ public class CdzThread implements Runnable { wcsChargingJob.setAgvId(deviceSrgv.getDeviceId().toString()); List srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(wcsChargingJob); if (CollUtil.isEmpty(srgvChargingJobs)) { - List cdzList = deviceCdzService.selectDeviceCdzListNoSRgvId(); - if (CollUtil.isNotEmpty(cdzList)) { - //寻找最接近的充电桩 - Integer floor = deviceSrgv.getCurrFloor(); - DeviceCdz cdz = null; - Optional min = cdzList.stream().min((o1, o2) -> { - Integer distance1 = Math.abs(o1.getSzcs()); - Integer distance2 = Math.abs(o2.getSzcs()); - return distance1 - distance2; - }); - if (min.isPresent()) { - cdz = min.get(); - } - if (ObjUtil.isNotNull(cdz)) { - //生成充电任务 - SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); - srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString()); - srgvChargingJobParam.setChargingSite("08020" + cdz.getSzcs()); - srgvChargingJobParam.setChargingId(cdz.getId().toString()); - List wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); - if (CollUtil.isEmpty(wcsChargingJobs)) { - SrgvChargingJob scj = new SrgvChargingJob(); - scj.setGuid(IdUtil.fastSimpleUUID()); - scj.setChargingSite(cdz.getSiteId()); - scj.setJobStatus("1"); - scj.setChargingStatus("0"); - scj.setStartDate(DateUtil.now()); - scj.setJobType("1");//到充电桩 - scj.setAgvId(deviceSrgv.getDeviceId().toString()); - scj.setChargingId(cdz.getId().toString()); - chargingJobService.insertSrgvChargingJob(scj); - cdz.setSpare1(deviceSrgv.getDeviceId().toString()); - deviceCdzService.updateDeviceCdz(cdz); - } + DeviceCdz deviceCdz = deviceCdzService.selectDeviceCdzById(Long.valueOf(deviceSrgv.getDeviceId())); +// List cdzList = deviceCdzService.selectDeviceCdzListNoSRgvId(); +// if (CollUtil.isNotEmpty(deviceCdz)) { + //寻找最接近的充电桩 +// Integer floor = deviceSrgv.getCurrFloor(); +// DeviceCdz cdz = null; +// Optional min = cdzList.stream().min((o1, o2) -> { +// Integer distance1 = Math.abs(o1.getSzcs()); +// Integer distance2 = Math.abs(o2.getSzcs()); +// return distance1 - distance2; +// }); +// if (min.isPresent()) { +// cdz = min.get(); +// } + if (ObjUtil.isNotNull(deviceCdz)) { + //生成充电任务 + SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); + srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString()); + srgvChargingJobParam.setChargingSite("08020" + deviceCdz.getSzcs()); + srgvChargingJobParam.setChargingId(deviceCdz.getId().toString()); + List wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); + if (CollUtil.isEmpty(wcsChargingJobs)) { + SrgvChargingJob scj = new SrgvChargingJob(); + scj.setGuid(IdUtil.fastSimpleUUID()); + scj.setChargingSite(deviceCdz.getSiteId()); + scj.setJobStatus("1"); + scj.setChargingStatus("0"); + scj.setStartDate(DateUtil.now()); + scj.setJobType("1");//到充电桩 + scj.setAgvId(deviceSrgv.getDeviceId().toString()); + scj.setChargingId(deviceCdz.getId().toString()); + chargingJobService.insertSrgvChargingJob(scj); + deviceCdz.setSpare1(deviceSrgv.getDeviceId().toString()); + deviceCdzService.updateDeviceCdz(deviceCdz); } } +// } } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java index f92a6e8..6ce3555 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java @@ -62,6 +62,7 @@ public class MonitoringThread implements Runnable { for (String cdzCode : PlcCdzRead.deviceCdzMap.keySet()) { DeviceCdz deviceCdz = PlcCdzRead.deviceCdzMap.get(cdzCode); deviceCdz.setSpare1(null); + deviceCdz.setModel(deviceCdz.getStatus()); deviceCdzService.updateDeviceCdz(deviceCdz); } try { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java index 9d90acf..49a41e4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java @@ -158,6 +158,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { param.setJobStatus("1"); param.setJobType("1"); param.setAgvId(deviceSrgv.getDeviceId().toString()); + + if (deviceSrgv != null && deviceSrgv.getWorkMode() != 5) { + return; + } List srgvChargingJobs = srgvChargingJobMapper.selectSrgvChargingJobList(param); if (CollUtil.isNotEmpty(srgvChargingJobs)) { SrgvChargingJob srgvChargingJob = srgvChargingJobs.get(0); @@ -175,8 +179,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSrgvQueue.setCargo("0"); wcsSrgvQueue.setIssued("0"); wcsSrgvQueue.setExecutionStatus("1"); - wcsSrgvQueue.setCargoPickSite(""); - wcsSrgvQueue.setCargoPlaceSite(""); + wcsSrgvQueue.setCargoPickSite(deviceSrgv.getCurrSite()); + wcsSrgvQueue.setCargoPlaceSite(chargingSite); wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); WcsSrgvMap wcsSrgvMap = wcsSrgvMapService.selectWcsSrgvMapBySiteId(chargingSite); @@ -186,13 +190,17 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } else { wcsSrgvQueue.setEndSite("tsj"); wcsSrgvQueue.setDefault02("8"); -// if (endSite.equals("tsj")){ + Integer count = wcsSagvQueueMapper.selectTsj(); if (count > 0) { return; } -// } } + // TODO 如果小车的当前点和小车的充电点位置一样,直接生成已经下发的队列 等着充电就可以 +// if (deviceSrgv.getCurrSite().equals(chargingSite)) { +// wcsSrgvQueue.setIssued("1"); +// wcsSrgvQueue.setExecutionStatus("3"); +// } wcsSrgvQueue.setTaskNo(String.valueOf(deviceSrgv.getDeviceId() + 500)); wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); @@ -222,11 +230,6 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { * 生成出库小车队列 */ private void createCarOutQueue() { -// MydoJob mydoJob = new MydoJob(); -// mydoJob.setInOut("2"); -// mydoJob.setExecutionPhase("0"); -// mydoJob.setStatus("1"); -// List mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob); List mydoJobs = mydoJobService.selectMydoJobOut(); @@ -263,24 +266,63 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); //先找流程相等的小车 List currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList()); - int z = 100000; +// int z = 100000; +// for (DeviceSrgv srgv : currentFloorCarList) { +// // 坐标截取和转换(保留你的原有逻辑) +// Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2)); +// Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2)); +// Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4)); +// Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4)); +// +// // 计算当前小车到取货点的曼哈顿距离 TODO 先算Y 再算X 如果Y相等再算X +//// int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY); +// int tempZ = Math.abs(startY - endY) != 0 ? Math.abs(startY - endY) : Math.abs(startX - endX); +// +// // 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车 +// if (tempZ < z) { +// z = tempZ; // 把z更新为当前更小的距离 +// deviceSrgv = srgv; // 记录这个更近的小车 +// log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv); +// } +// } + + + int minYDistance = 100000; // 记录最小的Y轴距离 + int minXDistance = 100000; // 记录最小的X轴距离 + DeviceSrgv bestSrgv = null; // 最终选中的最优小车 + for (DeviceSrgv srgv : currentFloorCarList) { - // 坐标截取和转换(保留你的原有逻辑) + // 坐标截取和转换(保留原有逻辑) Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2)); Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2)); Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4)); Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4)); - // 计算当前小车到取货点的曼哈顿距离 - int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY); + // 1. 计算当前小车到目标点的Y轴、X轴绝对距离 + int currentYDistance = Math.abs(startY - endY); + int currentXDistance = Math.abs(startX - endX); - // 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车 - if (tempZ < z) { - z = tempZ; // 把z更新为当前更小的距离 - deviceSrgv = srgv; // 记录这个更近的小车 - log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv); + // 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序 + if (currentYDistance < minYDistance) { + // 情况1:当前Y轴距离更小,直接更新最优解 + minYDistance = currentYDistance; + minXDistance = currentXDistance; + bestSrgv = srgv; + log.info("楼层相等,找到更近小车(Y轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv); + } else if (currentYDistance == minYDistance) { + // 情况2:Y轴距离相同,比较X轴距离 + if (currentXDistance < minXDistance) { + minXDistance = currentXDistance; + bestSrgv = srgv; + log.info("楼层相等,找到更近小车(X轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv); + } } } + + // 最终选中的小车赋值给deviceSrgv(保持原有变量名兼容) + deviceSrgv = bestSrgv; + + if (deviceSrgv == null) { //如果未选择到小车,再找其他楼层的小车 for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { @@ -326,12 +368,12 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //终点是提升机 endSite = "tsj"; } - if (endSite.equals("tsj")) { - Integer count = wcsSagvQueueMapper.selectTsj(); - if (count > 0) { - return; - } - } +// if (endSite.equals("tsj")) { +// Integer count = wcsSagvQueueMapper.selectTsj(); +// if (count > 0) { +// return; +// } +// } mydoJob1.setExitId(null); WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); @@ -353,7 +395,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { ssj = "L1005"; } Integer count = mydoJobService.selectExit(ssj); - if (count == 0) { + if (count >= 0 && count <= 1) { mydoJob1.setExitId(ssj); mydoJobService.updateMydoJob(mydoJob1); outModelSSJ.add(s); @@ -501,28 +543,44 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //取货地址 String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); - //先找流程相等的小车 + //先找层数相等的小车 List currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList()); - int z = 100000; + int minYDistance = 100000; // 记录最小的Y轴距离 + int minXDistance = 100000; // 记录最小的X轴距离 + DeviceSrgv bestSrgv = null; // 最终选中的最优小车 + for (DeviceSrgv srgv : currentFloorCarList) { - // 坐标截取和转换(保留你的原有逻辑) + // 坐标截取和转换(保留原有逻辑) Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2)); Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2)); Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4)); Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4)); - // 计算当前小车到取货点的曼哈顿距离 - int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY); + // 1. 计算当前小车到目标点的Y轴、X轴绝对距离 + int currentYDistance = Math.abs(startY - endY); + int currentXDistance = Math.abs(startX - endX); - // 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车 - if (tempZ < z) { - z = tempZ; // 把z更新为当前更小的距离 - deviceSrgv = srgv; // 记录这个更近的小车 - log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv); + // 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序 + if (currentYDistance < minYDistance) { + // 情况1:当前Y轴距离更小,直接更新最优解 + minYDistance = currentYDistance; + minXDistance = currentXDistance; + bestSrgv = srgv; + log.info("楼层相等,找到更近小车(Y轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv); + } else if (currentYDistance == minYDistance) { + // 情况2:Y轴距离相同,比较X轴距离 + if (currentXDistance < minXDistance) { + minXDistance = currentXDistance; + bestSrgv = srgv; + log.info("楼层相等,找到更近小车(X轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv); + } } } + + // 最终选中的小车赋值给deviceSrgv(保持原有变量名兼容) + deviceSrgv = bestSrgv; if (deviceSrgv == null) { - //如果未选择到小车,再找其他楼层的小车 + //如果未选择到小车,找目标层小车 for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); @@ -534,6 +592,20 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } } } +// // 如果目标层小车也没有 找其他层小车 +// if (deviceSrgv==null){ +// for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { +// if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { +// WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); +// if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { +// deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车 +// log.info("楼层bu相等:{}", deviceSrgv); +// +// } +// } +// } +// +// } if (deviceSrgv != null) { WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); @@ -560,28 +632,28 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { // 小车不在1楼 endSite = "tsj"; } - if (endSite.equals("tsj")) { - Integer count = wcsSagvQueueMapper.selectTsj(); - if (count > 0) { - return; - } - } +// if (endSite.equals("tsj")) { +// Integer count = wcsSagvQueueMapper.selectTsj(); +// if (count > 0) { +// return; +// } +// } //筛选出deviceSrgvMap中deviceSrgv.getWorkMode() == 4并且deviceSrgv.getStatus() == 1并且deviceSrgv.getCurrSite() == cargoPickSite得对象,并排除掉其中deviceId与deviceSrgv.getDeviceId()相同的对象 - - List sameSiteDevices = deviceSrgvMap.values().stream() - .filter(d -> d.getWorkMode() == 5 - && d.getStatus() == 1 - && d.getCurrSite().equals(cargoPickSite)) - .collect(Collectors.toList()); - if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { - WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); - wcsSrgvMap3.setRemark("cache"); - List wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3); - for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) { - //deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象 - //todo + // 如果当前有其他小车也要去入库点取货 TODO 判断的是如果当前车要去取货点,但是取货点有车的的情况 +// List sameSiteDevices = deviceSrgvMap.values().stream() +// .filter(d -> d.getWorkMode() == 5 +// && d.getStatus() == 1 +// && d.getCurrSite().equals(cargoPickSite)) +// .collect(Collectors.toList()); + // 和当前小车不是一个 那么就生成一个去离母通道最近的点 +// if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { +// WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); +// wcsSrgvMap3.setSiteId("07070"+sameSiteDevices.get(0).getCurrFloor()); +// List wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3); +// for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) { +// // if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) { // WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString()); // WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); @@ -611,9 +683,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { // return; // } // } - - } - } +// +// } +// } //生成小车取货队列 @@ -678,7 +750,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { sendMainTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); } else { //小车不在起始点 - sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, startSite); +// sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, startSite); + sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); } } } @@ -693,32 +766,54 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { Integer floor = deviceSrgv.getCurrFloor(); //获取当前地图 Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); - if ((wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2") || wcsSrgvQueue.getDefault02().equals("4")) && wcsSrgvQueue.getTheFloor().equals("1") && !wcsSrgvQueue.getEndSite().equals("tsj")) { - //如果是1层 锁定提升机站点 - if (CollUtil.isNotEmpty(arrByRoadSite) && arrByRoadSite.values().iterator().next().getZ() == 1) { - if (arrByRoadSite.containsKey("080501")) { - arrByRoadSite.get("080501").setValue(0); + if (wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2")) { + // 出入库任务时,只要车不在提升机里面就锁定提升机的点位,设置成墙 + if (CollUtil.isNotEmpty(arrByRoadSite) && !deviceSrgv.getCurrSite().equals("09050" + floor)) { + String siteId = "08050" + floor; + if (arrByRoadSite.containsKey(siteId)) { + arrByRoadSite.get(siteId).setValue(0); } } } -// if (wcsSrgvQueue.getDefault02().equals("8")){ -// endSite="07050"+deviceSrgv.getCurrFloor(); -// } - // + // 移库任务直接锁定 + if (wcsSrgvQueue.getDefault02().equals("7")) { + String siteId = "08050" + floor; + if (arrByRoadSite.containsKey(siteId)) { + arrByRoadSite.get(siteId).setValue(0); + } + } + // 如果是点到点的 并且小车不在提升机里面才锁提升机,在提升机里面不需要锁 + if (wcsSrgvQueue.getDefault02().equals("4") && !deviceSrgv.getCurrSite().equals("09050" + floor)) { + if (CollUtil.isNotEmpty(arrByRoadSite)) { + String siteId = "08050" + floor; + if (arrByRoadSite.containsKey(siteId)) { + arrByRoadSite.get(siteId).setValue(0); + } + + } + } + // 当前是换层任务,并且车的当前层和目标层不一样的时候把提升机锁住 如果是一样的时候,则直接解锁 + if (wcsSrgvQueue.getDefault02().equals("8") && floor != Integer.parseInt(wcsSrgvQueue.getDefault07())) { + String siteId = "08050" + floor; + if (arrByRoadSite.containsKey(siteId)) { + arrByRoadSite.get(siteId).setValue(0); + } + } //处理地图 - int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv); + int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv, floor); //计算最短路径 List shortestPath = PathFinder.findShortestPath(emptyMap, arrByRoadSite.get(startSite).getX(), arrByRoadSite.get(startSite).getY(), arrByRoadSite.get(endSite).getX(), arrByRoadSite.get(endSite).getY()); // TODO 小车避让 目前只针对同层最多两台车 并且点位设置到了050201 判断地图中取的路径 不能直达说明有车阻挡 直接返回-1 用-1判断小车阻挡调离小车 - if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1 && shortestPath.get(0)[1] == -1) { - shortestPath = null; + if (shortestPath.size() > 0) { + if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1) { + return false; + } String endBlockAgv = null; DeviceSrgv endBlockDevice = null; - if (arrByRoadSite != null && !arrByRoadSite.isEmpty()) { // 将arrByRoadSite转为String类型的Set(统一类型,方便匹配) Set roadSiteSet = arrByRoadSite.keySet().stream() @@ -727,18 +822,37 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { .collect(Collectors.toSet()); // 2. Stream流式处理deviceSrgvMap - Optional> targetEntry = PlcSrgvRead.deviceSrgvMap.entrySet().stream() - .filter(entry -> entry.getValue() != null) // 过滤other为null的条目 - // 条件1:other的当前站点存在于roadSiteSet中 - .filter(entry -> roadSiteSet.contains(entry.getValue().getCurrSite())) - // 条件2:设备ID不等于当前entry的key - .filter(entry -> !Objects.equals(Convert.toStr(deviceSrgv.getDeviceId()), entry.getKey())) - .findFirst(); // 找到第一个符合条件的条目(等价于原代码的break) + Optional> targetEntry = Optional.empty(); + for (int i = 0; i < shortestPath.size(); i++) { + int endx = shortestPath.get(i)[0]; + int endy = shortestPath.get(i)[1]; + WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); + wcsSrgvMap.setX(endx); + wcsSrgvMap.setY(endy); + wcsSrgvMap.setZ(floor); + List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); + String siteId = wcsSrgvMaps.get(0).getSiteId(); + targetEntry = PlcSrgvRead.deviceSrgvMap.entrySet().stream() + .filter(entry -> entry.getValue() != null) // 过滤other为null的条目 + // 条件1:other的当前站点存在于roadSiteSet中 + .filter(entry -> roadSiteSet.contains(entry.getValue().getCurrSite())) + .filter(entry -> siteId.equals(entry.getValue().getCurrSite())) + // 条件2:设备ID不等于当前entry的key + .filter(entry -> !Objects.equals(Convert.toStr(deviceSrgv.getDeviceId()), entry.getKey())) + .findFirst(); + // 找到第一个符合条件的条目(等价于原代码的break) + if (targetEntry.isPresent()) { + break; + } + + } + // 3. 处理结果(若找到则赋值) if (targetEntry.isPresent()) { endBlockAgv = targetEntry.get().getKey(); endBlockDevice = targetEntry.get().getValue(); + shortestPath = null; } } @@ -747,10 +861,18 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { List wcsSrgvQueueBRS = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueBR); if (endBlockDevice != null && wcsSrgvQueueBRS.isEmpty()) { // 选择当前层最近且可达的缓存点(避让点) - WcsSrgvMap cacheParam = new WcsSrgvMap(); - cacheParam.setRemark("cache"); - cacheParam.setTheLayer(floor); - List cacheMaps = wcsSrgvMapService.selectWcsSrgvMapList(cacheParam); + ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; + List deviceSrgvs = deviceSrgvMap.values().stream() + .filter(d -> d.getWorkMode() == 5 + && d.getStatus() == 1 + && d.getCurrFloor().equals(floor)) + .collect(Collectors.toList()); + ArrayList sites = new ArrayList<>(); + for (int i = 0; i < deviceSrgvs.size(); i++) { + sites.add(deviceSrgvs.get(i).getCurrSite()); + } + List cacheMaps = wcsSrgvMapService.selectNotInsite("cache", floor, sites); +// List cacheMaps = wcsSrgvMapService.selectWcsSrgvMapList(cacheParam); // 生成阻挡车的避让任务(点到点,高优先级,未下发) WcsSrgvQueue taskB = new WcsSrgvQueue(); taskB.setGuid(UUID.randomUUID().toString()); @@ -764,19 +886,34 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { taskB.setExecutionStatus("1");// 初始状态 taskB.setStartSite(endBlockDevice.getCurrSite()); taskB.setCargoPickSite(endBlockDevice.getCurrSite()); - taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId()); - taskB.setEndSite(cacheMaps.get(0).getSiteId()); + if (cacheMaps.size() > 1) { + Integer count = wcsSagvQueueMapper.selectByCaogoPlaceSite(cacheMaps.get(0).getSiteId()); + if (count > 0) { + taskB.setCargoPlaceSite(cacheMaps.get(1).getSiteId()); + taskB.setEndSite(cacheMaps.get(1).getSiteId()); + } else { + taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId()); + taskB.setEndSite(cacheMaps.get(0).getSiteId()); + } + } + if (cacheMaps.size() == 1) { + taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId()); + taskB.setEndSite(cacheMaps.get(0).getSiteId()); + } + taskB.setTheFloor(floor.toString()); // taskB.setDefault03(endBlockDevice.getCurrSite()); taskB.setDefault07(floor.toString()); // taskB.setDefault08("1");//避让任务,直接完成 taskB.setCreateDate(DateUtil.now()); wcsSagvQueueMapper.insertWcsSrgvQueue(taskB); + taskCache++; log.info("目标点 {" + deviceSrgv.getCurrSite() + "} 被小车 {" + deviceSrgv.getDeviceId() + "} 占用,已调度其前往避让点 {}", endSite, endBlockAgv, "02050" + endBlockDevice.getCurrFloor()); // 当前车等待下一轮调度(待阻挡车移开后自然可达) return false; } + } @@ -881,14 +1018,14 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } if (("tsj").equals(endSite)) { if (wcsSrgvQueue.getDefault02().equals("8")) { - endSite = extractTarget(String.valueOf(pathBuilder)); - } else { +// endSite = extractTarget(String.valueOf(pathBuilder)); + endSite = "07050" + wcsSrgvQueue.getTheFloor(); + } + if (wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2")) { endSite = "09050" + wcsSrgvQueue.getTheFloor(); } } -// if (("tsj").equals(startSite)) { -// endSite = "09050" + wcsSrgvQueue.getTheFloor(); -// } + List sendDataList = null; if (StrUtil.isEmpty(wcsSrgvQueue.getDefault08())) { sendDataList = new ArrayList<>(); @@ -977,10 +1114,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { sendDataList.add(taskType); } + // TODO 这段下发有问题 + if (wcsSrgvQueue.getDefault08().equals("2") && deviceSrgv.getSpare5().equals("1")) { - if (wcsSrgvQueue.getDefault08().equals("2") - && deviceSrgv.getSpare5().equals("1") - ) { sendDataList = new ArrayList<>(); SendData2 path = new SendData2(); path.setAddress("4404");//地址 @@ -1002,14 +1138,17 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcjs.setType(1); sendDataList.add(wcjs); - //任务类型转换 + //任务类型转换 //TODO 不行就改成7 SendData2 taskType = new SendData2(); taskType.setAddress("4402"); - taskType.setData("7"); + taskType.setData("9"); taskType.setType(1); sendDataList.add(taskType); } + if (sendDataList == null) { + sendDataList = new ArrayList<>(); + } //任务号、原、目标数据转换 String siteId = wcsSrgvQueue.getTaskNo();//+ "," + startSite + "," + endSite; SendData2 site = new SendData2(); @@ -1226,7 +1365,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //处理换层逻辑 String site1 = "07050" + wcsSrgvQueue.getDefault07(); String site2 = "10050" + wcsSrgvQueue.getDefault07(); + String site3 = "09050" + wcsSrgvQueue.getDefault07(); sites.add(site1); + sites.add(site3); sites.add(site2); } if (Objects.equals(currSite, wcsSrgvQueue.getEndSite()) || (siteId != null && Objects.equals(currSite, siteId)) || sites.contains(currSite)) { @@ -1256,17 +1397,12 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { // return; } //空车任务 且当前车的位置和取货位置相同 - if ("1".equals(taskType) - && (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite)) - - ) { + if ("1".equals(taskType) && (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite))) { String endSite = ""; String xfType = ""; + // 换完层直接根据任务去接出入库任务 if (wcsSrgvQueue.getDefault02().equals("8")) { - //换层任务直接完成,等待后续入出库作业下发 - wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); - wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); - return; + } else { WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); @@ -1281,12 +1417,12 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { endSite = "tsj"; } // 如果终点是提升机需要判断是否有其他任务也是提升机的 这个时候先停一下 - if (endSite.equals("tsj")) { - Integer count = wcsSagvQueueMapper.selectTsj(); - if (count > 0) { - return; - } - } +// if (endSite.equals("tsj")) { +// Integer count = wcsSagvQueueMapper.selectTsj(); +// if (count > 0) { +// return; +// } +// } if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) { xfType = "1";//入库 @@ -1333,6 +1469,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { case "2": MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); if (mydoJobOut != null && (cargoPlaceSite.equals(currSite))) { + log.info("1471 taskNo:[{}],currSite:[{}],cargoPlaceSite:[{}]",wcsSrgvQueue.getTaskNo(),currSite,cargoPlaceSite); JobCallBack jobCallBack = new JobCallBack(); jobCallBack.setType(wcsSrgvQueue.getDefault02()); jobCallBack.setMydojobId(mydoJobOut.getJobId()); @@ -1365,8 +1502,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); - // 充电任务 - } else if ("3".equals(taskType)) { + // 充电任务 并且小车也是充电任务 + } else if ("3".equals(taskType) && wcsSrgvQueue.getDefault02().equals("3")) { //删除队列,插入历史表 wcsSrgvQueue.setExecutionStatus("4"); wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); @@ -1412,9 +1549,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { String startSite = wcsSrgvQueue.getStartSite(); if (!startSite.equals(currSite)) { - wcsSrgvQueue.setIssued("1"); - wcsSrgvQueue.setStartDate(DateUtil.now()); - wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); +// wcsSrgvQueue.setIssued("1"); +// wcsSrgvQueue.setExecutionStatus("3"); +// wcsSrgvQueue.setStartDate(DateUtil.now()); +// wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java index 7124f95..91b0b69 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java @@ -124,17 +124,17 @@ public class SsjThread implements Runnable { } void inDispatch1(DeviceSsj deviceSsj) { - if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim()) ) { + if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) { String trayCode = deviceSsj.getTrayCode().trim(); MydoJob getMydoJob = mydoJobService.selectMydoJobByTrayCode(trayCode); - if (getMydoJob!=null && deviceSsj.getTaskNo()<1000){ + if (getMydoJob != null && deviceSsj.getTaskNo() < 1000) { int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), getMydoJob.getTaskNo(), 1, 1); if (i == 1) { getMydoJob.setStatus("3"); mydoJobService.updateMydoJob(getMydoJob); log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", getMydoJob.getTaskNo()); } - }else { + } else { //todo 查是否为入库模式,不是退回,是否超重 HashMap map = new HashMap<>(); map.put("trayCode", deviceSsj.getTrayCode()); @@ -183,11 +183,28 @@ public class SsjThread implements Runnable { void inDispatch2(DeviceSsj deviceSsj) { if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 1000) { - MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo()); - if (mydoJob != null) { - mydoJob.setExecutionPhase("2"); - mydoJobService.updateMydoJob(mydoJob); + MydoJob mydoJob1 = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(deviceSsj.getTaskNo())); + if (mydoJob1.getCargoSpaceId() != null) { + return; } + + HashMap map = new HashMap<>(); + map.put("taskNo", deviceSsj.getTaskNo()); + //拉取 + AjaxResult ajaxResult = apiService.sendCargoSpace(map); + if (ajaxResult.isSuccess()) { + MydoJob data = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class); + String cargoSpaceId = data.getCargoSpaceId(); + String theFloor = data.getClassId(); + MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo()); + if (mydoJob != null) { + mydoJob.setTheFloor(theFloor); + mydoJob.setCargoSpaceId(cargoSpaceId); + mydoJob.setExecutionPhase("2"); + mydoJobService.updateMydoJob(mydoJob); + } + } + } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java index 13131d4..4704812 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java @@ -8,6 +8,8 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.ruoyi.bas.port.service.IWcsPortService; +import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; +import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService; import com.ruoyi.common.domain.SendData; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.device.srgv.domain.DeviceSrgv; @@ -35,13 +37,17 @@ public class TsjThread implements Runnable { private ITsjDeviceExecutionQueueFinishService tsjDeviceExecutionQueueFinishService; private IWcsPortService wcsPortService; private IWcsSrgvQueueService wcsSrgvQueueService; - public IMydoJobService mydoJobService; + private IMydoJobService mydoJobService; + private IWcsSrgvMapService wcsSrgvMapService; + public void init() { tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class); tsjDeviceExecutionQueueFinishService = SpringUtils.getBean(ITsjDeviceExecutionQueueFinishService.class); wcsPortService = SpringUtils.getBean(IWcsPortService.class); wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); + wcsSrgvMapService = SpringUtils.getBean(IWcsSrgvMapService.class); + } @Override @@ -76,7 +82,7 @@ public class TsjThread implements Runnable { * 1、下发完成 如果设备状态为 2-工作 ,触发方式 2-自动,任务号大于999,则代表任务下发完成 * * */ - if (czfs == 2 && sbzt == 2 && rwh > 999) { + if (czfs == 2 && sbzt == 2 && rwh > 500) { // finishSend(rwh, tsj); } @@ -84,11 +90,16 @@ public class TsjThread implements Runnable { * 2、四向车任务生成 2-工作 ,触发方式 2-自动,任务号大于999 * * */ - if (czfs == 2 && sbzt == 2 && jdbz == 4 && rwh > 999) { - createSRgvQueue(rwh, tsj); + if (czfs == 2 && sbzt == 2 && jdbz == 4 && rwh > 500) { + WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(String.valueOf(rwh)); + String agvId = wcsSrgvQueue.getAgvId(); + DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(agvId); + if (deviceSrgv.getCurrSite().equals("09050" + tsj.getDqcs())) { + createSRgvQueue(rwh, tsj); + } } // 提升机取货中 说明对齐当前要取货层 开始给小车下发 - if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 999) { + if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 500) { createSRgvQueueTsjQd(rwh, tsj); } @@ -96,7 +107,7 @@ public class TsjThread implements Runnable { * 2、任务完成 * * */ - if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 999) { + if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 500) { //任务完成 finishTask(rwh, tsj); } @@ -117,7 +128,7 @@ public class TsjThread implements Runnable { private void createSRgvQueueTsjQd(Long rwh, DeviceTsj tsj) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); - if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) || deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor())) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 2 && tsj.getHczt() == 1) { + if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) || deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor())) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 1 && tsj.getHczt() == 1) { SendData rwlxSendData = new SendData(Tools.INT, 1); DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(Convert.toStr(1)); byte[] bytes = Tools.sendData(rwlxSendData); @@ -146,11 +157,15 @@ public class TsjThread implements Runnable { WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue(); sRgvQueueParam.setTaskNo(Convert.toStr(rwh)); sRgvQueueParam.setEndSite(Convert.toStr("tsj")); + sRgvQueueParam.setIssued("1"); + sRgvQueueParam.setExecutionStatus("3"); List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(sRgvQueueParam); if (CollUtil.isEmpty(wcsSrgvQueues)) { return; } WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.insertHistory(Convert.toStr(rwh)); + String cargoPickSite = wcsSrgvQueue.getCargoPickSite(); + String cargoPlaceSite = wcsSrgvQueue.getCargoPlaceSite(); //修改起点终点 if (ObjUtil.isNotEmpty(wcsSrgvQueue)) { wcsSrgvQueue.setCreateDate(DateUtil.formatDateTime(DateUtil.date())); @@ -174,7 +189,6 @@ public class TsjThread implements Runnable { endSite = wcsSrgvQueue.getCargoPlaceSite(); break; case "3": - //充电 break; case "4": //点到点 @@ -191,10 +205,44 @@ public class TsjThread implements Runnable { log.info("任务类型错误"); } break; + case "8": + //换层任务直接变成点到点任务 + switch (wcsSrgvQueue.getTaskType()) { + case "1": + WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); + WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); + if (wcsSrgvMapq != null && wcsSrgvMapf != null) { + + wcsSrgvQueue.setEndSite(cargoPickSite); + wcsSrgvQueue.setDefault02("4"); + wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString()); + wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString()); + wcsSrgvQueue.setIssued("0"); + wcsSrgvQueue.setExecutionStatus("1"); + wcsSrgvQueue.setTaskType("1"); + } + wcsSrgvQueue.setStartSite("09050" + tsj.getDqcs()); + wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); + break; + case "3": + WcsSrgvMap wcsSrgvMapq1 = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); + WcsSrgvMap wcsSrgvMapf1 = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); + if (wcsSrgvMapq1 != null && wcsSrgvMapf1 != null) { + wcsSrgvQueue.setEndSite(cargoPlaceSite); + wcsSrgvQueue.setDefault02("3"); + wcsSrgvQueue.setTheFloor(wcsSrgvMapq1.getTheLayer().toString()); + wcsSrgvQueue.setDefault07(wcsSrgvMapf1.getTheLayer().toString()); + wcsSrgvQueue.setIssued("0"); + wcsSrgvQueue.setExecutionStatus("1"); + wcsSrgvQueue.setTaskType("3"); + } + wcsSrgvQueue.setStartSite("09050" + tsj.getDqcs()); + wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); + break; + } } - if (StrUtil.isNotEmpty(startSite) && StrUtil.isNotEmpty(endSite)) { - + if (StrUtil.isNotEmpty(startSite) && StrUtil.isNotEmpty(endSite) && !wcsSrgvQueue.getDefault02().equals("8")) { wcsSrgvQueue.setStartSite(startSite); wcsSrgvQueue.setEndSite(endSite); wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java index b042843..64e1fda 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java @@ -90,6 +90,9 @@ public class GetDeviceSrgvMap { } dto.setStatus(status); dto.setLocation(d.getCurrSite() == null ? "" : d.getCurrSite()); + dto.setRow(d.getCurrSite() == null ? "" : d.getCurrSite().substring(2,4)); + dto.setColumn(d.getCurrSite() == null ? "" :d.getCurrSite().substring(0,2)); + dto.setLayer(d.getCurrSite() == null ? "" : d.getCurrSite().substring(4,6)); dto.setAlarm(d.getAlarm() == null ? "" : String.valueOf(d.getAlarm())); dto.setAlarmMsg(DictUtils.getDictLabel("srgv_alarm", d.getAlarm() == null ? "" : String.valueOf(d.getAlarm()))); if (d.getTaskNo() != null && d.getTaskNo() > 0) { @@ -132,6 +135,9 @@ public class GetDeviceSrgvMap { private String isThere; private String status; private String location; + private String row; + private String column; + private String layer; private String alarm; private String alarmMsg; private String trayCode; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java index c43d2eb..bfca15b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java @@ -99,8 +99,17 @@ public class GetDeviceSsjMap { dto.setRotationDirection(calcRotationDirection(d.getTaskNo())); dto.setAlarm(String.valueOf(d.getException())); dto.setAlarmMsg(DictUtils.getDictLabel("ssj_ex", String.valueOf(d.getException()))); - dto.setDW(String.valueOf(d.getDw())); dto.setKX(String.valueOf(d.getKx())); + if (!dto.getTaskNo().equals("0")){ + if (dto.getKX().equals("0")){ + dto.setDW("1"); + }else { + dto.setDW("0"); + } + }else { + dto.setDW("0"); + } + if (d.getTaskNo() > 0) { try { MydoJob job = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(d.getTaskNo())); @@ -128,16 +137,10 @@ public class GetDeviceSsjMap { */ private String calcRotationDirection(int taskNo) { try { - if (taskNo <= 0) return "0"; - MydoJob job = mydoJobService.selectMydoJobByTaskNo((long) taskNo); - if (job == null || job.getInOrOut() == null) return "0"; - int val; - try { - val = Integer.parseInt(job.getInOrOut()); - } catch (NumberFormatException e) { + if (taskNo <= 0) { return "0"; } - return val >= 20 ? "2" : "1"; + return taskNo <= 50000 ? "1" : "2"; } catch (Exception e) { return "0"; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceTsjMap.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceTsjMap.java index 6e35e04..de458c7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceTsjMap.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceTsjMap.java @@ -80,7 +80,7 @@ public class GetDeviceTsjMap { String code = entry.getKey(); DeviceTsj d = entry.getValue(); TsjDto dto = new TsjDto(); - dto.setId(String.valueOf(d.getId())); + dto.setId("TW001"); dto.setLayer(d.getDqcs() == null ? "" : String.valueOf(d.getDqcs())); dto.setTaskNo(d.getRwh() == null ? "" : String.valueOf(d.getRwh())); dto.setZxjd(d.getJdbz() == null ? "" : String.valueOf(d.getJdbz())); diff --git a/ruoyi-admin/src/main/resources/mapper/bas/WcsSrgvMapMapper.xml b/ruoyi-admin/src/main/resources/mapper/bas/WcsSrgvMapMapper.xml index 6c660be..228bfd5 100644 --- a/ruoyi-admin/src/main/resources/mapper/bas/WcsSrgvMapMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/bas/WcsSrgvMapMapper.xml @@ -161,4 +161,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{guid} + + + + + diff --git a/ruoyi-admin/src/main/resources/mapper/device/DeviceCdzMapper.xml b/ruoyi-admin/src/main/resources/mapper/device/DeviceCdzMapper.xml index 14fb8ef..877d2a3 100644 --- a/ruoyi-admin/src/main/resources/mapper/device/DeviceCdzMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/device/DeviceCdzMapper.xml @@ -123,4 +123,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + update device_cdz set spare1=null where id=#{id} + + + diff --git a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml index 146e282..a5fada6 100644 --- a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml @@ -291,7 +291,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" FROM floor_group WHERE - rn <= 2 + rn <= 1 ORDER BY group_coding DESC; diff --git a/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml b/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml index f611652..a73408d 100644 --- a/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml @@ -218,5 +218,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + From 24fb696a6732a7ef90d99b7a46786fa7f8f897b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=AB=E7=8C=ABguowen?= <9290821+guowen-the-cat@user.noreply.gitee.com> Date: Wed, 18 Mar 2026 14:13:14 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E6=95=B0=E5=AD=97=E5=AD=AA=E7=94=9F?= =?UTF-8?q?=EF=BC=9A=E4=BF=AE=E6=94=B9=E8=BE=93=E9=80=81=E6=9C=BA=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E6=97=B6=E5=88=B0=E4=BD=8D=E4=BF=A1=E5=8F=B7=E4=B8=BA?= =?UTF-8?q?=E5=88=B0=E4=BD=8D=EF=BC=8C=E5=87=BA=E5=BA=93=E6=97=B6=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=E9=97=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java index bfca15b..6fe56ea 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java @@ -101,10 +101,14 @@ public class GetDeviceSsjMap { dto.setAlarmMsg(DictUtils.getDictLabel("ssj_ex", String.valueOf(d.getException()))); dto.setKX(String.valueOf(d.getKx())); if (!dto.getTaskNo().equals("0")){ - if (dto.getKX().equals("0")){ - dto.setDW("1"); + if (dto.getRotationDirection().equals("1")){ + dto.setDW(String.valueOf(d.getDw())); }else { - dto.setDW("0"); + if (dto.getKX().equals("0")){ + dto.setDW("1"); + }else { + dto.setDW("0"); + } } }else { dto.setDW("0"); From 24eaaa2823747659b6fe29122cafd099683dfb1d Mon Sep 17 00:00:00 2001 From: "1009473166@qq.com" <草拟吗23> Date: Wed, 18 Mar 2026 14:22:57 +0800 Subject: [PATCH 05/11] 2026.3.18 --- .../main/java/com/ruoyi/RuoYiApplication.java | 4 +++ .../queue/srgv/mapper/WcsSrgvQueueMapper.java | 22 ++++++------ .../srgv/service/IWcsSrgvQueueService.java | 2 ++ .../service/impl/WcsSrgvQueueServiceImpl.java | 22 ++++++++++++ .../schedule/plcRead/srgv/PlcSrgvRead.java | 17 ++++++++- .../schedule/plcRead/ssj/PlcSsjRead.java | 16 +++++++++ .../schedule/scheduleTask/cdz/CdzThread.java | 3 +- .../scheduleTask/srgv/BaseSRgvThread.java | 35 +++++++++++++------ .../schedule/scheduleTask/tsj/TsjThread.java | 12 ++++++- .../java/com/ruoyi/tcp/GetDeviceSrgvMap.java | 2 +- .../java/com/ruoyi/tcp/GetDeviceSsjMap.java | 10 ++---- .../ruoyi/tcp/Wcs2wmsgetEmptyCargoSpace.java | 2 ++ .../mapper/queue/WcsSrgvQueueMapper.xml | 6 ++++ 13 files changed, 120 insertions(+), 33 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java index e95a574..5bcd40a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java @@ -1,5 +1,6 @@ package com.ruoyi; +import com.ruoyi.schedule.ScheduleThread; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,6 +8,8 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; +import javax.annotation.Resource; + /** * 启动程序 * @@ -17,6 +20,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableAsync public class RuoYiApplication { + public static void main(String[] args) { // System.setProperty("spring.devtools.restart.enabled", "false"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java index 219b0e7..3c58130 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java @@ -2,7 +2,6 @@ package com.ruoyi.queue.srgv.mapper; import java.util.List; import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; -import org.apache.ibatis.annotations.Param; /** * 四向小车任务队列Mapper接口 @@ -10,11 +9,10 @@ import org.apache.ibatis.annotations.Param; * @author ruoyi * @date 2025-11-21 */ -public interface WcsSrgvQueueMapper -{ +public interface WcsSrgvQueueMapper { /** * 查询四向小车任务队列 - * + * * @param guid 四向小车任务队列主键 * @return 四向小车任务队列 */ @@ -29,12 +27,9 @@ public interface WcsSrgvQueueMapper public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor); - - - /** * 查询四向小车任务队列列表 - * + * * @param wcsSrgvQueue 四向小车任务队列 * @return 四向小车任务队列集合 */ @@ -42,7 +37,7 @@ public interface WcsSrgvQueueMapper /** * 新增四向小车任务队列 - * + * * @param wcsSrgvQueue 四向小车任务队列 * @return 结果 */ @@ -50,7 +45,7 @@ public interface WcsSrgvQueueMapper /** * 修改四向小车任务队列 - * + * * @param wcsSrgvQueue 四向小车任务队列 * @return 结果 */ @@ -58,7 +53,7 @@ public interface WcsSrgvQueueMapper /** * 删除四向小车任务队列 - * + * * @param guid 四向小车任务队列主键 * @return 结果 */ @@ -66,7 +61,7 @@ public interface WcsSrgvQueueMapper /** * 批量删除四向小车任务队列 - * + * * @param guids 需要删除的数据主键集合 * @return 结果 */ @@ -77,4 +72,7 @@ public interface WcsSrgvQueueMapper Integer selectTsj(); Integer selectByCaogoPlaceSite(String siteId); + + Integer selectByEndSite(); + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java index 08c2168..123dfb3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java @@ -83,4 +83,6 @@ public interface IWcsSrgvQueueService Integer selectTsj(); Integer selectByCaogoPlaceSite(String siteId); + + Integer selectByEndSite(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java index 7769dd6..4d878e4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java @@ -131,6 +131,28 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId); } + @Override + public String selectMinCountJob( List outModelSSJ) { + return wcsSrgvQueueMapper.selectMinCountJob(outModelSSJ) ; + } + + @Override + public Integer selectTsj() { + + return wcsSrgvQueueMapper.selectTsj(); + } + + @Override + public Integer selectByCaogoPlaceSite(String siteId) { + return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId); + } + + @Override + public Integer selectByEndSite() { + return wcsSrgvQueueMapper.selectByEndSite(); + + } + @Override public WcsSrgvQueue insertHistory(String taskNo) { WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java index 3a666a3..e6e4f9a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java @@ -79,6 +79,12 @@ public class PlcSrgvRead implements Runnable { if (read1.IsSuccess) { setValueByByte1(read1.Content, deviceSrgv); } + + OperateResultExOne read5 = modbusTcpNet.Read("4081", (short) 2);//2400-2414 + if (read5.IsSuccess) { + setValueByByte5(read1.Content, deviceSrgv); + } + //读取二段任务 小车是否接收完成1段作业 OperateResultExOne read3 = modbusTcpNet.Read("1000", (short) 2);//2400-2414 if (read3.IsSuccess) { @@ -111,7 +117,7 @@ public class PlcSrgvRead implements Runnable { // agvData.setStatus(0); agvData.setStatus(Convert.toInt(byteTransform.TransInt16(content, 8))); //载货标志 - agvData.setCargoFlag(Convert.toInt(byteTransform.TransInt16(content, 13))); +// agvData.setCargoFlag(Convert.toInt(byteTransform.TransInt32(content[1], 13))); //接收完成标志 // agvData.setFinish(Convert.toInt(byteTransform.TransInt16(content, 10))); // agvData.setFinish(0); @@ -131,6 +137,15 @@ public class PlcSrgvRead implements Runnable { } + + private void setValueByByte5(byte[] content, DeviceSrgv agvData) { + int cargoFlag = content[27] & 0xFF; + agvData.setCargoFlag(cargoFlag); + + } + + + //单字 private void setValueByByte3(byte[] content, DeviceSrgv agvData) { // agvData.setTaskType(0); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java index 4bc6775..357fa42 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java @@ -68,6 +68,10 @@ public class PlcSsjRead implements Runnable { // 线体到位输送机 readPlcOtherSsj(ssjDevice); break; + case "4": + // 线体到位输送机 + readPlcInDwSsj(ssjDevice); + break; } } @@ -86,6 +90,18 @@ public class PlcSsjRead implements Runnable { } } + private void readPlcInDwSsj(DeviceSsj ssjDevice) { + OperateResultExOne read2 = readWriteNet.Read(ssjDevice.getPlcDbReadAddress(), Short.parseShort("10")); + String ddsx1 = "0"; + if (read2.IsSuccess) { + ddsx1 = SoftBasic.ByteToHexString(read2.Content); + ssjDevice.setKx(ParseUtil.optInt(4, ddsx1)); + ssjDevice.setDw(ParseUtil.optInt(6, ddsx1)); + ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1)); + + } + } + /** * 其他输送机 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java index 9aafc13..ce2eab2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java @@ -37,6 +37,7 @@ public class CdzThread implements Runnable { private final Integer LITTLE_BETTERY = 40; private final Integer MIDDLE_BETTERY = 70; private final Integer MAX_BETTERY = 90; + private final Integer JOB_BETTERY=50; private ISrgvChargingJobService chargingJobService; private IDeviceCdzService deviceCdzService; private IDeviceSrgvService deviceSrgvService; @@ -139,7 +140,7 @@ public class CdzThread implements Runnable { List deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList(); for (DeviceCdz deviceCdz : deviceCdzdd) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()); - if (((deviceSrgv.getBattery() >= MIDDLE_BETTERY && count > 0) || deviceSrgv.getBattery() >= MAX_BETTERY) + if (((deviceSrgv.getBattery() >= JOB_BETTERY && count > 0) || deviceSrgv.getBattery() >= MAX_BETTERY) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getChargeFlag() == 2 && deviceCdz.getStatus() == 1) { createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java index 49a41e4..13c14f7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java @@ -338,9 +338,11 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } if (deviceSrgv != null) { WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); - WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); +// WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); - if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) { + if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 +// && wcsSrgvQueue4 == null + ) { //查询小车是否为取货楼层 String endSite = ""; String issued = "0"; @@ -1416,13 +1418,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //不同层,终点为提升机 endSite = "tsj"; } - // 如果终点是提升机需要判断是否有其他任务也是提升机的 这个时候先停一下 -// if (endSite.equals("tsj")) { -// Integer count = wcsSagvQueueMapper.selectTsj(); -// if (count > 0) { -// return; -// } -// } + if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) { xfType = "1";//入库 @@ -1517,7 +1513,26 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { { wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); } - + // 如果是空车且 任务是点到点并且目标点是“070301” + }else if ("1".equals(taskType)&&wcsSrgvQueue.getDefault02().equals("4")&&wcsSrgvQueue.getEndSite().equals("070301")){ + String endSite = ""; + String xfType = ""; + WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); + WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); + // 取货点地图和放货点地图不为空 + if (wcsSrgvMapq != null && wcsSrgvMapf != null) { + //如果是同层,终点为取货点 + endSite = cargoPickSite; + // 更新目标点,修改执行队列 + wcsSrgvQueue.setEndSite(endSite); + wcsSrgvQueue.setDefault02("4"); + wcsSrgvQueue.setIssued("0"); + wcsSrgvQueue.setExecutionStatus("1"); + wcsSrgvQueue.setTaskType("1"); + } + wcsSrgvQueue.setStartSite(currSite); + wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); + wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); } //更新小车待机时间 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java index 4704812..94cecef 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java @@ -27,7 +27,9 @@ import com.ruoyi.schedule.plcRead.util.Tools; import lombok.extern.slf4j.Slf4j; import java.util.Date; +import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; @Slf4j public class TsjThread implements Runnable { @@ -212,8 +214,16 @@ public class TsjThread implements Runnable { WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); if (wcsSrgvMapq != null && wcsSrgvMapf != null) { + Integer count = wcsSrgvQueueService.selectByEndSite(); + List collect = PlcSrgvRead.deviceSrgvMap.values().stream().filter(d -> + d.getCurrSite().equals(cargoPickSite)) + .collect(Collectors.toList()); + if (count > 0 || !collect.isEmpty()) { + wcsSrgvQueue.setEndSite("070301"); + } else { + wcsSrgvQueue.setEndSite(cargoPickSite); + } - wcsSrgvQueue.setEndSite(cargoPickSite); wcsSrgvQueue.setDefault02("4"); wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString()); wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString()); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java index 64e1fda..2045d5c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java @@ -80,7 +80,7 @@ public class GetDeviceSrgvMap { AgvDto dto = new AgvDto(); dto.setId(d.getDeviceId() == null ? "" : String.format("%04d", d.getDeviceId())); dto.setTaskNo(d.getTaskNo() == null ? "" : String.valueOf(d.getTaskNo())); - dto.setIsThere((d.getWorkPhase() >= 3 && d.getWorkPhase() < 6 ? "1" : "0")); + dto.setIsThere(d.getCargoFlag()==256?"1":"0"); Integer wp = d.getWorkPhase(); String status = "0"; if (wp != null) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java index 6fe56ea..bfca15b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java @@ -101,14 +101,10 @@ public class GetDeviceSsjMap { dto.setAlarmMsg(DictUtils.getDictLabel("ssj_ex", String.valueOf(d.getException()))); dto.setKX(String.valueOf(d.getKx())); if (!dto.getTaskNo().equals("0")){ - if (dto.getRotationDirection().equals("1")){ - dto.setDW(String.valueOf(d.getDw())); + if (dto.getKX().equals("0")){ + dto.setDW("1"); }else { - if (dto.getKX().equals("0")){ - dto.setDW("1"); - }else { - dto.setDW("0"); - } + dto.setDW("0"); } }else { dto.setDW("0"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/Wcs2wmsgetEmptyCargoSpace.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/Wcs2wmsgetEmptyCargoSpace.java index 3f599cc..647e003 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/Wcs2wmsgetEmptyCargoSpace.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/Wcs2wmsgetEmptyCargoSpace.java @@ -96,6 +96,7 @@ public class Wcs2wmsgetEmptyCargoSpace { dto.setTrayCode(getText(node, "trayCode")); dto.setProductCode(getText(node, "productCode")); dto.setProductName(getText(node, "productName")); + dto.setCargoSpaceId(getText(node, "cargoSpaceId")); return dto; } @@ -125,5 +126,6 @@ public class Wcs2wmsgetEmptyCargoSpace { private String trayCode; private String productCode; private String productName; + private String cargoSpaceId; } } diff --git a/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml b/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml index a73408d..d583ed6 100644 --- a/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml @@ -222,4 +222,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select count(1) from wcs_srgv_queue where cargo_place_site=#{siteId} + + + + From cafcde4a35a201571609897f8469c317e97ca239 Mon Sep 17 00:00:00 2001 From: "1009473166@qq.com" <草拟吗23> Date: Wed, 18 Mar 2026 14:26:26 +0800 Subject: [PATCH 06/11] 2026.3.18 --- .../service/impl/WcsSrgvQueueServiceImpl.java | 15 --------------- ruoyi-ui/src/views/device/ssj/index.vue | 1 - ruoyi-ui/vue.config.js | 2 +- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java index 4d878e4..f9c4598 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java @@ -131,21 +131,6 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId); } - @Override - public String selectMinCountJob( List outModelSSJ) { - return wcsSrgvQueueMapper.selectMinCountJob(outModelSSJ) ; - } - - @Override - public Integer selectTsj() { - - return wcsSrgvQueueMapper.selectTsj(); - } - - @Override - public Integer selectByCaogoPlaceSite(String siteId) { - return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId); - } @Override public Integer selectByEndSite() { diff --git a/ruoyi-ui/src/views/device/ssj/index.vue b/ruoyi-ui/src/views/device/ssj/index.vue index cdc5286..d1e84e6 100644 --- a/ruoyi-ui/src/views/device/ssj/index.vue +++ b/ruoyi-ui/src/views/device/ssj/index.vue @@ -157,7 +157,6 @@ export default { { key: 'kx', label: '空闲', value: d.kx, dict: 'ssj_kx' }, { key: 'dw', label: '到位', value: d.dw, dict: 'ssj_dw' }, { key: 'exception', label: '异常', value: d.exception, dict: 'ssj_ex'}, - ] } if (dev.kind === 'srgv') { diff --git a/ruoyi-ui/vue.config.js b/ruoyi-ui/vue.config.js index a1733b8..92c1250 100644 --- a/ruoyi-ui/vue.config.js +++ b/ruoyi-ui/vue.config.js @@ -9,7 +9,7 @@ const CompressionPlugin = require('compression-webpack-plugin') const name = process.env.VUE_APP_TITLE || 'FORTUCKY WCS SYSTEM' // 网页标题 -const baseUrl = 'http://localhost:8081' // 后端接口地址(你的后端端口是8081) +const baseUrl = 'http://192.168.188.236:8081' // 后端接口地址(你的后端端口是8081) const port = process.env.port || process.env.npm_config_port || 80 // 前端端口 From fa9386773f2b028618aa35bb8e99a9f44b90ba0c Mon Sep 17 00:00:00 2001 From: "1009473166@qq.com" <草拟吗23> Date: Wed, 18 Mar 2026 20:29:00 +0800 Subject: [PATCH 07/11] =?UTF-8?q?2026.3.18=20=E6=99=9A=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9Eagv=E8=8E=B7=E5=8F=96=E8=BE=93=E9=80=81=E6=9C=BA?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/api/controller/AgvController.java | 47 +++++++++++++++---- .../com/ruoyi/api/service/IApiService.java | 5 ++ .../api/service/impl/ApiServiceImpl.java | 21 +++++++++ .../queue/srgv/mapper/WcsSrgvQueueMapper.java | 1 + .../scheduleTask/srgv/BaseSRgvThread.java | 16 ++++--- 5 files changed, 75 insertions(+), 15 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java index 5c8f84c..1d4fd87 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java @@ -1,14 +1,22 @@ package com.ruoyi.api.controller; +import cn.hutool.json.JSONUtil; import com.ruoyi.api.domain.agv.agvCallback.AgvCallbackRequest; import com.ruoyi.api.domain.agv.agvCallback.AgvCallbackResponse; +import com.ruoyi.api.mapper.RequestLogMapper; import com.ruoyi.api.service.IApiService; +import com.ruoyi.api.service.impl.RequestLogServiceImpl; +import com.ruoyi.common.annotation.RequestLog; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.device.ssj.domain.DeviceSsj; +import com.ruoyi.job.domain.MydoJob; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Map; /** @@ -18,13 +26,15 @@ import java.util.Map; @RequestMapping("/agv/api") @Slf4j public class AgvController extends BaseController { - + @Autowired + private RequestLogServiceImpl requestLogService; @Autowired private IApiService apiService; /** * agv执行状态返回接口 + * * @param request * @return */ @@ -34,15 +44,14 @@ public class AgvController extends BaseController { } - /** * agv搬运作业 - * @param param{ - * startPoint:起始点 - * endPoint:结束点 - * containerCode:容器编号 - * taskNo:任务号 - * } + * + * @param param{ startPoint:起始点 + * endPoint:结束点 + * containerCode:容器编号 + * taskNo:任务号 + * } * @return */ @PostMapping("/receiveAgvMoveJob") @@ -50,4 +59,26 @@ public class AgvController extends BaseController { return apiService.receiveAgvMoveJob(param); } + // agv 获取请求获取输送机空闲信号 + @PostMapping("/getDeviceMsg") + @RequestLog + public AjaxResult getDeviceMsg(@RequestBody Map param) { + DeviceSsj ssj = apiService.getDeviceMsg(param.get("taskNo")); + com.ruoyi.api.domain.RequestLog requestLog = new com.ruoyi.api.domain.RequestLog(); + requestLog.setRequestBody(JSONUtil.toJsonStr(param)); + requestLog.setRequestMethod("getDeviceMsg"); + requestLog.setIsSuccessful("1"); + requestLog.setRequestTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + requestLog.setRequestUrl("http://192.168.188.236:8081/agv/api/getDeviceMsg"); + requestLog.setRequestMethod("post"); + requestLog.setSourceSystem("agv"); + requestLog.setTargetSystem("wcs"); + requestLog.setEndpoint("获取输送机信号"); + requestLog.setResponseBody(JSONUtil.toJsonStr(AjaxResult.success(ssj))); + requestLog.setResponseStatus("1"); + requestLogService.insertRequestLog(requestLog); + return AjaxResult.success(ssj); + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java index bf04c65..b45b162 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java @@ -12,6 +12,7 @@ import com.ruoyi.api.domain.agv.genAgvSchedulingTask.GenAgvSchedulingTaskRespons import com.ruoyi.api.domain.wcs2wms.JobParam; import com.ruoyi.api.domain.wcs2wms.ReceiveJob; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.device.ssj.domain.DeviceSsj; import com.ruoyi.job.domain.MydoJob; import com.ruoyi.queue.agv.domain.AgvQueue; @@ -136,4 +137,8 @@ public interface IApiService AjaxResult allotSpace(JobParam jobParam); AjaxResult JobFinish(Map param); + + DeviceSsj getDeviceMsg(String taskNo); + + DeviceSsj getDeviceMsgSsj(String entranceId); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java index 2278dc5..46119b7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java @@ -20,6 +20,8 @@ import com.ruoyi.api.domain.wcs2wms.ReceiveJob; import com.ruoyi.api.service.IApiService; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.device.ssj.domain.DeviceSsj; +import com.ruoyi.device.ssj.service.IDeviceSsjService; import com.ruoyi.job.domain.MydoJob; import com.ruoyi.job.service.IMydoJobService; import com.ruoyi.queue.agv.domain.AgvQueue; @@ -51,6 +53,8 @@ public class ApiServiceImpl implements IApiService { private IAgvQueueService agvQueueService; @Autowired private IMydoJobService mydoJobService; + @Autowired + private IDeviceSsjService deviceSsjService; @@ -447,4 +451,21 @@ public class ApiServiceImpl implements IApiService { } + + @Override + public DeviceSsj getDeviceMsg(String taskNo) { + MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(taskNo)); + DeviceSsj ssj = new DeviceSsj(); + ssj.setDeviceCode(mydoJob.getEntranceId()); + List deviceSsjs = deviceSsjService.selectDeviceSsjList(ssj); + return deviceSsjs.get(0); + } + + @Override + public DeviceSsj getDeviceMsgSsj(String entranceId) { + DeviceSsj ssj = new DeviceSsj(); + ssj.setDeviceCode(entranceId); + List deviceSsjs = deviceSsjService.selectDeviceSsjList(ssj); + return deviceSsjs.get(0); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java index 3c58130..5b17a59 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.queue.srgv.mapper; import java.util.List; import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; +import org.apache.ibatis.annotations.Param; /** * 四向小车任务队列Mapper接口 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java index 13c14f7..c250243 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java @@ -309,7 +309,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { minXDistance = currentXDistance; bestSrgv = srgv; log.info("楼层相等,找到更近小车(Y轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv); - } else if (currentYDistance == minYDistance) { + } + if (currentYDistance == minYDistance) { // 情况2:Y轴距离相同,比较X轴距离 if (currentXDistance < minXDistance) { minXDistance = currentXDistance; @@ -569,7 +570,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { minXDistance = currentXDistance; bestSrgv = srgv; log.info("楼层相等,找到更近小车(Y轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv); - } else if (currentYDistance == minYDistance) { + } + if (currentYDistance == minYDistance) { // 情况2:Y轴距离相同,比较X轴距离 if (currentXDistance < minXDistance) { minXDistance = currentXDistance; @@ -1465,7 +1467,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { case "2": MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); if (mydoJobOut != null && (cargoPlaceSite.equals(currSite))) { - log.info("1471 taskNo:[{}],currSite:[{}],cargoPlaceSite:[{}]",wcsSrgvQueue.getTaskNo(),currSite,cargoPlaceSite); + log.info("1471 taskNo:[{}],currSite:[{}],cargoPlaceSite:[{}]", wcsSrgvQueue.getTaskNo(), currSite, cargoPlaceSite); JobCallBack jobCallBack = new JobCallBack(); jobCallBack.setType(wcsSrgvQueue.getDefault02()); jobCallBack.setMydojobId(mydoJobOut.getJobId()); @@ -1513,16 +1515,16 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { { wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); } - // 如果是空车且 任务是点到点并且目标点是“070301” - }else if ("1".equals(taskType)&&wcsSrgvQueue.getDefault02().equals("4")&&wcsSrgvQueue.getEndSite().equals("070301")){ + // 如果是空车且 任务是点到点并且目标点是“070301” + } else if ("1".equals(taskType) && wcsSrgvQueue.getDefault02().equals("4") && wcsSrgvQueue.getEndSite().equals("070301")) { String endSite = ""; String xfType = ""; WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); // 取货点地图和放货点地图不为空 if (wcsSrgvMapq != null && wcsSrgvMapf != null) { - //如果是同层,终点为取货点 - endSite = cargoPickSite; + //如果是同层,终点为取货点 + endSite = cargoPickSite; // 更新目标点,修改执行队列 wcsSrgvQueue.setEndSite(endSite); wcsSrgvQueue.setDefault02("4"); From ad9f8d87fd3cd81c0eed4cd9ecf38daf830a1dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=80=A1=E8=93=89?= <377046077@qq.com> Date: Thu, 19 Mar 2026 15:08:50 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E5=B0=8F=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/api/controller/AgvController.java | 9 +- .../GenAgvSchedulingTaskRequest.java | 264 ++++++++++-------- .../com/ruoyi/api/service/IApiService.java | 10 +- .../ruoyi/api/service/IRequestLogService.java | 2 + .../api/service/impl/ApiServiceImpl.java | 94 ++++--- .../service/impl/RequestLogServiceImpl.java | 53 ++++ .../main/java/com/ruoyi/common/Constant.java | 2 + .../queue/agv/mapper/AgvQueueMapper.java | 2 + .../queue/agv/service/IAgvQueueService.java | 2 + .../agv/service/impl/AgvQueueServiceImpl.java | 5 + .../mapper/device/AgvQueueMapper.xml | 5 + .../framework/config/SecurityConfig.java | 1 + 12 files changed, 298 insertions(+), 151 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java index 5c8f84c..d935934 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java @@ -7,6 +7,7 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.*; import java.util.Map; @@ -46,8 +47,14 @@ public class AgvController extends BaseController { * @return */ @PostMapping("/receiveAgvMoveJob") - public AjaxResult receiveAgvMoveJob(@RequestBody Map param) { + public int receiveAgvMoveJob(@RequestBody Map param) { return apiService.receiveAgvMoveJob(param); } +//@Scheduled(cron = "0/5 * * * * ?") + public void sendAgvTask(){ + apiService.sendAgvTask(); + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/agv/genAgvSchedulingTask/GenAgvSchedulingTaskRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/agv/genAgvSchedulingTask/GenAgvSchedulingTaskRequest.java index 46bea8d..60156f9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/agv/genAgvSchedulingTask/GenAgvSchedulingTaskRequest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/agv/genAgvSchedulingTask/GenAgvSchedulingTaskRequest.java @@ -14,143 +14,187 @@ import java.util.UUID; @Data public class GenAgvSchedulingTaskRequest { /** - * 请求编号 - * 同一个请求重复提交, 使用同一编号 + * 起始站点 */ - @NotNull - private String reqCode = UUID.randomUUID().toString(); + private String FromStation; + /** - * 请求时间 - * 格式: “yyyy-MM-dd HH:mm:ss” + * 目的站点 */ - private String reqTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + private String ToStation; + /** - * 客户端编号 - * 客户端编号,如PDA,HCWMS等 + * 任务类型(以实际的任务类型为准) */ - private String clientCode; + private String Type; + /** - * 令牌号 - * 由调度系统颁发 + * 类名 */ - private String tokenCode; + private String ClassName; + /** - * 任务类型 - * 内置任务类型: - * 厂内货架搬运: F01 - * 厂内货架空满交换: F02 - * 辊筒搬运接驳:F03 - * 厂内货架出库AGV待命:F04 - * 旋转货架: F05 - * 厂内电梯任务: F06 - * 以下为叉车专用任务类型 - * 高位货架到工作台: F11 - * 工作台到高位货架: F12 - * 巷道到工作台: F13 - * 工作台到巷道: F14 - * 高位货架到工作台(接驳) : F15 - * 工作台到高位货架 (接驳) : F16 - * 巷道到工作台(接驳) : F17 - * 工作台到巷道(接驳) : F18 - * 叉车电梯主任务: F20 + * 任务引导ID */ - @NotNull - private String taskTyp; + private String TaskGuideId; /** - * 容器类型(叉车/CTU专用) 叉车项目必传 + * 订单 ID */ - private String ctnrTyp; + private String OrderId; + /** - * 容器编号 (叉车/CTU专用) + * 触发ID */ - private String ctnrCode; // + private String TriggerId; + /** - * 容器数量(叉车堆叠专用),默认值1,仅记录堆叠的数量不记录堆叠的每个容器号 + * 扩展字段4 */ - private String ctnrNum; + private String Extend4; + /** - * 任务模式 - * 0-普通move 1-出库move 2-入库move 3-移库move + * 扩展字段5 */ - private String taskMode; + private String Extend5; + /** - * 工作位 - * 与RCS-2000端配置的位置名称一致, 工作位名称为字母\数字\或组合 + * 扩展字段6 */ - private String wbCode; + private String Extend6; + /** - * 位置路径 - * AGV关键路径位置集合,与任务类型中模板配置的位置路径一一对应。待现场地图部署、配置完成后可获取 + * 扩展字段7 */ - private List positionCodePath; + private String Extend7; + /** - * 货架编号 - * 不指定货架可以为空 + * 扩展字段8 */ - private String podCode; + private String Extend8; + /** - * 货架方向 - * “180”,”0”,”90”,”-90” 分别对应地图的”左”,”右”,”上”,”下” - * 不指定方向可以为空 - * 如果终点不是工作台或工作台未配置操作方向则货架拣货方向podDir作为终点方向 - * 如果工作台配有操作方向,则系统会根据货架拣货方向podDir和工作台操作方向计算货架终点方向 + * 扩展字段9 */ - private String podDir; + private String Extend9; + /** - * 货架类型, 传空时表示随机找个货架 - * 找空货架传参方式如下: - * -1: 代表不关心货架类型, 找到空货架即可. - * -2: 代表从工作位获取关联货架类型, 如果未配置, 只找空货架. - * 货架类型编号: 只找该货架类型的空货架 + * 任务附加信息 */ - private String podTyp; + private TaskAdditionallInfo TaskAdditionallInfo; + /** - * 物料批次 - * 物料批次或货架上的物料唯一编码,生成任务单时,货架与物料直接绑定时使用. (通过同时传podCode和materialLot来绑定或通过 wbCode 找到位置上的货架和materialLot来绑定) - * 如果是区域/策略内查找货架,可以匹配对应物料批次的货架,支持以下值: - * 0:区域/策略内查找空货架 - * 1:区域/策略内查找满货架 - * 其他值:查找指定物料批次对应的货架 - * 巷道任务通过该字段传入特征值 + * 任务附加信息类 */ - private String materialLot; - /** - * 优先级 - * 从(1~127)级,最大优先级最高。为空时,采用任务模板的优先级 - */ - private String priority; - /** - * AGV编号 - * 填写表示指定某一编号的AGV执行该任务 - */ - private String agvCode; - /** - * 任务单号 - * 选填, 不填系统自动生成 - */ - private String taskCode; - /** - * 组编号 - * CTU场景下用于按组出库,同组任务优先拼车。 如业务需要任务组间或组内按顺序出库,则需调用料箱顺序出库(CTU)接口。 - * 潜伏式场景下,通过组号来管理顺序出库的顺序,组号小的优先出库。 - */ - private String groupId; - /** - * 设备类型 - */ - private String agvTyp; - /** - * 选择策略 - * 区域/策略中挑选货架以及根据物料批次挑选货架时的先进先出规则,支持以下4个值: - * 1:按照货架到达储位的时间顺序,先进先出 - * 2:按照货架到达储位的时间顺序,先进后出 - * 9:按照货架绑定物料批次的时间顺序,先进先出 - * 10:按照货架绑定物料批次的时间顺序,先进后出 - */ - private String positionSelStrategy; - /** - * 自定义数据 - */ - private String data; - + @Data + public static class TaskAdditionallInfo { + /** + * 任务ID + */ + private String TaskId; + + /** + * 库存ID + */ + private String StockId; + + /** + * 任务引导ID + */ + private String TaskGuideId; + + /** + * 触发ID + */ + private String TriggerId; + + /** + * 下一任务添加阶段 + */ + private String NextTaskAddStage; + + /** + * 链ID + */ + private String ChainId; + + /** + * 链类型 + */ + private Integer ChainType; + + /** + * 链排序 + */ + private Integer ChainSort; + + /** + * 图号 + */ + private String FigureNo; + + /** + * 尺寸 + */ + private String Size; + + /** + * 箱号 + */ + private String BoxNo; + + /** + * 物料 + */ + private String Mater; + + /** + * 相关数量 + */ + private Integer RelatedCount; + + /** + * 序列号 + */ + private String SerialNo; + + /** + * 重量 + */ + private String Weight; + + /** + * 站点号 + */ + private String StationNo; + + /** + * 手动计数 + */ + private String HandCount; + + /** + * 批次 + */ + private String Batch; + + /** + * 前置相关任务ID + */ + private String PreviousRelatedTaskId; + + /** + * 下一相关任务ID + */ + private String NextRelatedTaskId; + + /** + * 级联任务开始 + */ + private String CascadeTaskBeginning; + + /** + * 级联任务结束 + */ + private String CascadeTaskEnding; + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java index bf04c65..41b4cda 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java @@ -34,11 +34,11 @@ public interface IApiService * @param code1 起点 * @param code2 终点 * @param wmsTrayCode 容器码 托盘料箱码/容器码 - * @param wmsTaskNo mydojob 任务 - * @param wmsTaskType 1-入库 2-出库 3-agv搬运 + * @param type mydojob 任务 + * @param jobId 1-入库 2-出库 3-agv搬运 * @return */ - public AgvQueue createAgvQueue(String code1,String code2,String wmsTrayCode,String taskCode,String wmsTaskType,String traySize,String wmsTaskNo); + public int createAgvQueue(String code1,String code2,String wmsTrayCode,String taskCode,String type,String jobId); /** * 取消AGV任务 @@ -76,7 +76,9 @@ public interface IApiService * @param param * @return */ - AjaxResult receiveAgvMoveJob(Map param); + int receiveAgvMoveJob(Map param); + + void sendAgvTask(); /** * 任务到达拣选口 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java index 25062d0..358ac51 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java @@ -68,6 +68,8 @@ public interface IRequestLogService */ public RequestLog getRequestLog(String url, String param, String endPoint); + public RequestLog getRequestLogAgv(String url, String endPoint, String param); + /** * 接收请求,并插入日志 * @param url diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java index 2278dc5..c0c0fb4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java @@ -62,17 +62,22 @@ public class ApiServiceImpl implements IApiService { */ @Override public GenAgvSchedulingTaskResponse genAgvSchedulingTask(GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest) { - RequestLog requestLog = requestLogService.getRequestLog(GEN_AGV_SCHEDULING_TASK, "生成AGV任务", JSONUtil.toJsonStr(genAgvSchedulingTaskRequest)); + RequestLog requestLog = requestLogService.getRequestLogAgv(CREATE_AGV_TASK_URL, "生成AGV任务", JSONUtil.toJsonStr(genAgvSchedulingTaskRequest)); if ("1".equals(requestLog.getIsSuccessful())) { - return BeanUtil.toBean(requestLog.getResponseBody(), GenAgvSchedulingTaskResponse.class); + GenAgvSchedulingTaskRequest bean = BeanUtil.toBean(requestLog.getResponseBody(), GenAgvSchedulingTaskRequest.class); + GenAgvSchedulingTaskResponse response = new GenAgvSchedulingTaskResponse(); + response.setCode(0); + response.setMessage("请求成功"); + response.setReqCode(genAgvSchedulingTaskRequest.getOrderId()); + return response; } else { //todo 需要调试 GenAgvSchedulingTaskResponse response = new GenAgvSchedulingTaskResponse(); response.setCode(500); response.setMessage("请求失败"); //todo 需要调试小车请求 - response.setCode(0); - response.setMessage("模拟测试"); +// response.setCode(0); +// response.setMessage("模拟测试"); return response; } } @@ -111,18 +116,39 @@ public class ApiServiceImpl implements IApiService { * @return */ @Override - public AjaxResult receiveAgvMoveJob(Map param) { + public int receiveAgvMoveJob(Map param) { String startPoint = param.get("startPoint"); String endPoint = param.get("endPoint"); - String traySize = param.get("traySize"); - String wmsTaskNo = param.get("wmsTaskNo"); + String type = param.get("type"); + String jobId = param.get("jobId"); - AgvQueue agvQueue = createAgvQueue(startPoint, endPoint, param.get("trayCode"), param.get("taskNo"), "1", traySize, wmsTaskNo); - GenAgvSchedulingTaskResponse genAgvSchedulingTaskResponse = requestAgvQueue(agvQueue); - if (genAgvSchedulingTaskResponse.getCode() == 0) { - return AjaxResult.success(); + int i = createAgvQueue(startPoint, endPoint, param.get("trayCode"), param.get("taskNo"), type,jobId); + + return i; +// GenAgvSchedulingTaskResponse genAgvSchedulingTaskResponse = requestAgvQueue(agvQueue); +// if (genAgvSchedulingTaskResponse.getCode() == 0) { +// return AjaxResult.success(); +// } +// return AjaxResult.error(genAgvSchedulingTaskResponse.getMessage()); + + } + + @Override + public void sendAgvTask() { + AgvQueue agvQueue = agvQueueService.selectAgvQueueByStatus(); + if (agvQueue != null) { + GenAgvSchedulingTaskResponse genAgvSchedulingTaskResponse = requestAgvQueue(agvQueue); + + if (genAgvSchedulingTaskResponse.getCode() == 0) { + agvQueue.setStatus("1"); + agvQueueService.updateAgvQueue(agvQueue); + agvQueueService.insertHistory(agvQueue.getReqCode()); + + }else{ + agvQueue.setStatus("2"); + agvQueueService.updateAgvQueue(agvQueue); + } } - return AjaxResult.error(genAgvSchedulingTaskResponse.getMessage()); } @@ -242,12 +268,12 @@ public class ApiServiceImpl implements IApiService { * @param code1 起点 * @param code2 终点 * @param wmsTrayCode 容器码 托盘料箱码/容器码 - * @param wmsTaskNo mydojob 任务 - * @param wmsTaskType 1-入库 2-出库 3-agv搬运 + * @param type mydojob 任务 + * @param jobId 1-入库 2-出库 3-agv搬运 * @return */ @Override - public AgvQueue createAgvQueue(String code1, String code2, String wmsTrayCode, String taskCode, String wmsTaskType, String traySize, String wmsTaskNo) { + public int createAgvQueue(String code1, String code2, String wmsTrayCode, String taskCode,String type,String jobId) { //生成ctu执行队列 AgvQueue agvQueue = new AgvQueue(); String reqCode = IdUtil.fastSimpleUUID(); @@ -257,20 +283,21 @@ public class ApiServiceImpl implements IApiService { agvQueue.setAgvType("AGV"); agvQueue.setPositionCode1(code1); agvQueue.setPositionCode2(code2); - agvQueue.setTaskType("F01"); - agvQueue.setCtnrType(traySize); + agvQueue.setTaskType(type); + agvQueue.setCtnrType("0"); agvQueue.setCtnrCode("0"); agvQueue.setCtnrNum("0"); agvQueue.setTaskMode("0"); agvQueue.setPriority("10"); agvQueue.setRequest("0"); agvQueue.setWmsTraycode(wmsTrayCode); - agvQueue.setWmsTaskNo(wmsTaskNo); + agvQueue.setWmsTaskNo(taskCode); agvQueue.setStatus("0"); - agvQueue.setTaskCode(taskCode); - agvQueue.setWmsTaskType(wmsTaskType); - agvQueueService.insertAgvQueue(agvQueue); - return agvQueue; + agvQueue.setTaskCode(jobId); + agvQueue.setWmsTaskType("0"); + int i = agvQueueService.insertAgvQueue(agvQueue); + return i; + } /** @@ -317,20 +344,15 @@ public class ApiServiceImpl implements IApiService { public GenAgvSchedulingTaskResponse requestAgvQueue(AgvQueue agvQueue) { //todo 请求ctu GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest = new GenAgvSchedulingTaskRequest(); - genAgvSchedulingTaskRequest.setReqCode(agvQueue.getReqCode()); - genAgvSchedulingTaskRequest.setTaskMode("0"); - genAgvSchedulingTaskRequest.setPriority("10"); - genAgvSchedulingTaskRequest.setTaskTyp("F01"); - genAgvSchedulingTaskRequest.setCtnrCode("0"); - genAgvSchedulingTaskRequest.setCtnrNum("0"); - genAgvSchedulingTaskRequest.setTaskMode("0"); - genAgvSchedulingTaskRequest.setTaskCode(agvQueue.getTaskCode()); - genAgvSchedulingTaskRequest.setAgvTyp("AGV"); - genAgvSchedulingTaskRequest.setPositionSelStrategy("0"); - List positionCodePath = new ArrayList<>(); - positionCodePath.add(new PositionCodeData(agvQueue.getPositionCode1(), "0")); - positionCodePath.add(new PositionCodeData(agvQueue.getPositionCode2(), "0")); - genAgvSchedulingTaskRequest.setPositionCodePath(positionCodePath); + genAgvSchedulingTaskRequest.setFromStation(agvQueue.getPositionCode1()); + genAgvSchedulingTaskRequest.setToStation(agvQueue.getPositionCode2()); + genAgvSchedulingTaskRequest.setOrderId(agvQueue.getTaskCode()); + genAgvSchedulingTaskRequest.setType(agvQueue.getTaskType()); + genAgvSchedulingTaskRequest.setTaskGuideId("00000000-0000-0000-0000-000000000000"); + genAgvSchedulingTaskRequest.setTriggerId("00000000-0000-0000-0000-000000000000"); + GenAgvSchedulingTaskRequest.TaskAdditionallInfo taskAdditionallInfo = new GenAgvSchedulingTaskRequest.TaskAdditionallInfo(); + genAgvSchedulingTaskRequest.setTaskAdditionallInfo(taskAdditionallInfo); + return genAgvSchedulingTask(genAgvSchedulingTaskRequest); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java index 0e7a619..ffd6ea9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java @@ -6,6 +6,8 @@ import java.util.List; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; import com.ruoyi.api.domain.InterfaceReceive; @@ -137,6 +139,7 @@ public class RequestLogServiceImpl implements IRequestLogService requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS))); requestLog.setIsSuccessful("1"); }else { + requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss")); requestLog.setResponseStatus("0"); requestLog.setErrorDetails(bean.getMsg()); requestLog.setIsSuccessful("0"); @@ -152,6 +155,56 @@ public class RequestLogServiceImpl implements IRequestLogService return requestLog; } + @Override + public RequestLog getRequestLogAgv(String url, String endPoint, String param) { + RequestLog requestLog = new RequestLog(); + Date requestTime = new Date(); + requestLog.setRequestTime(DateUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss")); + requestLog.setSourceSystem("wms"); + requestLog.setTargetSystem("agv"); + requestLog.setEndpoint(endPoint); + requestLog.setRequestMethod("post"); + requestLog.setRequestHeaders(null); + requestLog.setRequestBody(param); + requestLog.setRequestUrl(url); + try { + // 使用HttpRequest获取HTTP状态码 + HttpResponse response = HttpRequest.post(url) + .body(param) + .timeout(5000) + .execute(); + + int httpStatusCode = response.getStatus(); + String resStr = response.body(); + + requestLog.setResponseBody(resStr); + Date responseTime = new Date(); + + // 判断HTTP状态码是否成功(200-299都算成功) + if (httpStatusCode == 200) { + requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss")); + requestLog.setResponseStatus(String.valueOf(httpStatusCode)); + requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS))); + requestLog.setIsSuccessful("1"); + + + } else { + requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss")); + requestLog.setResponseStatus(String.valueOf(httpStatusCode)); + requestLog.setErrorDetails("HTTP请求失败,状态码: " + httpStatusCode); + requestLog.setIsSuccessful("0"); + } + + } catch (Exception e) { + requestLog.setErrorDetails(e.getMessage()); + requestLog.setIsSuccessful("0"); + requestLog.setResponseStatus("0"); + } finally { + insertRequestLog(requestLog); + } + return requestLog; + } + /** * 插入请求日志 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java b/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java index c608642..d71c5e4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java @@ -5,6 +5,7 @@ public class Constant { public static final String WMS_BASE_URL = "http://localhost:8080/api2wms/"; public static final String RCS_BASE_URL = "http://127.0.0.1:8081/rcms-dps/rest/"; + public static final String AGV_BASE_URL = "http://127.0.0.1:9501/api/app/agvs-task"; public static final String JOB_FINISH_URL = WMS_BASE_URL+"jobFinish"; @@ -17,6 +18,7 @@ public class Constant { public static final String RE_ASSIGN_URL = WMS_BASE_URL+"reAssign"; public static final String RE_MATERIAL_URL = WMS_BASE_URL+"reMaterial"; public static final String REQUEST_ENTER_URL = WMS_BASE_URL+"requestEnterByTrayCodeAndEntranceId"; + public static final String CREATE_AGV_TASK_URL = AGV_BASE_URL+"agvs-task"; public static final String WAREHOUSE_01 = "01"; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java index 7cedfad..4fc1694 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java @@ -66,5 +66,7 @@ public interface AgvQueueMapper */ AgvQueue selectAgvQueueByTaskCode(String taskCode); + AgvQueue selectAgvQueueByStatus(); + void insertHistory(String reqCode); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java index 0e565c1..49d2649 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java @@ -66,6 +66,8 @@ public interface IAgvQueueService */ AgvQueue selectAgvQueueByTaskCode(String taskCode); + AgvQueue selectAgvQueueByStatus(); + /** * 插入agv完成历史 * @param reqCode diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java index df2bc6f..1351d39 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java @@ -96,6 +96,11 @@ public class AgvQueueServiceImpl implements IAgvQueueService return agvQueueMapper.selectAgvQueueByTaskCode(taskCode); } + @Override + public AgvQueue selectAgvQueueByStatus() { + return agvQueueMapper.selectAgvQueueByStatus(); + } + @Override public void insertHistory(String reqCode) { agvQueueMapper.insertHistory(reqCode); diff --git a/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml b/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml index a362e8b..8257c49 100644 --- a/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml @@ -62,6 +62,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where task_code = #{taskCode} + + insert into agv_queue diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 3f68194..a15c567 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -119,6 +119,7 @@ public class SecurityConfig .antMatchers("/agv/api/**").permitAll() .antMatchers("/device/api/**").permitAll() .antMatchers("/wcs2Wms/api/**").permitAll() + .antMatchers("/agv/api/**").permitAll() .antMatchers("/test/**").permitAll() .antMatchers("/largeScreen/monitor/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 From d98fe2a30cd2af735b7cf2be5cff87be95cb2080 Mon Sep 17 00:00:00 2001 From: "1009473166@qq.com" <草拟吗23> Date: Thu, 19 Mar 2026 18:44:54 +0800 Subject: [PATCH 09/11] =?UTF-8?q?2026.3.19=20=E6=99=9A=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=87=BA=E5=BA=93=E5=88=B0=E4=BD=8D=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=BF=87=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/api/service/IApiService.java | 2 ++ .../api/service/impl/ApiServiceImpl.java | 11 ++++++++++ .../main/java/com/ruoyi/common/Constant.java | 5 ++++- .../scheduleTask/srgv/BaseSRgvThread.java | 9 ++++---- .../schedule/scheduleTask/ssj/SsjThread.java | 22 +++++++++---------- 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java index 08bce48..5daa7a6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java @@ -143,4 +143,6 @@ public interface IApiService DeviceSsj getDeviceMsg(String taskNo); DeviceSsj getDeviceMsgSsj(String entranceId); + + AjaxResult OutMakeSure(HashMap map); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java index 8833d1f..74c67c5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java @@ -490,4 +490,15 @@ public class ApiServiceImpl implements IApiService { List deviceSsjs = deviceSsjService.selectDeviceSsjList(ssj); return deviceSsjs.get(0); } + + @Override + public AjaxResult OutMakeSure(HashMap param) { + RequestLog requestLog = requestLogService.getRequestLog(OUT_MAKE_SURE, "线边直出请求过账", JSONUtil.toJsonStr(param)); + if ("1".equals(requestLog.getIsSuccessful())) { + InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class); + return AjaxResult.success(bean.getData()); + } else { + return AjaxResult.error(); + } + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java b/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java index d71c5e4..4ee198b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java @@ -1,12 +1,14 @@ package com.ruoyi.common; +import org.springframework.security.access.method.P; + public class Constant { public static final String WMS_BASE_URL = "http://localhost:8080/api2wms/"; public static final String RCS_BASE_URL = "http://127.0.0.1:8081/rcms-dps/rest/"; public static final String AGV_BASE_URL = "http://127.0.0.1:9501/api/app/agvs-task"; - + public static final String WMS_BASE_PDA_URL = "http://localhost:8080/pda/"; public static final String JOB_FINISH_URL = WMS_BASE_URL+"jobFinish"; public static final String CONTINUE_TASK_URL = RCS_BASE_URL+"continueTask"; @@ -19,6 +21,7 @@ public class Constant { public static final String RE_MATERIAL_URL = WMS_BASE_URL+"reMaterial"; public static final String REQUEST_ENTER_URL = WMS_BASE_URL+"requestEnterByTrayCodeAndEntranceId"; public static final String CREATE_AGV_TASK_URL = AGV_BASE_URL+"agvs-task"; + public static final String OUT_MAKE_SURE=WMS_BASE_PDA_URL+"outMakeSure"; public static final String WAREHOUSE_01 = "01"; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java index c250243..5d7d969 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java @@ -322,8 +322,6 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { // 最终选中的小车赋值给deviceSrgv(保持原有变量名兼容) deviceSrgv = bestSrgv; - - if (deviceSrgv == null) { //如果未选择到小车,再找其他楼层的小车 for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { @@ -1475,8 +1473,11 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { jobCallBack.setTaskNo(Convert.toLong(mydoJobOut.getTaskNo())); jobCallBack.setCreateTime(new Date()); jobCallBackService.insertJobCallBack(jobCallBack); - mydoJobService.insertHistory(mydoJobOut.getJobId()); - mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId()); + // 不是线边整托线边直出的删除作业 + if (!mydoJobOut.getInOrOut().equals("22")) { + mydoJobService.insertHistory(mydoJobOut.getJobId()); + mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId()); + } } case "7"://移库,变动库存 MydoJob mydoJobyk = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java index 91b0b69..81540f5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java @@ -106,19 +106,17 @@ public class SsjThread implements Runnable { void inDispatch(DeviceSsj deviceSsj) { //出库到位 if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 0) { - MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(deviceSsj.getTaskNo())); - if (mydoJob != null) { - log.info("设备:{} 位置:{} 任务号:{} 出库到位", "输送线", deviceSsj.getDeviceCode(), mydoJob.getTaskNo()); - mydoJobService.insertHistory(mydoJob.getJobId()); - mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId()); - JobCallBack jobCallBack = new JobCallBack(); - jobCallBack.setType("2"); - jobCallBack.setMydojobId(mydoJob.getJobId()); - jobCallBack.setStatus("0"); - jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); - jobCallBack.setCreateTime(new Date()); - jobCallBackService.insertJobCallBack(jobCallBack); + if (mydoJob != null && mydoJob.getInOrOut().equals("22")) { + // 新增agv执行队列,以及调用wms后台任务过账 + HashMap map = new HashMap<>(); + map.put("trayCode", mydoJob.getTrayCode()); + //拉取 + AjaxResult ajaxResult = apiService.OutMakeSure(map); + if (ajaxResult.get("code").equals("200")) { + mydoJobService.insertHistory(mydoJob.getJobId()); + mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId()); + } } } } From 72b88ed0e33165e2c4992edcd88ab853850ad55b Mon Sep 17 00:00:00 2001 From: zgw <13623675548@163.com> Date: Fri, 24 Jul 2026 08:51:41 +0800 Subject: [PATCH 10/11] chore: upload current WCS changes --- pom.xml | 2 +- .../main/java/com/ruoyi/MyStartupRunner.java | 21 + .../main/java/com/ruoyi/RuoYiApplication.java | 4 + .../algorithm/controller/TidyController.java | 30 + .../ruoyi/algorithm/service/ITidyService.java | 8 + .../service/impl/TidyServiceImpl.java | 29 + .../ruoyi/api/controller/AgvController.java | 122 +- .../api/controller/Wcs2WmsController.java | 9 + .../ruoyi/api/domain/wcs2wms/ReceiveJob.java | 3 + .../domain/wcs2wms/SrgvVehicleSnapshot.java | 23 + .../com/ruoyi/api/service/IApiService.java | 20 + .../ruoyi/api/service/IRequestLogService.java | 2 + .../api/service/impl/ApiServiceImpl.java | 150 +- .../service/impl/RequestLogServiceImpl.java | 77 +- .../bas/srgvmap/mapper/WcsSrgvMapMapper.java | 6 + .../srgvmap/service/IWcsSrgvMapService.java | 3 + .../bas/srgvmap/service/RoadCacheService.java | 5 +- .../service/impl/RoadCacheServiceImpl.java | 32 +- .../service/impl/WcsSrgvMapServiceImpl.java | 42 +- .../main/java/com/ruoyi/common/Constant.java | 14 +- .../device/cdz/mapper/DeviceCdzMapper.java | 2 + .../device/cdz/service/IDeviceCdzService.java | 2 + .../service/impl/DeviceCdzServiceImpl.java | 5 + .../ruoyi/device/ssj/domain/DeviceSsj.java | 2 + .../job/controller/MydoJobController.java | 41 +- .../java/com/ruoyi/job/domain/MydoJob.java | 14 +- .../com/ruoyi/job/mapper/MydoJobMapper.java | 22 + .../ruoyi/job/service/IMydoJobService.java | 20 + .../job/service/impl/MydoJobServiceImpl.java | 51 + .../queue/agv/mapper/AgvQueueMapper.java | 3 + .../queue/agv/service/IAgvQueueService.java | 3 + .../agv/service/impl/AgvQueueServiceImpl.java | 6 + .../queue/srgv/mapper/WcsSrgvQueueMapper.java | 11 + .../srgv/service/IWcsSrgvQueueService.java | 8 + .../service/impl/WcsSrgvQueueServiceImpl.java | 47 +- .../mapper/TsjDeviceExecutionQueueMapper.java | 2 + .../ITsjDeviceExecutionQueueService.java | 2 + .../TsjDeviceExecutionQueueServiceImpl.java | 5 + .../schedule/plcRead/cdz/PlcCdzRead.java | 10 +- .../schedule/plcRead/ddj/PlcDdjRead.java | 4 +- .../schedule/plcRead/srgv/PlcSrgvRead.java | 60 +- .../plcRead/srgv/roadUtil/PathFinder.java | 1 + .../schedule/plcRead/ssj/PlcSsjRead.java | 28 +- .../schedule/plcRead/tsj/PlcTsjRead.java | 4 +- .../schedule/scheduleTask/cdz/CdzThread.java | 166 ++- .../scheduleTask/monit/MonitoringThread.java | 6 +- .../scheduleTask/srgv/BaseSRgvThread.java | 1325 ++++++++++++----- .../schedule/scheduleTask/ssj/SsjThread.java | 189 ++- .../schedule/scheduleTask/tsj/TsjThread.java | 136 +- .../AgvContainerTaskController.java | 104 ++ .../ruoyi/system/domain/AgvContainerTask.java | 173 +++ .../system/mapper/AgvContainerTaskMapper.java | 68 + .../service/IAgvContainerTaskService.java | 63 + .../impl/AgvContainerTaskServiceImpl.java | 100 ++ .../java/com/ruoyi/tcp/GetDeviceSrgvMap.java | 8 +- .../java/com/ruoyi/tcp/GetDeviceSsjMap.java | 21 +- .../java/com/ruoyi/tcp/GetDeviceTsjMap.java | 2 +- .../ruoyi/tcp/Wcs2wmsgetEmptyCargoSpace.java | 2 + .../src/main/resources/application-druid.yml | 4 +- .../src/main/resources/application.yml | 4 +- .../resources/mapper/bas/WcsSrgvMapMapper.xml | 25 + .../mapper/device/AgvQueueMapper.xml | 9 + .../mapper/device/DeviceCdzMapper.xml | 5 + .../mapper/device/DeviceSrgvMapper.xml | 4 +- .../resources/mapper/job/MydoJobMapper.xml | 98 +- .../queue/TsjDeviceExecutionQueueMapper.xml | 7 + .../mapper/queue/WcsSrgvQueueMapper.xml | 43 +- .../mapper/system/AgvContainerTaskMapper.xml | 116 ++ .../ruoyi/common/core/domain/AjaxResult.java | 4 +- .../framework/config/SecurityConfig.java | 2 +- ruoyi-ui/src/api/algorithm/tidy.js | 9 + ruoyi-ui/src/views/algorithm/tidy/index.vue | 33 + ruoyi-ui/vue.config.js | 1 + 73 files changed, 2989 insertions(+), 693 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/MyStartupRunner.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/algorithm/controller/TidyController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/algorithm/service/ITidyService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/algorithm/service/impl/TidyServiceImpl.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/SrgvVehicleSnapshot.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/system/controller/AgvContainerTaskController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/system/domain/AgvContainerTask.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/system/mapper/AgvContainerTaskMapper.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/system/service/IAgvContainerTaskService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/AgvContainerTaskServiceImpl.java create mode 100644 ruoyi-admin/src/main/resources/mapper/system/AgvContainerTaskMapper.xml create mode 100644 ruoyi-ui/src/api/algorithm/tidy.js create mode 100644 ruoyi-ui/src/views/algorithm/tidy/index.vue diff --git a/pom.xml b/pom.xml index 589d24f..950dfb5 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ 5.3.39 5.8.27 1.18.30 - 3.7.0 + 2.0.0 3.5.2 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/MyStartupRunner.java b/ruoyi-admin/src/main/java/com/ruoyi/MyStartupRunner.java new file mode 100644 index 0000000..6ecbdd8 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/MyStartupRunner.java @@ -0,0 +1,21 @@ +package com.ruoyi; + +import com.ruoyi.schedule.ScheduleThread; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class MyStartupRunner implements CommandLineRunner { + + @Autowired + private ScheduleThread scheduleThread; + + @Override + public void run(String... args) throws Exception { + // 这里编写项目启动后要执行的方法逻辑 + //System.out.println("项目启动成功后自动执行此方法"); +// scheduleThread.startAllThread(); +// scheduleThread.startAllThread2(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java index e95a574..5bcd40a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java @@ -1,5 +1,6 @@ package com.ruoyi; +import com.ruoyi.schedule.ScheduleThread; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,6 +8,8 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; +import javax.annotation.Resource; + /** * 启动程序 * @@ -17,6 +20,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableAsync public class RuoYiApplication { + public static void main(String[] args) { // System.setProperty("spring.devtools.restart.enabled", "false"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/algorithm/controller/TidyController.java b/ruoyi-admin/src/main/java/com/ruoyi/algorithm/controller/TidyController.java new file mode 100644 index 0000000..b542fb3 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/algorithm/controller/TidyController.java @@ -0,0 +1,30 @@ +package com.ruoyi.algorithm.controller; + +import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.algorithm.service.ITidyService; +import com.ruoyi.common.core.domain.AjaxResult; + +@RestController +@RequestMapping("/algorithm/tidy") +public class TidyController { + @Autowired + private ITidyService tidyService; + + @PreAuthorize("@ss.hasPermi('algorithm:tidy:query')") + @GetMapping("/status") + public AjaxResult status() { return AjaxResult.success(tidyService.getStatus()); } + + @PreAuthorize("@ss.hasPermi('algorithm:tidy:edit')") + @PutMapping("/mode") + public AjaxResult mode(@RequestBody Map body) { + try { return AjaxResult.success(tidyService.updateMode(body == null ? null : body.get("mode"))); } + catch (IllegalArgumentException ex) { return AjaxResult.error(ex.getMessage()); } + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/algorithm/service/ITidyService.java b/ruoyi-admin/src/main/java/com/ruoyi/algorithm/service/ITidyService.java new file mode 100644 index 0000000..b1aa956 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/algorithm/service/ITidyService.java @@ -0,0 +1,8 @@ +package com.ruoyi.algorithm.service; + +import java.util.Map; + +public interface ITidyService { + Map getStatus(); + Map updateMode(String mode); +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/algorithm/service/impl/TidyServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/algorithm/service/impl/TidyServiceImpl.java new file mode 100644 index 0000000..86741a6 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/algorithm/service/impl/TidyServiceImpl.java @@ -0,0 +1,29 @@ +package com.ruoyi.algorithm.service.impl; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; +import org.springframework.stereotype.Service; +import com.ruoyi.algorithm.service.ITidyService; + +@Service +public class TidyServiceImpl implements ITidyService { + private final AtomicReference mode = new AtomicReference<>("AUTO"); + + @Override + public Map getStatus() { + Map result = new LinkedHashMap<>(); + result.put("mode", mode.get()); + result.put("enabled", true); + return result; + } + + @Override + public Map updateMode(String requestedMode) { + if (requestedMode == null || !("AUTO".equalsIgnoreCase(requestedMode) || "MANUAL".equalsIgnoreCase(requestedMode))) { + throw new IllegalArgumentException("mode must be AUTO or MANUAL"); + } + mode.set(requestedMode.toUpperCase()); + return getStatus(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java index 5c8f84c..6590360 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java @@ -1,30 +1,43 @@ package com.ruoyi.api.controller; +import cn.hutool.json.JSONObject; +import com.mchange.v2.lang.ObjectUtils; import com.ruoyi.api.domain.agv.agvCallback.AgvCallbackRequest; import com.ruoyi.api.domain.agv.agvCallback.AgvCallbackResponse; import com.ruoyi.api.service.IApiService; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.queue.agv.service.impl.AgvQueueServiceImpl; +import com.ruoyi.system.domain.AgvContainerTask; +import com.ruoyi.system.mapper.AgvContainerTaskMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; +import java.util.List; import java.util.Map; /** * Agv操作请求 */ @RestController -@RequestMapping("/agv/api") +@RequestMapping("/api/agv") @Slf4j public class AgvController extends BaseController { @Autowired private IApiService apiService; + @Autowired + private AgvQueueServiceImpl agvQueueService; + @Autowired + private AgvContainerTaskMapper agvContainerTaskMapper; /** * agv执行状态返回接口 + * * @param request * @return */ @@ -34,15 +47,14 @@ public class AgvController extends BaseController { } - /** * agv搬运作业 - * @param param{ - * startPoint:起始点 - * endPoint:结束点 - * containerCode:容器编号 - * taskNo:任务号 - * } + * + * @param param{ startPoint:起始点 + * endPoint:结束点 + * containerCode:容器编号 + * taskNo:任务号 + * } * @return */ @PostMapping("/receiveAgvMoveJob") @@ -50,4 +62,98 @@ public class AgvController extends BaseController { return apiService.receiveAgvMoveJob(param); } + + /** + * 获取AGV任务定时器 + */ + + @Scheduled(fixedDelay = 5000) + public void queryAgvMoveJob() { + apiService.sendContarTask(); + } + + @Scheduled(fixedDelay = 5000) + public void finishAgvMoveJob() { + AgvContainerTask agvContainerTask= agvContainerTaskMapper.selectAgvContainerFinishOne(); + if (agvContainerTask!=null){ + apiService.finishAgvJob(agvContainerTask.getContainer()); + } + + } + + + /**任务下发 + * + */ + @Scheduled(fixedDelay = 1000) + public void sendAgvMoveJob() { + AgvContainerTask agvContainerTask = new AgvContainerTask(); + agvContainerTask.setStatus("0"); + List agvContainerTasks = agvContainerTaskMapper.selectAgvContainerTaskList(agvContainerTask); + if (agvContainerTasks.size() > 0) { + AgvContainerTask agvContainerTask1 = agvContainerTasks.get(0); + Map param = new HashMap<>(); + param.put("FromStation", agvContainerTask1.getStartPoint()); + param.put("ToStation", agvContainerTask1.getEndPoint()); + param.put("Type", agvContainerTask1.getSpare1()); + param.put("OrderId", agvContainerTask1.getContainer()); +// param.put("TaskGuideId", agvContainerTask1.getTaskNo()); + AjaxResult ajaxResult = apiService.sendAgvCar(param); + Integer code = (Integer) ajaxResult.get("code"); + if (200 == code) { + agvContainerTask1.setStatus("1"); + agvContainerTaskMapper.updateAgvContainerTask(agvContainerTask1); + } + } + } + + + /*** + * 请求取货放货接口 + * @param jsonObject + * @return + */ + @RequestMapping("/checkAllow") + public AjaxResult checkAllow(@RequestBody JSONObject jsonObject) { + // 取放货站点 + String requestStation = String.valueOf(jsonObject.get("requestStation")); + // 表内主键 + String orderId = String.valueOf(jsonObject.get("orderId")); + String Type = String.valueOf(jsonObject.get("type")); + + HashMap map = new HashMap<>(); + map.put("v_position", requestStation); + map.put("v_orderId", orderId); + map.put("v_type", Type); + agvQueueService.selectKx(map); + Integer vResult = (Integer) map.get("v_result"); + if (vResult == 1) { + return new AjaxResult(1, Type.equals("1") ? "允许取货" : "允许放货"); + } else { + return new AjaxResult(0, Type.equals("1") ? "不允许取货,请等待" : "不允许放货,请等待"); + } + } + + + /** + * 取货放货完成返回接口 + * + * @param jsonObject + * @return + */ + @RequestMapping("/completionSignal") + public AjaxResult completionSignal(@RequestBody JSONObject jsonObject) { + + String orderId = String.valueOf(jsonObject.get("orderId")); + String Type = String.valueOf(jsonObject.get("type")); + + + agvContainerTaskMapper.updateAgvContainerTaskByOrder(orderId); +// agvContainerTaskMapper.insertAgvContainerTaskFinish(orderId); +// agvContainerTaskMapper.deleteAgvContainerTaskByContainer(orderId); + + return new AjaxResult(1, "返回成功"); + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/Wcs2WmsController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/Wcs2WmsController.java index e7c86d0..86df745 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/Wcs2WmsController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/Wcs2WmsController.java @@ -1,10 +1,12 @@ package com.ruoyi.api.controller; +import cn.hutool.json.JSONObject; import com.ruoyi.api.domain.wcs2wms.JobParam; import com.ruoyi.api.domain.wcs2wms.ReceiveJob; import com.ruoyi.api.service.IApiService; import com.ruoyi.common.core.domain.AjaxResult; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -51,6 +53,13 @@ public class Wcs2WmsController { return apiService.cancelMydoJob(jobParam); } + /** Return a read-only snapshot of all S-RGV vehicles. */ + @PostMapping("/tidyVehicleSnapshot") + public AjaxResult tidyVehicleSnapshot() { + return apiService.tidyVehicleSnapshot(); + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java index a8d968a..879b0a2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/ReceiveJob.java @@ -10,11 +10,14 @@ import lombok.NoArgsConstructor; public class ReceiveJob { private String taskNo; private String cargoSpaceId; + private String targetCargoSpaceId; private String exitId; private String trayCode; private String entranceId; private String inOrOut; private String jobId; private String roadwayId; + private String classId; + private Long priority; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/SrgvVehicleSnapshot.java b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/SrgvVehicleSnapshot.java new file mode 100644 index 0000000..03fc6ce --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/wcs2wms/SrgvVehicleSnapshot.java @@ -0,0 +1,23 @@ +package com.ruoyi.api.domain.wcs2wms; + +import lombok.Data; + +/** Read-only vehicle status snapshot exposed to WMS. */ +@Data +public class SrgvVehicleSnapshot { + private String guid; + private Integer deviceId; + private String deviceName; + private String agvStatus; + private Boolean online; + private Boolean healthy; + private Boolean idle; + private Integer taskNo; + private Integer alarm; + private Integer errMsg; + private Integer chargeFlag; + private Integer locked; + private Integer battery; + private String currSite; + private Integer currFloor; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java index 6f13e91..45200c3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java @@ -121,6 +121,10 @@ public interface IApiService */ public AjaxResult createInMydoJob(Map param); + public AjaxResult sendCargoSpace(Map param); + + + public AjaxResult selectMydoJobByNoTrayCode(Map param); AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob); @@ -132,4 +136,20 @@ public interface IApiService AjaxResult allotSpace(JobParam jobParam); AjaxResult JobFinish(Map param); + + AjaxResult OutMakeSure(HashMap map); + + void updateLed(HashMap objectObjectHashMap); + + void updateLedError(HashMap objectObjectHashMap); + + void sendContarTask(); + + AjaxResult sendAgvCar(Map param); + + AjaxResult insertAgvQuene(HashMap objectObjectHashMap); + + void finishAgvJob(String container); + + AjaxResult tidyVehicleSnapshot(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java index 25062d0..49d4047 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java @@ -75,4 +75,6 @@ public interface IRequestLogService * @return */ public RequestLog getRequestLog(String url, String param); + + public RequestLog getRequestLogs(String url, String param, String endPoint); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java index 87e90ea..5a5a65f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java @@ -17,6 +17,9 @@ import com.ruoyi.api.domain.agv.genAgvSchedulingTask.GenAgvSchedulingTaskRespons import com.ruoyi.api.domain.agv.genAgvSchedulingTask.PositionCodeData; import com.ruoyi.api.domain.wcs2wms.JobParam; import com.ruoyi.api.domain.wcs2wms.ReceiveJob; +import com.ruoyi.api.domain.wcs2wms.SrgvVehicleSnapshot; +import com.ruoyi.device.srgv.domain.DeviceSrgv; +import com.ruoyi.device.srgv.mapper.DeviceSrgvMapper; import com.ruoyi.api.service.IApiService; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; @@ -24,6 +27,8 @@ import com.ruoyi.job.domain.MydoJob; import com.ruoyi.job.service.IMydoJobService; import com.ruoyi.queue.agv.domain.AgvQueue; import com.ruoyi.queue.agv.service.IAgvQueueService; +import com.ruoyi.system.domain.AgvContainerTask; +import com.ruoyi.system.service.IAgvContainerTaskService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -51,7 +56,10 @@ public class ApiServiceImpl implements IApiService { private IAgvQueueService agvQueueService; @Autowired private IMydoJobService mydoJobService; - + @Autowired + private IAgvContainerTaskService agvContainerTaskService; + @Autowired + private DeviceSrgvMapper deviceSrgvMapper; /** @@ -138,10 +146,6 @@ public class ApiServiceImpl implements IApiService { } - - - - /** * 处理agv状态返回 * @@ -196,26 +200,24 @@ public class ApiServiceImpl implements IApiService { public AjaxResult cancelMydoJob(JobParam jobParam) { MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(jobParam.getTaskNo())); - if(mydoJob==null){ + if (mydoJob == null) { return AjaxResult.error("任务不存在"); } - if("1".equals(mydoJob.getStatus())){ + if ("1".equals(mydoJob.getStatus())) { mydoJob.setStatus("5"); mydoJobService.insertHistory(mydoJob.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId()); return AjaxResult.success(); - }else{ + } else { return AjaxResult.error("任务已开始"); } } - - @Override public AjaxResult reAssign(JobParam jobParam) { RequestLog requestLog = requestLogService.getRequestLog(RE_ASSIGN_URL, "重新分配货位", JSONUtil.toJsonStr(jobParam)); - if ("1".equals(requestLog.getIsSuccessful())){ + if ("1".equals(requestLog.getIsSuccessful())) { InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class); MydoJob wmsMydoJob = BeanUtil.toBean(bean.getData(), MydoJob.class); MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(wmsMydoJob.getJobId()); @@ -229,7 +231,7 @@ public class ApiServiceImpl implements IApiService { @Override public AjaxResult reMaterial(JobParam jobParam) { RequestLog requestLog = requestLogService.getRequestLog(RE_MATERIAL_URL, "重新分配物料", JSONUtil.toJsonStr(jobParam)); - if ("1".equals(requestLog.getIsSuccessful())){ + if ("1".equals(requestLog.getIsSuccessful())) { return AjaxResult.success(); } return AjaxResult.error(); @@ -347,12 +349,26 @@ public class ApiServiceImpl implements IApiService { } + @Override + public AjaxResult sendCargoSpace(Map param) { + // 访问请求路径,生成入库作业 ,如果生成返回信息 + RequestLog requestLog = requestLogService.getRequestLog(SEND_CARGOSPACE, "请求分配货位", JSONUtil.toJsonStr(param)); + if ("1".equals(requestLog.getIsSuccessful())) { + InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class); + return AjaxResult.success(bean.getData()); + } else { + return AjaxResult.error(); + } + } + + @Override public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) { MydoJob mydoJob = new MydoJob(); mydoJob.setJobId(receiveOutJob.getJobId()); mydoJob.setTaskNo(receiveOutJob.getTaskNo()); mydoJob.setCargoSpaceId(receiveOutJob.getCargoSpaceId()); + mydoJob.setTargetCargoSpaceId(receiveOutJob.getTargetCargoSpaceId()); mydoJob.setExitId(receiveOutJob.getExitId()); mydoJob.setInOrOut(receiveOutJob.getInOrOut()); mydoJob.setStatus("1"); @@ -360,10 +376,12 @@ public class ApiServiceImpl implements IApiService { mydoJob.setRoadwayId(receiveOutJob.getRoadwayId()); mydoJob.setCreateTime(DateUtils.getNowDate()); mydoJob.setExecutionPhase("0"); + mydoJob.setTheFloor(receiveOutJob.getClassId()); + mydoJob.setPriority(receiveOutJob.getPriority()); int i = mydoJobService.insertMydoJob(mydoJob); if (i > 0) { return AjaxResult.success(); - }else{ + } else { return AjaxResult.error(); } @@ -385,7 +403,7 @@ public class ApiServiceImpl implements IApiService { int i = mydoJobService.insertMydoJob(mydoJob); if (i > 0) { return AjaxResult.success(); - }else{ + } else { return AjaxResult.error(); } } @@ -430,4 +448,108 @@ public class ApiServiceImpl implements IApiService { } + + @Override + public AjaxResult OutMakeSure(HashMap map) { + RequestLog requestLog = requestLogService.getRequestLog(OUT_MAKE_SURE, "线边直出请求过账", JSONUtil.toJsonStr(map)); + if ("1".equals(requestLog.getIsSuccessful())) { + InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class); + return AjaxResult.success(bean.getData()); + } else { + return AjaxResult.error(); + } + } + + @Override + public void updateLed(HashMap map) { + RequestLog requestLog = requestLogService.getRequestLog(UPDATE_LED, "出库到位更新LED", JSONUtil.toJsonStr(map)); + + + } + + @Override + public void updateLedError(HashMap map) { + RequestLog requestLog = requestLogService.getRequestLog(UPDATE_LED_ERROR, "更新线体报错信息", JSONUtil.toJsonStr(map)); + + + } + + @Override + public void sendContarTask() { + RequestLog requestLog = requestLogService.getRequestLog(QUERY_AGV_QUENE, "请求获取AGV执行队列", JSONUtil.toJsonStr("")); + if ("1".equals(requestLog.getIsSuccessful())) { + InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class); + AgvContainerTask bean1 = BeanUtil.toBean(bean.getData(), AgvContainerTask.class); + bean1.setStatus("0"); + agvContainerTaskService.insertAgvContainerTask(bean1); + } + } + + @Override + public AjaxResult sendAgvCar(Map param) { + RequestLog requestLog = requestLogService.getRequestLogs(SEND_AGV_CAR, "下发AGV执行对列", JSONUtil.toJsonStr(param)); + if ("1".equals(requestLog.getIsSuccessful())) { + return AjaxResult.success(); + } + { + return AjaxResult.error(); + } + } + + @Override + public AjaxResult insertAgvQuene(HashMap param) { + RequestLog requestLog = requestLogService.getRequestLog(INSERT_AGV_QUENE, "请求自动生成AGV执行队列", JSONUtil.toJsonStr(param)); + if ("1".equals(requestLog.getIsSuccessful())) { + return AjaxResult.success(); + } + { + return AjaxResult.error(); + } + } + + @Override + public void finishAgvJob(String container) { + HashMap objectObjectHashMap = new HashMap<>(); + objectObjectHashMap.put("order", container); + RequestLog requestLog = requestLogService.getRequestLog(FINISH_AGV_QUENE, "完成AGV执行队列", JSONUtil.toJsonStr(objectObjectHashMap)); + if ("1".equals(requestLog.getIsSuccessful())) { + + agvContainerTaskService.deleteAgvContainerTaskByOrderId(container); + } + } + + @Override + public AjaxResult tidyVehicleSnapshot() { + List vehicles = deviceSrgvMapper.selectDeviceSrgvList(new DeviceSrgv()); + List snapshots = new ArrayList<>(); + for (DeviceSrgv vehicle : vehicles) { + boolean online = "1".equals(vehicle.getAgvStatus()); + boolean healthy = online && value(vehicle.getAlarm()) <= 1 && value(vehicle.getErrMsg()) == 0; + boolean idle = healthy && value(vehicle.getTaskNo()) == 0 + && value(vehicle.getLocked()) == 0 && value(vehicle.getChargeFlag()) == 0; + SrgvVehicleSnapshot snapshot = new SrgvVehicleSnapshot(); + snapshot.setGuid(vehicle.getGuid()); + snapshot.setDeviceId(vehicle.getDeviceId()); + snapshot.setDeviceName(vehicle.getDeviceName()); + snapshot.setAgvStatus(vehicle.getAgvStatus()); + snapshot.setOnline(online); + snapshot.setHealthy(healthy); + snapshot.setIdle(idle); + snapshot.setTaskNo(vehicle.getTaskNo()); + snapshot.setAlarm(vehicle.getAlarm()); + snapshot.setErrMsg(vehicle.getErrMsg()); + snapshot.setChargeFlag(vehicle.getChargeFlag()); + snapshot.setLocked(vehicle.getLocked()); + snapshot.setBattery(vehicle.getBattery()); + snapshot.setCurrSite(vehicle.getCurrSite()); + snapshot.setCurrFloor(vehicle.getCurrFloor()); + snapshots.add(snapshot); + } + return AjaxResult.success(snapshots); + } + + private int value(Integer number) { + return number == null ? 0 : number; + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java index 0e7a619..6a682cc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java @@ -6,6 +6,8 @@ import java.util.List; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; +import cn.hutool.http.ContentType; +import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; import com.ruoyi.api.domain.InterfaceReceive; @@ -24,8 +26,7 @@ import com.ruoyi.api.service.IRequestLogService; */ @Service @Slf4j -public class RequestLogServiceImpl implements IRequestLogService -{ +public class RequestLogServiceImpl implements IRequestLogService { @Autowired private RequestLogMapper requestLogMapper; @@ -36,8 +37,7 @@ public class RequestLogServiceImpl implements IRequestLogService * @return 接口记录 */ @Override - public RequestLog selectRequestLogByRequestId(Long requestId) - { + public RequestLog selectRequestLogByRequestId(Long requestId) { return requestLogMapper.selectRequestLogByRequestId(requestId); } @@ -48,8 +48,7 @@ public class RequestLogServiceImpl implements IRequestLogService * @return 接口记录 */ @Override - public List selectRequestLogList(RequestLog requestLog) - { + public List selectRequestLogList(RequestLog requestLog) { return requestLogMapper.selectRequestLogList(requestLog); } @@ -60,11 +59,10 @@ public class RequestLogServiceImpl implements IRequestLogService * @return 结果 */ @Override - public int insertRequestLog(RequestLog requestLog) - { - if ("1".equals(requestLog.getIsSuccessful())){ + public int insertRequestLog(RequestLog requestLog) { + if ("1".equals(requestLog.getIsSuccessful())) { return requestLogMapper.insertRequestLog(requestLog); - }else { + } else { //log.error("请求失败:" + requestLog.getErrorDetails()); return 0; } @@ -77,8 +75,7 @@ public class RequestLogServiceImpl implements IRequestLogService * @return 结果 */ @Override - public int updateRequestLog(RequestLog requestLog) - { + public int updateRequestLog(RequestLog requestLog) { return requestLogMapper.updateRequestLog(requestLog); } @@ -89,8 +86,7 @@ public class RequestLogServiceImpl implements IRequestLogService * @return 结果 */ @Override - public int deleteRequestLogByRequestIds(Long[] requestIds) - { + public int deleteRequestLogByRequestIds(Long[] requestIds) { return requestLogMapper.deleteRequestLogByRequestIds(requestIds); } @@ -101,8 +97,7 @@ public class RequestLogServiceImpl implements IRequestLogService * @return 结果 */ @Override - public int deleteRequestLogByRequestId(Long requestId) - { + public int deleteRequestLogByRequestId(Long requestId) { return requestLogMapper.deleteRequestLogByRequestId(requestId); } @@ -115,7 +110,7 @@ public class RequestLogServiceImpl implements IRequestLogService * @return requestLog */ @Override - public RequestLog getRequestLog(String url, String endPoint,String param) { + public RequestLog getRequestLog(String url, String endPoint, String param) { RequestLog requestLog = new RequestLog(); Date requestTime = new Date(); requestLog.setRequestTime(DateUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss")); @@ -128,15 +123,17 @@ public class RequestLogServiceImpl implements IRequestLogService requestLog.setRequestUrl(url); try { String resStr = HttpUtil.post(url, param); + requestLog.setResponseBody(resStr); + InterfaceReceive bean = JSONUtil.toBean(resStr, InterfaceReceive.class); - Date responseTime =new Date(); + Date responseTime = new Date(); if (bean.getCode() == 200) { requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss")); requestLog.setResponseStatus("1"); requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS))); requestLog.setIsSuccessful("1"); - }else { + } else { requestLog.setResponseStatus("0"); requestLog.setErrorDetails(bean.getMsg()); requestLog.setIsSuccessful("0"); @@ -171,4 +168,46 @@ public class RequestLogServiceImpl implements IRequestLogService requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, requestTime, DateUnit.MS))); return requestLog; } + + @Override + public RequestLog getRequestLogs(String url, String param, String endPoint) { + RequestLog requestLog = new RequestLog(); + Date requestTime = new Date(); + requestLog.setRequestTime(DateUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss")); + requestLog.setSourceSystem("wcs"); + requestLog.setTargetSystem("wms"); + requestLog.setEndpoint(param); + requestLog.setRequestMethod("post"); + requestLog.setRequestHeaders(null); + requestLog.setRequestBody(endPoint); + requestLog.setRequestUrl(url); + try { + // 链式创建POST请求,获取完整响应对象 + HttpResponse response = HttpUtil.createPost(url) + .body(endPoint, "application/json") // 传入表单参数 + .execute(); + String body = response.body(); + int status = response.getStatus(); + InterfaceReceive bean = JSONUtil.toBean(body, InterfaceReceive.class); + Date responseTime = new Date(); + if (status == 200) { + requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss")); + requestLog.setResponseStatus("1"); + requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS))); + requestLog.setIsSuccessful("1"); + } else { + requestLog.setResponseStatus("0"); + requestLog.setErrorDetails(bean.getMsg()); + requestLog.setIsSuccessful("0"); + } + + } catch (Exception e) { + requestLog.setErrorDetails(e.getMessage()); + requestLog.setIsSuccessful("0"); + requestLog.setResponseStatus("0"); + } finally { + insertRequestLog(requestLog); + } + return requestLog; + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/mapper/WcsSrgvMapMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/mapper/WcsSrgvMapMapper.java index 610806e..335812d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/mapper/WcsSrgvMapMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/mapper/WcsSrgvMapMapper.java @@ -1,7 +1,9 @@ package com.ruoyi.bas.srgvmap.mapper; +import java.util.ArrayList; import java.util.List; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; +import org.apache.ibatis.annotations.Param; /** * 小车点位地图表Mapper接口 @@ -62,4 +64,8 @@ public interface WcsSrgvMapMapper * @return 结果 */ public int deleteWcsSrgvMapByGuids(String[] guids); + + List selectNotInsite( @Param("cache") String cache, + @Param("floor") Integer floor, + @Param("sites") ArrayList sites); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/IWcsSrgvMapService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/IWcsSrgvMapService.java index 7a2ce6b..4081f5e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/IWcsSrgvMapService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/IWcsSrgvMapService.java @@ -1,5 +1,6 @@ package com.ruoyi.bas.srgvmap.service; +import java.util.ArrayList; import java.util.List; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; @@ -62,4 +63,6 @@ public interface IWcsSrgvMapService * @return 结果 */ public int deleteWcsSrgvMapByGuid(String guid); + + List selectNotInsite(String cache, Integer floor, ArrayList sites); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/RoadCacheService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/RoadCacheService.java index 419543a..1024f89 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/RoadCacheService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/RoadCacheService.java @@ -4,7 +4,6 @@ package com.ruoyi.bas.srgvmap.service; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; import com.ruoyi.device.srgv.domain.DeviceSrgv; -import java.util.List; import java.util.Map; public interface RoadCacheService { @@ -18,11 +17,13 @@ public interface RoadCacheService { /** * 处理地图 + * * @param arrByRoadSite * @param deviceSrgv + * @param floor * @return */ - int[][] handleMap(Map arrByRoadSite, DeviceSrgv deviceSrgv); + int[][] handleMap(Map arrByRoadSite, DeviceSrgv deviceSrgv, Integer floor); /** * 根据x y z 获取指定位置的缓存 * @param x diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java index 76f8ab1..f1d87a6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/RoadCacheServiceImpl.java @@ -41,29 +41,27 @@ public class RoadCacheServiceImpl implements RoadCacheService { for (WcsSrgvMap wcsSrgvMap : wcsSrgvMaps) { maps.put(wcsSrgvMap.getSiteId(), wcsSrgvMap); } - param.setAxy("11,9"); - List tsjMap = wcsSrgvMapMapper.selectWcsSrgvMapList(param); - for (WcsSrgvMap wcsSrgvMap : tsjMap) { - maps.put("tsj",wcsSrgvMap); - } + return maps; } @Override - public int[][] handleMap(Map maps, DeviceSrgv deviceSrgv) { + public int[][] handleMap(Map maps, DeviceSrgv deviceSrgv, Integer floor) { //1.锁定其他车任务路径 lockedOtherCarQueuePath(maps, deviceSrgv); //2.锁定无任务小车当前位置 - lockedOtherCarCurrSite(maps, deviceSrgv); +// lockedOtherCarCurrSite(maps, deviceSrgv); //3.锁定离线小车当前位置 lockedOfflineCarCurrSite(maps, deviceSrgv); - + maps.put("tsj", maps.get("07050" + floor)); + //4.锁定满货位的位置 TODO 是否存在移库影响效率 int[][] mapsInt = new int[50][50]; for (String site : maps.keySet()) { WcsSrgvMap wcsSrgvMap = maps.get(site); mapsInt[wcsSrgvMap.getX()][wcsSrgvMap.getY()] = wcsSrgvMap.getValue(); - if (wcsSrgvMap.getAxy().equals("11,8")){ + + if (wcsSrgvMap.getAxy().equals("11,9")) { System.err.println(wcsSrgvMap.getValue()); } } @@ -77,7 +75,7 @@ public class RoadCacheServiceImpl implements RoadCacheService { param.setY(y); param.setZ(z); List wcsSrgvMaps = wcsSrgvMapMapper.selectWcsSrgvMapList(param); - if (CollUtil.isNotEmpty(wcsSrgvMaps)){ + if (CollUtil.isNotEmpty(wcsSrgvMaps)) { return wcsSrgvMaps.get(0); } return null; @@ -142,8 +140,18 @@ public class RoadCacheServiceImpl implements RoadCacheService { //添加其他小车路径列表 HashSet otherCarSiteList = new HashSet<>(); for (WcsSrgvQueue wcsSrgvQueue : otherCarQueue) { - if (wcsSrgvQueue.getPathInfo()!=null) { - otherCarSiteList.addAll(Arrays.asList(wcsSrgvQueue.getPathInfo().split(","))); + if (wcsSrgvQueue.getPathInfo() != null) { + //根据小车当前点位去除已走路径 除了当前点和上一个点之外都解锁 + DeviceSrgv otherCarCurrStatus = deviceSrgvService.selectDeviceSrgvByGuid(wcsSrgvQueue.getAgvId()); + String currSite = otherCarCurrStatus.getCurrSite(); + List allSiteList = Arrays.asList(wcsSrgvQueue.getPathInfo().split(",")); + int i = allSiteList.indexOf(currSite); + if (i == -1) { + i = 0; + } + List resultSiteList = allSiteList.subList(i, allSiteList.size()); + otherCarSiteList.addAll(resultSiteList); + //otherCarSiteList.addAll(Arrays.asList(wcsSrgvQueue.getPathInfo().split(","))); } } //锁定其他小车路径 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/WcsSrgvMapServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/WcsSrgvMapServiceImpl.java index 61da9cf..f186f22 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/WcsSrgvMapServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/WcsSrgvMapServiceImpl.java @@ -1,6 +1,8 @@ package com.ruoyi.bas.srgvmap.service.impl; +import java.util.ArrayList; import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.bas.srgvmap.mapper.WcsSrgvMapMapper; @@ -9,25 +11,23 @@ import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService; /** * 小车点位地图表Service业务层处理 - * + * * @author ruoyi * @date 2025-11-21 */ @Service -public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService -{ +public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService { @Autowired private WcsSrgvMapMapper wcsSrgvMapMapper; /** * 查询小车点位地图表 - * + * * @param guid 小车点位地图表主键 * @return 小车点位地图表 */ @Override - public WcsSrgvMap selectWcsSrgvMapByGuid(String guid) - { + public WcsSrgvMap selectWcsSrgvMapByGuid(String guid) { return wcsSrgvMapMapper.selectWcsSrgvMapByGuid(guid); } @@ -38,61 +38,61 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService /** * 查询小车点位地图表列表 - * + * * @param wcsSrgvMap 小车点位地图表 * @return 小车点位地图表 */ @Override - public List selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap) - { + public List selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap) { return wcsSrgvMapMapper.selectWcsSrgvMapList(wcsSrgvMap); } /** * 新增小车点位地图表 - * + * * @param wcsSrgvMap 小车点位地图表 * @return 结果 */ @Override - public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap) - { + public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap) { return wcsSrgvMapMapper.insertWcsSrgvMap(wcsSrgvMap); } /** * 修改小车点位地图表 - * + * * @param wcsSrgvMap 小车点位地图表 * @return 结果 */ @Override - public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap) - { + public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap) { return wcsSrgvMapMapper.updateWcsSrgvMap(wcsSrgvMap); } /** * 批量删除小车点位地图表 - * + * * @param guids 需要删除的小车点位地图表主键 * @return 结果 */ @Override - public int deleteWcsSrgvMapByGuids(String[] guids) - { + public int deleteWcsSrgvMapByGuids(String[] guids) { return wcsSrgvMapMapper.deleteWcsSrgvMapByGuids(guids); } /** * 删除小车点位地图表信息 - * + * * @param guid 小车点位地图表主键 * @return 结果 */ @Override - public int deleteWcsSrgvMapByGuid(String guid) - { + public int deleteWcsSrgvMapByGuid(String guid) { return wcsSrgvMapMapper.deleteWcsSrgvMapByGuid(guid); } + + @Override + public List selectNotInsite(String cache, Integer floor, ArrayList sites) { + return wcsSrgvMapMapper.selectNotInsite(cache, floor, sites); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java b/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java index cb74f18..69269bb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java @@ -4,20 +4,26 @@ package com.ruoyi.common; public class Constant { public static final String WMS_BASE_URL = "http://localhost:8080/api2wms/"; - public static final String RCS_BASE_URL = "http://127.0.0.1:8081/rcms-dps/rest/"; - + public static final String RCS_BASE_URL = "http://192.168.188.251:9501/"; + public static final String WMS_BASE_PDA_URL = "http://localhost:8080/pda/"; public static final String JOB_FINISH_URL = WMS_BASE_URL+"jobFinish"; public static final String CONTINUE_TASK_URL = RCS_BASE_URL+"continueTask"; public static final String CANCEL_TASK_URL = RCS_BASE_URL+"queryAgvStatus";; public static final String GEN_AGV_SCHEDULING_TASK = RCS_BASE_URL+"genAgvSchedulingTask";; public static final String CREATE_IN_MYDO_JOB_URL = WMS_BASE_URL+"requestEnterByTrayCode"; + public static final String SEND_CARGOSPACE = WMS_BASE_URL+"sendCargoSpace"; public static final String REQUEST_MYDO_JOB_URL = WMS_BASE_URL+"requestByNoTrayCode"; public static final String RE_ASSIGN_URL = WMS_BASE_URL+"reAssign"; public static final String RE_MATERIAL_URL = WMS_BASE_URL+"reMaterial"; public static final String REQUEST_ENTER_URL = WMS_BASE_URL+"requestEnterByTrayCodeAndEntranceId"; - - + public static final String OUT_MAKE_SURE=WMS_BASE_PDA_URL+"outMakeSure"; + public static final String UPDATE_LED=WMS_BASE_URL+"updateLed"; + public static final String QUERY_AGV_QUENE=WMS_BASE_URL+"queryAgvQuene"; + public static final String FINISH_AGV_QUENE=WMS_BASE_URL+"finishAgvQuene"; + public static final String SEND_AGV_CAR=RCS_BASE_URL+"api/app/agvs-task"; + public static final String INSERT_AGV_QUENE=WMS_BASE_URL+"insertAgvQuene"; + public static final String UPDATE_LED_ERROR=WMS_BASE_URL+"updateLedError"; public static final String WAREHOUSE_01 = "01"; public static final String WAREHOUSE_02 = "02"; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/mapper/DeviceCdzMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/mapper/DeviceCdzMapper.java index 9907314..bfa9d3d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/mapper/DeviceCdzMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/mapper/DeviceCdzMapper.java @@ -68,4 +68,6 @@ public interface DeviceCdzMapper * @return */ List selectDeviceCdzHasSRgvList(); + + void updateDeviceCdzSpare(DeviceCdz deviceCdz); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/IDeviceCdzService.java b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/IDeviceCdzService.java index d4096ae..89f8ef6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/IDeviceCdzService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/IDeviceCdzService.java @@ -68,4 +68,6 @@ public interface IDeviceCdzService * @return */ List selectDeviceCdzHasSRgvList(); + + void updateDeviceCdzSpare(DeviceCdz deviceCdz); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/impl/DeviceCdzServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/impl/DeviceCdzServiceImpl.java index bef24c0..6b24739 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/impl/DeviceCdzServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/cdz/service/impl/DeviceCdzServiceImpl.java @@ -100,4 +100,9 @@ public class DeviceCdzServiceImpl implements IDeviceCdzService public List selectDeviceCdzHasSRgvList() { return deviceCdzMapper.selectDeviceCdzHasSRgvList(); } + + @Override + public void updateDeviceCdzSpare(DeviceCdz deviceCdz) { + deviceCdzMapper.updateDeviceCdzSpare(deviceCdz); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/domain/DeviceSsj.java b/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/domain/DeviceSsj.java index 70e6681..3727f75 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/domain/DeviceSsj.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/domain/DeviceSsj.java @@ -83,6 +83,8 @@ public class DeviceSsj extends BaseEntity @Excel(name="输送线模式 1-入库 2-出库") private int model; + // 报警信息 + private int errorCode; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/controller/MydoJobController.java b/ruoyi-admin/src/main/java/com/ruoyi/job/controller/MydoJobController.java index 39ba202..b9b4608 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/controller/MydoJobController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/controller/MydoJobController.java @@ -2,6 +2,7 @@ package com.ruoyi.job.controller; import java.util.List; import javax.servlet.http.HttpServletResponse; + import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -29,8 +30,7 @@ import com.ruoyi.common.core.page.TableDataInfo; */ @RestController @RequestMapping("/job/mydoJob") -public class MydoJobController extends BaseController -{ +public class MydoJobController extends BaseController { @Autowired private IMydoJobService mydoJobService; @@ -39,8 +39,7 @@ public class MydoJobController extends BaseController */ @PreAuthorize("@ss.hasPermi('job:mydoJob:list')") @GetMapping("/list") - public TableDataInfo list(MydoJob mydoJob) - { + public TableDataInfo list(MydoJob mydoJob) { startPage(); List list = mydoJobService.selectMydoJobList(mydoJob); return getDataTable(list); @@ -51,10 +50,11 @@ public class MydoJobController extends BaseController */ @PreAuthorize("@ss.hasPermi('job:mydoJob:list')") @GetMapping("/listFinish") - public TableDataInfo listFinish(MydoJob mydoJob) - { + public TableDataInfo listFinish(MydoJob mydoJob) { startPage(); +// mydoJob.setStatus("3"); List list = mydoJobService.selectMydoJobFinishList(mydoJob); + return getDataTable(list); } @@ -64,9 +64,15 @@ public class MydoJobController extends BaseController @PreAuthorize("@ss.hasPermi('job:mydoJob:export')") @Log(title = "作业信息", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response, MydoJob mydoJob) - { - List list = mydoJobService.selectMydoJobList(mydoJob); + public void export(HttpServletResponse response, MydoJob mydoJob) { + List list = null; + if (mydoJob.getStatus().equals("3")) { + list = mydoJobService.selectMydoJobList(mydoJob); + } else { + + list = mydoJobService.selectMydoJobFinishList(mydoJob); + } + ExcelUtil util = new ExcelUtil(MydoJob.class); util.exportExcel(response, list, "作业信息数据"); } @@ -76,8 +82,7 @@ public class MydoJobController extends BaseController */ @PreAuthorize("@ss.hasPermi('job:mydoJob:query')") @GetMapping(value = "/{jobId}") - public AjaxResult getInfo(@PathVariable("jobId") String jobId) - { + public AjaxResult getInfo(@PathVariable("jobId") String jobId) { return success(mydoJobService.selectMydoJobByJobId(jobId)); } @@ -87,8 +92,7 @@ public class MydoJobController extends BaseController @PreAuthorize("@ss.hasPermi('job:mydoJob:add')") @Log(title = "作业信息", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody MydoJob mydoJob) - { + public AjaxResult add(@RequestBody MydoJob mydoJob) { return toAjax(mydoJobService.insertMydoJob(mydoJob)); } @@ -98,8 +102,7 @@ public class MydoJobController extends BaseController @PreAuthorize("@ss.hasPermi('job:mydoJob:edit')") @Log(title = "作业信息", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody MydoJob mydoJob) - { + public AjaxResult edit(@RequestBody MydoJob mydoJob) { return toAjax(mydoJobService.updateMydoJob(mydoJob)); } @@ -108,9 +111,8 @@ public class MydoJobController extends BaseController */ @PreAuthorize("@ss.hasPermi('job:mydoJob:remove')") @Log(title = "作业信息", businessType = BusinessType.DELETE) - @DeleteMapping("/{jobIds}") - public AjaxResult remove(@PathVariable String[] jobIds) - { + @DeleteMapping("/{jobIds}") + public AjaxResult remove(@PathVariable String[] jobIds) { return toAjax(mydoJobService.deleteMydoJobByJobIds(jobIds)); } @@ -118,8 +120,7 @@ public class MydoJobController extends BaseController @PreAuthorize("@ss.hasPermi('job:mydoJob:manualCallback')") @Log(title = "作业信息", businessType = BusinessType.UPDATE) @GetMapping("/manualCallback/{jobId}") - public AjaxResult manualCallback(@PathVariable("jobId") String jobId) - { + public AjaxResult manualCallback(@PathVariable("jobId") String jobId) { return mydoJobService.manualCallback(jobId); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/domain/MydoJob.java b/ruoyi-admin/src/main/java/com/ruoyi/job/domain/MydoJob.java index c4a12e5..d83b42c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/domain/MydoJob.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/domain/MydoJob.java @@ -24,10 +24,11 @@ public class MydoJob extends BaseEntity private static final long serialVersionUID = 1L; /** 任务ID */ + @Excel(name = "任务ID") private String jobId; /** 任务状态 */ - @Excel(name = "任务状态") + @Excel(name = "任务状态",dictType = "job_status") private String status; /** 任务号 */ @@ -35,7 +36,7 @@ public class MydoJob extends BaseEntity private String taskNo; /** 巷道ID */ - @Excel(name = "巷道ID") +// @Excel(name = "巷道ID") private String roadwayId; /** 货位ID */ @@ -55,11 +56,11 @@ public class MydoJob extends BaseEntity private Long priority; /** 执行阶段 */ - @Excel(name = "执行阶段") +// @Excel(name = "执行阶段") private String executionPhase; /** 任务类型 */ - @Excel(name = "任务类型") + @Excel(name = "任务类型",dictType = "job_type") private String inOrOut; /** 开始时间 */ @@ -83,9 +84,9 @@ public class MydoJob extends BaseEntity private String warehouseId; /** 重分标志 */ - @Excel(name = "重分标志") +// @Excel(name = "重分标志") private String faultFlag; - + @Excel(name = "托盘条码") private String trayCode; private String inOut; @@ -94,4 +95,5 @@ public class MydoJob extends BaseEntity private String productId; private String productName; + private String classId; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java index 76aaa74..dce0f03 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java @@ -81,4 +81,26 @@ public interface MydoJobMapper List selectMydoJobFinishList(MydoJob mydoJob); MydoJob selectRunningMydoJobByExitList(@Param("exitList") List exitList); + + List selectMydoJobOut(); + + MydoJob selectMydoJobByTrayCode(String trayCode); + + Integer selectExit(String ssj); + + Integer selectMydoJobCount(); + + Integer selectMydoJobIn(); + + Integer selectMydoJobCountOut(); + + Integer selectByJobOut(Integer currFloor); + + Integer selectByJobOutIsOne(Integer currFloor); + + Integer selectMydoJobExit(String exit); + + Integer selectTheFloorYk(String theFloor); + + void deleteMydoJobByTaskNos(List validTaskNos); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java b/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java index 98a316a..e7b1ecc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java @@ -80,4 +80,24 @@ public interface IMydoJobService MydoJob selectRunningMydoJobByExitList(List strings); AjaxResult manualCallback(String jobId); + + List selectMydoJobOut(); + + MydoJob selectMydoJobByTrayCode(String trayCode); + + Integer selectExit(String ssj); + + Integer selectMydoJobCount(); + + Integer selectMydoJobIn(); + + Integer selectMydoJobCountOut(); + + Integer selectByJobOut(Integer currFloor); + + Integer selectByJobOutIsOne(Integer currFloor); + + Integer selectMydoJobExit(String exit); + + Integer selectTheFloorYk(String theFloor); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java index d54bcd9..9ab5cea 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java @@ -173,4 +173,55 @@ public class MydoJobServiceImpl implements IMydoJobService } return AjaxResult.error("手动回调失败"); } + + @Override + public List selectMydoJobOut() { + return mydoJobMapper.selectMydoJobOut(); + } + + @Override + public MydoJob selectMydoJobByTrayCode(String trayCode) { + return mydoJobMapper.selectMydoJobByTrayCode(trayCode); + } + + @Override + public Integer selectExit(String ssj) { + return mydoJobMapper.selectExit(ssj); + } + + @Override + public Integer selectMydoJobCount() { + return mydoJobMapper.selectMydoJobCount(); + } + + @Override + public Integer selectMydoJobIn() { + return mydoJobMapper.selectMydoJobIn(); + } + + @Override + public Integer selectMydoJobCountOut() { + return mydoJobMapper.selectMydoJobCountOut(); + } + + @Override + public Integer selectByJobOut(Integer currFloor) { + + return mydoJobMapper.selectByJobOut(currFloor); + } + + @Override + public Integer selectByJobOutIsOne(Integer currFloor) { + return mydoJobMapper.selectByJobOutIsOne(currFloor); + } + + @Override + public Integer selectMydoJobExit(String exit) { + return mydoJobMapper.selectMydoJobExit(exit); + } + + @Override + public Integer selectTheFloorYk(String theFloor) { + return mydoJobMapper.selectTheFloorYk(theFloor); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java index 7cedfad..5b17c04 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.queue.agv.mapper; +import java.util.HashMap; import java.util.List; import com.ruoyi.queue.agv.domain.AgvQueue; @@ -67,4 +68,6 @@ public interface AgvQueueMapper AgvQueue selectAgvQueueByTaskCode(String taskCode); void insertHistory(String reqCode); + + void selectKx(HashMap map); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java index 0e565c1..6d4adde 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java @@ -1,5 +1,6 @@ package com.ruoyi.queue.agv.service; +import java.util.HashMap; import java.util.List; import com.ruoyi.queue.agv.domain.AgvQueue; @@ -71,4 +72,6 @@ public interface IAgvQueueService * @param reqCode */ void insertHistory(String reqCode); + + void selectKx(HashMap map); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java index df2bc6f..c351834 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.queue.agv.service.impl; +import java.util.HashMap; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -100,4 +101,9 @@ public class AgvQueueServiceImpl implements IAgvQueueService public void insertHistory(String reqCode) { agvQueueMapper.insertHistory(reqCode); } + + @Override + public void selectKx(HashMap map) { + agvQueueMapper.selectKx(map); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java index 933a320..ede18d1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/mapper/WcsSrgvQueueMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.queue.srgv.mapper; import java.util.List; import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; +import org.apache.ibatis.annotations.Param; /** * 四向小车任务队列Mapper接口 @@ -70,4 +71,14 @@ public interface WcsSrgvQueueMapper * @return 结果 */ public int deleteWcsSrgvQueueByGuids(String[] guids); + + String selectMinCountJob(@Param("list") List outModelSSJ); + + Integer selectTsj(); + + Integer selectByCaogoPlaceSite(String siteId); + + Integer selectByEndSite(); + + List selectTaskNosByGuids(String[] guids); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java index 40f836a..123dfb3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/IWcsSrgvQueueService.java @@ -77,4 +77,12 @@ public interface IWcsSrgvQueueService * @param taskNo */ public WcsSrgvQueue insertHistory(String taskNo); + + String selectMinCountJob(List outModelSSJ); + + Integer selectTsj(); + + Integer selectByCaogoPlaceSite(String siteId); + + Integer selectByEndSite(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java index 81a2070..f1e123c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/srgv/service/impl/WcsSrgvQueueServiceImpl.java @@ -1,10 +1,12 @@ package com.ruoyi.queue.srgv.service.impl; +import java.util.ArrayList; import java.util.List; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjUtil; +import com.ruoyi.job.mapper.MydoJobMapper; import com.ruoyi.queue.srgv.domain.WcsSrgvQueueFinish; import com.ruoyi.queue.srgv.mapper.WcsSrgvQueueFinishMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -26,7 +28,8 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService private WcsSrgvQueueMapper wcsSrgvQueueMapper; @Autowired private WcsSrgvQueueFinishMapper wcsSrgvQueueFinishMapper; - + @Autowired + private MydoJobMapper mydoJobMapper; /** * 查询四向小车任务队列 * @@ -100,9 +103,29 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService @Override public int deleteWcsSrgvQueueByGuids(String[] guids) { + if (guids == null || guids.length == 0) { + return 0; + } + List taskNos = wcsSrgvQueueMapper.selectTaskNosByGuids(guids); + deleteMydoJobsByTaskNos(taskNos); return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuids(guids); } + private void deleteMydoJobsByTaskNos(List taskNos) { + if (taskNos == null || taskNos.isEmpty()) { + return; + } + List validTaskNos = new ArrayList<>(); + for (String taskNo : taskNos) { + if (taskNo != null && !"".equals(taskNo)) { + validTaskNos.add(taskNo); + } + } + if (!validTaskNos.isEmpty()) { + mydoJobMapper.deleteMydoJobByTaskNos(validTaskNos); + } + } + /** * 删除四向小车任务队列信息 * @@ -115,6 +138,28 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuid(guid); } + @Override + public String selectMinCountJob( List outModelSSJ) { + return wcsSrgvQueueMapper.selectMinCountJob(outModelSSJ) ; + } + + @Override + public Integer selectTsj() { + + return wcsSrgvQueueMapper.selectTsj(); + } + + @Override + public Integer selectByCaogoPlaceSite(String siteId) { + return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId); + } + + @Override + public Integer selectByEndSite() { + return wcsSrgvQueueMapper.selectByEndSite(); + + } + @Override public WcsSrgvQueue insertHistory(String taskNo) { WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/mapper/TsjDeviceExecutionQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/mapper/TsjDeviceExecutionQueueMapper.java index 0c83eba..62e6066 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/mapper/TsjDeviceExecutionQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/mapper/TsjDeviceExecutionQueueMapper.java @@ -65,4 +65,6 @@ public interface TsjDeviceExecutionQueueMapper * @return 提升机执行队列 */ TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo); + + Integer selectCount(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/ITsjDeviceExecutionQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/ITsjDeviceExecutionQueueService.java index f9cf9d0..db855dd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/ITsjDeviceExecutionQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/ITsjDeviceExecutionQueueService.java @@ -64,4 +64,6 @@ public interface ITsjDeviceExecutionQueueService * @return */ TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo); + + Integer selectCount(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/impl/TsjDeviceExecutionQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/impl/TsjDeviceExecutionQueueServiceImpl.java index 656b6a2..36e5a9a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/impl/TsjDeviceExecutionQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/tsj/service/impl/TsjDeviceExecutionQueueServiceImpl.java @@ -104,5 +104,10 @@ public class TsjDeviceExecutionQueueServiceImpl implements ITsjDeviceExecutionQu return tsjDeviceExecutionQueueMapper.selectTsjDeviceExecutionQueueByRwh(taskNo); } + @Override + public Integer selectCount() { + return tsjDeviceExecutionQueueMapper.selectCount(); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/cdz/PlcCdzRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/cdz/PlcCdzRead.java index 0f9eece..b57189b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/cdz/PlcCdzRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/cdz/PlcCdzRead.java @@ -67,12 +67,14 @@ public class PlcCdzRead implements Runnable { } private void plcRead(DeviceCdz deviceCdz) { - OperateResultExOne read2 = readWriteNet.Read(deviceCdz.getPlcDbReadAddress(), Short.parseShort("4")); + OperateResultExOne read2 = readWriteNet.Read(deviceCdz.getPlcDbReadAddress(), Short.parseShort("2")); String ddsx1 = "0"; if (read2.IsSuccess) { ddsx1 = SoftBasic.ByteToHexString(read2.Content); deviceCdz.setStatus(ParseUtil.optInt(0, ddsx1)); - deviceCdz.setModel(ParseUtil.optInt(2, ddsx1)); +// deviceCdz.setModel(ParseUtil.optInt(2, ddsx1)); + }else { + log.error(read2.Message); } } @@ -116,8 +118,8 @@ public class PlcCdzRead implements Runnable { } void closeServer() { - if (readWriteNet != null) { - readWriteNet.ConnectClose(); + if (siemensS7Net != null) { + siemensS7Net.ConnectClose(); } setIsConnect(false); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ddj/PlcDdjRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ddj/PlcDdjRead.java index e0efa7f..1eb3582 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ddj/PlcDdjRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ddj/PlcDdjRead.java @@ -123,8 +123,8 @@ public class PlcDdjRead implements Runnable { } void closeServer() { - if (readWriteNet != null) { - readWriteNet.ConnectClose(); + if (siemensS7Net != null) { + siemensS7Net.ConnectClose(); } setIsConnect(false); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java index 2291b28..8c2e7ca 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java @@ -78,17 +78,39 @@ public class PlcSrgvRead implements Runnable { OperateResultExOne read1 = modbusTcpNet.Read("4068", (short) 15);//2400-2414 if (read1.IsSuccess) { setValueByByte1(read1.Content, deviceSrgv); + }else { + log.error(read1.Message); } + + OperateResultExOne read5 = modbusTcpNet.Read("4081", (short) 2);//2400-2414 + if (read5.IsSuccess) { + setValueByByte5(read1.Content, deviceSrgv); + }else { + log.error(read1.Message); + } + //读取二段任务 小车是否接收完成1段作业 OperateResultExOne read3 = modbusTcpNet.Read("1000", (short) 2);//2400-2414 if (read3.IsSuccess) { setValueByByte3(read3.Content, deviceSrgv); + }else { + log.error(read1.Message); } //读取双字 OperateResultExOne read2 = modbusTcpNet.Read("4060", (short) 8);// 4800-4807任务号、原点、目标点、当前 if (read2.IsSuccess) { setValueByByte2(read2.Content, deviceSrgv); + }else { + log.error(read1.Message); + } + + // //读取双字,路径 + OperateResultExOne read4 = modbusTcpNet.Read("6000", (short) 800);// 5000-5799 路径 400个 + if (read4.IsSuccess) { + setValueByByte4(read4.Content, deviceSrgv); + }else { + log.error(read1.Message); } } @@ -104,6 +126,8 @@ public class PlcSrgvRead implements Runnable { agvData.setAlarm(Convert.toInt(byteTransform.TransInt16(content, 6))); // agvData.setStatus(0); agvData.setStatus(Convert.toInt(byteTransform.TransInt16(content, 8))); + //载货标志 +// agvData.setCargoFlag(Convert.toInt(byteTransform.TransInt32(content[1], 13))); //接收完成标志 // agvData.setFinish(Convert.toInt(byteTransform.TransInt16(content, 10))); // agvData.setFinish(0); @@ -123,6 +147,15 @@ public class PlcSrgvRead implements Runnable { } + + private void setValueByByte5(byte[] content, DeviceSrgv agvData) { + int cargoFlag = content[27] & 0xFF; + agvData.setCargoFlag(cargoFlag); + + } + + + //单字 private void setValueByByte3(byte[] content, DeviceSrgv agvData) { // agvData.setTaskType(0); @@ -150,6 +183,29 @@ public class PlcSrgvRead implements Runnable { agvData.setCurrFloor(floor); } + private void setValueByByte4(byte[] content, DeviceSrgv agvData) { + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < content.length; i += 4) { + // 检查剩余字节是否足够4个 + if (i + 4 > content.length) break; + // TODO 注意双字反转 + int value = byteTransform.TransInt32(content, i); + + // 如果值为0,终止循环 + if (value == 0) { + break; + } + sb.append(String.format("%06d", value)).append(","); // 用逗号分隔每个int值 + } + + // 移除最后多余的 "," + if (sb.length() > 0) { + sb.setLength(sb.length() - 1); + } + agvData.setPath(sb.toString()); + } + public void ConnectServer() { modbusTcpNet = new ModbusTcpNet();//创建一个Modbus对象 log.info("创建连接对象,IP{}", this.ip); @@ -188,8 +244,8 @@ public class PlcSrgvRead implements Runnable { } void closeServer() { - if (readWriteNet != null) { - readWriteNet.ConnectClose(); + if (modbusTcpNet != null) { + modbusTcpNet.ConnectClose(); } setIsConnect(false); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java index a3b267b..d98ad6c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java @@ -198,6 +198,7 @@ public class PathFinder { if (gCost[endX][endY] == Integer.MAX_VALUE) { List path = new ArrayList<>(); path.add(new int[]{-1, -1}); + return path; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java index 458e775..82980b3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java @@ -68,6 +68,10 @@ public class PlcSsjRead implements Runnable { // 线体到位输送机 readPlcOtherSsj(ssjDevice); break; + case "4": + // 线体到位输送机 + readPlcInDwSsj(ssjDevice); + break; } } @@ -86,6 +90,19 @@ public class PlcSsjRead implements Runnable { } } + private void readPlcInDwSsj(DeviceSsj ssjDevice) { + OperateResultExOne read2 = readWriteNet.Read(ssjDevice.getPlcDbReadAddress(), Short.parseShort("10")); + String ddsx1 = "0"; + if (read2.IsSuccess) { + ddsx1 = SoftBasic.ByteToHexString(read2.Content); + ssjDevice.setKx(ParseUtil.optInt(4, ddsx1)); + ssjDevice.setDw(ParseUtil.optInt(6, ddsx1)); + ssjDevice.setErrorCode(ParseUtil.optInt(8,ddsx1)); + ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1)); + + } + } + /** * 其他输送机 * @@ -99,6 +116,7 @@ public class PlcSsjRead implements Runnable { ssjDevice.setKx(ParseUtil.optInt(4, ddsx1)); ssjDevice.setDw(ParseUtil.optInt(6, ddsx1)); ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1)); + ssjDevice.setModel(ParseUtil.optInt(8, ddsx1));//出入库模式 1入 2出 } } @@ -118,6 +136,8 @@ public class PlcSsjRead implements Runnable { ssjDevice.setDw(ParseUtil.optInt(6, ddsx1)); // ssjDevice.setTrayCode(ParseUtil.optString(14, 12, ddsx1)); // ssjDevice.setModel(ParseUtil.optInt(28, ddsx1)); + }else { + log.error(read2.Message); } } @@ -138,6 +158,8 @@ public class PlcSsjRead implements Runnable { // ssjDevice.setKx(ParseUtil.optInt(4, ddsx1)); // ssjDevice.setDw(ParseUtil.optInt(6, ddsx1)); + }else { + log.error(read2.Message); } } @@ -175,6 +197,8 @@ public class PlcSsjRead implements Runnable { //去除bytes中 ssjDevice.setTrayCode(ParseUtil.filterAndConvert(trayCodeRead.Content)); } + }else { + log.error(read2.Message); } } @@ -218,8 +242,8 @@ public class PlcSsjRead implements Runnable { } void closeServer() { - if (readWriteNet != null) { - readWriteNet.ConnectClose(); + if (siemensS7Net != null) { + siemensS7Net.ConnectClose(); } setIsConnect(false); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/tsj/PlcTsjRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/tsj/PlcTsjRead.java index b0cd5e1..e287bdd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/tsj/PlcTsjRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/tsj/PlcTsjRead.java @@ -126,8 +126,8 @@ public class PlcTsjRead implements Runnable { } void closeServer() { - if (readWriteNet != null) { - readWriteNet.ConnectClose(); + if (siemensS7Net != null) { + siemensS7Net.ConnectClose(); } setIsConnect(false); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java index fb59d95..7540f14 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/cdz/CdzThread.java @@ -13,6 +13,8 @@ import com.ruoyi.device.srgv.domain.DeviceSrgv; import com.ruoyi.device.srgv.service.IDeviceSrgvService; import com.ruoyi.job.charg.domain.SrgvChargingJob; import com.ruoyi.job.charg.service.ISrgvChargingJobService; +import com.ruoyi.job.mapper.MydoJobMapper; +import com.ruoyi.job.service.IMydoJobService; import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; import com.ruoyi.schedule.plcRead.cdz.PlcCdzRead; @@ -21,6 +23,9 @@ import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead; import com.ruoyi.schedule.plcRead.util.Tools; import lombok.extern.slf4j.Slf4j; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -32,19 +37,22 @@ public class CdzThread implements Runnable { public boolean isRun = true; - private final Integer LITTLE_BETTERY = 30; + private final Integer LITTLE_BETTERY = 40; private final Integer MIDDLE_BETTERY = 70; - + private final Integer MAX_BETTERY = 90; + private final Integer JOB_BETTERY=50; private ISrgvChargingJobService chargingJobService; private IDeviceCdzService deviceCdzService; private IDeviceSrgvService deviceSrgvService; private IWcsSrgvQueueService wcsSrgvQueueService; + public IMydoJobService mydoJobService; public void init() { chargingJobService = SpringUtils.getBean(ISrgvChargingJobService.class); deviceCdzService = SpringUtils.getBean(IDeviceCdzService.class); deviceSrgvService = SpringUtils.getBean(IDeviceSrgvService.class); wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); + mydoJobService = SpringUtils.getBean(IMydoJobService.class); } @Override @@ -62,19 +70,32 @@ public class CdzThread implements Runnable { } } + public static boolean isMoreThan30Min(String timeStr, String pattern) { + // 1. 创建格式化器 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + // 2. 解析字符串为时间对象 + LocalDateTime targetTime = LocalDateTime.parse(timeStr, formatter); + // 3. 获取当前系统时间 + LocalDateTime now = LocalDateTime.now(); + // 4. 计算两个时间相差的总分钟(可正可负) + long diffMinutes = ChronoUnit.MINUTES.between(targetTime, now); + // 取绝对值:不管是过去/未来时间,只要间隔超30分钟就满足 + long absDiff = Math.abs(diffMinutes); + return absDiff > 30; + } void dispatch() { - + Integer count = mydoJobService.selectMydoJobCount(); //获取低电量小车 List littleBatterySRgv = new ArrayList<>(); //获取中电量小车 List middleBatterySRgv = new ArrayList<>(); for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); - if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3) { + if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3 && deviceSrgv.getChargeFlag() != 2) { if (deviceSrgv.getBattery() <= LITTLE_BETTERY) { littleBatterySRgv.add(deviceSrgv); - } else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY) { + } else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY && isMoreThan30Min(deviceSrgv.getLastTime(),"yyyy-MM-dd HH:mm:ss")) { middleBatterySRgv.add(deviceSrgv); } } @@ -92,22 +113,20 @@ public class CdzThread implements Runnable { } //超过30分钟自动生成充电任务 - List deviceSrgvs = deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv()); - List timeOutSrgvList = deviceSrgvs.stream().filter(x -> DateUtil.between(DateUtil.parse(x.getLastTime()), DateUtil.date(), DateUnit.MINUTE) > 30).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(timeOutSrgvList)) { - //生成充电任务 - createChargingInJob(timeOutSrgvList); - } +// List deviceSrgvs = deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv()); +// List timeOutSrgvList = deviceSrgvs.stream().filter(x -> DateUtil.between(DateUtil.parse(x.getLastTime()), DateUtil.date(), DateUnit.MINUTE) > 30).collect(Collectors.toList()); +// if (CollUtil.isNotEmpty(timeOutSrgvList)) { +// //生成充电任务 +// createChargingInJob(timeOutSrgvList); +// } - //充电任务下发 + //充电任务下发 查到充电任务并且充电桩未开启直接开启 SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); srgvChargingJobParam.setChargingStatus("0"); srgvChargingJobParam.setJobType("1"); - srgvChargingJobParam.setJobStatus("3"); List srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); if (CollUtil.isNotEmpty(srgvChargingJobs)) { - for (SrgvChargingJob srgvChargingJob : srgvChargingJobs) { if ("0".equals(srgvChargingJob.getChargingStatus())) { String chargingSite = srgvChargingJob.getChargingSite(); @@ -118,44 +137,29 @@ public class CdzThread implements Runnable { SendData qxSendData = new SendData(Tools.INT, 1); byte[] bytes = Tools.sendData(qxSendData); int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes); + // 查到充电任务,并且充电桩未开启就直接开启 if (i == 1) { + log.info("下发{" + deviceCdzs.get(0).getId() + "}号充电桩开启"); srgvChargingJob.setChargingStatus("2"); srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date())); chargingJobService.updateSrgvChargingJob(srgvChargingJob); } + + } } } - - //生成断电任务 有任务且电量大于50 todo 代码无效 - WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); - wcsSrgvQueueParam.setIssued("0"); - List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam); - if (CollUtil.isNotEmpty(wcsSrgvQueues)) { - boolean existsKxSRgv = false; - //判断有没有空闲小车 - for (DeviceSrgv x : PlcSrgvRead.deviceSrgvMap.values()) { - if (x.getWorkMode() == 5 && x.getStatus() == 1) { - existsKxSRgv = true; - break; - } - } - if (!existsKxSRgv) { - List deviceCdzs = deviceCdzService.selectDeviceCdzHasSRgvList(); - if (CollUtil.isNotEmpty(deviceCdzs)) { - for (DeviceCdz deviceCdz : deviceCdzs) { - if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1())) { - DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()); - if (deviceSrgv.getBattery() >= 50) { - //生成断电任务 - createChargingOutJob(deviceSrgv, deviceCdz); - break; - } - } - } - } + //生成断电任务 有任务且电量大于50 + List deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList(); + for (DeviceCdz deviceCdz : deviceCdzdd) { + DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()); + //(deviceSrgv.getBattery() >= JOB_BETTERY && count > 0) || + if (( deviceSrgv.getBattery() >= MAX_BETTERY) + && deviceSrgv.getWorkMode() == 5 + && deviceSrgv.getChargeFlag() == 2 && deviceCdz.getStatus() == 1) { + createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz); } } @@ -166,7 +170,6 @@ public class CdzThread implements Runnable { srgvChargingJobDdParam.setJobType("2"); List srgvChargingJobDds = chargingJobService.selectSrgvChargingJobList(srgvChargingJobDdParam); if (CollUtil.isNotEmpty(srgvChargingJobDds)) { - for (SrgvChargingJob srgvChargingJob : srgvChargingJobDds) { if ("0".equals(srgvChargingJob.getChargingStatus())) { String chargingSite = srgvChargingJob.getChargingSite(); @@ -178,6 +181,7 @@ public class CdzThread implements Runnable { byte[] bytes = Tools.sendData(qxSendData); int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes); if (i == 1) { + log.info("下发{" + deviceCdzs.get(0).getId() + "}号充电桩关闭"); srgvChargingJob.setChargingStatus("1"); srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date())); chargingJobService.updateSrgvChargingJob(srgvChargingJob); @@ -185,14 +189,11 @@ public class CdzThread implements Runnable { chargingJobService.insertHistory(srgvChargingJob.getGuid()); chargingJobService.deleteSrgvChargingJobByGuid(srgvChargingJob.getGuid()); deviceCdzs.get(0).setSpare1(null); - deviceCdzService.updateDeviceCdz(deviceCdzs.get(0)); + deviceCdzService.updateDeviceCdzSpare(deviceCdzs.get(0)); } } - } - } - } /** @@ -207,42 +208,43 @@ public class CdzThread implements Runnable { wcsChargingJob.setAgvId(deviceSrgv.getDeviceId().toString()); List srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(wcsChargingJob); if (CollUtil.isEmpty(srgvChargingJobs)) { - List cdzList = deviceCdzService.selectDeviceCdzListNoSRgvId(); - if (CollUtil.isNotEmpty(cdzList)) { - //寻找最接近的充电桩 - Integer floor = deviceSrgv.getCurrFloor(); - DeviceCdz cdz = null; - Optional min = cdzList.stream().filter(c -> c.getSzcs().equals(floor)).min((o1, o2) -> { - Integer distance1 = Math.abs(o1.getSzcs()); - Integer distance2 = Math.abs(o2.getSzcs()); - return distance1 - distance2; - }); - if (min.isPresent()) { - cdz = min.get(); - } - if (ObjUtil.isNotNull(cdz)) { - //生成充电任务 - SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); - srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString()); - srgvChargingJobParam.setChargingSite("08020" + cdz.getSzcs()); - srgvChargingJobParam.setChargingId(cdz.getId().toString()); - List wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); - if (CollUtil.isEmpty(wcsChargingJobs)) { - SrgvChargingJob scj = new SrgvChargingJob(); - scj.setGuid(IdUtil.fastSimpleUUID()); - scj.setChargingSite(cdz.getSiteId()); - scj.setJobStatus("1"); - scj.setChargingStatus("0"); - scj.setStartDate(DateUtil.now()); - scj.setJobType("1");//到充电桩 - scj.setAgvId(deviceSrgv.getDeviceId().toString()); - scj.setChargingId(cdz.getId().toString()); - chargingJobService.insertSrgvChargingJob(scj); - cdz.setSpare1(deviceSrgv.getDeviceId().toString()); - deviceCdzService.updateDeviceCdz(cdz); - } + DeviceCdz deviceCdz = deviceCdzService.selectDeviceCdzById(Long.valueOf(deviceSrgv.getDeviceId())); +// List cdzList = deviceCdzService.selectDeviceCdzListNoSRgvId(); +// if (CollUtil.isNotEmpty(deviceCdz)) { + //寻找最接近的充电桩 +// Integer floor = deviceSrgv.getCurrFloor(); +// DeviceCdz cdz = null; +// Optional min = cdzList.stream().min((o1, o2) -> { +// Integer distance1 = Math.abs(o1.getSzcs()); +// Integer distance2 = Math.abs(o2.getSzcs()); +// return distance1 - distance2; +// }); +// if (min.isPresent()) { +// cdz = min.get(); +// } + if (ObjUtil.isNotNull(deviceCdz)) { + //生成充电任务 + SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); + srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString()); + srgvChargingJobParam.setChargingSite("08020" + deviceCdz.getSzcs()); + srgvChargingJobParam.setChargingId(deviceCdz.getId().toString()); + List wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); + if (CollUtil.isEmpty(wcsChargingJobs)) { + SrgvChargingJob scj = new SrgvChargingJob(); + scj.setGuid(IdUtil.fastSimpleUUID()); + scj.setChargingSite(deviceCdz.getSiteId()); + scj.setJobStatus("1"); + scj.setChargingStatus("0"); + scj.setStartDate(DateUtil.now()); + scj.setJobType("1");//到充电桩 + scj.setAgvId(deviceSrgv.getDeviceId().toString()); + scj.setChargingId(deviceCdz.getId().toString()); + chargingJobService.insertSrgvChargingJob(scj); + deviceCdz.setSpare1(deviceSrgv.getDeviceId().toString()); + deviceCdzService.updateDeviceCdz(deviceCdz); } } +// } } } } @@ -265,7 +267,7 @@ public class CdzThread implements Runnable { srgvChargingJobParamOut.setJobType("2"); List srgvChargingJobOut = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParamOut); - if (CollUtil.isNotEmpty(srgvChargingJobs)&&CollUtil.isEmpty(srgvChargingJobOut)) { + if (CollUtil.isNotEmpty(srgvChargingJobs) && CollUtil.isEmpty(srgvChargingJobOut)) { SrgvChargingJob scj = srgvChargingJobs.get(0); //插入历史 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java index 0dbcc7e..6ce3555 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/monit/MonitoringThread.java @@ -51,7 +51,9 @@ public class MonitoringThread implements Runnable { } for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(srgvCode); - deviceSrgvService.updateDeviceSrgv(deviceSrgv); + if (!deviceSrgv.getCurrSite().equals("000000")){ + deviceSrgvService.updateDeviceSrgv(deviceSrgv); + } } for (String tsjCode : PlcTsjRead.deviceTsjMap.keySet()) { DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(tsjCode); @@ -59,6 +61,8 @@ public class MonitoringThread implements Runnable { } for (String cdzCode : PlcCdzRead.deviceCdzMap.keySet()) { DeviceCdz deviceCdz = PlcCdzRead.deviceCdzMap.get(cdzCode); + deviceCdz.setSpare1(null); + deviceCdz.setModel(deviceCdz.getStatus()); deviceCdzService.updateDeviceCdz(deviceCdz); } try { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java index 384a4f9..bdd0709 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/srgv/BaseSRgvThread.java @@ -18,6 +18,7 @@ import com.ruoyi.common.domain.SendData2; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.device.srgv.domain.DeviceSrgv; import com.ruoyi.device.srgv.service.IDeviceSrgvService; +import com.ruoyi.device.ssj.domain.DeviceSsj; import com.ruoyi.job.charg.domain.SrgvChargingJob; import com.ruoyi.job.charg.service.ISrgvChargingJobService; import com.ruoyi.job.domain.JobCallBack; @@ -30,8 +31,11 @@ import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; import com.ruoyi.schedule.ScheduleThread; import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead; import com.ruoyi.schedule.plcRead.srgv.roadUtil.PathFinder; +import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead; +import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; +import java.sql.Struct; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -65,7 +69,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { private IBasCargoSpaceService basCargoSpaceService; public IDeviceSrgvService deviceSrgvService; - private int taskCache = 450001; + private int taskCache = 30001; public void init() { sRgvCodeList = new HashMap<>(); @@ -109,10 +113,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { createCarInQueue(); // 出库队列 createCarOutQueue(); - // 充电任务 + // 充电任务队列 inCharging(deviceSrgv); - // 充电完成调离 -// outCharging(deviceSrgv); + } else { log.error("小车设备为空"); @@ -154,6 +157,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { param.setJobStatus("1"); param.setJobType("1"); param.setAgvId(deviceSrgv.getDeviceId().toString()); + + if (deviceSrgv != null && deviceSrgv.getWorkMode() != 5) { + return; + } List srgvChargingJobs = srgvChargingJobMapper.selectSrgvChargingJobList(param); if (CollUtil.isNotEmpty(srgvChargingJobs)) { SrgvChargingJob srgvChargingJob = srgvChargingJobs.get(0); @@ -171,8 +178,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSrgvQueue.setCargo("0"); wcsSrgvQueue.setIssued("0"); wcsSrgvQueue.setExecutionStatus("1"); - wcsSrgvQueue.setCargoPickSite(""); - wcsSrgvQueue.setCargoPlaceSite(""); + wcsSrgvQueue.setCargoPickSite(deviceSrgv.getCurrSite()); + wcsSrgvQueue.setCargoPlaceSite(chargingSite); wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); WcsSrgvMap wcsSrgvMap = wcsSrgvMapService.selectWcsSrgvMapBySiteId(chargingSite); @@ -182,8 +189,18 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } else { wcsSrgvQueue.setEndSite("tsj"); wcsSrgvQueue.setDefault02("8"); + +// Integer count = wcsSagvQueueMapper.selectTsj(); +// if (count > 0) { +// return; +// } } - wcsSrgvQueue.setTaskNo("9999"); + // TODO 如果小车的当前点和小车的充电点位置一样,直接生成已经下发的队列 等着充电就可以 +// if (deviceSrgv.getCurrSite().equals(chargingSite)) { +// wcsSrgvQueue.setIssued("1"); +// wcsSrgvQueue.setExecutionStatus("3"); +// } + wcsSrgvQueue.setTaskNo(String.valueOf(deviceSrgv.getDeviceId() + 500)); wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); @@ -212,148 +229,243 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { * 生成出库小车队列 */ private void createCarOutQueue() { - MydoJob mydoJob = new MydoJob(); - mydoJob.setInOut("2"); - mydoJob.setExecutionPhase("0"); - mydoJob.setStatus("1"); - List mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob); + List mydoJobs = mydoJobService.selectMydoJobOut(); if (!mydoJobs.isEmpty()) { - MydoJob mydoJob1 = mydoJobs.get(0); - // 查询是否有已下发的该任务号队列 - WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); - if (wcsSrgvQueue1 == null) { - ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; - List deviceSrgvList = deviceSrgvMap.values().stream() - .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5) - .filter(deviceSrgv -> deviceSrgv.getBattery() > 30) - .sorted((d1, d2) -> Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d2.getCurrFloor()) - - Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d1.getCurrFloor())) - .collect(Collectors.toList()); - if (!deviceSrgvList.isEmpty()) { - DeviceSrgv deviceSrgv = null; - for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { - //优先出库层,如果没有优先邻近层 - if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { - deviceSrgv = deviceSrgv1; - break; - } else if (deviceSrgv == null || (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv1.getCurrFloor())) < (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv.getCurrFloor()))) { - WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); - if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { - deviceSrgv = deviceSrgv1; + for (MydoJob mydoJob1 : mydoJobs) { + // 根据 当前层的 出库任务查询是否存在当前层的移库任务,如果有直接return; +// String theFloor = mydoJob1.getTheFloor(); +// Integer count= mydoJobService.selectTheFloorYk(theFloor); +// if (count>0){ +// return; +// } + + WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); + if (wcsSrgvQueue1 == null) { + + ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; + List deviceSrgvList = deviceSrgvMap.values().stream() + .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 1) + .filter(deviceSrgv -> deviceSrgv.getBattery() > 30) + .sorted((d1, d2) -> Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d2.getCurrFloor()) + - Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d1.getCurrFloor())) + .collect(Collectors.toList()); + if (!deviceSrgvList.isEmpty()) { + DeviceSrgv deviceSrgv = null; + + WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); + wcsSrgvMap.setCargoSpaceId(mydoJob1.getCargoSpaceId()); + List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); + //取货地址 + String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); + //先找流程相等的小车 + List currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList()); + + + int minYDistance = 100000; // 记录最小的Y轴距离 + int minXDistance = 100000; // 记录最小的X轴距离 + DeviceSrgv bestSrgv = null; // 最终选中的最优小车 + + for (DeviceSrgv srgv : currentFloorCarList) { + // 坐标截取和转换(保留原有逻辑) + Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2)); + Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2)); + Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4)); + Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4)); + + // 1. 计算当前小车到目标点的Y轴、X轴绝对距离 + int currentYDistance = Math.abs(startY - endY); + int currentXDistance = Math.abs(startX - endX); + + // 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序 + if (currentYDistance < minYDistance) { + // 情况1:当前Y轴距离更小,直接更新最优解 + minYDistance = currentYDistance; + minXDistance = currentXDistance; + bestSrgv = srgv; + log.info("楼层相等,找到更近小车(Y轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv); + } else if (currentYDistance == minYDistance) { + // 情况2:Y轴距离相同,比较X轴距离 + if (currentXDistance < minXDistance) { + minXDistance = currentXDistance; + bestSrgv = srgv; + log.info("楼层相等,找到更近小车(X轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv); + } } } - } - if (deviceSrgv != null) { - WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); - WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); - if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) { - //查询小车是否为取货楼层 - String endSite = ""; - String issued = "0"; - String executionStatus = "1"; - String default08 = "";//是否二段任务标识 - String default06 = ""; - WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); - wcsSrgvMap.setCargoSpaceId(mydoJob1.getCargoSpaceId()); - List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); - //取货地址 - String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); - Integer currFloor = deviceSrgv.getCurrFloor(); - Integer theLayer = wcsSrgvMaps.get(0).getPlcLayer(); - if (Objects.equals(deviceSrgv.getCurrFloor(), wcsSrgvMaps.get(0).getPlcLayer())) { - //终点是巷道口到位输送线 - endSite = cargoPickSite; - //生成队列时插入二段下发标识和第二段任务终点 - String groupCodingNo = basCargoSpaceService.selecGroupCodingBySite(endSite); - String siteId = basCargoSpaceService.selectMaxSiteIdByNo(groupCodingNo); - if (!endSite.equals(siteId) && !deviceSrgv.getCurrSite().equals(endSite)) { - default08 = "1"; - default06 = siteId; - } - if (cargoPickSite.equals(deviceSrgv.getCurrSite())) { - issued = "1"; - executionStatus = "3"; - } - } else { - //终点是提升机 - endSite = "tsj"; - } - WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); - wcsSrgvMap1.setRemark(mydoJob1.getExitId()); - List wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1); - String cargoPlaceSite = wcsSrgvMaps1.get(0).getSiteId(); + // 最终选中的小车赋值给deviceSrgv(保持原有变量名兼容) + deviceSrgv = bestSrgv; + if (deviceSrgv == null) { + //如果未选择到小车,再找其他楼层的小车 + for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { + if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { + WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); + if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { + deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车 + log.info("楼层不相等:{}", deviceSrgv); - List sameSiteDevices = deviceSrgvMap.values().stream() - .filter(d -> d.getWorkMode() == 5 - && d.getStatus() == 1 - && d.getCurrSite().equals(cargoPlaceSite)) - .collect(Collectors.toList()); - if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { - WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); - wcsSrgvMap3.setRemark("cache"); - List wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3); - for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) { - //deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象 - if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) { - //生成小车到缓存点队列 - WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString()); - WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); - wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); - List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue); - if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) { - WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue(); - wcsSrgvQueue3.setGuid(UUID.randomUUID().toString()); - wcsSrgvQueue3.setTaskNo("9999"); - wcsSrgvQueue3.setTaskType("1"); - wcsSrgvQueue3.setPriority(Long.parseLong("2")); - wcsSrgvQueue3.setCargo("1"); - wcsSrgvQueue3.setIssued(issued); - wcsSrgvQueue3.setExecutionStatus(executionStatus); - wcsSrgvQueue3.setCargoPickSite(cargoPickSite); - wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); - wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite()); - wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId()); - wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString()); - wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString()); - wcsSrgvQueue3.setDefault02("4"); - wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString()); - wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3); - } } } } + } + if (deviceSrgv != null) { + WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); +// WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); + + if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 +// && wcsSrgvQueue4 == null + ) { + //查询小车是否为取货楼层 + String endSite = ""; + String issued = "0"; + String executionStatus = "1"; + String default08 = "";//是否二段任务标识 + String default06 = ""; + + Integer currFloor = deviceSrgv.getCurrFloor(); + Integer theLayer = wcsSrgvMaps.get(0).getPlcLayer(); + if (Objects.equals(deviceSrgv.getCurrFloor(), wcsSrgvMaps.get(0).getPlcLayer())) { + //终点是巷道口到位输送线 + endSite = cargoPickSite; + //生成队列时插入二段下发标识和第二段任务终点 + String groupCodingNo = basCargoSpaceService.selecGroupCodingBySite(endSite); + String siteId = basCargoSpaceService.selectMaxSiteIdByNo(groupCodingNo); + if (!endSite.equals(siteId) && !deviceSrgv.getCurrSite().equals(endSite)) { + default08 = "1"; + default06 = siteId; + } + if (cargoPickSite.equals(deviceSrgv.getCurrSite())) { + issued = "1"; + executionStatus = "3"; + } + } else { + //终点是提升机 + endSite = "tsj"; + } + String ssj1 = null; + String ssj2 = null; + mydoJob1.setExitId(null); + WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); + String cargoPlaceSite = ""; + ConcurrentHashMap deviceSsjMap = PlcSsjRead.deviceSsjMap; + List outModelSSJ = new ArrayList<>(); + if (!mydoJob1.getInOrOut().equals("30")) { + for (String deviceSsj : deviceSsjMap.keySet()) { + if (deviceSsj.equals("TD1001") || deviceSsj.equals("TD1008")) { + DeviceSsj deviceSsj1 = deviceSsjMap.get(deviceSsj); + if (deviceSsj1.getModel() == 2) { + String s = ""; + String ssj = ""; + if (deviceSsj1.getName().equals("TD1001")) { + s = "050101"; + ssj1 = "L1004"; + } else { + s = "070101"; + ssj2 = "L1005"; + } + + } + } + } + Integer count1 = 0; + Integer count2 = 0; + if (ssj1 != null) { + count1 = mydoJobService.selectExit(ssj1); + } + if (ssj2 != null) { + count2 = mydoJobService.selectExit(ssj2); + } + if (ssj1 != null && ssj2 != null) { + if (count1 < count2) { + mydoJob1.setExitId(ssj1); + mydoJob1.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + mydoJobService.updateMydoJob(mydoJob1); + outModelSSJ.add("050101"); + } else { + mydoJob1.setExitId(ssj2); + mydoJob1.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + mydoJobService.updateMydoJob(mydoJob1); + outModelSSJ.add("070101"); + } + } + if (ssj1 != null && ssj2 == null) { + mydoJob1.setExitId(ssj1); + mydoJob1.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + mydoJobService.updateMydoJob(mydoJob1); + outModelSSJ.add("050101"); + } + if (ssj1 == null && ssj2 != null) { + mydoJob1.setExitId(ssj2); + mydoJob1.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + mydoJobService.updateMydoJob(mydoJob1); + outModelSSJ.add("070101"); + } - //生成小车取货队列 - WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); - wcsSrgvQueue.setGuid(UUID.randomUUID().toString()); - wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo()); - wcsSrgvQueue.setTaskType("1"); - wcsSrgvQueue.setPriority(Long.parseLong("2")); - wcsSrgvQueue.setCargo("1"); - wcsSrgvQueue.setIssued(issued); - wcsSrgvQueue.setExecutionStatus(executionStatus); - wcsSrgvQueue.setCargoPickSite(cargoPickSite); + cargoPlaceSite = wcsSagvQueueMapper.selectMinCountJob(outModelSSJ); + if (Objects.equals(cargoPlaceSite, "")) { + return; + } + } - wcsSrgvQueue.setCargoPlaceSite(cargoPlaceSite); - wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); - wcsSrgvQueue.setEndSite(endSite); - wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); - wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); - if (endSite.equals("tsj")) { - wcsSrgvQueue.setDefault02("8"); - } else { - wcsSrgvQueue.setDefault02("4"); + wcsSrgvMap1.setRemark(mydoJob1.getExitId()); + //TODO 读取输送机入出库模式分配出口 + List wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1); + String cargoPlaceSite1 = cargoPlaceSite; + List sameSiteDevices = deviceSrgvMap.values().stream() + .filter(d -> d.getWorkMode() == 5 + && d.getStatus() == 1 + && d.getCurrSite().equals(cargoPlaceSite1)) + .collect(Collectors.toList()); + if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { + WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); + wcsSrgvMap3.setRemark("cache"); + + } + + // 强复合作业控制,如果车在取货放货点,判断是否有要入库的作业,有的话则直接退出,让小车开始进入库的 + Integer InJobCount = mydoJobService.selectMydoJobIn(); + if (deviceSrgv != null && (deviceSrgv.getCurrSite().equals("070101") || deviceSrgv.getCurrSite().equals("050101")) && InJobCount > 0) { + return; + } + + + //生成小车取货队列 + WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); + wcsSrgvQueue.setGuid(UUID.randomUUID().toString()); + wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo()); + wcsSrgvQueue.setTaskType("1"); + wcsSrgvQueue.setPriority(Long.parseLong("2")); + wcsSrgvQueue.setCargo("1"); + wcsSrgvQueue.setIssued(issued); + wcsSrgvQueue.setExecutionStatus(executionStatus); + wcsSrgvQueue.setCargoPickSite(cargoPickSite); + if (mydoJob1.getInOrOut().equals("30")) { + WcsSrgvMap wcsSrgvMapsite = new WcsSrgvMap(); + wcsSrgvMapsite.setCargoSpaceId(mydoJob1.getTargetCargoSpaceId()); + List wcsSrgvSite = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapsite); + cargoPlaceSite = wcsSrgvSite.get(0).getSiteId(); + } + wcsSrgvQueue.setCargoPlaceSite(cargoPlaceSite); + wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); + wcsSrgvQueue.setEndSite(endSite); + wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); + wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); + if (endSite.equals("tsj")) { + wcsSrgvQueue.setDefault02("8"); + mydoJob1.setExitId(null); + mydoJobService.updateMydoJob(mydoJob1); + } else { + wcsSrgvQueue.setDefault02("4"); + } + String cargoSpaceId = mydoJob1.getCargoSpaceId(); + String tarFloor = cargoSpaceId.substring(5, 6); + wcsSrgvQueue.setDefault07(tarFloor); + wcsSrgvQueue.setDefault08(default08); + wcsSrgvQueue.setDefault06(default06); + wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); } - String cargoSpaceId = mydoJob1.getCargoSpaceId(); - String tarFloor = cargoSpaceId.substring(5, 6); - wcsSrgvQueue.setDefault07(tarFloor); - wcsSrgvQueue.setDefault08(default08); - wcsSrgvQueue.setDefault06(default06); - wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); } } } @@ -371,151 +483,219 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { mydoJob.setInOut("1"); List mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob); if (!mydoJobs.isEmpty()) { - MydoJob mydoJob1 = mydoJobs.get(0); - // 查询是否有已下发的该任务号队列 - WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); + for (MydoJob mydoJob1 : mydoJobs) { + // 查询是否有已下发的该任务号队列 + WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); - if (wcsSrgvQueue1 == null) { - ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; + if (wcsSrgvQueue1 == null) { + ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; - List deviceSrgvList = deviceSrgvMap.values().stream() - .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5) - .filter(deviceSrgv -> deviceSrgv.getBattery() > 30) - .filter(deviceSrgv -> deviceSrgv.getCurrFloor() > 0) - .sorted((d1, d2) -> d2.getCurrFloor().compareTo(d1.getCurrFloor())) - .collect(Collectors.toList()); + List deviceSrgvList = deviceSrgvMap.values().stream() + .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5) + .filter(deviceSrgv -> deviceSrgv.getBattery() > 30) + .filter(deviceSrgv -> deviceSrgv.getCurrFloor() > 0) + .filter(deviceSrgv -> deviceSrgv.getStatus() == 1) + .sorted((d1, d2) -> d2.getCurrFloor().compareTo(d1.getCurrFloor())) + .collect(Collectors.toList()); - log.info("list:{}", deviceSrgvList); + log.info("list:{}", deviceSrgvList); - if (!deviceSrgvList.isEmpty()) { - DeviceSrgv deviceSrgv = null; - for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { - if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { - deviceSrgv = deviceSrgv1; - log.info("楼层相等:{}", deviceSrgv); - break; // 找到了相同楼层的直接选它 - } else { - WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); - if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { - deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车 - log.info("楼层bu相等:{}", deviceSrgv); + if (!deviceSrgvList.isEmpty()) { + DeviceSrgv deviceSrgv = null; + //找到入库 + WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); + wcsSrgvMap.setRemark(mydoJob1.getEntranceId()); + if (StrUtil.isEmpty(wcsSrgvMap.getRemark())) { + log.error("入库任务号:{} 入库入口ID为空", mydoJob1.getTaskNo()); + return; + } + List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); + //取货地址 + String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); + //先找层数相等的小车 + List currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList()); + int minYDistance = 100000; // 记录最小的Y轴距离 + int minXDistance = 100000; // 记录最小的X轴距离 + DeviceSrgv bestSrgv = null; // 最终选中的最优小车 + Integer count = wcsSagvQueueMapper.selectByCaogoPlaceSite("070101"); + Integer counts = wcsSagvQueueMapper.selectByCaogoPlaceSite("050101"); + // 暂时不加限制 +// if (currentFloorCarList.size() == 0 && (counts > 0 || count > 0)) { +// return; +// } + + // 先找目标层小车 + for (DeviceSrgv srgv : currentFloorCarList) { + // 坐标截取和转换(保留原有逻辑) + Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2)); + Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2)); + Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4)); + Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4)); + + // 1. 计算当前小车到目标点的Y轴、X轴绝对距离 + int currentYDistance = Math.abs(startY - endY); + int currentXDistance = Math.abs(startX - endX); + + // 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序 + // 用 if-else if 合并,互斥判断 + if (currentYDistance < minYDistance) { + // Y更近 + minYDistance = currentYDistance; + minXDistance = currentXDistance; + bestSrgv = srgv; + } else if (currentYDistance == minYDistance) { + // Y相同,比X + if (currentXDistance < minXDistance) { + minXDistance = currentXDistance; + bestSrgv = srgv; + } } } - } - if (deviceSrgv != null) { + // 最终选中的小车赋值给deviceSrgv(保持原有变量名兼容) + deviceSrgv = bestSrgv; + if (deviceSrgv == null) { + //如果没找到目标层小车 先找一层的车 + for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { + if (deviceSrgv1.getCurrFloor().toString().equals("1")) { + WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); + if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { + Integer startX = Convert.toInt(StrUtil.sub(deviceSrgv1.getCurrSite(), 0, 2)); + Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2)); + Integer startY = Convert.toInt(StrUtil.sub(deviceSrgv1.getCurrSite(), 2, 4)); + Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4)); - WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); - WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); + // 1. 计算当前小车到目标点的Y轴、X轴绝对距离 + int currentYDistance = Math.abs(startY - endY); + int currentXDistance = Math.abs(startX - endX); - if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) { - - //查询小车是否为1楼,且1楼小车不在入库站点 - String endSite = ""; - String issued = "0"; - String executionStatus = "1"; - WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); - wcsSrgvMap.setRemark(mydoJob1.getEntranceId()); - if (StrUtil.isEmpty(wcsSrgvMap.getRemark())) { - log.error("入库任务号:{} 入库入口ID为空", mydoJob1.getTaskNo()); - return; - } - List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); - //取货地址 - String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); - - if (deviceSrgv.getCurrFloor() == 1) { - endSite = cargoPickSite; - if (cargoPickSite.equals(deviceSrgv.getCurrSite())) { - // 小车已在取货点 - issued = "1"; - executionStatus = "3"; - } - } else { - // 小车不在1楼 - endSite = "tsj"; - } - //筛选出deviceSrgvMap中deviceSrgv.getWorkMode() == 4并且deviceSrgv.getStatus() == 1并且deviceSrgv.getCurrSite() == cargoPickSite得对象,并排除掉其中deviceId与deviceSrgv.getDeviceId()相同的对象 - - List sameSiteDevices = deviceSrgvMap.values().stream() - .filter(d -> d.getWorkMode() == 5 - && d.getStatus() == 1 - && d.getCurrSite().equals(cargoPickSite)) - .collect(Collectors.toList()); - if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { - WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); - wcsSrgvMap3.setRemark("cache"); - List wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3); - for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) { - //deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象 - if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) { - WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString()); - WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); - wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); - List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue); - if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) { - //生成占位小车到缓存点队列 - WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue(); - wcsSrgvQueue3.setGuid(UUID.randomUUID().toString()); - wcsSrgvQueue3.setTaskNo(mydoJob1.getTaskNo()); - wcsSrgvQueue3.setTaskType("1"); - wcsSrgvQueue3.setPriority(Long.parseLong("2")); - wcsSrgvQueue3.setCargo("1"); - wcsSrgvQueue3.setIssued(issued); - wcsSrgvQueue3.setExecutionStatus(executionStatus); - wcsSrgvQueue3.setCargoPickSite(cargoPickSite); - wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); - wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite()); - wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId()); - wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString()); - wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString()); - wcsSrgvQueue3.setDefault02("4"); - wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString()); - wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3); - return; + // 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序 + // 用 if-else if 合并,互斥判断 + if (currentYDistance < minYDistance) { + // Y更近 + minYDistance = currentYDistance; + minXDistance = currentXDistance; + deviceSrgv = deviceSrgv1; + } else if (currentYDistance == minYDistance) { + // Y相同,比X + if (currentXDistance < minXDistance) { + minXDistance = currentXDistance; + deviceSrgv = deviceSrgv1; + } } } + // 一层的车没有 再找不等于作业层的车 + } else if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { + WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); + if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { + Integer startX = Convert.toInt(StrUtil.sub(deviceSrgv1.getCurrSite(), 0, 2)); + Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2)); + Integer startY = Convert.toInt(StrUtil.sub(deviceSrgv1.getCurrSite(), 2, 4)); + Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4)); + // 1. 计算当前小车到目标点的Y轴、X轴绝对距离 + int currentYDistance = Math.abs(startY - endY); + int currentXDistance = Math.abs(startX - endX); + // 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序 + // 用 if-else if 合并,互斥判断 + if (currentYDistance < minYDistance) { + // Y更近 + minYDistance = currentYDistance; + minXDistance = currentXDistance; + deviceSrgv = deviceSrgv1; + } else if (currentYDistance == minYDistance) { + // Y相同,比X + if (currentXDistance < minXDistance) { + minXDistance = currentXDistance; + deviceSrgv = deviceSrgv1; + } + } + } } } + } - - //生成小车取货队列 - WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); - wcsSrgvQueue.setGuid(UUID.randomUUID().toString()); - wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo()); - wcsSrgvQueue.setTaskType("1"); - wcsSrgvQueue.setPriority(Long.parseLong("2")); - wcsSrgvQueue.setCargo("1"); - wcsSrgvQueue.setIssued(issued); - wcsSrgvQueue.setExecutionStatus(executionStatus); - wcsSrgvQueue.setCargoPickSite(cargoPickSite); - WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); - wcsSrgvMap1.setCargoSpaceId(mydoJob1.getCargoSpaceId()); - List wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1); - wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMaps1.get(0).getSiteId()); - wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); - wcsSrgvQueue.setEndSite(endSite); - wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); - wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); - if (endSite.equals("tsj")) { - wcsSrgvQueue.setDefault02("8"); - } else { - wcsSrgvQueue.setDefault02("4"); + if (deviceSrgv != null) { + Integer currFloor = deviceSrgv.getCurrFloor(); + String currSite = deviceSrgv.getCurrSite(); + Integer i = mydoJobService.selectByJobOut(currFloor); + Integer a = mydoJobService.selectByJobOutIsOne(currFloor); + if (i > 0 && currFloor > 1) { + return; } - wcsSrgvQueue.setDefault07("1"); - wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); + // 车在一层 并且一层的出库任务还有,并且车的当前点位不在取货放货点 + if (currFloor == 1 && a > 0 && !deviceSrgv.getCurrSite().equals("070101") && !deviceSrgv.getCurrSite().equals("050101")) { + return; + } + } + + if (deviceSrgv != null) { + + WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); + WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); + + if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 +// && wcsSrgvQueue4 == null + ) { + + //查询小车是否为1楼,且1楼小车不在入库站点 + String endSite = ""; + String issued = "0"; + String executionStatus = "1"; + + + if (deviceSrgv.getCurrFloor() == 1) { + endSite = cargoPickSite; + if (cargoPickSite.equals(deviceSrgv.getCurrSite())) { + // 小车已在取货点 + issued = "1"; + executionStatus = "3"; + } + } else { + // 小车不在1楼 + endSite = "tsj"; + } + + + + //生成小车取货队列 + WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); + wcsSrgvQueue.setGuid(UUID.randomUUID().toString()); + wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo()); + wcsSrgvQueue.setTaskType("1"); + wcsSrgvQueue.setPriority(Long.parseLong("2")); + wcsSrgvQueue.setCargo("1"); + wcsSrgvQueue.setIssued(issued); + wcsSrgvQueue.setExecutionStatus(executionStatus); + wcsSrgvQueue.setCargoPickSite(cargoPickSite); + WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); + wcsSrgvMap1.setCargoSpaceId(mydoJob1.getCargoSpaceId()); + List wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1); + wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMaps1.get(0).getSiteId()); + wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); + wcsSrgvQueue.setEndSite(endSite); + wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); + wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); + if (endSite.equals("tsj")) { + wcsSrgvQueue.setDefault02("8"); + } else { + wcsSrgvQueue.setDefault02("4"); + } + wcsSrgvQueue.setDefault07("1"); + wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); + mydoJob1.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + mydoJobService.updateMydoJob(mydoJob1); + + } } } } } } - } /** @@ -543,7 +723,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { sendMainTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); } else { //小车不在起始点 - sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, startSite); +// sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, startSite); + sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); } } } @@ -551,6 +732,134 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } + /** + * 公共方法:生成小车避让任务 + */ + private void buildAvoidTask(String agvId, DeviceSrgv device, Integer floor) { + ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; + List deviceSrgvs = deviceSrgvMap.values().stream() + .filter(d -> d.getWorkMode() == 5 + && d.getStatus() == 1 + && d.getCurrFloor().equals(floor)) + .collect(Collectors.toList()); + ArrayList sites = new ArrayList<>(); + for (DeviceSrgv d : deviceSrgvs) { + sites.add(d.getCurrSite()); + } + List cacheMaps = wcsSrgvMapService.selectNotInsite("cache", floor, sites); + if (CollUtil.isEmpty(cacheMaps)) { + log.warn("楼层 {} 无可用避让缓存点,无法生成避让任务", floor); + return; + } + + // 生成阻挡车的避让任务 + WcsSrgvQueue taskB = new WcsSrgvQueue(); + taskB.setGuid(UUID.randomUUID().toString()); + taskB.setTaskNo(String.valueOf(taskCache)); + taskB.setAgvId(agvId); + taskB.setTaskType("4"); // 避让任务 + taskB.setDefault02("4"); // 业务类型标识为点到点 + taskB.setPriority(9L); // 高优先级 + taskB.setIssued("0"); // 未下发 + taskB.setExecutionStatus("1"); + taskB.setStartSite(device.getCurrSite()); + taskB.setCargoPickSite(device.getCurrSite()); + + // 选择避让缓存点 + if (cacheMaps.size() > 1) { + Integer count = wcsSagvQueueMapper.selectByCaogoPlaceSite(cacheMaps.get(0).getSiteId()); + if (count > 0) { + taskB.setCargoPlaceSite(cacheMaps.get(1).getSiteId()); + taskB.setEndSite(cacheMaps.get(1).getSiteId()); + } else { + taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId()); + taskB.setEndSite(cacheMaps.get(0).getSiteId()); + } + } else { + taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId()); + taskB.setEndSite(cacheMaps.get(0).getSiteId()); + } + + taskB.setTheFloor(floor.toString()); + taskB.setDefault07(floor.toString()); + taskB.setCreateDate(DateUtil.now()); + wcsSagvQueueMapper.insertWcsSrgvQueue(taskB); + taskCache++; + } + + /** + * 处理通道占用避让:目标通道有其他车则生成避让任务 + * + * @param currDevice 当前调度小车 + * @param floor 当前楼层 + * @param shortestPath 最短路径 + * @return true=已触发避让,当前车需等待;false=通道无占用,正常走后续逻辑 + */ + private boolean handleChannelAvoid(DeviceSrgv currDevice, Integer floor, List shortestPath) { + // 1. 取路径终点坐标 + int[] lastPoint = shortestPath.get(shortestPath.size() - 1); + int x = lastPoint[0]; + int y = lastPoint[1]; + + // 2. 根据坐标查询站点及所属通道 + WcsSrgvMap queryMap = new WcsSrgvMap(); + queryMap.setX(x); + queryMap.setY(y); + queryMap.setZ(floor); + List siteList = wcsSrgvMapService.selectWcsSrgvMapList(queryMap); + if (CollUtil.isEmpty(siteList)) { + return false; + } + // 目标通道ID + String targetChannelId = siteList.get(0).getSpaceArea(); + if (StrUtil.isBlank(targetChannelId)) { + return false; + } + + // 3. 筛选:同楼层、同通道、非当前车、空闲可调度的小车 + List> channelCarList = PlcSrgvRead.deviceSrgvMap.entrySet().stream() + .filter(entry -> entry.getValue() != null) + // 同楼层 + .filter(entry -> floor.equals(entry.getValue().getCurrFloor())) + // 不是当前调度的车 + .filter(entry -> !Objects.equals(Convert.toStr(currDevice.getDeviceId()), entry.getKey())) + // 空闲可调度状态(和原有避让状态保持一致) + .filter(entry -> entry.getValue().getWorkMode() == 5 + && entry.getValue().getStatus() == 1) + // 车辆当前站点属于目标通道 + .filter(entry -> { + String currSite = entry.getValue().getCurrSite(); + WcsSrgvMap siteParam = new WcsSrgvMap(); + siteParam.setSiteId(currSite); + siteParam.setZ(floor); + List siteInfos = wcsSrgvMapService.selectWcsSrgvMapList(siteParam); + return CollUtil.isNotEmpty(siteInfos) + && targetChannelId.equals(siteInfos.get(0).getSpaceArea()); + }) + .collect(Collectors.toList()); + + // 4. 通道内无其他车,无需避让 + if (CollUtil.isEmpty(channelCarList)) { + return false; + } + + // 5. 取通道内第一台占用车,生成避让任务 + Map.Entry blockCar = channelCarList.get(0); + String blockAgvId = blockCar.getKey(); + DeviceSrgv blockDevice = blockCar.getValue(); + + // 查询阻挡车是否已有任务,无任务才生成避让 + WcsSrgvQueue checkQueue = new WcsSrgvQueue(); + checkQueue.setAgvId(blockAgvId); + List existQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(checkQueue); + if (CollUtil.isEmpty(existQueues)) { + buildAvoidTask(blockAgvId, blockDevice, floor); + log.info("通道 {} 内存在小车 {},已生成通道避让任务", targetChannelId, blockAgvId); + } + // 触发避让,当前小车等待 + return true; + } + /** * 小车发送点对点任务 */ @@ -558,31 +867,90 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { Integer floor = deviceSrgv.getCurrFloor(); //获取当前地图 Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); - if ((wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2") || wcsSrgvQueue.getDefault02().equals("4")) && wcsSrgvQueue.getTheFloor().equals("1") && !wcsSrgvQueue.getEndSite().equals("tsj")) { - //如果是1层 锁定提升机站点 - if (CollUtil.isNotEmpty(arrByRoadSite) && arrByRoadSite.values().iterator().next().getZ() == 1) { - if (arrByRoadSite.containsKey("080501")) { - arrByRoadSite.get("080501").setValue(0); + if (wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2")) { + // 出入库任务时,只要车不在提升机里面就锁定提升机的点位,设置成墙 + if (CollUtil.isNotEmpty(arrByRoadSite) && !deviceSrgv.getCurrSite().equals("09050" + floor)) { + String siteId = "08050" + floor; + if (arrByRoadSite.containsKey(siteId)) { + arrByRoadSite.get(siteId).setValue(0); } } } -// if (wcsSrgvQueue.getDefault02().equals("8")){ -// endSite="07050"+deviceSrgv.getCurrFloor(); -// } - // + // 移库任务直接锁定 + if (wcsSrgvQueue.getDefault02().equals("7")) { + String siteId = "08050" + floor; + if (arrByRoadSite.containsKey(siteId)) { + arrByRoadSite.get(siteId).setValue(0); + } + } + // 如果是点到点的 并且小车不在提升机里面才锁提升机,在提升机里面不需要锁 + if (wcsSrgvQueue.getDefault02().equals("4") && !deviceSrgv.getCurrSite().equals("09050" + floor)) { + if (CollUtil.isNotEmpty(arrByRoadSite)) { + String siteId = "08050" + floor; + if (arrByRoadSite.containsKey(siteId)) { + arrByRoadSite.get(siteId).setValue(0); + } + + } + } + // 当前是换层任务,并且车的当前层和目标层不一样的时候把提升机锁住 如果是一样的时候,则直接解锁 + if (wcsSrgvQueue.getDefault02().equals("8") && floor != Integer.parseInt(wcsSrgvQueue.getDefault07())) { + String siteId = "08050" + floor; + if (arrByRoadSite.containsKey(siteId)) { + arrByRoadSite.get(siteId).setValue(0); + } + } //处理地图 - int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv); - + int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv, floor); //计算最短路径 List shortestPath = PathFinder.findShortestPath(emptyMap, arrByRoadSite.get(startSite).getX(), arrByRoadSite.get(startSite).getY(), arrByRoadSite.get(endSite).getX(), arrByRoadSite.get(endSite).getY()); - if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1 && shortestPath.get(0)[1] == -1) { - shortestPath = null; + // TODO 小车避让 目前只针对同层最多两台车 并且点位设置到了050201 判断地图中取的路径 不能直达说明有车阻挡 直接返回-1 用-1判断小车阻挡调离小车 + if (shortestPath.size() > 0) { + + // ===================== 新增:通道占用避让判断 开始 ===================== + boolean channelNeedAvoid = handleChannelAvoid(deviceSrgv, floor, shortestPath); + if (channelNeedAvoid) { + return false; + } + // ===================== 新增:通道占用避让判断 结束 ===================== + + if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1) { + // 如果阻挡了 则找一个出库缓存点 让车先过去 + // 执行队列不是空的 且在一层 并且车在提升机里面 要去的目标点也是队列的目标点,则直接让车先去缓存出库点 + if (floor == 1 && "090501".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPlaceSite()) && "2".equals(wcsSrgvQueue.getDefault02())) { + WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap(); + wcsSrgvMapParam.setRemark("outCache"); + List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam); + List cacheSite = wcsSrgvMaps.stream().sorted(Comparator.comparing(WcsSrgvMap::getSiteId)).map(WcsSrgvMap::getSiteId).collect(Collectors.toList()); + List currentSRgvSite = new ArrayList<>(); + for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { + currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite()); + } + cacheSite.removeAll(currentSRgvSite); + if (CollUtil.isNotEmpty(cacheSite)) { + for (String cache : cacheSite) { + WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); + wcsSrgvQueueParam.setEndSite(cache); + + List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueParam); + if (CollUtil.isEmpty(wcsSrgvQueues)) { + wcsSrgvQueue.setEndSite(cacheSite.get(0)); + wcsSrgvQueue.setDefault02("7"); + wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); + shortestPath = null; + break; + } + } + } + } + return false; + } + // 空车避让 String endBlockAgv = null; DeviceSrgv endBlockDevice = null; - // TODO 通过arrByRoadSite 中的站点 查询是否存在其他车的站点,如果存在则生成其他车到避让点的队列 if (arrByRoadSite != null && !arrByRoadSite.isEmpty()) { // 将arrByRoadSite转为String类型的Set(统一类型,方便匹配) Set roadSiteSet = arrByRoadSite.keySet().stream() @@ -591,117 +959,162 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { .collect(Collectors.toSet()); // 2. Stream流式处理deviceSrgvMap - Optional> targetEntry = PlcSrgvRead.deviceSrgvMap.entrySet().stream() - .filter(entry -> entry.getValue() != null) // 过滤other为null的条目 - // 条件1:other的当前站点存在于roadSiteSet中 - .filter(entry -> roadSiteSet.contains(entry.getValue().getCurrSite())) - // 条件2:设备ID不等于当前entry的key - .filter(entry -> !Objects.equals(Convert.toStr(deviceSrgv.getDeviceId()), entry.getKey())) - .findFirst(); // 找到第一个符合条件的条目(等价于原代码的break) + Optional> targetEntry = Optional.empty(); + for (int i = 0; i < shortestPath.size(); i++) { + int endx = shortestPath.get(i)[0]; + int endy = shortestPath.get(i)[1]; + WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); + wcsSrgvMap.setX(endx); + wcsSrgvMap.setY(endy); + wcsSrgvMap.setZ(floor); + List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); + String siteId = wcsSrgvMaps.get(0).getSiteId(); + targetEntry = PlcSrgvRead.deviceSrgvMap.entrySet().stream() + .filter(entry -> entry.getValue() != null) // 过滤other为null的条目 + // 条件1:other的当前站点存在于roadSiteSet中 + .filter(entry -> roadSiteSet.contains(entry.getValue().getCurrSite())) + .filter(entry -> siteId.equals(entry.getValue().getCurrSite())) + // 条件2:设备ID不等于当前entry的key + .filter(entry -> !Objects.equals(Convert.toStr(deviceSrgv.getDeviceId()), entry.getKey())) + .findFirst(); + // 找到第一个符合条件的条目(等价于原代码的break) + if (targetEntry.isPresent()) { + break; + } + + } + // 3. 处理结果(若找到则赋值) if (targetEntry.isPresent()) { endBlockAgv = targetEntry.get().getKey(); endBlockDevice = targetEntry.get().getValue(); + shortestPath = null; } } WcsSrgvQueue wcsSrgvQueueBR = new WcsSrgvQueue(); wcsSrgvQueueBR.setAgvId(endBlockAgv); List wcsSrgvQueueBRS = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueBR); + // 如果车无执行队列,可以直接生成避让执行队列 if (endBlockDevice != null && wcsSrgvQueueBRS.isEmpty()) { // 选择当前层最近且可达的缓存点(避让点) - WcsSrgvMap cacheParam = new WcsSrgvMap(); - cacheParam.setRemark("cache"); - cacheParam.setTheLayer(floor); - List cacheMaps = wcsSrgvMapService.selectWcsSrgvMapList(cacheParam); + ConcurrentHashMap deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; + List deviceSrgvs = deviceSrgvMap.values().stream() + .filter(d -> d.getWorkMode() == 5 + && d.getStatus() == 1 + && d.getCurrFloor().equals(floor)) + .collect(Collectors.toList()); + ArrayList sites = new ArrayList<>(); + for (int i = 0; i < deviceSrgvs.size(); i++) { + sites.add(deviceSrgvs.get(i).getCurrSite()); + } + List cacheMaps = wcsSrgvMapService.selectNotInsite("cache", floor, sites); +// List cacheMaps = wcsSrgvMapService.selectWcsSrgvMapList(cacheParam); // 生成阻挡车的避让任务(点到点,高优先级,未下发) WcsSrgvQueue taskB = new WcsSrgvQueue(); taskB.setGuid(UUID.randomUUID().toString()); // 生成纯数字任务号(PLC要求),9 + HHmmss taskB.setTaskNo(String.valueOf(taskCache)); taskB.setAgvId(endBlockAgv); - taskB.setTaskType("1"); // 点到点移动 + taskB.setTaskType("4"); // 避让任务 taskB.setDefault02("4"); // 业务类型标识为点到点 taskB.setPriority(9L); // 高优先级,尽快避让 taskB.setIssued("0"); // 未下发 taskB.setExecutionStatus("1");// 初始状态 taskB.setStartSite(endBlockDevice.getCurrSite()); taskB.setCargoPickSite(endBlockDevice.getCurrSite()); - taskB.setCargoPlaceSite("05020" + endBlockDevice.getCurrFloor()); - taskB.setEndSite("05020" + endBlockDevice.getCurrFloor()); + if (cacheMaps.size() > 1) { + Integer count = wcsSagvQueueMapper.selectByCaogoPlaceSite(cacheMaps.get(0).getSiteId()); + if (count > 0) { + taskB.setCargoPlaceSite(cacheMaps.get(1).getSiteId()); + taskB.setEndSite(cacheMaps.get(1).getSiteId()); + } else { + taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId()); + taskB.setEndSite(cacheMaps.get(0).getSiteId()); + } + } + if (cacheMaps.size() == 1) { + taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId()); + taskB.setEndSite(cacheMaps.get(0).getSiteId()); + } + taskB.setTheFloor(floor.toString()); - taskB.setDefault03(endBlockDevice.getCurrSite()); +// taskB.setDefault03(endBlockDevice.getCurrSite()); taskB.setDefault07(floor.toString()); - taskB.setDefault08("1");//避让任务,直接完成 +// taskB.setDefault08("1");//避让任务,直接完成 taskB.setCreateDate(DateUtil.now()); wcsSagvQueueMapper.insertWcsSrgvQueue(taskB); + taskCache++; log.info("目标点 {" + deviceSrgv.getCurrSite() + "} 被小车 {" + deviceSrgv.getDeviceId() + "} 占用,已调度其前往避让点 {}", endSite, endBlockAgv, "02050" + endBlockDevice.getCurrFloor()); // 当前车等待下一轮调度(待阻挡车移开后自然可达) return false; } + } //判断是否能规划出最短路径 - if (shortestPath == null || shortestPath.isEmpty()) { - //判断是否是1层 空车取货 或者 满车放货 - if (floor == 1) { - - if ("2".equals(wcsSrgvQueue.getDefault02()) && "tsj".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPlaceSite())) { - //1层满车放货 - //修改终点到出库缓存点 - WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap(); - wcsSrgvMapParam.setRemark("outCache"); - List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam); - List cacheSite = wcsSrgvMaps.stream().map(WcsSrgvMap::getSiteId).collect(Collectors.toList()); - List currentSRgvSite = new ArrayList<>(); - for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { - currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite()); - } - cacheSite.removeAll(currentSRgvSite); - if (CollUtil.isNotEmpty(cacheSite)) { - for (String cache : cacheSite) { - WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); - wcsSrgvQueueParam.setEndSite(cache); - List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueParam); - if (CollUtil.isEmpty(wcsSrgvQueues)) { - wcsSrgvQueue.setEndSite(cacheSite.get(0)); - wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); - break; - } - } - } - } - if ("4".equals(wcsSrgvQueue.getDefault02()) && "tsj".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPickSite())) { - //1层空车取货 - //修改终点到避让点 - WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap(); - wcsSrgvMapParam.setRemark("cache"); - List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam); - List cacheSite = wcsSrgvMaps.stream().map(WcsSrgvMap::getSiteId).collect(Collectors.toList()); - List currentSRgvSite = new ArrayList<>(); - for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { - currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite()); - } - cacheSite.removeAll(currentSRgvSite); - if (CollUtil.isNotEmpty(cacheSite)) { - for (String cache : cacheSite) { - WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); - wcsSrgvQueueParam.setEndSite(cache); - List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueParam); - if (CollUtil.isEmpty(wcsSrgvQueues)) { - wcsSrgvQueue.setEndSite(cacheSite.get(0)); - wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); - break; - } - } - } - } - } - return false; - } +// if (shortestPath == null || shortestPath.isEmpty()) { +// //判断是否是1层 空车取货 或者 满车放货 +// if (floor == 1) { +// +// if ("2".equals(wcsSrgvQueue.getDefault02()) && "090501".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPlaceSite())) { +// //1层满车放货 +// //修改终点到出库缓存点 +// WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap(); +// wcsSrgvMapParam.setRemark("outCache"); +// List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam); +// List cacheSite = wcsSrgvMaps.stream().map(WcsSrgvMap::getSiteId).collect(Collectors.toList()); +// List currentSRgvSite = new ArrayList<>(); +// for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { +// currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite()); +// } +// cacheSite.removeAll(currentSRgvSite); +// if (CollUtil.isNotEmpty(cacheSite)) { +// for (String cache : cacheSite) { +// WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); +// wcsSrgvQueueParam.setEndSite(cache); +// +// List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueParam); +// if (CollUtil.isEmpty(wcsSrgvQueues)) { +// wcsSrgvQueue.setEndSite(cacheSite.get(0)); +// wcsSrgvQueue.setDefault02("7"); +// wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); +// break; +// } +// } +// } +// } +// if ("4".equals(wcsSrgvQueue.getDefault02()) && "tsj".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPickSite())) { +// //1层空车取货 +// //修改终点到避让点 +// WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap(); +// wcsSrgvMapParam.setRemark("cache"); +// List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam); +// List cacheSite = wcsSrgvMaps.stream().map(WcsSrgvMap::getSiteId).collect(Collectors.toList()); +// List currentSRgvSite = new ArrayList<>(); +// for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { +// currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite()); +// } +// cacheSite.removeAll(currentSRgvSite); +// if (CollUtil.isNotEmpty(cacheSite)) { +// for (String cache : cacheSite) { +// WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); +// wcsSrgvQueueParam.setEndSite(cache); +// List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueParam); +// if (CollUtil.isEmpty(wcsSrgvQueues)) { +// wcsSrgvQueue.setEndSite(cacheSite.get(0)); +// wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); +// break; +// } +// } +// } +// } +// } +// return false; +// } //获取拐点路径 @@ -745,14 +1158,14 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } if (("tsj").equals(endSite)) { if (wcsSrgvQueue.getDefault02().equals("8")) { - endSite = extractTarget(String.valueOf(pathBuilder)); - } else { +// endSite = extractTarget(String.valueOf(pathBuilder)); + endSite = "07050" + wcsSrgvQueue.getTheFloor(); + } + if (wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2")) { endSite = "09050" + wcsSrgvQueue.getTheFloor(); } } -// if (("tsj").equals(startSite)) { -// endSite = "09050" + wcsSrgvQueue.getTheFloor(); -// } + List sendDataList = null; if (StrUtil.isEmpty(wcsSrgvQueue.getDefault08())) { sendDataList = new ArrayList<>(); @@ -841,7 +1254,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { sendDataList.add(taskType); } - + // TODO 这段下发有问题 if (wcsSrgvQueue.getDefault08().equals("2") && deviceSrgv.getSpare5().equals("1")) { sendDataList = new ArrayList<>(); SendData2 path = new SendData2(); @@ -864,14 +1277,17 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcjs.setType(1); sendDataList.add(wcjs); - //任务类型转换 + //任务类型转换 //TODO 不行就改成7 SendData2 taskType = new SendData2(); taskType.setAddress("4402"); - taskType.setData("7"); + taskType.setData("9"); taskType.setType(1); sendDataList.add(taskType); } + if (sendDataList == null) { + sendDataList = new ArrayList<>(); + } //任务号、原、目标数据转换 String siteId = wcsSrgvQueue.getTaskNo();//+ "," + startSite + "," + endSite; SendData2 site = new SendData2(); @@ -901,7 +1317,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); //换层任务不修改执行阶段 - if (!wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) { + if (mydoJob != null && !wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) { mydoJob.setExecutionPhase("3"); mydoJob.setStatus("3"); mydoJobService.updateMydoJob(mydoJob); @@ -947,6 +1363,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { // 载货任务(出库、入库、移库等) sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); break; + case "7": + // 移库任务(出库、入库、移库等) + sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); + break; } if (sendFlag) { @@ -1076,7 +1496,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { * @return */ private void finishTaskByQueue(String currSite, WcsSrgvQueue wcsSrgvQueue) { - + //更新小车待机时间 + deviceSrgvService.updateLastTimeByAgvId(wcsSrgvQueue.getAgvId()); String groupCodingNo = basCargoSpaceService.selecGroupCodingBySite(currSite); String siteId = basCargoSpaceService.selectMaxSiteIdByNo(groupCodingNo); List sites = new ArrayList<>(); @@ -1084,7 +1505,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //处理换层逻辑 String site1 = "07050" + wcsSrgvQueue.getDefault07(); String site2 = "10050" + wcsSrgvQueue.getDefault07(); + String site3 = "09050" + wcsSrgvQueue.getDefault07(); sites.add(site1); + sites.add(site3); sites.add(site2); } if (Objects.equals(currSite, wcsSrgvQueue.getEndSite()) || (siteId != null && Objects.equals(currSite, siteId)) || sites.contains(currSite)) { @@ -1092,39 +1515,42 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { String cargoPickSite = wcsSrgvQueue.getCargoPickSite(); String cargoPlaceSite = wcsSrgvQueue.getCargoPlaceSite(); WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); - wcsSrgvMap.setRemark("outCache"); List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); - //当前路径地图map中如果存在小车的站点,返回true - if (wcsSrgvMaps.stream().anyMatch(wcsSrgvMap1 -> wcsSrgvMap1.getSiteId().equals(currSite))) { - //生成小车从避让点到放货/取货位置,如果是空车就到取货位置,如果是满车就到放货位置 -// wcsSrgvQueue.setExecutionStatus("4"); -// wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); -// wcsSrgvQueue.setIssued("0"); -// wcsSrgvQueue.setExecutionStatus("1"); -// wcsSrgvQueue.setStartSite(currSite); -// if ("1".equals(taskType)) { -// wcsSrgvQueue.setEndSite(cargoPickSite); -// } else if ("2".equals(taskType)) { -// wcsSrgvQueue.setEndSite(cargoPlaceSite); -// } -// wcsSrgvQueue.setTheFloor("1"); -// wcsSrgvQueue.setDefault07("1"); -// wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); -// return; + // 处理出库缓存点任务 让070301 的先走 走了之后再执行090301的任务 再070301 走完之前不能执行090301的任务 + if (wcsSrgvMaps.stream().anyMatch(wcsSrgvMap1 -> wcsSrgvMap1.getSiteId().equals(currSite)) && wcsSrgvQueue.getDefault02().equals("7")) { + WcsSrgvQueue wcsSrgvQueue1 = new WcsSrgvQueue(); + wcsSrgvQueue1.setEndSite("070301"); + List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue1); + + WcsSrgvQueue wcsSrgvQueue2 = new WcsSrgvQueue(); + wcsSrgvQueue2.setStartSite("070301"); + List wcsSrgvQueueOut = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue2); + // 如果当前站点为090301 判断是否有070301的任务要来 如果要来就等着 等到070301的任务先走了再让小车开始动 + if (currSite.equals("090301") && CollUtil.isNotEmpty(wcsSrgvQueues) && CollUtil.isNotEmpty(wcsSrgvQueueOut)) { + return; + } + MydoJob mydoJobyk = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); + if (!mydoJobyk.getInOrOut().equals("30")) { + wcsSrgvQueue.setEndSite(wcsSrgvQueue.getCargoPlaceSite()); + wcsSrgvQueue.setDefault02("2"); + wcsSrgvQueue.setIssued("0"); + wcsSrgvQueue.setExecutionStatus("1"); + wcsSrgvQueue.setTaskType("2"); + wcsSrgvQueue.setStartSite(currSite); + wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); + wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); + return; + } + } //空车任务 且当前车的位置和取货位置相同 - if ("1".equals(taskType) - && (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite)) - - ) { + if ("1".equals(taskType) && (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite))) { String endSite = ""; String xfType = ""; + // 换完层直接根据任务去接出入库任务 if (wcsSrgvQueue.getDefault02().equals("8")) { - //换层任务直接完成,等待后续入出库作业下发 - wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); - wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); - return; + } else { WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); @@ -1139,6 +1565,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { endSite = "tsj"; } + if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) { xfType = "1";//入库 } else { @@ -1169,6 +1596,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //请求wms生成库存 插入回传表 MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); if (mydoJob != null) { + mydoJob.setFinishTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + mydoJob.setStatus("4"); + mydoJobService.updateMydoJob(mydoJob); JobCallBack jobCallBack = new JobCallBack(); jobCallBack.setType(wcsSrgvQueue.getDefault02()); jobCallBack.setMydojobId(mydoJob.getJobId()); @@ -1176,28 +1606,108 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); jobCallBack.setCreateTime(new Date()); jobCallBackService.insertJobCallBack(jobCallBack); + mydoJobService.insertHistory(mydoJob.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId()); + wcsSrgvQueue.setExecutionStatus("4"); + wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); + wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); } break; case "2": MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); - if (mydoJobOut != null) { - mydoJobService.insertHistory(mydoJobOut.getJobId()); - mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId()); + if (mydoJobOut != null && (cargoPlaceSite.equals(currSite))) { + mydoJobOut.setFinishTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + mydoJobOut.setStatus("4"); + mydoJobService.updateMydoJob(mydoJobOut); + log.info("1471 taskNo:[{}],currSite:[{}],cargoPlaceSite:[{}]", wcsSrgvQueue.getTaskNo(), currSite, cargoPlaceSite); + JobCallBack jobCallBack = new JobCallBack(); + jobCallBack.setType(wcsSrgvQueue.getDefault02()); + jobCallBack.setMydojobId(mydoJobOut.getJobId()); + jobCallBack.setStatus("0"); + jobCallBack.setTaskNo(Convert.toLong(mydoJobOut.getTaskNo())); + jobCallBack.setCreateTime(new Date()); + jobCallBackService.insertJobCallBack(jobCallBack); + if (!mydoJobOut.getInOrOut().equals("22")) { + mydoJobService.insertHistory(mydoJobOut.getJobId()); + mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId()); + } +// + + wcsSrgvQueue.setExecutionStatus("4"); + wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); + wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); } + if (mydoJobOut != null && wcsSrgvQueue.getDefault06() != null && !wcsSrgvQueue.getDefault06().equals("") && siteId != null && !wcsSrgvQueue.getCargoPlaceSite().equals(siteId) && siteId.equals(wcsSrgvQueue.getDefault06())) { + String endSite = ""; + String xfType = ""; + WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); + WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); + // 取货点地图和放货点地图不为空 + if (wcsSrgvMapq != null && wcsSrgvMapf != null) { + + if (Objects.equals(wcsSrgvMapq.getTheLayer(), wcsSrgvMapf.getTheLayer())) { + //如果是同层,终点为放货点 + endSite = cargoPlaceSite; + } else { + //不同层,终点为提升机 + endSite = "tsj"; + } + + + if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) { + xfType = "1";//入库 + } else { + if ("L1004".equals(wcsSrgvMapf.getRemark()) || "L1005".equals(wcsSrgvMapf.getRemark())) { + xfType = "2";//出库 + } else { + xfType = "7";//移库 + } + } + // 更新目标点,修改执行队列 + wcsSrgvQueue.setEndSite(endSite); + wcsSrgvQueue.setDefault02(xfType); + wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString()); + wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString()); + wcsSrgvQueue.setIssued("0"); + wcsSrgvQueue.setDefault06(null); + wcsSrgvQueue.setExecutionStatus("1"); + wcsSrgvQueue.setTaskType("2"); + } + wcsSrgvQueue.setStartSite(currSite); + wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); + wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); + } + case "7"://移库,变动库存 + MydoJob mydoJobyk = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); + if (mydoJobyk != null && mydoJobyk.getInOrOut().equals("30")) { + mydoJobyk.setFinishTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + mydoJobyk.setStatus("4"); + mydoJobService.updateMydoJob(mydoJobyk); + JobCallBack jobCallBack = new JobCallBack(); + jobCallBack.setType(wcsSrgvQueue.getDefault02()); + jobCallBack.setMydojobId(mydoJobyk.getJobId()); + jobCallBack.setStatus("0"); + jobCallBack.setTaskNo(Convert.toLong(mydoJobyk.getTaskNo())); + jobCallBack.setCreateTime(new Date()); + jobCallBackService.insertJobCallBack(jobCallBack); + mydoJobService.insertHistory(mydoJobyk.getJobId()); + mydoJobService.deleteMydoJobByJobId(mydoJobyk.getJobId()); + wcsSrgvQueue.setExecutionStatus("4"); + wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); + wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); + } break; + default: break; } //删除队列,插入历史表 - wcsSrgvQueue.setExecutionStatus("4"); - wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); - wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); - // 充电任务 - } else if ("3".equals(taskType)) { + + // 充电任务 并且小车也是充电任务 + } else if ("3".equals(taskType) && wcsSrgvQueue.getDefault02().equals("3")) { //删除队列,插入历史表 wcsSrgvQueue.setExecutionStatus("4"); wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); @@ -1207,9 +1717,33 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { //充电之类的,不知道用不用 + } else if ("4".equals(taskType)) { + { + wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); + } + // 如果是空车且 任务是点到点并且目标点是“070301” + } else if ("1".equals(taskType) && wcsSrgvQueue.getDefault02().equals("4") && wcsSrgvQueue.getEndSite().equals("070301")) { + String endSite = ""; + String xfType = ""; + WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); + WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); + // 取货点地图和放货点地图不为空 + if (wcsSrgvMapq != null && wcsSrgvMapf != null) { + //如果是同层,终点为取货点 + endSite = cargoPickSite; + // 更新目标点,修改执行队列 + wcsSrgvQueue.setEndSite(endSite); + wcsSrgvQueue.setDefault02("4"); + wcsSrgvQueue.setIssued("0"); + wcsSrgvQueue.setExecutionStatus("1"); + wcsSrgvQueue.setTaskType("1"); + } + wcsSrgvQueue.setStartSite(currSite); + wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); + wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); } - //更新小车待机时间 - deviceSrgvService.updateLastTimeByAgvId(wcsSrgvQueue.getAgvId()); + + } } @@ -1237,9 +1771,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { String startSite = wcsSrgvQueue.getStartSite(); if (!startSite.equals(currSite)) { - wcsSrgvQueue.setIssued("1"); - wcsSrgvQueue.setStartDate(DateUtil.now()); - wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); +// wcsSrgvQueue.setIssued("1"); +// wcsSrgvQueue.setExecutionStatus("3"); +// wcsSrgvQueue.setStartDate(DateUtil.now()); +// wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java index 307fcb4..60c00be 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/SsjThread.java @@ -46,6 +46,13 @@ public class SsjThread implements Runnable { ssjCodes2.add("L1004"); ssjCodes2.add("L1005"); ssjCodeList.put("road", ssjCodes2); + + ArrayList ssjCodes4 = new ArrayList<>(); + ssjCodes4.add("L1006"); + ssjCodes4.add("L1003"); + ssjCodeList.put("error", ssjCodes4); + + mydoJobService = SpringUtils.getBean(IMydoJobService.class); jobCallBackService = SpringUtils.getBean(IJobCallBackService.class); apiService = SpringUtils.getBean(IApiService.class); @@ -97,73 +104,135 @@ public class SsjThread implements Runnable { log.error(e.getMessage(), e); } } + + + case "error": + for (String ssjCode : ssjCodeList.get("error")) { + try { + if (PlcSsjRead.deviceSsjMap.containsKey(ssjCode)) { + inDispatchError(PlcSsjRead.deviceSsjMap.get(ssjCode)); + } else { + log.error("设备不存在 ssjCode{}", ssjCode); + } + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + } + } + } } } } + private void inDispatchError(DeviceSsj deviceSsj) { + if (deviceSsj.getErrorCode() > 0) { + if (deviceSsj.getDeviceCode().equals("L1003")) { + String code = "TD1001"; + String errorCode = String.valueOf(deviceSsj.getErrorCode()); + HashMap objectObjectHashMap = new HashMap<>(); + objectObjectHashMap.put("deviceCode", code); + objectObjectHashMap.put("errorCode", errorCode); + apiService.updateLedError(objectObjectHashMap); + } + if (deviceSsj.getDeviceCode().equals("L1006")) { + String code = "TD1008"; + String errorCode = String.valueOf(deviceSsj.getErrorCode()); + HashMap objectObjectHashMap = new HashMap<>(); + objectObjectHashMap.put("deviceCode", code); + objectObjectHashMap.put("errorCode", errorCode); + apiService.updateLedError(objectObjectHashMap); + } + } + } + void inDispatch(DeviceSsj deviceSsj) { //出库到位 if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 0) { + HashMap objectObjectHashMap = new HashMap<>(); + objectObjectHashMap.put("deviceCode", deviceSsj.getDeviceCode()); + objectObjectHashMap.put("taskNo", deviceSsj.getTaskNo()); + apiService.updateLed(objectObjectHashMap); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(deviceSsj.getTaskNo())); - if (mydoJob != null) { - log.info("设备:{} 位置:{} 任务号:{} 出库到位", "输送线", deviceSsj.getDeviceCode(), mydoJob.getTaskNo()); - mydoJobService.insertHistory(mydoJob.getJobId()); - mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId()); - JobCallBack jobCallBack = new JobCallBack(); - jobCallBack.setType("2"); - jobCallBack.setMydojobId(mydoJob.getJobId()); - jobCallBack.setStatus("0"); - jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); - jobCallBack.setCreateTime(new Date()); - jobCallBackService.insertJobCallBack(jobCallBack); + if (mydoJob != null && mydoJob.getInOrOut().equals("22")) { + // 新增agv执行队列,以及调用wms后台任务过账 + AjaxResult ajaxResult1 = apiService.insertAgvQuene(objectObjectHashMap); + if (ajaxResult1.get("code").equals("200")) { + HashMap map = new HashMap<>(); + map.put("trayCode", mydoJob.getTrayCode()); + //拉取 + AjaxResult ajaxResult = apiService.OutMakeSure(map); + if (ajaxResult.get("code").equals("200")) { + mydoJobService.insertHistory(mydoJob.getJobId()); + mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId()); + } + } } } } void inDispatch1(DeviceSsj deviceSsj) { - if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode())) { - //todo 查是否为入库模式,不是退回,是否超重 - HashMap map = new HashMap<>(); - map.put("trayCode", deviceSsj.getTrayCode()); - //拉取 - AjaxResult ajaxResult = apiService.createInMydoJob(map); - if (ajaxResult.isSuccess()) { - //拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号 - MydoJob mydoJob = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class); - mydoJob.setStatus("1"); - mydoJob.setExecutionPhase("1"); - mydoJob.setCreateTime(new Date()); - if ("GS1002".equals(deviceSsj.getDeviceCode())) { - mydoJob.setEntranceId("L1004"); + if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) { + String trayCode = deviceSsj.getTrayCode().trim(); + MydoJob getMydoJob = mydoJobService.selectMydoJobByTrayCode(trayCode); + if (getMydoJob == null && deviceSsj.getTaskNo() < 1000) { + String exit = ""; + if (deviceSsj.getDeviceCode().equals("GS1002")) { + exit = "L1004"; + } + if (deviceSsj.getDeviceCode().equals("GS1007")) { + exit = "L1005"; + } + Integer count = mydoJobService.selectMydoJobExit(exit); + if (count > 0) { + int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2); + if (i == 1) { + log.info(deviceSsj.getDeviceCode() + "有相应入口的出库作业,下发退回,去向2 条码" + deviceSsj.getTrayCode()); + return; + } + } + //todo 查是否为入库模式,不是退回,是否超重 + HashMap map = new HashMap<>(); + map.put("trayCode", deviceSsj.getTrayCode()); + //拉取 + AjaxResult ajaxResult = apiService.createInMydoJob(map); + if (ajaxResult.isSuccess()) { + //拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号 + MydoJob mydoJob = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class); + mydoJob.setStatus("1"); + mydoJob.setExecutionPhase("1"); + mydoJob.setCreateTime(new Date()); + mydoJob.setTheFloor(mydoJob.getClassId()); + mydoJob.setTrayCode(trayCode); + if ("GS1002".equals(deviceSsj.getDeviceCode())) { + mydoJob.setEntranceId("L1004"); + } else { + mydoJob.setEntranceId("L1005"); + } + // 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段 + MydoJob mydoJob1 = new MydoJob(); + mydoJob1.setTaskNo(mydoJob.getTaskNo()); + mydoJob1.setTrayCode(mydoJob.getTrayCode()); + List mydoJobs = mydoJobService.selectMydoJobList(mydoJob1); + if (mydoJobs.size() > 0) { + return; + } + mydoJobService.insertMydoJob(mydoJob); + int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1); + if (i == 1) { + mydoJob.setStatus("3"); + mydoJobService.updateMydoJob(mydoJob); + log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo()); + } } else { - mydoJob.setEntranceId("L1005"); + int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2); + if (i == 1) { + log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2 条码" + deviceSsj.getTrayCode()); + } } - // 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段 - MydoJob mydoJob1 = new MydoJob(); - mydoJob1.setTaskNo(mydoJob.getTaskNo()); - List mydoJobs = mydoJobService.selectMydoJobList(mydoJob1); - if (mydoJobs.size() > 0) { - return; - } - mydoJobService.insertMydoJob(mydoJob); - int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1); - if (i == 1) { - mydoJob.setStatus("3"); - mydoJobService.updateMydoJob(mydoJob); - log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo()); - } - } else { - int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2); - if (i == 1) { - log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2"); - } - } - } } @@ -171,10 +240,28 @@ public class SsjThread implements Runnable { void inDispatch2(DeviceSsj deviceSsj) { if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 1000) { - MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo()); - if (mydoJob != null) { - mydoJob.setExecutionPhase("2"); - mydoJobService.updateMydoJob(mydoJob); + MydoJob mydoJob1 = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(deviceSsj.getTaskNo())); + if (mydoJob1 != null && mydoJob1.getCargoSpaceId() != null) { + return; + } + if (mydoJob1 != null && Integer.parseInt(mydoJob1.getInOrOut()) < 20) { + HashMap map = new HashMap<>(); + map.put("taskNo", deviceSsj.getTaskNo()); + map.put("deviceCode", deviceSsj.getDeviceCode()); + //拉取 + AjaxResult ajaxResult = apiService.sendCargoSpace(map); + if (ajaxResult.isSuccess()) { + MydoJob data = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class); + String cargoSpaceId = data.getCargoSpaceId(); + String theFloor = data.getClassId(); + MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo()); + if (mydoJob != null && cargoSpaceId != null && !cargoSpaceId.equals("")) { + mydoJob.setTheFloor(theFloor); + mydoJob.setCargoSpaceId(cargoSpaceId); + mydoJob.setExecutionPhase("2"); + mydoJobService.updateMydoJob(mydoJob); + } + } } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java index 94730f4..8830947 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/tsj/TsjThread.java @@ -8,6 +8,8 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.ruoyi.bas.port.service.IWcsPortService; +import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; +import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService; import com.ruoyi.common.domain.SendData; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.device.srgv.domain.DeviceSrgv; @@ -24,8 +26,8 @@ import com.ruoyi.schedule.plcRead.tsj.PlcTsjRead; import com.ruoyi.schedule.plcRead.util.Tools; import lombok.extern.slf4j.Slf4j; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; @Slf4j public class TsjThread implements Runnable { @@ -35,13 +37,18 @@ public class TsjThread implements Runnable { private ITsjDeviceExecutionQueueFinishService tsjDeviceExecutionQueueFinishService; private IWcsPortService wcsPortService; private IWcsSrgvQueueService wcsSrgvQueueService; - public IMydoJobService mydoJobService; + private IMydoJobService mydoJobService; + private IWcsSrgvMapService wcsSrgvMapService; + public IWcsSrgvQueueService wcsSagvQueueMapper; public void init() { tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class); tsjDeviceExecutionQueueFinishService = SpringUtils.getBean(ITsjDeviceExecutionQueueFinishService.class); wcsPortService = SpringUtils.getBean(IWcsPortService.class); wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); + wcsSrgvMapService = SpringUtils.getBean(IWcsSrgvMapService.class); + + } @Override @@ -76,7 +83,7 @@ public class TsjThread implements Runnable { * 1、下发完成 如果设备状态为 2-工作 ,触发方式 2-自动,任务号大于999,则代表任务下发完成 * * */ - if (czfs == 2 && sbzt == 2 && rwh > 999) { + if (czfs == 2 && sbzt == 2 && rwh > 500) { // finishSend(rwh, tsj); } @@ -84,19 +91,28 @@ public class TsjThread implements Runnable { * 2、四向车任务生成 2-工作 ,触发方式 2-自动,任务号大于999 * * */ - if (czfs == 2 && sbzt == 2 && jdbz == 4 && rwh > 999) { - createSRgvQueue(rwh, tsj); + if (czfs == 2 && sbzt == 2 && jdbz == 4 && rwh > 500) { + WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(String.valueOf(rwh)); + String agvId = wcsSrgvQueue.getAgvId(); + DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(agvId); + if (deviceSrgv.getCurrSite().equals("09050" + tsj.getDqcs())) { + createSRgvQueue(rwh, tsj); + } } // 提升机取货中 说明对齐当前要取货层 开始给小车下发 - if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 999) { + if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 500) { createSRgvQueueTsjQd(rwh, tsj); } + // 提升机放货途中 取消当前小车的路径 + if (czfs == 2 && sbzt == 2 && jdbz == 3 && rwh > 500) { + removePathCar(rwh, tsj); + } /* * 2、任务完成 * * */ - if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 999) { + if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 500) { //任务完成 finishTask(rwh, tsj); } @@ -113,12 +129,20 @@ public class TsjThread implements Runnable { } + private void removePathCar(Long rwh, DeviceTsj tsj) { + WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(String.valueOf(rwh)); + DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(wcsSrgvQueue.getAgvId()); + if (!deviceSrgv.getCurrSite().equals("07050"+wcsSrgvQueue.getTheFloor()) && tsj.getHczt() == 1 && !wcsSrgvQueue.getPathInfo().isEmpty() && java.util.Arrays.asList(wcsSrgvQueue.getPathInfo().trim().replaceAll(",$", "").split(",")).contains("07050"+wcsSrgvQueue.getTheFloor())&&wcsSrgvQueue.getEndSite().equals("tsj")) { + wcsSrgvQueue.setPathInfo(""); + wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); + } + } + // 下发提升机启动 private void createSRgvQueueTsjQd(Long rwh, DeviceTsj tsj) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); - if (deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 2 && tsj.getHczt() == 1) { - + if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) || deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor())) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 1 && tsj.getHczt() == 1) { SendData rwlxSendData = new SendData(Tools.INT, 1); DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(Convert.toStr(1)); byte[] bytes = Tools.sendData(rwlxSendData); @@ -147,11 +171,15 @@ public class TsjThread implements Runnable { WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue(); sRgvQueueParam.setTaskNo(Convert.toStr(rwh)); sRgvQueueParam.setEndSite(Convert.toStr("tsj")); + sRgvQueueParam.setIssued("1"); + sRgvQueueParam.setExecutionStatus("3"); List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(sRgvQueueParam); if (CollUtil.isEmpty(wcsSrgvQueues)) { return; } WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.insertHistory(Convert.toStr(rwh)); + String cargoPickSite = wcsSrgvQueue.getCargoPickSite(); + String cargoPlaceSite = wcsSrgvQueue.getCargoPlaceSite(); //修改起点终点 if (ObjUtil.isNotEmpty(wcsSrgvQueue)) { wcsSrgvQueue.setCreateDate(DateUtil.formatDateTime(DateUtil.date())); @@ -170,12 +198,44 @@ public class TsjThread implements Runnable { break; case "2": //出库 -// startSite="tsj"; startSite = "09050" + tsj.getDqcs(); - endSite = wcsSrgvQueue.getCargoPlaceSite(); + // 如果提升机当前层等于1 并且是出库任务,更新出库点位为出库缓存点 +// Integer i = mydoJobService.selectMydoJobCountOut(); + if (tsj.getDqcs() == 1 && "2".equals(wcsSrgvQueue.getDefault02())) { + WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap(); + wcsSrgvMapParam.setRemark("outCache"); + List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam); + List cacheSite = wcsSrgvMaps.stream().sorted(Comparator.comparing(WcsSrgvMap::getSiteId)).map(WcsSrgvMap::getSiteId).collect(Collectors.toList()); + List currentSRgvSite = new ArrayList<>(); + // 判断是否有车是在一样的位置 + for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { + currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite()); + } + cacheSite.removeAll(currentSRgvSite); + if (CollUtil.isNotEmpty(cacheSite)) { + for (String cache : cacheSite) { + WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); + wcsSrgvQueueParam.setEndSite(cache); + // 判断是否有车要去这个缓存点 没有就更新 + List wcsSrgvQueues1 = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam); +// WcsSrgvQueue wcsSrgvQueueParam1 = new WcsSrgvQueue(); +// wcsSrgvQueueParam1.setStartSite(cache); +// // 并且从缓存点走的 +// List wcsSrgvQueues2 = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam1); + if (CollUtil.isEmpty(wcsSrgvQueues1)) { + wcsSrgvQueue.setStartSite(startSite); + wcsSrgvQueue.setEndSite(cacheSite.get(0)); + wcsSrgvQueue.setDefault02("7"); + wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); + return; + } + } + } + } else { + endSite = wcsSrgvQueue.getCargoPlaceSite(); + } break; case "3": - //充电 break; case "4": //点到点 @@ -192,10 +252,52 @@ public class TsjThread implements Runnable { log.info("任务类型错误"); } break; + case "8": + //换层任务直接变成点到点任务 + switch (wcsSrgvQueue.getTaskType()) { + case "1": + WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); + WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); + if (wcsSrgvMapq != null && wcsSrgvMapf != null) { + Integer count = wcsSrgvQueueService.selectByEndSite(); + List collect = PlcSrgvRead.deviceSrgvMap.values().stream().filter(d -> + d.getCurrSite().equals(cargoPickSite)) + .collect(Collectors.toList()); + if ((count > 0 || !collect.isEmpty()) && tsj.getDqcs() == 1) { + wcsSrgvQueue.setEndSite("070301"); + } else { + wcsSrgvQueue.setEndSite(cargoPickSite); + } + + wcsSrgvQueue.setDefault02("4"); + wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString()); + wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString()); + wcsSrgvQueue.setIssued("0"); + wcsSrgvQueue.setExecutionStatus("1"); + wcsSrgvQueue.setTaskType("1"); + } + wcsSrgvQueue.setStartSite("09050" + tsj.getDqcs()); + wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); + break; + case "3": + WcsSrgvMap wcsSrgvMapq1 = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); + WcsSrgvMap wcsSrgvMapf1 = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); + if (wcsSrgvMapq1 != null && wcsSrgvMapf1 != null) { + wcsSrgvQueue.setEndSite(cargoPlaceSite); + wcsSrgvQueue.setDefault02("3"); + wcsSrgvQueue.setTheFloor(wcsSrgvMapq1.getTheLayer().toString()); + wcsSrgvQueue.setDefault07(wcsSrgvMapf1.getTheLayer().toString()); + wcsSrgvQueue.setIssued("0"); + wcsSrgvQueue.setExecutionStatus("1"); + wcsSrgvQueue.setTaskType("3"); + } + wcsSrgvQueue.setStartSite("09050" + tsj.getDqcs()); + wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); + break; + } } - if (StrUtil.isNotEmpty(startSite) && StrUtil.isNotEmpty(endSite)) { - + if (StrUtil.isNotEmpty(startSite) && StrUtil.isNotEmpty(endSite) && !wcsSrgvQueue.getDefault02().equals("8")) { wcsSrgvQueue.setStartSite(startSite); wcsSrgvQueue.setEndSite(endSite); wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); @@ -209,7 +311,9 @@ public class TsjThread implements Runnable { private void createQueue(DeviceTsj tsj) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); - if (deviceSrgv.getSpare2().equals("1") && deviceSrgv.getTaskNo() > 0) { + Integer count = tsjDeviceExecutionQueueService.selectCount(); + WcsSrgvQueue wcsSrgvQueue1 = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(String.valueOf(deviceSrgv.getTaskNo())); + if (deviceSrgv.getSpare2().equals("1") && deviceSrgv.getTaskNo() > 0 && count == 0 && wcsSrgvQueue1.getEndSite().equals("tsj")) { //请求进入输送机 WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue(); sRgvQueueParam.setAgvId(Convert.toStr(deviceSrgv.getDeviceId())); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/system/controller/AgvContainerTaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/system/controller/AgvContainerTaskController.java new file mode 100644 index 0000000..b8f1fc8 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/system/controller/AgvContainerTaskController.java @@ -0,0 +1,104 @@ +package com.ruoyi.system.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.system.domain.AgvContainerTask; +import com.ruoyi.system.service.IAgvContainerTaskService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * agv料架搬运任务Controller + * + * @author ruoyi + * @date 2026-05-15 + */ +@RestController +@RequestMapping("/system/task") +public class AgvContainerTaskController extends BaseController +{ + @Autowired + private IAgvContainerTaskService agvContainerTaskService; + + /** + * 查询agv料架搬运任务列表 + */ + @PreAuthorize("@ss.hasPermi('system:task:list')") + @GetMapping("/list") + public TableDataInfo list(AgvContainerTask agvContainerTask) + { + startPage(); + List list = agvContainerTaskService.selectAgvContainerTaskList(agvContainerTask); + return getDataTable(list); + } + + /** + * 导出agv料架搬运任务列表 + */ + @PreAuthorize("@ss.hasPermi('system:task:export')") + @Log(title = "agv料架搬运任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, AgvContainerTask agvContainerTask) + { + List list = agvContainerTaskService.selectAgvContainerTaskList(agvContainerTask); + ExcelUtil util = new ExcelUtil(AgvContainerTask.class); + util.exportExcel(response, list, "agv料架搬运任务数据"); + } + + /** + * 获取agv料架搬运任务详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:task:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(agvContainerTaskService.selectAgvContainerTaskById(id)); + } + + /** + * 新增agv料架搬运任务 + */ + @PreAuthorize("@ss.hasPermi('system:task:add')") + @Log(title = "agv料架搬运任务", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody AgvContainerTask agvContainerTask) + { + return toAjax(agvContainerTaskService.insertAgvContainerTask(agvContainerTask)); + } + + /** + * 修改agv料架搬运任务 + */ + @PreAuthorize("@ss.hasPermi('system:task:edit')") + @Log(title = "agv料架搬运任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody AgvContainerTask agvContainerTask) + { + return toAjax(agvContainerTaskService.updateAgvContainerTask(agvContainerTask)); + } + + /** + * 删除agv料架搬运任务 + */ + @PreAuthorize("@ss.hasPermi('system:task:remove')") + @Log(title = "agv料架搬运任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(agvContainerTaskService.deleteAgvContainerTaskByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/system/domain/AgvContainerTask.java b/ruoyi-admin/src/main/java/com/ruoyi/system/domain/AgvContainerTask.java new file mode 100644 index 0000000..98b91c0 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/system/domain/AgvContainerTask.java @@ -0,0 +1,173 @@ +package com.ruoyi.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * agv料架搬运任务对象 agv_container_task + * + * @author ruoyi + * @date 2026-05-15 + */ +public class AgvContainerTask extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 作业编码 */ + @Excel(name = "作业编码") + private String container; + + /** 起点 */ + @Excel(name = "起点") + private String startPoint; + + /** 终点 */ + @Excel(name = "终点") + private String endPoint; + + /** 开始时间 */ + @Excel(name = "开始时间") + private String startTime; + + /** 结束时间 */ + @Excel(name = "结束时间") + private String finishTime; + + /** 任务号 */ + @Excel(name = "任务号") + private String taskNo; + + /** 任务状态 0-创建 1-执行中 2-完成 */ + @Excel(name = "任务状态 0-创建 1-执行中 2-完成") + private String status; + + /** 任务类型 */ + @Excel(name = "任务类型") + private String spare1; + + /** 托盘码 */ + @Excel(name = "托盘码") + private String spare2; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setContainer(String container) + { + this.container = container; + } + + public String getContainer() + { + return container; + } + + public void setStartPoint(String startPoint) + { + this.startPoint = startPoint; + } + + public String getStartPoint() + { + return startPoint; + } + + public void setEndPoint(String endPoint) + { + this.endPoint = endPoint; + } + + public String getEndPoint() + { + return endPoint; + } + + public void setStartTime(String startTime) + { + this.startTime = startTime; + } + + public String getStartTime() + { + return startTime; + } + + public void setFinishTime(String finishTime) + { + this.finishTime = finishTime; + } + + public String getFinishTime() + { + return finishTime; + } + + public void setTaskNo(String taskNo) + { + this.taskNo = taskNo; + } + + public String getTaskNo() + { + return taskNo; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + public void setSpare1(String spare1) + { + this.spare1 = spare1; + } + + public String getSpare1() + { + return spare1; + } + + public void setSpare2(String spare2) + { + this.spare2 = spare2; + } + + public String getSpare2() + { + return spare2; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("container", getContainer()) + .append("startPoint", getStartPoint()) + .append("endPoint", getEndPoint()) + .append("createTime", getCreateTime()) + .append("startTime", getStartTime()) + .append("finishTime", getFinishTime()) + .append("taskNo", getTaskNo()) + .append("status", getStatus()) + .append("spare1", getSpare1()) + .append("spare2", getSpare2()) + .toString(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/system/mapper/AgvContainerTaskMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/system/mapper/AgvContainerTaskMapper.java new file mode 100644 index 0000000..23996bf --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/system/mapper/AgvContainerTaskMapper.java @@ -0,0 +1,68 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.AgvContainerTask; + +/** + * agv料架搬运任务Mapper接口 + * + * @author ruoyi + * @date 2026-05-15 + */ +public interface AgvContainerTaskMapper +{ + /** + * 查询agv料架搬运任务 + * + * @param id agv料架搬运任务主键 + * @return agv料架搬运任务 + */ + public AgvContainerTask selectAgvContainerTaskById(Long id); + + /** + * 查询agv料架搬运任务列表 + * + * @param agvContainerTask agv料架搬运任务 + * @return agv料架搬运任务集合 + */ + public List selectAgvContainerTaskList(AgvContainerTask agvContainerTask); + + /** + * 新增agv料架搬运任务 + * + * @param agvContainerTask agv料架搬运任务 + * @return 结果 + */ + public int insertAgvContainerTask(AgvContainerTask agvContainerTask); + + /** + * 修改agv料架搬运任务 + * + * @param agvContainerTask agv料架搬运任务 + * @return 结果 + */ + public int updateAgvContainerTask(AgvContainerTask agvContainerTask); + + /** + * 删除agv料架搬运任务 + * + * @param id agv料架搬运任务主键 + * @return 结果 + */ + public int deleteAgvContainerTaskById(Long id); + + public int deleteAgvContainerTaskByContainer(String orderId); + /** + * 批量删除agv料架搬运任务 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteAgvContainerTaskByIds(Long[] ids); + + void insertAgvContainerTaskFinish(String orderId); + + void updateAgvContainerTaskByOrder(String orderId); + + AgvContainerTask selectAgvContainerFinishOne(); +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/system/service/IAgvContainerTaskService.java b/ruoyi-admin/src/main/java/com/ruoyi/system/service/IAgvContainerTaskService.java new file mode 100644 index 0000000..8f489f9 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/system/service/IAgvContainerTaskService.java @@ -0,0 +1,63 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.system.domain.AgvContainerTask; + +/** + * agv料架搬运任务Service接口 + * + * @author ruoyi + * @date 2026-05-15 + */ +public interface IAgvContainerTaskService +{ + /** + * 查询agv料架搬运任务 + * + * @param id agv料架搬运任务主键 + * @return agv料架搬运任务 + */ + public AgvContainerTask selectAgvContainerTaskById(Long id); + + /** + * 查询agv料架搬运任务列表 + * + * @param agvContainerTask agv料架搬运任务 + * @return agv料架搬运任务集合 + */ + public List selectAgvContainerTaskList(AgvContainerTask agvContainerTask); + + /** + * 新增agv料架搬运任务 + * + * @param agvContainerTask agv料架搬运任务 + * @return 结果 + */ + public int insertAgvContainerTask(AgvContainerTask agvContainerTask); + + /** + * 修改agv料架搬运任务 + * + * @param agvContainerTask agv料架搬运任务 + * @return 结果 + */ + public int updateAgvContainerTask(AgvContainerTask agvContainerTask); + + /** + * 批量删除agv料架搬运任务 + * + * @param ids 需要删除的agv料架搬运任务主键集合 + * @return 结果 + */ + public int deleteAgvContainerTaskByIds(Long[] ids); + + /** + * 删除agv料架搬运任务信息 + * + * @param id agv料架搬运任务主键 + * @return 结果 + */ + public int deleteAgvContainerTaskById(Long id); + + void deleteAgvContainerTaskByOrderId(String container); +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/AgvContainerTaskServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/AgvContainerTaskServiceImpl.java new file mode 100644 index 0000000..ef4b294 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/AgvContainerTaskServiceImpl.java @@ -0,0 +1,100 @@ +package com.ruoyi.system.service.impl; + +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.system.mapper.AgvContainerTaskMapper; +import com.ruoyi.system.domain.AgvContainerTask; +import com.ruoyi.system.service.IAgvContainerTaskService; + +/** + * agv料架搬运任务Service业务层处理 + * + * @author ruoyi + * @date 2026-05-15 + */ +@Service +public class AgvContainerTaskServiceImpl implements IAgvContainerTaskService +{ + @Autowired + private AgvContainerTaskMapper agvContainerTaskMapper; + + /** + * 查询agv料架搬运任务 + * + * @param id agv料架搬运任务主键 + * @return agv料架搬运任务 + */ + @Override + public AgvContainerTask selectAgvContainerTaskById(Long id) + { + return agvContainerTaskMapper.selectAgvContainerTaskById(id); + } + + /** + * 查询agv料架搬运任务列表 + * + * @param agvContainerTask agv料架搬运任务 + * @return agv料架搬运任务 + */ + @Override + public List selectAgvContainerTaskList(AgvContainerTask agvContainerTask) + { + return agvContainerTaskMapper.selectAgvContainerTaskList(agvContainerTask); + } + + /** + * 新增agv料架搬运任务 + * + * @param agvContainerTask agv料架搬运任务 + * @return 结果 + */ + @Override + public int insertAgvContainerTask(AgvContainerTask agvContainerTask) + { + agvContainerTask.setCreateTime(DateUtils.getNowDate()); + return agvContainerTaskMapper.insertAgvContainerTask(agvContainerTask); + } + + /** + * 修改agv料架搬运任务 + * + * @param agvContainerTask agv料架搬运任务 + * @return 结果 + */ + @Override + public int updateAgvContainerTask(AgvContainerTask agvContainerTask) + { + return agvContainerTaskMapper.updateAgvContainerTask(agvContainerTask); + } + + /** + * 批量删除agv料架搬运任务 + * + * @param ids 需要删除的agv料架搬运任务主键 + * @return 结果 + */ + @Override + public int deleteAgvContainerTaskByIds(Long[] ids) + { + return agvContainerTaskMapper.deleteAgvContainerTaskByIds(ids); + } + + /** + * 删除agv料架搬运任务信息 + * + * @param id agv料架搬运任务主键 + * @return 结果 + */ + @Override + public int deleteAgvContainerTaskById(Long id) + { + return agvContainerTaskMapper.deleteAgvContainerTaskById(id); + } + + @Override + public void deleteAgvContainerTaskByOrderId(String container) { + agvContainerTaskMapper.deleteAgvContainerTaskByContainer(container); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java index b042843..2045d5c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSrgvMap.java @@ -80,7 +80,7 @@ public class GetDeviceSrgvMap { AgvDto dto = new AgvDto(); dto.setId(d.getDeviceId() == null ? "" : String.format("%04d", d.getDeviceId())); dto.setTaskNo(d.getTaskNo() == null ? "" : String.valueOf(d.getTaskNo())); - dto.setIsThere((d.getWorkPhase() >= 3 && d.getWorkPhase() < 6 ? "1" : "0")); + dto.setIsThere(d.getCargoFlag()==256?"1":"0"); Integer wp = d.getWorkPhase(); String status = "0"; if (wp != null) { @@ -90,6 +90,9 @@ public class GetDeviceSrgvMap { } dto.setStatus(status); dto.setLocation(d.getCurrSite() == null ? "" : d.getCurrSite()); + dto.setRow(d.getCurrSite() == null ? "" : d.getCurrSite().substring(2,4)); + dto.setColumn(d.getCurrSite() == null ? "" :d.getCurrSite().substring(0,2)); + dto.setLayer(d.getCurrSite() == null ? "" : d.getCurrSite().substring(4,6)); dto.setAlarm(d.getAlarm() == null ? "" : String.valueOf(d.getAlarm())); dto.setAlarmMsg(DictUtils.getDictLabel("srgv_alarm", d.getAlarm() == null ? "" : String.valueOf(d.getAlarm()))); if (d.getTaskNo() != null && d.getTaskNo() > 0) { @@ -132,6 +135,9 @@ public class GetDeviceSrgvMap { private String isThere; private String status; private String location; + private String row; + private String column; + private String layer; private String alarm; private String alarmMsg; private String trayCode; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java index c43d2eb..bfca15b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceSsjMap.java @@ -99,8 +99,17 @@ public class GetDeviceSsjMap { dto.setRotationDirection(calcRotationDirection(d.getTaskNo())); dto.setAlarm(String.valueOf(d.getException())); dto.setAlarmMsg(DictUtils.getDictLabel("ssj_ex", String.valueOf(d.getException()))); - dto.setDW(String.valueOf(d.getDw())); dto.setKX(String.valueOf(d.getKx())); + if (!dto.getTaskNo().equals("0")){ + if (dto.getKX().equals("0")){ + dto.setDW("1"); + }else { + dto.setDW("0"); + } + }else { + dto.setDW("0"); + } + if (d.getTaskNo() > 0) { try { MydoJob job = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(d.getTaskNo())); @@ -128,16 +137,10 @@ public class GetDeviceSsjMap { */ private String calcRotationDirection(int taskNo) { try { - if (taskNo <= 0) return "0"; - MydoJob job = mydoJobService.selectMydoJobByTaskNo((long) taskNo); - if (job == null || job.getInOrOut() == null) return "0"; - int val; - try { - val = Integer.parseInt(job.getInOrOut()); - } catch (NumberFormatException e) { + if (taskNo <= 0) { return "0"; } - return val >= 20 ? "2" : "1"; + return taskNo <= 50000 ? "1" : "2"; } catch (Exception e) { return "0"; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceTsjMap.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceTsjMap.java index 6e35e04..de458c7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceTsjMap.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/GetDeviceTsjMap.java @@ -80,7 +80,7 @@ public class GetDeviceTsjMap { String code = entry.getKey(); DeviceTsj d = entry.getValue(); TsjDto dto = new TsjDto(); - dto.setId(String.valueOf(d.getId())); + dto.setId("TW001"); dto.setLayer(d.getDqcs() == null ? "" : String.valueOf(d.getDqcs())); dto.setTaskNo(d.getRwh() == null ? "" : String.valueOf(d.getRwh())); dto.setZxjd(d.getJdbz() == null ? "" : String.valueOf(d.getJdbz())); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/tcp/Wcs2wmsgetEmptyCargoSpace.java b/ruoyi-admin/src/main/java/com/ruoyi/tcp/Wcs2wmsgetEmptyCargoSpace.java index 3f599cc..647e003 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/tcp/Wcs2wmsgetEmptyCargoSpace.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/tcp/Wcs2wmsgetEmptyCargoSpace.java @@ -96,6 +96,7 @@ public class Wcs2wmsgetEmptyCargoSpace { dto.setTrayCode(getText(node, "trayCode")); dto.setProductCode(getText(node, "productCode")); dto.setProductName(getText(node, "productName")); + dto.setCargoSpaceId(getText(node, "cargoSpaceId")); return dto; } @@ -125,5 +126,6 @@ public class Wcs2wmsgetEmptyCargoSpace { private String trayCode; private String productCode; private String productName; + private String cargoSpaceId; } } diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index 79ad5bb..5da72f3 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -6,9 +6,9 @@ spring: druid: #主数据信息 master: - url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT546-WCS; + url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT546-wcs; username: sa - password: 123456 + password: Flrd0914. # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 4720c99..4489d1f 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -34,7 +34,7 @@ server: # 日志配置 logging: level: - com.ruoyi: debug + com.ruoyi: info org.springframework: warn # 用户配置 @@ -64,7 +64,7 @@ spring: devtools: restart: # 热部署开关 - enabled: true + enabled: false # redis 配置 redis: # 地址 diff --git a/ruoyi-admin/src/main/resources/mapper/bas/WcsSrgvMapMapper.xml b/ruoyi-admin/src/main/resources/mapper/bas/WcsSrgvMapMapper.xml index 6c660be..228bfd5 100644 --- a/ruoyi-admin/src/main/resources/mapper/bas/WcsSrgvMapMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/bas/WcsSrgvMapMapper.xml @@ -161,4 +161,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{guid} + + + + + diff --git a/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml b/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml index a362e8b..1aa0247 100644 --- a/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml @@ -144,4 +144,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{reqCode} + + + diff --git a/ruoyi-admin/src/main/resources/mapper/device/DeviceCdzMapper.xml b/ruoyi-admin/src/main/resources/mapper/device/DeviceCdzMapper.xml index 14fb8ef..877d2a3 100644 --- a/ruoyi-admin/src/main/resources/mapper/device/DeviceCdzMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/device/DeviceCdzMapper.xml @@ -123,4 +123,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + update device_cdz set spare1=null where id=#{id} + + + diff --git a/ruoyi-admin/src/main/resources/mapper/device/DeviceSrgvMapper.xml b/ruoyi-admin/src/main/resources/mapper/device/DeviceSrgvMapper.xml index 40e03f2..ade5719 100644 --- a/ruoyi-admin/src/main/resources/mapper/device/DeviceSrgvMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/device/DeviceSrgvMapper.xml @@ -182,7 +182,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" set_floor = #{setFloor}, power_time = #{powerTime}, - last_time = #{lastTime}, + agv_status = #{agvStatus}, task_no = #{taskNo}, src_site = #{srcSite}, @@ -227,6 +227,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update device_srgv set last_time =getdate() where agv_id=#{agvId} + update device_srgv set last_time =convert(varchar,getdate(),120) where guid=#{agvId} diff --git a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml index 38c05cd..05759eb 100644 --- a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml @@ -25,13 +25,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name from mydo_job_wcs + select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name,tray_code from mydo_job_wcs - select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor from mydo_job_wcs_finish + select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name,tray_code from mydo_job_wcs_finish @@ -118,6 +120,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" warehouse_id, fault_flag, the_floor, + tray_code, #{jobId}, @@ -138,6 +141,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{warehouseId}, #{faultFlag}, #{theFloor}, + #{trayCode}, @@ -225,8 +229,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and priority = #{priority} and execution_phase = #{executionPhase} and in_or_out = #{inOrOut} - and start_time = #{startTime} - and finish_time = #{finishTime} + and finish_time >= #{startTime} + and finish_time <= #{finishTime} and entrance_id = #{entranceId} and exit_id = #{exitId} and warehouse_id = #{warehouseId} @@ -244,4 +248,86 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and status = 3 order by priority desc,create_time + + + + + + + + + + + + + + + + + + + + delete from mydo_job_wcs where task_no in + + #{taskNo} + + + diff --git a/ruoyi-admin/src/main/resources/mapper/queue/TsjDeviceExecutionQueueMapper.xml b/ruoyi-admin/src/main/resources/mapper/queue/TsjDeviceExecutionQueueMapper.xml index a25cb48..96ef552 100644 --- a/ruoyi-admin/src/main/resources/mapper/queue/TsjDeviceExecutionQueueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/queue/TsjDeviceExecutionQueueMapper.xml @@ -121,6 +121,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + update tsj_device_execution_queue diff --git a/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml b/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml index fa25379..8436264 100644 --- a/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/queue/WcsSrgvQueueMapper.xml @@ -85,7 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -192,4 +192,45 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + + + diff --git a/ruoyi-admin/src/main/resources/mapper/system/AgvContainerTaskMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/AgvContainerTaskMapper.xml new file mode 100644 index 0000000..7b5d4ce --- /dev/null +++ b/ruoyi-admin/src/main/resources/mapper/system/AgvContainerTaskMapper.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + select id, container, start_point, end_point, create_time, start_time, finish_time, task_no, status, spare1, spare2 from agv_container_task + + + + + + + + insert into agv_container_task + + container, + start_point, + end_point, + create_time, + start_time, + finish_time, + task_no, + status, + spare1, + spare2, + + + #{container}, + #{startPoint}, + #{endPoint}, + #{createTime}, + #{startTime}, + #{finishTime}, + #{taskNo}, + #{status}, + #{spare1}, + #{spare2}, + + + + + update agv_container_task + + container = #{container}, + start_point = #{startPoint}, + end_point = #{endPoint}, + create_time = #{createTime}, + start_time = #{startTime}, + finish_time = #{finishTime}, + task_no = #{taskNo}, + status = #{status}, + spare1 = #{spare1}, + spare2 = #{spare2}, + + where id = #{id} + + + + delete from agv_container_task where id = #{id} + + + delete from agv_container_task where container = #{container} + + + + delete from agv_container_task where id in + + #{id} + + + + + + + update agv_container_task set status='2' where container=#{orderId} + + + + + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java index a7abfe4..4b52def 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java @@ -26,9 +26,7 @@ public class AjaxResult extends HashMap /** * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 */ - public AjaxResult() - { - } + /** * 初始化一个新创建的 AjaxResult 对象 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 3f68194..3c9cc19 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -116,7 +116,7 @@ public class SecurityConfig .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/changeLanguage", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**", "/pda/**").permitAll() .antMatchers("/device/operation/**").permitAll() - .antMatchers("/agv/api/**").permitAll() + .antMatchers("/api/agv/**").permitAll() .antMatchers("/device/api/**").permitAll() .antMatchers("/wcs2Wms/api/**").permitAll() .antMatchers("/test/**").permitAll() diff --git a/ruoyi-ui/src/api/algorithm/tidy.js b/ruoyi-ui/src/api/algorithm/tidy.js new file mode 100644 index 0000000..8c90cf6 --- /dev/null +++ b/ruoyi-ui/src/api/algorithm/tidy.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function getTidyStatus() { + return request({ url: '/algorithm/tidy/status', method: 'get' }) +} + +export function updateTidyMode(mode) { + return request({ url: '/algorithm/tidy/mode', method: 'put', data: { mode } }) +} diff --git a/ruoyi-ui/src/views/algorithm/tidy/index.vue b/ruoyi-ui/src/views/algorithm/tidy/index.vue new file mode 100644 index 0000000..4032130 --- /dev/null +++ b/ruoyi-ui/src/views/algorithm/tidy/index.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/ruoyi-ui/vue.config.js b/ruoyi-ui/vue.config.js index a1733b8..f02e036 100644 --- a/ruoyi-ui/vue.config.js +++ b/ruoyi-ui/vue.config.js @@ -18,6 +18,7 @@ module.exports = { outputDir: 'dist', assetsDir: 'static', productionSourceMap: false, + parallel: false, transpileDependencies: ['quill'], devServer: { host: '0.0.0.0', From a63316fc560dc190742b0a3ee3531d7f7d6059e5 Mon Sep 17 00:00:00 2001 From: zgw <13623675548@163.com> Date: Fri, 24 Jul 2026 08:56:02 +0800 Subject: [PATCH 11/11] chore: restore local WCS version --- .../GenAgvSchedulingTaskRequest.java | 264 ++++++++---------- .../ruoyi/api/service/IRequestLogService.java | 2 - .../queue/agv/mapper/AgvQueueMapper.java | 2 - .../queue/agv/service/IAgvQueueService.java | 2 - .../agv/service/impl/AgvQueueServiceImpl.java | 5 - .../mapper/device/AgvQueueMapper.xml | 5 - .../framework/config/SecurityConfig.java | 1 - ruoyi-ui/src/views/device/ssj/index.vue | 1 + ruoyi-ui/vue.config.js | 2 +- 9 files changed, 112 insertions(+), 172 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/agv/genAgvSchedulingTask/GenAgvSchedulingTaskRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/agv/genAgvSchedulingTask/GenAgvSchedulingTaskRequest.java index 60156f9..46bea8d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/agv/genAgvSchedulingTask/GenAgvSchedulingTaskRequest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/agv/genAgvSchedulingTask/GenAgvSchedulingTaskRequest.java @@ -14,187 +14,143 @@ import java.util.UUID; @Data public class GenAgvSchedulingTaskRequest { /** - * 起始站点 + * 请求编号 + * 同一个请求重复提交, 使用同一编号 */ - private String FromStation; - + @NotNull + private String reqCode = UUID.randomUUID().toString(); /** - * 目的站点 + * 请求时间 + * 格式: “yyyy-MM-dd HH:mm:ss” */ - private String ToStation; - + private String reqTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); /** - * 任务类型(以实际的任务类型为准) + * 客户端编号 + * 客户端编号,如PDA,HCWMS等 */ - private String Type; - + private String clientCode; /** - * 类名 + * 令牌号 + * 由调度系统颁发 */ - private String ClassName; - + private String tokenCode; /** - * 任务引导ID + * 任务类型 + * 内置任务类型: + * 厂内货架搬运: F01 + * 厂内货架空满交换: F02 + * 辊筒搬运接驳:F03 + * 厂内货架出库AGV待命:F04 + * 旋转货架: F05 + * 厂内电梯任务: F06 + * 以下为叉车专用任务类型 + * 高位货架到工作台: F11 + * 工作台到高位货架: F12 + * 巷道到工作台: F13 + * 工作台到巷道: F14 + * 高位货架到工作台(接驳) : F15 + * 工作台到高位货架 (接驳) : F16 + * 巷道到工作台(接驳) : F17 + * 工作台到巷道(接驳) : F18 + * 叉车电梯主任务: F20 */ - private String TaskGuideId; + @NotNull + private String taskTyp; /** - * 订单 ID + * 容器类型(叉车/CTU专用) 叉车项目必传 */ - private String OrderId; - + private String ctnrTyp; /** - * 触发ID + * 容器编号 (叉车/CTU专用) */ - private String TriggerId; - + private String ctnrCode; // /** - * 扩展字段4 + * 容器数量(叉车堆叠专用),默认值1,仅记录堆叠的数量不记录堆叠的每个容器号 */ - private String Extend4; - + private String ctnrNum; /** - * 扩展字段5 + * 任务模式 + * 0-普通move 1-出库move 2-入库move 3-移库move */ - private String Extend5; - + private String taskMode; /** - * 扩展字段6 + * 工作位 + * 与RCS-2000端配置的位置名称一致, 工作位名称为字母\数字\或组合 */ - private String Extend6; - + private String wbCode; /** - * 扩展字段7 + * 位置路径 + * AGV关键路径位置集合,与任务类型中模板配置的位置路径一一对应。待现场地图部署、配置完成后可获取 */ - private String Extend7; - + private List positionCodePath; /** - * 扩展字段8 + * 货架编号 + * 不指定货架可以为空 */ - private String Extend8; - + private String podCode; /** - * 扩展字段9 + * 货架方向 + * “180”,”0”,”90”,”-90” 分别对应地图的”左”,”右”,”上”,”下” + * 不指定方向可以为空 + * 如果终点不是工作台或工作台未配置操作方向则货架拣货方向podDir作为终点方向 + * 如果工作台配有操作方向,则系统会根据货架拣货方向podDir和工作台操作方向计算货架终点方向 */ - private String Extend9; - + private String podDir; /** - * 任务附加信息 + * 货架类型, 传空时表示随机找个货架 + * 找空货架传参方式如下: + * -1: 代表不关心货架类型, 找到空货架即可. + * -2: 代表从工作位获取关联货架类型, 如果未配置, 只找空货架. + * 货架类型编号: 只找该货架类型的空货架 */ - private TaskAdditionallInfo TaskAdditionallInfo; - + private String podTyp; /** - * 任务附加信息类 + * 物料批次 + * 物料批次或货架上的物料唯一编码,生成任务单时,货架与物料直接绑定时使用. (通过同时传podCode和materialLot来绑定或通过 wbCode 找到位置上的货架和materialLot来绑定) + * 如果是区域/策略内查找货架,可以匹配对应物料批次的货架,支持以下值: + * 0:区域/策略内查找空货架 + * 1:区域/策略内查找满货架 + * 其他值:查找指定物料批次对应的货架 + * 巷道任务通过该字段传入特征值 */ - @Data - public static class TaskAdditionallInfo { - /** - * 任务ID - */ - private String TaskId; - - /** - * 库存ID - */ - private String StockId; - - /** - * 任务引导ID - */ - private String TaskGuideId; - - /** - * 触发ID - */ - private String TriggerId; - - /** - * 下一任务添加阶段 - */ - private String NextTaskAddStage; - - /** - * 链ID - */ - private String ChainId; - - /** - * 链类型 - */ - private Integer ChainType; - - /** - * 链排序 - */ - private Integer ChainSort; - - /** - * 图号 - */ - private String FigureNo; - - /** - * 尺寸 - */ - private String Size; - - /** - * 箱号 - */ - private String BoxNo; - - /** - * 物料 - */ - private String Mater; - - /** - * 相关数量 - */ - private Integer RelatedCount; - - /** - * 序列号 - */ - private String SerialNo; - - /** - * 重量 - */ - private String Weight; - - /** - * 站点号 - */ - private String StationNo; - - /** - * 手动计数 - */ - private String HandCount; - - /** - * 批次 - */ - private String Batch; - - /** - * 前置相关任务ID - */ - private String PreviousRelatedTaskId; - - /** - * 下一相关任务ID - */ - private String NextRelatedTaskId; - - /** - * 级联任务开始 - */ - private String CascadeTaskBeginning; - - /** - * 级联任务结束 - */ - private String CascadeTaskEnding; - } + private String materialLot; + /** + * 优先级 + * 从(1~127)级,最大优先级最高。为空时,采用任务模板的优先级 + */ + private String priority; + /** + * AGV编号 + * 填写表示指定某一编号的AGV执行该任务 + */ + private String agvCode; + /** + * 任务单号 + * 选填, 不填系统自动生成 + */ + private String taskCode; + /** + * 组编号 + * CTU场景下用于按组出库,同组任务优先拼车。 如业务需要任务组间或组内按顺序出库,则需调用料箱顺序出库(CTU)接口。 + * 潜伏式场景下,通过组号来管理顺序出库的顺序,组号小的优先出库。 + */ + private String groupId; + /** + * 设备类型 + */ + private String agvTyp; + /** + * 选择策略 + * 区域/策略中挑选货架以及根据物料批次挑选货架时的先进先出规则,支持以下4个值: + * 1:按照货架到达储位的时间顺序,先进先出 + * 2:按照货架到达储位的时间顺序,先进后出 + * 9:按照货架绑定物料批次的时间顺序,先进先出 + * 10:按照货架绑定物料批次的时间顺序,先进后出 + */ + private String positionSelStrategy; + /** + * 自定义数据 + */ + private String data; + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java index 841095c..49d4047 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IRequestLogService.java @@ -68,8 +68,6 @@ public interface IRequestLogService */ public RequestLog getRequestLog(String url, String param, String endPoint); - public RequestLog getRequestLogAgv(String url, String endPoint, String param); - /** * 接收请求,并插入日志 * @param url diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java index 5b6b584..5b17c04 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/mapper/AgvQueueMapper.java @@ -67,8 +67,6 @@ public interface AgvQueueMapper */ AgvQueue selectAgvQueueByTaskCode(String taskCode); - AgvQueue selectAgvQueueByStatus(); - void insertHistory(String reqCode); void selectKx(HashMap map); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java index 3103388..6d4adde 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/IAgvQueueService.java @@ -67,8 +67,6 @@ public interface IAgvQueueService */ AgvQueue selectAgvQueueByTaskCode(String taskCode); - AgvQueue selectAgvQueueByStatus(); - /** * 插入agv完成历史 * @param reqCode diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java index 4151778..c351834 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/agv/service/impl/AgvQueueServiceImpl.java @@ -97,11 +97,6 @@ public class AgvQueueServiceImpl implements IAgvQueueService return agvQueueMapper.selectAgvQueueByTaskCode(taskCode); } - @Override - public AgvQueue selectAgvQueueByStatus() { - return agvQueueMapper.selectAgvQueueByStatus(); - } - @Override public void insertHistory(String reqCode) { agvQueueMapper.insertHistory(reqCode); diff --git a/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml b/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml index 6037437..1aa0247 100644 --- a/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/device/AgvQueueMapper.xml @@ -62,11 +62,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where task_code = #{taskCode} - - insert into agv_queue diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 5f5891a..3c9cc19 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -119,7 +119,6 @@ public class SecurityConfig .antMatchers("/api/agv/**").permitAll() .antMatchers("/device/api/**").permitAll() .antMatchers("/wcs2Wms/api/**").permitAll() - .antMatchers("/agv/api/**").permitAll() .antMatchers("/test/**").permitAll() .antMatchers("/largeScreen/monitor/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 diff --git a/ruoyi-ui/src/views/device/ssj/index.vue b/ruoyi-ui/src/views/device/ssj/index.vue index d1e84e6..cdc5286 100644 --- a/ruoyi-ui/src/views/device/ssj/index.vue +++ b/ruoyi-ui/src/views/device/ssj/index.vue @@ -157,6 +157,7 @@ export default { { key: 'kx', label: '空闲', value: d.kx, dict: 'ssj_kx' }, { key: 'dw', label: '到位', value: d.dw, dict: 'ssj_dw' }, { key: 'exception', label: '异常', value: d.exception, dict: 'ssj_ex'}, + ] } if (dev.kind === 'srgv') { diff --git a/ruoyi-ui/vue.config.js b/ruoyi-ui/vue.config.js index 46634cc..f02e036 100644 --- a/ruoyi-ui/vue.config.js +++ b/ruoyi-ui/vue.config.js @@ -9,7 +9,7 @@ const CompressionPlugin = require('compression-webpack-plugin') const name = process.env.VUE_APP_TITLE || 'FORTUCKY WCS SYSTEM' // 网页标题 -const baseUrl = 'http://192.168.188.236:8081' // 后端接口地址(你的后端端口是8081) +const baseUrl = 'http://localhost:8081' // 后端接口地址(你的后端端口是8081) const port = process.env.port || process.env.npm_config_port || 80 // 前端端口