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 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; } } } } /** * 修改罐车异常停车报警记录 * * @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; } }