package com.zy.core.thread.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.core.common.DateUtils;
|
import com.core.common.SpringUtils;
|
import com.zy.asrs.entity.BasRgv;
|
import com.zy.asrs.entity.BasRgvOpt;
|
import com.zy.asrs.entity.DeviceConfig;
|
import com.zy.asrs.entity.DeviceDataLog;
|
import com.zy.asrs.service.BasRgvService;
|
import com.zy.asrs.service.BasRgvOptService;
|
import com.zy.asrs.utils.Utils;
|
import com.zy.common.utils.RedisUtil;
|
import com.zy.core.cache.MessageQueue;
|
import com.zy.core.cache.OutputQueue;
|
import com.zy.core.enums.RedisKeyType;
|
import com.zy.core.enums.RgvTaskModeType;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.CommandResponse;
|
import com.zy.core.model.Task;
|
import com.zy.core.model.command.RgvCommand;
|
import com.zy.core.model.protocol.RgvProtocol;
|
import com.zy.core.network.DeviceConnectPool;
|
import com.zy.core.network.ZyRgvConnectDriver;
|
import com.zy.core.network.entity.ZyRgvStatusEntity;
|
import com.zy.core.thread.RgvThread;
|
import lombok.Data;
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.text.MessageFormat;
|
import java.util.Date;
|
|
@Data
|
@Slf4j
|
public class ZyRgvThread implements Runnable, RgvThread {
|
|
private DeviceConfig deviceConfig;
|
private RedisUtil redisUtil;
|
private ZyRgvConnectDriver zyRgvConnectDriver;
|
private RgvProtocol rgvProtocol;
|
private int deviceLogCollectTime = 200;
|
|
public ZyRgvThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
|
this.deviceConfig = deviceConfig;
|
this.redisUtil = redisUtil;
|
}
|
|
@Override
|
@SuppressWarnings("InfiniteLoopStatement")
|
public void run() {
|
connect();
|
initRgv();
|
while (true) {
|
try {
|
deviceLogCollectTime = Utils.getDeviceLogCollectTime();
|
int step = 1;
|
Task task = MessageQueue.poll(SlaveType.Rgv, deviceConfig.getDeviceNo());
|
if (task != null) {
|
step = task.getStep();
|
}
|
switch (step) {
|
case 1:
|
readStatus();
|
break;
|
case 2:
|
sendCommand((RgvCommand) task.getData());
|
break;
|
default:
|
break;
|
}
|
Thread.sleep(200);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
private void initRgv() {
|
if (rgvProtocol == null) {
|
rgvProtocol = new RgvProtocol();
|
rgvProtocol.setRgvNo(deviceConfig.getDeviceNo());
|
}
|
rgvProtocol.setMode(0);
|
rgvProtocol.setTaskNo(0);
|
rgvProtocol.setStatus(-1);
|
rgvProtocol.setRgvPos(0);
|
rgvProtocol.setLoaded(0);
|
rgvProtocol.setAlarm(0);
|
}
|
|
@Override
|
public boolean connect() {
|
zyRgvConnectDriver = new ZyRgvConnectDriver(deviceConfig);
|
new Thread(zyRgvConnectDriver).start();
|
DeviceConnectPool.put(SlaveType.Rgv, deviceConfig.getDeviceNo(), zyRgvConnectDriver);
|
return true;
|
}
|
|
private void readStatus() {
|
ZyRgvStatusEntity s = zyRgvConnectDriver.getStatus();
|
if (s == null) {
|
OutputQueue.RGV.offer(MessageFormat.format("【{0}】读取RGV状态失败 ===>> [id:{1}] [ip:{2}] [port:{3}]",
|
DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()));
|
return;
|
}
|
rgvProtocol.setMode(s.getMode());
|
rgvProtocol.setTaskNo(s.getTaskNo());
|
rgvProtocol.setStatus(s.getStatus());
|
rgvProtocol.setRgvPos(s.getRgvPos());
|
rgvProtocol.setLoaded(s.getLoaded());
|
rgvProtocol.setAlarm(s.getAlarm());
|
OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< RGV实时数据更新成功",
|
DateUtils.convert(new Date()), deviceConfig.getDeviceNo()));
|
|
if (rgvProtocol.getAlarm() > 0) {
|
rgvProtocol.setLastCommandTime(-1L);
|
}
|
if (rgvProtocol.getAlarm() == 0 && rgvProtocol.getLastCommandTime() == -1) {
|
rgvProtocol.setLastCommandTime(System.currentTimeMillis());
|
}
|
|
if (System.currentTimeMillis() - rgvProtocol.getDeviceDataLog() > deviceLogCollectTime) {
|
DeviceDataLog deviceDataLog = new DeviceDataLog();
|
deviceDataLog.setOriginData(JSON.toJSONString(s));
|
deviceDataLog.setWcsData(JSON.toJSONString(rgvProtocol));
|
deviceDataLog.setType(String.valueOf(SlaveType.Rgv));
|
deviceDataLog.setDeviceNo(rgvProtocol.getRgvNo());
|
deviceDataLog.setCreateTime(new Date());
|
redisUtil.set(RedisKeyType.DEVICE_LOG_KEY.key + System.currentTimeMillis(), deviceDataLog, 60 * 60 * 24);
|
rgvProtocol.setDeviceDataLog(System.currentTimeMillis());
|
}
|
|
BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class);
|
if (basRgvService != null) {
|
BasRgv basRgv = basRgvService.selectOne(new EntityWrapper<BasRgv>().eq("rgv_no", deviceConfig.getDeviceNo()));
|
if(basRgv == null) {
|
basRgv = new BasRgv();
|
basRgv.setRgvNo(deviceConfig.getDeviceNo());
|
basRgv.setStatus(1);
|
basRgv.setCreateTime(new Date());
|
basRgvService.insert(basRgv);
|
}
|
}
|
}
|
|
@Override
|
public void close() {
|
zyRgvConnectDriver.close();
|
}
|
|
@Override
|
public RgvProtocol getStatus() {
|
return rgvProtocol;
|
}
|
|
@Override
|
public RgvCommand getTransportCommand(Integer taskNo, Integer rgvNo, Integer sourcePos, Integer targetPos) {
|
RgvCommand cmd = new RgvCommand();
|
cmd.setRgvNo(rgvNo);
|
cmd.setTaskNo(taskNo);
|
cmd.setTaskMode(RgvTaskModeType.FETCH_PUT.id);
|
cmd.setSourcePos(sourcePos);
|
cmd.setTargetPos(targetPos);
|
cmd.setCommand(1);
|
return cmd;
|
}
|
|
@Override
|
public RgvCommand getMoveCommand(Integer taskNo, Integer rgvNo, Integer targetPos) {
|
RgvCommand cmd = new RgvCommand();
|
cmd.setRgvNo(rgvNo);
|
cmd.setTaskNo(taskNo);
|
cmd.setTaskMode(RgvTaskModeType.X_MOVE.id);
|
cmd.setTargetPos(targetPos);
|
cmd.setCommand(1);
|
return cmd;
|
}
|
|
@Override
|
public RgvCommand getResetCommand(Integer rgvNo) {
|
RgvCommand cmd = new RgvCommand();
|
cmd.setRgvNo(rgvNo);
|
cmd.setTaskNo(0);
|
cmd.setAckFinish(1);
|
cmd.setTaskMode(0);
|
cmd.setCommand(1);
|
return cmd;
|
}
|
|
@Override
|
public synchronized CommandResponse sendCommand(RgvCommand command) {
|
rgvProtocol.setLastCommandTime(System.currentTimeMillis());
|
CommandResponse response = null;
|
try {
|
response = zyRgvConnectDriver.sendCommand(command);
|
return response;
|
} finally {
|
BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
|
ZyRgvStatusEntity statusEntity = zyRgvConnectDriver.getStatus();
|
BasRgvOpt basRgvOpt = new BasRgvOpt(
|
command.getTaskNo(),
|
command.getRgvNo(),
|
new Date(),
|
String.valueOf(command.getTaskMode()),
|
String.valueOf(command.getSourcePos()),
|
String.valueOf(command.getTargetPos()),
|
null,
|
null,
|
null,
|
JSON.toJSONString(command),
|
JSON.toJSONString(statusEntity),
|
1,
|
JSON.toJSONString(response)
|
);
|
if (bean != null) {
|
bean.insert(basRgvOpt);
|
}
|
}
|
}
|
}
|