现场调度修改

This commit is contained in:
liuhanqing
2026-03-11 09:02:58 +08:00
parent 03e30d1db0
commit 9b008f5fe7
30 changed files with 533 additions and 270 deletions

View File

@@ -121,6 +121,10 @@ public interface IApiService
*/
public AjaxResult createInMydoJob(Map<String, Object> param);
public AjaxResult sendCargoSpace(Map<String, Object> param);
public AjaxResult selectMydoJobByNoTrayCode(Map<String, Object> param);
AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob);

View File

@@ -347,6 +347,20 @@ public class ApiServiceImpl implements IApiService {
}
@Override
public AjaxResult sendCargoSpace(Map<String, Object> param) {
// 访问请求路径,生成入库作业 ,如果生成返回信息
RequestLog requestLog = requestLogService.getRequestLog(SEND_CARGOSPACE, "请求分配货位", JSONUtil.toJsonStr(param));
if ("1".equals(requestLog.getIsSuccessful())) {
InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class);
return AjaxResult.success(bean.getData());
} else {
return AjaxResult.error();
}
}
@Override
public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) {
MydoJob mydoJob = new MydoJob();

View File

@@ -1,7 +1,9 @@
package com.ruoyi.bas.srgvmap.mapper;
import java.util.ArrayList;
import java.util.List;
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
import org.apache.ibatis.annotations.Param;
/**
* 小车点位地图表Mapper接口
@@ -62,4 +64,8 @@ public interface WcsSrgvMapMapper
* @return 结果
*/
public int deleteWcsSrgvMapByGuids(String[] guids);
List<WcsSrgvMap> selectNotInsite( @Param("cache") String cache,
@Param("floor") Integer floor,
@Param("sites") ArrayList<String> sites);
}

View File

@@ -1,5 +1,6 @@
package com.ruoyi.bas.srgvmap.service;
import java.util.ArrayList;
import java.util.List;
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
@@ -62,4 +63,6 @@ public interface IWcsSrgvMapService
* @return 结果
*/
public int deleteWcsSrgvMapByGuid(String guid);
List<WcsSrgvMap> selectNotInsite(String cache, Integer floor, ArrayList<String> sites);
}

View File

@@ -4,7 +4,6 @@ package com.ruoyi.bas.srgvmap.service;
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
import com.ruoyi.device.srgv.domain.DeviceSrgv;
import java.util.List;
import java.util.Map;
public interface RoadCacheService {
@@ -18,11 +17,13 @@ public interface RoadCacheService {
/**
* 处理地图
*
* @param arrByRoadSite
* @param deviceSrgv
* @param floor
* @return
*/
int[][] handleMap(Map<String, WcsSrgvMap> arrByRoadSite, DeviceSrgv deviceSrgv);
int[][] handleMap(Map<String, WcsSrgvMap> arrByRoadSite, DeviceSrgv deviceSrgv, Integer floor);
/**
* 根据x y z 获取指定位置的缓存
* @param x

View File

@@ -41,29 +41,27 @@ public class RoadCacheServiceImpl implements RoadCacheService {
for (WcsSrgvMap wcsSrgvMap : wcsSrgvMaps) {
maps.put(wcsSrgvMap.getSiteId(), wcsSrgvMap);
}
param.setAxy("11,9");
List<WcsSrgvMap> tsjMap = wcsSrgvMapMapper.selectWcsSrgvMapList(param);
for (WcsSrgvMap wcsSrgvMap : tsjMap) {
maps.put("tsj",wcsSrgvMap);
}
return maps;
}
@Override
public int[][] handleMap(Map<String, WcsSrgvMap> maps, DeviceSrgv deviceSrgv) {
public int[][] handleMap(Map<String, WcsSrgvMap> maps, DeviceSrgv deviceSrgv, Integer floor) {
//1.锁定其他车任务路径
lockedOtherCarQueuePath(maps, deviceSrgv);
//2.锁定无任务小车当前位置
lockedOtherCarCurrSite(maps, deviceSrgv);
// lockedOtherCarCurrSite(maps, deviceSrgv);
//3.锁定离线小车当前位置
lockedOfflineCarCurrSite(maps, deviceSrgv);
maps.put("tsj", maps.get("07050" + floor));
//4.锁定满货位的位置 TODO 是否存在移库影响效率
int[][] mapsInt = new int[50][50];
for (String site : maps.keySet()) {
WcsSrgvMap wcsSrgvMap = maps.get(site);
mapsInt[wcsSrgvMap.getX()][wcsSrgvMap.getY()] = wcsSrgvMap.getValue();
if (wcsSrgvMap.getAxy().equals("11,8")){
if (wcsSrgvMap.getAxy().equals("11,9")) {
System.err.println(wcsSrgvMap.getValue());
}
}
@@ -77,7 +75,7 @@ public class RoadCacheServiceImpl implements RoadCacheService {
param.setY(y);
param.setZ(z);
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapMapper.selectWcsSrgvMapList(param);
if (CollUtil.isNotEmpty(wcsSrgvMaps)){
if (CollUtil.isNotEmpty(wcsSrgvMaps)) {
return wcsSrgvMaps.get(0);
}
return null;
@@ -142,14 +140,14 @@ public class RoadCacheServiceImpl implements RoadCacheService {
//添加其他小车路径列表
HashSet<String> otherCarSiteList = new HashSet<>();
for (WcsSrgvQueue wcsSrgvQueue : otherCarQueue) {
if (wcsSrgvQueue.getPathInfo()!=null) {
if (wcsSrgvQueue.getPathInfo() != null) {
//根据小车当前点位去除已走路径
DeviceSrgv otherCarCurrStatus = deviceSrgvService.selectDeviceSrgvByGuid(wcsSrgvQueue.getAgvId());
String currSite = otherCarCurrStatus.getCurrSite();
List<String> allSiteList = Arrays.asList(wcsSrgvQueue.getPathInfo().split(","));
int i = allSiteList.indexOf(currSite);
if (i==-1){
i=0;
if (i == -1) {
i = 0;
}
List<String> resultSiteList = allSiteList.subList(i, allSiteList.size());
otherCarSiteList.addAll(resultSiteList);

View File

@@ -1,6 +1,8 @@
package com.ruoyi.bas.srgvmap.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.bas.srgvmap.mapper.WcsSrgvMapMapper;
@@ -9,25 +11,23 @@ import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService;
/**
* 小车点位地图表Service业务层处理
*
*
* @author ruoyi
* @date 2025-11-21
*/
@Service
public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
{
public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService {
@Autowired
private WcsSrgvMapMapper wcsSrgvMapMapper;
/**
* 查询小车点位地图表
*
*
* @param guid 小车点位地图表主键
* @return 小车点位地图表
*/
@Override
public WcsSrgvMap selectWcsSrgvMapByGuid(String guid)
{
public WcsSrgvMap selectWcsSrgvMapByGuid(String guid) {
return wcsSrgvMapMapper.selectWcsSrgvMapByGuid(guid);
}
@@ -38,61 +38,61 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
/**
* 查询小车点位地图表列表
*
*
* @param wcsSrgvMap 小车点位地图表
* @return 小车点位地图表
*/
@Override
public List<WcsSrgvMap> selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap)
{
public List<WcsSrgvMap> selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap) {
return wcsSrgvMapMapper.selectWcsSrgvMapList(wcsSrgvMap);
}
/**
* 新增小车点位地图表
*
*
* @param wcsSrgvMap 小车点位地图表
* @return 结果
*/
@Override
public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap)
{
public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap) {
return wcsSrgvMapMapper.insertWcsSrgvMap(wcsSrgvMap);
}
/**
* 修改小车点位地图表
*
*
* @param wcsSrgvMap 小车点位地图表
* @return 结果
*/
@Override
public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap)
{
public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap) {
return wcsSrgvMapMapper.updateWcsSrgvMap(wcsSrgvMap);
}
/**
* 批量删除小车点位地图表
*
*
* @param guids 需要删除的小车点位地图表主键
* @return 结果
*/
@Override
public int deleteWcsSrgvMapByGuids(String[] guids)
{
public int deleteWcsSrgvMapByGuids(String[] guids) {
return wcsSrgvMapMapper.deleteWcsSrgvMapByGuids(guids);
}
/**
* 删除小车点位地图表信息
*
*
* @param guid 小车点位地图表主键
* @return 结果
*/
@Override
public int deleteWcsSrgvMapByGuid(String guid)
{
public int deleteWcsSrgvMapByGuid(String guid) {
return wcsSrgvMapMapper.deleteWcsSrgvMapByGuid(guid);
}
@Override
public List<WcsSrgvMap> selectNotInsite(String cache, Integer floor, ArrayList<String> sites) {
return wcsSrgvMapMapper.selectNotInsite(cache, floor, sites);
}
}

View File

@@ -12,6 +12,7 @@ public class Constant {
public static final String CANCEL_TASK_URL = RCS_BASE_URL+"queryAgvStatus";;
public static final String GEN_AGV_SCHEDULING_TASK = RCS_BASE_URL+"genAgvSchedulingTask";;
public static final String CREATE_IN_MYDO_JOB_URL = WMS_BASE_URL+"requestEnterByTrayCode";
public static final String SEND_CARGOSPACE = WMS_BASE_URL+"sendCargoSpace";
public static final String REQUEST_MYDO_JOB_URL = WMS_BASE_URL+"requestByNoTrayCode";
public static final String RE_ASSIGN_URL = WMS_BASE_URL+"reAssign";
public static final String RE_MATERIAL_URL = WMS_BASE_URL+"reMaterial";

View File

@@ -68,4 +68,6 @@ public interface DeviceCdzMapper
* @return
*/
List<DeviceCdz> selectDeviceCdzHasSRgvList();
void updateDeviceCdzSpare(DeviceCdz deviceCdz);
}

View File

@@ -68,4 +68,6 @@ public interface IDeviceCdzService
* @return
*/
List<DeviceCdz> selectDeviceCdzHasSRgvList();
void updateDeviceCdzSpare(DeviceCdz deviceCdz);
}

View File

@@ -100,4 +100,9 @@ public class DeviceCdzServiceImpl implements IDeviceCdzService
public List<DeviceCdz> selectDeviceCdzHasSRgvList() {
return deviceCdzMapper.selectDeviceCdzHasSRgvList();
}
@Override
public void updateDeviceCdzSpare(DeviceCdz deviceCdz) {
deviceCdzMapper.updateDeviceCdzSpare(deviceCdz);
}
}

View File

@@ -75,4 +75,6 @@ public interface WcsSrgvQueueMapper
String selectMinCountJob(@Param("list") List<String> outModelSSJ);
Integer selectTsj();
Integer selectByCaogoPlaceSite(String siteId);
}

View File

@@ -81,4 +81,6 @@ public interface IWcsSrgvQueueService
String selectMinCountJob(List<String> outModelSSJ);
Integer selectTsj();
Integer selectByCaogoPlaceSite(String siteId);
}

View File

@@ -126,6 +126,11 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
return wcsSrgvQueueMapper.selectTsj();
}
@Override
public Integer selectByCaogoPlaceSite(String siteId) {
return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId);
}
@Override
public WcsSrgvQueue insertHistory(String taskNo) {
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo);

View File

@@ -177,7 +177,7 @@ public class ScheduleThread {
*/
public void startAllThread() {
plcSsjReadCustomThread.getThread().start();
//plcSrgvReadCustomThread1.getThread().start();
plcSrgvReadCustomThread1.getThread().start();
plcSrgvReadCustomThread2.getThread().start();
plcSrgvReadCustomThread3.getThread().start();
plcTsjReadCustomThread.getThread().start();

View File

@@ -67,12 +67,12 @@ public class PlcCdzRead implements Runnable {
}
private void plcRead(DeviceCdz deviceCdz) {
OperateResultExOne<byte[]> read2 = readWriteNet.Read(deviceCdz.getPlcDbReadAddress(), Short.parseShort("4"));
OperateResultExOne<byte[]> read2 = readWriteNet.Read(deviceCdz.getPlcDbReadAddress(), Short.parseShort("2"));
String ddsx1 = "0";
if (read2.IsSuccess) {
ddsx1 = SoftBasic.ByteToHexString(read2.Content);
deviceCdz.setStatus(ParseUtil.optInt(0, ddsx1));
deviceCdz.setModel(ParseUtil.optInt(2, ddsx1));
// deviceCdz.setModel(ParseUtil.optInt(2, ddsx1));
}
}

View File

@@ -110,6 +110,8 @@ public class PlcSrgvRead implements Runnable {
agvData.setAlarm(Convert.toInt(byteTransform.TransInt16(content, 6)));
// agvData.setStatus(0);
agvData.setStatus(Convert.toInt(byteTransform.TransInt16(content, 8)));
//载货标志
agvData.setCargoFlag(Convert.toInt(byteTransform.TransInt16(content, 13)));
//接收完成标志
// agvData.setFinish(Convert.toInt(byteTransform.TransInt16(content, 10)));
// agvData.setFinish(0);

View File

@@ -198,6 +198,7 @@ public class PathFinder {
if (gCost[endX][endY] == Integer.MAX_VALUE) {
List<int[]> path = new ArrayList<>();
path.add(new int[]{-1, -1});
return path;
}

View File

@@ -34,8 +34,8 @@ public class CdzThread implements Runnable {
public boolean isRun = true;
private final Integer LITTLE_BETTERY = 30;
private final Integer MIDDLE_BETTERY = 60;
private final Integer LITTLE_BETTERY = 40;
private final Integer MIDDLE_BETTERY = 70;
private final Integer MAX_BETTERY = 90;
private ISrgvChargingJobService chargingJobService;
private IDeviceCdzService deviceCdzService;
@@ -68,7 +68,7 @@ public class CdzThread implements Runnable {
void dispatch() {
Integer count = mydoJobService.selectMydoJobCount();
//获取低电量小车
List<DeviceSrgv> littleBatterySRgv = new ArrayList<>();
//获取中电量小车
@@ -78,7 +78,7 @@ public class CdzThread implements Runnable {
if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3 && deviceSrgv.getChargeFlag() != 2) {
if (deviceSrgv.getBattery() <= LITTLE_BETTERY) {
littleBatterySRgv.add(deviceSrgv);
} else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY) {
} else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY && count == 0) {
middleBatterySRgv.add(deviceSrgv);
}
}
@@ -96,22 +96,20 @@ public class CdzThread implements Runnable {
}
//超过30分钟自动生成充电任务
List<DeviceSrgv> deviceSrgvs = deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv());
List<DeviceSrgv> timeOutSrgvList = deviceSrgvs.stream().filter(x -> DateUtil.between(DateUtil.parse(x.getLastTime()), DateUtil.date(), DateUnit.MINUTE) > 30).collect(Collectors.toList());
if (CollUtil.isNotEmpty(timeOutSrgvList)) {
//生成充电任务
createChargingInJob(timeOutSrgvList);
}
// List<DeviceSrgv> deviceSrgvs = deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv());
// List<DeviceSrgv> timeOutSrgvList = deviceSrgvs.stream().filter(x -> DateUtil.between(DateUtil.parse(x.getLastTime()), DateUtil.date(), DateUnit.MINUTE) > 30).collect(Collectors.toList());
// if (CollUtil.isNotEmpty(timeOutSrgvList)) {
// //生成充电任务
// createChargingInJob(timeOutSrgvList);
// }
//充电任务下发
//充电任务下发 查到充电任务并且充电桩未开启直接开启
SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob();
srgvChargingJobParam.setChargingStatus("0");
srgvChargingJobParam.setJobType("1");
srgvChargingJobParam.setJobStatus("3");
List<SrgvChargingJob> srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam);
if (CollUtil.isNotEmpty(srgvChargingJobs)) {
for (SrgvChargingJob srgvChargingJob : srgvChargingJobs) {
if ("0".equals(srgvChargingJob.getChargingStatus())) {
String chargingSite = srgvChargingJob.getChargingSite();
@@ -122,67 +120,39 @@ public class CdzThread implements Runnable {
SendData qxSendData = new SendData(Tools.INT, 1);
byte[] bytes = Tools.sendData(qxSendData);
int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes);
// 查到充电任务,并且充电桩未开启就直接开启
if (i == 1) {
log.info("下发{" + deviceCdzs.get(0).getId() + "}号充电桩开启");
srgvChargingJob.setChargingStatus("2");
srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date()));
chargingJobService.updateSrgvChargingJob(srgvChargingJob);
}
}
}
}
//生成断电任务 有任务且电量大于50 todo 代码无效
Integer count = mydoJobService.selectMydoJobCount();
//生成断电任务 有任务且电量大于50
List<DeviceCdz> deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList();
for (DeviceCdz deviceCdz : deviceCdzdd) {
if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1())
&& ((PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getBattery() >= MIDDLE_BETTERY && count > 0) || PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getBattery() >= MAX_BETTERY)
&& PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getWorkMode() == 5
&& PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getChargeFlag() == 2 && deviceCdz.getStatus() == 1) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1());
if (((deviceSrgv.getBattery() >= MIDDLE_BETTERY && count > 0) || deviceSrgv.getBattery() >= MAX_BETTERY)
&& deviceSrgv.getWorkMode() == 5
&& deviceSrgv.getChargeFlag() == 2 && deviceCdz.getStatus() == 1) {
createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz);
}
}
// //生成断电任务 有任务且电量大于50 todo 代码无效
// WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue();
// wcsSrgvQueueParam.setIssued("0");
// List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam);
// if (CollUtil.isNotEmpty(wcsSrgvQueues)) {
// boolean existsKxSRgv = false;
// //判断有没有空闲小车
// for (DeviceSrgv x : PlcSrgvRead.deviceSrgvMap.values()) {
// if (x.getWorkMode() == 5 && x.getStatus() == 1) {
// existsKxSRgv = true;
// break;
// }
// }
// if (!existsKxSRgv) {
// List<DeviceCdz> deviceCdzs = deviceCdzService.selectDeviceCdzHasSRgvList();
// if (CollUtil.isNotEmpty(deviceCdzs)) {
// for (DeviceCdz deviceCdz : deviceCdzs) {
// if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1())) {
// DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1());
// if (deviceSrgv.getBattery() >= 50) {
// //生成断电任务
// createChargingOutJob(deviceSrgv, deviceCdz);
// break;
// }
// }
// }
// }
// }
// }
//断电任务下发
SrgvChargingJob srgvChargingJobDdParam = new SrgvChargingJob();
srgvChargingJobDdParam.setChargingStatus("0");
srgvChargingJobDdParam.setJobType("2");
List<SrgvChargingJob> srgvChargingJobDds = chargingJobService.selectSrgvChargingJobList(srgvChargingJobDdParam);
if (CollUtil.isNotEmpty(srgvChargingJobDds)) {
for (SrgvChargingJob srgvChargingJob : srgvChargingJobDds) {
if ("0".equals(srgvChargingJob.getChargingStatus())) {
String chargingSite = srgvChargingJob.getChargingSite();
@@ -194,6 +164,7 @@ public class CdzThread implements Runnable {
byte[] bytes = Tools.sendData(qxSendData);
int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes);
if (i == 1) {
log.info("下发{" + deviceCdzs.get(0).getId() + "}号充电桩关闭");
srgvChargingJob.setChargingStatus("1");
srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date()));
chargingJobService.updateSrgvChargingJob(srgvChargingJob);
@@ -201,14 +172,11 @@ public class CdzThread implements Runnable {
chargingJobService.insertHistory(srgvChargingJob.getGuid());
chargingJobService.deleteSrgvChargingJobByGuid(srgvChargingJob.getGuid());
deviceCdzs.get(0).setSpare1(null);
deviceCdzService.updateDeviceCdz(deviceCdzs.get(0));
deviceCdzService.updateDeviceCdzSpare(deviceCdzs.get(0));
}
}
}
}
}
/**
@@ -223,42 +191,43 @@ public class CdzThread implements Runnable {
wcsChargingJob.setAgvId(deviceSrgv.getDeviceId().toString());
List<SrgvChargingJob> srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(wcsChargingJob);
if (CollUtil.isEmpty(srgvChargingJobs)) {
List<DeviceCdz> cdzList = deviceCdzService.selectDeviceCdzListNoSRgvId();
if (CollUtil.isNotEmpty(cdzList)) {
//寻找最接近的充电桩
Integer floor = deviceSrgv.getCurrFloor();
DeviceCdz cdz = null;
Optional<DeviceCdz> min = cdzList.stream().min((o1, o2) -> {
Integer distance1 = Math.abs(o1.getSzcs());
Integer distance2 = Math.abs(o2.getSzcs());
return distance1 - distance2;
});
if (min.isPresent()) {
cdz = min.get();
}
if (ObjUtil.isNotNull(cdz)) {
//生成充电任务
SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob();
srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString());
srgvChargingJobParam.setChargingSite("08020" + cdz.getSzcs());
srgvChargingJobParam.setChargingId(cdz.getId().toString());
List<SrgvChargingJob> wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam);
if (CollUtil.isEmpty(wcsChargingJobs)) {
SrgvChargingJob scj = new SrgvChargingJob();
scj.setGuid(IdUtil.fastSimpleUUID());
scj.setChargingSite(cdz.getSiteId());
scj.setJobStatus("1");
scj.setChargingStatus("0");
scj.setStartDate(DateUtil.now());
scj.setJobType("1");//到充电桩
scj.setAgvId(deviceSrgv.getDeviceId().toString());
scj.setChargingId(cdz.getId().toString());
chargingJobService.insertSrgvChargingJob(scj);
cdz.setSpare1(deviceSrgv.getDeviceId().toString());
deviceCdzService.updateDeviceCdz(cdz);
}
DeviceCdz deviceCdz = deviceCdzService.selectDeviceCdzById(Long.valueOf(deviceSrgv.getDeviceId()));
// List<DeviceCdz> cdzList = deviceCdzService.selectDeviceCdzListNoSRgvId();
// if (CollUtil.isNotEmpty(deviceCdz)) {
//寻找最接近的充电桩
// Integer floor = deviceSrgv.getCurrFloor();
// DeviceCdz cdz = null;
// Optional<DeviceCdz> min = cdzList.stream().min((o1, o2) -> {
// Integer distance1 = Math.abs(o1.getSzcs());
// Integer distance2 = Math.abs(o2.getSzcs());
// return distance1 - distance2;
// });
// if (min.isPresent()) {
// cdz = min.get();
// }
if (ObjUtil.isNotNull(deviceCdz)) {
//生成充电任务
SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob();
srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString());
srgvChargingJobParam.setChargingSite("08020" + deviceCdz.getSzcs());
srgvChargingJobParam.setChargingId(deviceCdz.getId().toString());
List<SrgvChargingJob> wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam);
if (CollUtil.isEmpty(wcsChargingJobs)) {
SrgvChargingJob scj = new SrgvChargingJob();
scj.setGuid(IdUtil.fastSimpleUUID());
scj.setChargingSite(deviceCdz.getSiteId());
scj.setJobStatus("1");
scj.setChargingStatus("0");
scj.setStartDate(DateUtil.now());
scj.setJobType("1");//到充电桩
scj.setAgvId(deviceSrgv.getDeviceId().toString());
scj.setChargingId(deviceCdz.getId().toString());
chargingJobService.insertSrgvChargingJob(scj);
deviceCdz.setSpare1(deviceSrgv.getDeviceId().toString());
deviceCdzService.updateDeviceCdz(deviceCdz);
}
}
// }
}
}
}

View File

@@ -62,6 +62,7 @@ public class MonitoringThread implements Runnable {
for (String cdzCode : PlcCdzRead.deviceCdzMap.keySet()) {
DeviceCdz deviceCdz = PlcCdzRead.deviceCdzMap.get(cdzCode);
deviceCdz.setSpare1(null);
deviceCdz.setModel(deviceCdz.getStatus());
deviceCdzService.updateDeviceCdz(deviceCdz);
}
try {

View File

@@ -158,6 +158,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
param.setJobStatus("1");
param.setJobType("1");
param.setAgvId(deviceSrgv.getDeviceId().toString());
if (deviceSrgv != null && deviceSrgv.getWorkMode() != 5) {
return;
}
List<SrgvChargingJob> srgvChargingJobs = srgvChargingJobMapper.selectSrgvChargingJobList(param);
if (CollUtil.isNotEmpty(srgvChargingJobs)) {
SrgvChargingJob srgvChargingJob = srgvChargingJobs.get(0);
@@ -175,8 +179,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcsSrgvQueue.setCargo("0");
wcsSrgvQueue.setIssued("0");
wcsSrgvQueue.setExecutionStatus("1");
wcsSrgvQueue.setCargoPickSite("");
wcsSrgvQueue.setCargoPlaceSite("");
wcsSrgvQueue.setCargoPickSite(deviceSrgv.getCurrSite());
wcsSrgvQueue.setCargoPlaceSite(chargingSite);
wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite());
WcsSrgvMap wcsSrgvMap = wcsSrgvMapService.selectWcsSrgvMapBySiteId(chargingSite);
@@ -186,13 +190,17 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
} else {
wcsSrgvQueue.setEndSite("tsj");
wcsSrgvQueue.setDefault02("8");
// if (endSite.equals("tsj")){
Integer count = wcsSagvQueueMapper.selectTsj();
if (count > 0) {
return;
}
// }
}
// TODO 如果小车的当前点和小车的充电点位置一样,直接生成已经下发的队列 等着充电就可以
// if (deviceSrgv.getCurrSite().equals(chargingSite)) {
// wcsSrgvQueue.setIssued("1");
// wcsSrgvQueue.setExecutionStatus("3");
// }
wcsSrgvQueue.setTaskNo(String.valueOf(deviceSrgv.getDeviceId() + 500));
wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString());
wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
@@ -222,11 +230,6 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
* 生成出库小车队列
*/
private void createCarOutQueue() {
// MydoJob mydoJob = new MydoJob();
// mydoJob.setInOut("2");
// mydoJob.setExecutionPhase("0");
// mydoJob.setStatus("1");
// List<MydoJob> mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob);
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobOut();
@@ -263,24 +266,63 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
String cargoPickSite = wcsSrgvMaps.get(0).getSiteId();
//先找流程相等的小车
List<DeviceSrgv> currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList());
int z = 100000;
// int z = 100000;
// for (DeviceSrgv srgv : currentFloorCarList) {
// // 坐标截取和转换(保留你的原有逻辑)
// Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2));
// Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2));
// Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4));
// Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4));
//
// // 计算当前小车到取货点的曼哈顿距离 TODO 先算Y 再算X 如果Y相等再算X
//// int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY);
// int tempZ = Math.abs(startY - endY) != 0 ? Math.abs(startY - endY) : Math.abs(startX - endX);
//
// // 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车
// if (tempZ < z) {
// z = tempZ; // 把z更新为当前更小的距离
// deviceSrgv = srgv; // 记录这个更近的小车
// log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv);
// }
// }
int minYDistance = 100000; // 记录最小的Y轴距离
int minXDistance = 100000; // 记录最小的X轴距离
DeviceSrgv bestSrgv = null; // 最终选中的最优小车
for (DeviceSrgv srgv : currentFloorCarList) {
// 坐标截取和转换(保留你的原有逻辑)
// 坐标截取和转换(保留原有逻辑)
Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2));
Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2));
Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4));
Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4));
// 计算当前小车到取货点的曼哈顿距离
int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY);
// 1. 计算当前小车到目标点的Y轴、X轴绝对距离
int currentYDistance = Math.abs(startY - endY);
int currentXDistance = Math.abs(startX - endX);
// 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车
if (tempZ < z) {
z = tempZ; // 把z更新为当前更小的距离
deviceSrgv = srgv; // 记录这个更近的小车
log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv);
// 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序
if (currentYDistance < minYDistance) {
// 情况1:当前Y轴距离更小,直接更新最优解
minYDistance = currentYDistance;
minXDistance = currentXDistance;
bestSrgv = srgv;
log.info("楼层相等,找到更近小车(Y轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv);
} else if (currentYDistance == minYDistance) {
// 情况2:Y轴距离相同,比较X轴距离
if (currentXDistance < minXDistance) {
minXDistance = currentXDistance;
bestSrgv = srgv;
log.info("楼层相等,找到更近小车(X轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv);
}
}
}
// 最终选中的小车赋值给deviceSrgv(保持原有变量名兼容)
deviceSrgv = bestSrgv;
if (deviceSrgv == null) {
//如果未选择到小车,再找其他楼层的小车
for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
@@ -326,12 +368,12 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//终点是提升机
endSite = "tsj";
}
if (endSite.equals("tsj")) {
Integer count = wcsSagvQueueMapper.selectTsj();
if (count > 0) {
return;
}
}
// if (endSite.equals("tsj")) {
// Integer count = wcsSagvQueueMapper.selectTsj();
// if (count > 0) {
// return;
// }
// }
mydoJob1.setExitId(null);
WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap();
@@ -353,7 +395,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
ssj = "L1005";
}
Integer count = mydoJobService.selectExit(ssj);
if (count == 0) {
if (count >= 0 && count <= 1) {
mydoJob1.setExitId(ssj);
mydoJobService.updateMydoJob(mydoJob1);
outModelSSJ.add(s);
@@ -501,28 +543,44 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//取货地址
String cargoPickSite = wcsSrgvMaps.get(0).getSiteId();
//先找流程相等的小车
//先找层数相等的小车
List<DeviceSrgv> currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList());
int z = 100000;
int minYDistance = 100000; // 记录最小的Y轴距离
int minXDistance = 100000; // 记录最小的X轴距离
DeviceSrgv bestSrgv = null; // 最终选中的最优小车
for (DeviceSrgv srgv : currentFloorCarList) {
// 坐标截取和转换(保留你的原有逻辑)
// 坐标截取和转换(保留原有逻辑)
Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2));
Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2));
Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4));
Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4));
// 计算当前小车到取货点的曼哈顿距离
int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY);
// 1. 计算当前小车到目标点的Y轴、X轴绝对距离
int currentYDistance = Math.abs(startY - endY);
int currentXDistance = Math.abs(startX - endX);
// 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车
if (tempZ < z) {
z = tempZ; // 把z更新为当前更小的距离
deviceSrgv = srgv; // 记录这个更近的小车
log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv);
// 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序
if (currentYDistance < minYDistance) {
// 情况1:当前Y轴距离更小,直接更新最优解
minYDistance = currentYDistance;
minXDistance = currentXDistance;
bestSrgv = srgv;
log.info("楼层相等,找到更近小车(Y轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv);
} else if (currentYDistance == minYDistance) {
// 情况2:Y轴距离相同,比较X轴距离
if (currentXDistance < minXDistance) {
minXDistance = currentXDistance;
bestSrgv = srgv;
log.info("楼层相等,找到更近小车(X轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv);
}
}
}
// 最终选中的小车赋值给deviceSrgv(保持原有变量名兼容)
deviceSrgv = bestSrgv;
if (deviceSrgv == null) {
//如果未选择到小车,再找其他楼层的小车
//如果未选择到小车,找目标层小车
for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
@@ -534,6 +592,20 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
}
}
}
// // 如果目标层小车也没有 找其他层小车
// if (deviceSrgv==null){
// for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
// if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
// WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
// if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
// deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车
// log.info("楼层bu相等:{}", deviceSrgv);
//
// }
// }
// }
//
// }
if (deviceSrgv != null) {
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString());
@@ -560,28 +632,28 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
// 小车不在1楼
endSite = "tsj";
}
if (endSite.equals("tsj")) {
Integer count = wcsSagvQueueMapper.selectTsj();
if (count > 0) {
return;
}
}
// if (endSite.equals("tsj")) {
// Integer count = wcsSagvQueueMapper.selectTsj();
// if (count > 0) {
// return;
// }
// }
//筛选出deviceSrgvMap中deviceSrgv.getWorkMode() == 4并且deviceSrgv.getStatus() == 1并且deviceSrgv.getCurrSite() == cargoPickSite得对象,并排除掉其中deviceId与deviceSrgv.getDeviceId()相同的对象
List<DeviceSrgv> sameSiteDevices = deviceSrgvMap.values().stream()
.filter(d -> d.getWorkMode() == 5
&& d.getStatus() == 1
&& d.getCurrSite().equals(cargoPickSite))
.collect(Collectors.toList());
if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) {
WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap();
wcsSrgvMap3.setRemark("cache");
List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3);
for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) {
//deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象
//todo
// 如果当前有其他小车也要去入库点取货 TODO 判断的是如果当前车要去取货点,但是取货点有车的的情况
// List<DeviceSrgv> sameSiteDevices = deviceSrgvMap.values().stream()
// .filter(d -> d.getWorkMode() == 5
// && d.getStatus() == 1
// && d.getCurrSite().equals(cargoPickSite))
// .collect(Collectors.toList());
// 和当前小车不是一个 那么就生成一个去离母通道最近的点
// if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) {
// WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap();
// wcsSrgvMap3.setSiteId("07070"+sameSiteDevices.get(0).getCurrFloor());
// List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3);
// for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) {
//
// if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) {
// WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString());
// WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
@@ -611,9 +683,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
// return;
// }
// }
}
}
//
// }
// }
//生成小车取货队列
@@ -678,7 +750,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
sendMainTask(deviceSrgv, wcsSrgvQueue, currSite, endSite);
} else {
//小车不在起始点
sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, startSite);
// sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, startSite);
sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite);
}
}
}
@@ -693,32 +766,54 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
Integer floor = deviceSrgv.getCurrFloor();
//获取当前地图
Map<String, WcsSrgvMap> arrByRoadSite = roadCacheService.getArrByRoadSite(floor);
if ((wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2") || wcsSrgvQueue.getDefault02().equals("4")) && wcsSrgvQueue.getTheFloor().equals("1") && !wcsSrgvQueue.getEndSite().equals("tsj")) {
//如果是1层 锁定提升机站点
if (CollUtil.isNotEmpty(arrByRoadSite) && arrByRoadSite.values().iterator().next().getZ() == 1) {
if (arrByRoadSite.containsKey("080501")) {
arrByRoadSite.get("080501").setValue(0);
if (wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2")) {
// 出入库任务时,只要车不在提升机里面就锁定提升机的点位,设置成墙
if (CollUtil.isNotEmpty(arrByRoadSite) && !deviceSrgv.getCurrSite().equals("09050" + floor)) {
String siteId = "08050" + floor;
if (arrByRoadSite.containsKey(siteId)) {
arrByRoadSite.get(siteId).setValue(0);
}
}
}
// if (wcsSrgvQueue.getDefault02().equals("8")){
// endSite="07050"+deviceSrgv.getCurrFloor();
// }
//
// 移库任务直接锁定
if (wcsSrgvQueue.getDefault02().equals("7")) {
String siteId = "08050" + floor;
if (arrByRoadSite.containsKey(siteId)) {
arrByRoadSite.get(siteId).setValue(0);
}
}
// 如果是点到点的 并且小车不在提升机里面才锁提升机,在提升机里面不需要锁
if (wcsSrgvQueue.getDefault02().equals("4") && !deviceSrgv.getCurrSite().equals("09050" + floor)) {
if (CollUtil.isNotEmpty(arrByRoadSite)) {
String siteId = "08050" + floor;
if (arrByRoadSite.containsKey(siteId)) {
arrByRoadSite.get(siteId).setValue(0);
}
}
}
// 当前是换层任务,并且车的当前层和目标层不一样的时候把提升机锁住 如果是一样的时候,则直接解锁
if (wcsSrgvQueue.getDefault02().equals("8") && floor != Integer.parseInt(wcsSrgvQueue.getDefault07())) {
String siteId = "08050" + floor;
if (arrByRoadSite.containsKey(siteId)) {
arrByRoadSite.get(siteId).setValue(0);
}
}
//处理地图
int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv);
int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv, floor);
//计算最短路径
List<int[]> shortestPath = PathFinder.findShortestPath(emptyMap, arrByRoadSite.get(startSite).getX(), arrByRoadSite.get(startSite).getY(), arrByRoadSite.get(endSite).getX(), arrByRoadSite.get(endSite).getY());
// TODO 小车避让 目前只针对同层最多两台车 并且点位设置到了050201 判断地图中取的路径 不能直达说明有车阻挡 直接返回-1 用-1判断小车阻挡调离小车
if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1 && shortestPath.get(0)[1] == -1) {
shortestPath = null;
if (shortestPath.size() > 0) {
if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1) {
return false;
}
String endBlockAgv = null;
DeviceSrgv endBlockDevice = null;
if (arrByRoadSite != null && !arrByRoadSite.isEmpty()) {
// 将arrByRoadSite转为String类型的Set(统一类型,方便匹配)
Set<String> roadSiteSet = arrByRoadSite.keySet().stream()
@@ -727,18 +822,37 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
.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)
Optional<Map.Entry<String, DeviceSrgv>> targetEntry = Optional.empty();
for (int i = 0; i < shortestPath.size(); i++) {
int endx = shortestPath.get(i)[0];
int endy = shortestPath.get(i)[1];
WcsSrgvMap wcsSrgvMap = new WcsSrgvMap();
wcsSrgvMap.setX(endx);
wcsSrgvMap.setY(endy);
wcsSrgvMap.setZ(floor);
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap);
String siteId = wcsSrgvMaps.get(0).getSiteId();
targetEntry = PlcSrgvRead.deviceSrgvMap.entrySet().stream()
.filter(entry -> entry.getValue() != null) // 过滤other为null的条目
// 条件1:other的当前站点存在于roadSiteSet中
.filter(entry -> roadSiteSet.contains(entry.getValue().getCurrSite()))
.filter(entry -> siteId.equals(entry.getValue().getCurrSite()))
// 条件2:设备ID不等于当前entry的key
.filter(entry -> !Objects.equals(Convert.toStr(deviceSrgv.getDeviceId()), entry.getKey()))
.findFirst();
// 找到第一个符合条件的条目(等价于原代码的break)
if (targetEntry.isPresent()) {
break;
}
}
// 3. 处理结果(若找到则赋值)
if (targetEntry.isPresent()) {
endBlockAgv = targetEntry.get().getKey();
endBlockDevice = targetEntry.get().getValue();
shortestPath = null;
}
}
@@ -747,10 +861,18 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
List<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);
ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
List<DeviceSrgv> deviceSrgvs = deviceSrgvMap.values().stream()
.filter(d -> d.getWorkMode() == 5
&& d.getStatus() == 1
&& d.getCurrFloor().equals(floor))
.collect(Collectors.toList());
ArrayList<String> sites = new ArrayList<>();
for (int i = 0; i < deviceSrgvs.size(); i++) {
sites.add(deviceSrgvs.get(i).getCurrSite());
}
List<WcsSrgvMap> cacheMaps = wcsSrgvMapService.selectNotInsite("cache", floor, sites);
// List<WcsSrgvMap> cacheMaps = wcsSrgvMapService.selectWcsSrgvMapList(cacheParam);
// 生成阻挡车的避让任务(点到点,高优先级,未下发)
WcsSrgvQueue taskB = new WcsSrgvQueue();
taskB.setGuid(UUID.randomUUID().toString());
@@ -764,19 +886,34 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
taskB.setExecutionStatus("1");// 初始状态
taskB.setStartSite(endBlockDevice.getCurrSite());
taskB.setCargoPickSite(endBlockDevice.getCurrSite());
taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId());
taskB.setEndSite(cacheMaps.get(0).getSiteId());
if (cacheMaps.size() > 1) {
Integer count = wcsSagvQueueMapper.selectByCaogoPlaceSite(cacheMaps.get(0).getSiteId());
if (count > 0) {
taskB.setCargoPlaceSite(cacheMaps.get(1).getSiteId());
taskB.setEndSite(cacheMaps.get(1).getSiteId());
} else {
taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId());
taskB.setEndSite(cacheMaps.get(0).getSiteId());
}
}
if (cacheMaps.size() == 1) {
taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId());
taskB.setEndSite(cacheMaps.get(0).getSiteId());
}
taskB.setTheFloor(floor.toString());
// taskB.setDefault03(endBlockDevice.getCurrSite());
taskB.setDefault07(floor.toString());
// taskB.setDefault08("1");//避让任务,直接完成
taskB.setCreateDate(DateUtil.now());
wcsSagvQueueMapper.insertWcsSrgvQueue(taskB);
taskCache++;
log.info("目标点 {" + deviceSrgv.getCurrSite() + "} 被小车 {" + deviceSrgv.getDeviceId() + "} 占用,已调度其前往避让点 {}", endSite, endBlockAgv, "02050" + endBlockDevice.getCurrFloor());
// 当前车等待下一轮调度(待阻挡车移开后自然可达)
return false;
}
}
@@ -881,14 +1018,14 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
}
if (("tsj").equals(endSite)) {
if (wcsSrgvQueue.getDefault02().equals("8")) {
endSite = extractTarget(String.valueOf(pathBuilder));
} else {
// endSite = extractTarget(String.valueOf(pathBuilder));
endSite = "07050" + wcsSrgvQueue.getTheFloor();
}
if (wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2")) {
endSite = "09050" + wcsSrgvQueue.getTheFloor();
}
}
// if (("tsj").equals(startSite)) {
// endSite = "09050" + wcsSrgvQueue.getTheFloor();
// }
List<SendData2> sendDataList = null;
if (StrUtil.isEmpty(wcsSrgvQueue.getDefault08())) {
sendDataList = new ArrayList<>();
@@ -977,10 +1114,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
sendDataList.add(taskType);
}
// TODO 这段下发有问题
if (wcsSrgvQueue.getDefault08().equals("2") && deviceSrgv.getSpare5().equals("1")) {
if (wcsSrgvQueue.getDefault08().equals("2")
&& deviceSrgv.getSpare5().equals("1")
) {
sendDataList = new ArrayList<>();
SendData2 path = new SendData2();
path.setAddress("4404");//地址
@@ -1002,14 +1138,17 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcjs.setType(1);
sendDataList.add(wcjs);
//任务类型转换
//任务类型转换 //TODO 不行就改成7
SendData2 taskType = new SendData2();
taskType.setAddress("4402");
taskType.setData("7");
taskType.setData("9");
taskType.setType(1);
sendDataList.add(taskType);
}
if (sendDataList == null) {
sendDataList = new ArrayList<>();
}
//任务号、原、目标数据转换
String siteId = wcsSrgvQueue.getTaskNo();//+ "," + startSite + "," + endSite;
SendData2 site = new SendData2();
@@ -1226,7 +1365,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//处理换层逻辑
String site1 = "07050" + wcsSrgvQueue.getDefault07();
String site2 = "10050" + wcsSrgvQueue.getDefault07();
String site3 = "09050" + wcsSrgvQueue.getDefault07();
sites.add(site1);
sites.add(site3);
sites.add(site2);
}
if (Objects.equals(currSite, wcsSrgvQueue.getEndSite()) || (siteId != null && Objects.equals(currSite, siteId)) || sites.contains(currSite)) {
@@ -1256,17 +1397,12 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
// return;
}
//空车任务 且当前车的位置和取货位置相同
if ("1".equals(taskType)
&& (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite))
) {
if ("1".equals(taskType) && (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite))) {
String endSite = "";
String xfType = "";
// 换完层直接根据任务去接出入库任务
if (wcsSrgvQueue.getDefault02().equals("8")) {
//换层任务直接完成,等待后续入出库作业下发
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
return;
} else {
WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite);
WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite);
@@ -1281,12 +1417,12 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
endSite = "tsj";
}
// 如果终点是提升机需要判断是否有其他任务也是提升机的 这个时候先停一下
if (endSite.equals("tsj")) {
Integer count = wcsSagvQueueMapper.selectTsj();
if (count > 0) {
return;
}
}
// if (endSite.equals("tsj")) {
// Integer count = wcsSagvQueueMapper.selectTsj();
// if (count > 0) {
// return;
// }
// }
if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) {
xfType = "1";//入库
@@ -1333,6 +1469,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
case "2":
MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo()));
if (mydoJobOut != null && (cargoPlaceSite.equals(currSite))) {
log.info("1471 taskNo:[{}],currSite:[{}],cargoPlaceSite:[{}]",wcsSrgvQueue.getTaskNo(),currSite,cargoPlaceSite);
JobCallBack jobCallBack = new JobCallBack();
jobCallBack.setType(wcsSrgvQueue.getDefault02());
jobCallBack.setMydojobId(mydoJobOut.getJobId());
@@ -1365,8 +1502,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
// 充电任务
} else if ("3".equals(taskType)) {
// 充电任务 并且小车也是充电任务
} else if ("3".equals(taskType) && wcsSrgvQueue.getDefault02().equals("3")) {
//删除队列,插入历史表
wcsSrgvQueue.setExecutionStatus("4");
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
@@ -1412,9 +1549,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
String startSite = wcsSrgvQueue.getStartSite();
if (!startSite.equals(currSite)) {
wcsSrgvQueue.setIssued("1");
wcsSrgvQueue.setStartDate(DateUtil.now());
wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
// wcsSrgvQueue.setIssued("1");
// wcsSrgvQueue.setExecutionStatus("3");
// wcsSrgvQueue.setStartDate(DateUtil.now());
// wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
}
}
}

