4 Commits

Author SHA1 Message Date
猫猫guowen
24fb696a67 数字孪生:修改输送机入库时到位信号为到位,出库时为空闲 2026-03-18 14:13:14 +08:00
liuhanqing
9b008f5fe7 现场调度修改 2026-03-11 09:02:58 +08:00
liuhanqing
03e30d1db0 现场调度修改 2026-03-02 08:40:01 +08:00
liuhanqing
9c6c32b7ed 现场调度修改 2026-02-26 09:46:54 +08:00
41 changed files with 1186 additions and 500 deletions

View File

@@ -10,11 +10,14 @@ import lombok.NoArgsConstructor;
public class ReceiveJob { public class ReceiveJob {
private String taskNo; private String taskNo;
private String cargoSpaceId; private String cargoSpaceId;
private String targetCargoSpaceId;
private String exitId; private String exitId;
private String trayCode; private String trayCode;
private String entranceId; private String entranceId;
private String inOrOut; private String inOrOut;
private String jobId; private String jobId;
private String roadwayId; private String roadwayId;
private String classId;
private Long priority;
} }

View File

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

View File

@@ -347,12 +347,27 @@ 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 @Override
public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) { public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) {
MydoJob mydoJob = new MydoJob(); MydoJob mydoJob = new MydoJob();
mydoJob.setJobId(receiveOutJob.getJobId()); mydoJob.setJobId(receiveOutJob.getJobId());
mydoJob.setTaskNo(receiveOutJob.getTaskNo()); mydoJob.setTaskNo(receiveOutJob.getTaskNo());
mydoJob.setCargoSpaceId(receiveOutJob.getCargoSpaceId()); mydoJob.setCargoSpaceId(receiveOutJob.getCargoSpaceId());
mydoJob.setTargetCargoSpaceId(receiveOutJob.getTargetCargoSpaceId());
mydoJob.setExitId(receiveOutJob.getExitId()); mydoJob.setExitId(receiveOutJob.getExitId());
mydoJob.setInOrOut(receiveOutJob.getInOrOut()); mydoJob.setInOrOut(receiveOutJob.getInOrOut());
mydoJob.setStatus("1"); mydoJob.setStatus("1");
@@ -360,6 +375,8 @@ public class ApiServiceImpl implements IApiService {
mydoJob.setRoadwayId(receiveOutJob.getRoadwayId()); mydoJob.setRoadwayId(receiveOutJob.getRoadwayId());
mydoJob.setCreateTime(DateUtils.getNowDate()); mydoJob.setCreateTime(DateUtils.getNowDate());
mydoJob.setExecutionPhase("0"); mydoJob.setExecutionPhase("0");
mydoJob.setTheFloor(receiveOutJob.getClassId());
mydoJob.setPriority(receiveOutJob.getPriority());
int i = mydoJobService.insertMydoJob(mydoJob); int i = mydoJobService.insertMydoJob(mydoJob);
if (i > 0) { if (i > 0) {
return AjaxResult.success(); return AjaxResult.success();

View File

@@ -1,7 +1,9 @@
package com.ruoyi.bas.srgvmap.mapper; package com.ruoyi.bas.srgvmap.mapper;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
import org.apache.ibatis.annotations.Param;
/** /**
* 小车点位地图表Mapper接口 * 小车点位地图表Mapper接口
@@ -62,4 +64,8 @@ public interface WcsSrgvMapMapper
* @return 结果 * @return 结果
*/ */
public int deleteWcsSrgvMapByGuids(String[] guids); 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; package com.ruoyi.bas.srgvmap.service;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
@@ -62,4 +63,6 @@ public interface IWcsSrgvMapService
* @return 结果 * @return 结果
*/ */
public int deleteWcsSrgvMapByGuid(String guid); 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.bas.srgvmap.domain.WcsSrgvMap;
import com.ruoyi.device.srgv.domain.DeviceSrgv; import com.ruoyi.device.srgv.domain.DeviceSrgv;
import java.util.List;
import java.util.Map; import java.util.Map;
public interface RoadCacheService { public interface RoadCacheService {
@@ -18,11 +17,13 @@ public interface RoadCacheService {
/** /**
* 处理地图 * 处理地图
*
* @param arrByRoadSite * @param arrByRoadSite
* @param deviceSrgv * @param deviceSrgv
* @param floor
* @return * @return
*/ */
int[][] handleMap(Map<String, WcsSrgvMap> arrByRoadSite, DeviceSrgv deviceSrgv); int[][] handleMap(Map<String, WcsSrgvMap> arrByRoadSite, DeviceSrgv deviceSrgv, Integer floor);
/** /**
* 根据x y z 获取指定位置的缓存 * 根据x y z 获取指定位置的缓存
* @param x * @param x

View File

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

View File

@@ -1,6 +1,8 @@
package com.ruoyi.bas.srgvmap.service.impl; package com.ruoyi.bas.srgvmap.service.impl;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.bas.srgvmap.mapper.WcsSrgvMapMapper; import com.ruoyi.bas.srgvmap.mapper.WcsSrgvMapMapper;
@@ -14,8 +16,7 @@ import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService;
* @date 2025-11-21 * @date 2025-11-21
*/ */
@Service @Service
public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService {
{
@Autowired @Autowired
private WcsSrgvMapMapper wcsSrgvMapMapper; private WcsSrgvMapMapper wcsSrgvMapMapper;
@@ -26,8 +27,7 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 小车点位地图表 * @return 小车点位地图表
*/ */
@Override @Override
public WcsSrgvMap selectWcsSrgvMapByGuid(String guid) public WcsSrgvMap selectWcsSrgvMapByGuid(String guid) {
{
return wcsSrgvMapMapper.selectWcsSrgvMapByGuid(guid); return wcsSrgvMapMapper.selectWcsSrgvMapByGuid(guid);
} }
@@ -43,8 +43,7 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 小车点位地图表 * @return 小车点位地图表
*/ */
@Override @Override
public List<WcsSrgvMap> selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap) public List<WcsSrgvMap> selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap) {
{
return wcsSrgvMapMapper.selectWcsSrgvMapList(wcsSrgvMap); return wcsSrgvMapMapper.selectWcsSrgvMapList(wcsSrgvMap);
} }
@@ -55,8 +54,7 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap) public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap) {
{
return wcsSrgvMapMapper.insertWcsSrgvMap(wcsSrgvMap); return wcsSrgvMapMapper.insertWcsSrgvMap(wcsSrgvMap);
} }
@@ -67,8 +65,7 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap) public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap) {
{
return wcsSrgvMapMapper.updateWcsSrgvMap(wcsSrgvMap); return wcsSrgvMapMapper.updateWcsSrgvMap(wcsSrgvMap);
} }
@@ -79,8 +76,7 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteWcsSrgvMapByGuids(String[] guids) public int deleteWcsSrgvMapByGuids(String[] guids) {
{
return wcsSrgvMapMapper.deleteWcsSrgvMapByGuids(guids); return wcsSrgvMapMapper.deleteWcsSrgvMapByGuids(guids);
} }
@@ -91,8 +87,12 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteWcsSrgvMapByGuid(String guid) public int deleteWcsSrgvMapByGuid(String guid) {
{
return wcsSrgvMapMapper.deleteWcsSrgvMapByGuid(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 CANCEL_TASK_URL = RCS_BASE_URL+"queryAgvStatus";;
public static final String GEN_AGV_SCHEDULING_TASK = RCS_BASE_URL+"genAgvSchedulingTask";; 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 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 REQUEST_MYDO_JOB_URL = WMS_BASE_URL+"requestByNoTrayCode";
public static final String RE_ASSIGN_URL = WMS_BASE_URL+"reAssign"; public static final String RE_ASSIGN_URL = WMS_BASE_URL+"reAssign";
public static final String RE_MATERIAL_URL = WMS_BASE_URL+"reMaterial"; public static final String RE_MATERIAL_URL = WMS_BASE_URL+"reMaterial";

View File

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

View File

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

View File

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

View File

@@ -94,4 +94,5 @@ public class MydoJob extends BaseEntity
private String productId; private String productId;
private String productName; private String productName;
private String classId;
} }

View File

@@ -81,4 +81,12 @@ public interface MydoJobMapper
List<MydoJob> selectMydoJobFinishList(MydoJob mydoJob); List<MydoJob> selectMydoJobFinishList(MydoJob mydoJob);
MydoJob selectRunningMydoJobByExitList(@Param("exitList") List<String> exitList); MydoJob selectRunningMydoJobByExitList(@Param("exitList") List<String> exitList);
List<MydoJob> selectMydoJobOut();
MydoJob selectMydoJobByTrayCode(String trayCode);
Integer selectExit(String ssj);
Integer selectMydoJobCount();
} }

View File

@@ -80,4 +80,12 @@ public interface IMydoJobService
MydoJob selectRunningMydoJobByExitList(List<String> strings); MydoJob selectRunningMydoJobByExitList(List<String> strings);
AjaxResult manualCallback(String jobId); AjaxResult manualCallback(String jobId);
List<MydoJob> selectMydoJobOut();
MydoJob selectMydoJobByTrayCode(String trayCode);
Integer selectExit(String ssj);
Integer selectMydoJobCount();
} }

View File

@@ -173,4 +173,24 @@ public class MydoJobServiceImpl implements IMydoJobService
} }
return AjaxResult.error("手动回调失败"); return AjaxResult.error("手动回调失败");
} }
@Override
public List<MydoJob> selectMydoJobOut() {
return mydoJobMapper.selectMydoJobOut();
}
@Override
public MydoJob selectMydoJobByTrayCode(String trayCode) {
return mydoJobMapper.selectMydoJobByTrayCode(trayCode);
}
@Override
public Integer selectExit(String ssj) {
return mydoJobMapper.selectExit(ssj);
}
@Override
public Integer selectMydoJobCount() {
return mydoJobMapper.selectMydoJobCount();
}
} }

View File

@@ -2,6 +2,7 @@ package com.ruoyi.queue.srgv.mapper;
import java.util.List; import java.util.List;
import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; import com.ruoyi.queue.srgv.domain.WcsSrgvQueue;
import org.apache.ibatis.annotations.Param;
/** /**
* 四向小车任务队列Mapper接口 * 四向小车任务队列Mapper接口
@@ -70,4 +71,10 @@ public interface WcsSrgvQueueMapper
* @return 结果 * @return 结果
*/ */
public int deleteWcsSrgvQueueByGuids(String[] guids); public int deleteWcsSrgvQueueByGuids(String[] guids);
String selectMinCountJob(@Param("list") List<String> outModelSSJ);
Integer selectTsj();
Integer selectByCaogoPlaceSite(String siteId);
} }

