大屏数据

This commit is contained in:
2025-09-27 15:30:12 +08:00
parent b7c81419a4
commit 2d59397de5
32 changed files with 1032 additions and 39 deletions

View File

@ -114,5 +114,9 @@ public class DeviceAlarmBo extends TenantEntity {
*/
private Integer treatmentState;
/**
* 告警状态0 解除告警, 1 告警中
*/
private Integer alarmState;
}

View File

@ -0,0 +1,57 @@
package com.fuyuanshen.equipment.domain.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 报警统计信息
*
* @author: fuyuanshen
* @date: 2025-09-27
*/
@Data
public class AlarmStatisticsVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 正在报警数量(未处理的报警)
*/
private Integer activeAlarms = 0;
/**
* 报警总数
*/
private Integer totalAlarms = 0;
/**
* 已处理报警数量
*/
private Integer processedAlarms = 0;
/**
* 强制报警数量
* device_action = 0
*/
private Integer forcedAlarms = 0;
/**
* 撞击闯入报警数量
* device_action = 1
*/
private Integer intrusionImpactAlarms = 0;
/**
* 手动报警数量
* device_action = 2
*/
private Integer manualAlarms = 0;
/**
* 电子围栏告警数量
* device_action = 3
*/
private Integer geoFenceAlarms = 0;
}

View File

@ -123,6 +123,7 @@ public class DeviceAlarmVo implements Serializable {
private String durationTime;
/**
* 处理状态
* 0已处理1未处理
*/
@ExcelProperty(value = "0已处理1未处理")
@ -135,5 +136,4 @@ public class DeviceAlarmVo implements Serializable {
@Schema(name = "设备图片")
private String devicePic;
}

View File

@ -0,0 +1,39 @@
package com.fuyuanshen.equipment.domain.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 设备通讯方式统计Vo
*
* @author: 默苍璃
* @date: 2025-09-27
*/
@Data
public class DeviceCommunicationModeStatisticsVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 通讯方式名称
* 0:4G;1:蓝牙;2:4G&蓝牙
*/
private String communicationModeName;
/**
* 通讯方式值
* 0:4G;1:蓝牙;2:4G&蓝牙
*/
private Integer communicationModeValue;
/**
* 设备总数
*/
private Integer totalDevices = 0;
/**
* 异常设备数
*/
private Integer abnormalDevices = 0;
}

View File

@ -0,0 +1,36 @@
package com.fuyuanshen.equipment.domain.vo;
import com.fuyuanshen.equipment.domain.DeviceGeoFence;
import com.fuyuanshen.equipment.domain.dto.FenceCheckResponse;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 设备位置信息VO
*
* @author: 默苍璃
* @date: 2025-09-2714:33
*/
@Data
@Schema(description = "设备位置信息VO")
public class DeviceLocationVo {
@Schema(description = "设备ID")
private Long deviceId;
@Schema(description = "设备名称")
private String deviceName;
@Schema(description = "经度")
private String longitude;
@Schema(description = "纬度")
private String latitude;
@Schema(description = "设备是否在电子围栏内")
private Boolean inFence;
@Schema(description = "进入的电子围栏信息")
private DeviceGeoFence fenceInfo;
}

View File

@ -0,0 +1,32 @@
package com.fuyuanshen.equipment.domain.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 设备总览信息
*
* @author: fuyuanshen
* @date: 2025-09-27
*/
@Data
public class DeviceOverviewVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 设备总数
*/
private Integer totalDevices = 0;
/**
* 在线设备数量
*/
private Integer onlineDevices = 0;
/**
* 设备型号数量
*/
private Integer deviceTypes = 0;
}

View File

@ -0,0 +1,27 @@
package com.fuyuanshen.equipment.domain.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 设备使用频次统计Vo
*
* @author: 默苍璃
* @date: 2025-09-27
*/
@Data
public class DeviceUsageFrequencyVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 设备名称
*/
private String deviceName;
/**
* 使用频次
*/
private Integer frequency = 0;
}

View File

@ -0,0 +1,26 @@
package com.fuyuanshen.equipment.domain.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* 每月告警统计信息
*
* @author: fuyuanshen
* @date: 2025-09-27
*/
@Data
public class MonthlyAlarmStatisticsVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 每月告警统计数据
* key: 月份 (m1-m12)
* value: 告警数量
*/
private Map<String, Integer> monthlyStatistics = new HashMap<>();
}

View File

