//package com.njcn.device.utils;
//
//import cn.hutool.core.collection.CollectionUtil;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.json.JSONArray;
//import cn.hutool.json.JSONObject;
//import com.github.tocrhz.mqtt.publisher.MqttPublisher;
//import com.njcn.common.pojo.dto.LogInfoDTO;
//import com.njcn.device.device.mapper.DevVersionMapper;
//import com.njcn.device.line.mapper.LineMapper;
//import com.njcn.device.pq.pojo.advanced.UpDevVO;
//import com.njcn.device.pq.pojo.po.DevVersion;
//import com.njcn.system.api.UserLogFeignClient;
//import com.njcn.web.utils.RequestUtil;
//import lombok.RequiredArgsConstructor;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//import java.io.*;
//import java.net.*;
//import java.util.*;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//
//
//@Component
//@RequiredArgsConstructor
//public class SocketClient {
//    private static final Logger logger = LoggerFactory.getLogger(SocketClient.class);
//
//    private final MqttPublisher mqttPublisher;
//
//    private final UserLogFeignClient UserLogFeignClient;
//    private final DevVersionMapper devVersionMapper;
//
//    private final ExecutorService executorPool = Executors.newCachedThreadPool();
//    //终端性能socket集合
//    private final Map<String, Socket> socketQuMap = new HashMap<>();
//    private final ConcurrentHashMap<String, Integer> sumDevMap = new ConcurrentHashMap<>();
//
//    private final ConcurrentHashMap<String, Socket> socketMap = new ConcurrentHashMap<>();
//    //用于记录升级装置当前处理总数
//    private final ConcurrentHashMap<String, Integer> sumMap = new ConcurrentHashMap<>();
//    //用于记录升级装置当前重启总数
//    private final ConcurrentHashMap<String, Integer> sumResMap = new ConcurrentHashMap<>();
//    //用于记录升级装置当前取消总数
//    private final ConcurrentHashMap<String, Integer> sumCanMap = new ConcurrentHashMap<>();
//
//    private Map<String, List<String>> lineMap;
//
//    private Map<String, Socket> lineSocketMap;
//    private final LineMapper lineMapper;
//    private boolean finalFlag = true;
//
//
//    //监测点
//    public String sentLine(String ip, String message, String host, Integer port, String name, List<UpDevVO> list) {
//        LogInfoDTO logInfoDTO = new LogInfoDTO();
//        logInfoDTO.setLoginName(RequestUtil.getLoginName());
//        logInfoDTO.setUserName(RequestUtil.getUserNickname());
//        logInfoDTO.setIp(ip);
//        logInfoDTO.setOperateType("查询");
//        logInfoDTO.setType(1);
//        logInfoDTO.setServiceName("device-boot");
//
//
//        String msg = "";
//        Boolean flag = true;
//        String result = null;
//        Socket socket = null;
//        InputStream is = null;
//        BufferedReader din = null;
//        Integer allsum = list.size();
//        Integer succees = 0;
//        Integer fail = 0;
//        try {
//            socket = new Socket(host, port);
//            socket.setSoTimeout(20000);//设置超时时间
//            socket.getOutputStream().write(message.getBytes("UTF-8"));
//            is = socket.getInputStream();
//            din = new BufferedReader(new InputStreamReader(is, "UTF-8"));
//            char[] buffer = new char[100240000];
//            StringBuffer stringBuffer = new StringBuffer();
//            while (true) {
//                int len = din.read(buffer);
//                if (len > -1) {
//                    result = new String(buffer, 0, len);
//                    stringBuffer.append(result);
//                    try {
//                        new JSONObject(stringBuffer);
//                        break;
//                    } catch (Exception e) {
//                        logger.error("未加载完全，持续加载中！");
//                    }
//                }
//            }
//            //todo 先用json测试一下
//            JSONObject jsonObject = new JSONObject(stringBuffer.toString());
//            if (jsonObject != null) {
//                if (jsonObject.get("resultcode").toString().equals("10000")) {
//                    JSONObject data = jsonObject.getJSONObject("data");
//                    if (data == null) {
//                        //表示刚连接成功
//                        flag = true;
//                        mqttPublisher.send("/dev/socketLine/" + name, stringBuffer, 1, false);
//                        msg = "无数据传输";
//                        logInfoDTO.setResult(0);
//                        logInfoDTO.setLevel(1);
//                        logInfoDTO.setOperate("外部定值无数据传输");
//                        UserLogFeignClient.addUserLog(logInfoDTO);
//                    } else {
//                        flag = true;
//                        mqttPublisher.send("/dev/socketLine/" + name, stringBuffer, 1, false);
//                        msg = "请求成功！" + "请稍候......";
//                        logInfoDTO.setResult(1);
//                        logInfoDTO.setLevel(0);
//                        logInfoDTO.setOperate("外部定值获取成功");
//                        UserLogFeignClient.addUserLog(logInfoDTO);
//                    }
//                } else if (jsonObject.get("resultcode").toString().equals("10010")) {
//                    flag = true;
//                    mqttPublisher.send("/dev/socketLine/" + name, stringBuffer, 1, false);
//                    msg = "";
//                } else if (jsonObject.get("resultcode").toString().equals("10003")) {
//                    flag = true;
//                    JSONArray jsonArray = new JSONArray(list);
//                    String json = "{\"resultcode\":" + 10003 + ",\"data\":" + jsonArray.toString() + "}";
//                    mqttPublisher.send("/dev/socketLine/" + name, json, 1, false);
//                    fail += list.size();
//                    msg = "JSON字符串解析出错";
//
//                    logInfoDTO.setResult(0);
//                    logInfoDTO.setLevel(1);
//                    logInfoDTO.setOperate("外部定值获取json解析失败");
//                    logInfoDTO.setFailReason("json解析失败");
//                    UserLogFeignClient.addUserLog(logInfoDTO);
//                } else {
//                    fail++;
//                    flag = true;
//                    mqttPublisher.send("/dev/socketLine/" + name, jsonObject, 1, false);
//                }
//                if (succees + fail == allsum) {
//                    flag = false;
//                }
//            } else {
//                msg = "接收json数据为空";
//            }
//        } catch (ConnectException e) {
//            e.printStackTrace();
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":" + 100 + ",\"data\":" + jsonArray.toString() + "}";
//            mqttPublisher.send("/dev/socketLine/" + name, json, 1, false);
//            msg = "socket连接失败!";
//            logInfoDTO.setResult(0);
//            logInfoDTO.setLevel(1);
//            logInfoDTO.setOperate("socket连接失败");
//            logInfoDTO.setFailReason("连接失败");
//            UserLogFeignClient.addUserLog(logInfoDTO);
//        } catch (SocketException e) {
//            e.printStackTrace();
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":" + 101 + ",\"data\":" + jsonArray.toString() + "}";
//            mqttPublisher.send("/dev/socketLine/" + name, json, 1, false);
//            msg = "socket异常";
//            logInfoDTO.setResult(0);
//            logInfoDTO.setLevel(1);
//            logInfoDTO.setOperate("socket发生异常");
//            logInfoDTO.setFailReason("发生异常");
//            UserLogFeignClient.addUserLog(logInfoDTO);
//        } catch (UnknownHostException e) {
//            e.printStackTrace();
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":\"10011\",\"data\":" + jsonArray.toString() + "}";
//            mqttPublisher.send("/dev/socketLine/" + name, json, 1, false);
//            msg = "DNS解析失败!";
//            logInfoDTO.setResult(0);
//            logInfoDTO.setLevel(1);
//            logInfoDTO.setOperate("socketDNS解析失败");
//            logInfoDTO.setFailReason("DNS解析失败");
//            UserLogFeignClient.addUserLog(logInfoDTO);
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":\"10012\",\"data\":" + jsonArray.toString() + "}";
//            mqttPublisher.send("/dev/socketLine/" + name, json, 1, false);
//            msg = "转码异常!";
//            logInfoDTO.setResult(0);
//            logInfoDTO.setLevel(1);
//            logInfoDTO.setOperate("socket转码异常");
//            logInfoDTO.setFailReason("转码异常");
//            UserLogFeignClient.addUserLog(logInfoDTO);
//        } catch (IOException e) {
//            e.printStackTrace();
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":\"10013\",\"data\":" + jsonArray.toString() + "}";
//            mqttPublisher.send("/dev/socketLine/" + name, json, 1, false);
//            msg = "连接超时导致读写异常!";
//            logInfoDTO.setResult(0);
//            logInfoDTO.setLevel(1);
//            logInfoDTO.setOperate("socket连接超时导致读写异常");
//            logInfoDTO.setFailReason("连接超时");
//            UserLogFeignClient.addUserLog(logInfoDTO);
//        } finally {
//            safeColse(socket, din, is, null);
//        }
//        return msg;
//    }
//
//    //终端校验内部定值
//    public String sentDZDev(String ip, String message, String host, Integer port, String name, List<UpDevVO> list) {
//        LogInfoDTO logInfoDTO = new LogInfoDTO();
//        logInfoDTO.setLoginName(RequestUtil.getLoginName());
//        logInfoDTO.setUserName(RequestUtil.getUserNickname());
//        logInfoDTO.setIp(ip);
//        logInfoDTO.setOperateType("查询");
//        logInfoDTO.setType(1);
//        logInfoDTO.setServiceName("终端定值管理");
//
//        String msg = "";
//        String result = null;
//        Socket socket = null;
//        InputStream is = null;
//        BufferedReader din = null;
//        try {
//            socket = new Socket(host, port);
//            socket.setSoTimeout(20000);//设置超时时间
//            socket.getOutputStream().write(message.getBytes("UTF-8"));
//            is = socket.getInputStream();
//            din = new BufferedReader(new InputStreamReader(is, "UTF-8"));
//            char[] buffer = new char[100240000];
//            StringBuffer stringBuffer = new StringBuffer();
//            while (true) {
//                int len = din.read(buffer);
//                if (len > -1) {
//                    result = new String(buffer, 0, len);
//                    stringBuffer.append(result);
//                    try {
//                        new JSONObject(stringBuffer);
//                        break;
//                    } catch (Exception e) {
//                        logger.error("未加载完全，持续加载中！");
//                    }
//                }
//            }
//            JSONObject jsonObject = new JSONObject(stringBuffer.toString());
//            if (jsonObject != null) {
//                if (jsonObject.get("resultcode").toString().equals("10000")) {
//                    JSONObject data = jsonObject.getJSONObject("data");
//                    if (data == null) {
//                        //表示刚连接成功
//                        mqttPublisher.send("/dev/socketDev/" + name, stringBuffer, 1, false);
//                        msg = "无数据传输";
//                        logInfoDTO.setResult(0);
//                        logInfoDTO.setLevel(1);
//                        logInfoDTO.setOperate("内部定值无数据传输");
//                        UserLogFeignClient.addUserLog(logInfoDTO);
//
//                    } else {
//                        mqttPublisher.send("/dev/socketDev/" + name, stringBuffer, 1, false);
//
//                        msg = "请求成功！" + "请稍候......";
//                        logInfoDTO.setResult(1);
//                        logInfoDTO.setLevel(0);
//                        logInfoDTO.setOperate("内部定值获取成功");
//                        UserLogFeignClient.addUserLog(logInfoDTO);
//                    }
//                } else if (jsonObject.get("resultcode").toString().equals("10010")) {
//
//                    mqttPublisher.send("/dev/socketDev/" + name, stringBuffer, 1, false);
//                    msg = "";
//                } else if (jsonObject.get("resultcode").toString().equals("10003")) {
//
//                    JSONArray jsonArray = new JSONArray(list);
//                    String json = "{\"resultcode\":" + 10003 + ",\"data\":" + jsonArray.toString() + "}";
//                    mqttPublisher.send("/dev/socketDev/" + name, stringBuffer, 1, false);
//
//                    msg = "JSON字符串解析出错";
//                    logInfoDTO.setResult(0);
//                    logInfoDTO.setLevel(1);
//                    logInfoDTO.setOperate("JSON字符串解析失败");
//                    logInfoDTO.setFailReason("JSON字符串解析失败");
//                    UserLogFeignClient.addUserLog(logInfoDTO);
//                } else {
//                    mqttPublisher.send("/dev/socketDev/" + name, stringBuffer, 1, false);
//                }
//
//            } else {
//                msg = "接收json数据为空";
//                logInfoDTO.setResult(0);
//                logInfoDTO.setLevel(1);
//                logInfoDTO.setOperate("接收JSON数据失败");
//                logInfoDTO.setFailReason("接收JSON数据失败");
//                UserLogFeignClient.addUserLog(logInfoDTO);
//            }
//        } catch (ConnectException e) {
//            e.printStackTrace();
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":" + 100 + ",\"data\":" + jsonArray.toString() + "}";
//            mqttPublisher.send("/dev/socketDev/" + name, json, 1, false);
//            msg = "socket连接失败!";
//            logInfoDTO.setResult(0);
//            logInfoDTO.setLevel(1);
//            logInfoDTO.setOperate("socket连接失败");
//            logInfoDTO.setFailReason("连接失败");
//            UserLogFeignClient.addUserLog(logInfoDTO);
//        } catch (SocketException e) {
//            e.printStackTrace();
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":" + 101 + ",\"data\":" + jsonArray.toString() + "}";
//            mqttPublisher.send("/dev/socketDev/" + name, json, 1, false);
//            msg = "socket异常";
//            logInfoDTO.setResult(0);
//            logInfoDTO.setLevel(1);
//            logInfoDTO.setOperate("socket发生异常");
//            logInfoDTO.setFailReason("发生异常");
//            UserLogFeignClient.addUserLog(logInfoDTO);
//        } catch (UnknownHostException e) {
//            e.printStackTrace();
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":\"10011\",\"data\":" + jsonArray.toString() + "}";
//            mqttPublisher.send("/dev/socketDev/" + name, json, 1, false);
//            msg = "DNS解析失败!";
//            logInfoDTO.setResult(0);
//            logInfoDTO.setLevel(1);
//            logInfoDTO.setOperate("socketDNS解析失败");
//            logInfoDTO.setFailReason("解析失败");
//            UserLogFeignClient.addUserLog(logInfoDTO);
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":\"10012\",\"data\":" + jsonArray.toString() + "}";
//            mqttPublisher.send("/dev/socketDev/" + name, json, 1, false);
//            msg = "转码异常!";
//            logInfoDTO.setResult(0);
//            logInfoDTO.setLevel(1);
//            logInfoDTO.setOperate("socket转码异常");
//            logInfoDTO.setFailReason("转码异常");
//            UserLogFeignClient.addUserLog(logInfoDTO);
//        } catch (IOException e) {
//            e.printStackTrace();
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":\"10013\",\"data\":" + jsonArray.toString() + "}";
//            mqttPublisher.send("/dev/socketDev/" + name, json, 1, false);
//            msg = "连接超时导致读写异常!";
//            logInfoDTO.setResult(0);
//            logInfoDTO.setLevel(1);
//            logInfoDTO.setOperate("socket连接超时导致读写异常");
//            logInfoDTO.setFailReason("连接超时");
//            UserLogFeignClient.addUserLog(logInfoDTO);
//        } finally {
//            safeColse(socket, din, is, null);
//        }
//        return msg;
//    }
//
//    //关闭连接
//    private void safeColse(Socket socket, BufferedReader bufferedReader, InputStream inputStream, OutputStream outputStream) {
//        if (socket != null) {
//            try {
//                socket.close();
//            } catch (IOException e) {
//                logger.error("发生错误，错误信息" + e.getMessage());
//            }
//        }
//        if (bufferedReader != null) {
//            try {
//                bufferedReader.close();
//            } catch (IOException e) {
//                logger.error("发生错误，错误信息" + e.getMessage());
//            }
//        }
//        if (inputStream != null) {
//            try {
//                inputStream.close();
//            } catch (IOException e) {
//                logger.error("发生错误，错误信息" + e.getMessage());
//            }
//        }
//        if (outputStream != null) {
//            try {
//                outputStream.close();
//            } catch (IOException e) {
//                logger.error("发生错误，错误信息" + e.getMessage());
//            }
//        }
//    }
//
//    //终端性能查看
////    @Async("asyncExecutor")
//    public void showProperty(String message, String host, Integer port, String devID) {
//        Runnable runnable = () -> {
//            String result;
//            OutputStream outputStream = null;
//            BufferedReader din = null;
//            Socket socket = null;
//            try {
//                socket = new Socket(host, port);
//                socket.setSoTimeout(20000); //20s未接受到数据自动超时中断
//                socketQuMap.put(devID, socket);
//                outputStream = socket.getOutputStream();
//                outputStream.write(message.getBytes("UTF-8"));
//                din = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
//                while ((result = din.readLine()) != null) {
//                    JSONObject jsonObject = new JSONObject(result);
//                    jsonObject.set("type", "190");
//                    if (jsonObject.get("resultcode").toString().equals("10000")) {
//                        mqttPublisher.send("/dev/showProperty/" + devID, jsonObject, 1, false);
//                    } else {
//                        mqttPublisher.send("/dev/showProperty/" + devID, jsonObject, 1, false);
//                    }
//                }
//            } catch (IOException e) {
//                e.printStackTrace();
//                logger.error("终端性能异常" + e.getMessage());
//                JSONObject json = new JSONObject();
//                json.set("type", "190").set("resultcode", "20000").set("resultmsg", "未知异常");
//                mqttPublisher.send("/dev/showProperty/" + devID, json, 1, false);
//            } catch (Exception e) {
//                e.printStackTrace();
//            } finally {
//                safeColse(socket, din, null, outputStream);
//                if (socketQuMap.containsKey(devID)) {
//                    socketQuMap.remove(devID);
//                }
//            }
//        };
//        executorPool.execute(runnable);
//    }
//
//    //终端性能查看连接关闭
//    public String closeDevSocket(String msg, String host, Integer port,String devID) throws Exception {
//        if (socketQuMap.containsKey(devID)) {
//            String result = null;
//            Socket socket = null;
//            OutputStream outputStream = null;
//            BufferedReader bufferedReader = null;
//            try {
//                socket = new Socket(host, port);
//                socket.setSoTimeout(5000);
//                outputStream = socket.getOutputStream();
//                outputStream.write(msg.getBytes("UTF-8"));
//                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//                while ((result = bufferedReader.readLine()) != null) {
//                    JSONObject jsonObject = new JSONObject(result);
//                    if (jsonObject.getStr("resultcode").equals("10000")) {
//                    }
//                    break;
//                }
//            } catch (IOException e) {
//                e.printStackTrace();
//                logger.error(e.getMessage());
//            } finally {
//                socketQuMap.get(devID).shutdownOutput();
//                safeColse(socket, null, null, outputStream);
//            }
//        }
//        return "终端性能查看，关闭成功";
//    }
//
//    //监测点实时数据查看
//    public void realTimeData(String message, String host, Integer port, String lineIndex) {
//        String loginName = RequestUtil.getLoginName();
//        Runnable real = () -> {
//            if (Objects.isNull(lineMap)) {
//                lineMap = new HashMap<>();
//            }
//            if (lineMap.containsKey(lineIndex)) {
//                //存在监测点
//                List<String> lineL = lineMap.get(lineIndex);
//                if (!lineL.contains(loginName)) {
//                    lineL.add(loginName);
//                }
//            } else {
//                List<String> userList = new ArrayList<>();
//                userList.add(loginName);
//                lineMap.put(lineIndex, userList);
//            }
//
//            Iterator<Map.Entry<String, List<String>>> iterator = lineMap.entrySet().iterator();
//            while (iterator.hasNext()) {
//                Map.Entry<String, List<String>> en = iterator.next();
//                if (!en.getKey().equals(lineIndex)) {
//                    List<String> login = en.getValue();
//                    if (CollectionUtil.isNotEmpty(login)) {
//                        login.remove(loginName);
//                    }
//                }
//
//            }
//
//            if (lineMap.size() > 1) {
//                //判断是否查看的是同一台装置信息
//                Set<String> set = lineMap.keySet();
//                Integer count = lineMapper.getDevIndexs(set);
//                if (count < lineMap.size()) {
//                    JSONObject jsonObject = new JSONObject();
//                    jsonObject.set("resultcode", 5557);
//                    jsonObject.set("resultmsg", "存在其他用户相同操作,请稍后尝试");
//                    if (Objects.nonNull(lineMap)) {
//                        mqttPublisher.send("/dev/realTimeData/" + loginName, jsonObject, 1, false);
//                    }
//                    lineMap.remove(lineIndex);
//                    return;
//                }
//            }
//
//
//            if (lineSocketMap == null) {
//                lineSocketMap = new HashMap<>();
//            }
//            if (!lineSocketMap.containsKey(lineIndex)) {
//                Socket socket = null;
//                BufferedReader bufferedReader = null;
//                OutputStream outputStream = null;
//                try {
//                    socket = new Socket();
//                    SocketAddress socketAddress = new InetSocketAddress(host, port);
//                    socket.connect(socketAddress, 7000);
//                    socket.setSoTimeout(20000);
//                    lineSocketMap.put(lineIndex, socket);
//                    outputStream = socket.getOutputStream();
//                    outputStream.write(message.getBytes("UTF-8"));
//                    bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
//                    String result;
//                    while ((result = bufferedReader.readLine()) != null) {
//                        net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(result);
//                        String code = jsonObject.getString("resultcode");
//                        if (code.equals("10000")) {
//
//
//                            String str = "";
//                            List<String> nameList = lineMap.get(lineIndex);
//                            if (CollectionUtil.isNotEmpty(nameList)) {
//                                for (String s : nameList) {
//                                    str += s + " ";
//                                }
//                                //  System.out.println(str + " " + lineIndex);
//                                mqttPublisher.send("/dev/realTimeData/" + loginName, jsonObject, 1, false);
//                            }
//                        } else if (code.equals("10008")) {
//                            List<String> nameList = lineMap.get(lineIndex);
//                            if (CollectionUtil.isNotEmpty(nameList)) {
//                                mqttPublisher.send("/dev/realTimeData/" + loginName, jsonObject, 1, false);
//                            }
//                            break;
//                        }
//
//                    }
//                } catch (SocketTimeoutException e) {
//                    JSONObject jsonObject = new JSONObject();
//                    jsonObject.put("resultcode", 5555);
//                    jsonObject.put("resultmsg", "请求超时");
//                    if (Objects.nonNull(lineMap)) {
//                        List<String> name = lineMap.get(lineIndex);
//                        if (CollectionUtil.isNotEmpty(name)) {
//                            mqttPublisher.send("/dev/realTimeData/" + loginName, jsonObject, 1, false);
//                        }
//                    }
//                    e.printStackTrace();
//                } catch (ConnectException e) {
//                    e.printStackTrace();
//                    JSONObject jsonObject = new JSONObject();
//                    jsonObject.put("resultcode", 5556);
//                    jsonObject.put("resultmsg", "连接前置服务器失败");
//                    if (lineMap.get(lineIndex) != null) {
//                        mqttPublisher.send("/dev/realTimeData/" + loginName, jsonObject, 1, false);
//                    }
//                    e.printStackTrace();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                } catch (Exception e) {
//                    e.printStackTrace();
//                } finally {
//                    safeColse(socket, bufferedReader, null, outputStream);
//                    if (lineSocketMap != null) {
//                        lineSocketMap.remove(lineIndex);
//                    }
//                    if (lineMap != null) {
//                        lineMap.remove(lineIndex);
//                    }
//                }
//            }
//        };
//        executorPool.execute(real);
//    }
//
//    //监测点实时数据心跳
//    public void heartRealData(String msg, String host, Integer port, String lineIndex) {
//        if (lineMap != null) {
//            if (lineMap.containsKey(lineIndex)) {
//                String result = null;
//                OutputStream outputStream = null;
//                BufferedReader bufferedReader = null;
//                Socket socket = null;
//
//                try {
//                    socket = new Socket(host, port);
//                    socket.setSoTimeout(10000);
//                    outputStream = socket.getOutputStream();
//                    outputStream.write(msg.getBytes("UTF-8"));
//                    bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//                    while ((result = bufferedReader.readLine()) != null) {
//                        if (StrUtil.isNotBlank(result)) {
//                            net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(result);
//                            if (jsonObject.get("resultcode").equals("10000")) {
//                                break;
//                            }
//                        } else {
//                            logger.error("实时数据socket异常!");
//                        }
//                    }
//                } catch (IOException e) {
//                    e.printStackTrace();
//                } finally {
//                    safeColse(socket, bufferedReader, null, outputStream);
//                }
//            }
//        }
//    }
//
//    //监测点实时数据连接关闭
//    public void closeRealData(String lineIndex) {
//        String loginName = RequestUtil.getLoginName();
//        if (lineMap != null) {
//            if (lineMap.containsKey(lineIndex)) {
//                List<String> user = lineMap.get(lineIndex);
//                if (CollectionUtil.isNotEmpty(user)) {
//                    user.remove(loginName);
//                    if (user.size() == 0) {
//                        lineMap.remove(lineIndex);
//                        Socket socket = null;
//                        String result = null;
//                        OutputStream outputStream = null;
//                        BufferedReader bufferedReader = null;
//                        try {
//                            JSONObject jsonObject = new JSONObject();
//                            jsonObject.set("LineId", lineIndex);
//                            jsonObject.set("type", 2);
//                            JSONObject jsonObject1 = new JSONObject();
//                            jsonObject1.set("len", 0);
//                            jsonObject1.set("data", jsonObject);
//
//                            String host = lineMapper.getNodeIp(lineIndex,0);
//                            socket = new Socket(host, 60000);
//                            socket.setSoTimeout(10000);
//                            outputStream = socket.getOutputStream();
//                            outputStream.write(jsonObject1.toString().getBytes());
//                            InputStream inputStream = socket.getInputStream();
//                            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
//                            while ((result = bufferedReader.readLine()) != null) {
//                                net.sf.json.JSONObject jj = net.sf.json.JSONObject.fromObject(result);
//                                //JSONObject jj = new JSONObject(result);
//                                if (jj.getString("resultcode").equals("10000")) {
//                                    //   System.out.println("已经告诉前置关闭实时数据" + lineIndex);
//                                    lineSocketMap.get(lineIndex).shutdownOutput();
//                                    break;
//                                }
//                            }
//
//                            //  System.out.println(loginName + "前台请求关闭实时数据" + lineIndex);
//                        } catch (IOException e) {
//                            e.printStackTrace();
//                        } finally {
//                            safeColse(socket, bufferedReader, null, outputStream);
//                        }
//                        lineSocketMap.remove(lineIndex);
//                    }
//                }
//            }
//        }
//    }
//
//
//    //升级终端
//    public void sentUpgrades(String message, String host, Integer port, String loginName, String edIndex, List<UpDevVO> list) {
//        String userId = RequestUtil.getUserIndex();
//        sumMap.put(userId + host, 0);
//        sumCanMap.put(userId + host, 0);
//        sumResMap.put(userId + host, 0);
//        sumDevMap.put(userId + host, list.size());
//        System.out.println(message);
//        logger.info("发起升级装置命令:"+message);
//        Runnable myCallable = () -> {
//
//            String result = null;
//            Socket socket = null;
//            InputStream is = null;
//            BufferedReader din = null;
//            OutputStream outputStream = null;
//            JSONArray jsonArray = new JSONArray(list);
//            String json = "{\"resultcode\":\"100\",\"type\":\"180\",\"data\":" + jsonArray + "}";
//            DevVersion version;
//            try {
//                SocketAddress socketAddress = new InetSocketAddress(host, port);
//                socket = new Socket();
//                socket.connect(socketAddress, 7000);
//                socket.setSoTimeout(60*1000*3);
//                socketMap.put(userId + host, socket);
//                outputStream = socket.getOutputStream();
//                outputStream.write(message.getBytes("UTF-8"));
//                is = socket.getInputStream();
//                din = new BufferedReader(new InputStreamReader(is, "UTF-8"));
//
//                while ((result = din.readLine()) != null) {
//
//                    System.out.println(result);
//                    logger.info("升级流程:"+message);
//
//                    JSONObject jsonObject = new JSONObject(result.trim());
//
//                    jsonObject.set("type", "180");
//                    if (jsonObject.get("resultcode").toString().equals("10000")) {
//                        JSONObject data = jsonObject.getJSONObject("data");
//                        if (data == null) {
//                            //表示刚连接成功
//                            mqttPublisher.send("/dev/upgrades/" + loginName, jsonObject, 1, false);
//                        } else {
//                            mqttPublisher.send("/dev/upgrades/" + loginName, jsonObject, 1, false);
//                            if (data.get("state").equals("2")) {
//                                Integer succeed = sumMap.get(userId + host);
//                                succeed++;
//                                sumMap.put(userId + host, succeed);
//                            } else if (data.get("state").equals("3")) {
//                                Integer fail = sumMap.get(userId + host);
//                                fail++;
//                                sumMap.put(userId + host, fail);
//                            }
//                        }
//                    } else if (jsonObject.get("resultcode").toString().equals("10010")) {
//
//                        mqttPublisher.send("/dev/upgrades/" + loginName, jsonObject, 1, false);
//
//                    } else if (jsonObject.get("resultcode").toString().equals("10003")) {
//
//                        mqttPublisher.send("/dev/upgrades/" + loginName, json, 1, false);
//                        Integer fail = sumMap.get(userId + host);
//                        for (UpDevVO dev : list) {
//                            fail++;
//                            version=new DevVersion();
//                            version.setLineId(dev.getDevIndex());
//                            version.setVersionId(edIndex);
//                            version.setFlag(0);
//                            version.setResult(0);
//                            version.setState(1);
//                            devVersionMapper.insert(version);
//                        }
//                        sumMap.put(userId + host, fail);
//
//                    } else if (jsonObject.get("resultcode").toString().equals("10008")) {
//                        mqttPublisher.send("/dev/upgrades/" + loginName, jsonObject, 1, false);
//                    } else {
//                        Integer fail = sumMap.get(userId + host);
//                        System.out.println(fail);
//                        fail++;
//                        sumMap.put(userId + host, fail);
//                        mqttPublisher.send("/dev/upgrades/" + loginName, jsonObject, 1, false);
//                    }
//
//                    Integer resSum = sumMap.get(userId + host);
//
//                    if (resSum == list.size()) {
//                        System.out.println("进入break跳出升级流程总装置数:" + resSum);
//                        break;
//                    }
//
//
//                }
//            } catch (SocketTimeoutException red) {
//                red.printStackTrace();
//                //全部取消升级操作  异常不处理
//                logger.error("终端升级连接超时,联系管理员排查问题" + red.getMessage());
//                JSONObject jj = new JSONObject();
//                jj.set("resultcode", 77777);
//                jj.set("type", 180);
//                mqttPublisher.send("/dev/upgrades/" + loginName, jj, 1, false);
//            } catch (ConnectException e) {
//                e.printStackTrace();
//                logger.error("发生错误，错误信息" + e.getMessage());
//                for (UpDevVO dev : list) {
//                    version=new DevVersion();
//                    version.setLineId(dev.getDevIndex());
//                    version.setVersionId(edIndex);
//                    version.setFlag(0);
//                    version.setResult(0);
//                    version.setState(1);
//                    devVersionMapper.insert(version);
//                }
//                mqttPublisher.send("/dev/upgrades/" + loginName, json, 1, false);
//            } catch (Exception e) {
//                e.printStackTrace();
//                logger.error("发生错误，错误信息" + e.getMessage());
//                for (UpDevVO dev : list) {
//                    version=new DevVersion();
//                    version.setLineId(dev.getDevIndex());
//                    version.setVersionId(edIndex);
//                    version.setFlag(0);
//                    version.setResult(0);
//                    version.setState(1);
//                    devVersionMapper.insert(version);
//                }
//                mqttPublisher.send("/dev/upgrades/" + loginName, json, 1, false);
//            } finally {
//                //不管失败成功告诉前台页面升级程序结束
//                JSONObject jsonObject = new JSONObject();
//                jsonObject.set("type", 180);
//                jsonObject.set("resultcode", -10000);
//                jsonObject.set("data", list);
//                mqttPublisher.send("/dev/upgrades/" + loginName, jsonObject, 1, false);
//                safeColse(socket, din, is, outputStream);
//                delMapData(userId + host);
//            }
//        };
//        executorPool.execute(myCallable);
//    }
//
//    //取消升级终端
//    public void cancelUp(String json, String host, Integer port, Integer devNum) {
//        String loginName =RequestUtil.getLoginName();
//        String userId = RequestUtil.getUserIndex();
//        Runnable aaa = () -> {
//            Socket socket = null;
//            InputStream inputStream = null;
//            BufferedReader bufferedReader = null;
//            String result = "";
//            try {
//                Integer deflag = 0;
//                socket = new Socket(host, port);
//                socket.setSoTimeout(20000);
//                socket.getOutputStream().write(json.getBytes());
//                inputStream = socket.getInputStream();
//                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
//
//                while ((result = bufferedReader.readLine()) != null) {
//                    System.out.println(result);
//                    JSONObject jsonObject = null;
//                    try {
//                        jsonObject = new JSONObject(result.trim());
//                    } catch (Exception json1) {
//                        json1.printStackTrace();
//                    }
//                    if ((jsonObject.get("resultcode").toString()).equals("10000")) {
//                        deflag++;
//                        Integer csum = sumCanMap.get(userId + host);
//                        csum++;
//                        sumCanMap.put(userId + host, csum);
//
//                        Integer sum = sumMap.get(userId + host);
//                        sum++;
//                        sumMap.put(userId + host, sum);
//                    }
//                    jsonObject.set("type", "182");
//                    mqttPublisher.send("/dev/cancelUp/" + loginName, json, 1, false);
//                    System.out.println(sumCanMap.get(userId + host));
//                    System.out.println(sumMap.get(userId + host));
//
//                    if (sumMap.get(userId + host).equals(sumDevMap.get(userId + host))) {
//                        Socket ss = socketMap.get(userId + host);
//                        System.out.println("进入关闭socket流程");
//                        if (ss != null) {
//                            ss.shutdownOutput();
//                        }
//                    }
//
//                    if (devNum.equals(deflag)) {
//                        break;
//                    }
//                }
//
//            } catch (IOException e) {
//                logger.error("终端升级取消命令发送失败");
//                e.printStackTrace();
//            } finally {
//                System.out.println("取消结束+++");
//                safeColse(socket, bufferedReader, inputStream, null);
//            }
//
//        };
//        executorPool.execute(aaa);
//    }
//
//    //重启升级成功的装置
//    public void restartDev(String json, String host, Integer port, List<String> devL) {
//        System.out.println("重启装置" + host + "命令：" + json);
//        Integer sum = devL.size();
//        String loginName = RequestUtil.getLoginName();
//        String userId = RequestUtil.getUserIndex();
//        Runnable aaa = () -> {
//            Socket socket = null;
//            BufferedReader bufferedReader = null;
//            OutputStream outputStream = null;
//            JSONObject jsonObject = null;
//            String result = null;
//            List<String> devIndexList = new ArrayList<>();
//            try {
//                socket = new Socket(host, port);
//                socket.setSoTimeout(1000*60*6);
//                outputStream = socket.getOutputStream();
//                outputStream.write(json.getBytes());
//                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//
//                Socket socket1 = socket;
//
//                Runnable heart = () -> {
//                    finalFlag = true;
//                    try {
//                        while (finalFlag){
//                            Thread.sleep(15000);
//                            if(socket1!=null) {
//                                if (socket1.isConnected() && !socket1.isClosed()) {
//                                    socket1.getOutputStream().write(new JSONObject().put("heart", "666").toString().getBytes());
//                                    System.out.println("心跳发送成功");
//                                }
//                            }
//
//                        }
//
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                        finalFlag = false;
//                    }
//                    System.out.println("是否发送心跳标识"+ finalFlag);
//                };
//                executorPool.execute(heart);
//                while ((result = bufferedReader.readLine()) != null) {
//                    System.out.println(result);
//
//                    try {
//                        jsonObject = new JSONObject(result.trim());
//                    } catch (Exception json1) {
//                        json1.printStackTrace();
//                        logger.error("终端升级重启命令发送失败" + json1.getMessage());
//                        break;
//                    }
//                    if ((jsonObject.get("resultcode")).equals(10000)) {
//                        //处理成功进行入库记录日志
//                        //   Integer succeed = sumResMap.get(userId + host);
//                        //   succeed++;
//                        //  sumResMap.put(userId + host, succeed);
//                    } else if ((jsonObject.get("resultcode")).equals(10008)) {
//
//                    } else if ((jsonObject.get("resultcode")).equals(10001)) {
//                        devIndexList.add(jsonObject.getJSONObject("data").getStr("devIndex"));
//                        Integer succeed = sumResMap.get(userId + host);
//                        succeed++;
//                        sumResMap.put(userId + host, succeed);
//                    }   else {
//                        Integer succeed = sumResMap.get(userId + host);
//                        succeed++;
//                        sumResMap.put(userId + host, succeed);
//                    }
//                    jsonObject.set("type", "181");
//                    mqttPublisher.send("/dev/restartDev/" + loginName, jsonObject, 1, false);
//                    if (sum.equals(sumResMap.get(userId + host))) {
//                        System.out.println("重启总数量："+sum+"-"+sumResMap.get(userId + host));
//                        finalFlag = false;
//                        break;
//                    }
//                }
//
//            } catch (SocketTimeoutException e) {
//                e.printStackTrace();
//                //超时处理
//                JSONObject json1 = new JSONObject();
//                json1.set("resultcode", 5555);
//                json1.set("resultmsg", "超时");
//                json1.set("type", 181);
//                mqttPublisher.send("/dev/restartDev/" + loginName, json1, 1, false);
//
//            } catch (IOException e) {
//                e.printStackTrace();
//            } catch (Exception ee) {
//                ee.printStackTrace();
//            } finally {
//                finalFlag = false;
//                System.out.println("重启socket结束+++");
//                safeColse(socket, bufferedReader, null, outputStream);
//                socketMap.remove(userId + host);
//            }
//
//        };
//        executorPool.execute(aaa);
//
//    }
//
//   /**
//    * @Description:清空全局变量释放内存
//    * @param key
//    * @Author: wr
//    * @Date: 2023/8/16 16:15
//    */
//    public void delMapData(String key) {
//        if (sumMap != null) {
//            sumMap.remove(key);
//        }
//        if (sumCanMap != null) {
//            sumCanMap.remove(key);
//        }
//    }
//}
//
//
//
//
//