View File

@@ -77,4 +77,10 @@ public interface IWcsSrgvQueueService
* @param taskNo * @param taskNo
*/ */
public WcsSrgvQueue insertHistory(String taskNo); public WcsSrgvQueue insertHistory(String taskNo);
String selectMinCountJob(List<String> outModelSSJ);
Integer selectTsj();
Integer selectByCaogoPlaceSite(String siteId);
} }

View File

@@ -115,6 +115,22 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuid(guid); return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuid(guid);
} }
@Override
public String selectMinCountJob( List<String> outModelSSJ) {
return wcsSrgvQueueMapper.selectMinCountJob(outModelSSJ) ;
}
@Override
public Integer selectTsj() {
return wcsSrgvQueueMapper.selectTsj();
}
@Override
public Integer selectByCaogoPlaceSite(String siteId) {
return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId);
}
@Override @Override
public WcsSrgvQueue insertHistory(String taskNo) { public WcsSrgvQueue insertHistory(String taskNo) {
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo); WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo);

View File

@@ -65,4 +65,6 @@ public interface TsjDeviceExecutionQueueMapper
* @return 提升机执行队列 * @return 提升机执行队列
*/ */
TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo); TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo);
Integer selectCount();
} }

View File

@@ -64,4 +64,6 @@ public interface ITsjDeviceExecutionQueueService
* @return * @return
*/ */
TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo); TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo);
Integer selectCount();
} }

View File

@@ -104,5 +104,10 @@ public class TsjDeviceExecutionQueueServiceImpl implements ITsjDeviceExecutionQu
return tsjDeviceExecutionQueueMapper.selectTsjDeviceExecutionQueueByRwh(taskNo); return tsjDeviceExecutionQueueMapper.selectTsjDeviceExecutionQueueByRwh(taskNo);
} }
@Override
public Integer selectCount() {
return tsjDeviceExecutionQueueMapper.selectCount();
}
} }

View File

@@ -67,12 +67,12 @@ public class PlcCdzRead implements Runnable {
} }
private void plcRead(DeviceCdz deviceCdz) { 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"; String ddsx1 = "0";
if (read2.IsSuccess) { if (read2.IsSuccess) {
ddsx1 = SoftBasic.ByteToHexString(read2.Content); ddsx1 = SoftBasic.ByteToHexString(read2.Content);
deviceCdz.setStatus(ParseUtil.optInt(0, ddsx1)); deviceCdz.setStatus(ParseUtil.optInt(0, ddsx1));
deviceCdz.setModel(ParseUtil.optInt(2, ddsx1)); // deviceCdz.setModel(ParseUtil.optInt(2, ddsx1));
} }
} }

View File

@@ -90,6 +90,12 @@ public class PlcSrgvRead implements Runnable {
if (read2.IsSuccess) { if (read2.IsSuccess) {
setValueByByte2(read2.Content, deviceSrgv); setValueByByte2(read2.Content, deviceSrgv);
} }
// //读取双字,路径
OperateResultExOne<byte[]> read4 = modbusTcpNet.Read("6000", (short) 800);// 5000-5799 路径 400个
if (read4.IsSuccess) {
setValueByByte4(read4.Content, deviceSrgv);
}
} }
//单字 //单字
@@ -104,6 +110,8 @@ public class PlcSrgvRead implements Runnable {
agvData.setAlarm(Convert.toInt(byteTransform.TransInt16(content, 6))); agvData.setAlarm(Convert.toInt(byteTransform.TransInt16(content, 6)));
// agvData.setStatus(0); // agvData.setStatus(0);
agvData.setStatus(Convert.toInt(byteTransform.TransInt16(content, 8))); 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(Convert.toInt(byteTransform.TransInt16(content, 10)));
// agvData.setFinish(0); // agvData.setFinish(0);
@@ -150,6 +158,29 @@ public class PlcSrgvRead implements Runnable {
agvData.setCurrFloor(floor); agvData.setCurrFloor(floor);
} }
private void setValueByByte4(byte[] content, DeviceSrgv agvData) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < content.length; i += 4) {
// 检查剩余字节是否足够4个
if (i + 4 > content.length) break;
// TODO 注意双字反转
int value = byteTransform.TransInt32(content, i);
// 如果值为0,终止循环
if (value == 0) {
break;
}
sb.append(String.format("%06d", value)).append(","); // 用逗号分隔每个int值
}
// 移除最后多余的 ","
if (sb.length() > 0) {
sb.setLength(sb.length() - 1);
}
agvData.setPath(sb.toString());
}
public void ConnectServer() { public void ConnectServer() {
modbusTcpNet = new ModbusTcpNet();//创建一个Modbus对象 modbusTcpNet = new ModbusTcpNet();//创建一个Modbus对象
log.info("创建连接对象,IP{}", this.ip); log.info("创建连接对象,IP{}", this.ip);

View File

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

View File

@@ -99,6 +99,7 @@ public class PlcSsjRead implements Runnable {
ssjDevice.setKx(ParseUtil.optInt(4, ddsx1)); ssjDevice.setKx(ParseUtil.optInt(4, ddsx1));
ssjDevice.setDw(ParseUtil.optInt(6, ddsx1)); ssjDevice.setDw(ParseUtil.optInt(6, ddsx1));
ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1)); ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1));
ssjDevice.setModel(ParseUtil.optInt(8, ddsx1));//出入库模式 1入 2出
} }
} }

View File

