package com.zy.core.thread.fake;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.zy.common.Cools;
|
import com.zy.common.SpringUtils;
|
import com.zy.common.utils.RedisUtil;
|
import com.zy.core.News;
|
import com.zy.core.cache.SlaveConnection;
|
import com.zy.core.enums.RedisKeyType;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.DeviceCommandMsgModel;
|
import com.zy.core.model.DeviceMsgModel;
|
import com.zy.core.model.param.UpdateFakeThreadStatusParam;
|
import com.zy.core.properties.DeviceConfig;
|
import com.zy.core.thread.FakeThread;
|
import com.zy.core.thread.impl.ZyForkLiftThread;
|
import com.zy.core.utils.DeviceMsgUtils;
|
import com.zy.core.utils.FakeDeviceUtils;
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.io.*;
|
import java.util.*;
|
import java.util.concurrent.ConcurrentHashMap;
|
|
@Slf4j
|
@SuppressWarnings("all")
|
public class FakeZyForkLiftThread implements FakeThread {
|
|
private RedisUtil redisUtil;
|
private JSONObject fakeStatusDemo = JSONObject.parseObject("{\"model\":2,\"wrkNo\":0,\"lev\":1,\"protocolStatus\":0,\"taskMode\":0,\"pick\":0,\"put\":0,\"iOMode\":0,\"errorCode\":0,\"trayList\":[0,0,0,0],\"carList\":[0,0,0,0]}");
|
private ConcurrentHashMap<String, Thread> fakeThreadMap = new ConcurrentHashMap();
|
private ConcurrentHashMap<String, JSONObject> fakeStatusMap = new ConcurrentHashMap();
|
private ConcurrentHashMap<String, JSONObject> fakeCommandMap = new ConcurrentHashMap();
|
|
private boolean fake = false;
|
|
public FakeZyForkLiftThread(RedisUtil redisUtil) {
|
this.redisUtil = redisUtil;
|
}
|
|
@Override
|
public void run() {
|
News.info("Fake Server is Started");
|
|
Thread fakeCommandThread = new Thread(() -> {
|
while (true) {
|
try {
|
FakeDeviceUtils fakeDeviceUtils = null;
|
try {
|
fakeDeviceUtils = SpringUtils.getBean(FakeDeviceUtils.class);
|
}catch (Exception e){}
|
if(fakeDeviceUtils == null){
|
continue;
|
}
|
List<DeviceConfig> deviceConfigs = fakeDeviceUtils.getFakeDeviceConfig();
|
for (DeviceConfig device : deviceConfigs) {
|
excuteFakeCommand(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo());
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
});
|
fakeCommandThread.start();
|
|
while (true) {
|
try {
|
initFakeDeviceServer();
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
}
|
|
private synchronized void initFakeDeviceServer() {
|
FakeDeviceUtils fakeDeviceUtils = null;
|
try {
|
fakeDeviceUtils = SpringUtils.getBean(FakeDeviceUtils.class);
|
}catch (Exception e){}
|
if(fakeDeviceUtils == null){
|
return;
|
}
|
List<DeviceConfig> deviceConfigs = fakeDeviceUtils.getFakeDeviceConfig();
|
for (DeviceConfig device : deviceConfigs) {
|
if (!device.getDeviceType().equals(String.valueOf(SlaveType.ForkLift))) {
|
continue;
|
}
|
|
if (!device.getThreadImpl().equals("ZyForkLiftThread")) {
|
continue;
|
}
|
|
if (fakeThreadMap.containsKey(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo())) {
|
continue;
|
}
|
|
Thread fakeThread = new Thread(() -> {
|
log.info("{}:device is start handle client", device.getDeviceNo());
|
try {
|
while (true) {
|
handleClient(device);
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
});
|
fakeThread.start();
|
|
String fakeStatus = JSON.toJSONString(fakeStatusDemo);
|
if (!Cools.isEmpty(device.getFakeInitStatus())) {
|
fakeStatus = device.getFakeInitStatus();
|
}
|
fakeThreadMap.put(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo(), fakeThread);
|
fakeStatusMap.put(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo(), JSON.parseObject(fakeStatus));
|
|
|
// init
|
ZyForkLiftThread thread = new ZyForkLiftThread(device, redisUtil);;
|
new Thread(thread).start();
|
SlaveConnection.put(SlaveType.ForkLift, device.getDeviceNo(), thread);
|
}
|
}
|
|
private void excuteFakeCommand(String key) {
|
if (!fakeCommandMap.containsKey(key)) {
|
return;
|
}
|
JSONObject command = fakeCommandMap.get(key);
|
JSONObject commandBody = command.getJSONObject("commandBody");
|
fakeCommandMap.remove(key);
|
new Thread(() -> {
|
try {
|
JSONObject fakeStatus = fakeStatusMap.get(key);
|
Integer commandType = command.getInteger("commandType");
|
if (commandType == null) {
|
return;
|
}
|
|
if (commandType == 3) {
|
//取放货
|
fakeStatus.put("wrkNo", commandBody.getInteger("taskNo"));//任务号
|
fakeStatus.put("protocolStatus", 1);//取货中
|
fakeStatus.put("taskMode", commandType);//任务类型
|
fakeStatus.put("pick", commandBody.getInteger("pick"));//取货数据
|
fakeStatus.put("put", commandBody.getInteger("put"));//放货数据
|
fakeStatusMap.put(key, fakeStatus);
|
|
//delay
|
Thread.sleep(5000);
|
fakeStatus.put("protocolStatus", 2);//放货中
|
fakeStatusMap.put(key, fakeStatus);
|
|
//delay
|
Thread.sleep(5000);
|
|
fakeStatus.put("protocolStatus", 98);//等待确认
|
fakeStatus.put("lev", commandBody.getInteger("put"));
|
fakeStatusMap.put(key, fakeStatus);
|
} else if (commandType == 4) {
|
//小车换层
|
fakeStatus.put("wrkNo", commandBody.getInteger("taskNo"));//任务号
|
fakeStatus.put("protocolStatus", 1);//取货中
|
fakeStatus.put("taskMode", commandType);//任务类型
|
fakeStatus.put("pick", commandBody.getInteger("pick"));//取货数据
|
fakeStatus.put("put", commandBody.getInteger("put"));//放货数据
|
fakeStatusMap.put(key, fakeStatus);
|
|
//delay
|
Thread.sleep(5000);
|
fakeStatus.put("protocolStatus", 2);//放货中
|
fakeStatusMap.put(key, fakeStatus);
|
|
//delay
|
Thread.sleep(5000);
|
|
fakeStatus.put("protocolStatus", 98);//等待确认
|
fakeStatus.put("lev", commandBody.getInteger("put"));
|
fakeStatusMap.put(key, fakeStatus);
|
} else if (commandType == 5) {
|
//提升机移动
|
fakeStatus.put("wrkNo", commandBody.getInteger("taskNo"));//任务号
|
fakeStatus.put("protocolStatus", 3);//移动中
|
fakeStatus.put("taskMode", commandType);//任务类型
|
fakeStatus.put("pick", commandBody.getInteger("pick"));//取货数据
|
fakeStatus.put("put", commandBody.getInteger("put"));//放货数据
|
fakeStatusMap.put(key, fakeStatus);
|
|
//delay
|
Thread.sleep(5000);
|
|
fakeStatus.put("protocolStatus", 98);//等待确认
|
fakeStatus.put("lev", commandBody.getInteger("pick"));
|
fakeStatusMap.put(key, fakeStatus);
|
} else if (commandType == 9996) {
|
//复位
|
fakeStatus.put("wrkNo", 0);//任务号
|
fakeStatus.put("protocolStatus", 0);
|
fakeStatus.put("taskMode", 0);//任务类型
|
fakeStatus.put("pick", 0);//取货数据
|
fakeStatus.put("put", 0);//放货数据
|
fakeStatusMap.put(key, fakeStatus);
|
} else if (commandType == 9997) {
|
//切换入库模式
|
fakeStatus.put("iOMode", 1);//出入库模式
|
fakeStatusMap.put(key, fakeStatus);
|
} else if (commandType == 9998) {
|
//切换出库模式
|
fakeStatus.put("iOMode", 2);//出入库模式
|
fakeStatusMap.put(key, fakeStatus);
|
}
|
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}).start();
|
}
|
|
private void handleClient(DeviceConfig device) throws IOException {
|
try {
|
Set<String> keys = redisUtil.searchKeys(RedisKeyType.FAKE_DEVICE_FORK_LIFT_COMMAND_MSG_KEY.key + device.getDeviceNo());
|
if (keys.isEmpty()) {
|
return;
|
}
|
|
TreeSet<String> treeSet = new TreeSet<>();
|
for (String key : keys) {
|
treeSet.add(key);
|
}
|
|
String first = treeSet.first();
|
DeviceCommandMsgModel deviceCommandMsgModel = (DeviceCommandMsgModel) redisUtil.get(first);
|
redisUtil.del(first);
|
|
// log.info("收到Client Data: {}", JSON.toJSONString(result));
|
processCommand(deviceCommandMsgModel, device);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
private void removeFake(DeviceConfig device) {
|
Thread thread = fakeThreadMap.get(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo());
|
if (thread != null) {
|
thread.interrupt();
|
}
|
|
fakeThreadMap.remove(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo());
|
fakeStatusMap.remove(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo());
|
fakeCommandMap.remove(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo());
|
}
|
|
public void processCommand(DeviceCommandMsgModel deviceCommandMsgModel, DeviceConfig device) throws IOException {
|
DeviceMsgUtils deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class);
|
if (deviceMsgUtils == null) {
|
return;
|
}
|
|
HashMap<String, Object> response = null;
|
JSONObject fakeStatus = fakeStatusMap.get(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo());
|
|
String command = JSON.toJSONString(deviceCommandMsgModel.getCommand());
|
JSONObject commandObj = JSON.parseObject(command);
|
Integer mode = commandObj.getInteger("mode");
|
|
String deviceMsgType = "command";
|
JSONObject fakeCommand = new JSONObject();
|
fakeCommand.put("deviceNo", device.getDeviceNo());
|
fakeCommand.put("deviceType", device.getDeviceType());
|
fakeCommand.put("commandType", commandObj.getInteger("mode"));
|
fakeCommand.put("commandBody", command);
|
if (mode == 3) {
|
//取放货
|
fakeCommandMap.put(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo(), fakeCommand);
|
response = genereateFakeCommandResponse();
|
} else if (mode == 4) {
|
//小车换层
|
fakeCommandMap.put(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo(), fakeCommand);
|
response = genereateFakeCommandResponse();
|
} else if (mode == 5) {
|
//提升机移动
|
fakeCommandMap.put(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo(), fakeCommand);
|
response = genereateFakeCommandResponse();
|
} else if (mode == 9996) {
|
//复位
|
fakeCommandMap.put(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo(), fakeCommand);
|
response = genereateFakeCommandResponse();
|
} else if (mode == 9997) {
|
//切换入库模式
|
fakeCommandMap.put(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo(), fakeCommand);
|
response = genereateFakeCommandResponse();
|
} else if (mode == 9998) {
|
//切换出库模式
|
fakeCommandMap.put(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo(), fakeCommand);
|
response = genereateFakeCommandResponse();
|
} else if (mode == 9999) {
|
//读取状态
|
response = genereateFakeStatusResponse(fakeStatus);
|
deviceMsgType = "status";
|
}
|
|
fakeStatusMap.put(String.valueOf(SlaveType.ForkLift) + device.getDeviceNo(), fakeStatus);
|
|
if (deviceMsgType.equals("command")) {
|
log.info("收到Rcs ForkLift Command Data: {}", JSON.toJSONString(deviceCommandMsgModel));
|
}
|
DeviceMsgModel deviceMsgModel = new DeviceMsgModel();
|
deviceMsgModel.setDeviceId(device.getDeviceNo());
|
deviceMsgModel.setDeviceMsgType(deviceMsgType);
|
deviceMsgModel.setDeviceMsg(response);
|
deviceMsgModel.setDeviceOriginMsg(JSON.toJSONString(response));
|
deviceMsgModel.setResultKey(deviceCommandMsgModel.getResultKey());
|
deviceMsgUtils.sendDeviceMsg(SlaveType.ForkLift, device.getDeviceNo(), deviceMsgModel);
|
}
|
|
public HashMap<String, Object> genereateFakeStatusResponse(JSONObject fakeStatus) {
|
JSONObject device = new JSONObject();
|
HashMap<String, Object> resultData = new HashMap<>();
|
resultData.put("result", "success");
|
resultData.put("deviceStatus", device);
|
|
|
device.put("model", fakeStatus.getInteger("model"));
|
device.put("wrkNo", fakeStatus.getInteger("wrkNo"));
|
device.put("protocolStatus", fakeStatus.getInteger("protocolStatus"));
|
device.put("taskMode", fakeStatus.getInteger("taskMode"));
|
device.put("pick", fakeStatus.getInteger("pick"));
|
device.put("put", fakeStatus.getInteger("put"));
|
device.put("iOMode", fakeStatus.getInteger("iOMode"));
|
device.put("errorCode", fakeStatus.getInteger("errorCode"));
|
device.put("lev", fakeStatus.getInteger("lev"));
|
|
Object trayListObj = fakeStatus.get("trayList");
|
List<Integer> trayList = new ArrayList<>();
|
if (trayListObj != null) {
|
trayList = JSON.parseArray(JSON.toJSONString(trayListObj), Integer.class);
|
}
|
|
Object carListObj = fakeStatus.get("carList");
|
List<Integer> carList = new ArrayList<>();
|
if (carListObj != null) {
|
carList = JSON.parseArray(JSON.toJSONString(carListObj), Integer.class);
|
}
|
|
device.put("trayList", trayList);
|
device.put("carList", carList);
|
return resultData;
|
}
|
|
public HashMap<String, Object> genereateFakeCommandResponse() {
|
HashMap<String, Object> resultData = new HashMap<>();
|
resultData.put("result", "success");
|
return resultData;
|
}
|
|
@Override
|
public boolean connect() {
|
return true;
|
}
|
|
@Override
|
public void close() {
|
|
}
|
|
@Override
|
public ConcurrentHashMap<String, Thread> getFakeThreadMap() {
|
return this.fakeThreadMap;
|
}
|
|
@Override
|
public ConcurrentHashMap<String, JSONObject> getFakeStatusMap() {
|
return this.fakeStatusMap;
|
}
|
|
@Override
|
public ConcurrentHashMap<String, JSONObject> getFakeCommandMap() {
|
return this.fakeCommandMap;
|
}
|
|
@Override
|
public boolean updateFakeStatus(UpdateFakeThreadStatusParam param) {
|
String key = param.getDeviceType() + param.getDeviceNo();
|
JSONObject result = fakeStatusMap.get(key);
|
if (result == null) {
|
return false;
|
}
|
|
JSONObject newData = JSON.parseObject(param.getData());
|
this.fakeStatusMap.put(key, newData);
|
return true;
|
}
|
}
|