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" +