From 0c29adcf7692ad992c70ff1207d7d098a635535c Mon Sep 17 00:00:00 2001
From: lizijie <lzjiiie@163.com>
Date: Thu, 10 Feb 2022 13:25:15 +0800
Subject: [PATCH] 服务范围列表条件查询接口

---
 screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java |  286 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 277 insertions(+), 9 deletions(-)

diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
index 0ee5973..da4cbef 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
@@ -1,25 +1,35 @@
 package com.moral.api.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
+import com.baomidou.mybatisplus.core.conditions.segments.NormalSegmentList;
+import com.moral.api.config.mybatis.MybatisPlusConfig;
 import com.moral.api.entity.Device;
 import com.moral.api.entity.HistoryFiveMinutely;
+import com.moral.api.entity.HistoryHourly;
 import com.moral.api.entity.MonitorPoint;
 import com.moral.api.mapper.HistoryFiveMinutelyMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.pojo.dto.Wind.WindData;
 import com.moral.api.pojo.dto.historyFiveMinutely.DeviceAndFiveMinuteDataDTO;
 import com.moral.api.pojo.form.device.MonitorPointQueryForm;
 import com.moral.api.pojo.form.historyFiveMinutely.QueryDeviceAndFiveMinuteDataForm;
 import com.moral.api.service.HistoryFiveMinutelyService;
 import com.moral.api.service.MonitorPointService;
 import com.moral.constant.RedisConstants;
+import com.moral.constant.SeparateTableType;
+import com.moral.util.DateUtils;
+import com.moral.util.MybatisPLUSUtils;
+import io.lettuce.core.GeoCoordinates;
 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.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * <p>
@@ -36,6 +46,8 @@
     MonitorPointService monitorPointService;
     @Autowired
     RedisTemplate redisTemplate;
+    @Autowired
+    HistoryFiveMinutelyMapper historyFiveMinutelyMapper;
 
     @Override
     public List<DeviceAndFiveMinuteDataDTO> queryDeviceAndFiveMinuteData(QueryDeviceAndFiveMinuteDataForm form) {
@@ -56,17 +68,273 @@
         for (Device device : devices) {
             DeviceAndFiveMinuteDataDTO dto = new DeviceAndFiveMinuteDataDTO();
             String mac = device.getMac();
+            //������������������
             Map<String, Object> sensorValues = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DATA_FIVE_MINUTES, mac);
-            Map<String,Object> value = new HashMap<>();
-            if (sensorValues!=null&&sensorValues.get(sensorCode) != null)
-                value.put(sensorCode,sensorValues.get(sensorCode));
+            //������������������������������������
+            if (ObjectUtils.isEmpty(sensorValues)) {
+                HistoryFiveMinutely dbHistoryFiveMinutely = queryLastDataByMac(mac);
+                if (ObjectUtils.isEmpty(dbHistoryFiveMinutely))
+                    continue;
+                else
+                    sensorValues = JSON.parseObject(dbHistoryFiveMinutely.getValue(),Map.class);
+            }
+            String dbDataStr = JSON.toJSONString(sensorValues);
+            sensorValues = JSON.parseObject(dbDataStr, HashMap.class);
+            Map<String, Object> sensorValue = new HashMap<>();
+            if (sensorValues != null && sensorValues.get(sensorCode) != null)
+                sensorValue.put(sensorCode, sensorValues.get(sensorCode));
             else
-                value.put(sensorCode,null);
+                sensorValue.put(sensorCode, null);
             dto.setDevice(device);
-            dto.setSensorValue(value);
+            dto.setSensorValue(sensorValue);
             dtos.add(dto);
         }
         return dtos;
     }
 
