From 1b31589e39045e25a89148ae58d7dfd34fe53847 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: 星期二, 30 七月 2024 09:38:36 +0800
Subject: [PATCH] 修改:会话事件推送处理使用异步

---
 ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdTankLockServiceImpl.java |  174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 168 insertions(+), 6 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 622e4ae..a134e0c 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();//鐢电閿佸巻鍙叉姤璀︾嚎绋嬪鍣�
 
     /**
      * 鏌ヨ鐢电閿�
@@ -636,9 +639,168 @@
             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(syURL){
+            @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";
+                                    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());
+                                    }
+                                }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";
+
+                                    sendCmd(finalSyURL,userId,ardTankLock.getCarId(),199,"DataDownTransfer", paramsStr,sessionId);*/
+                                    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);
+                                    }
+                                    System.out.println("1111111111111111");
+                                    System.out.println(passwordSet);
+                                    //璁剧疆鏂板瘑鐮�
+                                    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";
+                                    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);
+                                    }
+                                }
+                            }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";
+
+                                sendCmd(finalSyURL,userId,ardTankLock.getCarId(),199,"DataDownTransfer", paramsStr,sessionId);
+                            }
+                        }
+                    };
+                    lockThread.start();
+                }
+
+            }
+        };
+        passwordThread.start();
+    }
+
+    /*@Override
     public void getAlarm(String syUserId,String syPassword) {
         List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT");
         String syURL = "";
@@ -687,7 +849,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