| | |
| | | package com.ruoyi.sy.service.impl; |
| | | |
| | | import java.awt.geom.Point2D; |
| | | import java.io.IOException; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.github.pagehelper.PageHelper; |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | import com.ruoyi.common.core.domain.entity.SysConfig; |
| | | import com.ruoyi.common.utils.uuid.IdUtils; |
| | | import com.ruoyi.sy.domain.ArdSyUser; |
| | | import com.ruoyi.sy.domain.ArdTankLock; |
| | | import com.ruoyi.sy.domain.ArdTankWall; |
| | | import com.ruoyi.sy.mapper.ArdSyUserMapper; |
| | | import com.ruoyi.sy.mapper.ArdTankLockMapper; |
| | | import com.ruoyi.sy.mapper.ArdTankWallMapper; |
| | | 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; |
| | | import com.ruoyi.utils.gis.GisUtil; |
| | | import com.ruoyi.utils.gps.GeoTools; |
| | | import okhttp3.OkHttpClient; |
| | | import okhttp3.Request; |
| | | 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; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.sy.mapper.ArdTankLockProcessLogMapper; |
| | | import com.ruoyi.sy.domain.ArdTankLockProcessLog; |
| | | import com.ruoyi.sy.service.IArdTankLockProcessLogService; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | private ArdTankLockMapper ardTankLockMapper; |
| | | |
| | | @Resource |
| | | 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 int insertArdTankLockProcessLog(ArdTankLockProcessLog ardTankLockProcessLog) { |
| | | ardTankLockProcessLog.setId(IdUtils.simpleUUID()); |
| | | ardTankLockProcessLog.setUserId(SecurityUtils.getUserId()); |
| | | return ardTankLockProcessLogMapper.insertArdTankLockProcessLog(ardTankLockProcessLog); |
| | | ardTankLockProcessLog.setId(IdUtils.simpleUUID()); |
| | | ardTankLockProcessLog.setUserId(SecurityUtils.getUserId()); |
| | | return ardTankLockProcessLogMapper.insertArdTankLockProcessLog(ardTankLockProcessLog); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | @Override |
| | | public String processArdTankLockByLockId(String userId, String username, Map<String,String> para) { |
| | | public AjaxResult processArdTankLockByLockId(String userId, String username, Map<String,String> para) { |
| | | String lockId = para.get("lockId"); |
| | | String lockNum = para.get("lockNum"); |
| | | String carId = para.get("carId"); |
| | |
| | | //判断使能 |
| | | ArdTankLock ardTankLock = ardTankLockMapper.selectArdTankLockById(lockId); |
| | | if(ardTankLock.getEnable().equals("false")){ |
| | | return "该锁使能关闭,无法操控"; |
| | | return AjaxResult.error("该锁使能关闭,无法操控"); |
| | | } |
| | | |
| | | |
| | | ArdSyUser ardSyUser = ardSyUserMapper.userById(userId); |
| | | if(ardSyUser == null){ |
| | | return "未挂接三一账号"; |
| | | return AjaxResult.error("未挂接三一账号"); |
| | | } |
| | | List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT"); |
| | | String syURL = ""; |
| | | if(syURLResult.size() != 0){ |
| | | syURL = syURLResult.get(0).getConfigValue(); |
| | | }else{ |
| | | return "三一平台未录入"; |
| | | return AjaxResult.error("三一平台未录入"); |
| | | } |
| | | String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword()); |
| | | Map<String, Object> LogInResult = sYClient.logIn(syURL, passwordMd5, ardSyUser.getUserId()); |
| | |
| | | Map<String,Object> syResult = sYClient.getCarNearPositionByCarId(syURL, carId, ardSyUser.getUserId(), sessionId); |
| | | if(((String)syResult.get("rspCode")).equals("1")){ |
| | | Map<String,Object> carMap = ((List<Map<String,Object>>)syResult.get("list")).get(0); |
| | | if(Integer.parseInt((String)carMap.get("speed")) != 0){ |
| | | return AjaxResult.error("车辆正在行驶中"); |
| | | } |
| | | lng = (String) carMap.get("lng"); |
| | | lat = (String) carMap.get("lat"); |
| | | carPlate = (String) carMap.get("carName"); |
| | | |
| | | }else{ |
| | | return "三一平台报错"; |
| | | return AjaxResult.error("三一平台报错"); |
| | | } |
| | | //挂接了临时电子围栏 |
| | | List<ArdTankWallTemporary> ardTankWallTemporaryList = ardTankWallTemporaryMapper.getArdTankWallTemporaryByCarId((String) para.get("carId")); |
| | | 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[]{Double.valueOf(lng),Double.valueOf(lat)}; |
| | | Number realDistance = GisUtil.getDistance(From,To); |
| | | if(realDistance.intValue() <= distance){//实际距离小于半径 |
| | | return AjaxResult.error("当前车辆正处在" + ardTankWallTemporary.getWallName() + "中"); |
| | | } |
| | | } |
| | | return AjaxResult.error("当前车辆正处在临时电子围栏外"); |
| | | } |
| | | |
| | | List<ArdTankWall> ardTankWallList = ardTankWallMapper.getArdTankWallProcessByLockId(lockId);//查询锁挂接的全部需要动作的电子围栏 |
| | |
| | | pts.add(new Point2D.Double(Double.parseDouble(wallpoiArro[j]), Double.parseDouble(wallpoiArro[j+1]))); |
| | | } |
| | | if(GeoTools.IsPtInPoly(point, pts)){//在任意电子围栏内,不报警 |
| | | return "当前车辆正处在" + ardTankWall.getWallName() + "中"; |
| | | return AjaxResult.error("当前车辆正处在" + ardTankWall.getWallName() + "中"); |
| | | } |
| | | } |
| | | return "当前车辆正处在电子围栏外"; |
| | | return AjaxResult.error("当前车辆正处在电子围栏外"); |
| | | }else{ |
| | | try{ |
| | | 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(process, 16));//操作 |
| | | if(checkNum.length() == 1){ |
| | | checkNum = "0" + checkNum; |
| | | } |
| | | if(checkNum.length() > 2){ |
| | | checkNum = checkNum.substring(checkNum.length() - 2,checkNum.length()); |
| | | } |
| | | |
| | | String paramsStr = lockNum + "02" + process + checkNum; |
| | | paramsStr = "%7B%22type%22%3A%22ff%22%2C%22dataCnt%22%3A%22" + paramsStr + "%22%7D"; |
| | | |
| | | Map<String,Object> result = sYClient.sendCmd(syURL, ardSyUser.getUserId(), carId, 199, "DataDownTransfer", paramsStr, sessionId); |
| | | |
| | | |
| | | if(((String)result.get("rspCode")).equals("0")){ |
| | | //入库操作 |
| | | ArdTankLockProcessLog ardTankLockProcessLog = new ArdTankLockProcessLog(); |
| | | ardTankLockProcessLog.setId(IdUtils.simpleUUID()); |
| | | ardTankLockProcessLog.setLockId(lockId); |
| | | ardTankLockProcessLog.setLockNum(lockNum); |
| | | ardTankLockProcessLog.setCarId(carId); |
| | | ardTankLockProcessLog.setCarPlate(carPlate); |
| | | ardTankLockProcessLog.setUserId(userId); |
| | | ardTankLockProcessLog.setUserName(username); |
| | | if(process.equals("01")){ |
| | | ardTankLockProcessLog.setProcess("开动作"); |
| | | }else if(process.equals("02")){ |
| | | ardTankLockProcessLog.setProcess("关动作"); |
| | | if(PositionContainer.getCarLockProcessThreadMap().get(carId).get(lockNum).get("lockProcess") != null){ |
| | | PositionContainer.getCarLockProcessThreadMap().get(carId).get(lockNum).put("lockProcess",new Thread());//加入容器 |
| | | 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(process, 16));//操作 |
| | | if(checkNum.length() == 1){ |
| | | checkNum = "0" + checkNum; |
| | | } |
| | | ardTankLockProcessLog.setProcessReason(processReason); |
| | | ardTankLockProcessLog.setLongitude(lng); |
| | | ardTankLockProcessLog.setLatitude(lat); |
| | | ardTankLockProcessLog.setProcessTime(this.sdf.format(new Date())); |
| | | ardTankLockProcessLogMapper.insertArdTankLockProcessLog(ardTankLockProcessLog); |
| | | return "发送成功"; |
| | | if(checkNum.length() > 2){ |
| | | checkNum = checkNum.substring(checkNum.length() - 2,checkNum.length()); |
| | | } |
| | | |
| | | String paramsStr = lockNum + "02" + process + checkNum; |
| | | paramsStr = "%7B%22type%22%3A%22ff%22%2C%22dataCnt%22%3A%22" + paramsStr + "%22%7D"; |
| | | //PositionContainer.getCarLockProcessThreadMap().get(carId).get(lockNum).put("lockProcess",new Thread());//加入容器 |
| | | Map<String,Object> result = sendCmd(syURL, ardSyUser.getUserId(), carId, 199, "DataDownTransfer", paramsStr, sessionId); |
| | | PositionContainer.getCarLockProcessThreadMap().get(carId).get(lockNum).remove("lockProcess");//移除容器 |
| | | if(((String)result.get("rspCode")).equals("0")){ |
| | | ArdTankLockProcessLog ardTankLockProcessLog = new ArdTankLockProcessLog(); |
| | | ardTankLockProcessLog.setId(IdUtils.simpleUUID()); |
| | | ardTankLockProcessLog.setLockId(lockId); |
| | | ardTankLockProcessLog.setLockNum(lockNum); |
| | | ardTankLockProcessLog.setCarId(carId); |
| | | ardTankLockProcessLog.setCarPlate(carPlate); |
| | | ardTankLockProcessLog.setUserId(userId); |
| | | ardTankLockProcessLog.setUserName(username); |
| | | if(process.equals("01")){ |
| | | ardTankLockProcessLog.setProcess("开动作"); |
| | | }else if(process.equals("02")){ |
| | | ardTankLockProcessLog.setProcess("关动作"); |
| | | } |
| | | ardTankLockProcessLog.setProcessReason(processReason); |
| | | ardTankLockProcessLog.setLongitude(lng); |
| | | ardTankLockProcessLog.setLatitude(lat); |
| | | ardTankLockProcessLog.setProcessTime(this.sdf.format(new Date())); |
| | | ardTankLockProcessLogMapper.insertArdTankLockProcessLog(ardTankLockProcessLog); |
| | | return AjaxResult.success("发送成功"); |
| | | }else if(((String)result.get("rspCode")).equals("-6")){ |
| | | return AjaxResult.error("找不到车辆"); |
| | | }else if(((String)result.get("rspCode")).equals("-5")){ |
| | | return AjaxResult.error("找不到用户"); |
| | | }else if(((String)result.get("rspCode")).equals("-4")){ |
| | | return AjaxResult.error("找不到指令"); |
| | | }else if(((String)result.get("rspCode")).equals("-3")){ |
| | | return AjaxResult.error("指令发送超时"); |
| | | }else if(((String)result.get("rspCode")).equals("-2")){ |
| | | return AjaxResult.error("离线待发"); |
| | | }else if(((String)result.get("rspCode")).equals("-1")){ |
| | | return AjaxResult.error("车辆离线"); |
| | | }else if(((String)result.get("rspCode")).equals("1")){ |
| | | return AjaxResult.error("发送失败"); |
| | | }else if(((String)result.get("rspCode")).equals("2")){ |
| | | return AjaxResult.error("消息有误"); |
| | | }else if(((String)result.get("rspCode")).equals("3")){ |
| | | return AjaxResult.error("不支持"); |
| | | }else{ |
| | | return AjaxResult.error("其他原因发送失败"); |
| | | } |
| | | }else{ |
| | | return "发送失败"; |
| | | return AjaxResult.error("其他操控正在进行中,请稍后"); |
| | | } |
| | | }catch(Exception e){ |
| | | e.printStackTrace(); |
| | | return "发送失败"; |
| | | PositionContainer.getCarLockProcessThreadMap().get(carId).get(lockNum).remove("lockProcess");//移除容器 |
| | | return AjaxResult.error("发送失败" + e.toString()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @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("开锁状态") || ardTankLockState.getLockState().equals("异常状态")){ |
| | | String lockNum = ardTankLock.getLockNum(); |
| | | if(PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum) == null){ |
| | | PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum).put("lockProcess",new Thread());//加入容器 |
| | | 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 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("关锁状态") || ardTankLockState.getLockState().equals("异常状态")){ |
| | | String lockNum = ardTankLock.getLockNum(); |
| | | if(PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum).get("lockProcess") == null){ |
| | | PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum).put("lockProcess",new Thread());//加入容器 |
| | | 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; |
| | | } |
| | | } |
| | | break;//处在任意电子围栏中 |
| | | } |
| | | } |
| | | } |
| | | //电子围栏逻辑 |
| | | Point2D.Double point = new Point2D.Double(((Number) gpsMap.get("lng")).doubleValue(), ((Number) gpsMap.get("lat")).doubleValue());//车辆当前位置 |
| | | List<ArdTankLock> ardTankLockList = ardTankLockMapper.selectArdTankLockWithWallAndStateByCarId((String) gpsMap.get("carId")); |
| | | for(ArdTankLock ardTankLock : ardTankLockList){ |
| | | ArdTankLockState ardTankLockState = ardTankLock.getArdTankLockState(); |
| | | if(ardTankLockState == null){ |
| | | break; |
| | | } |
| | | String lockState = ardTankLockState.getLockState(); |
| | | |
| | | String lockNum = ardTankLock.getLockNum(); |
| | | |
| | | List<ArdTankWallLock> ardTankWallLockList = ardTankLock.getArdTankWallLockList();//中间表 |
| | | if(ardTankWallLockList.isEmpty()){//没有挂接电子围栏 |
| | | break; |
| | | } |
| | | for(ArdTankWallLock ardTankWallLock : ardTankWallLockList){ |
| | | ArdTankWall ardTankWall = ardTankWallLock.getArdTankWall();//电子围栏 |
| | | |
| | | List<Point2D.Double> pts = new ArrayList<Point2D.Double>(); |
| | | String[] wallpoiArro = ardTankWall.getWallPoi().split(","); |
| | | for (int j = 0; j < wallpoiArro.length; j = j + 3) {//构建多边形 |
| | | pts.add(new Point2D.Double(Double.parseDouble(wallpoiArro[j]), Double.parseDouble(wallpoiArro[j+1]))); |
| | | } |
| | | if(GeoTools.IsPtInPoly(point, pts)){//在电子围栏内 |
| | | if(ardTankWallLock.getProcessType().equals("1")){//电子围栏操作是否为开锁 |
| | | if(lockState.equals("关锁状态") || lockState.equals("异常状态")){ |
| | | //执行开锁动作 |
| | | if(PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum).get("lockProcess") == null){ |
| | | PositionContainer.getCarLockProcessThreadMap().get((String) gpsMap.get("carId")).get(lockNum).put("lockProcess",new Thread());//加入容器 |
| | | 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(ardTankWall.getId()); |
| | | ardTankLockAutoProcessLog.setWallName(ardTankWall.getWallName()); |
| | | ardTankLockAutoProcessLog.setWallType("永久"); |
| | | ardTankLockAutoProcessLog.setProcess("开动作"); |
| | | ardTankLockAutoProcessLog.setProcessReason("速度小于" + electromagneticLockVelocity +",并进入电子围栏'" + ardTankWall.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 if(ardTankWallLock.getProcessType().equals("-1")){//电子围栏操作是否为关锁 |
| | | if(lockState.equals("开锁状态") || lockState.equals("异常状态")){ |
| | | //执行关锁动作 |
| | | 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("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 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(ardTankWall.getId()); |
| | | ardTankLockAutoProcessLog.setWallName(ardTankWall.getWallName()); |
| | | ardTankLockAutoProcessLog.setWallType("永久"); |
| | | ardTankLockAutoProcessLog.setProcess("关动作"); |
| | | ardTankLockAutoProcessLog.setProcessReason("速度小于" + electromagneticLockVelocity +",并进入电子围栏'" + ardTankWall.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");//移除容器 |
| | | } |
| | | } |
| | | } |
| | | break;//处在任意电子围栏中 |
| | | }else{ |
| | | continue; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public Map<String, Object> getArdTankLockProcessLogByCarPlate(Map<String, Object> para) { |
| | | //分页属性 |
| | | Integer pageNum = (Integer) para.get("pageNum"); |
| | | Integer pageSize = (Integer) para.get("pageSize"); |
| | | |
| | | PageHelper.startPage(pageNum, pageSize);//分页 |
| | | Map<String,Object> resultMap = new HashMap(); |
| | | if(((String) para.get("carPlate")).equals("")){ |
| | | List<ArdTankLockProcessLog> resultList = ardTankLockProcessLogMapper.getArdTankLockProcessLogAll(); |
| | | Long total = ardTankLockProcessLogMapper.getArdTankLockProcessLogTotal(); |
| | | resultMap.put("list",resultList); |
| | | resultMap.put("total",total); |
| | | return resultMap; |
| | | }else{ |
| | | List<ArdTankLockProcessLog> resultList = ardTankLockProcessLogMapper.getArdTankLockProcessLogByCarPlate("%" + (String) para.get("carPlate") + "%"); |
| | | Long total = ardTankLockProcessLogMapper.getArdTankLockProcessLogTotalByCarPlate("%" + (String) para.get("carPlate") + "%"); |
| | | resultMap.put("list",resultList); |
| | | resultMap.put("total",total); |
| | | return resultMap; |
| | | } |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public List<ArdTankLockProcessLog> exportArdTankLockProcessLog(String carPlate) { |
| | | if(carPlate.equals("")){ |
| | | List<ArdTankLockProcessLog> resultList = ardTankLockProcessLogMapper.getArdTankLockProcessLogAll(); |
| | | return resultList; |
| | | }else{ |
| | | List<ArdTankLockProcessLog> resultList = ardTankLockProcessLogMapper.getArdTankLockProcessLogByCarPlate("%" + carPlate + "%"); |
| | | return resultList; |
| | | } |
| | | } |
| | | |
| | | public Map<String,Object> sendCmd(String syURL,String userId,String carId,Integer cmdId,String cmd,String paramsStr,String sessionId){ |
| | | OkHttpClient okHttpClient = new OkHttpClient(); |
| | | |
| | | Request request = new Request.Builder() |
| | | .url(syURL + "/gps-web/api/send_cmd.jsp?params="+paramsStr+"&userId="+userId+"&carId="+carId+"&cmdId="+cmdId+"&cmd="+cmd+"&sessionId="+sessionId) |
| | | .build(); |
| | | //System.out.println("url = " + syURL + "/gps-web/api/send_cmd.jsp?params="+paramsStr+"&userId="+userId+"&carId="+carId+"&cmdId="+cmdId+"&cmd="+cmd+"&sessionId="+sessionId); |
| | | Response response = null; |
| | | try { |
| | | response = okHttpClient.newCall(request).execute(); |
| | | } catch (IOException e) { |
| | | // TODO Auto-generated catch block |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | okhttp3.ResponseBody responseBody = response.body(); |
| | | |
| | | try { |
| | | String message = responseBody.string();// 响应体 |
| | | Map<String,Object> map = (Map<String, Object>) JSON.parse(message); |
| | | return map; |
| | | } catch (IOException e) { |
| | | // TODO Auto-generated catch block |
| | | e.printStackTrace(); |
| | | return new HashMap(); |
| | | } |
| | | } |
| | | } |