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.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<ArdTankLockProcessLog> 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<String,String> 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<SysConfig> 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<String, Object> LogInResult = sYClient.logIn(syURL, passwordMd5, ardSyUser.getUserId());
|
String sessionId = (String) LogInResult.get("sessionId");
|
|
String lng = "";
|
String lat = "";
|
String carPlate = "";
|
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 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);//查询锁挂接的全部需要动作的电子围栏
|
if(!ardTankWallList.isEmpty()){//挂接了动作电子围栏
|
Point2D.Double point = new Point2D.Double(Double.parseDouble(lng), Double.parseDouble(lat));//车辆当前位置
|
List<Point2D.Double> pts = new ArrayList<Point2D.Double>();
|
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<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 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<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;
|
}
|
}
|
}
|
}
|
}
|
|
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();
|
}
|
}
|
}
|