@@ -13,6 +13,8 @@ import com.ruoyi.device.srgv.domain.DeviceSrgv;
import com.ruoyi.device.srgv.service.IDeviceSrgvService; import com.ruoyi.device.srgv.service.IDeviceSrgvService;
import com.ruoyi.job.charg.domain.SrgvChargingJob; import com.ruoyi.job.charg.domain.SrgvChargingJob;
import com.ruoyi.job.charg.service.ISrgvChargingJobService; import com.ruoyi.job.charg.service.ISrgvChargingJobService;
import com.ruoyi.job.mapper.MydoJobMapper;
import com.ruoyi.job.service.IMydoJobService;
import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; import com.ruoyi.queue.srgv.domain.WcsSrgvQueue;
import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService;
import com.ruoyi.schedule.plcRead.cdz.PlcCdzRead; import com.ruoyi.schedule.plcRead.cdz.PlcCdzRead;
@@ -32,19 +34,21 @@ public class CdzThread implements Runnable {
public boolean isRun = true; public boolean isRun = true;
private final Integer LITTLE_BETTERY = 30; private final Integer LITTLE_BETTERY = 40;
private final Integer MIDDLE_BETTERY = 70; private final Integer MIDDLE_BETTERY = 70;
private final Integer MAX_BETTERY = 90;
private ISrgvChargingJobService chargingJobService; private ISrgvChargingJobService chargingJobService;
private IDeviceCdzService deviceCdzService; private IDeviceCdzService deviceCdzService;
private IDeviceSrgvService deviceSrgvService; private IDeviceSrgvService deviceSrgvService;
private IWcsSrgvQueueService wcsSrgvQueueService; private IWcsSrgvQueueService wcsSrgvQueueService;
public IMydoJobService mydoJobService;
public void init() { public void init() {
chargingJobService = SpringUtils.getBean(ISrgvChargingJobService.class); chargingJobService = SpringUtils.getBean(ISrgvChargingJobService.class);
deviceCdzService = SpringUtils.getBean(IDeviceCdzService.class); deviceCdzService = SpringUtils.getBean(IDeviceCdzService.class);
deviceSrgvService = SpringUtils.getBean(IDeviceSrgvService.class); deviceSrgvService = SpringUtils.getBean(IDeviceSrgvService.class);
wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class);
mydoJobService = SpringUtils.getBean(IMydoJobService.class);
} }
@Override @Override
@@ -64,17 +68,17 @@ public class CdzThread implements Runnable {
void dispatch() { void dispatch() {
Integer count = mydoJobService.selectMydoJobCount();
//获取低电量小车 //获取低电量小车
List<DeviceSrgv> littleBatterySRgv = new ArrayList<>(); List<DeviceSrgv> littleBatterySRgv = new ArrayList<>();
//获取中电量小车 //获取中电量小车
List<DeviceSrgv> middleBatterySRgv = new ArrayList<>(); List<DeviceSrgv> middleBatterySRgv = new ArrayList<>();
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv);
if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3) { if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3 && deviceSrgv.getChargeFlag() != 2) {
if (deviceSrgv.getBattery() <= LITTLE_BETTERY) { if (deviceSrgv.getBattery() <= LITTLE_BETTERY) {
littleBatterySRgv.add(deviceSrgv); littleBatterySRgv.add(deviceSrgv);
} else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY) { } else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY && count == 0) {
middleBatterySRgv.add(deviceSrgv); middleBatterySRgv.add(deviceSrgv);
} }
} }
@@ -92,22 +96,20 @@ public class CdzThread implements Runnable {
} }
//超过30分钟自动生成充电任务 //超过30分钟自动生成充电任务
List<DeviceSrgv> deviceSrgvs = deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv()); // 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()); // 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)) { // if (CollUtil.isNotEmpty(timeOutSrgvList)) {
//生成充电任务 // //生成充电任务
createChargingInJob(timeOutSrgvList); // createChargingInJob(timeOutSrgvList);
} // }
//充电任务下发 //充电任务下发 查到充电任务并且充电桩未开启直接开启
SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob();
srgvChargingJobParam.setChargingStatus("0"); srgvChargingJobParam.setChargingStatus("0");
srgvChargingJobParam.setJobType("1"); srgvChargingJobParam.setJobType("1");
srgvChargingJobParam.setJobStatus("3");
List<SrgvChargingJob> srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); List<SrgvChargingJob> srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam);
if (CollUtil.isNotEmpty(srgvChargingJobs)) { if (CollUtil.isNotEmpty(srgvChargingJobs)) {
for (SrgvChargingJob srgvChargingJob : srgvChargingJobs) { for (SrgvChargingJob srgvChargingJob : srgvChargingJobs) {
if ("0".equals(srgvChargingJob.getChargingStatus())) { if ("0".equals(srgvChargingJob.getChargingStatus())) {
String chargingSite = srgvChargingJob.getChargingSite(); String chargingSite = srgvChargingJob.getChargingSite();
@@ -118,44 +120,29 @@ public class CdzThread implements Runnable {
SendData qxSendData = new SendData(Tools.INT, 1); SendData qxSendData = new SendData(Tools.INT, 1);
byte[] bytes = Tools.sendData(qxSendData); byte[] bytes = Tools.sendData(qxSendData);
int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes); int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes);
// 查到充电任务,并且充电桩未开启就直接开启
if (i == 1) { if (i == 1) {
log.info("下发{" + deviceCdzs.get(0).getId() + "}号充电桩开启");
srgvChargingJob.setChargingStatus("2"); srgvChargingJob.setChargingStatus("2");
srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date())); srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date()));
chargingJobService.updateSrgvChargingJob(srgvChargingJob); chargingJobService.updateSrgvChargingJob(srgvChargingJob);
} }
} }
} }
} }
//生成断电任务 有任务且电量大于50
//生成断电任务 有任务且电量大于50 todo 代码无效 List<DeviceCdz> deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList();
WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); for (DeviceCdz deviceCdz : deviceCdzdd) {
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()); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1());
if (deviceSrgv.getBattery() >= 50) { if (((deviceSrgv.getBattery() >= MIDDLE_BETTERY && count > 0) || deviceSrgv.getBattery() >= MAX_BETTERY)
//生成断电任务 && deviceSrgv.getWorkMode() == 5
createChargingOutJob(deviceSrgv, deviceCdz); && deviceSrgv.getChargeFlag() == 2 && deviceCdz.getStatus() == 1) {
break; createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz);
}
}
}
}
} }
} }
@@ -166,7 +153,6 @@ public class CdzThread implements Runnable {
srgvChargingJobDdParam.setJobType("2"); srgvChargingJobDdParam.setJobType("2");
List<SrgvChargingJob> srgvChargingJobDds = chargingJobService.selectSrgvChargingJobList(srgvChargingJobDdParam); List<SrgvChargingJob> srgvChargingJobDds = chargingJobService.selectSrgvChargingJobList(srgvChargingJobDdParam);
if (CollUtil.isNotEmpty(srgvChargingJobDds)) { if (CollUtil.isNotEmpty(srgvChargingJobDds)) {
for (SrgvChargingJob srgvChargingJob : srgvChargingJobDds) { for (SrgvChargingJob srgvChargingJob : srgvChargingJobDds) {
if ("0".equals(srgvChargingJob.getChargingStatus())) { if ("0".equals(srgvChargingJob.getChargingStatus())) {
String chargingSite = srgvChargingJob.getChargingSite(); String chargingSite = srgvChargingJob.getChargingSite();
@@ -178,6 +164,7 @@ public class CdzThread implements Runnable {
byte[] bytes = Tools.sendData(qxSendData); byte[] bytes = Tools.sendData(qxSendData);
int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes); int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes);
if (i == 1) { if (i == 1) {
log.info("下发{" + deviceCdzs.get(0).getId() + "}号充电桩关闭");
srgvChargingJob.setChargingStatus("1"); srgvChargingJob.setChargingStatus("1");
srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date())); srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date()));
chargingJobService.updateSrgvChargingJob(srgvChargingJob); chargingJobService.updateSrgvChargingJob(srgvChargingJob);
@@ -185,14 +172,11 @@ public class CdzThread implements Runnable {
chargingJobService.insertHistory(srgvChargingJob.getGuid()); chargingJobService.insertHistory(srgvChargingJob.getGuid());
chargingJobService.deleteSrgvChargingJobByGuid(srgvChargingJob.getGuid()); chargingJobService.deleteSrgvChargingJobByGuid(srgvChargingJob.getGuid());
deviceCdzs.get(0).setSpare1(null); deviceCdzs.get(0).setSpare1(null);
deviceCdzService.updateDeviceCdz(deviceCdzs.get(0)); deviceCdzService.updateDeviceCdzSpare(deviceCdzs.get(0));
} }
} }
} }
} }
} }
/** /**
@@ -207,42 +191,43 @@ public class CdzThread implements Runnable {
wcsChargingJob.setAgvId(deviceSrgv.getDeviceId().toString()); wcsChargingJob.setAgvId(deviceSrgv.getDeviceId().toString());
List<SrgvChargingJob> srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(wcsChargingJob); List<SrgvChargingJob> srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(wcsChargingJob);
if (CollUtil.isEmpty(srgvChargingJobs)) { if (CollUtil.isEmpty(srgvChargingJobs)) {
List<DeviceCdz> cdzList = deviceCdzService.selectDeviceCdzListNoSRgvId(); DeviceCdz deviceCdz = deviceCdzService.selectDeviceCdzById(Long.valueOf(deviceSrgv.getDeviceId()));
if (CollUtil.isNotEmpty(cdzList)) { // List<DeviceCdz> cdzList = deviceCdzService.selectDeviceCdzListNoSRgvId();
// if (CollUtil.isNotEmpty(deviceCdz)) {
//寻找最接近的充电桩 //寻找最接近的充电桩
Integer floor = deviceSrgv.getCurrFloor(); // Integer floor = deviceSrgv.getCurrFloor();
DeviceCdz cdz = null; // DeviceCdz cdz = null;
Optional<DeviceCdz> min = cdzList.stream().filter(c -> c.getSzcs().equals(floor)).min((o1, o2) -> { // Optional<DeviceCdz> min = cdzList.stream().min((o1, o2) -> {
Integer distance1 = Math.abs(o1.getSzcs()); // Integer distance1 = Math.abs(o1.getSzcs());
Integer distance2 = Math.abs(o2.getSzcs()); // Integer distance2 = Math.abs(o2.getSzcs());
return distance1 - distance2; // return distance1 - distance2;
}); // });
if (min.isPresent()) { // if (min.isPresent()) {
cdz = min.get(); // cdz = min.get();
} // }
if (ObjUtil.isNotNull(cdz)) { if (ObjUtil.isNotNull(deviceCdz)) {
//生成充电任务 //生成充电任务
SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob();
srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString()); srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString());
srgvChargingJobParam.setChargingSite("08020" + cdz.getSzcs()); srgvChargingJobParam.setChargingSite("08020" + deviceCdz.getSzcs());
srgvChargingJobParam.setChargingId(cdz.getId().toString()); srgvChargingJobParam.setChargingId(deviceCdz.getId().toString());
List<SrgvChargingJob> wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); List<SrgvChargingJob> wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam);
if (CollUtil.isEmpty(wcsChargingJobs)) { if (CollUtil.isEmpty(wcsChargingJobs)) {
SrgvChargingJob scj = new SrgvChargingJob(); SrgvChargingJob scj = new SrgvChargingJob();
scj.setGuid(IdUtil.fastSimpleUUID()); scj.setGuid(IdUtil.fastSimpleUUID());
scj.setChargingSite(cdz.getSiteId()); scj.setChargingSite(deviceCdz.getSiteId());
scj.setJobStatus("1"); scj.setJobStatus("1");
scj.setChargingStatus("0"); scj.setChargingStatus("0");
scj.setStartDate(DateUtil.now()); scj.setStartDate(DateUtil.now());
scj.setJobType("1");//到充电桩 scj.setJobType("1");//到充电桩
scj.setAgvId(deviceSrgv.getDeviceId().toString()); scj.setAgvId(deviceSrgv.getDeviceId().toString());
scj.setChargingId(cdz.getId().toString()); scj.setChargingId(deviceCdz.getId().toString());
chargingJobService.insertSrgvChargingJob(scj); chargingJobService.insertSrgvChargingJob(scj);
cdz.setSpare1(deviceSrgv.getDeviceId().toString()); deviceCdz.setSpare1(deviceSrgv.getDeviceId().toString());
deviceCdzService.updateDeviceCdz(cdz); deviceCdzService.updateDeviceCdz(deviceCdz);
}
} }
} }
// }
} }
} }
} }
@@ -265,7 +250,7 @@ public class CdzThread implements Runnable {
srgvChargingJobParamOut.setJobType("2"); srgvChargingJobParamOut.setJobType("2");
List<SrgvChargingJob> srgvChargingJobOut = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParamOut); List<SrgvChargingJob> srgvChargingJobOut = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParamOut);
if (CollUtil.isNotEmpty(srgvChargingJobs)&&CollUtil.isEmpty(srgvChargingJobOut)) { if (CollUtil.isNotEmpty(srgvChargingJobs) && CollUtil.isEmpty(srgvChargingJobOut)) {
SrgvChargingJob scj = srgvChargingJobs.get(0); SrgvChargingJob scj = srgvChargingJobs.get(0);
//插入历史 //插入历史

View File

@@ -51,14 +51,18 @@ public class MonitoringThread implements Runnable {
} }
for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(srgvCode); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(srgvCode);
if (!deviceSrgv.getCurrSite().equals("000000")){
deviceSrgvService.updateDeviceSrgv(deviceSrgv); deviceSrgvService.updateDeviceSrgv(deviceSrgv);
} }
}
for (String tsjCode : PlcTsjRead.deviceTsjMap.keySet()) { for (String tsjCode : PlcTsjRead.deviceTsjMap.keySet()) {
DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(tsjCode); DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(tsjCode);
deviceTsjService.updateDeviceTsj(deviceTsj); deviceTsjService.updateDeviceTsj(deviceTsj);
} }
for (String cdzCode : PlcCdzRead.deviceCdzMap.keySet()) { for (String cdzCode : PlcCdzRead.deviceCdzMap.keySet()) {
DeviceCdz deviceCdz = PlcCdzRead.deviceCdzMap.get(cdzCode); DeviceCdz deviceCdz = PlcCdzRead.deviceCdzMap.get(cdzCode);
deviceCdz.setSpare1(null);
deviceCdz.setModel(deviceCdz.getStatus());
deviceCdzService.updateDeviceCdz(deviceCdz); deviceCdzService.updateDeviceCdz(deviceCdz);
} }
try { try {

View File

@@ -18,6 +18,7 @@ import com.ruoyi.common.domain.SendData2;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.device.srgv.domain.DeviceSrgv; import com.ruoyi.device.srgv.domain.DeviceSrgv;
import com.ruoyi.device.srgv.service.IDeviceSrgvService; import com.ruoyi.device.srgv.service.IDeviceSrgvService;
import com.ruoyi.device.ssj.domain.DeviceSsj;
import com.ruoyi.job.charg.domain.SrgvChargingJob; import com.ruoyi.job.charg.domain.SrgvChargingJob;
import com.ruoyi.job.charg.service.ISrgvChargingJobService; import com.ruoyi.job.charg.service.ISrgvChargingJobService;
import com.ruoyi.job.domain.JobCallBack; import com.ruoyi.job.domain.JobCallBack;
@@ -30,8 +31,11 @@ import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService;
import com.ruoyi.schedule.ScheduleThread; import com.ruoyi.schedule.ScheduleThread;
import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead; import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead;
import com.ruoyi.schedule.plcRead.srgv.roadUtil.PathFinder; import com.ruoyi.schedule.plcRead.srgv.roadUtil.PathFinder;
import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.sql.Struct;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@@ -65,7 +69,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
private IBasCargoSpaceService basCargoSpaceService; private IBasCargoSpaceService basCargoSpaceService;
public IDeviceSrgvService deviceSrgvService; public IDeviceSrgvService deviceSrgvService;
private int taskCache = 450001; private int taskCache = 30001;
public void init() { public void init() {
sRgvCodeList = new HashMap<>(); sRgvCodeList = new HashMap<>();
@@ -109,7 +113,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
createCarInQueue(); createCarInQueue();
// 出库队列 // 出库队列
createCarOutQueue(); createCarOutQueue();
// 充电任务 // 充电任务队列
inCharging(deviceSrgv); inCharging(deviceSrgv);
// 充电完成调离 // 充电完成调离
// outCharging(deviceSrgv); // outCharging(deviceSrgv);
@@ -154,6 +158,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
param.setJobStatus("1"); param.setJobStatus("1");
param.setJobType("1"); param.setJobType("1");
param.setAgvId(deviceSrgv.getDeviceId().toString()); param.setAgvId(deviceSrgv.getDeviceId().toString());
if (deviceSrgv != null && deviceSrgv.getWorkMode() != 5) {
return;
}
List<SrgvChargingJob> srgvChargingJobs = srgvChargingJobMapper.selectSrgvChargingJobList(param); List<SrgvChargingJob> srgvChargingJobs = srgvChargingJobMapper.selectSrgvChargingJobList(param);
if (CollUtil.isNotEmpty(srgvChargingJobs)) { if (CollUtil.isNotEmpty(srgvChargingJobs)) {
SrgvChargingJob srgvChargingJob = srgvChargingJobs.get(0); SrgvChargingJob srgvChargingJob = srgvChargingJobs.get(0);
@@ -171,8 +179,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcsSrgvQueue.setCargo("0"); wcsSrgvQueue.setCargo("0");
wcsSrgvQueue.setIssued("0"); wcsSrgvQueue.setIssued("0");
wcsSrgvQueue.setExecutionStatus("1"); wcsSrgvQueue.setExecutionStatus("1");
wcsSrgvQueue.setCargoPickSite(""); wcsSrgvQueue.setCargoPickSite(deviceSrgv.getCurrSite());
wcsSrgvQueue.setCargoPlaceSite(""); wcsSrgvQueue.setCargoPlaceSite(chargingSite);
wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite());
WcsSrgvMap wcsSrgvMap = wcsSrgvMapService.selectWcsSrgvMapBySiteId(chargingSite); WcsSrgvMap wcsSrgvMap = wcsSrgvMapService.selectWcsSrgvMapBySiteId(chargingSite);
@@ -182,8 +190,18 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
} else { } else {
wcsSrgvQueue.setEndSite("tsj"); wcsSrgvQueue.setEndSite("tsj");
wcsSrgvQueue.setDefault02("8"); wcsSrgvQueue.setDefault02("8");
Integer count = wcsSagvQueueMapper.selectTsj();
if (count > 0) {
return;
} }
wcsSrgvQueue.setTaskNo("9999"); }
// 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.setTheFloor(deviceSrgv.getCurrFloor().toString());
wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString());
@@ -212,26 +230,24 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
* 生成出库小车队列 * 生成出库小车队列
*/ */
private void createCarOutQueue() { private void createCarOutQueue() {
MydoJob mydoJob = new MydoJob();
mydoJob.setInOut("2");
mydoJob.setExecutionPhase("0"); List<MydoJob> mydoJobs = mydoJobService.selectMydoJobOut();
mydoJob.setStatus("1");
List<MydoJob> mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob);
if (!mydoJobs.isEmpty()) { if (!mydoJobs.isEmpty()) {
MydoJob mydoJob1 = mydoJobs.get(0); for (MydoJob mydoJob1 : mydoJobs) {
// 查询是否有已下发的该任务号队列
WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo());
if (wcsSrgvQueue1 == null) { if (wcsSrgvQueue1 == null) {
ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
List<DeviceSrgv> deviceSrgvList = deviceSrgvMap.values().stream() List<DeviceSrgv> deviceSrgvList = deviceSrgvMap.values().stream()
.filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5) .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 1)
.filter(deviceSrgv -> deviceSrgv.getBattery() > 30) .filter(deviceSrgv -> deviceSrgv.getBattery() > 30)
.sorted((d1, d2) -> Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d2.getCurrFloor()) .sorted((d1, d2) -> Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d2.getCurrFloor())
- Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d1.getCurrFloor())) - Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d1.getCurrFloor()))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!deviceSrgvList.isEmpty()) { if (!deviceSrgvList.isEmpty()) {
DeviceSrgv deviceSrgv = null; DeviceSrgv deviceSrgv = null;
for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { /*for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
//优先出库层,如果没有优先邻近层 //优先出库层,如果没有优先邻近层
if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
deviceSrgv = deviceSrgv1; deviceSrgv = deviceSrgv1;
@@ -242,6 +258,83 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
deviceSrgv = deviceSrgv1; deviceSrgv = deviceSrgv1;
} }
} }
}*/
WcsSrgvMap wcsSrgvMap = new WcsSrgvMap();
wcsSrgvMap.setCargoSpaceId(mydoJob1.getCargoSpaceId());
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap);
//取货地址
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;
// 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));
// 1. 计算当前小车到目标点的Y轴、X轴绝对距离
int currentYDistance = Math.abs(startY - endY);
int currentXDistance = Math.abs(startX - endX);
// 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());
if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车
log.info("楼层bu相等:{}", deviceSrgv);
}
}
}
} }
if (deviceSrgv != null) { if (deviceSrgv != null) {
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString());
@@ -254,11 +347,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
String executionStatus = "1"; String executionStatus = "1";
String default08 = "";//是否二段任务标识 String default08 = "";//是否二段任务标识
String default06 = ""; String default06 = "";
WcsSrgvMap wcsSrgvMap = new WcsSrgvMap();
wcsSrgvMap.setCargoSpaceId(mydoJob1.getCargoSpaceId());
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap);
//取货地址
String cargoPickSite = wcsSrgvMaps.get(0).getSiteId();
Integer currFloor = deviceSrgv.getCurrFloor(); Integer currFloor = deviceSrgv.getCurrFloor();
Integer theLayer = wcsSrgvMaps.get(0).getPlcLayer(); Integer theLayer = wcsSrgvMaps.get(0).getPlcLayer();
if (Objects.equals(deviceSrgv.getCurrFloor(), wcsSrgvMaps.get(0).getPlcLayer())) { if (Objects.equals(deviceSrgv.getCurrFloor(), wcsSrgvMaps.get(0).getPlcLayer())) {
@@ -279,50 +368,91 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//终点是提升机 //终点是提升机
endSite = "tsj"; endSite = "tsj";
} }
WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); // if (endSite.equals("tsj")) {
wcsSrgvMap1.setRemark(mydoJob1.getExitId()); // Integer count = wcsSagvQueueMapper.selectTsj();
List<WcsSrgvMap> wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1); // if (count > 0) {
String cargoPlaceSite = wcsSrgvMaps1.get(0).getSiteId(); // return;
// }
// }
mydoJob1.setExitId(null);
WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap();
String cargoPlaceSite = "";
ConcurrentHashMap<String, DeviceSsj> deviceSsjMap = PlcSsjRead.deviceSsjMap;
List<String> outModelSSJ = new ArrayList<>();
if (!mydoJob1.getInOrOut().equals("30")) {
for (String deviceSsj : deviceSsjMap.keySet()) {
if (deviceSsj.equals("TD1001") || deviceSsj.equals("TD1008")) {
DeviceSsj deviceSsj1 = deviceSsjMap.get(deviceSsj);
if (deviceSsj1.getModel() == 2) {
String s = "";
String ssj = "";
if (deviceSsj1.getName().equals("TD1001")) {
s = "050101";
ssj = "L1004";
} else {
s = "070101";
ssj = "L1005";
}
Integer count = mydoJobService.selectExit(ssj);
if (count >= 0 && count <= 1) {
mydoJob1.setExitId(ssj);
mydoJobService.updateMydoJob(mydoJob1);
outModelSSJ.add(s);
break;
}
}
}
}
cargoPlaceSite = wcsSagvQueueMapper.selectMinCountJob(outModelSSJ);
if (Objects.equals(cargoPlaceSite, "")) {
return;
}
}
wcsSrgvMap1.setRemark(mydoJob1.getExitId());
//TODO 读取输送机入出库模式分配出口
List<WcsSrgvMap> wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1);
String cargoPlaceSite1 = cargoPlaceSite;
List<DeviceSrgv> sameSiteDevices = deviceSrgvMap.values().stream() List<DeviceSrgv> sameSiteDevices = deviceSrgvMap.values().stream()
.filter(d -> d.getWorkMode() == 5 .filter(d -> d.getWorkMode() == 5
&& d.getStatus() == 1 && d.getStatus() == 1
&& d.getCurrSite().equals(cargoPlaceSite)) && d.getCurrSite().equals(cargoPlaceSite1))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) {
WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap();
wcsSrgvMap3.setRemark("cache"); wcsSrgvMap3.setRemark("cache");
List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3); // List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3);
for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) { // for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) {
//deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象 // //deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象
if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) { // if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) {
//生成小车到缓存点队列 // //生成小车到缓存点队列
WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString()); // WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString());
WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); // WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); // wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue); // List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue);
if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) { // if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) {
WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue(); // WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue();
wcsSrgvQueue3.setGuid(UUID.randomUUID().toString()); // wcsSrgvQueue3.setGuid(UUID.randomUUID().toString());
wcsSrgvQueue3.setTaskNo("9999"); // wcsSrgvQueue3.setTaskNo("11111");
wcsSrgvQueue3.setTaskType("1"); // wcsSrgvQueue3.setTaskType("1");
wcsSrgvQueue3.setPriority(Long.parseLong("2")); // wcsSrgvQueue3.setPriority(Long.parseLong("2"));
wcsSrgvQueue3.setCargo("1"); // wcsSrgvQueue3.setCargo("1");
wcsSrgvQueue3.setIssued(issued); // wcsSrgvQueue3.setIssued(issued);
wcsSrgvQueue3.setExecutionStatus(executionStatus); // wcsSrgvQueue3.setExecutionStatus(executionStatus);
wcsSrgvQueue3.setCargoPickSite(cargoPickSite); // wcsSrgvQueue3.setCargoPickSite(cargoPickSite);
wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); // wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite()); // wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite());
wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId()); // wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId());
wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString()); // wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString());
wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString()); // wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString());
wcsSrgvQueue3.setDefault02("4"); // wcsSrgvQueue3.setDefault02("4");
wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString()); // wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString());
wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3); // wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3);
} // }
} // }
} // }
} }
@@ -336,7 +466,12 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcsSrgvQueue.setIssued(issued); wcsSrgvQueue.setIssued(issued);
wcsSrgvQueue.setExecutionStatus(executionStatus); wcsSrgvQueue.setExecutionStatus(executionStatus);
wcsSrgvQueue.setCargoPickSite(cargoPickSite); wcsSrgvQueue.setCargoPickSite(cargoPickSite);
if (mydoJob1.getInOrOut().equals("30")) {
WcsSrgvMap wcsSrgvMapsite = new WcsSrgvMap();
wcsSrgvMapsite.setCargoSpaceId(mydoJob1.getTargetCargoSpaceId());
List<WcsSrgvMap> wcsSrgvSite = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapsite);
cargoPlaceSite = wcsSrgvSite.get(0).getSiteId();
}
wcsSrgvQueue.setCargoPlaceSite(cargoPlaceSite); wcsSrgvQueue.setCargoPlaceSite(cargoPlaceSite);
wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite()); wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite());
wcsSrgvQueue.setEndSite(endSite); wcsSrgvQueue.setEndSite(endSite);
@@ -345,6 +480,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString()); wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString());
if (endSite.equals("tsj")) { if (endSite.equals("tsj")) {
wcsSrgvQueue.setDefault02("8"); wcsSrgvQueue.setDefault02("8");
mydoJob1.setExitId(null);
mydoJobService.updateMydoJob(mydoJob1);
} else { } else {
wcsSrgvQueue.setDefault02("4"); wcsSrgvQueue.setDefault02("4");
} }
@@ -359,6 +496,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
} }
} }
} }
}
} }
@@ -371,7 +511,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
mydoJob.setInOut("1"); mydoJob.setInOut("1");
List<MydoJob> mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob); List<MydoJob> mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob);
if (!mydoJobs.isEmpty()) { if (!mydoJobs.isEmpty()) {
MydoJob mydoJob1 = mydoJobs.get(0); for (MydoJob mydoJob1 : mydoJobs) {
// 查询是否有已下发的该任务号队列 // 查询是否有已下发的该任务号队列
WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo());
@@ -382,6 +522,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
.filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5) .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5)
.filter(deviceSrgv -> deviceSrgv.getBattery() > 30) .filter(deviceSrgv -> deviceSrgv.getBattery() > 30)
.filter(deviceSrgv -> deviceSrgv.getCurrFloor() > 0) .filter(deviceSrgv -> deviceSrgv.getCurrFloor() > 0)
.filter(deviceSrgv -> deviceSrgv.getStatus() == 1)
.sorted((d1, d2) -> d2.getCurrFloor().compareTo(d1.getCurrFloor())) .sorted((d1, d2) -> d2.getCurrFloor().compareTo(d1.getCurrFloor()))
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -389,12 +530,59 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
if (!deviceSrgvList.isEmpty()) { if (!deviceSrgvList.isEmpty()) {
DeviceSrgv deviceSrgv = null; DeviceSrgv deviceSrgv = null;
//找到入库
WcsSrgvMap wcsSrgvMap = new WcsSrgvMap();
wcsSrgvMap.setRemark(mydoJob1.getEntranceId());
if (StrUtil.isEmpty(wcsSrgvMap.getRemark())) {
log.error("入库任务号:{} 入库入口ID为空", mydoJob1.getTaskNo());
return;
}
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap);
//取货地址
String cargoPickSite = wcsSrgvMaps.get(0).getSiteId();
//先找层数相等的小车
List<DeviceSrgv> currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList());
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));
// 1. 计算当前小车到目标点的Y轴、X轴绝对距离
int currentYDistance = Math.abs(startY - endY);
int currentXDistance = Math.abs(startX - endX);
// 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) { for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) { if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
deviceSrgv = deviceSrgv1;
log.info("楼层相等:{}", deviceSrgv);
break; // 找到了相同楼层的直接选它
} else {
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车 deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车
@@ -403,27 +591,35 @@ 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) { if (deviceSrgv != null) {
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString());
WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor()); WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor());
if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) { if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1
// && wcsSrgvQueue4 == null
) {
//查询小车是否为1楼,且1楼小车不在入库站点 //查询小车是否为1楼,且1楼小车不在入库站点
String endSite = ""; String endSite = "";
String issued = "0"; String issued = "0";
String executionStatus = "1"; String executionStatus = "1";
WcsSrgvMap wcsSrgvMap = new WcsSrgvMap();
wcsSrgvMap.setRemark(mydoJob1.getEntranceId());
if (StrUtil.isEmpty(wcsSrgvMap.getRemark())) {
log.error("入库任务号:{} 入库入口ID为空", mydoJob1.getTaskNo());
return;
}
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap);
//取货地址
String cargoPickSite = wcsSrgvMaps.get(0).getSiteId();
if (deviceSrgv.getCurrFloor() == 1) { if (deviceSrgv.getCurrFloor() == 1) {
endSite = cargoPickSite; endSite = cargoPickSite;
@@ -436,51 +632,60 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
// 小车不在1楼 // 小车不在1楼
endSite = "tsj"; endSite = "tsj";
} }
// if (endSite.equals("tsj")) {
// Integer count = wcsSagvQueueMapper.selectTsj();
// if (count > 0) {
// return;
// }
// }
//筛选出deviceSrgvMap中deviceSrgv.getWorkMode() == 4并且deviceSrgv.getStatus() == 1并且deviceSrgv.getCurrSite() == cargoPickSite得对象,并排除掉其中deviceId与deviceSrgv.getDeviceId()相同的对象 //筛选出deviceSrgvMap中deviceSrgv.getWorkMode() == 4并且deviceSrgv.getStatus() == 1并且deviceSrgv.getCurrSite() == cargoPickSite得对象,并排除掉其中deviceId与deviceSrgv.getDeviceId()相同的对象
// 如果当前有其他小车也要去入库点取货 TODO 判断的是如果当前车要去取货点,但是取货点有车的的情况
List<DeviceSrgv> sameSiteDevices = deviceSrgvMap.values().stream() // List<DeviceSrgv> sameSiteDevices = deviceSrgvMap.values().stream()
.filter(d -> d.getWorkMode() == 5 // .filter(d -> d.getWorkMode() == 5
&& d.getStatus() == 1 // && d.getStatus() == 1
&& d.getCurrSite().equals(cargoPickSite)) // && d.getCurrSite().equals(cargoPickSite))
.collect(Collectors.toList()); // .collect(Collectors.toList());
if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { // 和当前小车不是一个 那么就生成一个去离母通道最近的点
WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); // if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) {
wcsSrgvMap3.setRemark("cache"); // WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap();
List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3); // wcsSrgvMap3.setSiteId("07070"+sameSiteDevices.get(0).getCurrFloor());
for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) { // List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3);
//deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象 // for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) {
if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) { //
WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString()); // if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) {
WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); // WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString());
wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); // WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue); // wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) { // List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue);
//生成占位小车到缓存点队列 // if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) {
WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue(); // //生成占位小车到缓存点队列
wcsSrgvQueue3.setGuid(UUID.randomUUID().toString()); // WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue();
wcsSrgvQueue3.setTaskNo(mydoJob1.getTaskNo()); // wcsSrgvQueue3.setGuid(UUID.randomUUID().toString());
wcsSrgvQueue3.setTaskType("1"); // wcsSrgvQueue3.setTaskNo(String.valueOf(taskCache));
wcsSrgvQueue3.setPriority(Long.parseLong("2")); // wcsSrgvQueue3.setTaskType("1");
wcsSrgvQueue3.setCargo("1"); // wcsSrgvQueue3.setPriority(Long.parseLong("2"));
wcsSrgvQueue3.setIssued(issued); // wcsSrgvQueue3.setCargo("1");
wcsSrgvQueue3.setExecutionStatus(executionStatus); // wcsSrgvQueue3.setIssued(issued);
wcsSrgvQueue3.setCargoPickSite(cargoPickSite); // wcsSrgvQueue3.setExecutionStatus(executionStatus);
wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId()); // wcsSrgvQueue3.setCargoPickSite(cargoPickSite);
wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite()); // wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId()); // wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite());
wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString()); // wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId());
wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString());
wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString()); // wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
wcsSrgvQueue3.setDefault02("4"); // wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString());
wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString()); // wcsSrgvQueue3.setDefault02("4");
wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3); // wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString());
return; // wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3);
} // taskCache++;
} // return;
// }
// }
} //
} // }
// }
//生成小车取货队列 //生成小车取货队列
@@ -518,6 +723,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
} }
}
/** /**
* 小车发送任务 * 小车发送任务
*/ */
@@ -543,7 +750,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
sendMainTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); sendMainTask(deviceSrgv, wcsSrgvQueue, currSite, endSite);
} else { } else {
//小车不在起始点 //小车不在起始点
sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, startSite); // sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, startSite);
sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite);
} }
} }
} }
@@ -558,31 +766,54 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
Integer floor = deviceSrgv.getCurrFloor(); Integer floor = deviceSrgv.getCurrFloor();
//获取当前地图 //获取当前地图
Map<String, WcsSrgvMap> arrByRoadSite = roadCacheService.getArrByRoadSite(floor); 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")) { if (wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2")) {
//如果是1层 锁定提升机站点 // 出入库任务时,只要车不在提升机里面就锁定提升机的点位,设置成墙
if (CollUtil.isNotEmpty(arrByRoadSite) && arrByRoadSite.values().iterator().next().getZ() == 1) { if (CollUtil.isNotEmpty(arrByRoadSite) && !deviceSrgv.getCurrSite().equals("09050" + floor)) {
if (arrByRoadSite.containsKey("080501")) { String siteId = "08050" + floor;
arrByRoadSite.get("080501").setValue(0); 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()); List<int[]> shortestPath = PathFinder.findShortestPath(emptyMap, arrByRoadSite.get(startSite).getX(), arrByRoadSite.get(startSite).getY(), arrByRoadSite.get(endSite).getX(), arrByRoadSite.get(endSite).getY());
if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1 && shortestPath.get(0)[1] == -1) { // TODO 小车避让 目前只针对同层最多两台车 并且点位设置到了050201 判断地图中取的路径 不能直达说明有车阻挡 直接返回-1 用-1判断小车阻挡调离小车
shortestPath = null; if (shortestPath.size() > 0) {
if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1) {
return false;
}
String endBlockAgv = null; String endBlockAgv = null;
DeviceSrgv endBlockDevice = null; DeviceSrgv endBlockDevice = null;
// TODO 通过arrByRoadSite 中的站点 查询是否存在其他车的站点,如果存在则生成其他车到避让点的队列
if (arrByRoadSite != null && !arrByRoadSite.isEmpty()) { if (arrByRoadSite != null && !arrByRoadSite.isEmpty()) {
// 将arrByRoadSite转为String类型的Set(统一类型,方便匹配) // 将arrByRoadSite转为String类型的Set(统一类型,方便匹配)
Set<String> roadSiteSet = arrByRoadSite.keySet().stream() Set<String> roadSiteSet = arrByRoadSite.keySet().stream()
@@ -591,18 +822,37 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
.collect(Collectors.toSet()); .collect(Collectors.toSet());
// 2. Stream流式处理deviceSrgvMap // 2. Stream流式处理deviceSrgvMap
Optional<Map.Entry<String, DeviceSrgv>> targetEntry = PlcSrgvRead.deviceSrgvMap.entrySet().stream() 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的条目 .filter(entry -> entry.getValue() != null) // 过滤other为null的条目
// 条件1:other的当前站点存在于roadSiteSet中 // 条件1:other的当前站点存在于roadSiteSet中
.filter(entry -> roadSiteSet.contains(entry.getValue().getCurrSite())) .filter(entry -> roadSiteSet.contains(entry.getValue().getCurrSite()))
.filter(entry -> siteId.equals(entry.getValue().getCurrSite()))
// 条件2:设备ID不等于当前entry的key // 条件2:设备ID不等于当前entry的key
.filter(entry -> !Objects.equals(Convert.toStr(deviceSrgv.getDeviceId()), entry.getKey())) .filter(entry -> !Objects.equals(Convert.toStr(deviceSrgv.getDeviceId()), entry.getKey()))
.findFirst(); // 找到第一个符合条件的条目(等价于原代码的break) .findFirst();
// 找到第一个符合条件的条目(等价于原代码的break)
if (targetEntry.isPresent()) {
break;
}
}
// 3. 处理结果(若找到则赋值) // 3. 处理结果(若找到则赋值)
if (targetEntry.isPresent()) { if (targetEntry.isPresent()) {
endBlockAgv = targetEntry.get().getKey(); endBlockAgv = targetEntry.get().getKey();
endBlockDevice = targetEntry.get().getValue(); endBlockDevice = targetEntry.get().getValue();
shortestPath = null;
} }
} }
@@ -611,36 +861,59 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
List<WcsSrgvQueue> wcsSrgvQueueBRS = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueBR); List<WcsSrgvQueue> wcsSrgvQueueBRS = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueBR);
if (endBlockDevice != null && wcsSrgvQueueBRS.isEmpty()) { if (endBlockDevice != null && wcsSrgvQueueBRS.isEmpty()) {
// 选择当前层最近且可达的缓存点(避让点) // 选择当前层最近且可达的缓存点(避让点)
WcsSrgvMap cacheParam = new WcsSrgvMap(); ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
cacheParam.setRemark("cache"); List<DeviceSrgv> deviceSrgvs = deviceSrgvMap.values().stream()
cacheParam.setTheLayer(floor); .filter(d -> d.getWorkMode() == 5
List<WcsSrgvMap> cacheMaps = wcsSrgvMapService.selectWcsSrgvMapList(cacheParam); && 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(); WcsSrgvQueue taskB = new WcsSrgvQueue();
taskB.setGuid(UUID.randomUUID().toString()); taskB.setGuid(UUID.randomUUID().toString());
// 生成纯数字任务号(PLC要求),9 + HHmmss // 生成纯数字任务号(PLC要求),9 + HHmmss
taskB.setTaskNo(String.valueOf(taskCache)); taskB.setTaskNo(String.valueOf(taskCache));
taskB.setAgvId(endBlockAgv); taskB.setAgvId(endBlockAgv);
taskB.setTaskType("1"); // 点到点移动 taskB.setTaskType("4"); // 避让任务
taskB.setDefault02("4"); // 业务类型标识为点到点 taskB.setDefault02("4"); // 业务类型标识为点到点
taskB.setPriority(9L); // 高优先级,尽快避让 taskB.setPriority(9L); // 高优先级,尽快避让
taskB.setIssued("0"); // 未下发 taskB.setIssued("0"); // 未下发
taskB.setExecutionStatus("1");// 初始状态 taskB.setExecutionStatus("1");// 初始状态
taskB.setStartSite(endBlockDevice.getCurrSite()); taskB.setStartSite(endBlockDevice.getCurrSite());
taskB.setCargoPickSite(endBlockDevice.getCurrSite()); taskB.setCargoPickSite(endBlockDevice.getCurrSite());
taskB.setCargoPlaceSite("05020" + endBlockDevice.getCurrFloor()); if (cacheMaps.size() > 1) {
taskB.setEndSite("05020" + endBlockDevice.getCurrFloor()); 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.setTheFloor(floor.toString());
taskB.setDefault03(endBlockDevice.getCurrSite()); // taskB.setDefault03(endBlockDevice.getCurrSite());
taskB.setDefault07(floor.toString()); taskB.setDefault07(floor.toString());
taskB.setDefault08("1");//避让任务,直接完成 // taskB.setDefault08("1");//避让任务,直接完成
taskB.setCreateDate(DateUtil.now()); taskB.setCreateDate(DateUtil.now());
wcsSagvQueueMapper.insertWcsSrgvQueue(taskB); wcsSagvQueueMapper.insertWcsSrgvQueue(taskB);
taskCache++; taskCache++;
log.info("目标点 {" + deviceSrgv.getCurrSite() + "} 被小车 {" + deviceSrgv.getDeviceId() + "} 占用,已调度其前往避让点 {}", endSite, endBlockAgv, "02050" + endBlockDevice.getCurrFloor()); log.info("目标点 {" + deviceSrgv.getCurrSite() + "} 被小车 {" + deviceSrgv.getDeviceId() + "} 占用,已调度其前往避让点 {}", endSite, endBlockAgv, "02050" + endBlockDevice.getCurrFloor());
// 当前车等待下一轮调度(待阻挡车移开后自然可达) // 当前车等待下一轮调度(待阻挡车移开后自然可达)
return false; return false;
} }
} }
@@ -745,14 +1018,14 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
} }
if (("tsj").equals(endSite)) { if (("tsj").equals(endSite)) {
if (wcsSrgvQueue.getDefault02().equals("8")) { if (wcsSrgvQueue.getDefault02().equals("8")) {
endSite = extractTarget(String.valueOf(pathBuilder)); // endSite = extractTarget(String.valueOf(pathBuilder));
} else { endSite = "07050" + wcsSrgvQueue.getTheFloor();
}
if (wcsSrgvQueue.getDefault02().equals("1") || wcsSrgvQueue.getDefault02().equals("2")) {
endSite = "09050" + wcsSrgvQueue.getTheFloor(); endSite = "09050" + wcsSrgvQueue.getTheFloor();
} }
} }
// if (("tsj").equals(startSite)) {
// endSite = "09050" + wcsSrgvQueue.getTheFloor();
// }
List<SendData2> sendDataList = null; List<SendData2> sendDataList = null;
if (StrUtil.isEmpty(wcsSrgvQueue.getDefault08())) { if (StrUtil.isEmpty(wcsSrgvQueue.getDefault08())) {
sendDataList = new ArrayList<>(); sendDataList = new ArrayList<>();
@@ -841,8 +1114,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
sendDataList.add(taskType); 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<>(); sendDataList = new ArrayList<>();
SendData2 path = new SendData2(); SendData2 path = new SendData2();
path.setAddress("4404");//地址 path.setAddress("4404");//地址
@@ -864,14 +1138,17 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcjs.setType(1); wcjs.setType(1);
sendDataList.add(wcjs); sendDataList.add(wcjs);
//任务类型转换 //任务类型转换 //TODO 不行就改成7
SendData2 taskType = new SendData2(); SendData2 taskType = new SendData2();
taskType.setAddress("4402"); taskType.setAddress("4402");
taskType.setData("7"); taskType.setData("9");
taskType.setType(1); taskType.setType(1);
sendDataList.add(taskType); sendDataList.add(taskType);
} }
if (sendDataList == null) {
sendDataList = new ArrayList<>();
}
//任务号、原、目标数据转换 //任务号、原、目标数据转换
String siteId = wcsSrgvQueue.getTaskNo();//+ "," + startSite + "," + endSite; String siteId = wcsSrgvQueue.getTaskNo();//+ "," + startSite + "," + endSite;
SendData2 site = new SendData2(); SendData2 site = new SendData2();
@@ -901,7 +1178,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo()));
//换层任务不修改执行阶段 //换层任务不修改执行阶段
if (!wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) { if (mydoJob != null && !wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) {
mydoJob.setExecutionPhase("3"); mydoJob.setExecutionPhase("3");
mydoJob.setStatus("3"); mydoJob.setStatus("3");
mydoJobService.updateMydoJob(mydoJob); mydoJobService.updateMydoJob(mydoJob);
@@ -947,6 +1224,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
// 载货任务(出库、入库、移库等) // 载货任务(出库、入库、移库等)
sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite); sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite);
break; break;
case "7":
// 移库任务(出库、入库、移库等)
sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite);
break;
} }
if (sendFlag) { if (sendFlag) {
@@ -1084,7 +1365,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//处理换层逻辑 //处理换层逻辑
String site1 = "07050" + wcsSrgvQueue.getDefault07(); String site1 = "07050" + wcsSrgvQueue.getDefault07();
String site2 = "10050" + wcsSrgvQueue.getDefault07(); String site2 = "10050" + wcsSrgvQueue.getDefault07();
String site3 = "09050" + wcsSrgvQueue.getDefault07();
sites.add(site1); sites.add(site1);
sites.add(site3);
sites.add(site2); sites.add(site2);
} }
if (Objects.equals(currSite, wcsSrgvQueue.getEndSite()) || (siteId != null && Objects.equals(currSite, siteId)) || sites.contains(currSite)) { if (Objects.equals(currSite, wcsSrgvQueue.getEndSite()) || (siteId != null && Objects.equals(currSite, siteId)) || sites.contains(currSite)) {
@@ -1114,17 +1397,12 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
// return; // return;
} }
//空车任务 且当前车的位置和取货位置相同 //空车任务 且当前车的位置和取货位置相同
if ("1".equals(taskType) if ("1".equals(taskType) && (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite))) {
&& (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite))
) {
String endSite = ""; String endSite = "";
String xfType = ""; String xfType = "";
// 换完层直接根据任务去接出入库任务
if (wcsSrgvQueue.getDefault02().equals("8")) { if (wcsSrgvQueue.getDefault02().equals("8")) {
//换层任务直接完成,等待后续入出库作业下发
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
return;
} else { } else {
WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite); WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite);
WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite); WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite);
@@ -1138,6 +1416,13 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//不同层,终点为提升机 //不同层,终点为提升机
endSite = "tsj"; endSite = "tsj";
} }
// 如果终点是提升机需要判断是否有其他任务也是提升机的 这个时候先停一下
// if (endSite.equals("tsj")) {
// Integer count = wcsSagvQueueMapper.selectTsj();
// if (count > 0) {
// return;
// }
// }
if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) { if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) {
xfType = "1";//入库 xfType = "1";//入库
@@ -1176,18 +1461,39 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo()));
jobCallBack.setCreateTime(new Date()); jobCallBack.setCreateTime(new Date());
jobCallBackService.insertJobCallBack(jobCallBack); jobCallBackService.insertJobCallBack(jobCallBack);
mydoJobService.insertHistory(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
} }
break; break;
case "2": case "2":
MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo()));
if (mydoJobOut != null) { 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());
jobCallBack.setStatus("0");
jobCallBack.setTaskNo(Convert.toLong(mydoJobOut.getTaskNo()));
jobCallBack.setCreateTime(new Date());
jobCallBackService.insertJobCallBack(jobCallBack);
mydoJobService.insertHistory(mydoJobOut.getJobId()); mydoJobService.insertHistory(mydoJobOut.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId());
} }
case "7"://移库,变动库存 case "7"://移库,变动库存
break; MydoJob mydoJobyk = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo()));
if (mydoJobyk != null) {
JobCallBack jobCallBack = new JobCallBack();
jobCallBack.setType(wcsSrgvQueue.getDefault02());
jobCallBack.setMydojobId(mydoJobyk.getJobId());
jobCallBack.setStatus("0");
jobCallBack.setTaskNo(Convert.toLong(mydoJobyk.getTaskNo()));
jobCallBack.setCreateTime(new Date());
jobCallBackService.insertJobCallBack(jobCallBack);
mydoJobService.insertHistory(mydoJobyk.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJobyk.getJobId());
}
default: default:
break; break;
} }
@@ -1196,8 +1502,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid()); wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
// 充电任务 // 充电任务 并且小车也是充电任务
} else if ("3".equals(taskType)) { } else if ("3".equals(taskType) && wcsSrgvQueue.getDefault02().equals("3")) {
//删除队列,插入历史表 //删除队列,插入历史表
wcsSrgvQueue.setExecutionStatus("4"); wcsSrgvQueue.setExecutionStatus("4");
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo()); wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
@@ -1207,9 +1513,15 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//充电之类的,不知道用不用 //充电之类的,不知道用不用
} else if ("4".equals(taskType)) {
{
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
} }
}
//更新小车待机时间 //更新小车待机时间
deviceSrgvService.updateLastTimeByAgvId(wcsSrgvQueue.getAgvId()); // deviceSrgvService.updateLastTimeByAgvId(wcsSrgvQueue.getAgvId());
} }
} }
@@ -1237,9 +1549,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
String startSite = wcsSrgvQueue.getStartSite(); String startSite = wcsSrgvQueue.getStartSite();
if (!startSite.equals(currSite)) { if (!startSite.equals(currSite)) {
wcsSrgvQueue.setIssued("1"); // wcsSrgvQueue.setIssued("1");
wcsSrgvQueue.setStartDate(DateUtil.now()); // wcsSrgvQueue.setExecutionStatus("3");
wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); // wcsSrgvQueue.setStartDate(DateUtil.now());
// wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
} }
} }
} }

