#
Junjie
1 天以前 6694bb8752aced4b818f2976442d66ae3a52e9e8
src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
@@ -9,10 +9,8 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zy.asrs.entity.BasShuttle;
import com.zy.asrs.entity.DeviceConfig;
import com.zy.asrs.entity.DeviceDataLog;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.BasShuttleService;
import com.zy.asrs.service.DeviceDataLogService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.ExecuteSupport;
@@ -22,10 +20,12 @@
import com.zy.common.utils.NavigateMapData;
import com.zy.common.utils.NavigatePositionConvert;
import com.zy.common.utils.RedisUtil;
import com.zy.common.utils.ShuttleOperaUtils;
import com.zy.core.News;
import com.zy.core.model.DeviceCommandMsgModel;
import com.zy.core.utils.DeviceMsgUtils;
import com.zy.core.action.ShuttleAction;
import com.zy.core.model.DeviceCommandMsgModel;
import com.zy.core.model.command.ShuttleAssignCommand;
import com.zy.core.utils.DeviceMsgUtils;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.*;
import com.zy.core.model.CommandResponse;
@@ -88,78 +88,38 @@
        });
        readThread.start();
        //设备执行
        Thread executeThread = new Thread(() -> {
            while (true) {
                try {
                    ShuttleAction shuttleAction = null;
                    try {
                        shuttleAction = SpringUtils.getBean(ShuttleAction.class);
                    }catch (Exception e){
                        continue;
                    }
                    if (shuttleAction == null) {
                        continue;
                    }
                    Object object = redisUtil.get(RedisKeyType.SHUTTLE_FLAG.key + deviceConfig.getDeviceNo());
                    if (object == null) {
                        continue;
                    }
                    Integer taskNo = Integer.valueOf(String.valueOf(object));
                    if (taskNo != 0) {
                        //存在任务需要执行
                        boolean result = shuttleAction.executeWork(deviceConfig.getDeviceNo(), taskNo);
                    }
                    Thread.sleep(100);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        executeThread.start();
//        //其他任务
//        Thread otherThread = new Thread(() -> {
//        //设备执行
//        Thread executeThread = new Thread(() -> {
//            while (true) {
//                try {
//                    saveLog();//保存数据
//                    ShuttleAction shuttleAction = null;
//                    try {
//                        shuttleAction = SpringUtils.getBean(ShuttleAction.class);
//                    }catch (Exception e){
//                        continue;
//                    }
//
//                    if (shuttleAction == null) {
//                        continue;
//                    }
//
//                    Object object = redisUtil.get(RedisKeyType.SHUTTLE_FLAG.key + deviceConfig.getDeviceNo());
//                    if (object == null) {
//                        continue;
//                    }
//
//                    Integer taskNo = Integer.valueOf(String.valueOf(object));
//                    if (taskNo != 0) {
//                        //存在任务需要执行
//                        boolean result = shuttleAction.executeWork(deviceConfig.getDeviceNo(), taskNo);
//                    }
//                    Thread.sleep(100);
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        });
//        otherThread.start();
    }
    private void saveLog() {
        if (shuttleProtocol == null) {
            return;
        }
        if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 1000 * 5) {
            if (this.originDeviceData != null) {
                //采集时间超过5s,保存一次数据记录
                //保存数据记录
                DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class);
                if (deviceDataLogService == null) {
                    return;
                }
                DeviceDataLog deviceDataLog = new DeviceDataLog();
                deviceDataLog.setOriginData(JSON.toJSONString(this.originDeviceData));
                deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol));
                deviceDataLog.setType(String.valueOf(SlaveType.Shuttle));
                deviceDataLog.setDeviceNo(deviceConfig.getDeviceNo());
                deviceDataLog.setCreateTime(new Date());
                deviceDataLogService.insert(deviceDataLog);
                //更新采集时间
                shuttleProtocol.setDeviceDataLog(System.currentTimeMillis());
                OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), deviceConfig.getDeviceNo()));
            }
        }
//        executeThread.start();
    }
    private void listenMessageFromRedis() {
@@ -775,7 +735,7 @@
                //将路径锁与小车路径进行匹配
                ArrayList<NavigateNode> tmp = new ArrayList<>();
                //检测路径是否被锁定
                int[][] map = navigateMapData.getDataFromRedis(lev, NavigationMapType.DFX.id, null, null);
                int[][] map = navigateMapData.getDataFromRedis(lev, NavigationMapType.getDfxWithDevice(), null, null);
                for (NavigateNode node : path) {
                    if(map[node.getX()][node.getY()] == -999) {
                        tmp.add(node);
@@ -795,6 +755,9 @@
    @Override
    public synchronized boolean setProtocolStatus(ShuttleProtocolStatusType status) {
        if (status.equals(ShuttleProtocolStatusType.IDLE)) {
            this.shuttleProtocol.setIdleTime(System.currentTimeMillis());
        }
        this.shuttleProtocol.setProtocolStatus(status);
        return true;
    }
@@ -864,6 +827,18 @@
    }
    @Override
    public boolean setTrafficControl(boolean enable, List<NavigateNode> nodeList) {
        shuttleProtocol.setTrafficControl(enable);
        shuttleProtocol.setTrafficControlNodes(nodeList);
        return true;
    }
    @Override
    public void updateDeviceDataLogTime(long time) {
        shuttleProtocol.setDeviceDataLog(time);
    }
    @Override
    public JSONObject parseStatusToMsg(ShuttleProtocol shuttleProtocol) {
        JSONObject result = new JSONObject();
        result.put("msgType", "responseMsg");
@@ -877,6 +852,94 @@
        body.put("responseType", "state");
        return null;
    }
    @Override
    public boolean restartCalcPath() {
        ConfigService configService = SpringUtils.getBean(ConfigService.class);
        if (configService == null) {
            return false;
        }
        ShuttleAction shuttleAction = SpringUtils.getBean(ShuttleAction.class);
        if (shuttleAction == null) {
            return false;
        }
        ShuttleOperaUtils shuttleOperaUtils = SpringUtils.getBean(ShuttleOperaUtils.class);
        if (shuttleOperaUtils == null) {
            return false;
        }
        ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class);
        if (objectMapper == null) {
            return false;
        }
        boolean trafficControlRestartCalcPath = false;
        Config trafficControlRestartCalcPathConfig = configService.selectOne(new EntityWrapper<Config>()
                .eq("code", "trafficControlRestartCalcPath")
        );
        if(trafficControlRestartCalcPathConfig != null) {
            trafficControlRestartCalcPath = trafficControlRestartCalcPathConfig.getValue().equals("Y") ? true : false;
        }
        if (!trafficControlRestartCalcPath) {
            return false;
        }
        if (shuttleProtocol.getTaskNo() == 0) {
            return false;
        }
        if (!this.isDeviceIdle()) {
            return false;
        }
        Object object = redisUtil.get(RedisKeyType.SHUTTLE_RESTART_CALC_PATH.key + shuttleProtocol.getShuttleNo());
        if (object != null) {
            return false;
        }
        Integer taskNo = shuttleProtocol.getTaskNo();
        Object obj = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + taskNo);
        if (obj == null) {
            return false;
        }
        ShuttleRedisCommand redisCommand = null;
        try {
            redisCommand = objectMapper.readValue(String.valueOf(obj), ShuttleRedisCommand.class);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        if (redisCommand == null) {
            return false;
        }
        ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand();
        String locNo = assignCommand.getLocNo();
        List<NavigationMapType> mapTypes = assignCommand.getMapTypes();
        if (locNo == null) {
            return false;
        }
        if (mapTypes == null) {
            return false;
        }
        String currentLocNo = shuttleProtocol.getCurrentLocNo();
        List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(currentLocNo, locNo, mapTypes, assignCommand, this);
        if (commands == null) {
            return false;
        }
        assignCommand.setCommands(commands);
        //下发任务
        shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
        redisUtil.set(RedisKeyType.SHUTTLE_RESTART_CALC_PATH.key + shuttleProtocol.getShuttleNo(), true, 60);
        return true;
    }
    @Override
@@ -905,7 +968,7 @@
            int yp = Integer.parseInt(String.valueOf(nyNode.get("x")));
            int z = Integer.parseInt(String.valueOf(nyNode.get("z")));
            List<List<MapNode>> mapData = navigateMapData.getJsonData(startNode.getZ(), NavigationMapType.NONE.id, null, null);
            List<List<MapNode>> mapData = navigateMapData.getJsonData(startNode.getZ(), NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);
            List<MapNode> mapNodes = mapData.get(node.getX());
            MapNode mapNode = mapNodes.get(node.getY());
@@ -1021,7 +1084,7 @@
            throw new CoolException("地址码不存在");
        }
        List<List<MapNode>> mapData = navigateMapData.getJsonData(lev, NavigationMapType.NONE.id, null, null);
        List<List<MapNode>> mapData = navigateMapData.getJsonData(lev, NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);
        List<MapNode> mapNodes = mapData.get(locMast.getRow1());
        MapNode mapNode = mapNodes.get(locMast.getBay1());
@@ -1195,6 +1258,11 @@
        return new int[]{data.getInteger("y"), data.getInteger("x"), z};
    }
    @Override
    public Object getOriginDeviceData() {
        return this.originDeviceData;
    }
    @Data
    private class InnerSuhttleExtend {