kaiyu
2021-09-16 d99988283de685d763df9460e180bdfcc686ac0b
screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java
@@ -2,9 +2,7 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.entity.HistorySecondUav;
import com.moral.api.entity.Organization;
import com.moral.api.entity.SpecialDevice;
import com.moral.api.entity.*;
import com.moral.api.mapper.HistorySecondUavMapper;
import com.moral.api.pojo.dto.uav.UAVQueryTimeSlotDTO;
import com.moral.api.pojo.form.uav.UAVQueryTimeSlotForm;
@@ -12,15 +10,20 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.service.OrganizationService;
import com.moral.api.service.SpecialDeviceService;
import com.moral.constant.RedisConstants;
import com.moral.util.DateUtils;
import com.moral.util.GeodesyUtils;
import com.moral.util.MathUtils;
import com.moral.util.UnitConvertUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
/**
@@ -45,6 +48,8 @@
    OrganizationService organizationService;
    @Autowired
    SpecialDeviceService specialDeviceService;
    @Autowired
    RedisTemplate redisTemplate;
    @Override
    public List<Date> queryDate(Integer organizationId) {
@@ -144,6 +149,7 @@
            dto.setMac(key);
            //根据mac查询设备名称
            SpecialDevice specialDevice = specialDeviceService.getSpecialDeviceMapByMac(key);
            //如果设备不存在则退出循环
            if(specialDevice==null)
                return;
            dto.setName(specialDevice.getName());
@@ -172,7 +178,7 @@
        //查询数据
        QueryWrapper<HistorySecondUav> wrapper = new QueryWrapper<>();
        wrapper.eq("batch", batchDate);
        wrapper.select("value");
        wrapper.select("value,mac,time");
        List<HistorySecondUav> datas = historySecondUavMapper.selectList(wrapper);
        //获取无人机飞行高度最低值
        Double lowestHeight = 0d;
@@ -198,10 +204,20 @@
            String newValue = JSON.toJSONString(valueMap);
            data.setValue(newValue);
        }
        //筛选无人机数据,保持每个点之间的举例在3米以上
        return filterDatas(datas);
        //筛选无人机数据,保持每个点之间的距离在2米以上
        datas = filterDatas(datas);
        //转换单位
        unitConvert(datas);
        return datas;
    }
    /**
     * @Description: 过滤数据
     * @Param: [datas]
     * @return: java.util.List<com.moral.api.entity.HistorySecondUav>
     * @Author: 陈凯裕
     * @Date: 2021/9/16
     */
    private List<HistorySecondUav> filterDatas(List<HistorySecondUav> datas) {
        //创建返回结果
        List<HistorySecondUav> result = new ArrayList<>();
@@ -249,4 +265,70 @@
        return Distance;
    }
    /**
     * @Description: 数据单位转换以及拼接
     * @Param: [datas]
     * @return: java.util.List<com.moral.api.entity.HistorySecondUav>
     * @Author: 陈凯裕
     * @Date: 2021/9/16
     */
    private void unitConvert(List<HistorySecondUav> datas) {
        //获取转换公式
        List<UnitConversion> unitConversions = redisTemplate.opsForList().range(RedisConstants.UNIT_CONVERSION, 0, -1);
        //获取无人机基本数据
        SpecialDevice specialDevice = (SpecialDevice) redisTemplate.opsForHash().get(RedisConstants.SPECIAL_DEVICE_INFO, datas.get(0).getMac());
        //获取无人机型号所有的因子信息
        List<Sensor> sensors = specialDevice.getVersion().getSensors();
        Map<String, Sensor> sensorsMap = new HashMap<>();
        sensors.forEach(value -> sensorsMap.put(value.getCode(), value));
        //转换单位并且拼接单位
        for (HistorySecondUav data : datas) {
            String valueStr = data.getValue();
            ConcurrentHashMap<String, Object> valueMap = JSON.parseObject(valueStr, ConcurrentHashMap.class);
            Set<Map.Entry<String, Object>> entries = valueMap.entrySet();
            Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
            //遍历单个数据的所有因子
            while(iterator.hasNext()){
                Map.Entry<String, Object> entry = iterator.next();
                String code = entry.getKey();
                String value = String.valueOf(entry.getValue());
                Sensor sensor = sensorsMap.get(code);
                if (sensor == null) {//如果型号中没有该因子则移除
                    valueMap.remove(code);
                    continue;
                }
                String unit = sensor.getUnit();
                String unitKey = sensor.getUnitKey();
                String showUnit = sensor.getShowUnit();
                String showUnitKey = sensor.getShowUnitKey();
                //如果源单位和显示单位相同则直接拼接单位
                if (showUnitKey.equals(unitKey)) {
                    value += " " + unit;
                } else {
                    String formula = sensor.getFormula();
                    //如果sensor中的公式为空则从缓存中获取公式
                    if (ObjectUtils.isEmpty(formula)) {
                        for (UnitConversion unitConversion : unitConversions) {
                            if (unitConversion.getOriginalUnitKey().equals(unitKey) && unitConversion.getTargetUnitKey().equals(showUnitKey))
                                formula = unitConversion.getFormula();
                        }
                    }
                    //计算转换单位后的数据
                    String resultValue = UnitConvertUtils.calculate((String) value, formula);
                    if (resultValue != null) {
                        resultValue += showUnit;
                    } else {//如果转换出的数据为null,则代表缓存中也没有公式,依然使用源单位。
                        resultValue = value + unit;
                    }
                    value = resultValue;
                }
                //重新放入转换后的数据
                valueMap.put(code, value);
            }
            String value = JSON.toJSONString(valueMap);
            data.setValue(value);
        }
        System.out.println(111);
    }
}