View File

@@ -124,17 +124,17 @@ public class SsjThread implements Runnable {
}
void inDispatch1(DeviceSsj deviceSsj) {
if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim()) ) {
if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) {
String trayCode = deviceSsj.getTrayCode().trim();
MydoJob getMydoJob = mydoJobService.selectMydoJobByTrayCode(trayCode);
if (getMydoJob!=null && deviceSsj.getTaskNo()<1000){
if (getMydoJob != null && deviceSsj.getTaskNo() < 1000) {
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), getMydoJob.getTaskNo(), 1, 1);
if (i == 1) {
getMydoJob.setStatus("3");
mydoJobService.updateMydoJob(getMydoJob);
log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", getMydoJob.getTaskNo());
}
}else {
} else {
//todo 查是否为入库模式,不是退回,是否超重
HashMap<String, Object> map = new HashMap<>();
map.put("trayCode", deviceSsj.getTrayCode());
@@ -183,11 +183,28 @@ public class SsjThread implements Runnable {
void inDispatch2(DeviceSsj deviceSsj) {
if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 1000) {
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo());
if (mydoJob != null) {
mydoJob.setExecutionPhase("2");
mydoJobService.updateMydoJob(mydoJob);
MydoJob mydoJob1 = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(deviceSsj.getTaskNo()));
if (mydoJob1.getCargoSpaceId() != null) {
return;
}
HashMap<String, Object> map = new HashMap<>();
map.put("taskNo", deviceSsj.getTaskNo());
//拉取
AjaxResult ajaxResult = apiService.sendCargoSpace(map);
if (ajaxResult.isSuccess()) {
MydoJob data = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class);
String cargoSpaceId = data.getCargoSpaceId();
String theFloor = data.getClassId();
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo());
if (mydoJob != null) {
mydoJob.setTheFloor(theFloor);
mydoJob.setCargoSpaceId(cargoSpaceId);
mydoJob.setExecutionPhase("2");
mydoJobService.updateMydoJob(mydoJob);
}
}
}
}
}