@ -0,0 +1,98 @@
package com.fuyuanshen.equipment.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
/**天气信息视图对象
* @author: 默苍璃
* @date: 2025-09-2715:25
*/
@Data
@Schema(description = "天气信息视图对象")
public class WeatherInfoVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 经度
*/
@Schema(description = "经度")
private Double longitude;
/**
* 纬度
*/
@Schema(description = "纬度")
private Double latitude;
/**
* 天气状况
*/
@Schema(description = "天气状况")
private String weatherCondition;
/**
* 天气描述
*/
@Schema(description = "天气描述")
private String description;
/**
* 温度
*/
@Schema(description = "温度(摄氏度)")
private Double temperature;
/**
* 体感温度
*/
@Schema(description = "体感温度(摄氏度)")
private Double feelsLike;
/**
* 湿度
*/
@Schema(description = "湿度(%)")
private Integer humidity;
/**
* 气压
*/
@Schema(description = "气压(hPa)")
private Double pressure;
/**
* 能见度
*/
@Schema(description = "能见度(米)")
private Integer visibility;
/**
* 风速
*/
@Schema(description = "风速(m/s)")
private Double windSpeed;
/**
* 风向
*/
@Schema(description = "风向(度)")
private Integer windDirection;
/**
* 云量
*/
@Schema(description = "云量(%)")
private Integer cloudiness;
/**
* 更新时间
*/
@Schema(description = "数据更新时间")
private LocalDateTime updateTime;
}

View File

@ -4,10 +4,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.fuyuanshen.equipment.domain.DeviceAlarm;
import com.fuyuanshen.equipment.domain.bo.DeviceAlarmBo;
import com.fuyuanshen.equipment.domain.vo.AlarmStatisticsVo;
import com.fuyuanshen.equipment.domain.vo.DeviceAlarmVo;
import com.fuyuanshen.equipment.domain.vo.MonthlyAlarmStatisticsVo;
import com.fuyuanshen.common.mybatis.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* 设备告警Mapper接口
*
@ -23,7 +29,7 @@ public interface DeviceAlarmMapper extends BaseMapperPlus<DeviceAlarm, DeviceAla
* @param bo 设备告警
* @return 设备告警
*/
Page<DeviceAlarmVo> selectVoPage( Page pageQuery,@Param("bo") DeviceAlarmBo bo);
Page<DeviceAlarmVo> selectVoPage(Page pageQuery, @Param("bo") DeviceAlarmBo bo);
/**
* 根据设备IMEI查询最新的一条告警数据
@ -34,4 +40,25 @@ public interface DeviceAlarmMapper extends BaseMapperPlus<DeviceAlarm, DeviceAla
DeviceAlarmVo selectLatestByDeviceImei(@Param("deviceImei") String deviceImei);
}
/**
* 获取实时告警列表
*
* @return 设备告警列表
*/
List<DeviceAlarmVo> getRealtimeAlarm();
/**
* 获取报警统计数据
*
* @return 报警统计数据
*/
AlarmStatisticsVo getAlarmStatistics();
/**
* 获取最近一年每月告警统计数据
*
* @return 每月告警统计数据
*/
@MapKey("key")
List<Map<String, Object>> getMonthlyAlarmStatistics();
}

View File

@ -40,4 +40,13 @@ public interface DeviceFenceAccessRecordMapper extends BaseMapperPlus<DeviceFenc
Page<DeviceFenceAccessRecordVo> selectVoPageByXml(Page<DeviceFenceAccessRecord> page, @Param("bo") DeviceFenceAccessRecordBo bo);
/**
* 查询设备最新的围栏记录
*
* @param deviceId 设备ID
* @return 围栏记录
*/
DeviceFenceAccessRecordVo selectLatestRecordByDeviceId(String deviceId);
}

View File

