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