View File

@@ -8,6 +8,8 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.bas.port.service.IWcsPortService;
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService;
import com.ruoyi.common.domain.SendData;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.device.srgv.domain.DeviceSrgv;
@@ -35,13 +37,17 @@ public class TsjThread implements Runnable {
private ITsjDeviceExecutionQueueFinishService tsjDeviceExecutionQueueFinishService;
private IWcsPortService wcsPortService;
private IWcsSrgvQueueService wcsSrgvQueueService;
public IMydoJobService mydoJobService;
private IMydoJobService mydoJobService;
private IWcsSrgvMapService wcsSrgvMapService;
public void init() {
tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class);
tsjDeviceExecutionQueueFinishService = SpringUtils.getBean(ITsjDeviceExecutionQueueFinishService.class);
wcsPortService = SpringUtils.getBean(IWcsPortService.class);
wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class);
wcsSrgvMapService = SpringUtils.getBean(IWcsSrgvMapService.class);
}
@Override
@@ -76,7 +82,7 @@ public class TsjThread implements Runnable {
* 1、下发完成 如果设备状态为 2-工作 ,触发方式 2-自动,任务号大于999,则代表任务下发完成
*
* */
if (czfs == 2 && sbzt == 2 && rwh > 999) {
if (czfs == 2 && sbzt == 2 && rwh > 500) {
// finishSend(rwh, tsj);
}
@@ -84,11 +90,16 @@ public class TsjThread implements Runnable {
* 2、四向车任务生成 2-工作 ,触发方式 2-自动,任务号大于999
*
* */
if (czfs == 2 && sbzt == 2 && jdbz == 4 && rwh > 999) {
createSRgvQueue(rwh, tsj);
if (czfs == 2 && sbzt == 2 && jdbz == 4 && rwh > 500) {
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(String.valueOf(rwh));
String agvId = wcsSrgvQueue.getAgvId();
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(agvId);
if (deviceSrgv.getCurrSite().equals("09050" + tsj.getDqcs())) {
createSRgvQueue(rwh, tsj);
}
}
// 提升机取货中 说明对齐当前要取货层 开始给小车下发
if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 999) {
if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 500) {
createSRgvQueueTsjQd(rwh, tsj);
}
@@ -96,7 +107,7 @@ public class TsjThread implements Runnable {
* 2、任务完成
*
* */
if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 999) {
if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 500) {
//任务完成
finishTask(rwh, tsj);
}
@@ -117,7 +128,7 @@ public class TsjThread implements Runnable {
private void createSRgvQueueTsjQd(Long rwh, DeviceTsj tsj) {
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv);
if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) || deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor())) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 2 && tsj.getHczt() == 1) {
if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) || deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor())) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 1 && tsj.getHczt() == 1) {
SendData rwlxSendData = new SendData(Tools.INT, 1);
DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(Convert.toStr(1));
byte[] bytes = Tools.sendData(rwlxSendData);
@@ -146,11 +157,15 @@ public class TsjThread implements Runnable {
WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue();
sRgvQueueParam.setTaskNo(Convert.toStr(rwh));
sRgvQueueParam.setEndSite(Convert.toStr("tsj"));
sRgvQueueParam.setIssued("1");
sRgvQueueParam.setExecutionStatus("3");
List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(sRgvQueueParam);
if (CollUtil.isEmpty(wcsSrgvQueues)) {
return;
}
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.insertHistory(Convert.toStr(rwh));
String cargoPickSite = wcsSrgvQueue.getCargoPickSite();
String cargoPlaceSite = wcsSrgvQueue.getCargoPlaceSite();
//修改起点终点
if (ObjUtil.isNotEmpty(wcsSrgvQueue)) {
wcsSrgvQueue.setCreateDate(DateUtil.formatDateTime(DateUtil.date()));
@@ -174,7 +189,6 @@ public class TsjThread implements Runnable {
endSite = wcsSrgvQueue.getCargoPlaceSite();
break;
case "3":
//充电
break;
case "4":
//点到点
@@ -191,10 +205,44 @@ public class TsjThread implements Runnable {
log.info("任务类型错误");
}
break;
case "8":
//换层任务直接变成点到点任务
switch (wcsSrgvQueue.getTaskType()) {
case "1":
WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite);
WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite);
if (wcsSrgvMapq != null && wcsSrgvMapf != null) {
wcsSrgvQueue.setEndSite(cargoPickSite);
wcsSrgvQueue.setDefault02("4");
wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString());
wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString());
wcsSrgvQueue.setIssued("0");
wcsSrgvQueue.setExecutionStatus("1");
wcsSrgvQueue.setTaskType("1");
}
wcsSrgvQueue.setStartSite("09050" + tsj.getDqcs());
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
break;
case "3":
WcsSrgvMap wcsSrgvMapq1 = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite);
WcsSrgvMap wcsSrgvMapf1 = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite);
if (wcsSrgvMapq1 != null && wcsSrgvMapf1 != null) {
wcsSrgvQueue.setEndSite(cargoPlaceSite);
wcsSrgvQueue.setDefault02("3");
wcsSrgvQueue.setTheFloor(wcsSrgvMapq1.getTheLayer().toString());
wcsSrgvQueue.setDefault07(wcsSrgvMapf1.getTheLayer().toString());
wcsSrgvQueue.setIssued("0");
wcsSrgvQueue.setExecutionStatus("1");
wcsSrgvQueue.setTaskType("3");
}
wcsSrgvQueue.setStartSite("09050" + tsj.getDqcs());
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
break;
}
}
if (StrUtil.isNotEmpty(startSite) && StrUtil.isNotEmpty(endSite)) {
if (StrUtil.isNotEmpty(startSite) && StrUtil.isNotEmpty(endSite) && !wcsSrgvQueue.getDefault02().equals("8")) {
wcsSrgvQueue.setStartSite(startSite);
wcsSrgvQueue.setEndSite(endSite);
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);

View File

@@ -90,6 +90,9 @@ public class GetDeviceSrgvMap {
}
dto.setStatus(status);
dto.setLocation(d.getCurrSite() == null ? "" : d.getCurrSite());
dto.setRow(d.getCurrSite() == null ? "" : d.getCurrSite().substring(2,4));
dto.setColumn(d.getCurrSite() == null ? "" :d.getCurrSite().substring(0,2));
dto.setLayer(d.getCurrSite() == null ? "" : d.getCurrSite().substring(4,6));
dto.setAlarm(d.getAlarm() == null ? "" : String.valueOf(d.getAlarm()));
dto.setAlarmMsg(DictUtils.getDictLabel("srgv_alarm", d.getAlarm() == null ? "" : String.valueOf(d.getAlarm())));
if (d.getTaskNo() != null && d.getTaskNo() > 0) {
@@ -132,6 +135,9 @@ public class GetDeviceSrgvMap {
private String isThere;
private String status;
private String location;
private String row;
private String column;
private String layer;
private String alarm;
private String alarmMsg;
private String trayCode;

View File

@@ -99,8 +99,17 @@ public class GetDeviceSsjMap {
dto.setRotationDirection(calcRotationDirection(d.getTaskNo()));
dto.setAlarm(String.valueOf(d.getException()));
dto.setAlarmMsg(DictUtils.getDictLabel("ssj_ex", String.valueOf(d.getException())));
dto.setDW(String.valueOf(d.getDw()));
dto.setKX(String.valueOf(d.getKx()));
if (!dto.getTaskNo().equals("0")){
if (dto.getKX().equals("0")){
dto.setDW("1");
}else {
dto.setDW("0");
}
}else {
dto.setDW("0");
}
if (d.getTaskNo() > 0) {
try {
MydoJob job = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(d.getTaskNo()));
@@ -128,16 +137,10 @@ public class GetDeviceSsjMap {
*/
private String calcRotationDirection(int taskNo) {
try {
if (taskNo <= 0) return "0";
MydoJob job = mydoJobService.selectMydoJobByTaskNo((long) taskNo);
if (job == null || job.getInOrOut() == null) return "0";
int val;
try {
val = Integer.parseInt(job.getInOrOut());
} catch (NumberFormatException e) {
if (taskNo <= 0) {
return "0";
}
return val >= 20 ? "2" : "1";
return taskNo <= 50000 ? "1" : "2";
} catch (Exception e) {
return "0";
}

View File

@@ -80,7 +80,7 @@ public class GetDeviceTsjMap {
String code = entry.getKey();
DeviceTsj d = entry.getValue();
TsjDto dto = new TsjDto();
dto.setId(String.valueOf(d.getId()));
dto.setId("TW001");
dto.setLayer(d.getDqcs() == null ? "" : String.valueOf(d.getDqcs()));
dto.setTaskNo(d.getRwh() == null ? "" : String.valueOf(d.getRwh()));
dto.setZxjd(d.getJdbz() == null ? "" : String.valueOf(d.getJdbz()));

View File

@@ -161,4 +161,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{guid}
</foreach>
</delete>
<select id="selectNotInsite" resultMap="WcsSrgvMapResult">
SELECT
*
FROM
wcs_srgv_map
WHERE
remark = #{cache}
AND plc_layer = #{floor}
<if test="sites != null and sites.size() > 0">
AND site_id NOT IN
<foreach collection="sites" item="site" separator="," open="(" close=")">
#{site}
</foreach>
</if>
<if test="sites == null or sites.size() == 0">
AND 1=1
</if>
</select>
</mapper>

View File

@@ -123,4 +123,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</delete>
<update id="updateDeviceCdzSpare" parameterType="DeviceCdz">
update device_cdz set spare1=null where id=#{id}
</update>
</mapper>

View File

@@ -291,7 +291,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
FROM
floor_group
WHERE
rn &lt;= 2
rn &lt;= 1
ORDER BY
group_coding DESC;

View File

@@ -218,5 +218,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectByCaogoPlaceSite" resultType="java.lang.Integer" parameterType="string">
select count(1) from wcs_srgv_queue where cargo_place_site=#{siteId}
</select>
</mapper>