View File

@@ -124,7 +124,17 @@ public class SsjThread implements Runnable {
} }
void inDispatch1(DeviceSsj deviceSsj) { void inDispatch1(DeviceSsj deviceSsj) {
if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode())) { if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) {
String trayCode = deviceSsj.getTrayCode().trim();
MydoJob getMydoJob = mydoJobService.selectMydoJobByTrayCode(trayCode);
if (getMydoJob != null && deviceSsj.getTaskNo() < 1000) {
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), getMydoJob.getTaskNo(), 1, 1);
if (i == 1) {
getMydoJob.setStatus("3");
mydoJobService.updateMydoJob(getMydoJob);
log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", getMydoJob.getTaskNo());
}
} else {
//todo 查是否为入库模式,不是退回,是否超重 //todo 查是否为入库模式,不是退回,是否超重
HashMap<String, Object> map = new HashMap<>(); HashMap<String, Object> map = new HashMap<>();
map.put("trayCode", deviceSsj.getTrayCode()); map.put("trayCode", deviceSsj.getTrayCode());
@@ -136,6 +146,8 @@ public class SsjThread implements Runnable {
mydoJob.setStatus("1"); mydoJob.setStatus("1");
mydoJob.setExecutionPhase("1"); mydoJob.setExecutionPhase("1");
mydoJob.setCreateTime(new Date()); mydoJob.setCreateTime(new Date());
mydoJob.setTheFloor(mydoJob.getClassId());
mydoJob.setTrayCode(trayCode);
if ("GS1002".equals(deviceSsj.getDeviceCode())) { if ("GS1002".equals(deviceSsj.getDeviceCode())) {
mydoJob.setEntranceId("L1004"); mydoJob.setEntranceId("L1004");
} else { } else {
@@ -144,6 +156,7 @@ public class SsjThread implements Runnable {
// 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段 // 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段
MydoJob mydoJob1 = new MydoJob(); MydoJob mydoJob1 = new MydoJob();
mydoJob1.setTaskNo(mydoJob.getTaskNo()); mydoJob1.setTaskNo(mydoJob.getTaskNo());
mydoJob1.setTrayCode(mydoJob.getTrayCode());
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJob1); List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJob1);
if (mydoJobs.size() > 0) { if (mydoJobs.size() > 0) {
return; return;
@@ -158,11 +171,10 @@ public class SsjThread implements Runnable {
} else { } else {
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2); int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2);
if (i == 1) { if (i == 1) {
log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2"); log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2 条码" + deviceSsj.getTrayCode());
}
} }
} }
} }
@@ -171,11 +183,28 @@ public class SsjThread implements Runnable {
void inDispatch2(DeviceSsj deviceSsj) { void inDispatch2(DeviceSsj deviceSsj) {
if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 1000) { if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 1000) {
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()); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo());
if (mydoJob != null) { if (mydoJob != null) {
mydoJob.setTheFloor(theFloor);
mydoJob.setCargoSpaceId(cargoSpaceId);
mydoJob.setExecutionPhase("2"); mydoJob.setExecutionPhase("2");
mydoJobService.updateMydoJob(mydoJob); 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.ObjUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.ruoyi.bas.port.service.IWcsPortService; 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.domain.SendData;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.device.srgv.domain.DeviceSrgv; import com.ruoyi.device.srgv.domain.DeviceSrgv;
@@ -35,13 +37,17 @@ public class TsjThread implements Runnable {
private ITsjDeviceExecutionQueueFinishService tsjDeviceExecutionQueueFinishService; private ITsjDeviceExecutionQueueFinishService tsjDeviceExecutionQueueFinishService;
private IWcsPortService wcsPortService; private IWcsPortService wcsPortService;
private IWcsSrgvQueueService wcsSrgvQueueService; private IWcsSrgvQueueService wcsSrgvQueueService;
public IMydoJobService mydoJobService; private IMydoJobService mydoJobService;
private IWcsSrgvMapService wcsSrgvMapService;
public void init() { public void init() {
tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class); tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class);
tsjDeviceExecutionQueueFinishService = SpringUtils.getBean(ITsjDeviceExecutionQueueFinishService.class); tsjDeviceExecutionQueueFinishService = SpringUtils.getBean(ITsjDeviceExecutionQueueFinishService.class);
wcsPortService = SpringUtils.getBean(IWcsPortService.class); wcsPortService = SpringUtils.getBean(IWcsPortService.class);
wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class);
wcsSrgvMapService = SpringUtils.getBean(IWcsSrgvMapService.class);
} }
@Override @Override
@@ -76,7 +82,7 @@ public class TsjThread implements Runnable {
* 1、下发完成 如果设备状态为 2-工作 ,触发方式 2-自动,任务号大于999,则代表任务下发完成 * 1、下发完成 如果设备状态为 2-工作 ,触发方式 2-自动,任务号大于999,则代表任务下发完成
* *
* */ * */
if (czfs == 2 && sbzt == 2 && rwh > 999) { if (czfs == 2 && sbzt == 2 && rwh > 500) {
// finishSend(rwh, tsj); // finishSend(rwh, tsj);
} }
@@ -84,11 +90,16 @@ public class TsjThread implements Runnable {
* 2、四向车任务生成 2-工作 ,触发方式 2-自动,任务号大于999 * 2、四向车任务生成 2-工作 ,触发方式 2-自动,任务号大于999
* *
* */ * */
if (czfs == 2 && sbzt == 2 && jdbz == 4 && rwh > 999) { 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); createSRgvQueue(rwh, tsj);
} }
}
// 提升机取货中 说明对齐当前要取货层 开始给小车下发 // 提升机取货中 说明对齐当前要取货层 开始给小车下发
if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 999) { if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 500) {
createSRgvQueueTsjQd(rwh, tsj); createSRgvQueueTsjQd(rwh, tsj);
} }
@@ -96,7 +107,7 @@ public class TsjThread implements Runnable {
* 2、任务完成 * 2、任务完成
* *
* */ * */
if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 999) { if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 500) {
//任务完成 //任务完成
finishTask(rwh, tsj); finishTask(rwh, tsj);
} }
@@ -117,8 +128,7 @@ public class TsjThread implements Runnable {
private void createSRgvQueueTsjQd(Long rwh, DeviceTsj tsj) { private void createSRgvQueueTsjQd(Long rwh, DeviceTsj tsj) {
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv);
if (deviceSrgv.getCurrSite().equals("09050" + 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); SendData rwlxSendData = new SendData(Tools.INT, 1);
DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(Convert.toStr(1)); DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(Convert.toStr(1));
byte[] bytes = Tools.sendData(rwlxSendData); byte[] bytes = Tools.sendData(rwlxSendData);
@@ -147,11 +157,15 @@ public class TsjThread implements Runnable {
WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue(); WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue();
sRgvQueueParam.setTaskNo(Convert.toStr(rwh)); sRgvQueueParam.setTaskNo(Convert.toStr(rwh));
sRgvQueueParam.setEndSite(Convert.toStr("tsj")); sRgvQueueParam.setEndSite(Convert.toStr("tsj"));
sRgvQueueParam.setIssued("1");
sRgvQueueParam.setExecutionStatus("3");
List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(sRgvQueueParam); List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(sRgvQueueParam);
if (CollUtil.isEmpty(wcsSrgvQueues)) { if (CollUtil.isEmpty(wcsSrgvQueues)) {
return; return;
} }
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.insertHistory(Convert.toStr(rwh)); WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.insertHistory(Convert.toStr(rwh));
String cargoPickSite = wcsSrgvQueue.getCargoPickSite();
String cargoPlaceSite = wcsSrgvQueue.getCargoPlaceSite();
//修改起点终点 //修改起点终点
if (ObjUtil.isNotEmpty(wcsSrgvQueue)) { if (ObjUtil.isNotEmpty(wcsSrgvQueue)) {
wcsSrgvQueue.setCreateDate(DateUtil.formatDateTime(DateUtil.date())); wcsSrgvQueue.setCreateDate(DateUtil.formatDateTime(DateUtil.date()));
@@ -175,7 +189,6 @@ public class TsjThread implements Runnable {
endSite = wcsSrgvQueue.getCargoPlaceSite(); endSite = wcsSrgvQueue.getCargoPlaceSite();
break; break;
case "3": case "3":
//充电
break; break;
case "4": case "4":
//点到点 //点到点
@@ -192,10 +205,44 @@ public class TsjThread implements Runnable {
log.info("任务类型错误"); log.info("任务类型错误");
} }
break; 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.setStartSite(startSite);
wcsSrgvQueue.setEndSite(endSite); wcsSrgvQueue.setEndSite(endSite);
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
@@ -209,7 +256,8 @@ public class TsjThread implements Runnable {
private void createQueue(DeviceTsj tsj) { private void createQueue(DeviceTsj tsj) {
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv);
if (deviceSrgv.getSpare2().equals("1") && deviceSrgv.getTaskNo() > 0) { Integer count = tsjDeviceExecutionQueueService.selectCount();
if (deviceSrgv.getSpare2().equals("1") && deviceSrgv.getTaskNo() > 0 && count == 0) {
//请求进入输送机 //请求进入输送机
WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue(); WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue();
sRgvQueueParam.setAgvId(Convert.toStr(deviceSrgv.getDeviceId())); sRgvQueueParam.setAgvId(Convert.toStr(deviceSrgv.getDeviceId()));

View File

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

View File

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

View File

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

View File

@@ -6,9 +6,9 @@ spring:
druid: druid:
#主数据信息 #主数据信息
master: master:
url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT546-WCS; url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT546-wcs;
username: sa username: sa
password: 123456 password: Flrd0914.
# 从库数据源 # 从库数据源
slave: slave:
# 从数据源开关/默认关闭 # 从数据源开关/默认关闭

View File

@@ -34,7 +34,7 @@ server:
# 日志配置 # 日志配置
logging: logging:
level: level:
com.ruoyi: debug com.ruoyi: info
org.springframework: warn org.springframework: warn
# 用户配置 # 用户配置
@@ -64,7 +64,7 @@ spring:
devtools: devtools:
restart: restart:
# 热部署开关 # 热部署开关
enabled: true enabled: false
# redis 配置 # redis 配置
redis: redis:
# 地址 # 地址

View File

@@ -161,4 +161,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{guid} #{guid}
</foreach> </foreach>
</delete> </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> </mapper>

View File

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

View File

@@ -25,13 +25,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="theFloor" column="the_floor" /> <result property="theFloor" column="the_floor" />
<result property="productId" column="product_id" /> <result property="productId" column="product_id" />
<result property="productName" column="product_name" /> <result property="productName" column="product_name" />
<result property="trayCode" column="tray_code" />
</resultMap> </resultMap>
<sql id="selectMydoJobVo"> <sql id="selectMydoJobVo">
select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name from mydo_job_wcs select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name,tray_code from mydo_job_wcs
</sql> </sql>
<sql id="selectMydoJobFinishVo"> <sql id="selectMydoJobFinishVo">
select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor from mydo_job_wcs_finish select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name,tray_code from mydo_job_wcs_finish
</sql> </sql>
<select id="selectMydoJobList" parameterType="MydoJob" resultMap="MydoJobResult"> <select id="selectMydoJobList" parameterType="MydoJob" resultMap="MydoJobResult">
@@ -55,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="theFloor != null and theFloor != ''"> and the_floor = #{theFloor}</if> <if test="theFloor != null and theFloor != ''"> and the_floor = #{theFloor}</if>
<if test="productId != null and productId != ''"> and product_id = #{productId}</if> <if test="productId != null and productId != ''"> and product_id = #{productId}</if>
<if test="productName != null and productName != ''"> and product_name = #{productName}</if> <if test="productName != null and productName != ''"> and product_name = #{productName}</if>
<if test="trayCode != null and trayCode != ''"> and tray_code = #{trayCode}</if>
</where> </where>
</select> </select>
@@ -118,6 +120,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="warehouseId != null">warehouse_id,</if> <if test="warehouseId != null">warehouse_id,</if>
<if test="faultFlag != null">fault_flag,</if> <if test="faultFlag != null">fault_flag,</if>
<if test="theFloor != null">the_floor,</if> <if test="theFloor != null">the_floor,</if>
<if test="trayCode != null">tray_code,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="jobId != null">#{jobId},</if> <if test="jobId != null">#{jobId},</if>
@@ -138,6 +141,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="warehouseId != null">#{warehouseId},</if> <if test="warehouseId != null">#{warehouseId},</if>
<if test="faultFlag != null">#{faultFlag},</if> <if test="faultFlag != null">#{faultFlag},</if>
<if test="theFloor != null">#{theFloor},</if> <if test="theFloor != null">#{theFloor},</if>
<if test="trayCode != null">#{trayCode},</if>
</trim> </trim>
</insert> </insert>
<insert id="insertHistory"> <insert id="insertHistory">
@@ -244,4 +248,67 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and status = 3 and status = 3
order by priority desc,create_time order by priority desc,create_time
</select> </select>
<select id="selectMydoJobOut" resultMap="MydoJobResult">
WITH floor_group AS (
SELECT
b.cargo_space_id,
b.group_coding_no,
b.the_floor,
b.group_coding,
a.task_no AS task_no,
a.job_id AS job_id,
a.in_or_out, -- 之前新增的字段
a.target_cargo_space_id, -- 新增字段:加入target_cargo_space_id
ROW_NUMBER() OVER (PARTITION BY b.the_floor ORDER BY b.group_coding DESC) AS rn
FROM
mydo_job_wcs a
INNER JOIN bas_cargo_space b
ON a.cargo_space_id = b.cargo_space_id
AND a.the_floor = b.the_floor
WHERE
a.in_or_out >= 20
AND a.status = '1'
GROUP BY
b.group_coding_no,
b.cargo_space_id,
b.the_floor,
b.group_coding,
a.task_no,
a.job_id,
a.create_time,
a.in_or_out, -- 之前新增的分组字段
a.target_cargo_space_id -- 分组字段中新增:必须加入GROUP BY
)
SELECT
cargo_space_id,
group_coding_no,
the_floor,
task_no,
job_id,
in_or_out, -- 之前新增的展示字段
target_cargo_space_id -- 最终查询结果中显示该字段
FROM
floor_group
WHERE
rn &lt;= 1
ORDER BY
group_coding DESC;
</select>
<select id="selectMydoJobByTrayCode" resultMap="MydoJobResult">
<include refid="selectMydoJobVo"/>
where tray_code =#{trayCode}
</select>
<select id="selectExit" parameterType="string" resultType="java.lang.Integer">
select count(1) from mydo_job_wcs where in_or_out>=20 and exit_id = #{exitId}
</select>
<select id="selectMydoJobCount" resultType="java.lang.Integer">
select count(1) from mydo_job_wcs
</select>
</mapper> </mapper>

View File

@@ -121,6 +121,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim> </trim>
</insert> </insert>
<select id="selectCount" resultType="java.lang.Integer">
select count(1)
from tsj_device_execution_queue
</select>
<update id="updateTsjDeviceExecutionQueue" parameterType="TsjDeviceExecutionQueue"> <update id="updateTsjDeviceExecutionQueue" parameterType="TsjDeviceExecutionQueue">
update tsj_device_execution_queue update tsj_device_execution_queue
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">

View File

@@ -85,7 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectWcsSrgvQueueByFloor" parameterType="String" resultMap="WcsSrgvQueueResult"> <select id="selectWcsSrgvQueueByFloor" parameterType="String" resultMap="WcsSrgvQueueResult">
<include refid="selectWcsSrgvQueueVo"/> <include refid="selectWcsSrgvQueueVo"/>
where default07 =#{theFloor} where default07 =#{theFloor} and default07 !='1'
</select> </select>
<insert id="insertWcsSrgvQueue" parameterType="WcsSrgvQueue"> <insert id="insertWcsSrgvQueue" parameterType="WcsSrgvQueue">
@@ -192,4 +192,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach> </foreach>
</delete> </delete>
<select id="selectMinCountJob" parameterType="list" resultType="string">
<choose>
<when test="list == null or list.size() == 0">
SELECT '' AS result_site
</when>
<otherwise>
select top(1) site_id from
(select '050101' as site_id,isnull(count(1),0) as num from wcs_srgv_queue where cargo_place_site ='050101'
union
select '070101' as site_id,isnull(count(1),0) as num from wcs_srgv_queue where cargo_place_site ='070101')r
where r.site_id in
<foreach collection="list" item="site" open="(" separator="," close=")">
#{site}
</foreach>
order by num
</otherwise>
</choose>
</select>
<select id="selectTsj" resultType="java.lang.Integer" >
select count(1) from wcs_srgv_queue where end_site='tsj'
</select>
<select id="selectByCaogoPlaceSite" resultType="java.lang.Integer" parameterType="string">
select count(1) from wcs_srgv_queue where cargo_place_site=#{siteId}
</select>
</mapper> </mapper>