现场调度修改
This commit is contained in:
@@ -10,6 +10,7 @@ import lombok.NoArgsConstructor;
|
||||
public class ReceiveJob {
|
||||
private String taskNo;
|
||||
private String cargoSpaceId;
|
||||
private String targetCargoSpaceId;
|
||||
private String exitId;
|
||||
private String trayCode;
|
||||
private String entranceId;
|
||||
@@ -17,5 +18,6 @@ public class ReceiveJob {
|
||||
private String jobId;
|
||||
private String roadwayId;
|
||||
private String classId;
|
||||
private Long priority;
|
||||
|
||||
}
|
||||
|
||||
@@ -353,6 +353,7 @@ public class ApiServiceImpl implements IApiService {
|
||||
mydoJob.setJobId(receiveOutJob.getJobId());
|
||||
mydoJob.setTaskNo(receiveOutJob.getTaskNo());
|
||||
mydoJob.setCargoSpaceId(receiveOutJob.getCargoSpaceId());
|
||||
mydoJob.setTargetCargoSpaceId(receiveOutJob.getTargetCargoSpaceId());
|
||||
mydoJob.setExitId(receiveOutJob.getExitId());
|
||||
mydoJob.setInOrOut(receiveOutJob.getInOrOut());
|
||||
mydoJob.setStatus("1");
|
||||
@@ -361,6 +362,7 @@ public class ApiServiceImpl implements IApiService {
|
||||
mydoJob.setCreateTime(DateUtils.getNowDate());
|
||||
mydoJob.setExecutionPhase("0");
|
||||
mydoJob.setTheFloor(receiveOutJob.getClassId());
|
||||
mydoJob.setPriority(receiveOutJob.getPriority());
|
||||
int i = mydoJobService.insertMydoJob(mydoJob);
|
||||
if (i > 0) {
|
||||
return AjaxResult.success();
|
||||
|
||||
@@ -81,4 +81,12 @@ public interface MydoJobMapper
|
||||
List<MydoJob> selectMydoJobFinishList(MydoJob mydoJob);
|
||||
|
||||
MydoJob selectRunningMydoJobByExitList(@Param("exitList") List<String> exitList);
|
||||
|
||||
List<MydoJob> selectMydoJobOut();
|
||||
|
||||
MydoJob selectMydoJobByTrayCode(String trayCode);
|
||||
|
||||
Integer selectExit(String ssj);
|
||||
|
||||
Integer selectMydoJobCount();
|
||||
}
|
||||
|
||||
@@ -80,4 +80,12 @@ public interface IMydoJobService
|
||||
MydoJob selectRunningMydoJobByExitList(List<String> strings);
|
||||
|
||||
AjaxResult manualCallback(String jobId);
|
||||
|
||||
List<MydoJob> selectMydoJobOut();
|
||||
|
||||
MydoJob selectMydoJobByTrayCode(String trayCode);
|
||||
|
||||
Integer selectExit(String ssj);
|
||||
|
||||
Integer selectMydoJobCount();
|
||||
}
|
||||
|
||||
@@ -173,4 +173,24 @@ public class MydoJobServiceImpl implements IMydoJobService
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,4 +73,6 @@ public interface WcsSrgvQueueMapper
|
||||
public int deleteWcsSrgvQueueByGuids(String[] guids);
|
||||
|
||||
String selectMinCountJob(@Param("list") List<String> outModelSSJ);
|
||||
|
||||
Integer selectTsj();
|
||||
}
|
||||
|
||||
@@ -79,4 +79,6 @@ public interface IWcsSrgvQueueService
|
||||
public WcsSrgvQueue insertHistory(String taskNo);
|
||||
|
||||
String selectMinCountJob(List<String> outModelSSJ);
|
||||
|
||||
Integer selectTsj();
|
||||
}
|
||||
|
||||
@@ -120,6 +120,12 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
|
||||
return wcsSrgvQueueMapper.selectMinCountJob(outModelSSJ) ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer selectTsj() {
|
||||
|
||||
return wcsSrgvQueueMapper.selectTsj();
|
||||
}
|
||||
|
||||
@Override
|
||||
public WcsSrgvQueue insertHistory(String taskNo) {
|
||||
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo);
|
||||
|
||||
@@ -65,4 +65,6 @@ public interface TsjDeviceExecutionQueueMapper
|
||||
* @return 提升机执行队列
|
||||
*/
|
||||
TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo);
|
||||
|
||||
Integer selectCount();
|
||||
}
|
||||
|
||||
@@ -64,4 +64,6 @@ public interface ITsjDeviceExecutionQueueService
|
||||
* @return
|
||||
*/
|
||||
TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo);
|
||||
|
||||
Integer selectCount();
|
||||
}
|
||||
|
||||
@@ -104,5 +104,10 @@ public class TsjDeviceExecutionQueueServiceImpl implements ITsjDeviceExecutionQu
|
||||
return tsjDeviceExecutionQueueMapper.selectTsjDeviceExecutionQueueByRwh(taskNo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer selectCount() {
|
||||
return tsjDeviceExecutionQueueMapper.selectCount();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -177,7 +177,7 @@ public class ScheduleThread {
|
||||
*/
|
||||
public void startAllThread() {
|
||||
plcSsjReadCustomThread.getThread().start();
|
||||
plcSrgvReadCustomThread1.getThread().start();
|
||||
//plcSrgvReadCustomThread1.getThread().start();
|
||||
plcSrgvReadCustomThread2.getThread().start();
|
||||
plcSrgvReadCustomThread3.getThread().start();
|
||||
plcTsjReadCustomThread.getThread().start();
|
||||
|
||||
@@ -13,6 +13,8 @@ import com.ruoyi.device.srgv.domain.DeviceSrgv;
|
||||
import com.ruoyi.device.srgv.service.IDeviceSrgvService;
|
||||
import com.ruoyi.job.charg.domain.SrgvChargingJob;
|
||||
import com.ruoyi.job.charg.service.ISrgvChargingJobService;
|
||||
import com.ruoyi.job.mapper.MydoJobMapper;
|
||||
import com.ruoyi.job.service.IMydoJobService;
|
||||
import com.ruoyi.queue.srgv.domain.WcsSrgvQueue;
|
||||
import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService;
|
||||
import com.ruoyi.schedule.plcRead.cdz.PlcCdzRead;
|
||||
@@ -33,18 +35,20 @@ public class CdzThread implements Runnable {
|
||||
public boolean isRun = true;
|
||||
|
||||
private final Integer LITTLE_BETTERY = 30;
|
||||
private final Integer MIDDLE_BETTERY = 70;
|
||||
|
||||
private final Integer MIDDLE_BETTERY = 60;
|
||||
private final Integer MAX_BETTERY = 90;
|
||||
private ISrgvChargingJobService chargingJobService;
|
||||
private IDeviceCdzService deviceCdzService;
|
||||
private IDeviceSrgvService deviceSrgvService;
|
||||
private IWcsSrgvQueueService wcsSrgvQueueService;
|
||||
public IMydoJobService mydoJobService;
|
||||
|
||||
public void init() {
|
||||
chargingJobService = SpringUtils.getBean(ISrgvChargingJobService.class);
|
||||
deviceCdzService = SpringUtils.getBean(IDeviceCdzService.class);
|
||||
deviceSrgvService = SpringUtils.getBean(IDeviceSrgvService.class);
|
||||
wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class);
|
||||
mydoJobService = SpringUtils.getBean(IMydoJobService.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -71,7 +75,7 @@ public class CdzThread implements Runnable {
|
||||
List<DeviceSrgv> middleBatterySRgv = new ArrayList<>();
|
||||
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
|
||||
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) {
|
||||
littleBatterySRgv.add(deviceSrgv);
|
||||
} else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY) {
|
||||
@@ -128,38 +132,50 @@ public class CdzThread implements Runnable {
|
||||
|
||||
}
|
||||
|
||||
|
||||
//生成断电任务 有任务且电量大于50 todo 代码无效
|
||||
WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue();
|
||||
wcsSrgvQueueParam.setIssued("0");
|
||||
List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam);
|
||||
if (CollUtil.isNotEmpty(wcsSrgvQueues)) {
|
||||
boolean existsKxSRgv = false;
|
||||
//判断有没有空闲小车
|
||||
for (DeviceSrgv x : PlcSrgvRead.deviceSrgvMap.values()) {
|
||||
if (x.getWorkMode() == 5 && x.getStatus() == 1) {
|
||||
existsKxSRgv = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!existsKxSRgv) {
|
||||
List<DeviceCdz> deviceCdzs = deviceCdzService.selectDeviceCdzHasSRgvList();
|
||||
if (CollUtil.isNotEmpty(deviceCdzs)) {
|
||||
for (DeviceCdz deviceCdz : deviceCdzs) {
|
||||
if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1())) {
|
||||
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1());
|
||||
if (deviceSrgv.getBattery() >= 50) {
|
||||
//生成断电任务
|
||||
createChargingOutJob(deviceSrgv, deviceCdz);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Integer count = mydoJobService.selectMydoJobCount();
|
||||
List<DeviceCdz> deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList();
|
||||
for (DeviceCdz deviceCdz : deviceCdzdd) {
|
||||
if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1())
|
||||
&& ((PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getBattery() >= MIDDLE_BETTERY && count > 0) || PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getBattery() >= MAX_BETTERY)
|
||||
&& PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getWorkMode() == 5
|
||||
&& PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()).getChargeFlag() == 2 && deviceCdz.getStatus() == 1) {
|
||||
createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// //生成断电任务 有任务且电量大于50 todo 代码无效
|
||||
// WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue();
|
||||
// wcsSrgvQueueParam.setIssued("0");
|
||||
// List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam);
|
||||
// if (CollUtil.isNotEmpty(wcsSrgvQueues)) {
|
||||
// boolean existsKxSRgv = false;
|
||||
// //判断有没有空闲小车
|
||||
// for (DeviceSrgv x : PlcSrgvRead.deviceSrgvMap.values()) {
|
||||
// if (x.getWorkMode() == 5 && x.getStatus() == 1) {
|
||||
// existsKxSRgv = true;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// if (!existsKxSRgv) {
|
||||
// List<DeviceCdz> deviceCdzs = deviceCdzService.selectDeviceCdzHasSRgvList();
|
||||
// if (CollUtil.isNotEmpty(deviceCdzs)) {
|
||||
// for (DeviceCdz deviceCdz : deviceCdzs) {
|
||||
// if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1())) {
|
||||
// DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1());
|
||||
// if (deviceSrgv.getBattery() >= 50) {
|
||||
// //生成断电任务
|
||||
// createChargingOutJob(deviceSrgv, deviceCdz);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
//断电任务下发
|
||||
SrgvChargingJob srgvChargingJobDdParam = new SrgvChargingJob();
|
||||
srgvChargingJobDdParam.setChargingStatus("0");
|
||||
@@ -212,7 +228,7 @@ public class CdzThread implements Runnable {
|
||||
//寻找最接近的充电桩
|
||||
Integer floor = deviceSrgv.getCurrFloor();
|
||||
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 distance2 = Math.abs(o2.getSzcs());
|
||||
return distance1 - distance2;
|
||||
@@ -265,7 +281,7 @@ public class CdzThread implements Runnable {
|
||||
srgvChargingJobParamOut.setJobType("2");
|
||||
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);
|
||||
|
||||
//插入历史
|
||||
|
||||
@@ -61,6 +61,7 @@ public class MonitoringThread implements Runnable {
|
||||
}
|
||||
for (String cdzCode : PlcCdzRead.deviceCdzMap.keySet()) {
|
||||
DeviceCdz deviceCdz = PlcCdzRead.deviceCdzMap.get(cdzCode);
|
||||
deviceCdz.setSpare1(null);
|
||||
deviceCdzService.updateDeviceCdz(deviceCdz);
|
||||
}
|
||||
try {
|
||||
|
||||
@@ -32,8 +32,10 @@ import com.ruoyi.schedule.ScheduleThread;
|
||||
import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead;
|
||||
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 java.sql.Struct;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
@@ -111,7 +113,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
||||
createCarInQueue();
|
||||
// 出库队列
|
||||
createCarOutQueue();
|
||||
// 充电任务
|
||||
// 充电任务队列
|
||||
inCharging(deviceSrgv);
|
||||
// 充电完成调离
|
||||
// outCharging(deviceSrgv);
|
||||
@@ -184,8 +186,14 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
||||
} else {
|
||||
wcsSrgvQueue.setEndSite("tsj");
|
||||
wcsSrgvQueue.setDefault02("8");
|
||||
// if (endSite.equals("tsj")){
|
||||
Integer count = wcsSagvQueueMapper.selectTsj();
|
||||
if (count > 0) {
|
||||
return;
|
||||
}
|
||||
// }
|
||||
}
|
||||
wcsSrgvQueue.setTaskNo("9999");
|
||||
wcsSrgvQueue.setTaskNo(String.valueOf(deviceSrgv.getDeviceId() + 500));
|
||||
wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString());
|
||||
wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
|
||||
wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString());
|
||||
@@ -214,173 +222,240 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
||||
* 生成出库小车队列
|
||||
*/
|
||||
private void createCarOutQueue() {
|
||||
MydoJob mydoJob = new MydoJob();
|
||||
mydoJob.setInOut("2");
|
||||
mydoJob.setExecutionPhase("0");
|
||||
mydoJob.setStatus("1");
|
||||
List<MydoJob> mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob);
|
||||
// MydoJob mydoJob = new MydoJob();
|
||||
// mydoJob.setInOut("2");
|
||||
// mydoJob.setExecutionPhase("0");
|
||||
// mydoJob.setStatus("1");
|
||||
// List<MydoJob> mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob);
|
||||
|
||||
|
||||
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobOut();
|
||||
|
||||
if (!mydoJobs.isEmpty()) {
|
||||
MydoJob mydoJob1 = mydoJobs.get(0);
|
||||
// 查询是否有已下发的该任务号队列
|
||||
WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo());
|
||||
if (wcsSrgvQueue1 == null) {
|
||||
ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
|
||||
List<DeviceSrgv> deviceSrgvList = deviceSrgvMap.values().stream()
|
||||
.filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5)
|
||||
.filter(deviceSrgv -> deviceSrgv.getBattery() > 30)
|
||||
.sorted((d1, d2) -> Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d2.getCurrFloor())
|
||||
- Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d1.getCurrFloor()))
|
||||
.collect(Collectors.toList());
|
||||
if (!deviceSrgvList.isEmpty()) {
|
||||
DeviceSrgv deviceSrgv = null;
|
||||
for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
|
||||
//优先出库层,如果没有优先邻近层
|
||||
if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
|
||||
deviceSrgv = deviceSrgv1;
|
||||
break;
|
||||
} else if (deviceSrgv == null || (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv1.getCurrFloor())) < (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv.getCurrFloor()))) {
|
||||
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
|
||||
if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
|
||||
for (MydoJob mydoJob1 : mydoJobs) {
|
||||
WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo());
|
||||
if (wcsSrgvQueue1 == null) {
|
||||
ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
|
||||
List<DeviceSrgv> deviceSrgvList = deviceSrgvMap.values().stream()
|
||||
.filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 1)
|
||||
.filter(deviceSrgv -> deviceSrgv.getBattery() > 30)
|
||||
.sorted((d1, d2) -> Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d2.getCurrFloor())
|
||||
- Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - d1.getCurrFloor()))
|
||||
.collect(Collectors.toList());
|
||||
if (!deviceSrgvList.isEmpty()) {
|
||||
DeviceSrgv deviceSrgv = null;
|
||||
/*for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
|
||||
//优先出库层,如果没有优先邻近层
|
||||
if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
|
||||
deviceSrgv = deviceSrgv1;
|
||||
break;
|
||||
} else if (deviceSrgv == null || (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv1.getCurrFloor())) < (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv.getCurrFloor()))) {
|
||||
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
|
||||
if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
|
||||
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));
|
||||
|
||||
// 计算当前小车到取货点的曼哈顿距离
|
||||
int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY);
|
||||
|
||||
// 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车
|
||||
if (tempZ < z) {
|
||||
z = tempZ; // 把z更新为当前更小的距离
|
||||
deviceSrgv = srgv; // 记录这个更近的小车
|
||||
log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (deviceSrgv != null) {
|
||||
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString());
|
||||
WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor());
|
||||
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 (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) {
|
||||
//查询小车是否为取货楼层
|
||||
String endSite = "";
|
||||
String issued = "0";
|
||||
String executionStatus = "1";
|
||||
String default08 = "";//是否二段任务标识
|
||||
String default06 = "";
|
||||
WcsSrgvMap wcsSrgvMap = new WcsSrgvMap();
|
||||
wcsSrgvMap.setCargoSpaceId(mydoJob1.getCargoSpaceId());
|
||||
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap);
|
||||
//取货地址
|
||||
String cargoPickSite = wcsSrgvMaps.get(0).getSiteId();
|
||||
Integer currFloor = deviceSrgv.getCurrFloor();
|
||||
Integer theLayer = wcsSrgvMaps.get(0).getPlcLayer();
|
||||
if (Objects.equals(deviceSrgv.getCurrFloor(), wcsSrgvMaps.get(0).getPlcLayer())) {
|
||||
//终点是巷道口到位输送线
|
||||
endSite = cargoPickSite;
|
||||
//生成队列时插入二段下发标识和第二段任务终点
|
||||
String groupCodingNo = basCargoSpaceService.selecGroupCodingBySite(endSite);
|
||||
String siteId = basCargoSpaceService.selectMaxSiteIdByNo(groupCodingNo);
|
||||
if (!endSite.equals(siteId) && !deviceSrgv.getCurrSite().equals(endSite)) {
|
||||
default08 = "1";
|
||||
default06 = siteId;
|
||||
}
|
||||
if (cargoPickSite.equals(deviceSrgv.getCurrSite())) {
|
||||
issued = "1";
|
||||
executionStatus = "3";
|
||||
}
|
||||
} else {
|
||||
//终点是提升机
|
||||
endSite = "tsj";
|
||||
}
|
||||
WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap();
|
||||
String cargoPlaceSite ="";
|
||||
ConcurrentHashMap<String, DeviceSsj> deviceSsjMap = PlcSsjRead.deviceSsjMap;
|
||||
List<String> outModelSSJ=new ArrayList<>();
|
||||
for (String deviceSsj : deviceSsjMap.keySet()) {
|
||||
if (deviceSsj.equals("TD1001")||deviceSsj.equals("TD1008")) {
|
||||
DeviceSsj deviceSsj1=deviceSsjMap.get(deviceSsj);
|
||||
if (deviceSsj1.getModel()==2){
|
||||
String s="";
|
||||
if (deviceSsj1.equals("TD1001")){
|
||||
s="050101";
|
||||
}else {
|
||||
s="070101";
|
||||
}
|
||||
outModelSSJ.add(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
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()
|
||||
.filter(d -> d.getWorkMode() == 5
|
||||
&& d.getStatus() == 1
|
||||
&& d.getCurrSite().equals(cargoPlaceSite1))
|
||||
.collect(Collectors.toList());
|
||||
if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) {
|
||||
WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap();
|
||||
wcsSrgvMap3.setRemark("cache");
|
||||
List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3);
|
||||
for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) {
|
||||
//deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象
|
||||
if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) {
|
||||
//生成小车到缓存点队列
|
||||
WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString());
|
||||
WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
|
||||
wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
|
||||
List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue);
|
||||
if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) {
|
||||
WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue();
|
||||
wcsSrgvQueue3.setGuid(UUID.randomUUID().toString());
|
||||
wcsSrgvQueue3.setTaskNo("9999");
|
||||
wcsSrgvQueue3.setTaskType("1");
|
||||
wcsSrgvQueue3.setPriority(Long.parseLong("2"));
|
||||
wcsSrgvQueue3.setCargo("1");
|
||||
wcsSrgvQueue3.setIssued(issued);
|
||||
wcsSrgvQueue3.setExecutionStatus(executionStatus);
|
||||
wcsSrgvQueue3.setCargoPickSite(cargoPickSite);
|
||||
wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
|
||||
wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite());
|
||||
wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId());
|
||||
wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString());
|
||||
wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
|
||||
wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString());
|
||||
wcsSrgvQueue3.setDefault02("4");
|
||||
wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString());
|
||||
wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3);
|
||||
}
|
||||
}
|
||||
if (deviceSrgv != null) {
|
||||
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString());
|
||||
WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor());
|
||||
|
||||
if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) {
|
||||
//查询小车是否为取货楼层
|
||||
String endSite = "";
|
||||
String issued = "0";
|
||||
String executionStatus = "1";
|
||||
String default08 = "";//是否二段任务标识
|
||||
String default06 = "";
|
||||
|
||||
Integer currFloor = deviceSrgv.getCurrFloor();
|
||||
Integer theLayer = wcsSrgvMaps.get(0).getPlcLayer();
|
||||
if (Objects.equals(deviceSrgv.getCurrFloor(), wcsSrgvMaps.get(0).getPlcLayer())) {
|
||||
//终点是巷道口到位输送线
|
||||
endSite = cargoPickSite;
|
||||
//生成队列时插入二段下发标识和第二段任务终点
|
||||
String groupCodingNo = basCargoSpaceService.selecGroupCodingBySite(endSite);
|
||||
String siteId = basCargoSpaceService.selectMaxSiteIdByNo(groupCodingNo);
|
||||
if (!endSite.equals(siteId) && !deviceSrgv.getCurrSite().equals(endSite)) {
|
||||
default08 = "1";
|
||||
default06 = siteId;
|
||||
}
|
||||
if (cargoPickSite.equals(deviceSrgv.getCurrSite())) {
|
||||
issued = "1";
|
||||
executionStatus = "3";
|
||||
}
|
||||
} else {
|
||||
//终点是提升机
|
||||
endSite = "tsj";
|
||||
}
|
||||
if (endSite.equals("tsj")) {
|
||||
Integer count = wcsSagvQueueMapper.selectTsj();
|
||||
if (count > 0) {
|
||||
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) {
|
||||
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()
|
||||
.filter(d -> d.getWorkMode() == 5
|
||||
&& d.getStatus() == 1
|
||||
&& d.getCurrSite().equals(cargoPlaceSite1))
|
||||
.collect(Collectors.toList());
|
||||
if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) {
|
||||
WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap();
|
||||
wcsSrgvMap3.setRemark("cache");
|
||||
// List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3);
|
||||
// for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) {
|
||||
// //deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象
|
||||
// if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) {
|
||||
// //生成小车到缓存点队列
|
||||
// WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString());
|
||||
// WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
|
||||
// wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
|
||||
// List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue);
|
||||
// if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) {
|
||||
// WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue();
|
||||
// wcsSrgvQueue3.setGuid(UUID.randomUUID().toString());
|
||||
// wcsSrgvQueue3.setTaskNo("11111");
|
||||
// wcsSrgvQueue3.setTaskType("1");
|
||||
// wcsSrgvQueue3.setPriority(Long.parseLong("2"));
|
||||
// wcsSrgvQueue3.setCargo("1");
|
||||
// wcsSrgvQueue3.setIssued(issued);
|
||||
// wcsSrgvQueue3.setExecutionStatus(executionStatus);
|
||||
// wcsSrgvQueue3.setCargoPickSite(cargoPickSite);
|
||||
// wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
|
||||
// wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite());
|
||||
// wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId());
|
||||
// wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString());
|
||||
// wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
|
||||
// wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString());
|
||||
// wcsSrgvQueue3.setDefault02("4");
|
||||
// wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString());
|
||||
// wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
//生成小车取货队列
|
||||
WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
|
||||
wcsSrgvQueue.setGuid(UUID.randomUUID().toString());
|
||||
wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo());
|
||||
wcsSrgvQueue.setTaskType("1");
|
||||
wcsSrgvQueue.setPriority(Long.parseLong("2"));
|
||||
wcsSrgvQueue.setCargo("1");
|
||||
wcsSrgvQueue.setIssued(issued);
|
||||
wcsSrgvQueue.setExecutionStatus(executionStatus);
|
||||
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.setStartSite(deviceSrgv.getCurrSite());
|
||||
wcsSrgvQueue.setEndSite(endSite);
|
||||
wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString());
|
||||
wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
|
||||
wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString());
|
||||
if (endSite.equals("tsj")) {
|
||||
wcsSrgvQueue.setDefault02("8");
|
||||
mydoJob1.setExitId(null);
|
||||
mydoJobService.updateMydoJob(mydoJob1);
|
||||
} else {
|
||||
wcsSrgvQueue.setDefault02("4");
|
||||
}
|
||||
String cargoSpaceId = mydoJob1.getCargoSpaceId();
|
||||
String tarFloor = cargoSpaceId.substring(5, 6);
|
||||
wcsSrgvQueue.setDefault07(tarFloor);
|
||||
wcsSrgvQueue.setDefault08(default08);
|
||||
wcsSrgvQueue.setDefault06(default06);
|
||||
wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue);
|
||||
}
|
||||
|
||||
|
||||
//生成小车取货队列
|
||||
WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
|
||||
wcsSrgvQueue.setGuid(UUID.randomUUID().toString());
|
||||
wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo());
|
||||
wcsSrgvQueue.setTaskType("1");
|
||||
wcsSrgvQueue.setPriority(Long.parseLong("2"));
|
||||
wcsSrgvQueue.setCargo("1");
|
||||
wcsSrgvQueue.setIssued(issued);
|
||||
wcsSrgvQueue.setExecutionStatus(executionStatus);
|
||||
wcsSrgvQueue.setCargoPickSite(cargoPickSite);
|
||||
|
||||
wcsSrgvQueue.setCargoPlaceSite(cargoPlaceSite);
|
||||
wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite());
|
||||
wcsSrgvQueue.setEndSite(endSite);
|
||||
wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString());
|
||||
wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
|
||||
wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString());
|
||||
if (endSite.equals("tsj")) {
|
||||
wcsSrgvQueue.setDefault02("8");
|
||||
} else {
|
||||
wcsSrgvQueue.setDefault02("4");
|
||||
}
|
||||
String cargoSpaceId = mydoJob1.getCargoSpaceId();
|
||||
String tarFloor = cargoSpaceId.substring(5, 6);
|
||||
wcsSrgvQueue.setDefault07(tarFloor);
|
||||
wcsSrgvQueue.setDefault08(default08);
|
||||
wcsSrgvQueue.setDefault06(default06);
|
||||
wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -394,150 +469,186 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
||||
mydoJob.setInOut("1");
|
||||
List<MydoJob> mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob);
|
||||
if (!mydoJobs.isEmpty()) {
|
||||
MydoJob mydoJob1 = mydoJobs.get(0);
|
||||
// 查询是否有已下发的该任务号队列
|
||||
WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo());
|
||||
for (MydoJob mydoJob1 : mydoJobs) {
|
||||
// 查询是否有已下发的该任务号队列
|
||||
WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo());
|
||||
|
||||
if (wcsSrgvQueue1 == null) {
|
||||
ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
|
||||
if (wcsSrgvQueue1 == null) {
|
||||
ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
|
||||
|
||||
List<DeviceSrgv> deviceSrgvList = deviceSrgvMap.values().stream()
|
||||
.filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5)
|
||||
.filter(deviceSrgv -> deviceSrgv.getBattery() > 30)
|
||||
.filter(deviceSrgv -> deviceSrgv.getCurrFloor() > 0)
|
||||
.sorted((d1, d2) -> d2.getCurrFloor().compareTo(d1.getCurrFloor()))
|
||||
.collect(Collectors.toList());
|
||||
List<DeviceSrgv> deviceSrgvList = deviceSrgvMap.values().stream()
|
||||
.filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5)
|
||||
.filter(deviceSrgv -> deviceSrgv.getBattery() > 30)
|
||||
.filter(deviceSrgv -> deviceSrgv.getCurrFloor() > 0)
|
||||
.filter(deviceSrgv -> deviceSrgv.getStatus() == 1)
|
||||
.sorted((d1, d2) -> d2.getCurrFloor().compareTo(d1.getCurrFloor()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
log.info("list:{}", deviceSrgvList);
|
||||
log.info("list:{}", deviceSrgvList);
|
||||
|
||||
if (!deviceSrgvList.isEmpty()) {
|
||||
DeviceSrgv deviceSrgv = null;
|
||||
for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
|
||||
if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
|
||||
deviceSrgv = deviceSrgv1;
|
||||
log.info("楼层相等:{}", deviceSrgv);
|
||||
break; // 找到了相同楼层的直接选它
|
||||
} else {
|
||||
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
|
||||
if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
|
||||
deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车
|
||||
log.info("楼层bu相等:{}", deviceSrgv);
|
||||
if (!deviceSrgvList.isEmpty()) {
|
||||
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 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));
|
||||
|
||||
// 计算当前小车到取货点的曼哈顿距离
|
||||
int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY);
|
||||
|
||||
// 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车
|
||||
if (tempZ < z) {
|
||||
z = tempZ; // 把z更新为当前更小的距离
|
||||
deviceSrgv = srgv; // 记录这个更近的小车
|
||||
log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (deviceSrgv == null) {
|
||||
//如果未选择到小车,再找其他楼层的小车
|
||||
for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
|
||||
if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
|
||||
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
|
||||
if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
|
||||
deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车
|
||||
log.info("楼层bu相等:{}", deviceSrgv);
|
||||
|
||||
if (deviceSrgv != null) {
|
||||
|
||||
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString());
|
||||
WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor());
|
||||
|
||||
if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1 && wcsSrgvQueue4 == null) {
|
||||
|
||||
//查询小车是否为1楼,且1楼小车不在入库站点
|
||||
String endSite = "";
|
||||
String issued = "0";
|
||||
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) {
|
||||
endSite = cargoPickSite;
|
||||
if (cargoPickSite.equals(deviceSrgv.getCurrSite())) {
|
||||
// 小车已在取货点
|
||||
issued = "1";
|
||||
executionStatus = "3";
|
||||
}
|
||||
} else {
|
||||
// 小车不在1楼
|
||||
endSite = "tsj";
|
||||
}
|
||||
//筛选出deviceSrgvMap中deviceSrgv.getWorkMode() == 4并且deviceSrgv.getStatus() == 1并且deviceSrgv.getCurrSite() == cargoPickSite得对象,并排除掉其中deviceId与deviceSrgv.getDeviceId()相同的对象
|
||||
|
||||
List<DeviceSrgv> sameSiteDevices = deviceSrgvMap.values().stream()
|
||||
.filter(d -> d.getWorkMode() == 5
|
||||
&& d.getStatus() == 1
|
||||
&& d.getCurrSite().equals(cargoPickSite))
|
||||
.collect(Collectors.toList());
|
||||
if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) {
|
||||
WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap();
|
||||
wcsSrgvMap3.setRemark("cache");
|
||||
List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3);
|
||||
for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) {
|
||||
//deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象
|
||||
if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) {
|
||||
WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString());
|
||||
WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
|
||||
wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
|
||||
List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue);
|
||||
if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) {
|
||||
//生成占位小车到缓存点队列
|
||||
WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue();
|
||||
wcsSrgvQueue3.setGuid(UUID.randomUUID().toString());
|
||||
wcsSrgvQueue3.setTaskNo(String.valueOf(taskCache));
|
||||
wcsSrgvQueue3.setTaskType("1");
|
||||
wcsSrgvQueue3.setPriority(Long.parseLong("2"));
|
||||
wcsSrgvQueue3.setCargo("1");
|
||||
wcsSrgvQueue3.setIssued(issued);
|
||||
wcsSrgvQueue3.setExecutionStatus(executionStatus);
|
||||
wcsSrgvQueue3.setCargoPickSite(cargoPickSite);
|
||||
wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
|
||||
wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite());
|
||||
wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId());
|
||||
wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString());
|
||||
wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
|
||||
wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString());
|
||||
wcsSrgvQueue3.setDefault02("4");
|
||||
wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString());
|
||||
wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3);
|
||||
taskCache++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
if (deviceSrgv != null) {
|
||||
|
||||
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString());
|
||||
WcsSrgvQueue wcsSrgvQueue4 = wcsSagvQueueMapper.selectWcsSrgvQueueByFloor(mydoJob1.getTheFloor());
|
||||
|
||||
if (wcsSrgvQueue2 == null && deviceSrgv.getStatus() == 1
|
||||
// && wcsSrgvQueue4 == null
|
||||
) {
|
||||
|
||||
//查询小车是否为1楼,且1楼小车不在入库站点
|
||||
String endSite = "";
|
||||
String issued = "0";
|
||||
String executionStatus = "1";
|
||||
|
||||
|
||||
//生成小车取货队列
|
||||
WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
|
||||
wcsSrgvQueue.setGuid(UUID.randomUUID().toString());
|
||||
wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo());
|
||||
wcsSrgvQueue.setTaskType("1");
|
||||
wcsSrgvQueue.setPriority(Long.parseLong("2"));
|
||||
wcsSrgvQueue.setCargo("1");
|
||||
wcsSrgvQueue.setIssued(issued);
|
||||
wcsSrgvQueue.setExecutionStatus(executionStatus);
|
||||
wcsSrgvQueue.setCargoPickSite(cargoPickSite);
|
||||
WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap();
|
||||
wcsSrgvMap1.setCargoSpaceId(mydoJob1.getCargoSpaceId());
|
||||
List<WcsSrgvMap> wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1);
|
||||
wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMaps1.get(0).getSiteId());
|
||||
wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite());
|
||||
wcsSrgvQueue.setEndSite(endSite);
|
||||
wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString());
|
||||
wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
|
||||
wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString());
|
||||
if (endSite.equals("tsj")) {
|
||||
wcsSrgvQueue.setDefault02("8");
|
||||
} else {
|
||||
wcsSrgvQueue.setDefault02("4");
|
||||
if (deviceSrgv.getCurrFloor() == 1) {
|
||||
endSite = cargoPickSite;
|
||||
if (cargoPickSite.equals(deviceSrgv.getCurrSite())) {
|
||||
// 小车已在取货点
|
||||
issued = "1";
|
||||
executionStatus = "3";
|
||||
}
|
||||
} else {
|
||||
// 小车不在1楼
|
||||
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()相同的对象
|
||||
|
||||
List<DeviceSrgv> sameSiteDevices = deviceSrgvMap.values().stream()
|
||||
.filter(d -> d.getWorkMode() == 5
|
||||
&& d.getStatus() == 1
|
||||
&& d.getCurrSite().equals(cargoPickSite))
|
||||
.collect(Collectors.toList());
|
||||
if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) {
|
||||
WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap();
|
||||
wcsSrgvMap3.setRemark("cache");
|
||||
List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3);
|
||||
for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) {
|
||||
//deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象
|
||||
//todo
|
||||
// if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) {
|
||||
// WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString());
|
||||
// WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
|
||||
// wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
|
||||
// List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue);
|
||||
// if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) {
|
||||
// //生成占位小车到缓存点队列
|
||||
// WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue();
|
||||
// wcsSrgvQueue3.setGuid(UUID.randomUUID().toString());
|
||||
// wcsSrgvQueue3.setTaskNo(String.valueOf(taskCache));
|
||||
// wcsSrgvQueue3.setTaskType("1");
|
||||
// wcsSrgvQueue3.setPriority(Long.parseLong("2"));
|
||||
// wcsSrgvQueue3.setCargo("1");
|
||||
// wcsSrgvQueue3.setIssued(issued);
|
||||
// wcsSrgvQueue3.setExecutionStatus(executionStatus);
|
||||
// wcsSrgvQueue3.setCargoPickSite(cargoPickSite);
|
||||
// wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
|
||||
// wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite());
|
||||
// wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId());
|
||||
// wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString());
|
||||
// wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
|
||||
// wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString());
|
||||
// wcsSrgvQueue3.setDefault02("4");
|
||||
// wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString());
|
||||
// wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3);
|
||||
// taskCache++;
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//生成小车取货队列
|
||||
WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
|
||||
wcsSrgvQueue.setGuid(UUID.randomUUID().toString());
|
||||
wcsSrgvQueue.setTaskNo(mydoJob1.getTaskNo());
|
||||
wcsSrgvQueue.setTaskType("1");
|
||||
wcsSrgvQueue.setPriority(Long.parseLong("2"));
|
||||
wcsSrgvQueue.setCargo("1");
|
||||
wcsSrgvQueue.setIssued(issued);
|
||||
wcsSrgvQueue.setExecutionStatus(executionStatus);
|
||||
wcsSrgvQueue.setCargoPickSite(cargoPickSite);
|
||||
WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap();
|
||||
wcsSrgvMap1.setCargoSpaceId(mydoJob1.getCargoSpaceId());
|
||||
List<WcsSrgvMap> wcsSrgvMaps1 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap1);
|
||||
wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMaps1.get(0).getSiteId());
|
||||
wcsSrgvQueue.setStartSite(deviceSrgv.getCurrSite());
|
||||
wcsSrgvQueue.setEndSite(endSite);
|
||||
wcsSrgvQueue.setTheFloor(deviceSrgv.getCurrFloor().toString());
|
||||
wcsSrgvQueue.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
|
||||
wcsSrgvQueue.setAgvId(deviceSrgv.getDeviceId().toString());
|
||||
if (endSite.equals("tsj")) {
|
||||
wcsSrgvQueue.setDefault02("8");
|
||||
} else {
|
||||
wcsSrgvQueue.setDefault02("4");
|
||||
}
|
||||
wcsSrgvQueue.setDefault07("1");
|
||||
wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue);
|
||||
|
||||
}
|
||||
wcsSrgvQueue.setDefault07("1");
|
||||
wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -867,7 +978,9 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
||||
|
||||
}
|
||||
|
||||
if (wcsSrgvQueue.getDefault08().equals("2") && deviceSrgv.getSpare5().equals("1")) {
|
||||
if (wcsSrgvQueue.getDefault08().equals("2")
|
||||
&& deviceSrgv.getSpare5().equals("1")
|
||||
) {
|
||||
sendDataList = new ArrayList<>();
|
||||
SendData2 path = new SendData2();
|
||||
path.setAddress("4404");//地址
|
||||
@@ -926,7 +1039,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
||||
wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
|
||||
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo()));
|
||||
//换层任务不修改执行阶段
|
||||
if (mydoJob!=null && !wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) {
|
||||
if (mydoJob != null && !wcsSrgvQueue.getDefault02().equals("8") && !wcsSrgvQueue.getDefault02().equals("3")) {
|
||||
mydoJob.setExecutionPhase("3");
|
||||
mydoJob.setStatus("3");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
@@ -972,6 +1085,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
||||
// 载货任务(出库、入库、移库等)
|
||||
sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite);
|
||||
break;
|
||||
case "7":
|
||||
// 移库任务(出库、入库、移库等)
|
||||
sendFlag = sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite);
|
||||
break;
|
||||
}
|
||||
|
||||
if (sendFlag) {
|
||||
@@ -1163,6 +1280,13 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
||||
//不同层,终点为提升机
|
||||
endSite = "tsj";
|
||||
}
|
||||
// 如果终点是提升机需要判断是否有其他任务也是提升机的 这个时候先停一下
|
||||
if (endSite.equals("tsj")) {
|
||||
Integer count = wcsSagvQueueMapper.selectTsj();
|
||||
if (count > 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) {
|
||||
xfType = "1";//入库
|
||||
@@ -1208,7 +1332,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
||||
|
||||
case "2":
|
||||
MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo()));
|
||||
if (mydoJobOut != null) {
|
||||
if (mydoJobOut != null && (cargoPlaceSite.equals(currSite))) {
|
||||
JobCallBack jobCallBack = new JobCallBack();
|
||||
jobCallBack.setType(wcsSrgvQueue.getDefault02());
|
||||
jobCallBack.setMydojobId(mydoJobOut.getJobId());
|
||||
@@ -1220,7 +1344,19 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
|
||||
mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId());
|
||||
}
|
||||
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:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1,754 +0,0 @@
|
||||
package com.ruoyi.schedule.scheduleTask.srgv;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.ruoyi.bas.port.service.IWcsPortService;
|
||||
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
|
||||
import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService;
|
||||
import com.ruoyi.bas.srgvmap.service.RoadCacheService;
|
||||
import com.ruoyi.common.TaskStage;
|
||||
import com.ruoyi.common.domain.SendData2;
|
||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
||||
import com.ruoyi.device.srgv.domain.DeviceSrgv;
|
||||
import com.ruoyi.job.charg.service.ISrgvChargingJobService;
|
||||
import com.ruoyi.job.domain.JobCallBack;
|
||||
import com.ruoyi.job.domain.MydoJob;
|
||||
import com.ruoyi.job.service.IJobCallBackService;
|
||||
import com.ruoyi.job.service.IMydoJobService;
|
||||
import com.ruoyi.queue.srgv.domain.WcsSrgvQueue;
|
||||
import com.ruoyi.queue.srgv.service.IWcsSrgvQueueFinishService;
|
||||
import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService;
|
||||
import com.ruoyi.queue.tsj.domain.TsjDeviceExecutionQueue;
|
||||
import com.ruoyi.queue.tsj.service.ITsjDeviceExecutionQueueService;
|
||||
import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead;
|
||||
import com.ruoyi.schedule.plcRead.srgv.roadUtil.PathFinder;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.ruoyi.common.TaskStage.FINISHED;
|
||||
import static com.ruoyi.common.TaskStage.STAGE7;
|
||||
|
||||
@Slf4j
|
||||
public class BaseSRgvThread1 implements Runnable, SRgvThreadInterface {
|
||||
|
||||
private IWcsSrgvMapService wcsSrgvMapService;
|
||||
private IWcsSrgvQueueService wcsSrgvQueueService;
|
||||
private ITsjDeviceExecutionQueueService tsjDeviceExecutionQueueService;
|
||||
|
||||
private IMydoJobService mydoJobService;
|
||||
|
||||
private RoadCacheService roadCacheService;
|
||||
private IJobCallBackService jobCallBackService;
|
||||
|
||||
public IWcsSrgvQueueFinishService wcsSagvQueueFinishMapper;
|
||||
|
||||
public IWcsPortService wcsPortService;
|
||||
|
||||
public ISrgvChargingJobService srgvChargingJobMapper;
|
||||
|
||||
public boolean isRun = true;
|
||||
|
||||
public HashMap<String, List<String>> sRgvCodeList;
|
||||
|
||||
public void init() {
|
||||
sRgvCodeList = new HashMap<>();
|
||||
ArrayList<String> sRgvCodes = new ArrayList<>();
|
||||
sRgvCodes.add("1");
|
||||
/*sRgvCodes.add("2");
|
||||
sRgvCodes.add("3");*/
|
||||
sRgvCodeList.put("srgv", sRgvCodes);
|
||||
|
||||
wcsSagvQueueFinishMapper = SpringUtils.getBean(IWcsSrgvQueueFinishService.class);
|
||||
wcsPortService = SpringUtils.getBean(IWcsPortService.class);
|
||||
srgvChargingJobMapper = SpringUtils.getBean(ISrgvChargingJobService.class);
|
||||
mydoJobService = SpringUtils.getBean(IMydoJobService.class);
|
||||
wcsSrgvMapService = SpringUtils.getBean(IWcsSrgvMapService.class);
|
||||
roadCacheService = SpringUtils.getBean(RoadCacheService.class);
|
||||
wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class);
|
||||
tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
init();
|
||||
while (isRun) {
|
||||
|
||||
for (String code : sRgvCodeList.get("srgv")) {
|
||||
|
||||
try {
|
||||
if (PlcSrgvRead.deviceSrgvMap.containsKey(code)) {
|
||||
if (ObjUtil.isNotNull(PlcSrgvRead.deviceSrgvMap.get(code))) {
|
||||
|
||||
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(code);
|
||||
|
||||
//selectCarForTask();
|
||||
createSrgvInOutQueue();
|
||||
srgvTask(deviceSrgv);
|
||||
|
||||
} else {
|
||||
log.error("小车设备为空");
|
||||
}
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(1500);
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void selectCarForTask() {
|
||||
MydoJob mydoJob = mydoJobService.selectNoAllocatCar();
|
||||
/*
|
||||
选择执行任务的小车
|
||||
优先级 目标层已有小车 > 1 层空闲小车 > 其他无任务层空闲小车
|
||||
*/
|
||||
if (ObjUtil.isNotNull(mydoJob)) {
|
||||
for (String srgvId : PlcSrgvRead.deviceSrgvMap.keySet()) {
|
||||
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(srgvId);
|
||||
//如果小车空闲,选择小车
|
||||
if (deviceSrgv.getStatus() == 0) {
|
||||
mydoJob.setCarId(srgvId);
|
||||
mydoJob.setStatus("3");
|
||||
mydoJob.setStartTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
|
||||
/*
|
||||
根据选择的小车当前位置 确定mydojob的任务阶段
|
||||
*/
|
||||
Integer floor = deviceSrgv.getCurrFloor();
|
||||
String currSite = deviceSrgv.getCurrSite();
|
||||
if (floor.equals(Convert.toInt(mydoJob.getRoadwayId()))) {
|
||||
//小车所在楼层和任务开始楼层一致 3 5
|
||||
if (!currSite.equals(mydoJob.getCargoSpaceId())) {
|
||||
mydoJob.setExecutionPhase("3");
|
||||
} else {
|
||||
//判断目标楼层是不是1层
|
||||
if (!"1".equals(mydoJob.getTargetRoadwayId())) {
|
||||
mydoJob.setExecutionPhase("5");
|
||||
} else {
|
||||
mydoJob.setExecutionPhase("7");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mydoJob.setExecutionPhase("1");
|
||||
}
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* 出库
|
||||
1-2-3-5-6-7 车在其它层 && 取货目标在其它层
|
||||
1-2-3-7 车在其它层 && 取货目标在1层
|
||||
3-5-6-7 车在取货层 && 取货目标在其它层
|
||||
3-7 车在取货层 && 层数为1 && 放货目标在1层
|
||||
*/
|
||||
public void outQueue() {
|
||||
}
|
||||
|
||||
/* 入库
|
||||
1-2-3-5-6-7 车在其它层 && 放货目标在其它层
|
||||
1-2-3-7 车在其它层 && 放货目标在1层
|
||||
3-5-6-7 车在1层 && 放货目标在其它层
|
||||
3-7 车在1层 && 放货目标在1层
|
||||
任务类型 方式
|
||||
1 srgv 点对点 当前位置→本层电梯口
|
||||
2 tsj 换层 取放 当前层→起点层
|
||||
3 srgv 点对点 取货 当前位置->取货点
|
||||
5 srgv 点对点 取货点->本层电梯口
|
||||
6 tsj 换层 取放 取货层->放货层
|
||||
7 srgv 点对点 放货 本层电梯口->放货点
|
||||
*/
|
||||
public void createSrgvInOutQueue() {
|
||||
MydoJob param = new MydoJob();
|
||||
param.setStatus("3");
|
||||
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(param);
|
||||
if (CollUtil.isNotEmpty(mydoJobs)) {
|
||||
for (MydoJob mydoJob : mydoJobs) {
|
||||
if (StrUtil.isNotEmpty(mydoJob.getCarId())) {
|
||||
//绑定任务小车
|
||||
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(mydoJob.getCarId());
|
||||
//开始小车任务阶段
|
||||
if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE1.getCode())) {
|
||||
/*
|
||||
当前位置→本层电梯口 srgv
|
||||
1. 调用 A * 算法规划层内最优路径(避开墙 0/4,走通道 2)
|
||||
2. 实时检测通道冲突(与其他小车路径不重叠)
|
||||
3. 移动到本层电梯口
|
||||
*/
|
||||
String startSite = deviceSrgv.getCurrSite();
|
||||
Integer floor = deviceSrgv.getCurrFloor();
|
||||
String endSite = getTsjSiteIdByFloor(floor);
|
||||
if (StrUtil.isEmpty(endSite)) {
|
||||
log.info("生成tsj队列失败,未找到层数为{}电梯口", floor);
|
||||
} else {
|
||||
String rwlx = "4";
|
||||
int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx);
|
||||
if (srgvQueue > 0) {
|
||||
log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE2.getCode())) {
|
||||
/*
|
||||
本层电梯口→起点层电梯口 tsj
|
||||
1. 加入电梯排队队列(按任务优先级 + 到电梯口距离排序)
|
||||
2. 等待电梯空闲后占用电梯,跨层到 1 层
|
||||
3. 电梯到达后,更新小车位置为(1,8,8)
|
||||
*/
|
||||
//生成tsj队列
|
||||
//根据位置判断列数
|
||||
String srcColumn = "";
|
||||
String tarColumn = "";
|
||||
Integer srcFloor = deviceSrgv.getCurrFloor();
|
||||
Integer tarFloor = Convert.toInt(mydoJob.getRoadwayId());
|
||||
String rwlx = "";
|
||||
int tsjQueue = createTsjQueue(Convert.toLong(mydoJob.getTaskNo()), srcFloor, srcColumn, tarFloor, tarColumn, mydoJob.getCarId(), rwlx);
|
||||
if (tsjQueue > 0) {
|
||||
log.info("生成tsj队列成功 rwh:{},srcC:{},srcF:{},tarC:{},tarF:{},rwlx:{}", mydoJob.getTaskNo(), srcColumn, srcFloor, tarColumn, tarFloor, rwlx);
|
||||
}
|
||||
}
|
||||
if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE3.getCode())) {
|
||||
/*
|
||||
起点层电梯口(小车当前位置)→起点层作业点 srgv
|
||||
1. 规划 1 层电梯口到作业点的路径(1 层通道拥堵高发,优先走预设单向通道)
|
||||
2. 检查作业点占用状态(同一时间仅 1 台小车作业)
|
||||
3. 移动到作业点并锁定作业点
|
||||
*/
|
||||
//生成srgv队列
|
||||
String startSite = getTsjSiteIdByFloor(Convert.toInt(mydoJob.getRoadwayId()));
|
||||
String endSite = mydoJob.getCargoSpaceId();
|
||||
String rwlx = "4";
|
||||
int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx);
|
||||
if (srgvQueue > 0) {
|
||||
log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite);
|
||||
}
|
||||
}
|
||||
/*if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE4.getCode())) {
|
||||
*//*
|
||||
作业点执行取/放货-> srgv
|
||||
1. 触发取货传感器,确认货物已装载
|
||||
2. 更新任务状态为取货完成
|
||||
3. 释放作业点(供其他小车使用)
|
||||
*//*
|
||||
String startSite = "";
|
||||
String endSite = "";
|
||||
String rwlx = "4";
|
||||
int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx);
|
||||
if (srgvQueue > 0) {
|
||||
log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite);
|
||||
}
|
||||
}*/
|
||||
if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE5.getCode())) {
|
||||
/*
|
||||
作业点->起点层电梯口 srgv
|
||||
1. 规划作业点到电梯口的返程路径
|
||||
2. 再次检测 1 层通道冲突(避免与新任务小车对向拥堵)
|
||||
3. 移动到 1 层电梯口
|
||||
*/
|
||||
String startSite = "";
|
||||
String endSite = "";
|
||||
String rwlx = "4";
|
||||
int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx);
|
||||
if (srgvQueue > 0) {
|
||||
log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite);
|
||||
}
|
||||
}
|
||||
if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE6.getCode())) {
|
||||
/*
|
||||
起点层电梯口→目标层电梯口 tsj
|
||||
1. 加入电梯队列(按任务优先级排序,优先高优先级任务)
|
||||
2. 占用电梯跨层到目标层
|
||||
3. 电梯到达后,更新小车位置为(目标层,8,8)
|
||||
*/
|
||||
//生成tsj队列
|
||||
String srcColumn = "";
|
||||
String tarColumn = "";
|
||||
Integer srcFloor = 0;
|
||||
Integer tarFloor = 0;
|
||||
String rwlx = "";
|
||||
int tsjQueue = createTsjQueue(Convert.toLong(mydoJob.getTaskNo()), srcFloor, srcColumn, tarFloor, tarColumn, mydoJob.getCarId(), rwlx);
|
||||
if (tsjQueue > 0) {
|
||||
log.info("生成tsj队列成功 rwh:{},srcC:{},srcF:{},tarC:{},tarF:{},rwlx:{}", mydoJob.getTaskNo(), srcColumn, srcFloor, tarColumn, tarFloor, rwlx);
|
||||
}
|
||||
}
|
||||
if (mydoJob.getExecutionPhase().equals(STAGE7.getCode())) {
|
||||
/*
|
||||
当前位置→目标货位 srgv
|
||||
1. 规划目标层电梯口到目标货位的路径
|
||||
2. 检查目标货位状态(是否空闲,避免重复放货)
|
||||
3. 移动到目标货位,触发放货传感器
|
||||
*/
|
||||
//生成srgv队列
|
||||
String startSite = deviceSrgv.getCurrSite();
|
||||
String endSite = mydoJob.getTargetCargoSpaceId();
|
||||
String rwlx = "4";
|
||||
int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx);
|
||||
if (srgvQueue > 0) {
|
||||
log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite);
|
||||
}
|
||||
}
|
||||
if (mydoJob.getExecutionPhase().equals(TaskStage.STAGE8.getCode())) {
|
||||
/*
|
||||
. 可选两种待命策略:
|
||||
- 策略 1(优先高效):回到目标层电梯口(就近待命,减少下一次任务跨层成本)
|
||||
- 策略 2(优先均衡):回到1 层作业点附近(适配高频 1 层出发任务)
|
||||
2. 更新小车状态为idle,清空当前任务
|
||||
*/
|
||||
//生成srgv队列
|
||||
String startSite = "";
|
||||
String endSite = "";
|
||||
String rwlx = "4";
|
||||
int srgvQueue = createSrgvQueue(mydoJob, startSite, endSite, rwlx);
|
||||
if (srgvQueue > 0) {
|
||||
log.info("生成srgv队列成功 rwh:{},startSite:{},endSite:{}", mydoJob.getTaskNo(), startSite, endSite);
|
||||
}
|
||||
}
|
||||
if (mydoJob.getExecutionPhase().equals(FINISHED.getCode())) {
|
||||
//完成任务
|
||||
mydoJob.setFinishTime(DateUtil.formatDateTime(new Date()));
|
||||
mydoJob.setStatus("4");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
mydoJobService.insertHistory(mydoJob.getJobId());
|
||||
JobCallBack jobCallBack = new JobCallBack();
|
||||
jobCallBack.setMydojobId(mydoJob.getJobId());
|
||||
jobCallBack.setStatus("0");
|
||||
if (Convert.toInt(mydoJob.getInOrOut()) < 20) {
|
||||
jobCallBack.setType("1");
|
||||
} else {
|
||||
jobCallBack.setType("2");
|
||||
}
|
||||
jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo()));
|
||||
jobCallBack.setCreateTime(new Date());
|
||||
jobCallBackService.insertJobCallBack(jobCallBack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建srgv队列
|
||||
*
|
||||
* @param mydoJob 任务
|
||||
* @param startSite 源站
|
||||
* @param endSite 目的站
|
||||
* @param rwlx 任务类型 1-入库 2-出库 3-充电 4-点对点
|
||||
*/
|
||||
private int createSrgvQueue(MydoJob mydoJob, String startSite, String endSite, String rwlx) {
|
||||
WcsSrgvQueue queue = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(mydoJob.getTaskNo());
|
||||
if (queue != null) {
|
||||
return 0;
|
||||
}
|
||||
//生成srgv队列
|
||||
WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
|
||||
wcsSrgvQueue.setGuid(IdUtil.simpleUUID());
|
||||
wcsSrgvQueue.setTaskType("1");
|
||||
wcsSrgvQueue.setTaskNo(mydoJob.getTaskNo());
|
||||
wcsSrgvQueue.setPriority(2L);
|
||||
wcsSrgvQueue.setCargo("0");
|
||||
wcsSrgvQueue.setIssued("0");
|
||||
wcsSrgvQueue.setExecutionStatus("0");
|
||||
wcsSrgvQueue.setCargoPickSite(mydoJob.getCargoSpaceId());
|
||||
wcsSrgvQueue.setCargoPlaceSite(mydoJob.getTargetCargoSpaceId());
|
||||
wcsSrgvQueue.setStartSite(startSite);
|
||||
wcsSrgvQueue.setEndSite(endSite);
|
||||
wcsSrgvQueue.setCreateDate(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
|
||||
wcsSrgvQueue.setAgvId(mydoJob.getCarId());
|
||||
wcsSrgvQueue.setDefault02(rwlx);
|
||||
return wcsSrgvQueueService.insertWcsSrgvQueue(wcsSrgvQueue);
|
||||
}
|
||||
//出库 1-2-3-4-5-6-7-4-9
|
||||
|
||||
|
||||
/**
|
||||
* 创建提升机队列
|
||||
*
|
||||
* @param taskNo 任务编号
|
||||
* @param srcColumn 源列
|
||||
* @param srcFloor 源层
|
||||
* @param tarColumn 目标列
|
||||
* @param tarFloor 目标层
|
||||
* @param carId 小车id
|
||||
* @param rwlx 任务类型
|
||||
*/
|
||||
private int createTsjQueue(Long taskNo, Integer srcFloor, String srcColumn, Integer tarFloor, String tarColumn, String carId, String rwlx) {
|
||||
TsjDeviceExecutionQueue queue = tsjDeviceExecutionQueueService.selectTsjDeviceExecutionQueueByRwh(taskNo);
|
||||
if (ObjUtil.isNull(queue)) {
|
||||
TsjDeviceExecutionQueue tsjDeviceExecutionQueue = new TsjDeviceExecutionQueue();
|
||||
tsjDeviceExecutionQueue.setGuid(IdUtil.simpleUUID());
|
||||
tsjDeviceExecutionQueue.setDeviceId(1L);
|
||||
tsjDeviceExecutionQueue.setDeviceName("提升机");
|
||||
tsjDeviceExecutionQueue.setTaskNo(taskNo);
|
||||
tsjDeviceExecutionQueue.setSrcColumn(srcColumn);
|
||||
tsjDeviceExecutionQueue.setSrcLayer(Convert.toStr(srcFloor));
|
||||
tsjDeviceExecutionQueue.setTarColumn(tarColumn);
|
||||
tsjDeviceExecutionQueue.setTarLayer(Convert.toStr(tarFloor));
|
||||
tsjDeviceExecutionQueue.setSendType("1");
|
||||
tsjDeviceExecutionQueue.setCreateDate(DateUtil.formatDateTime(new Date()));
|
||||
tsjDeviceExecutionQueue.setSpare1(carId);
|
||||
tsjDeviceExecutionQueue.setTaskType("1");
|
||||
tsjDeviceExecutionQueue.setRwlx(rwlx);
|
||||
return tsjDeviceExecutionQueueService.insertTsjDeviceExecutionQueue(tsjDeviceExecutionQueue);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
private String getTsjSiteIdByFloor(int floor) {
|
||||
String siteId = null;
|
||||
switch (floor) {
|
||||
case 1:
|
||||
siteId = "040801";
|
||||
break;
|
||||
case 2:
|
||||
siteId = "040802";
|
||||
break;
|
||||
case 3:
|
||||
siteId = "040803";
|
||||
break;
|
||||
case 4:
|
||||
siteId = "040804";
|
||||
break;
|
||||
case 5:
|
||||
siteId = "040805";
|
||||
break;
|
||||
case 6:
|
||||
siteId = "040806";
|
||||
break;
|
||||
case 7:
|
||||
siteId = "040807";
|
||||
break;
|
||||
case 8:
|
||||
siteId = "040808";
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
return siteId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 小车任务处理
|
||||
*/
|
||||
private void srgvTask(DeviceSrgv deviceSrgv) {
|
||||
//队列下发成功处理
|
||||
resQueue(deviceSrgv);
|
||||
|
||||
//小车完成队列
|
||||
completeCarTask(deviceSrgv);
|
||||
|
||||
//小车发送任务
|
||||
sendTask(deviceSrgv);
|
||||
}
|
||||
|
||||
/**
|
||||
* 队列下发成功处理
|
||||
*/
|
||||
private void resQueue(DeviceSrgv deviceSrgv) {
|
||||
int taskNo = deviceSrgv.getTaskNo();
|
||||
String currSite = deviceSrgv.getCurrSite();
|
||||
Integer deviceId = deviceSrgv.getDeviceId();
|
||||
|
||||
if (taskNo > 999 && !"000000".equals(currSite)) {
|
||||
WcsSrgvQueue param = new WcsSrgvQueue();
|
||||
param.setTaskNo(Convert.toStr(taskNo));
|
||||
param.setIssued("0");
|
||||
param.setAgvId(String.valueOf(deviceId));
|
||||
List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(param);
|
||||
|
||||
if (CollUtil.isNotEmpty(wcsSrgvQueues)) {
|
||||
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueues.get(0);
|
||||
|
||||
|
||||
wcsSrgvQueue.setIssued("1");
|
||||
wcsSrgvQueue.setStartDate(DateUtil.now());
|
||||
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 小车完成队列
|
||||
*/
|
||||
private void completeCarTask(DeviceSrgv deviceSrgv) {
|
||||
//联机自动
|
||||
if (deviceSrgv.getWorkMode() == 4) {
|
||||
WcsSrgvQueue param = new WcsSrgvQueue();
|
||||
param.setAgvId(Convert.toStr(deviceSrgv.getDeviceId()));
|
||||
param.setEndSite(deviceSrgv.getCurrSite());//目标点
|
||||
param.setIssued("1");
|
||||
param.setTaskNo(deviceSrgv.getTaskNo().toString());
|
||||
List<WcsSrgvQueue> wcsSagvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(param);//查询到达目标的
|
||||
if (CollUtil.isNotEmpty(wcsSagvQueues)) {
|
||||
WcsSrgvQueue wcsSrgvQueue = wcsSagvQueues.get(0);
|
||||
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(wcsSrgvQueue.getTaskNo()));
|
||||
if (mydoJob != null) {
|
||||
Integer floor = deviceSrgv.getCurrFloor();
|
||||
Integer startFloor = Convert.toInt(mydoJob.getRoadwayId());
|
||||
Integer endFloor = Convert.toInt(mydoJob.getTargetRoadwayId());
|
||||
if (Convert.toInt(mydoJob.getInOrOut()) < 20) {
|
||||
//入库
|
||||
if ("1".equals(mydoJob.getExecutionPhase())) {
|
||||
mydoJob.setExecutionPhase("2");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
} else if ("3".equals(mydoJob.getExecutionPhase())) {
|
||||
if (floor.equals(endFloor)) {
|
||||
mydoJob.setExecutionPhase("7");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
} else {
|
||||
mydoJob.setExecutionPhase("5");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
}
|
||||
} else if ("5".equals(mydoJob.getExecutionPhase())) {
|
||||
mydoJob.setExecutionPhase("6");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
} else if ("7".equals(mydoJob.getExecutionPhase())) {
|
||||
mydoJob.setExecutionPhase("8");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
}
|
||||
|
||||
} else {
|
||||
//出库
|
||||
if ("1".equals(mydoJob.getExecutionPhase())) {
|
||||
mydoJob.setExecutionPhase("2");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
} else if ("3".equals(mydoJob.getExecutionPhase())) {
|
||||
if (floor.equals(1)) {
|
||||
mydoJob.setExecutionPhase("7");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
} else {
|
||||
mydoJob.setExecutionPhase("5");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
}
|
||||
} else if ("5".equals(mydoJob.getExecutionPhase())) {
|
||||
mydoJob.setExecutionPhase("6");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
} else if ("7".equals(mydoJob.getExecutionPhase())) {
|
||||
mydoJob.setExecutionPhase("8");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
}
|
||||
}
|
||||
wcsSrgvQueue.setExecutionStatus("4");
|
||||
wcsSrgvQueue.setUpdateTime(DateUtil.date());
|
||||
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
|
||||
wcsSrgvQueueService.insertHistory(wcsSrgvQueue.getTaskNo());
|
||||
wcsSrgvQueueService.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 小车发送任务
|
||||
*/
|
||||
private void sendTask(DeviceSrgv deviceSrgv) {
|
||||
WcsSrgvQueue param = new WcsSrgvQueue();
|
||||
param.setIssued("0");
|
||||
param.setAgvId(deviceSrgv.getDeviceId().toString());
|
||||
List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(param);
|
||||
if (CollUtil.isEmpty(wcsSrgvQueues)) {
|
||||
return;
|
||||
}
|
||||
for (WcsSrgvQueue wcsSrgvQueue : wcsSrgvQueues) {
|
||||
String agvId = wcsSrgvQueue.getAgvId();
|
||||
if (agvId.equals(Convert.toStr(deviceSrgv.getDeviceId())) && deviceSrgv.getWorkMode() == 4 && deviceSrgv.getAllowSend() == 1) {
|
||||
String endSite = wcsSrgvQueue.getEndSite();
|
||||
String currSite = deviceSrgv.getCurrSite();
|
||||
//判断是否可以下发任务
|
||||
if ("0".equals(wcsSrgvQueue.getIssued())) {
|
||||
sendPointToPointTask(deviceSrgv, wcsSrgvQueue, currSite, endSite);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 小车发送点对点任务
|
||||
*/
|
||||
private void sendPointToPointTask(DeviceSrgv deviceSrgv, WcsSrgvQueue wcsSrgvQueue, String startSite, String endSite) {
|
||||
Integer floor = deviceSrgv.getCurrFloor();
|
||||
//获取当前地图
|
||||
Map<String, WcsSrgvMap> arrByRoadSite = roadCacheService.getArrByRoadSite(floor);
|
||||
|
||||
//处理地图
|
||||
int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv);
|
||||
|
||||
//计算最短路径
|
||||
List<int[]> shortestPath = PathFinder.findShortestPath(emptyMap, arrByRoadSite.get(startSite).getX(), arrByRoadSite.get(startSite).getY(), arrByRoadSite.get(endSite).getX(), arrByRoadSite.get(endSite).getY());
|
||||
|
||||
//判断是否能规划出最短路径
|
||||
if (shortestPath == null || shortestPath.isEmpty()) {
|
||||
log.error("无法到达指定位置");
|
||||
return;
|
||||
}
|
||||
|
||||
//获取拐点路径
|
||||
List<int[]> trun = PathFinder.extractInflectionPoints2(shortestPath);
|
||||
|
||||
// 路径点拼接
|
||||
StringBuilder pathBuilder = new StringBuilder();
|
||||
if (!shortestPath.isEmpty()) {
|
||||
for (int[] ints : shortestPath) {
|
||||
WcsSrgvMap roadSiteByArr = roadCacheService.selectRoadSiteByArr(ints[0], ints[1], floor);
|
||||
if (roadSiteByArr == null) {
|
||||
log.error("无此站点 x y z :{},{},{}", ints[0], ints[1], floor);
|
||||
throw new RuntimeException("点位信息错误");
|
||||
}
|
||||
String site = roadSiteByArr.getSiteId();
|
||||
pathBuilder.append(site).append(",");
|
||||
}
|
||||
}
|
||||
// 拐点拼接
|
||||
StringBuilder turnBuilder = new StringBuilder();
|
||||
if (!trun.isEmpty()) {
|
||||
for (int[] ints : trun) {
|
||||
WcsSrgvMap roadSiteByArr = roadCacheService.selectRoadSiteByArr(ints[0], ints[1], floor);
|
||||
if (roadSiteByArr == null) {
|
||||
log.error("无此站点 x y z :{},{},{}", ints[0], ints[1], floor);
|
||||
throw new RuntimeException("点位信息错误");
|
||||
}
|
||||
String site = roadSiteByArr.getSiteId();
|
||||
turnBuilder.append(site).append(",");
|
||||
}
|
||||
if (turnBuilder.length() > 0) {
|
||||
turnBuilder.setLength(turnBuilder.length() - 1);
|
||||
}
|
||||
// 当trun长度小于6时,后面用0拼接
|
||||
if (trun.size() < 6) {
|
||||
for (int i = trun.size(); i < 6; i++) {
|
||||
turnBuilder.append(",0");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<SendData2> sendDataList = new ArrayList<>();
|
||||
if (!trun.isEmpty()) {
|
||||
SendData2 path = new SendData2();
|
||||
path.setAddress("4000");//地址
|
||||
path.setData(startSite + "," + endSite + "," + turnBuilder);
|
||||
path.setType(2);
|
||||
sendDataList.add(path);
|
||||
} else {
|
||||
SendData2 path = new SendData2();
|
||||
path.setAddress("4000");//地址
|
||||
path.setData(startSite + "," + endSite);
|
||||
path.setType(2);
|
||||
sendDataList.add(path);
|
||||
}
|
||||
|
||||
|
||||
//任务号、原、目标数据转换
|
||||
String siteId = wcsSrgvQueue.getTaskNo() + "1";//+ "," + startSite + "," + endSite;
|
||||
SendData2 site = new SendData2();
|
||||
site.setAddress("4400");
|
||||
site.setData(siteId);
|
||||
site.setType(2);
|
||||
sendDataList.add(site);
|
||||
|
||||
//任务类型转换
|
||||
SendData2 taskType = new SendData2();
|
||||
taskType.setAddress("2200");
|
||||
taskType.setData(wcsSrgvQueue.getTaskType());
|
||||
taskType.setType(1);
|
||||
sendDataList.add(taskType);
|
||||
|
||||
//下发标志转换
|
||||
SendData2 flag = new SendData2();
|
||||
flag.setAddress("2202");
|
||||
flag.setData("1");
|
||||
flag.setType(1);
|
||||
sendDataList.add(flag);
|
||||
|
||||
//下发数据
|
||||
boolean b = sendCarTask(sendDataList, deviceSrgv);
|
||||
if (b) {
|
||||
wcsSrgvQueue.setPathInfo(pathBuilder.toString());
|
||||
wcsSrgvQueue.setTrunPath(turnBuilder.toString());
|
||||
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
|
||||
} else {
|
||||
log.error("小车下发失败 taskNo:{}", wcsSrgvQueue.getTaskNo());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 小车发送任务
|
||||
*/
|
||||
private boolean sendCarTask(List<SendData2> sendDataList, DeviceSrgv deviceSrgv) {
|
||||
|
||||
boolean b = true;
|
||||
|
||||
for (SendData2 sendData : sendDataList) {
|
||||
String address = sendData.getAddress();
|
||||
String data = sendData.getData();//
|
||||
|
||||
String[] split = data.split(",");
|
||||
|
||||
int type = sendData.getType();//1单字 2双字 3字符串
|
||||
|
||||
//双字
|
||||
if (type == 2) {
|
||||
int[] intData = Arrays.stream(split).map(String::trim).mapToInt(Integer::parseInt).toArray();
|
||||
boolean write = true;//PlcSrgvRead.Write(address, intData);
|
||||
|
||||
if (!write) {
|
||||
b = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//单字
|
||||
if (type == 1) {
|
||||
//String[]转为 short[]
|
||||
short[] shortData = new short[split.length];
|
||||
for (int i = 0; i < split.length; i++) {
|
||||
try {
|
||||
shortData[i] = Short.parseShort(split[i].trim());
|
||||
} catch (NumberFormatException e) {
|
||||
// 记录日志并设置默认值
|
||||
shortData[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
boolean write = true;//PlcSrgvRead.Write(address, shortData);
|
||||
|
||||
if (!write) {
|
||||
b = false;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
String collect = sendDataList.stream().map(li -> "{" + li.getAddress() + ":" + li.getData() + "}").collect(Collectors.joining(","));
|
||||
|
||||
log.info("小车:" + deviceSrgv.getDeviceId() + ",下发值:" + collect + ",,结果:" + b);
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -124,44 +124,58 @@ public class SsjThread implements Runnable {
|
||||
}
|
||||
|
||||
void inDispatch1(DeviceSsj deviceSsj) {
|
||||
if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) {
|
||||
//todo 查是否为入库模式,不是退回,是否超重
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
map.put("trayCode", deviceSsj.getTrayCode());
|
||||
//拉取
|
||||
AjaxResult ajaxResult = apiService.createInMydoJob(map);
|
||||
if (ajaxResult.isSuccess()) {
|
||||
//拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号
|
||||
MydoJob mydoJob = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class);
|
||||
mydoJob.setStatus("1");
|
||||
mydoJob.setExecutionPhase("1");
|
||||
mydoJob.setCreateTime(new Date());
|
||||
mydoJob.setTheFloor(mydoJob.getClassId());
|
||||
if ("GS1002".equals(deviceSsj.getDeviceCode())) {
|
||||
mydoJob.setEntranceId("L1004");
|
||||
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 查是否为入库模式,不是退回,是否超重
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
map.put("trayCode", deviceSsj.getTrayCode());
|
||||
//拉取
|
||||
AjaxResult ajaxResult = apiService.createInMydoJob(map);
|
||||
if (ajaxResult.isSuccess()) {
|
||||
//拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号
|
||||
MydoJob mydoJob = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class);
|
||||
mydoJob.setStatus("1");
|
||||
mydoJob.setExecutionPhase("1");
|
||||
mydoJob.setCreateTime(new Date());
|
||||
mydoJob.setTheFloor(mydoJob.getClassId());
|
||||
mydoJob.setTrayCode(trayCode);
|
||||
if ("GS1002".equals(deviceSsj.getDeviceCode())) {
|
||||
mydoJob.setEntranceId("L1004");
|
||||
} else {
|
||||
mydoJob.setEntranceId("L1005");
|
||||
}
|
||||
// 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段
|
||||
MydoJob mydoJob1 = new MydoJob();
|
||||
mydoJob1.setTaskNo(mydoJob.getTaskNo());
|
||||
mydoJob1.setTrayCode(mydoJob.getTrayCode());
|
||||
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJob1);
|
||||
if (mydoJobs.size() > 0) {
|
||||
return;
|
||||
}
|
||||
mydoJobService.insertMydoJob(mydoJob);
|
||||
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1);
|
||||
if (i == 1) {
|
||||
mydoJob.setStatus("3");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo());
|
||||
}
|
||||
} else {
|
||||
mydoJob.setEntranceId("L1005");
|
||||
}
|
||||
// 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段
|
||||
MydoJob mydoJob1 = new MydoJob();
|
||||
mydoJob1.setTaskNo(mydoJob.getTaskNo());
|
||||
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJob1);
|
||||
if (mydoJobs.size() > 0) {
|
||||
return;
|
||||
}
|
||||
mydoJobService.insertMydoJob(mydoJob);
|
||||
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1);
|
||||
if (i == 1) {
|
||||
mydoJob.setStatus("3");
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo());
|
||||
}
|
||||
} else {
|
||||
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2);
|
||||
if (i == 1) {
|
||||
log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2 条码"+deviceSsj.getTrayCode());
|
||||
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2);
|
||||
if (i == 1) {
|
||||
log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2 条码" + deviceSsj.getTrayCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ public class TsjThread implements Runnable {
|
||||
private void createSRgvQueueTsjQd(Long rwh, DeviceTsj tsj) {
|
||||
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
|
||||
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv);
|
||||
if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) ||deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor()))&& deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 2 && tsj.getHczt() == 1) {
|
||||
if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) || deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor())) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 2 && tsj.getHczt() == 1) {
|
||||
SendData rwlxSendData = new SendData(Tools.INT, 1);
|
||||
DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(Convert.toStr(1));
|
||||
byte[] bytes = Tools.sendData(rwlxSendData);
|
||||
@@ -208,7 +208,8 @@ public class TsjThread implements Runnable {
|
||||
private void createQueue(DeviceTsj tsj) {
|
||||
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
|
||||
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();
|
||||
sRgvQueueParam.setAgvId(Convert.toStr(deviceSrgv.getDeviceId()));
|
||||
|
||||
@@ -6,9 +6,9 @@ spring:
|
||||
druid:
|
||||
#主数据信息
|
||||
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
|
||||
password: 123456
|
||||
password: Flrd0914.
|
||||
# 从库数据源
|
||||
slave:
|
||||
# 从数据源开关/默认关闭
|
||||
|
||||
@@ -34,7 +34,7 @@ server:
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.ruoyi: debug
|
||||
com.ruoyi: info
|
||||
org.springframework: warn
|
||||
|
||||
# 用户配置
|
||||
@@ -64,7 +64,7 @@ spring:
|
||||
devtools:
|
||||
restart:
|
||||
# 热部署开关
|
||||
enabled: true
|
||||
enabled: false
|
||||
# redis 配置
|
||||
redis:
|
||||
# 地址
|
||||
|
||||
@@ -25,13 +25,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="theFloor" column="the_floor" />
|
||||
<result property="productId" column="product_id" />
|
||||
<result property="productName" column="product_name" />
|
||||
<result property="trayCode" column="tray_code" />
|
||||
</resultMap>
|
||||
|
||||
<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 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>
|
||||
|
||||
<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="productId != null and productId != ''"> and product_id = #{productId}</if>
|
||||
<if test="productName != null and productName != ''"> and product_name = #{productName}</if>
|
||||
<if test="trayCode != null and trayCode != ''"> and tray_code = #{trayCode}</if>
|
||||
|
||||
</where>
|
||||
</select>
|
||||
@@ -118,6 +120,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="warehouseId != null">warehouse_id,</if>
|
||||
<if test="faultFlag != null">fault_flag,</if>
|
||||
<if test="theFloor != null">the_floor,</if>
|
||||
<if test="trayCode != null">tray_code,</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||
<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="faultFlag != null">#{faultFlag},</if>
|
||||
<if test="theFloor != null">#{theFloor},</if>
|
||||
<if test="trayCode != null">#{trayCode},</if>
|
||||
</trim>
|
||||
</insert>
|
||||
<insert id="insertHistory">
|
||||
@@ -244,4 +248,67 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
and status = 3
|
||||
order by priority desc,create_time
|
||||
</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 <= 2
|
||||
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>
|
||||
|
||||
@@ -121,6 +121,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</trim>
|
||||
</insert>
|
||||
|
||||
|
||||
<select id="selectCount" resultType="java.lang.Integer">
|
||||
select count(1)
|
||||
from tsj_device_execution_queue
|
||||
|
||||
</select>
|
||||
|
||||
<update id="updateTsjDeviceExecutionQueue" parameterType="TsjDeviceExecutionQueue">
|
||||
update tsj_device_execution_queue
|
||||
<trim prefix="SET" suffixOverrides=",">
|
||||
|
||||
@@ -212,4 +212,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</choose>
|
||||
</select>
|
||||
|
||||
|
||||
<select id="selectTsj" resultType="java.lang.Integer" >
|
||||
select count(1) from wcs_srgv_queue where end_site='tsj'
|
||||
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user