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.ArdSyCar; import com.ruoyi.sy.domain.ArdTankLoadLog; import com.ruoyi.sy.domain.ArdTankWall; import com.ruoyi.sy.gps31.PositionContainer; import com.ruoyi.sy.mapper.ArdSyCarMapper; import com.ruoyi.sy.mapper.ArdTankLoadLogMapper; 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; @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 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 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 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 pts = new ArrayList(); 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 sysDeptList = sysDeptMapper.getParentsDeptListByDeptId(Long.parseLong(ardSyCarResult.getDeptId())); List deptIdList = new ArrayList(); for(SysDept sysDept : sysDeptList){ deptIdList.add(sysDept.getDeptId()); } List sysUserList = sysUserMapper.selectUserByDeptIdList(deptIdList); for(SysUser sysUser : sysUserList){ Map 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> 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 gpsMap) { ArdSyCar ardSyCarResult = ardSyCarMapper.getArdSyTankCarByCarId((String)gpsMap.get("carId")); if(ardSyCarResult == null){//没有分配权限或没有挂接电磁锁,不是罐车 PositionContainer.getTankCarParkingAlarmTHread().remove((String)gpsMap.get("carId")); return 0; } List 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 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 loadOilArdTankWallResult = ardTankWallResult.stream().filter(ardTankWall -> ardTankWall.getWallType().equals("装油点")).collect(Collectors.toList()); //获取卸油点及车库 List 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 pts = new ArrayList(); 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); } } } 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 ardTankLoadLogResult = ardTankLoadLogMapper.selectArdTankLoadLogByCarIdAndEndTimeIsNotNull((String)gpsMap.get("carId")); if(!ardTankLoadLogResult.isEmpty()){//不为空,则在任意装油点长期停留过 List 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 sysDeptList = sysDeptMapper.getParentsDeptListByDeptId(Long.parseLong(ardSyCarResult.getDeptId())); List deptIdList = new ArrayList(); for(SysDept sysDept : sysDeptList){ deptIdList.add(sysDept.getDeptId()); } List sysUserList = sysUserMapper.selectUserByDeptIdList(deptIdList); for(SysUser sysUser : sysUserList){ Map 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> 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(); } } }