Commit 49f175dc by gdj

增加飞行时长统计

parent a84e02dc
package com.dji.sample.manage.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dji.sample.manage.model.entity.DeviceDetailEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* @author guan
*/
@Mapper
public interface IDeviceDetailMapper extends BaseMapper<DeviceDetailEntity> {
}
package com.dji.sample.manage.model.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author guan
*/
@Data
public class DeviceDetailCacheDTO implements Serializable {
private String deviceSn;
private String type;
private String value;
private Boolean isSave;
}
package com.dji.sample.manage.model.dto;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author guan
*/
@Data
public class DeviceDetailCountDTO implements Serializable {
private BigDecimal totalFlightSorties;
private BigDecimal totalFlightDistance;
private BigDecimal totalFlightTime;
}
package com.dji.sample.manage.model.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
*
* @author guan
*/
@Data
@TableName("manage_device_detail")
public class DeviceDetailEntity implements Serializable {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField(value = "device_sn")
private String deviceSn;
@TableField(value = "type")
private String type;
@TableField(value = "init_value")
private String initValue;
@TableField(value = "cur_value")
private String curValue;
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Long createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Long updateTime;
}
\ No newline at end of file
package com.dji.sample.manage.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dji.sample.manage.model.dto.DeviceDetailCountDTO;
import com.dji.sample.manage.model.entity.DeviceDetailEntity;
import com.dji.sdk.cloudapi.device.OsdDockDrone;
import java.util.List;
/**
* @author guan
*/
public interface IDeviceDetailService extends IService<DeviceDetailEntity> {
void saveDeviceOsd(String deviceSn, OsdDockDrone osdDockDrone);
DeviceDetailCountDTO searchList(List<String>deviceSnList);
}
package com.dji.sample.manage.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dji.sample.component.redis.RedisConst;
import com.dji.sample.component.redis.RedisOpsUtils;
import com.dji.sample.manage.dao.IDeviceDetailMapper;
import com.dji.sample.manage.model.dto.DeviceDTO;
import com.dji.sample.manage.model.dto.DeviceDetailCacheDTO;
import com.dji.sample.manage.model.dto.DeviceDetailCountDTO;
import com.dji.sample.manage.model.entity.DeviceDetailEntity;
import com.dji.sample.manage.service.IDeviceDetailService;
import com.dji.sdk.cloudapi.device.DeviceDomainEnum;
import com.dji.sdk.cloudapi.device.OsdDockDrone;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import static com.dji.sample.component.redis.RedisConst.*;
/**
* @author guan
*/
@Service
public class DeviceDetailServiceImpl extends ServiceImpl<IDeviceDetailMapper, DeviceDetailEntity> implements IDeviceDetailService {
@Override
public void saveDeviceOsd(String deviceSn, OsdDockDrone osdDockDrone) {
// 保存
Double totalFlightDistance = osdDockDrone.getTotalFlightDistance();
Integer totalFlightSorties = osdDockDrone.getTotalFlightSorties();
Float totalFlightTime = osdDockDrone.getTotalFlightTime();
if (totalFlightDistance != null) {
// 飞行总里程
DeviceDetailCacheDTO totalFlightDistanceDTO = new DeviceDetailCacheDTO();
totalFlightDistanceDTO.setDeviceSn(deviceSn);
totalFlightDistanceDTO.setIsSave(false);
totalFlightDistanceDTO.setType("total_flight_distance");
totalFlightDistanceDTO.setValue(String.valueOf(totalFlightDistance));
RedisOpsUtils.set(DEVICE_TOTAL_FLIGHT_DISTANCE_PREFIX + deviceSn, totalFlightDistanceDTO);
}
if (totalFlightSorties != null) {
// 飞行总架次
DeviceDetailCacheDTO totalFlightSortiesDTO = new DeviceDetailCacheDTO();
totalFlightSortiesDTO.setDeviceSn(deviceSn);
totalFlightSortiesDTO.setIsSave(false);
totalFlightSortiesDTO.setType("total_flight_sorties");
totalFlightSortiesDTO.setValue(String.valueOf(totalFlightSorties));
RedisOpsUtils.set(DEVICE_TOTAL_FLIGHT_SORTIES_PREFIX + deviceSn, totalFlightSortiesDTO);
}
if (totalFlightTime != null) {
// 飞行总航时
DeviceDetailCacheDTO totalFlightTimeDTO = new DeviceDetailCacheDTO();
totalFlightTimeDTO.setDeviceSn(deviceSn);
totalFlightTimeDTO.setIsSave(false);
totalFlightTimeDTO.setType("total_flight_time");
totalFlightTimeDTO.setValue(String.valueOf(totalFlightTime));
RedisOpsUtils.set(DEVICE_TOTAL_FLIGHT_TIME_PREFIX + deviceSn, totalFlightTimeDTO);
}
}
@Override
public DeviceDetailCountDTO searchList(List<String> deviceSnList) {
DeviceDetailCountDTO deviceDetailCountDTO = new DeviceDetailCountDTO();
deviceDetailCountDTO.setTotalFlightSorties(BigDecimal.ZERO);
deviceDetailCountDTO.setTotalFlightDistance(BigDecimal.ZERO);
deviceDetailCountDTO.setTotalFlightTime(BigDecimal.ZERO);
// 查询数据
LambdaQueryWrapper<DeviceDetailEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.in(DeviceDetailEntity::getDeviceSn, deviceSnList);
List<DeviceDetailEntity> detailEntities = this.list(wrapper);
if (CollectionUtils.isEmpty(detailEntities)) {
return deviceDetailCountDTO;
}
Map<String, List<DeviceDetailEntity>> deviceDetailMap = detailEntities.stream().collect(Collectors.groupingBy(DeviceDetailEntity::getType));
List<DeviceDetailEntity> totalFlightDistanceList = deviceDetailMap.getOrDefault("total_flight_distance", new ArrayList<>());
List<DeviceDetailEntity> totalFlightSortiesList = deviceDetailMap.getOrDefault("total_flight_sorties", new ArrayList<>());
List<DeviceDetailEntity> totalFlightTimeList = deviceDetailMap.getOrDefault("total_flight_time", new ArrayList<>());
if (!CollectionUtils.isEmpty(totalFlightDistanceList)) {
BigDecimal num = BigDecimal.ZERO;
for (DeviceDetailEntity deviceDetailEntity : totalFlightDistanceList) {
num = num.add(new BigDecimal(deviceDetailEntity.getCurValue()));
}
deviceDetailCountDTO.setTotalFlightDistance(num);
}
if (!CollectionUtils.isEmpty(totalFlightSortiesList)) {
BigDecimal num = BigDecimal.ZERO;
for (DeviceDetailEntity deviceDetailEntity : totalFlightSortiesList) {
num = num.add(new BigDecimal(deviceDetailEntity.getCurValue()));
}
deviceDetailCountDTO.setTotalFlightSorties(num);
}
if (!CollectionUtils.isEmpty(totalFlightTimeList)) {
BigDecimal num = BigDecimal.ZERO;
for (DeviceDetailEntity deviceDetailEntity : totalFlightTimeList) {
num = num.add(new BigDecimal(deviceDetailEntity.getCurValue()));
}
deviceDetailCountDTO.setTotalFlightTime(num);
}
return deviceDetailCountDTO;
}
/**
* 定时器 10分钟保存一次数据 每 600 秒执行一次
*/
@Scheduled(fixedRate = 600000)
public void syncSaveDeviceDetailData() {
// 查询redis 获取数据
int start = RedisConst.DEVICE_DETAIL_PREFIX.length();
Set<String> allKeys = RedisOpsUtils.getAllKeys(RedisConst.DEVICE_DETAIL_PREFIX + "*");
Iterator<String> iterator = allKeys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
DeviceDetailCacheDTO value = (DeviceDetailCacheDTO) RedisOpsUtils.get(key);
if (value.getIsSave()) {
continue;
}
value.setIsSave(true);
RedisOpsUtils.set(key, value);
// 查询数据库是否存在数据
LambdaQueryWrapper<DeviceDetailEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DeviceDetailEntity::getType, value.getType());
queryWrapper.eq(DeviceDetailEntity::getDeviceSn, value.getDeviceSn());
List<DeviceDetailEntity> deviceDetailEntities = this.list(queryWrapper);
if (CollectionUtils.isEmpty(deviceDetailEntities)) {
// 新增
DeviceDetailEntity deviceDetailEntity = new DeviceDetailEntity();
deviceDetailEntity.setDeviceSn(value.getDeviceSn());
deviceDetailEntity.setType(value.getType());
deviceDetailEntity.setInitValue(value.getValue());
deviceDetailEntity.setCurValue(value.getValue());
deviceDetailEntity.setCreateTime(System.currentTimeMillis());
deviceDetailEntity.setUpdateTime(System.currentTimeMillis());
this.save(deviceDetailEntity);
} else {
// 修改
DeviceDetailEntity dbDetailEntity = deviceDetailEntities.get(0);
LambdaUpdateWrapper<DeviceDetailEntity> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(DeviceDetailEntity::getId, dbDetailEntity.getId());
updateWrapper.set(DeviceDetailEntity::getCurValue, value.getValue());
updateWrapper.set(DeviceDetailEntity::getUpdateTime, System.currentTimeMillis());
this.update(updateWrapper);
}
}
}
}
......@@ -10,10 +10,7 @@ import com.dji.sample.manage.model.dto.DeviceDTO;
import com.dji.sample.manage.model.dto.DevicePayloadReceiver;
import com.dji.sample.manage.model.enums.DeviceFirmwareStatusEnum;
import com.dji.sample.manage.model.param.DeviceQueryParam;
import com.dji.sample.manage.service.IDeviceDictionaryService;
import com.dji.sample.manage.service.IDevicePayloadService;
import com.dji.sample.manage.service.IDeviceRedisService;
import com.dji.sample.manage.service.IDeviceService;
import com.dji.sample.manage.service.*;
import com.dji.sample.uom.UOMDroneFlightRecordDTO;
import com.dji.sample.uom.UOMRecordService;
import com.dji.sdk.cloudapi.device.*;
......@@ -32,8 +29,7 @@ import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.util.*;
import java.math.RoundingMode;
import java.time.LocalDateTime;
......@@ -70,6 +66,9 @@ public class SDKDeviceService extends AbstractDeviceService {
@Autowired
private UOMRecordService uomRecordService;
@Autowired
private IDeviceDetailService deviceDetailService;
private static final ScheduledExecutorService recordExecutor = Executors.newScheduledThreadPool(4);
private static final Map<String, Long> lastRecordTimeMap = new ConcurrentHashMap<>();
private static final long MIN_RECORD_INTERVAL = 1000; // 1秒间隔
......@@ -193,6 +192,9 @@ public class SDKDeviceService extends AbstractDeviceService {
DeviceDTO device = deviceOpt.get();
deviceRedisService.setDeviceOnline(device);
deviceRedisService.setDeviceOsd(from, request.getData());
// 存放数据
deviceDetailService.saveDeviceOsd(from, request.getData());
// 3. 带频率控制的记录上报
submitRecordWithRateLimit(device, request);
// new Thread(() -> {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment