From 57c673aa3e83677bcf5d30b4b45d06bae6609db8 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: 星期四, 08 八月 2024 16:14:40 +0800
Subject: [PATCH] 优化:获取会话

---
 ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdTankLockServiceImpl.java |  316 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 298 insertions(+), 18 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdTankLockServiceImpl.java b/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdTankLockServiceImpl.java
index 670b9f5..2120ab0 100644
--- a/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdTankLockServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdTankLockServiceImpl.java
@@ -1,15 +1,16 @@
 package com.ruoyi.sy.service.impl;
 
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
 import com.ruoyi.common.core.domain.entity.SysConfig;
 import com.ruoyi.common.utils.uuid.IdUtils;
-import com.ruoyi.sy.domain.ArdSyCar;
-import com.ruoyi.sy.domain.ArdSyUser;
-import com.ruoyi.sy.domain.ArdTankLockState;
+import com.ruoyi.sy.domain.*;
+import com.ruoyi.sy.gps31.PositionContainer;
 import com.ruoyi.sy.mapper.*;
 import com.ruoyi.system.mapper.SysConfigMapper;
 import com.ruoyi.utils.forest.SYClient;
@@ -22,7 +23,6 @@
 
 import java.util.stream.Collectors;
 
-import com.ruoyi.sy.domain.ArdTankLock;
 import com.ruoyi.sy.service.IArdTankLockService;
 
 import javax.annotation.Resource;
@@ -59,9 +59,12 @@
     private ArdTankLockStateMapper ardTankLockStateMapper;
 
     @Resource
+    private ArdTankLockPasswordMapper ardTankLockPasswordMapper;
+
+    @Resource
     private SYClient sYClient;
 
-    private Map<String,Thread> alarmMap = new HashMap();//鐢电閿佸巻鍙叉姤璀︾嚎绋嬪鍣�
+    //private Map<String,Thread> alarmMap = new HashMap();//鐢电閿佸巻鍙叉姤璀︾嚎绋嬪鍣�
 
     /**
      * 鏌ヨ鐢电閿�
@@ -104,9 +107,27 @@
             ardTankLock.setImgPositionLeft(map.get("imgPositionLeft"));
             ardTankLock.setCarId(carId);
             ardTankLock.setEnable(map.get("enable"));
+            ardTankLock.setRestartState(map.get("restartState"));
             ardTankLocks.add(ardTankLock);
         }
-        return ardTankLockMapper.insertArdTankLocks(ardTankLocks);
+        try{
+            return ardTankLockMapper.insertArdTankLocks(ardTankLocks);
+        }finally {
+            if(PositionContainer.getCarLockProcessThreadMap().keySet().contains(carId)){
+                Map<String, Map<String,Thread>> lockMap = PositionContainer.getCarLockProcessThreadMap().get(carId);
+                for(Map<String,String> map : lockList){
+                    Map<String,Thread> lockThreadMap = new HashMap();
+                    lockMap.put(map.get("lockNum"),lockThreadMap);
+                }
+            }else{
+                Map<String,Map<String,Thread>> carMap = new HashMap();//杞﹁締瀹瑰櫒
+                for(Map<String,String> map : lockList){
+                    Map<String,Thread> lockMap = new HashMap();//閿佸鍣�
+                    carMap.put(map.get("lockNum"),lockMap);
+                }
+                PositionContainer.getCarLockProcessThreadMap().put(carId,carMap);
+            }
+        }
     }
     /*@Override
     public int insertArdTankLock(ArdTankLock ardTankLock) {
@@ -308,7 +329,11 @@
     @Override
     public int deleteLockByCarId(String carId) {
         int result = ardTankLockMapper.deleteLockByCarId(carId);
-        return result;
+        try{
+            return result;
+        }finally {
+            PositionContainer.getCarLockProcessThreadMap().remove(carId);//绉婚櫎瀹瑰櫒
+        }
     }
 
     @Override
@@ -327,7 +352,11 @@
                 return 1;
             }
             result = ardTankLockMapper.deleteLockByCarId(carId);
-            return result;
+            try{
+                return result;
+            }finally {
+                PositionContainer.getCarLockProcessThreadMap().get(carId).clear();
+            }
         }
 
         List<ArdTankLock> ardTankLocks = new ArrayList();
@@ -343,6 +372,7 @@
                 ardTankLock.setImgPositionLeft((String) map.get("imgPositionLeft"));
                 ardTankLock.setCarId((String) map.get("carId"));
                 ardTankLock.setEnable((String) map.get("enable"));
+                ardTankLock.setRestartState((String) map.get("restartState"));
                 result = result + ardTankLockMapper.updateArdTankLock(ardTankLock);
             }else{//鏃犱富閿紝鍋氭柊澧炴搷浣�
                 ArdTankLock ardTankLock = new ArdTankLock();
@@ -352,10 +382,27 @@
                 ardTankLock.setImgPositionTop((String) map.get("imgPositionTop"));
                 ardTankLock.setImgPositionLeft((String) map.get("imgPositionLeft"));
                 ardTankLock.setCarId(carId);
+                ardTankLock.setRestartState((String) map.get("restartState"));
                 ardTankLock.setEnable((String) map.get("enable"));
                 ardTankLocks.add(ardTankLock);
             }
         }
+        //鏇存柊瀹瑰櫒
+        if(PositionContainer.getCarLockProcessThreadMap().keySet().contains(carId)){
+            Map<String, Map<String,Thread>> lockMap = PositionContainer.getCarLockProcessThreadMap().get(carId);
+            for(Map<String,Object> map : lockList){
+                Map<String,Thread> lockThreadMap = new HashMap();
+                lockMap.put((String) map.get("lockNum"),lockThreadMap);
+            }
+        }else{
+            Map<String,Map<String,Thread>> carMap = new HashMap();//杞﹁締瀹瑰櫒
+            for(Map<String,Object> map : lockList){
+                Map<String,Thread> lockMap = new HashMap();//閿佸鍣�
+                carMap.put((String) map.get("lockNum"),lockMap);
+            }
+            PositionContainer.getCarLockProcessThreadMap().put(carId,carMap);
+        }
+
         if(ardTankLocks.size() != 0){
             result = result + ardTankLockMapper.insertArdTankLocks(ardTankLocks);
         }
@@ -535,13 +582,13 @@
                 }else{
                     lockMap.put("onlineTime",ardTankLock.getOnlineTime());
                 }
-                Map<String,Object> ardTankLockState = new HashMap();
+                //Map<String,Object> ardTankLockState = new HashMap();
                 ArdTankLockState ardTankLockStateResult = ardTankLockStateMapper.selectArdTankLockStateByLockIdLimitOne(ardTankLock.getId());
                 if(ardTankLockStateResult == null){
-                    ardTankLockState.put("id","");
+                    /*ardTankLockState.put("id","");
                     ardTankLockState.put("lockId","");
-                    ardTankLockState.put("lockNum","");
-                    ardTankLockState.put("lockState","");
+                    ardTankLockState.put("lockNum","");*/
+                    /*ardTankLockState.put("lockState","");
                     ardTankLockState.put("lockPositionState","");
                     ardTankLockState.put("lockShellState","");
                     ardTankLockState.put("restartState","");
@@ -552,12 +599,25 @@
                     ardTankLockState.put("uploadTime","");
                     ardTankLockState.put("uniqueMark","");
                     ardTankLockState.put("lockStateMark",false);
-                    lockMap.put("ardTankLockState",ardTankLockState);
+                    lockMap.put("ardTankLockState",ardTankLockState);*/
+                    lockMap.put("lockState","");
+                    lockMap.put("lockPositionState","");
+                    lockMap.put("lockShellState","");
+                    lockMap.put("restartState","");
+                    lockMap.put("batterVoltage","");
+                    lockMap.put("batterVoltageAlarm",false);
+                    lockMap.put("powerVoltage","");
+                    lockMap.put("powerVoltageAlarm",false);
+                    lockMap.put("uploadTime","");
+                    lockMap.put("uniqueMark","");
+                    lockMap.put("lockStateMark",false);
+                    lockMap.put("alarmMark",false);
+                    lockMap.put("alarmInfo","");
                 }else{
-                    ardTankLockState.put("id",ardTankLockStateResult.getId());
+                    /*ardTankLockState.put("id",ardTankLockStateResult.getId());
                     ardTankLockState.put("lockId",ardTankLockStateResult.getLockId());
-                    ardTankLockState.put("lockNum",ardTankLockStateResult.getLockNum());
-                    ardTankLockState.put("lockState",ardTankLockStateResult.getLockState());
+                    ardTankLockState.put("lockNum",ardTankLockStateResult.getLockNum());*/
+                    /*ardTankLockState.put("lockState",ardTankLockStateResult.getLockState());
                     ardTankLockState.put("lockPositionState",ardTankLockStateResult.getLockPositionState());
                     ardTankLockState.put("lockShellState",ardTankLockStateResult.getLockShellState());
                     ardTankLockState.put("restartState",ardTankLockStateResult.getRestartState());
@@ -576,7 +636,44 @@
                     ardTankLockState.put("uploadTime",ardTankLockStateResult.getUploadTime());
                     ardTankLockState.put("uniqueMark",ardTankLockStateResult.getUniqueMark());
                     ardTankLockState.put("lockStateMark",ardTankLockStateResult.getLockStateMark());
-                    lockMap.put("ardTankLockState",ardTankLockState);
+                    lockMap.put("ardTankLockState",ardTankLockState);*/
+                    String alarmInfo = "";
+                    lockMap.put("lockState",ardTankLockStateResult.getLockState());
+                    if(ardTankLockStateResult.getLockState().equals("寮傚父鐘舵��")){
+                        alarmInfo = alarmInfo + "閿佽姱寮傚父;";
+                    }
+                    lockMap.put("lockPositionState",ardTankLockStateResult.getLockPositionState());
+                    if(ardTankLockStateResult.getLockPositionState().equals("寮傚父")){
+                        alarmInfo = alarmInfo + "浣嶇疆寮傚父;";
+                    }
+                    lockMap.put("lockShellState",ardTankLockStateResult.getLockShellState());
+                    if(ardTankLockStateResult.getLockShellState().equals("寮傚父")){
+                        alarmInfo = alarmInfo + "澶栧3寮傚父;";
+                    }
+                    lockMap.put("restartState",ardTankLockStateResult.getRestartState());
+                    lockMap.put("batterVoltage",ardTankLockStateResult.getBatterVoltage());
+                    if(Double.parseDouble(ardTankLockStateResult.getBatterVoltage()) <= lockBatteryVoltage){
+                        lockMap.put("batterVoltageAlarm",true);
+                        alarmInfo = alarmInfo + "鐢垫睜鐢靛帇浣庝簬" + lockBatteryVoltage + ";";
+                    }else{
+                        lockMap.put("batterVoltageAlarm",false);
+                    }
+                    lockMap.put("powerVoltage",ardTankLockStateResult.getPowerVoltage());
+                    if(Double.parseDouble(ardTankLockStateResult.getPowerVoltage()) <= lockPowerVoltage){
+                        lockMap.put("powerVoltageAlarm",true);
+                        alarmInfo = alarmInfo + "鐢垫簮鐢靛帇浣庝簬" + lockBatteryVoltage + ";";
+                    }else{
+                        lockMap.put("powerVoltageAlarm",false);
+                    }
+                    lockMap.put("uploadTime",ardTankLockStateResult.getUploadTime());
+                    lockMap.put("uniqueMark",ardTankLockStateResult.getUniqueMark());
+                    lockMap.put("lockStateMark",ardTankLockStateResult.getLockStateMark());
+                    if(alarmInfo.equals("")){
+                        lockMap.put("alarmMark",false);
+                    }else{
+                        lockMap.put("alarmMark",true);
+                    }
+                    lockMap.put("alarmInfo",alarmInfo);
                 }
                 lockList.add(lockMap);
             }
@@ -586,9 +683,192 @@
             data.put("40002",result);
             WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(userId), JSON.toJSONString(data));
         }
+        return;
     }
 
     @Override
+    public void readPassword(String userId,String password) {
+        List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT");
+        String syURL = "";
+        if(syURLResult.size() != 0){
+            syURL = syURLResult.get(0).getConfigValue();
+        }else{
+            return;
+        }
+        String passwordMd5 = DigestUtils.md5Hex(password);
+        Map<String, Object> LogInResult = sYClient.logIn(syURL, passwordMd5, userId);
+        String sessionId = (String) LogInResult.get("sessionId");
+
+        String finalSyURL = syURL;
+        Thread passwordThread = new Thread(){
+            @Override
+            public void run() {
+                List<ArdTankLock> ardTankLockResult = ardTankLockMapper.selectArdTankLockWithPassword();
+                for(ArdTankLock ardTankLock : ardTankLockResult){
+                    Thread lockThread = new Thread(){//璇诲彇瀵嗙爜
+                        @Override
+                        public void run() {
+                            if(ardTankLock.getArdTankLockPasswords().isEmpty()){//鏃犲彲鐢ㄥ瘑鐮�
+                                if(PositionContainer.getCarLockPasswordMap().get(ardTankLock.getLockNum()) != null){//鏂拌缃殑10缁勫瘑鐮�
+                                    Set<String> passwordSet = PositionContainer.getCarLockPasswordMap().get(ardTankLock.getLockNum());
+                                    //璁剧疆鏂板瘑鐮�
+                                    String lockNumHead = ardTankLock.getLockNum().substring(0,2);
+                                    String lockNumTail = ardTankLock.getLockNum().substring(2,4);
+                                    String code = "04";
+                                    Integer check = Integer.parseInt(lockNumHead, 16) + Integer.parseInt(lockNumTail, 16) + Integer.parseInt(code, 16);;
+                                    for(String password : passwordSet){
+                                        String[] passwordArray = password.split("");
+                                        for(String p : passwordArray){
+                                            check = check + Integer.parseInt(p);
+                                        }
+                                    }
+                                    String checkNum = Integer.toHexString(check);
+                                    if(checkNum.length() == 1){
+                                        checkNum = "0" + checkNum;
+                                    }else if(checkNum.length() > 2){
+                                        checkNum = checkNum.substring(checkNum.length() - 2,checkNum.length());
+                                    }
+                                    String data = ardTankLock.getLockNum() + "04";
+                                    for(String password : passwordSet){
+                                        String[] passwordArray = password.split("");
+                                        for(String p : passwordArray){
+                                            data = data + "0" + p;
+                                        }
+                                    }
+                                    data = data + checkNum;
+                                    String paramsStr = "%7B%22type%22%3A%22ff%22%2C%22dataCnt%22%3A%22" + data + "%22%7D";
+
+                                    try{
+                                        Map<String,Object> syResult = sendCmd(finalSyURL,userId,ardTankLock.getCarId(),199,"DataDownTransfer", paramsStr,sessionId);
+                                        if(((String)syResult.get("rspCode")).equals("0")){
+                                            List<ArdTankLockPassword> ardTankLockPasswordList = new ArrayList();
+                                            int i = 0;
+                                            for(String password : passwordSet){
+                                                ArdTankLockPassword ardTankLockPassword = new ArdTankLockPassword();
+                                                ardTankLockPassword.setId(IdUtils.simpleUUID());
+                                                ardTankLockPassword.setLockId(ardTankLock.getLockNum());//鏆傚瓨閿佺紪鍙�
+                                                ardTankLockPassword.setPassword(password);
+                                                ardTankLockPassword.setNo(String.valueOf(i));
+                                                ardTankLockPasswordList.add(ardTankLockPassword);
+                                                i = i + 1;
+                                            }
+                                            int result = ardTankLockPasswordMapper.insertArdTankLockPasswordList(ardTankLockPasswordList);
+                                            PositionContainer.getCarLockPasswordMap().remove(ardTankLock.getLockNum());
+                                        }
+                                        PositionContainer.getCarLockProcessThreadMap().get(ardTankLock.getCarId()).get(ardTankLock.getLockNum()).remove("lockPassword");
+                                    }catch (Exception e){
+                                        PositionContainer.getCarLockProcessThreadMap().get(ardTankLock.getCarId()).get(ardTankLock.getLockNum()).remove("lockPassword");
+                                    }
+                                }else{//璇诲彇瀵嗙爜
+                                    Set<String> passwordSet = new HashSet();
+                                    while(passwordSet.size() != 10){
+                                        String password = "";
+                                        for(int i = 0;i <= 5;i++){
+                                            password = password + String.valueOf(10 * Math.random()).split("\\.")[0];
+                                        }
+                                        passwordSet.add(password);
+                                    }
+                                    //璁剧疆鏂板瘑鐮�
+                                    String lockNumHead = ardTankLock.getLockNum().substring(0,2);
+                                    String lockNumTail = ardTankLock.getLockNum().substring(2,4);
+                                    String code = "04";
+                                    Integer check = Integer.parseInt(lockNumHead, 16) + Integer.parseInt(lockNumTail, 16) + Integer.parseInt(code, 16);;
+                                    for(String password : passwordSet){
+                                        String[] passwordArray = password.split("");
+                                        for(String p : passwordArray){
+                                            check = check + Integer.parseInt(p);
+                                        }
+                                    }
+                                    String checkNum = Integer.toHexString(check);
+                                    if(checkNum.length() == 1){
+                                        checkNum = "0" + checkNum;
+                                    }else if(checkNum.length() > 2){
+                                        checkNum = checkNum.substring(checkNum.length() - 2,checkNum.length());
+                                    }
+                                    String data = ardTankLock.getLockNum() + "04";
+                                    for(String password : passwordSet){
+                                        String[] passwordArray = password.split("");
+                                        for(String p : passwordArray){
+                                            data = data + "0" + p;
+                                        }
+                                    }
+                                    data = data + checkNum;
+                                    String paramsStr = "%7B%22type%22%3A%22ff%22%2C%22dataCnt%22%3A%22" + data + "%22%7D";
+                                    try{
+                                        Map<String,Object> syResult = sendCmd(finalSyURL,userId,ardTankLock.getCarId(),199,"DataDownTransfer", paramsStr,sessionId);
+                                        if(((String)syResult.get("rspCode")).equals("0")){
+                                            List<ArdTankLockPassword> ardTankLockPasswordList = new ArrayList();
+                                            int i = 0;
+                                            for(String password : passwordSet){
+                                                ArdTankLockPassword ardTankLockPassword = new ArdTankLockPassword();
+                                                ardTankLockPassword.setId(IdUtils.simpleUUID());
+                                                ardTankLockPassword.setLockId(ardTankLock.getLockNum());//鏆傚瓨閿佺紪鍙�
+                                                ardTankLockPassword.setPassword(password);
+                                                ardTankLockPassword.setNo(String.valueOf(i));
+                                                ardTankLockPasswordList.add(ardTankLockPassword);
+                                                i = i + 1;
+                                            }
+                                            int result = ardTankLockPasswordMapper.insertArdTankLockPasswordList(ardTankLockPasswordList);
+                                        }
+                                        PositionContainer.getCarLockProcessThreadMap().get(ardTankLock.getCarId()).get(ardTankLock.getLockNum()).remove("lockPassword");
+                                    }catch(Exception e){
+                                        PositionContainer.getCarLockProcessThreadMap().get(ardTankLock.getCarId()).get(ardTankLock.getLockNum()).remove("lockPassword");
+                                    }
+                                }
+                            }else{
+                                String lockNumHead = ardTankLock.getLockNum().substring(0,2);
+                                String lockNumTail = ardTankLock.getLockNum().substring(2,4);
+                                //璁$畻鏍¢獙
+                                String checkNum = Integer.toHexString(Integer.parseInt(lockNumHead, 16) + Integer.parseInt(lockNumTail, 16) + Integer.parseInt("05", 16));
+
+                                if(checkNum.length() == 1){
+                                    checkNum = "0" + checkNum;
+                                }else if(checkNum.length() > 2){
+                                    checkNum = checkNum.substring(checkNum.length() - 2,checkNum.length());
+                                }
+                                String paramsStr = "%7B%22type%22%3A%22ff%22%2C%22dataCnt%22%3A%22" + ardTankLock.getLockNum() + "05" + checkNum + "%22%7D";
+                                try{
+                                    sendCmd(finalSyURL,userId,ardTankLock.getCarId(),199,"DataDownTransfer", paramsStr,sessionId);
+                                    PositionContainer.getCarLockProcessThreadMap().get(ardTankLock.getCarId()).get(ardTankLock.getLockNum()).remove("lockPassword");
+                                }catch (Exception e){
+                                    PositionContainer.getCarLockProcessThreadMap().get(ardTankLock.getCarId()).get(ardTankLock.getLockNum()).remove("lockPassword");
+                                }
+                            }
+                        }
+                    };
+                    //lockThread.start();
+                    if(PositionContainer.getCarLockProcessThreadMap().get(ardTankLock.getCarId()).get(ardTankLock.getLockNum()).get("lockPassword") == null){
+                        PositionContainer.getCarLockProcessThreadMap().get(ardTankLock.getCarId()).get(ardTankLock.getLockNum()).put("lockPassword",lockThread);
+                    }
+
+                }
+
+            }
+        };
+        passwordThread.start();
+    }
+
+    @Override
+    public List<ArdTankLock> getArdTankLockAllWithState() {
+        List<ArdTankLock> result = ardTankLockMapper.getArdTankLockAllWithState();
+        return result;
+    }
+
+    @Override
+    public Long getArdTankLockCount() {
+        Long result = ardTankLockMapper.getArdTankLockCount();
+        return result;
+    }
+
+    @Override
+    public int updateLockEnableByCarId(Map<String, Object> para) {
+        String carId = (String) para.get("carId");
+        String enable = String.valueOf((Boolean) para.get("enable"));
+        int result = ardTankLockMapper.updateLockEnableByCarId(carId, enable);
+        return result;
+    }
+
+    /*@Override
     public void getAlarm(String syUserId,String syPassword) {
         List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT");
         String syURL = "";
@@ -637,7 +917,7 @@
             thread.start();
             alarmMap.put(ardTankLock.getLockNum(),thread);
         }
-    }
+    }*/
 
     public Map<String,Object> sendCmd(String syURL,String userId,String carId,Integer cmdId,String cmd,String paramsStr,String sessionId){
         OkHttpClient okHttpClient = new OkHttpClient();

--
Gitblit v1.9.3