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.*; 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.service.IArdTankLockProcessLogService; import javax.annotation.Resource; /** * 罐车锁操控日志Service业务层处理 * * @author ard * @date 2024-07-10 */ @Service public class ArdTankLockProcessLogServiceImpl implements IArdTankLockProcessLogService { @Resource private ArdTankLockProcessLogMapper ardTankLockProcessLogMapper; @Resource private ArdTankWallMapper ardTankWallMapper; @Resource private ArdSyUserMapper ardSyUserMapper; @Resource private SysConfigMapper sysConfigMapper; @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"); /** * 查询罐车锁操控日志 * * @param id 罐车锁操控日志主键 * @return 罐车锁操控日志 */ @Override public ArdTankLockProcessLog selectArdTankLockProcessLogById(String id) { return ardTankLockProcessLogMapper.selectArdTankLockProcessLogById(id); } /** * 查询罐车锁操控日志列表 * * @param ardTankLockProcessLog 罐车锁操控日志 * @return 罐车锁操控日志 */ @Override public List selectArdTankLockProcessLogList(ArdTankLockProcessLog ardTankLockProcessLog) { return ardTankLockProcessLogMapper.selectArdTankLockProcessLogList(ardTankLockProcessLog); } /** * 新增罐车锁操控日志 * * @param ardTankLockProcessLog 罐车锁操控日志 * @return 结果 */ @Override public int insertArdTankLockProcessLog(ArdTankLockProcessLog ardTankLockProcessLog) { ardTankLockProcessLog.setId(IdUtils.simpleUUID()); ardTankLockProcessLog.setUserId(SecurityUtils.getUserId()); return ardTankLockProcessLogMapper.insertArdTankLockProcessLog(ardTankLockProcessLog); } /** * 修改罐车锁操控日志 * * @param ardTankLockProcessLog 罐车锁操控日志 * @return 结果 */ @Override public int updateArdTankLockProcessLog(ArdTankLockProcessLog ardTankLockProcessLog) { return ardTankLockProcessLogMapper.updateArdTankLockProcessLog(ardTankLockProcessLog); } /** * 批量删除罐车锁操控日志 * * @param ids 需要删除的罐车锁操控日志主键 * @return 结果 */ @Override public int deleteArdTankLockProcessLogByIds(String[] ids) { return ardTankLockProcessLogMapper.deleteArdTankLockProcessLogByIds(ids); } /** * 删除罐车锁操控日志信息 * * @param id 罐车锁操控日志主键 * @return 结果 */ @Override public int deleteArdTankLockProcessLogById(String id) { return ardTankLockProcessLogMapper.deleteArdTankLockProcessLogById(id); } @Override public AjaxResult processArdTankLockByLockId(String userId, String username, Map para) { String lockId = para.get("lockId"); String lockNum = para.get("lockNum"); String carId = para.get("carId"); String process = para.get("process");//01:开,02:关 String processReason = para.get("processReason");//操控原因 //判断使能 ArdTankLock ardTankLock = ardTankLockMapper.selectArdTankLockById(lockId); if(ardTankLock.getEnable().equals("false")){ return AjaxResult.error("该锁使能关闭,无法操控"); } ArdSyUser ardSyUser = ardSyUserMapper.userById(userId); if(ardSyUser == null){ return AjaxResult.error("未挂接三一账号"); } List syURLResult = sysConfigMapper.selectByType("syCarPT"); String syURL = ""; if(syURLResult.size() != 0){ syURL = syURLResult.get(0).getConfigValue(); }else{ return AjaxResult.error("三一平台未录入"); } String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword()); Map LogInResult = sYClient.logIn(syURL, passwordMd5, ardSyUser.getUserId()); String sessionId = (String) LogInResult.get("sessionId"); String lng = ""; String lat = ""; String carPlate = ""; Map syResult = sYClient.getCarNearPositionByCarId(syURL, carId, ardSyUser.getUserId(), sessionId); if(((String)syResult.get("rspCode")).equals("1")){ Map carMap = ((List>)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 AjaxResult.error("三一平台报错"); } //挂接了临时电子围栏 List 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 ardTankWallList = ardTankWallMapper.getArdTankWallProcessByLockId(lockId);//查询锁挂接的全部需要动作的电子围栏 if(!ardTankWallList.isEmpty()){//挂接了动作电子围栏 Point2D.Double point = new Point2D.Double(Double.parseDouble(lng), Double.parseDouble(lat));//车辆当前位置 List pts = new ArrayList(); for(ArdTankWall ardTankWall : ardTankWallList){ pts.clear(); 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)){//在任意电子围栏内,不报警 return AjaxResult.error("当前车辆正处在" + ardTankWall.getWallName() + "中"); } } return AjaxResult.error("当前车辆正处在电子围栏外"); }else{ try{ 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; } 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 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 AjaxResult.error("其他操控正在进行中,请稍后"); } }catch(Exception e){ e.printStackTrace(); PositionContainer.getCarLockProcessThreadMap().get(carId).get(lockNum).remove("lockProcess");//移除容器 return AjaxResult.error("发送失败" + e.toString()); } } } @Override public void autoProcessArdTankLockByLockId(Map gpsMap) { List syURLResult = sysConfigMapper.selectByType("syCarPT"); String syURL = ""; if(syURLResult.size() != 0){ syURL = syURLResult.get(0).getConfigValue(); }else{ return; } List electromagneticLockVelocityResult = sysConfigMapper.selectByType("ElectromagneticLockVelocity"); Integer electromagneticLockVelocity = 5; if(!electromagneticLockVelocityResult.isEmpty()){ electromagneticLockVelocity = Integer.parseInt(electromagneticLockVelocityResult.get(0).getConfigValue()); } List 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 LogInResult = sYClient.logIn(syURL, passwordMd5, userId); String sessionId = (String) LogInResult.get("sessionId"); try{ Map 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 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 LogInResult = sYClient.logIn(syURL, passwordMd5, userId); String sessionId = (String) LogInResult.get("sessionId"); try{ Map 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 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 ardTankWallLockList = ardTankLock.getArdTankWallLockList();//中间表 if(ardTankWallLockList.isEmpty()){//没有挂接电子围栏 break; } for(ArdTankWallLock ardTankWallLock : ardTankWallLockList){ ArdTankWall ardTankWall = ardTankWallLock.getArdTankWall();//电子围栏 List pts = new ArrayList(); 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 LogInResult = sYClient.logIn(syURL, passwordMd5, userId); String sessionId = (String) LogInResult.get("sessionId"); try{ Map 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 LogInResult = sYClient.logIn(syURL, passwordMd5, userId); String sessionId = (String) LogInResult.get("sessionId"); try{ Map 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 getArdTankLockProcessLogByCarPlate(Map para) { //分页属性 Integer pageNum = (Integer) para.get("pageNum"); Integer pageSize = (Integer) para.get("pageSize"); PageHelper.startPage(pageNum, pageSize);//分页 Map resultMap = new HashMap(); if(((String) para.get("carPlate")).equals("")){ List resultList = ardTankLockProcessLogMapper.getArdTankLockProcessLogAll(); Long total = ardTankLockProcessLogMapper.getArdTankLockProcessLogTotal(); resultMap.put("list",resultList); resultMap.put("total",total); return resultMap; }else{ List 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 exportArdTankLockProcessLog(String carPlate) { if(carPlate.equals("")){ List resultList = ardTankLockProcessLogMapper.getArdTankLockProcessLogAll(); return resultList; }else{ List resultList = ardTankLockProcessLogMapper.getArdTankLockProcessLogByCarPlate("%" + carPlate + "%"); return resultList; } } public Map 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 map = (Map) JSON.parse(message); return map; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return new HashMap(); } } }