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