| | |
| | | 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.ArdTankWall; |
| | | import com.ruoyi.sy.mapper.ArdSyCarMapper; |
| | | import com.ruoyi.sy.mapper.ArdTankWallMapper; |
| | | 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 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; |
| | |
| | | @Resource |
| | | private SysUserMapper sysUserMapper; |
| | | |
| | | @Resource |
| | | private ArdTankWallTemporaryMapper ardTankWallTemporaryMapper; |
| | | |
| | | @Resource |
| | | private ArdTankLoadLogMapper ardTankLoadLogMapper; |
| | | |
| | | private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | |
| | | /** |
| | |
| | | ardTankAbnormalParkAlarm.setId(IdUtils.simpleUUID()); |
| | | return ardTankAbnormalParkAlarmMapper.insertArdTankAbnormalParkAlarm(ardTankAbnormalParkAlarm); |
| | | }*/ |
| | | @Override |
| | | /*@Override |
| | | public int insertArdTankAbnormalParkAlarm(Map<String,Object> gpsMap) { |
| | | if(((Number)gpsMap.get("speed")).intValue() != 0){//速度不为0,不是异常停车 |
| | | int result = ardTankAbnormalParkAlarmMapper.deleteArdTankAbnormalParkAlarmByCarId((String)gpsMap.get("carId")); |
| | |
| | | } |
| | | } |
| | | } |
| | | }*/ |
| | | |
| | | @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; |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | public int deleteArdTankAbnormalParkAlarmByEndTime() { |
| | | int result = ardTankAbnormalParkAlarmMapper.deleteArdTankAbnormalParkAlarmByEndTime(); |
| | | return result; |
| | | try{ |
| | | return result; |
| | | }finally { |
| | | ardTankLoadLogMapper.deleteArdTankLoadLogByEndTime(); |
| | | } |
| | | |
| | | } |
| | | } |