From 93cecfaf0fae080ebd0212adea714726290d0d4a Mon Sep 17 00:00:00 2001 From: zhangnaisong <2434969829@qq.com> Date: 星期四, 01 八月 2024 20:36:54 +0800 Subject: [PATCH] 电磁锁串口协议发送加入线程排队提交 --- ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdTankLockServiceImpl.java | 237 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 228 insertions(+), 9 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..7e3fc5c 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); } @@ -636,9 +683,181 @@ 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"; + + 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(); + 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 void getAlarm(String syUserId,String syPassword) { List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT"); String syURL = ""; @@ -687,7 +906,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