package com.zy.core.network.fake;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.core.common.SpringUtils;
|
import com.zy.asrs.entity.DeviceConfig;
|
import com.zy.asrs.service.BasMapService;
|
import com.zy.common.model.NavigateNode;
|
import com.zy.common.utils.NavigateUtils;
|
import com.zy.core.enums.RgvStatusType;
|
import com.zy.core.enums.RgvTaskModeType;
|
import com.zy.core.model.CommandResponse;
|
import com.zy.core.model.command.RgvCommand;
|
import com.zy.core.network.api.ZyRgvConnectApi;
|
import com.zy.core.network.entity.ZyRgvStatusEntity;
|
|
import java.util.List;
|
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.Executors;
|
|
public class ZyRgvFakeConnect implements ZyRgvConnectApi {
|
|
private ZyRgvStatusEntity status;
|
private final DeviceConfig deviceConfig;
|
private final ExecutorService executor = Executors.newSingleThreadExecutor();
|
|
public ZyRgvFakeConnect(DeviceConfig deviceConfig) {
|
this.deviceConfig = deviceConfig;
|
ZyRgvStatusEntity init = JSON.parseObject(deviceConfig.getFakeInitStatus(), ZyRgvStatusEntity.class);
|
this.status = init == null ? new ZyRgvStatusEntity() : init;
|
}
|
|
@Override
|
public boolean connect() {
|
return true;
|
}
|
|
@Override
|
public boolean disconnect() {
|
return true;
|
}
|
|
@Override
|
public ZyRgvStatusEntity getStatus() {
|
return status;
|
}
|
|
@Override
|
public CommandResponse sendCommand(RgvCommand command) {
|
CommandResponse response = new CommandResponse(true);
|
if (command.getTaskMode() == RgvTaskModeType.FETCH_PUT.id) {
|
//取放货
|
executor.submit(() -> commandTake(command));
|
} else if (command.getTaskMode() == RgvTaskModeType.X_MOVE.id) {
|
//移动
|
executor.submit(() -> commandMove(command));
|
}else if (command.getTaskMode() == RgvTaskModeType.NONE.id) {
|
//复位
|
executor.submit(() -> commandTaskComplete(command));
|
}
|
return response;
|
}
|
|
private void commandTake(RgvCommand command) {
|
int taskNo = command.getTaskNo();
|
int taskMode = command.getTaskMode();
|
int sourcePos = command.getSourcePos();
|
int targetPos = command.getTargetPos();
|
|
NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
|
if (navigateUtils == null) {
|
return;
|
}
|
|
BasMapService basMapService = SpringUtils.getBean(BasMapService.class);
|
if (basMapService == null) {
|
return;
|
}
|
|
List<Integer> levList = basMapService.getLevList();
|
|
List<NavigateNode> navigateNodes = null;
|
try {
|
for (Integer lev : levList) {
|
navigateNodes = navigateUtils.calcByTrackSiteNo(lev, status.getRgvPos(), sourcePos);
|
if (navigateNodes != null) {
|
break;
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
if (navigateNodes == null) {
|
return;
|
}
|
|
List<NavigateNode> targetNavigateNodes = null;
|
try {
|
for (Integer lev : levList) {
|
targetNavigateNodes = navigateUtils.calcByTrackSiteNo(lev, sourcePos, targetPos);
|
if (targetNavigateNodes != null) {
|
break;
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
if (targetNavigateNodes == null) {
|
return;
|
}
|
|
status.setTaskNo(taskNo);
|
status.setStatus(RgvStatusType.FETCHING.id);
|
for (int i = 0; i < navigateNodes.size(); i++) {
|
NavigateNode navigateNode = navigateNodes.get(i);
|
JSONObject valueObject = JSON.parseObject(navigateNode.getNodeValue());
|
Integer currentTrackSiteNo = valueObject.getInteger("trackSiteNo");
|
|
status.setRgvPos(currentTrackSiteNo);
|
sleep(1000);
|
}
|
|
status.setStatus(RgvStatusType.PUTTING.id);
|
status.setLoaded(1);
|
sleep(1000);
|
|
for (int i = 0; i < targetNavigateNodes.size(); i++) {
|
NavigateNode navigateNode = targetNavigateNodes.get(i);
|
JSONObject valueObject = JSON.parseObject(navigateNode.getNodeValue());
|
Integer currentTrackSiteNo = valueObject.getInteger("trackSiteNo");
|
|
status.setRgvPos(currentTrackSiteNo);
|
sleep(1000);
|
}
|
|
sleep(1000);
|
status.setStatus(RgvStatusType.WAITING.id);
|
}
|
|
private void commandMove(RgvCommand command) {
|
int taskNo = command.getTaskNo();
|
int taskMode = command.getTaskMode();
|
int targetPos = command.getTargetPos();
|
|
NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
|
if (navigateUtils == null) {
|
return;
|
}
|
|
BasMapService basMapService = SpringUtils.getBean(BasMapService.class);
|
if (basMapService == null) {
|
return;
|
}
|
|
List<Integer> levList = basMapService.getLevList();
|
|
List<NavigateNode> navigateNodes = null;
|
try {
|
for (Integer lev : levList) {
|
navigateNodes = navigateUtils.calcByTrackSiteNo(lev, status.getRgvPos(), targetPos);
|
if (navigateNodes != null) {
|
break;
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
if (navigateNodes == null) {
|
return;
|
}
|
|
status.setTaskNo(taskNo);
|
status.setStatus(RgvStatusType.WORKING.id);
|
for (int i = 0; i < navigateNodes.size(); i++) {
|
NavigateNode navigateNode = navigateNodes.get(i);
|
JSONObject valueObject = JSON.parseObject(navigateNode.getNodeValue());
|
Integer currentTrackSiteNo = valueObject.getInteger("trackSiteNo");
|
|
status.setRgvPos(currentTrackSiteNo);
|
sleep(1000);
|
}
|
status.setStatus(RgvStatusType.WAITING.id);
|
}
|
|
private void commandTaskComplete(RgvCommand command) {
|
status.setTaskNo(0);
|
status.setStatus(RgvStatusType.IDLE.id);
|
}
|
|
private void sleep(long ms) {
|
try {
|
Thread.sleep(ms);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|