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 fakeThreadMap = new ConcurrentHashMap(); private ConcurrentHashMap fakeStatusMap = new ConcurrentHashMap(); private ConcurrentHashMap 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 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 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 keys = redisUtil.searchKeys(RedisKeyType.FAKE_DEVICE_FORK_LIFT_COMMAND_MSG_KEY.key + device.getDeviceNo()); if (keys.isEmpty()) { return; } TreeSet 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 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 genereateFakeStatusResponse(JSONObject fakeStatus) { JSONObject device = new JSONObject(); HashMap 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 trayList = new ArrayList<>(); if (trayListObj != null) { trayList = JSON.parseArray(JSON.toJSONString(trayListObj), Integer.class); } Object carListObj = fakeStatus.get("carList"); List 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 genereateFakeCommandResponse() { HashMap resultData = new HashMap<>(); resultData.put("result", "success"); return resultData; } @Override public boolean connect() { return true; } @Override public void close() { } @Override public ConcurrentHashMap getFakeThreadMap() { return this.fakeThreadMap; } @Override public ConcurrentHashMap getFakeStatusMap() { return this.fakeStatusMap; } @Override public ConcurrentHashMap 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; } }