+    @Override
+    public HistoryFiveMinutely queryLastDataByMac(String mac) {
+        QueryWrapper<HistoryFiveMinutely> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("mac", mac);
+        queryWrapper.orderByDesc("time");
+        queryWrapper.last("limit 0,1");
+        //���������������������
+        Date date = new Date();
+        List<String> tableNames = MybatisPLUSUtils.getTableNamesByWrapper(date, date, SeparateTableType.MONTH);
+        List<HistoryFiveMinutely> datas = multiTableQuery(queryWrapper, tableNames);
+        if (ObjectUtils.isEmpty(datas))
+            return null;
+        return datas.get(0);
+    }
+
+
+    @Override
+    public List<Object> getAreaWindData(Map<String, Object> params) {
+        String timeUnits = DateUtils.dateToDateString(new Date(), DateUtils.yyyyMM_EN);
+        params.put("timeUnits", timeUnits);
+        //������������
+        List<WindData> windData = historyFiveMinutelyMapper.getAreaWindData(params);
+        return getWindData(windData);
+    }
+
+
+    /**
+     * ������������������������������������������
+     *
+     * @param geoCoordinateList
+     * @return
+     */
+    public Map<String, Double> getCenterPoint(List<GeoCoordinates> geoCoordinateList) {
+        int total = geoCoordinateList.size();
+        double X = 0, Y = 0, Z = 0;
+        for (GeoCoordinates g : geoCoordinateList) {
+            double lat, lon, x, y, z;
+            lat = (double) g.getY() * Math.PI / 180;
+            lon = (double) g.getX() * Math.PI / 180;
+            x = Math.cos(lat) * Math.cos(lon);
+            y = Math.cos(lat) * Math.sin(lon);
+            z = Math.sin(lat);
+            X += x;
+            Y += y;
+            Z += z;
+        }
+
+        X = X / total;
+        Y = Y / total;
+        Z = Z / total;
+        double Lon = Math.atan2(Y, X);
+        double Hyp = Math.sqrt(X * X + Y * Y);
+        double Lat = Math.atan2(Z, Hyp);
+
+        Map<String, Double> map = new HashMap<>();
+        map.put("lng", Lon * 180 / Math.PI);
+        map.put("lat", Lat * 180 / Math.PI);
+        return map;
+    }
+
+    public List<Object> getWindData(List<WindData> windData) {
+        List<GeoCoordinates> points = new ArrayList<>();
+        int length = 2000;
+        int perdlen = 200;
+        Double loma = 0d;
+        Double lomi = 0d;
+        Double lama = 0d;
+        Double lami = 0d;
+        List<Double> loList = new ArrayList<>();
+        List<Double> laList = new ArrayList<>();
+        Double U;
+        Double V;
+        //���������
+        List<Object> list = new ArrayList<>();
+        List<Map<String, Object>> mapList = new ArrayList<>();
+        for (WindData data : windData) {
+            Double longitude = data.getLongitude();
+            Double latitude = data.getLatitude();
+            GeoCoordinates geoCoordinates = GeoCoordinates.create(longitude, latitude);
+            points.add(geoCoordinates);
+            loList.add(longitude);
+            laList.add(latitude);
+
+            Map<String, Object> map = new HashMap<>();
+            Double windDir = data.getWindDir();
+            Double windSpeed = data.getWindSpeed();
+            if (windDir == null) {
+                windDir = 0d;
+                windSpeed = 0d;
+            }
+            double dir = (360.0 - (windDir + 180.0) * Math.PI / 180.0);
+            U = windSpeed * Math.cos(dir);
+            V = windSpeed * Math.sin(dir);
+            map.put("lo", longitude);
+            map.put("la", latitude);
+            map.put("U", U);
+            map.put("V", V);
+            mapList.add(map);
+        }
+
+        //������������������������������������������������
+        Map<String, Double> centerPoint = getCenterPoint(points);
+
+        if (loList.size() > 0) {
+            loma = Collections.max(loList);
+            lomi = Collections.min(loList);
+        }
+        if (laList.size() > 0) {
+            lama = Collections.max(laList);
+            lami = Collections.min(laList);
+        }
+        Map<String, Object> laLaMap = new HashMap<>();
+        laLaMap.put("maxLo", loma);
+        laLaMap.put("minLo", lomi);
+        laLaMap.put("maxLa", lama);
+        laLaMap.put("minLa", lami);
+
+        Double lo1 = lomi - length * 0.00001141;
+        Double lo2 = loma + length * 0.00001141;
+        Double la2 = lami - length * 0.00000899;
+        Double la1 = lama + length * 0.00000899;
+
+        double dx = 0.00001141 * perdlen;
+        double dy = 0.00000899 * perdlen;
+        int nx = (int) Math.floor((lo2 - lo1) / dx);
+        int ny = (int) Math.floor((la1 - la2) / dy);
+
+
+        List<Double> uList = new ArrayList<>();
+        List<Double> vList = new ArrayList<>();
+        int x;
+        int y;
+
+        for (int i = 0; i < mapList.size(); i++) {
+            Double lo = (Double) mapList.get(i).get("lo");
+            Double la = (Double) mapList.get(i).get("la");
+            x = (int) Math.floor((lo - lo1) / dx);
+            y = Math.abs((int) Math.floor((la - la1) / dy));
+            U = (Double) mapList.get(i).get("U");
+            V = (Double) mapList.get(i).get("V");
+            if (i == 0) {
+                for (int j = 0; j < nx * ny; j++) {
+                    uList.add(0.0);
+                    vList.add(0.0);
+                }
+            }
+            for (int j = 0; j < nx * ny; j++) {
+                if (i == 0) {
+                    if ((y >= 2 && j == (y) * nx + x)) {
+                        int k;
+                        for (k = j - 2 * nx; k <= j + 2 * nx; k = k + nx) {
+                            uList.set(k, U);
+                            uList.set(k - 1, U);
+                            uList.set(k - 2, U);
+                            uList.set(k + 1, U);
+                            uList.set(k + 2, U);
+                            vList.set(k, V);
+                            vList.set(k - 1, V);
+                            vList.set(k - 2, V);
+                            vList.set(k + 1, V);
+                            vList.set(k + 2, V);
+                        }
+                    }
+                } else {
+                    if (y >= 1 && j == y * nx + x) {
+                        int k;
+                        for (k = j - 2 * nx; k <= j + 2 * nx; ) {
+                            uList.set(k - 1, U);
+                            uList.set(k - 2, U);
+                            uList.set(k + 1, U);
+                            uList.set(k + 2, U);
+                            vList.set(k - 1, V);
+                            vList.set(k - 2, V);
+                            vList.set(k + 1, V);
+                            vList.set(k + 2, V);
+                            k = k + nx;
+                        }
+                        uList.set(j, U);
+                        vList.set(j, V);
+                    }
+                }
+            }
+        }
+        String uData = "\"" + "data" + "\"" + ": " + uList;
+        String vData = "\"" + "data" + "\"" + ": " + vList;
+
+        String header1 = "\"" + "header" + "\"" + ": " + "{" + "\"" + "parameterUnit" + "\"" + ": " + "\"" + "m/s" + "\"" + ", " + "\"" + "parameterNumber" + "\"" + ": " + 2 +
+                ", " + "\"" + "dx" + "\"" + ": " + dx + ", " + "\"" + "dy" + "\"" + ": " + dy +
+                ", " + "\"" + "parameterNumberName" + "\"" + ": " + "\"" + "eastward_wind" + "\"" + ", " + "\"" + "la1" + "\"" + ": " + la1 + ", " + "\"" + "la2" + "\"" + ": " + la2 +
+                ", " + "\"" + "parameterCategory" + "\"" + ": " + 2 + ", " + "\"" + "lo1" + "\"" + ": " + lo1 + ", " + "\"" + "lo2" + "\"" + ": " + lo2 +
+                ", " + "\"" + "nx" + "\"" + ": " + nx + ", " + "\"" + "ny" + "\"" + ": " + ny + ", " + "\"" + "refTime" + "\"" + ": " + "\"" + "2020-07-22 23:00:00" + "\"" + "}";
+
+        String header2 = "\"" + "header" + "\"" + ": " + "{" + "\"" + "parameterUnit" + "\"" + ": " + "\"" + "m/s" + "\"" + ", " + "\"" + "parameterNumber" + "\"" + ": " + 3 +
+                ", " + "\"" + "dx" + "\"" + ": " + dx + ", " + "\"" + "dy" + "\"" + ": " + dy +
+                ", " + "\"" + "parameterNumberName" + "\"" + ": " + "\"" + "eastward_wind" + "\"" + ", " + "\"" + "la1" + "\"" + ": " + la1 + ", " + "\"" + "la2" + "\"" + ": " + la2 +
+                ", " + "\"" + "parameterCategory" + "\"" + ": " + 2 + ", " + "\"" + "lo1" + "\"" + ": " + lo1 + ", " + "\"" + "lo2" + "\"" + ": " + lo2 +
+                ", " + "\"" + "nx" + "\"" + ": " + nx + ", " + "\"" + "ny" + "\"" + ": " + ny + ", " + "\"" + "refTime" + "\"" + ": " + "\"" + "2020-07-22 23:00:00" + "\"" + "}";
+
+
+        String s1 = "[" + "{" + header1 + ", " + uData + "}" + ", " + "{" + header2 + ", " + vData + "}" + "]";
+        JSONArray jsonArray = JSONArray.parseArray(s1);
+
+        list.add(jsonArray);
+        list.add(centerPoint.get("lng"));
+        list.add(centerPoint.get("lat"));
+        list.add(laLaMap);
+        return list;
+    }
+
+    /**
+     * @Description: ���������������������������mac���������
+     * @Param: [mac, startDate, endDate]
+     * @return: java.util.List<com.moral.api.entity.HistoryHourly>
+     * @Author: ���������
+     * @Date: 2021/9/23
+     */
+    public List<HistoryFiveMinutely> getValueByMacAndTime(String mac, Date startDate, Date endDate) {
+        QueryWrapper<HistoryFiveMinutely> wrapper = new QueryWrapper<>();
+        wrapper.eq("mac", mac);
+        wrapper.between("time", startDate, endDate);
+        List<String> tableNames = MybatisPLUSUtils.getTableNamesByWrapper(startDate, endDate, SeparateTableType.MONTH);
+        List<HistoryFiveMinutely> datas = multiTableQuery(wrapper, tableNames);
+        return datas;
+    }
+
+
+    /**
+     * @Description: ������������������������������������������������wrapper���������������
+     * @Param: [wrapper, tableNames]
+     * @return: java.util.List<com.moral.api.entity.HistoryHourly>
+     * @Author: ���������
+     * @Date: 2021/9/23
+     */
+    private List<HistoryFiveMinutely> multiTableQuery(QueryWrapper<HistoryFiveMinutely> wrapper, List<String> tableNames) {
+        List<HistoryFiveMinutely> result = new ArrayList<>();
+        for (String tableName : tableNames) {
+            MybatisPlusConfig.tableName.set(tableName);
+            List<HistoryFiveMinutely> datas = historyFiveMinutelyMapper.selectList(wrapper);
+            result.addAll(datas);
+        }
+        MybatisPlusConfig.tableName.remove();
+        return result;
+    }
+
+
 }

--
Gitblit v1.8.0