package com.meslog.wcs.service.thread;
import com.meslog.basic.wcs.path.core.Node;
import com.meslog.basic.wcs.path.enums.DirectionStatus;
import com.meslog.basic.wcs.plc.utils.LoggerUtil;
import com.meslog.basic.wcs.utils.Coord;
import com.meslog.commin.core.utils.SpringContextHolder;
import com.meslog.wcs.res.enums.PalletStatus;
import com.meslog.wcs.res.enums.RgvStatus;
import com.meslog.wcs.res.msgparse.ByteBeanUtil;
import com.meslog.wcs.res.msgparse.HeartBaseResult;
import com.meslog.wcs.res.msgparse.MapDataResult;
import com.meslog.wcs.res.msgparse.ResultBase;
import com.meslog.wcs.service.core.util.LockNodeManager;
import com.meslog.wcs.service.core.util.LongConnSendUtilLora;
import com.meslog.wcs.service.enums.ElectricStatus;
import com.meslog.wcs.service.enums.RgvType;
import com.meslog.wcs.service.init.SystemInit;
import com.meslog.wcs.service.pojo.Rgv;
import com.meslog.wcs.service.pojo.rgv.rgv.protocol.base.RgvBaseMessage;
import com.meslog.wcs.service.pojo.rgv.rgv.protocol.message.RgvLifeRecMessage;
import com.meslog.wcs.service.pojo.rgv.rgv.protocol.message.RgvLifeSendMessage;
import com.meslog.wcs.service.rescontact.ResultContainer;
import com.meslog.wcs.service.rescontact.ToRes;
import com.meslog.wcs.service.system.service.impl.CodeDBServiceImpl;
import com.meslog.wcs.service.system.service.impl.RgvDBServiceImpl;
import com.meslog.wcs.service.system.service.impl.WareHouseDBServiceImpl;
import com.meslog.wcs.service.util.WcsUtil;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class WcsHeartThread extends Thread {
private static final CodeDBServiceImpl codeDBService = (CodeDBServiceImpl)SpringContextHolder.getBean(CodeDBServiceImpl.class);
private static WareHouseDBServiceImpl wareHouseDBService = (WareHouseDBServiceImpl)SpringContextHolder.getBean(WareHouseDBServiceImpl.class);
private Rgv rgv;
private static final int INTERVAL_TIME = 800;
private static Logger log = LoggerFactory.getLogger(WcsHeartThread.class);
private static final RgvDBServiceImpl rgvdbService = (RgvDBServiceImpl)SpringContextHolder.getBean(RgvDBServiceImpl.class);
private boolean syncTiming = false;
public WcsHeartThread(Rgv rgv) {
super(rgv.getRgvDB().getRgvNo() + "号车心跳线程");
this.rgv = rgv;
}
public void run() {
try {
while (true) {
try {
if (RgvType.FOUR_GENERATIONS.getValue().equals(this.rgv.getRgvDB().getRgvType())) {
doExec(ToRes.getInstance(this.rgv).heartRequest(ByteBeanUtil.toByte(this.rgv.getRgvHeart(), this.rgv.getRgvDB().getRgvNo())));
} else if (this.rgv.checkRgvType(RgvType.FIVE_POINT_FOUR_TL) && !this.rgv.isStopHeart()) {
RgvBaseMessage rgvBaseMessage = ToRes.getInstance(this.rgv).heartRequest(new RgvLifeSendMessage(this.rgv));
if (!this.syncTiming && this.rgv.getCurResTaskNo() == null &&
rgvBaseMessage != null)
if (rgvBaseMessage instanceof RgvLifeRecMessage) {
syncTime((RgvLifeRecMessage)rgvBaseMessage, this.rgv);
} else {
LoggerUtil.error("数据返回类型错误-->" + rgvBaseMessage, getClass());
}
}
} catch (IOException e) {
LongConnSendUtilLora.socketMap.remove(this.rgv);
if (this.rgv.getRgvStatus() != RgvStatus.ERROR) {
this.rgv.setRgvStatus(RgvStatus.OFF_LINE);
this.rgv.offLinePing();
} else {
this.rgv.setStatusDescription("小车离线");
}
log.warn(this.rgv.getRgvName() + "心跳通讯异常", e.getMessage());
Thread.sleep(3000L);
} catch (Exception e) {
log.error("心跳通讯出现故障", e);
log.warn(this.rgv.getRgvName() + "心跳通讯异常", e.getMessage());
Thread.sleep(5000L);
}
try {
Thread.sleep(800L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (Throwable $ex) {
throw $ex;
}
}
private void syncTime(RgvLifeRecMessage rgvLifeRecMessage, Rgv rgv) {
if (!rgvLifeRecMessage.isTimeSync()) {
this.syncTiming = true;
(new Thread(() -> {
try {
ToRes toRes = ToRes.getInstance(rgv);
toRes.syncTime(Integer.valueOf(0));
} catch (Exception e) {
WcsUtil.exceptionLog(e, getClass());
}
this.syncTiming = false;
})).start();
}
}
public static void doExec(byte[] receiveByte) {
long receiveTime = System.currentTimeMillis();
ResultBase receiveMsg = ByteBeanUtil.parseByte(receiveByte);
receiveMsg.setRetTime(receiveTime);
if (receiveMsg instanceof HeartBaseResult) {
Rgv rgv = SystemInit.getByRgvNo(receiveMsg.getDeviceNo());
baseInfoHandle((HeartBaseResult)receiveMsg, rgv);
} else if (receiveMsg instanceof MapDataResult) {
Rgv rgv = SystemInit.getByRgvNo(receiveMsg.getDeviceNo());
mapInfoHandle((MapDataResult)receiveMsg, rgv);
}
}
private static void mapInfoHandle(MapDataResult mapDataResult, Rgv rgv) {
ResultContainer.getContainer(rgv).putMapResultMap(mapDataResult.getDeviceNo(), (ResultBase)mapDataResult);
}
private static void baseInfoHandle(HeartBaseResult heartBaseResult, Rgv rgv) {
if (RgvStatus.parseStatus(heartBaseResult.getRgvStatus().intValue()) != RgvStatus.OFF_LINE) {
ResultContainer.getContainer(rgv).putResult(Integer.valueOf(heartBaseResult.getCmdNo()), heartBaseResult);
ResultContainer.getContainer(rgv).putResult(Integer.valueOf(heartBaseResult.getTaskNo()), heartBaseResult);
rgv.setPalletStatus(PalletStatus.parseStatus(heartBaseResult.getPalletStatus().intValue()));
rgv.setDirection(parseDirection(heartBaseResult.getDriveDirection(), Integer.valueOf((SystemInit.wareHouseDB == null) ? 1 : SystemInit.wareHouseDB.getMapDirection().intValue())));
rgv.setElectricStatus(ElectricStatus.parseStatus(heartBaseResult.getBattery().intValue(), rgv));
rgv.setResTaskResult(Integer.valueOf(heartBaseResult.getTaskResult()));
rgv.setBattery(heartBaseResult.getBattery());
rgv.setSameMapVersion((heartBaseResult.getIsSameMapVersion().intValue() == 0));
rgv.setCurrSegment(heartBaseResult.getCurentSegment());
rgv.setSegmentLocation(heartBaseResult.getSegmentLocation());
String codeDescByWarning = codeDBService.getCodeDescByWarning(heartBaseResult.getStatusMessage());
if (codeDescByWarning != null) {
rgv.setStatusDescription(codeDescByWarning);
} else if (rgv.getCurResTaskNo() == null) {
rgv.setStatusDescription(null);
}
rgv.setBarrierAtOne(Integer.valueOf(heartBaseResult.getBarrierAtOne()));
rgv.setBarrierAtTwo(Integer.valueOf(heartBaseResult.getBarrierAtTwo()));
rgv.setBarrierAtThree(Integer.valueOf(heartBaseResult.getBarrierAtThree()));
rgv.setBarrierAtFour(Integer.valueOf(heartBaseResult.getBarrierAtFour()));
rgv.setHasPallet(Integer.valueOf(heartBaseResult.getOffsetGroundCode()));
rgv.setLocationCode(String.valueOf(heartBaseResult.getOffsetGroundCode()));
if (heartBaseResult.getCurBarcode().intValue() != 16776991) {
rgv.setGroundCode(String.format("%06d", new Object[] { heartBaseResult.getCurBarcode() }));
} else {
rgv.setGroundCode(null);
}
rgv.setDirectionStatus(DirectionStatus.parseStatus(heartBaseResult.getReserveStatus().intValue()));
Node oldLocation = rgv.getCurLocation();
if (heartBaseResult.getX().intValue() == 255 || heartBaseResult.getY().intValue() == 255 || heartBaseResult.getZ().intValue() == 31) {
rgv.setCurLocation(null);
} else {
rgv.setCurLocation(new Node(heartBaseResult.getX().intValue(), heartBaseResult.getY().intValue(), heartBaseResult.getZ().intValue()));
rgv.getRgvDB().setLocation(rgv.getCurLocation().toString());
if (oldLocation != null && !oldLocation.equals(rgv.getCurLocation())) {
rgvdbService.updateRgvLocation(rgv.getRgvDB());
LockNodeManager.updateLocationLock(rgv);
}
}
rgv.updateWcsTimeModuleResultBO((Coord)rgv.getCurLocation());
}
rgv.setRgvResStatus(RgvStatus.parseStatus(heartBaseResult.getRgvStatus().intValue()));
if (rgv.getRgvStatus() != RgvStatus.ERROR)
rgv.setRgvStatus(RgvStatus.parseStatus(heartBaseResult.getRgvStatus().intValue()));
}
private static Integer parseDirection(Integer resDirection, Integer carDirection) {
if (resDirection.intValue() == 0)
return resDirection;
if (resDirection.intValue() < 0 || resDirection.intValue() > 4)
return Integer.valueOf(5);
switch (carDirection.intValue()) {
case 3:
return Integer.valueOf((resDirection.intValue() + 0) % 4);
case 2:
return Integer.valueOf((resDirection.intValue() + 1) % 4);
case 1:
return Integer.valueOf((resDirection.intValue() + 2) % 4);
case 4:
return Integer.valueOf((resDirection.intValue() + 3) % 4);
}
return Integer.valueOf(5);
}
}