From 93da2f1cd0513453d4d3010d0653343453c6f8a0 Mon Sep 17 00:00:00 2001 From: "1009473166@qq.com" <草拟吗23> Date: Mon, 9 Feb 2026 19:20:17 +0800 Subject: [PATCH] =?UTF-8?q?2026.2.9=20=E5=B0=8F=E8=BD=A6=E9=81=BF=E8=AE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/BasCargoSpaceMapper.java | 5 + .../service/IBasCargoSpaceService.java | 4 + .../impl/BasCargoSpaceServiceImpl.java | 10 + .../service/impl/RoadCacheServiceImpl.java | 4 +- .../device/srgv/mapper/DeviceSrgvMapper.java | 3 + .../srgv/service/IDeviceSrgvService.java | 2 + .../service/impl/DeviceSrgvServiceImpl.java | 5 + .../queue/srgv/mapper/WcsSrgvQueueMapper.java | 5 + .../srgv/service/IWcsSrgvQueueService.java | 2 + .../service/impl/WcsSrgvQueueServiceImpl.java | 5 +- .../schedule/plcRead/srgv/PlcSrgvRead.java | 11 + .../schedule/scheduleTask/cdz/CdzThread.java | 60 ++- .../scheduleTask/srgv/BaseSRgvThread.java | 504 ++++++++++++++---- .../schedule/scheduleTask/ssj/SsjThread.java | 4 +- .../schedule/scheduleTask/tsj/TsjThread.java | 21 +- .../mapper/bas/BasCargoSpaceMapper.xml | 8 + .../mapper/device/DeviceSrgvMapper.xml | 4 + .../resources/mapper/job/MydoJobMapper.xml | 2 +- .../mapper/job/SrgvChargingJobMapper.xml | 2 +- .../mapper/queue/WcsSrgvQueueMapper.xml | 5 + 20 files changed, 527 insertions(+), 139 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java index 0d7ee0c..48faa42 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.bas.cargospace.mapper; import java.util.List; import com.ruoyi.bas.cargospace.domain.BasCargoSpace; +import org.apache.ibatis.annotations.Param; /** * 库存信息Mapper接口 @@ -60,4 +61,8 @@ public interface BasCargoSpaceMapper public int deleteBasCargoSpaceByCargoSpaceIds(String[] cargoSpaceIds); BasCargoSpace selectBasCargoSpaceByWmsCargoSpaceId(String cargoSpaceId); + + String selecGroupCodingBySite(@Param("currSite") String currSite); + + String selectMaxSiteIdByNo(@Param("siteId") String groupCodingNo); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/IBasCargoSpaceService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/IBasCargoSpaceService.java index 3f0e9c3..8cb845f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/IBasCargoSpaceService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/IBasCargoSpaceService.java @@ -60,4 +60,8 @@ public interface IBasCargoSpaceService public int deleteBasCargoSpaceByCargoSpaceId(String cargoSpaceId); BasCargoSpace selectBasCargoSpaceByWmsCargoSpaceId(String cargoSpaceId); + + String selecGroupCodingBySite(String currSite); + + String selectMaxSiteIdByNo(String groupCodingNo); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/impl/BasCargoSpaceServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/impl/BasCargoSpaceServiceImpl.java index b1be140..8d5ffa5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/impl/BasCargoSpaceServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/impl/BasCargoSpaceServiceImpl.java @@ -95,4 +95,14 @@ public class BasCargoSpaceServiceImpl implements IBasCargoSpaceService public BasCargoSpace selectBasCargoSpaceByWmsCargoSpaceId(String cargoSpaceId) { return basCargoSpaceMapper.selectBasCargoSpaceByWmsCargoSpaceId(cargoSpaceId); } + + @Override + public String selectMaxSiteIdByNo(String groupCodingNo) { + return basCargoSpaceMapper.selectMaxSiteIdByNo(groupCodingNo); + } + + @Override + public String selecGroupCodingBySite(String currSite) { + return basCargoSpaceMapper.selecGroupCodingBySite(currSite); + } } 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 62b70fb..76f8ab1 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 @@ -142,7 +142,9 @@ public class RoadCacheServiceImpl implements RoadCacheService { //添加其他小车路径列表 HashSet otherCarSiteList = new HashSet<>(); for (WcsSrgvQueue wcsSrgvQueue : otherCarQueue) { - otherCarSiteList.addAll(Arrays.asList(wcsSrgvQueue.getPathInfo().split(","))); + if (wcsSrgvQueue.getPathInfo()!=null) { + otherCarSiteList.addAll(Arrays.asList(wcsSrgvQueue.getPathInfo().split(","))); + } } //锁定其他小车路径 if (CollUtil.isNotEmpty(otherCarSiteList)) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/mapper/DeviceSrgvMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/mapper/DeviceSrgvMapper.java index 6227a57..4a12ee4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/mapper/DeviceSrgvMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/mapper/DeviceSrgvMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.device.srgv.mapper; import java.util.List; import com.ruoyi.device.srgv.domain.DeviceSrgv; +import org.apache.ibatis.annotations.Param; /** * 四向小车设备表Mapper接口 @@ -58,4 +59,6 @@ public interface DeviceSrgvMapper * @return 结果 */ public int deleteDeviceSrgvByGuids(String[] guids); + + int updateLastTimeByAgvId(@Param("agvId") String agvId); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/service/IDeviceSrgvService.java b/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/service/IDeviceSrgvService.java index a04af6d..921163c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/service/IDeviceSrgvService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/service/IDeviceSrgvService.java @@ -58,4 +58,6 @@ public interface IDeviceSrgvService * @return 结果 */ public int deleteDeviceSrgvByGuid(String guid); + + int updateLastTimeByAgvId(String agvId); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/service/impl/DeviceSrgvServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/service/impl/DeviceSrgvServiceImpl.java index a26cdb0..b1aa5c9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/service/impl/DeviceSrgvServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/srgv/service/impl/DeviceSrgvServiceImpl.java @@ -79,6 +79,11 @@ public class DeviceSrgvServiceImpl implements IDeviceSrgvService return deviceSrgvMapper.deleteDeviceSrgvByGuids(guids); } + @Override + public int updateLastTimeByAgvId(String agvId) { + return deviceSrgvMapper.updateLastTimeByAgvId(agvId); + } + /** * 删除四向小车设备表信息 * 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 8595c36..933a320 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 @@ -25,6 +25,11 @@ public interface WcsSrgvQueueMapper public WcsSrgvQueue selectWcsSrgvQueueByAgvId(String agvId); + public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor); + + + + /** * 查询四向小车任务队列列表 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 030daf3..40f836a 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 @@ -24,6 +24,8 @@ public interface IWcsSrgvQueueService public WcsSrgvQueue selectWcsSrgvQueueByAgvId(String agvId); + public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor); + 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 24bc09e..81a2070 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 @@ -50,7 +50,10 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService return wcsSrgvQueueMapper.selectWcsSrgvQueueByAgvId(agvId); } - + @Override + public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor) { + return wcsSrgvQueueMapper.selectWcsSrgvQueueByFloor(theFloor); + } /** * 查询四向小车任务队列列表 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 60c4a99..2291b28 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/PlcSrgvRead.java @@ -79,6 +79,11 @@ public class PlcSrgvRead implements Runnable { if (read1.IsSuccess) { setValueByByte1(read1.Content, deviceSrgv); } + //读取二段任务 小车是否接收完成1段作业 + OperateResultExOne read3 = modbusTcpNet.Read("1000", (short) 2);//2400-2414 + if (read3.IsSuccess) { + setValueByByte3(read3.Content, deviceSrgv); + } //读取双字 OperateResultExOne read2 = modbusTcpNet.Read("4060", (short) 8);// 4800-4807任务号、原点、目标点、当前 @@ -118,6 +123,12 @@ public class PlcSrgvRead implements Runnable { } + //单字 + private void setValueByByte3(byte[] content, DeviceSrgv agvData) { +// agvData.setTaskType(0); + agvData.setSpare5(String.valueOf(Convert.toInt(byteTransform.TransInt16(content, 0)))); + } + private void setValueByByte2(byte[] content, DeviceSrgv agvData) { byteTransform.setDataFormat(DataFormat.CDAB); // TODO 注意双字反转 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 e9cdf19..fb59d95 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 @@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjUtil; +import com.ruoyi.common.domain.SendData; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.device.cdz.domain.DeviceCdz; import com.ruoyi.device.cdz.service.IDeviceCdzService; @@ -16,11 +17,14 @@ import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; import com.ruoyi.schedule.plcRead.cdz.PlcCdzRead; import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead; +import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead; +import com.ruoyi.schedule.plcRead.util.Tools; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.UUID; import java.util.stream.Collectors; @Slf4j @@ -48,10 +52,10 @@ public class CdzThread implements Runnable { init(); while (isRun) { try { - dispatch(); + dispatch(); Thread.sleep(1500); - }catch (Exception e){ - log.error(e.getMessage(),e); + } catch (Exception e) { + log.error(e.getMessage(), e); } @@ -106,20 +110,26 @@ public class CdzThread implements Runnable { for (SrgvChargingJob srgvChargingJob : srgvChargingJobs) { if ("0".equals(srgvChargingJob.getChargingStatus())) { - int i = PlcCdzRead.WriteToCdz("", null); + String chargingSite = srgvChargingJob.getChargingSite(); + DeviceCdz deviceCdz = new DeviceCdz(); + deviceCdz.setSiteId(chargingSite); + List deviceCdzs = deviceCdzService.selectDeviceCdzList(deviceCdz); + String plcDbWriteAddress = deviceCdzs.get(0).getPlcDbWriteAddress(); + SendData qxSendData = new SendData(Tools.INT, 1); + byte[] bytes = Tools.sendData(qxSendData); + int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes); if (i == 1) { srgvChargingJob.setChargingStatus("2"); srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date())); chargingJobService.updateSrgvChargingJob(srgvChargingJob); } } - } } - //生成断电任务 有任务且电量大于50 + //生成断电任务 有任务且电量大于50 todo 代码无效 WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); wcsSrgvQueueParam.setIssued("0"); List wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam); @@ -157,17 +167,25 @@ public class CdzThread implements Runnable { List srgvChargingJobDds = chargingJobService.selectSrgvChargingJobList(srgvChargingJobDdParam); if (CollUtil.isNotEmpty(srgvChargingJobDds)) { - for (SrgvChargingJob srgvChargingJob : srgvChargingJobs) { + for (SrgvChargingJob srgvChargingJob : srgvChargingJobDds) { if ("0".equals(srgvChargingJob.getChargingStatus())) { - int i = PlcCdzRead.WriteToCdz("", null); + String chargingSite = srgvChargingJob.getChargingSite(); + DeviceCdz deviceCdz = new DeviceCdz(); + deviceCdz.setSiteId(chargingSite); + List deviceCdzs = deviceCdzService.selectDeviceCdzList(deviceCdz); + String plcDbWriteAddress = deviceCdzs.get(0).getPlcDbWriteAddress(); + SendData qxSendData = new SendData(Tools.INT, 0); + byte[] bytes = Tools.sendData(qxSendData); + int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes); if (i == 1) { srgvChargingJob.setChargingStatus("1"); srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date())); chargingJobService.updateSrgvChargingJob(srgvChargingJob); - //插入历史 chargingJobService.insertHistory(srgvChargingJob.getGuid()); chargingJobService.deleteSrgvChargingJobByGuid(srgvChargingJob.getGuid()); + deviceCdzs.get(0).setSpare1(null); + deviceCdzService.updateDeviceCdz(deviceCdzs.get(0)); } } @@ -179,7 +197,6 @@ public class CdzThread implements Runnable { /** * 创建充电任务 - * */ private void createChargingInJob(List srgvList) { srgvList.sort((o1, o2) -> o2.getBattery() - o1.getBattery()); @@ -207,7 +224,7 @@ public class CdzThread implements Runnable { //生成充电任务 SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString()); - srgvChargingJobParam.setChargingSite(cdz.getSiteId()); + srgvChargingJobParam.setChargingSite("08020" + cdz.getSzcs()); srgvChargingJobParam.setChargingId(cdz.getId().toString()); List wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); if (CollUtil.isEmpty(wcsChargingJobs)) { @@ -219,8 +236,10 @@ public class CdzThread implements Runnable { scj.setStartDate(DateUtil.now()); scj.setJobType("1");//到充电桩 scj.setAgvId(deviceSrgv.getDeviceId().toString()); - scj.setChargingId(deviceSrgv.getDeviceId().toString()); + scj.setChargingId(cdz.getId().toString()); chargingJobService.insertSrgvChargingJob(scj); + cdz.setSpare1(deviceSrgv.getDeviceId().toString()); + deviceCdzService.updateDeviceCdz(cdz); } } } @@ -230,28 +249,39 @@ public class CdzThread implements Runnable { /** * 创建充电任务 - * */ private void createChargingOutJob(DeviceSrgv deviceSrgv, DeviceCdz cdz) { SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString()); srgvChargingJobParam.setChargingSite(cdz.getSiteId()); srgvChargingJobParam.setChargingId(cdz.getId().toString()); + srgvChargingJobParam.setJobType("1"); List srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); - if (CollUtil.isNotEmpty(srgvChargingJobs)) { + + SrgvChargingJob srgvChargingJobParamOut = new SrgvChargingJob(); + srgvChargingJobParamOut.setAgvId(deviceSrgv.getDeviceId().toString()); + srgvChargingJobParamOut.setChargingSite(cdz.getSiteId()); + srgvChargingJobParamOut.setChargingId(cdz.getId().toString()); + srgvChargingJobParamOut.setJobType("2"); + List srgvChargingJobOut = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParamOut); + + if (CollUtil.isNotEmpty(srgvChargingJobs)&&CollUtil.isEmpty(srgvChargingJobOut)) { SrgvChargingJob scj = srgvChargingJobs.get(0); //插入历史 chargingJobService.insertHistory(scj.getGuid()); + chargingJobService.deleteSrgvChargingJobByGuid(scj.getGuid()); scj.setChargingSite(cdz.getSiteId()); + scj.setGuid(IdUtil.fastSimpleUUID()); scj.setJobStatus("1"); scj.setChargingStatus("0"); scj.setStartDate(DateUtil.now()); scj.setJobType("2");//到充电桩 scj.setAgvId(deviceSrgv.getDeviceId().toString()); - scj.setChargingId(deviceSrgv.getDeviceId().toString()); + scj.setChargingId(String.valueOf(cdz.getId())); chargingJobService.insertSrgvChargingJob(scj); + } } 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 a9b218c..6492630 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 @@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.ruoyi.api.domain.RequestLog; import com.ruoyi.api.service.IApiService; +import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; import com.ruoyi.bas.port.service.IWcsPortService; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService; @@ -16,6 +17,7 @@ import com.ruoyi.common.domain.CustomThread; import com.ruoyi.common.domain.SendData2; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.device.srgv.domain.DeviceSrgv; +import com.ruoyi.device.srgv.service.IDeviceSrgvService; import com.ruoyi.job.charg.domain.SrgvChargingJob; import com.ruoyi.job.charg.service.ISrgvChargingJobService; import com.ruoyi.job.domain.JobCallBack; @@ -60,6 +62,11 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { private IApiService apiService; private JobCallBackServiceImpl jobCallBackService; + private IBasCargoSpaceService basCargoSpaceService; + + public IDeviceSrgvService deviceSrgvService; + private int taskCache = 450001; + public void init() { sRgvCodeList = new HashMap<>(); ArrayList sRgvCodes = new ArrayList<>(); @@ -77,6 +84,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { roadCacheService = SpringUtils.getBean(RoadCacheService.class); apiService = SpringUtils.getBean(IApiService.class); jobCallBackService = SpringUtils.getBean(JobCallBackServiceImpl.class); + basCargoSpaceService = SpringUtils.getBean(IBasCargoSpaceService.class); + deviceSrgvService = SpringUtils.getBean(IDeviceSrgvService.class); + mydoJobService = SpringUtils.getBean(IMydoJobService.class); } @Override @@ -102,7 +112,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { // 充电任务 inCharging(deviceSrgv); // 充电完成调离 - outCharging(deviceSrgv); +// outCharging(deviceSrgv); } else { log.error("小车设备为空"); @@ -168,13 +178,15 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { WcsSrgvMap wcsSrgvMap = wcsSrgvMapService.selectWcsSrgvMapBySiteId(chargingSite); if (wcsSrgvMap.getTheLayer().equals(deviceSrgv.getCurrFloor())) { wcsSrgvQueue.setEndSite(chargingSite); + wcsSrgvQueue.setDefault02("3"); } else { wcsSrgvQueue.setEndSite("tsj"); + wcsSrgvQueue.setDefault02("8"); } + wcsSrgvQueue.setTaskNo("9999"); wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); - wcsSrgvQueue.setDefault02("3"); wcsSrgvQueue.setDefault07(Convert.toStr(wcsSrgvMap.getZ())); wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); } @@ -213,6 +225,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { 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()); @@ -227,17 +240,20 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { deviceSrgv = deviceSrgv1; - break; } } } if (deviceSrgv != null) { WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); - if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1) { + WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); + + if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) { //查询小车是否为取货楼层 String endSite = ""; String issued = "0"; String executionStatus = "1"; + String default08 = "";//是否二段任务标识 + String default06 = ""; WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); wcsSrgvMap.setCargoSpaceId(mydoJob1.getCargoSpaceId()); List wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); @@ -248,6 +264,13 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { 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"; @@ -299,8 +322,6 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3); } } - - } } @@ -322,16 +343,20 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); - wcsSrgvQueue.setDefault02("4"); - wcsSrgvQueue.setDefault07("1"); + 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); - } } - } - - } } } @@ -355,20 +380,26 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { 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()); + + 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; // 更新为更小楼层的小车 - break; + log.info("楼层bu相等:{}", deviceSrgv); + } } } @@ -376,7 +407,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { if (deviceSrgv != null) { WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); - if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1) { + WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); + + if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) { //查询小车是否为1楼,且1楼小车不在入库站点 String endSite = ""; @@ -469,7 +502,11 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString()); wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); - wcsSrgvQueue.setDefault02("4"); + if (endSite.equals("tsj")) { + wcsSrgvQueue.setDefault02("8"); + } else { + wcsSrgvQueue.setDefault02("4"); + } wcsSrgvQueue.setDefault07("1"); wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); @@ -529,6 +566,72 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } } } +// if (wcsSrgvQueue.getDefault02().equals("8")){ +// endSite="07050"+deviceSrgv.getCurrFloor(); +// } + // + String endBlockAgv = null; + DeviceSrgv endBlockDevice = null; + // TODO 通过arrByRoadSite 中的站点 查询是否存在其他车的站点,如果存在则生成其他车到避让点的队列 + if (arrByRoadSite != null && !arrByRoadSite.isEmpty()) { + // 将arrByRoadSite转为String类型的Set(统一类型,方便匹配) + Set roadSiteSet = arrByRoadSite.keySet().stream() + .filter(Objects::nonNull) // 过滤集合中的null值 + .map(Object::toString) // 转为字符串,适配站点类型 + .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) + + // 3. 处理结果(若找到则赋值) + if (targetEntry.isPresent()) { + endBlockAgv = targetEntry.get().getKey(); + endBlockDevice = targetEntry.get().getValue(); + } + } + + WcsSrgvQueue wcsSrgvQueueBR = new WcsSrgvQueue(); + wcsSrgvQueueBR.setAgvId(endBlockAgv); + List wcsSrgvQueueBRS = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueBR); + if (endBlockDevice != null && wcsSrgvQueueBRS.isEmpty()) { + // 选择当前层最近且可达的缓存点(避让点) + WcsSrgvMap cacheParam = new WcsSrgvMap(); + cacheParam.setRemark("cache"); + cacheParam.setTheLayer(floor); + List cacheMaps = wcsSrgvMapService.selectWcsSrgvMapList(cacheParam); + // 生成阻挡车的避让任务(点到点,高优先级,未下发) + WcsSrgvQueue taskB = new WcsSrgvQueue(); + taskB.setGuid(UUID.randomUUID().toString()); + // 生成纯数字任务号(PLC要求),9 + HHmmss + taskB.setTaskNo(String.valueOf(taskCache)); + taskB.setAgvId(endBlockAgv); + taskB.setTaskType("1"); // 点到点移动 + taskB.setDefault02("4"); // 业务类型标识为点到点 + taskB.setPriority(9L); // 高优先级,尽快避让 + taskB.setIssued("0"); // 未下发 + taskB.setExecutionStatus("1");// 初始状态 + taskB.setStartSite(endBlockDevice.getCurrSite()); + taskB.setCargoPickSite(endBlockDevice.getCurrSite()); + taskB.setCargoPlaceSite("05020"+endBlockDevice.getCurrFloor()); + taskB.setEndSite("05020"+endBlockDevice.getCurrFloor()); + taskB.setTheFloor(floor.toString()); + taskB.setDefault03(endBlockDevice.getCurrSite()); + taskB.setDefault07(floor.toString()); + taskB.setDefault08("1");//避让任务,直接完成 + taskB.setCreateDate(DateUtil.now()); + wcsSagvQueueMapper.insertWcsSrgvQueue(taskB); + taskCache++; + log.info("目标点 {} 被小车 {} 占用,已调度其前往避让点 {}", endSite, endBlockAgv, "02050"+endBlockDevice.getCurrFloor()); + // 当前车等待下一轮调度(待阻挡车移开后自然可达) + return false; + } + //处理地图 int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv); @@ -563,7 +666,6 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { break; } } - } } if ("4".equals(wcsSrgvQueue.getDefault02()) && "tsj".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPickSite())) { @@ -634,62 +736,176 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } } if (("tsj").equals(endSite)) { - endSite = "09050" + wcsSrgvQueue.getTheFloor(); + if (wcsSrgvQueue.getDefault02().equals("8")) { + endSite = extractTarget(String.valueOf(pathBuilder)); + } else { + endSite = "09050" + wcsSrgvQueue.getTheFloor(); + } } // if (("tsj").equals(startSite)) { // endSite = "09050" + wcsSrgvQueue.getTheFloor(); // } - List sendDataList = new ArrayList<>(); - if (!trun.isEmpty()) { - SendData2 path = new SendData2(); - path.setAddress("4004");//地址 - path.setData(startSite + "," + endSite + "," + turnBuilder); - path.setType(2); - sendDataList.add(path); + List sendDataList = null; + if (StrUtil.isEmpty(wcsSrgvQueue.getDefault08())) { + sendDataList = new ArrayList<>(); + if (!trun.isEmpty()) { + SendData2 path = new SendData2(); + path.setAddress("4004");//地址 + path.setData(startSite + "," + endSite + "," + turnBuilder); + path.setType(2); + sendDataList.add(path); + } else { + SendData2 path = new SendData2(); + path.setAddress("4004");//地址 + path.setData(startSite + "," + endSite + ",0,0,0,0,0,0"); + path.setType(2); + sendDataList.add(path); + } + + //任务号、原、目标数据转换 + String siteId = wcsSrgvQueue.getTaskNo();//+ "," + startSite + "," + endSite; + SendData2 site = new SendData2(); + site.setAddress("4000"); + site.setData(siteId); + site.setType(2); + sendDataList.add(site); + + //任务类型转换 + SendData2 taskType = new SendData2(); + taskType.setAddress("4002"); + taskType.setData(wcsSrgvQueue.getDefault02()); + taskType.setType(1); + sendDataList.add(taskType); + + //下发标志转换 + SendData2 flag = new SendData2(); + flag.setAddress("4021"); + flag.setData("1"); + flag.setType(1); + sendDataList.add(flag); + + if (wcsSrgvQueue.getDefault02().equals("8")) { + //换层标志 + SendData2 hcbz = new SendData2(); + hcbz.setAddress("4020"); + hcbz.setData("1"); + hcbz.setType(1); + sendDataList.add(hcbz); + + //换层目标层 + SendData2 hcmbc = new SendData2(); + hcmbc.setAddress("4022"); + hcmbc.setData(wcsSrgvQueue.getDefault07()); + hcmbc.setType(1); + sendDataList.add(hcmbc); + + } + } else { - SendData2 path = new SendData2(); - path.setAddress("4004");//地址 - path.setData(startSite + "," + endSite); - path.setType(2); - sendDataList.add(path); + if (wcsSrgvQueue.getDefault08().equals("1")) { + sendDataList = new ArrayList<>(); + if (!trun.isEmpty()) { + SendData2 path = new SendData2(); + path.setAddress("4404");//地址 + path.setData(startSite + "," + endSite + "," + turnBuilder); + path.setType(2); + sendDataList.add(path); + } else { + SendData2 path = new SendData2(); + path.setAddress("4404");//地址 + path.setData(startSite + "," + endSite + ",0,0,0,0,0,0"); + path.setType(2); + sendDataList.add(path); + } + + //下发标志转换 + SendData2 flag = new SendData2(); + flag.setAddress("4422"); + flag.setData("1"); + flag.setType(1); + sendDataList.add(flag); + + //任务类型转换 + SendData2 taskType = new SendData2(); + taskType.setAddress("4402"); + taskType.setData(wcsSrgvQueue.getDefault02()); + taskType.setType(1); + sendDataList.add(taskType); + + } + + if (wcsSrgvQueue.getDefault08().equals("2") && deviceSrgv.getSpare5().equals("1")) { + sendDataList = new ArrayList<>(); + SendData2 path = new SendData2(); + path.setAddress("4404");//地址 + path.setData(endSite + "," + wcsSrgvQueue.getDefault06() + ",0,0,0,0,0,0"); + path.setType(2); + sendDataList.add(path); + + //下发标志转换 + SendData2 flag = new SendData2(); + flag.setAddress("4422"); + flag.setData("2"); + flag.setType(1); + sendDataList.add(flag); + + //多段任务完成标志 + SendData2 wcjs = new SendData2(); + wcjs.setAddress("4423"); + wcjs.setData("99"); + wcjs.setType(1); + sendDataList.add(wcjs); + + //任务类型转换 + SendData2 taskType = new SendData2(); + taskType.setAddress("4402"); + taskType.setData("7"); + taskType.setType(1); + sendDataList.add(taskType); + + } + //任务号、原、目标数据转换 + String siteId = wcsSrgvQueue.getTaskNo();//+ "," + startSite + "," + endSite; + SendData2 site = new SendData2(); + site.setAddress("4400"); + site.setData(siteId); + site.setType(2); + sendDataList.add(site); + + } - - //任务号、原、目标数据转换 - String siteId = wcsSrgvQueue.getTaskNo();//+ "," + startSite + "," + endSite; - SendData2 site = new SendData2(); - site.setAddress("4000"); - site.setData(siteId); - site.setType(2); - sendDataList.add(site); - - //任务类型转换 - SendData2 taskType = new SendData2(); - taskType.setAddress("4002"); - taskType.setData(wcsSrgvQueue.getDefault02()); - taskType.setType(1); - sendDataList.add(taskType); - - //下发标志转换 - SendData2 flag = new SendData2(); - flag.setAddress("4021"); - flag.setData("1"); - flag.setType(1); - sendDataList.add(flag); - //下发数据 boolean b = sendCarTask(sendDataList, deviceSrgv); if (b) { wcsSrgvQueue.setPathInfo(pathBuilder.toString()); wcsSrgvQueue.setTrunPath(turnBuilder.toString()); - wcsSrgvQueue.setIssued("1"); + if (wcsSrgvQueue.getDefault08() == null || !wcsSrgvQueue.getDefault08().equals("1")) { + wcsSrgvQueue.setIssued("1"); + } wcsSrgvQueue.setExecutionStatus("3"); + if (wcsSrgvQueue.getDefault08() != null && wcsSrgvQueue.getDefault08().equals("1")) { + wcsSrgvQueue.setDefault08("2"); + } else { + wcsSrgvQueue.setDefault08(""); +// wcsSrgvQueue.setDefault06(""); + } wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); - MydoJob mydoJob = new MydoJob(); - mydoJob.setTaskNo(wcsSrgvQueue.getTaskNo()); - mydoJob.setExecutionPhase("3"); - mydoJob.setStatus("3"); - mydoJobService.updateMydoJob(mydoJob); + MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); + //换层任务不修改执行阶段 + if (!wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) { + mydoJob.setExecutionPhase("3"); + mydoJob.setStatus("3"); + mydoJobService.updateMydoJob(mydoJob); + } + // 充电修改 srgvchaningjob + if (wcsSrgvQueue.getDefault02().equals("3")) { + SrgvChargingJob srgvChargingJob = new SrgvChargingJob(); + srgvChargingJob.setJobStatus("3"); + srgvChargingJob.setAgvId(wcsSrgvQueue.getAgvId()); + srgvChargingJobMapper.updateSrgvChargingJob(srgvChargingJob); + + } return true; } else { log.error("小车下发失败 taskNo:{}", wcsSrgvQueue.getTaskNo()); @@ -708,11 +924,21 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { // 空车任务(充电、换层、手动点到点、除尘等) sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); break; - case "1": + case "8": + sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); + break; case "2": // 载货任务(出库、入库、移库等) sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); break; + case "1": + // 载货任务(出库、入库、移库等) + sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); + break; + case "3": + // 载货任务(出库、入库、移库等) + sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); + break; } if (sendFlag) { @@ -805,18 +1031,30 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { * 小车完成队列 */ private void completeCarTask(DeviceSrgv deviceSrgv) { - //联机自动 - if (deviceSrgv.getWorkMode() == 5) { - if (deviceSrgv.getStatus() == 1) { + + + if (deviceSrgv.getWorkMode() == 5) { //联机自动 + if (deviceSrgv.getStatus() == 1) {//小车待机 WcsSrgvQueue param = new WcsSrgvQueue(); param.setAgvId(Convert.toStr(deviceSrgv.getDeviceId())); - param.setEndSite(deviceSrgv.getCurrSite());//目标点 + param.setTaskNo(String.valueOf(deviceSrgv.getTaskNo()));//目标点 param.setIssued("1"); param.setExecutionStatus("3"); List wcsSagvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(param);//查询到达目标的 if (CollUtil.isNotEmpty(wcsSagvQueues)) { WcsSrgvQueue wcsSrgvQueue = wcsSagvQueues.get(0); finishTaskByQueue(deviceSrgv.getCurrSite(), wcsSrgvQueue); + } else { + WcsSrgvQueue param1 = new WcsSrgvQueue(); + param1.setAgvId(Convert.toStr(deviceSrgv.getDeviceId())); + param1.setEndSite(deviceSrgv.getCurrSite()); + param1.setIssued("1"); + param1.setExecutionStatus("3"); + List wcsSagvQueues1 = wcsSagvQueueMapper.selectWcsSrgvQueueList(param1);//查询到达目标的 + if (CollUtil.isNotEmpty(wcsSagvQueues1)) { + WcsSrgvQueue wcsSrgvQueue = wcsSagvQueues1.get(0); + finishTaskByQueue(deviceSrgv.getCurrSite(), wcsSrgvQueue); + } } } } @@ -831,9 +1069,17 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { */ private void finishTaskByQueue(String currSite, WcsSrgvQueue wcsSrgvQueue) { - - // 如果当前在终点 - if (Objects.equals(currSite, wcsSrgvQueue.getEndSite())) { + String groupCodingNo = basCargoSpaceService.selecGroupCodingBySite(currSite); + String siteId = basCargoSpaceService.selectMaxSiteIdByNo(groupCodingNo); + List sites = new ArrayList<>(); + if (wcsSrgvQueue.getEndSite().equals("tsj") && wcsSrgvQueue.getDefault02().equals("8")) { + //处理换层逻辑 + String site1 = "07050" + wcsSrgvQueue.getDefault07(); + String site2 = "10050" + wcsSrgvQueue.getDefault07(); + sites.add(site1); + sites.add(site2); + } + if (Objects.equals(currSite, wcsSrgvQueue.getEndSite()) || (siteId != null && Objects.equals(currSite, siteId)) || sites.contains(currSite)) { String taskType = wcsSrgvQueue.getTaskType(); String cargoPickSite = wcsSrgvQueue.getCargoPickSite(); String cargoPlaceSite = wcsSrgvQueue.getCargoPlaceSite(); @@ -860,48 +1106,55 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { // return; } //空车任务 且当前车的位置和取货位置相同 - if ("1".equals(taskType) && cargoPickSite.equals(currSite)) { + if ("1".equals(taskType) + && (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite)) - WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); - WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); + ) { String endSite = ""; String xfType = ""; - // 取货点地图和放货点地图不为空 - if (wcsSrgvMapq != null && wcsSrgvMapf != null) { - - if (Objects.equals(wcsSrgvMapq.getTheLayer(), wcsSrgvMapf.getTheLayer())) { - //如果是同层,终点为放货点 - endSite = cargoPlaceSite; - } else { - //不同层,终点为提升机 - endSite = "tsj"; - } - - if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) { - xfType = "1";//入库 - } else { - if ("L1004".equals(wcsSrgvMapf.getRemark()) || "L1005".equals(wcsSrgvMapf.getRemark())) { - xfType = "2";//出库 - } else { - xfType = "7";//移库 - } - } - // 更新目标点,修改执行队列 - wcsSrgvQueue.setExecutionStatus("4"); + if (wcsSrgvQueue.getDefault02().equals("8")) { + //换层任务直接完成,等待后续入出库作业下发 wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); - wcsSrgvQueue.setStartSite(currSite); - wcsSrgvQueue.setEndSite(endSite); - wcsSrgvQueue.setDefault02(xfType); - wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString()); - wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString()); - wcsSrgvQueue.setIssued("0"); - wcsSrgvQueue.setExecutionStatus("1"); - wcsSrgvQueue.setTaskType("2"); - wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); + wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); + return; + } else { + WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); + WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); + // 取货点地图和放货点地图不为空 + if (wcsSrgvMapq != null && wcsSrgvMapf != null) { + if (Objects.equals(wcsSrgvMapq.getTheLayer(), wcsSrgvMapf.getTheLayer())) { + //如果是同层,终点为放货点 + endSite = cargoPlaceSite; + } else { + //不同层,终点为提升机 + endSite = "tsj"; + } + + if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) { + xfType = "1";//入库 + } else { + if ("L1004".equals(wcsSrgvMapf.getRemark()) || "L1005".equals(wcsSrgvMapf.getRemark())) { + xfType = "2";//出库 + } else { + xfType = "7";//移库 + } + } + // 更新目标点,修改执行队列 + wcsSrgvQueue.setEndSite(endSite); + wcsSrgvQueue.setDefault02(xfType); + wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString()); + wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString()); + wcsSrgvQueue.setIssued("0"); + wcsSrgvQueue.setExecutionStatus("1"); + wcsSrgvQueue.setTaskType("2"); + } + wcsSrgvQueue.setStartSite(currSite); + wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); + wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); } // 入库任务 原地址和目标地址不同,且小车当前地址和放货地址相同处理入库任务执行队列 - } else if ("2".equals(taskType) && cargoPlaceSite.equals(currSite)) { + } else if ("2".equals(taskType) && (cargoPlaceSite.equals(currSite) || siteId.equals(currSite))) { //判断对列的任务类型 当前只限于处理出库任务执行队列 switch (wcsSrgvQueue.getDefault02()) { case "1"://入库,插库存, @@ -922,12 +1175,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { case "2": MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); if (mydoJobOut != null) { + mydoJobService.insertHistory(mydoJobOut.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId()); } - - case "7"://移库,变动库存 - break; default: break; @@ -937,12 +1188,20 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); - } else { + // 充电任务 + } else if ("3".equals(taskType)) { + //删除队列,插入历史表 + wcsSrgvQueue.setExecutionStatus("4"); + wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); + wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); + // 删除充电任务 + srgvChargingJobMapper.deleteSrgvChargingJobByGuid(wcsSrgvQueue.getAgvId()); + //充电之类的,不知道用不用 } - - + //更新小车待机时间 + deviceSrgvService.updateLastTimeByAgvId(wcsSrgvQueue.getAgvId()); } } @@ -979,5 +1238,36 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface { } + public static String extractTarget(String data) { + // 1. 基础校验 + if (data == null || data.trim().isEmpty()) { + return "无效数据"; + } + + // 2. 分割字符串 + String[] parts = data.split(","); + int len = parts.length; + + // 3. 优先检查是否符合【第一种数据】的特征 + // 特征:倒数第三个字段以 "07" 开头 + if (len >= 3) { + String val3 = parts[len - 3]; + if (val3.startsWith("07")) { + return val3; // 命中规则1,直接返回 + } + } + + // 4. 检查是否符合【第二种数据】的特征 + // 特征:倒数第二个字段以 "10" 开头 + if (len >= 2) { + String val2 = parts[len - 2]; + if (val2.startsWith("10")) { + return val2; // 命中规则2,直接返回 + } + } + + return "tsj"; + } + } 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 653d895..307fcb4 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 @@ -143,7 +143,7 @@ public class SsjThread implements Runnable { } // 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段 MydoJob mydoJob1 = new MydoJob(); - mydoJob1.setTrayCode(mydoJob.getTaskNo()); + mydoJob1.setTaskNo(mydoJob.getTaskNo()); List mydoJobs = mydoJobService.selectMydoJobList(mydoJob1); if (mydoJobs.size() > 0) { return; @@ -156,7 +156,7 @@ public class SsjThread implements Runnable { log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo()); } } else { - int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 1); + int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2); if (i == 1) { log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2"); } 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 f4090db..94730f4 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 @@ -7,14 +7,11 @@ 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.cargospace.service.IBasCargoSpaceService; -import com.ruoyi.bas.port.domain.WcsPort; import com.ruoyi.bas.port.service.IWcsPortService; import com.ruoyi.common.domain.SendData; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.device.srgv.domain.DeviceSrgv; import com.ruoyi.device.tsj.domain.DeviceTsj; -import com.ruoyi.device.tsj.service.IDeviceTsjService; import com.ruoyi.job.service.IMydoJobService; import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; @@ -23,7 +20,6 @@ import com.ruoyi.queue.tsj.domain.TsjDeviceExecutionQueueFinish; import com.ruoyi.queue.tsj.service.ITsjDeviceExecutionQueueFinishService; import com.ruoyi.queue.tsj.service.ITsjDeviceExecutionQueueService; import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead; -import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead; import com.ruoyi.schedule.plcRead.tsj.PlcTsjRead; import com.ruoyi.schedule.plcRead.util.Tools; import lombok.extern.slf4j.Slf4j; @@ -39,7 +35,7 @@ public class TsjThread implements Runnable { private ITsjDeviceExecutionQueueFinishService tsjDeviceExecutionQueueFinishService; private IWcsPortService wcsPortService; private IWcsSrgvQueueService wcsSrgvQueueService; - + public IMydoJobService mydoJobService; public void init() { tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class); @@ -81,7 +77,7 @@ public class TsjThread implements Runnable { * * */ if (czfs == 2 && sbzt == 2 && rwh > 999) { - finishSend(rwh); +// finishSend(rwh, tsj); } /* @@ -102,7 +98,7 @@ public class TsjThread implements Runnable { * */ if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 999) { //任务完成 - finishTask(rwh); + finishTask(rwh, tsj); } /* @@ -131,6 +127,7 @@ public class TsjThread implements Runnable { } } + // 下发提升机完成 private void createSRgvQueueTsjFinish(Long rwh, DeviceTsj tsj) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { @@ -235,6 +232,7 @@ public class TsjThread implements Runnable { tsjDeviceExecutionQueue.setSrcRow("0"); tsjDeviceExecutionQueue.setSrcLayer(strFloor); tsjDeviceExecutionQueue.setTarRow("0"); + tsjDeviceExecutionQueue.setTarLayer(tarFloor); tsjDeviceExecutionQueue.setSendType("1"); tsjDeviceExecutionQueue.setCreateDate(DateUtil.formatDateTime(new Date())); @@ -344,11 +342,11 @@ public class TsjThread implements Runnable { } - private void finishTask(Long taskNo) { + private void finishTask(Long taskNo, DeviceTsj tsj) { //根据任务号查询队列 修改执行状态 TsjDeviceExecutionQueue tsjDeviceExecutionQueue = tsjDeviceExecutionQueueService.selectTsjDeviceExecutionQueueByRwh(taskNo); - if (ObjUtil.isNotNull(tsjDeviceExecutionQueue)) { + if (ObjUtil.isNotNull(tsjDeviceExecutionQueue) && tsjDeviceExecutionQueue.getSendFlag().equals("1") && tsj.getDqcs() == Integer.parseInt(tsjDeviceExecutionQueue.getTarLayer())) { //完成提升机任务 插入历史表 TsjDeviceExecutionQueueFinish tsjDeviceExecutionQueueFinish = new TsjDeviceExecutionQueueFinish(); BeanUtil.copyProperties(tsjDeviceExecutionQueue, tsjDeviceExecutionQueueFinish); @@ -364,11 +362,12 @@ public class TsjThread implements Runnable { * 提升机下发任务完成 * * @param taskNo + * @param tsj */ - private void finishSend(Long taskNo) { + private void finishSend(Long taskNo, DeviceTsj tsj) { //根据任务号查询是否存在入库或者出库的正执行任务 TsjDeviceExecutionQueue tsjDeviceExecutionQueue = tsjDeviceExecutionQueueService.selectTsjDeviceExecutionQueueByRwh(taskNo); - if (ObjUtil.isNotNull(tsjDeviceExecutionQueue)) { + if (ObjUtil.isNotNull(tsjDeviceExecutionQueue) && !tsjDeviceExecutionQueue.getTarLayer().equals(tsj.getDqcs())) { tsjDeviceExecutionQueue.setSendFlag("1"); tsjDeviceExecutionQueue.setStartDate(DateUtil.formatDateTime(DateUtil.date())); tsjDeviceExecutionQueueService.updateTsjDeviceExecutionQueue(tsjDeviceExecutionQueue); diff --git a/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml b/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml index e7f0503..1cb55ca 100644 --- a/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml @@ -150,4 +150,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{cargoSpaceId} + + + + diff --git a/ruoyi-admin/src/main/resources/mapper/device/DeviceSrgvMapper.xml b/ruoyi-admin/src/main/resources/mapper/device/DeviceSrgvMapper.xml index d17fbeb..40e03f2 100644 --- a/ruoyi-admin/src/main/resources/mapper/device/DeviceSrgvMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/device/DeviceSrgvMapper.xml @@ -225,4 +225,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{guid} + + + update device_srgv set last_time =getdate() where agv_id=#{agvId} + diff --git a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml index dde4598..38c05cd 100644 --- a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml @@ -67,7 +67,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + insert into wcs_srgv_queue