| | |
| | | import okhttp3.Response; |
| | | import org.apache.commons.codec.digest.DigestUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import com.ruoyi.common.utils.StringUtils; |
| | |
| | | private ArdTankWallTemporaryMapper ardTankWallTemporaryMapper; |
| | | |
| | | @Resource |
| | | private ArdTankLockAutoProcessLogMapper ardTankLockAutoProcessLogMapper; |
| | | |
| | | @Resource |
| | | private SYClient sYClient; |
| | | |
| | | @Value("${syCar.userId}") |
| | | private String userId; |
| | | |
| | | @Value("${syCar.password}") |
| | | private String password; |
| | | |
| | | private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void autoProcessArdTankLockByLockId(Map<String, Object> gpsMap) { |
| | | List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT"); |
| | | String syURL = ""; |
| | | if(syURLResult.size() != 0){ |
| | | syURL = syURLResult.get(0).getConfigValue(); |
| | | }else{ |
| | | return; |
| | | } |
| | | |
| | | List<SysConfig> electromagneticLockVelocityResult = sysConfigMapper.selectByType("ElectromagneticLockVelocity"); |
| | | Integer electromagneticLockVelocity = 5; |
| | | if(!electromagneticLockVelocityResult.isEmpty()){ |
| | | electromagneticLockVelocity = Integer.parseInt(electromagneticLockVelocityResult.get(0).getConfigValue()); |
| | | } |
| | | List<ArdTankLock> ardTankLockResult = ardTankLockMapper.getArdTankLockWithStateByCarId((String) gpsMap.get("carId")); |
| | | if(ardTankLockResult.isEmpty()){//非罐车 |
| | | return; |
| | | } |
| | | |
| | | for(ArdTankLock ardTankLock : ardTankLockResult){ |
| | | if(!Boolean.valueOf(ardTankLock.getEnable())){ |
| | | return;//是能为false,处于不受控状态 |
| | | } |
| | | } |
| | | |
| | | Integer speed = (Integer) gpsMap.get("speed"); |
| | | if(speed >= electromagneticLockVelocity){ |
| | | for(ArdTankLock ardTankLock : ardTankLockResult){ |
| | | ArdTankLockState ardTankLockState = ardTankLock.getArdTankLockState(); |
| | | if(ardTankLockState != null){ |
| | | if(ardTankLockState.getLockState().equals("开锁状态")){ |
| | | String lockNum = ardTankLock.getLockNum(); |
| | | if(PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum) == null){ |
| | | String lockNumHead = lockNum.substring(0,2); |
| | | String lockNumTail = lockNum.substring(2,4); |
| | | String checkNum = Integer.toHexString(Integer.parseInt(lockNumHead, 16)//锁编号高8位 |
| | | + Integer.parseInt(lockNumTail, 16)//锁编号低8位 |
| | | + Integer.parseInt("02", 16)//设置锁芯状态功能码02 |
| | | + Integer.parseInt("02", 16));//操作 |
| | | if(checkNum.length() == 1){ |
| | | checkNum = "0" + checkNum; |
| | | } |
| | | if(checkNum.length() > 2){ |
| | | checkNum = checkNum.substring(checkNum.length() - 2,checkNum.length()); |
| | | } |
| | | |
| | | String paramsStr = lockNum + "02" + "02" + checkNum; |
| | | paramsStr = "%7B%22type%22%3A%22ff%22%2C%22dataCnt%22%3A%22" + paramsStr + "%22%7D"; |
| | | PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum).put("lockProcess",new Thread());//加入容器 |
| | | //String syURL = "http://" + ip + ":9999"; |
| | | String passwordMd5 = DigestUtils.md5Hex(password); |
| | | Map<String, Object> LogInResult = sYClient.logIn(syURL, passwordMd5, userId); |
| | | String sessionId = (String) LogInResult.get("sessionId"); |
| | | try{ |
| | | Map<String,Object> result = sendCmd(syURL, userId, (String) gpsMap.get("carId"), 199, "DataDownTransfer", paramsStr, sessionId); |
| | | if(((String)result.get("rspCode")).equals("0")){ |
| | | ArdTankLockAutoProcessLog ardTankLockAutoProcessLog = new ArdTankLockAutoProcessLog(); |
| | | ardTankLockAutoProcessLog.setId(IdUtils.simpleUUID()); |
| | | ardTankLockAutoProcessLog.setLockId(ardTankLock.getId()); |
| | | ardTankLockAutoProcessLog.setLockNum(ardTankLock.getLockNum()); |
| | | ardTankLockAutoProcessLog.setCarId(ardTankLock.getCarId()); |
| | | ardTankLockAutoProcessLog.setCarPlate((String) gpsMap.get("carName")); |
| | | ardTankLockAutoProcessLog.setWallName("超速"); |
| | | ardTankLockAutoProcessLog.setWallType("永久"); |
| | | ardTankLockAutoProcessLog.setProcess("关动作"); |
| | | ardTankLockAutoProcessLog.setProcessReason("速度大于" + electromagneticLockVelocity +",超速关锁"); |
| | | ardTankLockAutoProcessLog.setLongitude(String.valueOf(gpsMap.get("lng"))); |
| | | ardTankLockAutoProcessLog.setLatitude(String.valueOf(gpsMap.get("lat"))); |
| | | ardTankLockAutoProcessLog.setVelocity(String.valueOf(gpsMap.get("speed"))); |
| | | ardTankLockAutoProcessLog.setProcessTime(this.sdf.format(new Date())); |
| | | ardTankLockAutoProcessLogMapper.insertArdTankLockAutoProcessLog(ardTankLockAutoProcessLog); |
| | | } |
| | | }catch(Exception e){ |
| | | |
| | | } |
| | | PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum).remove("lockProcess");//移除容器 |
| | | }else{ |
| | | continue; |
| | | } |
| | | }else{ |
| | | continue; |
| | | } |
| | | }else{ |
| | | continue; |
| | | } |
| | | } |
| | | }else{ |
| | | //临时电子围栏逻辑 |
| | | List<ArdTankWallTemporary> ardTankWallTemporaryList = ardTankWallTemporaryMapper.getArdTankWallTemporaryByCarId((String) gpsMap.get("carId")); |
| | | //Boolean flag = true;//车辆处于任意临时电子围栏,就将标记设为false |
| | | if(!ardTankWallTemporaryList.isEmpty()){ |
| | | for(ArdTankWallTemporary ardTankWallTemporary : ardTankWallTemporaryList){ |
| | | Double longitude = ardTankWallTemporary.getLongitude(); |
| | | Double latitude = ardTankWallTemporary.getLatitude(); |
| | | Integer distance = ardTankWallTemporary.getDistance(); |
| | | |
| | | Double[] From = new Double[]{longitude,latitude}; |
| | | Double[] To = new Double[]{((Number) gpsMap.get("lng")).doubleValue(),((Number) gpsMap.get("lat")).doubleValue()}; |
| | | Number realDistance = GisUtil.getDistance(From,To); |
| | | if(realDistance.intValue() <= distance){//实际距离小于半径 |
| | | for(ArdTankLock ardTankLock : ardTankLockResult){ |
| | | ArdTankLockState ardTankLockState = ardTankLock.getArdTankLockState(); |
| | | if(ardTankLockState != null){ |
| | | if(ardTankLockState.getLockState().equals("关锁状态")){ |
| | | String lockNum = ardTankLock.getLockNum(); |
| | | if(PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum).get("lockProcess") == null){ |
| | | String lockNumHead = lockNum.substring(0,2); |
| | | String lockNumTail = lockNum.substring(2,4); |
| | | String checkNum = Integer.toHexString(Integer.parseInt(lockNumHead, 16)//锁编号高8位 |
| | | + Integer.parseInt(lockNumTail, 16)//锁编号低8位 |
| | | + Integer.parseInt("02", 16)//设置锁芯状态功能码02 |
| | | + Integer.parseInt("01", 16));//操作 |
| | | if(checkNum.length() == 1){ |
| | | checkNum = "0" + checkNum; |
| | | } |
| | | if(checkNum.length() > 2){ |
| | | checkNum = checkNum.substring(checkNum.length() - 2,checkNum.length()); |
| | | } |
| | | |
| | | String paramsStr = lockNum + "02" + "01" + checkNum; |
| | | paramsStr = "%7B%22type%22%3A%22ff%22%2C%22dataCnt%22%3A%22" + paramsStr + "%22%7D"; |
| | | PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum).put("lockProcess",new Thread());//加入容器 |
| | | String passwordMd5 = DigestUtils.md5Hex(password); |
| | | Map<String, Object> LogInResult = sYClient.logIn(syURL, passwordMd5, userId); |
| | | String sessionId = (String) LogInResult.get("sessionId"); |
| | | try{ |
| | | Map<String,Object> result = sendCmd(syURL, userId, (String) gpsMap.get("carId"), 199, "DataDownTransfer", paramsStr, sessionId); |
| | | if(((String)result.get("rspCode")).equals("0")){ |
| | | ArdTankLockAutoProcessLog ardTankLockAutoProcessLog = new ArdTankLockAutoProcessLog(); |
| | | ardTankLockAutoProcessLog.setId(IdUtils.simpleUUID()); |
| | | ardTankLockAutoProcessLog.setLockId(ardTankLock.getId()); |
| | | ardTankLockAutoProcessLog.setLockNum(ardTankLock.getLockNum()); |
| | | ardTankLockAutoProcessLog.setCarId(ardTankLock.getCarId()); |
| | | ardTankLockAutoProcessLog.setCarPlate((String) gpsMap.get("carName")); |
| | | ardTankLockAutoProcessLog.setWallId(ardTankWallTemporary.getId()); |
| | | ardTankLockAutoProcessLog.setWallName(ardTankWallTemporary.getWallName()); |
| | | ardTankLockAutoProcessLog.setWallType("临时"); |
| | | ardTankLockAutoProcessLog.setProcess("开动作"); |
| | | ardTankLockAutoProcessLog.setProcessReason("速度小于" + electromagneticLockVelocity +",并进入临时电子围栏'" + ardTankWallTemporary.getWallName() + "'" + ",开锁"); |
| | | ardTankLockAutoProcessLog.setLongitude(String.valueOf(gpsMap.get("lng"))); |
| | | ardTankLockAutoProcessLog.setLatitude(String.valueOf(gpsMap.get("lat"))); |
| | | ardTankLockAutoProcessLog.setVelocity(String.valueOf(gpsMap.get("speed"))); |
| | | ardTankLockAutoProcessLog.setProcessTime(this.sdf.format(new Date())); |
| | | ardTankLockAutoProcessLogMapper.insertArdTankLockAutoProcessLog(ardTankLockAutoProcessLog); |
| | | } |
| | | }catch(Exception e){ |
| | | |
| | | } |
| | | PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum).remove("lockProcess");//移除容器 |
| | | }else{ |
| | | continue; |
| | | } |
| | | }else{ |
| | | continue; |
| | | } |
| | | }else{ |
| | | continue; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | //电子围栏逻辑 |
| | | |
| | | } |
| | | } |
| | | |
| | | public Map<String,Object> sendCmd(String syURL,String userId,String carId,Integer cmdId,String cmd,String paramsStr,String sessionId){ |
| | | OkHttpClient okHttpClient = new OkHttpClient(); |
| | | |