@ -105,6 +105,9 @@ public interface DeviceMapper extends BaseMapper<Device> {
*/
List<Map<String, Object>> getEquipmentUsageData(@Param("deviceTypeId") Long deviceTypeId, @Param("range") Integer range);
// 在DeviceMapper.java中添加方法
DeviceOverviewVo getDeviceOverview();
// 在DeviceMapper.java中添加方法
int getUsageDataForMonth(@Param("deviceId") Long deviceId,
@Param("year") int year,
@ -117,4 +120,19 @@ public interface DeviceMapper extends BaseMapper<Device> {
* @return 设备信息
*/
Device selectDeviceByImei(@Param("deviceImei") String deviceImei);
/**
* 获取设备通讯方式统计数据
*
* @return 通讯方式统计列表
*/
List<DeviceCommunicationModeStatisticsVo> getDeviceCommunicationModeStatistics();
/**
* 获取设备使用频次统计
*
* @param days 天数
* @return 设备使用频次统计列表
*/
List<DeviceUsageFrequencyVo> getDeviceUsageFrequency(@Param("days") int days);
}

View File

@ -1,11 +1,13 @@
package com.fuyuanshen.equipment.service;
import cn.hutool.core.lang.Dict;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fuyuanshen.common.core.domain.PageResult;
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
import com.fuyuanshen.equipment.domain.Device;
import com.fuyuanshen.equipment.domain.DeviceType;
import com.fuyuanshen.equipment.domain.dto.AppDeviceBo;
import com.fuyuanshen.equipment.domain.form.DeviceForm;
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
@ -152,4 +154,49 @@ public interface DeviceService extends IService<Device> {
* @return 设备信息
*/
Device selectDeviceByImei(String deviceImei);
/**
* 获取设备总览数据
*
* @return 设备总览数据
*/
DeviceOverviewVo getDeviceOverview();
/**
* 获取设备通讯方式统计数据
*
* @return 通讯方式统计数据列表
*/
List<DeviceCommunicationModeStatisticsVo> getDeviceCommunicationModeStatistics();
/**
* 获取设备使用频次统计
*
* @param days 天数(近一个月: 30, 近半年: 180
* @return 设备使用频次统计列表
*/
List<DeviceUsageFrequencyVo> getDeviceUsageFrequency(int days);
/**
* 根据设备IMEI更新设备的经纬度信息
*
* @param deviceImei 设备IMEI
* @param longitude 经度
* @param latitude 纬度
* @return 是否更新成功
*/
boolean updateDeviceLocationByImei(String deviceImei, String longitude, String latitude);
/**
* 根据条件查询设备位置信息
*
* @param groupId 设备分组ID
* @param deviceType 设备类型
* @param deviceImei 设备IMEI
* @return 设备位置信息列表
*/
List<DeviceLocationVo> getDeviceLocationInfo(Long groupId, Long deviceType, String deviceImei);
}

View File

@ -1,12 +1,15 @@
package com.fuyuanshen.equipment.service;
import com.fuyuanshen.equipment.domain.vo.DeviceAlarmVo;
import com.fuyuanshen.equipment.domain.bo.DeviceAlarmBo;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.fuyuanshen.equipment.domain.bo.DeviceAlarmBo;
import com.fuyuanshen.equipment.domain.vo.AlarmStatisticsVo;
import com.fuyuanshen.equipment.domain.vo.DeviceAlarmVo;
import com.fuyuanshen.equipment.domain.vo.MonthlyAlarmStatisticsVo;
import java.util.Collection;
import java.util.List;
import java.util.Collection;
import java.util.Map;
/**
* 设备告警Service接口
@ -75,4 +78,24 @@ public interface IDeviceAlarmService {
DeviceAlarmVo queryLatestByDeviceImei(String deviceImei);
}
/**
* 获取实时告警列表
*
* @return 设备告警列表
*/
List<DeviceAlarmVo> getRealtimeAlarm();
/**
* 获取报警统计数据
*
* @return 报警统计数据
*/
AlarmStatisticsVo getAlarmStatistics();
/**
* 获取最近一年每月告警统计数据
*
* @return 每月告警统计数据
*/
MonthlyAlarmStatisticsVo getMonthlyAlarmStatistics();
}

View File

@ -1,7 +1,10 @@
package com.fuyuanshen.equipment.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.fuyuanshen.equipment.domain.Device;
import com.fuyuanshen.equipment.domain.DeviceGeoFence;
import com.fuyuanshen.equipment.domain.bo.DeviceGeoFenceBo;
import com.fuyuanshen.equipment.domain.dto.FenceCheckResponse;
import com.fuyuanshen.equipment.domain.query.FenceCheckRequest;
@ -16,7 +19,7 @@ import java.util.List;
* @author Lion Li
* @date 2025-09-11
*/
public interface IDeviceGeoFenceService {
public interface IDeviceGeoFenceService extends IService<DeviceGeoFence> {
/**
* 查询电子围栏

View File

@ -0,0 +1,20 @@
package com.fuyuanshen.equipment.service;
import com.fuyuanshen.equipment.domain.vo.WeatherInfoVo;
/**天气信息服务接口
* @author: 默苍璃
* @date: 2025-09-2715:26
*/
public interface IWeatherService {
/**
* 根据经纬度获取天气信息
*
* @param latitude 纬度
* @param longitude 经度
* @return 天气信息
*/
WeatherInfoVo getWeatherByCoordinates(Double latitude, Double longitude);
}

View File

@ -12,7 +12,9 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import com.fuyuanshen.equipment.domain.bo.DeviceAlarmBo;
import com.fuyuanshen.equipment.domain.vo.AlarmStatisticsVo;
import com.fuyuanshen.equipment.domain.vo.DeviceAlarmVo;
import com.fuyuanshen.equipment.domain.vo.MonthlyAlarmStatisticsVo;
import com.fuyuanshen.equipment.domain.DeviceAlarm;
import com.fuyuanshen.equipment.mapper.DeviceAlarmMapper;
import com.fuyuanshen.equipment.service.IDeviceAlarmService;
@ -20,6 +22,7 @@ import com.fuyuanshen.equipment.service.IDeviceAlarmService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.HashMap;
/**
* 设备告警Service业务层处理
@ -161,4 +164,51 @@ public class DeviceAlarmServiceImpl implements IDeviceAlarmService {
return baseMapper.selectLatestByDeviceImei(deviceImei);
}
}
/**
* 获取实时告警列表
*
* @return 设备告警列表
*/
@Override
public List<DeviceAlarmVo> getRealtimeAlarm() {
return baseMapper.getRealtimeAlarm();
}
/**
* 获取报警统计数据
*
* @return 报警统计数据
*/
@Override
public AlarmStatisticsVo getAlarmStatistics() {
return baseMapper.getAlarmStatistics();
}
/**
* 获取最近一年每月告警统计数据
*
* @return 每月告警统计数据
*/
@Override
public MonthlyAlarmStatisticsVo getMonthlyAlarmStatistics() {
List<Map<String, Object>> result = baseMapper.getMonthlyAlarmStatistics();
MonthlyAlarmStatisticsVo vo = new MonthlyAlarmStatisticsVo();
if (result != null && !result.isEmpty()) {
Map<String, Object> data = result.get(0);
Map<String, Integer> monthlyStats = vo.getMonthlyStatistics();
for (Map.Entry<String, Object> entry : data.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// 将数据库查询结果转换为Integer类型
Integer count = (value != null) ? Integer.valueOf(value.toString()) : 0;
monthlyStats.put(key, count);
}
}
return vo;
}
}

View File

@ -1,5 +1,6 @@
package com.fuyuanshen.equipment.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fuyuanshen.common.core.utils.MapstructUtils;
@ -8,6 +9,7 @@ import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.fuyuanshen.equipment.domain.Device;
import com.fuyuanshen.equipment.domain.DeviceGeoFence;
import com.fuyuanshen.equipment.domain.bo.DeviceFenceAccessRecordBo;
import com.fuyuanshen.equipment.domain.bo.DeviceFenceStatusBo;
@ -17,6 +19,7 @@ import com.fuyuanshen.equipment.domain.query.FenceCheckRequest;
import com.fuyuanshen.equipment.domain.vo.DeviceFenceStatusVo;
import com.fuyuanshen.equipment.domain.vo.DeviceGeoFenceVo;
import com.fuyuanshen.equipment.mapper.DeviceGeoFenceMapper;
import com.fuyuanshen.equipment.mapper.DeviceMapper;
import com.fuyuanshen.equipment.service.IDeviceFenceAccessRecordService;
import com.fuyuanshen.equipment.service.IDeviceFenceStatusService;
import com.fuyuanshen.equipment.service.IDeviceGeoFenceService;
@ -38,7 +41,7 @@ import java.util.*;
@Slf4j
@RequiredArgsConstructor
@Service
public class DeviceGeoFenceServiceImpl implements IDeviceGeoFenceService {
public class DeviceGeoFenceServiceImpl extends ServiceImpl<DeviceGeoFenceMapper, DeviceGeoFence> implements IDeviceGeoFenceService {
private final DeviceGeoFenceMapper baseMapper;

View File

@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fuyuanshen.common.core.domain.model.LoginUser;
import com.fuyuanshen.common.core.exception.BadRequestException;
import com.fuyuanshen.common.core.utils.SpringUtils;
import com.fuyuanshen.common.core.utils.StringUtils;
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
@ -19,11 +20,10 @@ import com.fuyuanshen.common.satoken.utils.LoginHelper;
import com.fuyuanshen.customer.domain.Customer;
import com.fuyuanshen.customer.mapper.CustomerMapper;
import com.fuyuanshen.equipment.constants.DeviceConstants;
import com.fuyuanshen.equipment.domain.Device;
import com.fuyuanshen.equipment.domain.DeviceAssignments;
import com.fuyuanshen.equipment.domain.DeviceType;
import com.fuyuanshen.equipment.domain.DeviceTypeGrants;
import com.fuyuanshen.equipment.domain.*;
import com.fuyuanshen.equipment.domain.bo.DeviceFenceAccessRecordBo;
import com.fuyuanshen.equipment.domain.dto.AppDeviceBo;
import com.fuyuanshen.equipment.domain.dto.FenceCheckResponse;
import com.fuyuanshen.equipment.domain.form.DeviceForm;
import com.fuyuanshen.equipment.domain.query.DeviceAssignmentQuery;
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
@ -32,13 +32,8 @@ import com.fuyuanshen.equipment.domain.vo.*;
import com.fuyuanshen.equipment.enums.BindingStatusEnum;
import com.fuyuanshen.equipment.enums.CommunicationModeEnum;
import com.fuyuanshen.equipment.enums.DeviceActiveStatusEnum;
import com.fuyuanshen.equipment.mapper.DeviceAssignmentsMapper;
import com.fuyuanshen.equipment.mapper.DeviceMapper;
import com.fuyuanshen.equipment.mapper.DeviceTypeGrantsMapper;
import com.fuyuanshen.equipment.mapper.DeviceTypeMapper;
import com.fuyuanshen.equipment.service.DeviceAssignmentsService;
import com.fuyuanshen.equipment.service.DeviceService;
import com.fuyuanshen.equipment.service.DeviceTypeGrantsService;
import com.fuyuanshen.equipment.mapper.*;
import com.fuyuanshen.equipment.service.*;
import com.fuyuanshen.system.domain.vo.SysOssVo;
import com.fuyuanshen.system.domain.vo.SysRoleVo;
import com.fuyuanshen.system.service.ISysOssService;
@ -88,6 +83,8 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
private final DeviceTypeGrantsService deviceTypeGrantsService;
private final DeviceTypeGrantsMapper deviceTypeGrantsMapper;
private final DeviceFenceAccessRecordMapper deviceFenceAccessRecordMapper;
/**
* 分页查询设备
@ -703,4 +700,120 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
return baseMapper.selectDeviceByImei(deviceImei);
}
/**
* 获取设备总览
*
* @return
*/
@Override
public DeviceOverviewVo getDeviceOverview() {
return deviceMapper.getDeviceOverview();
}
/**
* 获取设备通讯方式统计
*
* @return 设备通讯方式统计列表
*/
@Override
public List<DeviceCommunicationModeStatisticsVo> getDeviceCommunicationModeStatistics() {
return deviceMapper.getDeviceCommunicationModeStatistics();
}
@Override
public List<DeviceUsageFrequencyVo> getDeviceUsageFrequency(int days) {
return deviceMapper.getDeviceUsageFrequency(days);
}
/**
* 根据设备IMEI更新设备的经纬度信息
*
* @param deviceImei 设备IMEI
* @param longitude 经度
* @param latitude 纬度
* @return 是否更新成功
*/
@Override
public boolean updateDeviceLocationByImei(String deviceImei, String longitude, String latitude) {
// 根据设备IMEI查询设备
Device device = deviceMapper.selectDeviceByImei(deviceImei);
if (device == null) {
return false;
}
// 更新设备的经纬度信息
device.setLongitude(longitude);
device.setLatitude(latitude);
// 更新数据库中的设备信息
return deviceMapper.updateById(device) > 0;
}
/**
* 根据条件查询设备位置信息
*
* @param groupId 设备分组ID
* @param deviceType 设备类型
* @param deviceImei 设备IMEI
* @return 设备位置信息列表
*/
@Override
public List<DeviceLocationVo> getDeviceLocationInfo(Long groupId, Long deviceType, String deviceImei) {
// 构建查询条件
DeviceQueryCriteria criteria = new DeviceQueryCriteria();
criteria.setGroupId(groupId);
criteria.setDeviceType(deviceType);
criteria.setDeviceImei(deviceImei);
// 查询符合条件的设备
List<Device> devices = deviceMapper.findDevices(criteria);
// 构建返回结果
List<DeviceLocationVo> result = new ArrayList<>();
// 注入电子围栏服务
IDeviceGeoFenceService geoFenceService = SpringUtils.getBean(IDeviceGeoFenceService.class);
for (Device device : devices) {
DeviceLocationVo vo = new DeviceLocationVo();
vo.setDeviceId(device.getId());
vo.setDeviceName(device.getDeviceName());
vo.setLongitude(device.getLongitude());
vo.setLatitude(device.getLatitude());
// 检查设备是否在电子围栏内
if (StringUtils.isNotBlank(device.getLongitude()) && StringUtils.isNotBlank(device.getLatitude())) {
// 查询设备最新的围栏进出记录
DeviceFenceAccessRecordVo latestRecord = deviceFenceAccessRecordMapper.selectLatestRecordByDeviceId(String.valueOf(device.getId()));
// 判断是否在围栏内
if (latestRecord != null) {
// 如果最新的记录是进入围栏(事件类型为1),则设备在围栏内
if (latestRecord.getEventType() != null && latestRecord.getEventType() == 1L) {
vo.setInFence(true);
// 获取围栏完整信息
DeviceGeoFence fenceInfo = geoFenceService.getById(latestRecord.getFenceId());
if (fenceInfo != null) {
vo.setFenceInfo(fenceInfo);
}
} else {
vo.setInFence(false);
}
} else {
vo.setInFence(false);
}
} else {
vo.setInFence(false);
}
result.add(vo);
}
return result;
}
}

View File

@ -0,0 +1,82 @@
package com.fuyuanshen.equipment.service.impl;
import com.fuyuanshen.equipment.domain.vo.WeatherInfoVo;
import com.fuyuanshen.equipment.service.IWeatherService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**天气信息服务实现类
* @author: 默苍璃
* @date: 2025-09-2715:26
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class WeatherServiceImpl implements IWeatherService {
// 这里使用OpenWeatherMap API作为示例
private static final String WEATHER_API_URL = "http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={appid}&units=metric&lang=zh_cn";
// 需要在配置文件中配置API密钥
private final String apiKey = ""; // 从配置文件获取
@Override
public WeatherInfoVo getWeatherByCoordinates(Double latitude, Double longitude) {
try {
// 注意实际使用时需要配置API密钥并启用以下代码
/*
RestTemplate restTemplate = new RestTemplate();
String url = WEATHER_API_URL.replace("{lat}", latitude.toString())
.replace("{lon}", longitude.toString())
.replace("{appid}", apiKey);
// 调用第三方API获取天气数据
// 这里需要根据实际API返回的数据结构进行解析
// 以下为示例代码实际实现需要根据API文档调整
WeatherInfoVo weatherInfo = new WeatherInfoVo();
weatherInfo.setLatitude(latitude);
weatherInfo.setLongitude(longitude);
weatherInfo.setUpdateTime(LocalDateTime.now());
// 模拟数据实际应从API获取
weatherInfo.setWeatherCondition("晴");
weatherInfo.setDescription("晴朗");
weatherInfo.setTemperature(25.0);
weatherInfo.setFeelsLike(26.0);
weatherInfo.setHumidity(60);
weatherInfo.setPressure(1013.0);
weatherInfo.setVisibility(10000);
weatherInfo.setWindSpeed(2.5);
weatherInfo.setWindDirection(180);
weatherInfo.setCloudiness(0);
return weatherInfo;
*/
// 临时返回模拟数据
WeatherInfoVo weatherInfo = new WeatherInfoVo();
weatherInfo.setLatitude(latitude);
weatherInfo.setLongitude(longitude);
weatherInfo.setWeatherCondition("");
weatherInfo.setDescription("晴朗");
weatherInfo.setTemperature(25.0);
weatherInfo.setFeelsLike(26.0);
weatherInfo.setHumidity(60);
weatherInfo.setPressure(1013.0);
weatherInfo.setVisibility(10000);
weatherInfo.setWindSpeed(2.5);
weatherInfo.setWindDirection(180);
weatherInfo.setCloudiness(0);
weatherInfo.setUpdateTime(LocalDateTime.now());
return weatherInfo;
} catch (Exception e) {
log.error("获取天气信息失败,经纬度: {},{}", latitude, longitude, e);
return null;
}
}
}