package com.ruoyi.sy.service.impl;
|
|
import java.awt.geom.Point2D;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
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.ArdSyCar;
|
import com.ruoyi.sy.domain.ArdTankWall;
|
import com.ruoyi.sy.mapper.ArdSyCarMapper;
|
import com.ruoyi.sy.mapper.ArdTankWallMapper;
|
import com.ruoyi.system.mapper.SysConfigMapper;
|
import com.ruoyi.system.mapper.SysDeptMapper;
|
import com.ruoyi.system.mapper.SysUserMapper;
|
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.mapper.ArdTankAbnormalParkAlarmMapper;
|
import com.ruoyi.sy.domain.ArdTankAbnormalParkAlarm;
|
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;
|
|
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;
|
}
|
}
|
}
|
}
|
|
/**
|
* 修改罐车异常停车报警记录
|
*
|
* @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();
|
return result;
|
}
|
}
|