2026.2.9 小车避让
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -60,4 +60,8 @@ public interface IBasCargoSpaceService
|
||||
public int deleteBasCargoSpaceByCargoSpaceId(String cargoSpaceId);
|
||||
|
||||
BasCargoSpace selectBasCargoSpaceByWmsCargoSpaceId(String cargoSpaceId);
|
||||
|
||||
String selecGroupCodingBySite(String currSite);
|
||||
|
||||
String selectMaxSiteIdByNo(String groupCodingNo);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -142,7 +142,9 @@ public class RoadCacheServiceImpl implements RoadCacheService {
|
||||
//添加其他小车路径列表
|
||||
HashSet<String> 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)) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -58,4 +58,6 @@ public interface IDeviceSrgvService
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteDeviceSrgvByGuid(String guid);
|
||||
|
||||
int updateLastTimeByAgvId(String agvId);
|
||||
}
|
||||
|
||||
@@ -79,6 +79,11 @@ public class DeviceSrgvServiceImpl implements IDeviceSrgvService
|
||||
return deviceSrgvMapper.deleteDeviceSrgvByGuids(guids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int updateLastTimeByAgvId(String agvId) {
|
||||
return deviceSrgvMapper.updateLastTimeByAgvId(agvId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除四向小车设备表信息
|
||||
*
|
||||
|
||||
@@ -25,6 +25,11 @@ public interface WcsSrgvQueueMapper
|
||||
|
||||
public WcsSrgvQueue selectWcsSrgvQueueByAgvId(String agvId);
|
||||
|
||||
public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 查询四向小车任务队列列表
|
||||
|
||||
@@ -24,6 +24,8 @@ public interface IWcsSrgvQueueService
|
||||
|
||||
public WcsSrgvQueue selectWcsSrgvQueueByAgvId(String agvId);
|
||||
|
||||
public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -50,7 +50,10 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
|
||||
return wcsSrgvQueueMapper.selectWcsSrgvQueueByAgvId(agvId);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor) {
|
||||
return wcsSrgvQueueMapper.selectWcsSrgvQueueByFloor(theFloor);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询四向小车任务队列列表
|
||||
|
||||
@@ -79,6 +79,11 @@ public class PlcSrgvRead implements Runnable {
|
||||
if (read1.IsSuccess) {
|
||||
setValueByByte1(read1.Content, deviceSrgv);
|
||||
}
|
||||
//读取二段任务 小车是否接收完成1段作业
|
||||
OperateResultExOne<byte[]> read3 = modbusTcpNet.Read("1000", (short) 2);//2400-2414
|
||||
if (read3.IsSuccess) {
|
||||
setValueByByte3(read3.Content, deviceSrgv);
|
||||
}
|
||||
|
||||
//读取双字
|
||||
OperateResultExOne<byte[]> 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 注意双字反转
|
||||
|
||||
@@ -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<DeviceCdz> 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<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam);
|
||||
@@ -157,17 +167,25 @@ public class CdzThread implements Runnable {
|
||||
List<SrgvChargingJob> 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<DeviceCdz> 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<DeviceSrgv> 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<SrgvChargingJob> 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<SrgvChargingJob> 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<SrgvChargingJob> 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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<String> 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<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
|
||||
List<DeviceSrgv> 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<WcsSrgvMap> 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<DeviceSrgv> 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<String> roadSiteSet = arrByRoadSite.keySet().stream()
|
||||
.filter(Objects::nonNull) // 过滤集合中的null值
|
||||
.map(Object::toString) // 转为字符串,适配站点类型
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
// 2. Stream流式处理deviceSrgvMap
|
||||
Optional<Map.Entry<String, DeviceSrgv>> 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<WcsSrgvQueue> wcsSrgvQueueBRS = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueBR);
|
||||
if (endBlockDevice != null && wcsSrgvQueueBRS.isEmpty()) {
|
||||
// 选择当前层最近且可达的缓存点(避让点)
|
||||
WcsSrgvMap cacheParam = new WcsSrgvMap();
|
||||
cacheParam.setRemark("cache");
|
||||
cacheParam.setTheLayer(floor);
|
||||
List<WcsSrgvMap> 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<SendData2> 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<SendData2> 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<WcsSrgvQueue> 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<WcsSrgvQueue> 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<String> 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";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ public class SsjThread implements Runnable {
|
||||
}
|
||||
// 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段
|
||||
MydoJob mydoJob1 = new MydoJob();
|
||||
mydoJob1.setTrayCode(mydoJob.getTaskNo());
|
||||
mydoJob1.setTaskNo(mydoJob.getTaskNo());
|
||||
List<MydoJob> 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");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -150,4 +150,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
#{cargoSpaceId}
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<select id="selecGroupCodingBySite" parameterType="String" resultType="String">
|
||||
select group_coding_no from bas_cargo_space where cargo_space_logo =#{currSite}
|
||||
</select>
|
||||
|
||||
<select id="selectMaxSiteIdByNo" resultType="java.lang.String" parameterType="String">
|
||||
select top 1 cargo_space_logo from bas_cargo_space where group_coding_no =#{siteId} order by group_coding desc
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
@@ -225,4 +225,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
#{guid}
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<update id="updateLastTimeByAgvId" parameterType="String">
|
||||
update device_srgv set last_time =getdate() where agv_id=#{agvId}
|
||||
</update>
|
||||
</mapper>
|
||||
|
||||
@@ -67,7 +67,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<select id="selectMydoJobByTaskNo" parameterType="String" resultMap="MydoJobResult">
|
||||
<include refid="selectMydoJobVo"/>
|
||||
where task_no = #{taskNo}
|
||||
and execution_phase != '2'
|
||||
|
||||
</select>
|
||||
<select id="ddjTaskFinish" parameterType="java.util.Map" statementType="CALLABLE">
|
||||
{call proc_mydojob_finish(
|
||||
|
||||
@@ -81,7 +81,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="agvId != null">agv_id = #{agvId},</if>
|
||||
<if test="chargingId != null">charging_id = #{chargingId},</if>
|
||||
</trim>
|
||||
where guid = #{guid}
|
||||
where agv_id = #{agvId}
|
||||
</update>
|
||||
|
||||
<delete id="deleteSrgvChargingJobByGuid" parameterType="String">
|
||||
|
||||
@@ -83,6 +83,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
where agv_id = #{AgvId}
|
||||
</select>
|
||||
|
||||
<select id="selectWcsSrgvQueueByFloor" parameterType="String" resultMap="WcsSrgvQueueResult">
|
||||
<include refid="selectWcsSrgvQueueVo"/>
|
||||
where default07 =#{theFloor}
|
||||
</select>
|
||||
|
||||
<insert id="insertWcsSrgvQueue" parameterType="WcsSrgvQueue">
|
||||
insert into wcs_srgv_queue
|
||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||
|
||||
Reference in New Issue
Block a user