package com.ruoyi.sy.service.impl;
|
|
import java.awt.geom.Point2D;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
import com.alibaba.fastjson.JSON;
|
import com.ruoyi.common.core.domain.entity.SysConfig;
|
import com.ruoyi.common.core.domain.entity.SysDept;
|
import com.ruoyi.common.core.domain.entity.SysUser;
|
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.system.mapper.SysDeptMapper;
|
import com.ruoyi.system.mapper.SysUserMapper;
|
import com.ruoyi.utils.gis.GisUtil;
|
import com.ruoyi.utils.gps.GeoTools;
|
import com.ruoyi.utils.websocket.util.WebSocketUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.SecurityUtils;
|
import com.ruoyi.sy.service.IArdTankAbnormalParkAlarmService;
|
|
import javax.annotation.Resource;
|
|
import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
|
|
/**
|
* 罐车异常停车报警记录Service业务层处理
|
*
|
* @author ard
|
* @date 2024-07-08
|
*/
|
@Service
|
public class ArdTankAbnormalParkAlarmServiceImpl implements IArdTankAbnormalParkAlarmService {
|
@Resource
|
private ArdTankAbnormalParkAlarmMapper ardTankAbnormalParkAlarmMapper;
|
|
@Resource
|
private ArdSyCarMapper ardSyCarMapper;
|
|
@Resource
|
private ArdTankWallMapper ardTankWallMapper;
|
|
@Resource
|
private SysConfigMapper sysConfigMapper;
|
|
@Resource
|
private SysDeptMapper sysDeptMapper;
|
|
@Resource
|
private SysUserMapper sysUserMapper;
|
|
@Resource
|
private ArdTankWallTemporaryMapper ardTankWallTemporaryMapper;
|
|
@Resource
|
private ArdTankLoadLogMapper ardTankLoadLogMapper;
|
|
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
/**
|
* 查询罐车异常停车报警记录
|
*
|
* @param id 罐车异常停车报警记录主键
|
* @return 罐车异常停车报警记录
|
*/
|
@Override
|
public ArdTankAbnormalParkAlarm selectArdTankAbnormalParkAlarmById(String id) {
|
return ardTankAbnormalParkAlarmMapper.selectArdTankAbnormalParkAlarmById(id);
|
}
|
|
/**
|
* 查询罐车异常停车报警记录列表
|
*
|
* @param ardTankAbnormalParkAlarm 罐车异常停车报警记录
|
* @return 罐车异常停车报警记录
|
*/
|
@Override
|
public List<ArdTankAbnormalParkAlarm> selectArdTankAbnormalParkAlarmList(ArdTankAbnormalParkAlarm ardTankAbnormalParkAlarm) {
|
return ardTankAbnormalParkAlarmMapper.selectArdTankAbnormalParkAlarmList(ardTankAbnormalParkAlarm);
|
}
|
|
|
/*@Override
|
public int insertArdTankAbnormalParkAlarm(ArdTankAbnormalParkAlarm ardTankAbnormalParkAlarm) {
|
ardTankAbnormalParkAlarm.setId(IdUtils.simpleUUID());
|
return ardTankAbnormalParkAlarmMapper.insertArdTankAbnormalParkAlarm(ardTankAbnormalParkAlarm);
|
}*/
|
/*@Override
|
public int insertArdTankAbnormalParkAlarm(Map<String,Object> gpsMap) {
|
if(((Number)gpsMap.get("speed")).intValue() != 0){//速度不为0,不是异常停车
|
int result = ardTankAbnormalParkAlarmMapper.deleteArdTankAbnormalParkAlarmByCarId((String)gpsMap.get("carId"));
|
return result;
|
}else {
|
ArdSyCar ardSyCarResult = ardSyCarMapper.getArdSyTankCarByCarId((String)gpsMap.get("carId"));
|
if(ardSyCarResult == null){//没有分配权限或没有挂接电磁锁,不是罐车
|
return 0;
|
}else{
|
Boolean alarmFlag = true;//报警标记,true为记录,false为忽略
|
|
List<ArdTankWall> ardTankWallResult = ardTankWallMapper.getDistinctArdTankWallByCarId((String)gpsMap.get("carId"));//去重查询车辆挂接的电磁锁挂接的电子围栏
|
Point2D.Double point = new Point2D.Double(Double.parseDouble(String.valueOf((Number)gpsMap.get("lng"))), Double.parseDouble(String.valueOf((Number)gpsMap.get("lat"))));//车辆当前位置
|
List<Point2D.Double> pts = new ArrayList<Point2D.Double>();
|
|
for(ArdTankWall ardTankWall : ardTankWallResult){
|
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)){//在任意电子围栏内,不报警
|
int result = ardTankAbnormalParkAlarmMapper.deleteArdTankAbnormalParkAlarmByCarId((String)gpsMap.get("carId"));
|
alarmFlag = false;
|
return result;
|
}
|
}
|
if(alarmFlag){
|
ArdTankAbnormalParkAlarm ardTankAbnormalParkAlarmResult = ardTankAbnormalParkAlarmMapper.selectArdTankAbnormalParkAlarmByCarIdAndEndTimeIsNull((String)gpsMap.get("carId"));
|
if(ardTankAbnormalParkAlarmResult == null){//有记录结束时间,做新增操作
|
ArdTankAbnormalParkAlarm ardTankAbnormalParkAlarm = new ArdTankAbnormalParkAlarm();
|
ardTankAbnormalParkAlarm.setId(IdUtils.simpleUUID());
|
ardTankAbnormalParkAlarm.setCarId((String)gpsMap.get("carId"));
|
ardTankAbnormalParkAlarm.setCarName((String)gpsMap.get("carName"));
|
ardTankAbnormalParkAlarm.setLongitude(String.valueOf((Number)gpsMap.get("lng")));
|
ardTankAbnormalParkAlarm.setLatitude(String.valueOf((Number)gpsMap.get("lat")));
|
ardTankAbnormalParkAlarm.setBeginTime(sdf.format(new Date()));
|
return ardTankAbnormalParkAlarmMapper.insertArdTankAbnormalParkAlarm(ardTankAbnormalParkAlarm);
|
}else{//有记录结束时间,做修改操作
|
Integer abnormalParkingInterval = 5;//默认时间为5min
|
SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("abnormalParkingInterval");//查询时间间隔
|
if(sysConfig != null){
|
abnormalParkingInterval = Integer.parseInt(sysConfig.getConfigValue());
|
}
|
Date beginDate = null;
|
try {
|
beginDate = this.sdf.parse(ardTankAbnormalParkAlarmResult.getBeginTime());
|
} catch (ParseException e) {
|
e.printStackTrace();
|
return 0;
|
}
|
Date endDate = new Date();
|
if(endDate.getTime() - beginDate.getTime() >= abnormalParkingInterval * 60 * 1000){//当前时间超过开启时间设定阈值
|
ardTankAbnormalParkAlarmResult.setEndTime(sdf.format(endDate));
|
//根据权限做报警websocket推送
|
List<SysDept> sysDeptList = sysDeptMapper.getParentsDeptListByDeptId(Long.parseLong(ardSyCarResult.getDeptId()));
|
List<Long> deptIdList = new ArrayList();
|
for(SysDept sysDept : sysDeptList){
|
deptIdList.add(sysDept.getDeptId());
|
}
|
List<SysUser> sysUserList = sysUserMapper.selectUserByDeptIdList(deptIdList);
|
for(SysUser sysUser : sysUserList){
|
Map<String,Object> map = new HashMap();
|
map.put("carId",ardTankAbnormalParkAlarmResult.getCarId());
|
map.put("carName",ardTankAbnormalParkAlarmResult.getCarName());
|
map.put("alarmTime",ardTankAbnormalParkAlarmResult.getEndTime());
|
map.put("longitude",ardTankAbnormalParkAlarmResult.getLongitude());
|
map.put("latitude",ardTankAbnormalParkAlarmResult.getLatitude());
|
map.put("alarmInfo","异常停车");
|
Map<String,Map<String,Object>> data = new HashMap();
|
data.put("40001",map);
|
for (String key : ONLINE_USER_SESSIONS.keySet()) {
|
if(key.startsWith(sysUser.getUserId() + "_")){
|
WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(key), JSON.toJSONString(data));
|
}
|
}
|
}
|
return ardTankAbnormalParkAlarmMapper.updateArdTankAbnormalParkAlarm(ardTankAbnormalParkAlarmResult);
|
}else{
|
return 0;
|
}
|
}
|
}else{
|
return 0;
|
}
|
}
|
}
|
}*/
|
|
@Override
|
public int insertArdTankAbnormalParkAlarm(Map<String,Object> gpsMap) {
|
ArdSyCar ardSyCarResult = ardSyCarMapper.getArdSyTankCarByCarId((String)gpsMap.get("carId"));
|
if(ardSyCarResult == null){//没有分配权限或没有挂接电磁锁,不是罐车
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return 0;
|
}
|
|
List<ArdTankWall> ardTankWallResult = ardTankWallMapper.getDistinctArdTankWallByCarId((String)gpsMap.get("carId"));//去重查询车辆挂接的电磁锁挂接的电子围栏
|
if(ardTankWallResult.isEmpty()){//没有挂接电子围栏,不涉及报警
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return 0;
|
}
|
|
if(((Number)gpsMap.get("speed")).intValue() != 0){//速度不为0,不是异常停车
|
/*int result = ardTankAbnormalParkAlarmMapper.deleteArdTankAbnormalParkAlarmByCarIdAndLoadEndTimeIsNull((String)gpsMap.get("carId"));
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return result;*/
|
//查看是否进入过装油点
|
List<ArdTankLoadLog> ardTankLoadLogResult = ardTankLoadLogMapper.selectArdTankLoadLogByCarIdAndEndTimeIsNull((String)gpsMap.get("carId"));
|
if(!ardTankLoadLogResult.isEmpty()){
|
Integer loadOilInterval = 5;//默认时间为5min
|
SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("loadOilInterval");//查询时间间隔
|
if(sysConfig != null){
|
loadOilInterval = Integer.parseInt(sysConfig.getConfigValue());
|
}
|
Date endLoadDate = new Date();
|
for(ArdTankLoadLog ardTankLoadLog : ardTankLoadLogResult){
|
Date beginLoadDate = null;
|
try {
|
beginLoadDate = this.sdf.parse(ardTankLoadLog.getBeginTime());
|
} catch (ParseException e) {
|
e.printStackTrace();
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return 0;
|
}
|
if(endLoadDate.getTime() - beginLoadDate.getTime() >= loadOilInterval * 60 * 1000) {//当前时间超过装油时间设定阈值
|
ardTankLoadLog.setEndTime(this.sdf.format(endLoadDate));
|
ardTankLoadLogMapper.updateArdTankLoadLog(ardTankLoadLog);
|
}else{
|
ardTankLoadLogMapper.deleteArdTankLoadLogById(ardTankLoadLog.getId());
|
}
|
|
}
|
}
|
int result = ardTankAbnormalParkAlarmMapper.deleteArdTankAbnormalParkAlarmByCarIdAndEndTimeIsNull((String)gpsMap.get("carId"));
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return result;
|
}else {//速度为0,考虑异常停车
|
//获取装油点
|
List<ArdTankWall> loadOilArdTankWallResult = ardTankWallResult.stream().filter(ardTankWall -> ardTankWall.getWallType().equals("装油点")).collect(Collectors.toList());
|
//获取卸油点及车库
|
List<ArdTankWall> unloadOilOrGarageArdTankWallResult = ardTankWallResult.stream().filter(ardTankWall -> !ardTankWall.getWallType().equals("装油点")).collect(Collectors.toList());
|
//车辆当前位置
|
Point2D.Double point = new Point2D.Double(Double.parseDouble(String.valueOf((Number)gpsMap.get("lng"))), Double.parseDouble(String.valueOf((Number)gpsMap.get("lat"))));
|
List<Point2D.Double> pts = new ArrayList<Point2D.Double>();
|
|
for(ArdTankWall ardTankWall : loadOilArdTankWallResult){//在任意装油点电子围栏内,计入装油记录
|
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)){
|
ArdTankLoadLog ardTankLoadLogResult = ardTankLoadLogMapper.selectArdTankLoadLogByCarIdAndWallIdAndEndTimeIsNull((String)gpsMap.get("carId"),ardTankWall.getId());
|
if(ardTankLoadLogResult == null){
|
ArdTankLoadLog ardTankLoadLog = new ArdTankLoadLog();
|
ardTankLoadLog.setId(IdUtils.simpleUUID());
|
ardTankLoadLog.setCarId((String)gpsMap.get("carId"));
|
ardTankLoadLog.setWallId(ardTankWall.getId());
|
ardTankLoadLog.setBeginTime(sdf.format(new Date()));
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return ardTankLoadLogMapper.insertArdTankLoadLog(ardTankLoadLog);
|
}
|
}
|
}
|
|
|
//临时电子围栏
|
List<ArdTankWallTemporary> ardTankWallTemporaryList = ardTankWallTemporaryMapper.getArdTankWallTemporaryByCarId((String) gpsMap.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[]{((Number) gpsMap.get("lng")).doubleValue(),((Number) gpsMap.get("lat")).doubleValue()};
|
Number realDistance = GisUtil.getDistance(From,To);
|
if(realDistance.intValue() <= distance) {//实际距离小于半径
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return ardTankLoadLogMapper.deleteArdTankLoadLogByCarId((String)gpsMap.get("carId"));//进入临时电子围栏就删除装油记录
|
}
|
}
|
}
|
|
|
for(ArdTankWall ardTankWall : unloadOilOrGarageArdTankWallResult){//在任意卸油点或车库电子围栏内
|
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)){
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return ardTankLoadLogMapper.deleteArdTankLoadLogByCarId((String)gpsMap.get("carId"));//进入卸油点或车库就删除装油记录
|
}
|
}
|
//报警逻辑
|
List<ArdTankLoadLog> ardTankLoadLogResult = ardTankLoadLogMapper.selectArdTankLoadLogByCarIdAndEndTimeIsNotNull((String)gpsMap.get("carId"));
|
if(!ardTankLoadLogResult.isEmpty()){//不为空,则在任意装油点长期停留过
|
List<ArdTankAbnormalParkAlarm> ardTankAbnormalParkAlarmResultList = ardTankAbnormalParkAlarmMapper.selectArdTankAbnormalParkAlarmByCarIdNoEndTime((String)gpsMap.get("carId"));
|
if(!ardTankAbnormalParkAlarmResultList.isEmpty()){//不为空,已有记录
|
for(ArdTankAbnormalParkAlarm ardTankAbnormalParkAlarm : ardTankAbnormalParkAlarmResultList){
|
Integer abnormalParkingInterval = 5;//默认时间为5min
|
SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("abnormalParkingInterval");//查询时间间隔
|
if(sysConfig != null){
|
abnormalParkingInterval = Integer.parseInt(sysConfig.getConfigValue());
|
}
|
Date beginDate = null;
|
try {
|
beginDate = this.sdf.parse(ardTankAbnormalParkAlarm.getBeginTime());
|
} catch (ParseException e) {
|
e.printStackTrace();
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return 0;
|
}
|
Date endDate = new Date();
|
if(endDate.getTime() - beginDate.getTime() >= abnormalParkingInterval * 60 * 1000){//当前时间超过开启时间设定阈值
|
ardTankAbnormalParkAlarm.setEndTime(sdf.format(endDate));
|
//根据权限做报警websocket推送
|
List<SysDept> sysDeptList = sysDeptMapper.getParentsDeptListByDeptId(Long.parseLong(ardSyCarResult.getDeptId()));
|
List<Long> deptIdList = new ArrayList();
|
for(SysDept sysDept : sysDeptList){
|
deptIdList.add(sysDept.getDeptId());
|
}
|
List<SysUser> sysUserList = sysUserMapper.selectUserByDeptIdList(deptIdList);
|
for(SysUser sysUser : sysUserList){
|
Map<String,Object> map = new HashMap();
|
map.put("carId",ardTankAbnormalParkAlarm.getCarId());
|
map.put("carName",ardTankAbnormalParkAlarm.getCarName());
|
map.put("alarmTime",ardTankAbnormalParkAlarm.getEndTime());
|
map.put("longitude",ardTankAbnormalParkAlarm.getLongitude());
|
map.put("latitude",ardTankAbnormalParkAlarm.getLatitude());
|
map.put("alarmInfo","异常停车");
|
Map<String,Map<String,Object>> data = new HashMap();
|
data.put("40001",map);
|
for (String key : ONLINE_USER_SESSIONS.keySet()) {
|
if(key.startsWith(sysUser.getUserId() + "_")){
|
WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(key), JSON.toJSONString(data));
|
}
|
}
|
}
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return ardTankAbnormalParkAlarmMapper.updateArdTankAbnormalParkAlarm(ardTankAbnormalParkAlarm);
|
}else{
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return 0;
|
}
|
}
|
}else{
|
ArdTankAbnormalParkAlarm ardTankAbnormalParkAlarm = new ArdTankAbnormalParkAlarm();
|
ardTankAbnormalParkAlarm.setId(IdUtils.simpleUUID());
|
ardTankAbnormalParkAlarm.setCarId((String)gpsMap.get("carId"));
|
ardTankAbnormalParkAlarm.setCarName((String)gpsMap.get("carName"));
|
ardTankAbnormalParkAlarm.setLongitude(String.valueOf((Number)gpsMap.get("lng")));
|
ardTankAbnormalParkAlarm.setLatitude(String.valueOf((Number)gpsMap.get("lat")));
|
ardTankAbnormalParkAlarm.setBeginTime(sdf.format(new Date()));
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return ardTankAbnormalParkAlarmMapper.insertArdTankAbnormalParkAlarm(ardTankAbnormalParkAlarm);
|
}
|
}
|
PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId"));
|
return 0;
|
}
|
}
|
|
/**
|
* 修改罐车异常停车报警记录
|
*
|
* @param ardTankAbnormalParkAlarm 罐车异常停车报警记录
|
* @return 结果
|
*/
|
@Override
|
public int updateArdTankAbnormalParkAlarm(ArdTankAbnormalParkAlarm ardTankAbnormalParkAlarm) {
|
return ardTankAbnormalParkAlarmMapper.updateArdTankAbnormalParkAlarm(ardTankAbnormalParkAlarm);
|
}
|
|
/**
|
* 批量删除罐车异常停车报警记录
|
*
|
* @param ids 需要删除的罐车异常停车报警记录主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteArdTankAbnormalParkAlarmByIds(String[] ids) {
|
return ardTankAbnormalParkAlarmMapper.deleteArdTankAbnormalParkAlarmByIds(ids);
|
}
|
|
/**
|
* 删除罐车异常停车报警记录信息
|
*
|
* @param id 罐车异常停车报警记录主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteArdTankAbnormalParkAlarmById(String id) {
|
return ardTankAbnormalParkAlarmMapper.deleteArdTankAbnormalParkAlarmById(id);
|
}
|
|
@Override
|
public int deleteArdTankAbnormalParkAlarmByEndTime() {
|
int result = ardTankAbnormalParkAlarmMapper.deleteArdTankAbnormalParkAlarmByEndTime();
|
try{
|
return result;
|
}finally {
|
ardTankLoadLogMapper.deleteArdTankLoadLogByEndTime();
|
}
|
|
}
|
}
|