现场调度修改
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -68,4 +68,6 @@ public interface DeviceCdzMapper
|
||||
* @return
|
||||
*/
|
||||
List<DeviceCdz> selectDeviceCdzHasSRgvList();
|
||||
|
||||
void updateDeviceCdzSpare(DeviceCdz deviceCdz);
|
||||
}
|
||||
|
||||
@@ -68,4 +68,6 @@ public interface IDeviceCdzService
|
||||
* @return
|
||||
*/
|
||||
List<DeviceCdz> selectDeviceCdzHasSRgvList();
|
||||
|
||||
void updateDeviceCdzSpare(DeviceCdz deviceCdz);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,4 +75,6 @@ public interface WcsSrgvQueueMapper
|
||||
String selectMinCountJob(@Param("list") List<String> outModelSSJ);
|
||||
|
||||
Integer selectTsj();
|
||||
|
||||
Integer selectByCaogoPlaceSite(String siteId);
|
||||
}
|
||||
|
||||
@@ -81,4 +81,6 @@ public interface IWcsSrgvQueueService
|
||||
String selectMinCountJob(List<String> outModelSSJ);
|
||||
|
||||
Integer selectTsj();
|
||||
|
||||
Integer selectByCaogoPlaceSite(String siteId);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -291,7 +291,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
FROM
|
||||
floor_group
|
||||
WHERE
|
||||
rn <= 2
|
||||
rn <= 1
|
||||
ORDER BY
|
||||
group_coding DESC;
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user