zhangnaisong
2024-08-09 7e2382e701604e97f775dca55dc00cee7c5da053
ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdTankAbnormalParkAlarmServiceImpl.java
@@ -4,19 +4,20 @@
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;
@@ -24,8 +25,6 @@
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;
@@ -58,6 +57,12 @@
    @Resource
    private SysUserMapper sysUserMapper;
    @Resource
    private ArdTankWallTemporaryMapper ardTankWallTemporaryMapper;
    @Resource
    private ArdTankLoadLogMapper ardTankLoadLogMapper;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    /**
@@ -88,7 +93,7 @@
                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"));
@@ -176,6 +181,183 @@
                }
            }
        }
    }*/
    @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;
        }
    }
    /**
@@ -214,6 +396,11 @@
    @Override
    public int deleteArdTankAbnormalParkAlarmByEndTime() {
        int result = ardTankAbnormalParkAlarmMapper.deleteArdTankAbnormalParkAlarmByEndTime();
        return result;
        try{
            return result;
        }finally {
            ardTankLoadLogMapper.deleteArdTankLoadLogByEndTime();
        }
    }
}