From 7c50c777eda4fa9dfdf54535a7d6ab0520243267 Mon Sep 17 00:00:00 2001
From: jinpengyong <jpy123456>
Date: Wed, 21 Jul 2021 18:04:28 +0800
Subject: [PATCH] 风场数据,城市切换

---
 screen-api/src/main/java/com/moral/api/service/HistoryMonthlyService.java               |   16 +
 screen-common/src/main/java/com/moral/util/DateUtils.java                               |   25 +
 screen-api/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java          |    4 
 screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java |  211 +++++++++++++++++
 screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml                           |   12 +
 screen-api/src/main/java/com/moral/api/service/SysAreaService.java                      |    5 
 screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java                |    4 
 screen-api/src/main/java/com/moral/api/controller/WebController.java                    |   78 ++++++
 screen-api/src/main/java/com/moral/api/mapper/DeviceMapper.java                         |    6 
 screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java                 |   16 +
 screen-api/src/main/java/com/moral/api/entity/HistoryMonthly.java                       |   45 +++
 screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java              |   57 ++++
 /dev/null                                                                               |   12 -
 screen-api/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java            |    6 
 screen-api/src/main/java/com/moral/api/service/DeviceService.java                       |    9 
 screen-api/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java             |   87 +++++++
 screen-api/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml                      |   25 ++
 screen-api/src/main/java/com/moral/api/pojo/dto/Wind/WindData.java                      |   20 +
 screen-api/src/main/java/com/moral/api/service/impl/HistoryMonthlyServiceImpl.java      |   20 +
 screen-api/src/main/resources/mapper/DeviceMapper.xml                                   |   57 ++-
 20 files changed, 668 insertions(+), 47 deletions(-)

diff --git a/screen-api/src/main/java/com/moral/api/controller/WebController.java b/screen-api/src/main/java/com/moral/api/controller/WebController.java
index ae6bf47..b16c7d7 100644
--- a/screen-api/src/main/java/com/moral/api/controller/WebController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/WebController.java
@@ -10,12 +10,16 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.moral.api.service.DeviceService;
 import com.moral.api.service.HistoryDailyService;
+import com.moral.api.service.HistoryFiveMinutelyService;
 import com.moral.api.service.HistoryHourlyService;
+import com.moral.api.service.SysAreaService;
 import com.moral.constant.ResponseCodeEnum;
 import com.moral.constant.ResultMessage;
 import com.moral.util.WebUtils;
@@ -31,6 +35,15 @@
 
     @Autowired
     private HistoryDailyService historyDailyService;
+
+    @Autowired
+    private HistoryFiveMinutelyService historyFiveMinutelyService;
+
+    @Autowired
+    private DeviceService deviceService;
+
+    @Autowired
+    private SysAreaService sysAreaService;
 
     @GetMapping("getHourlyAqi")
     @ApiOperation(value = "���������������AQI", notes = "���������������AQI")
@@ -63,4 +76,69 @@
         return ResultMessage.ok(result);
     }
 
+    @GetMapping("getWindData")
+    @ApiOperation(value = "������������������", notes = "������������������")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String"),
+            @ApiImplicitParam(name = "monitorPointId", value = "������id", required = true, paramType = "query", dataType = "String")
+    })
+    public ResultMessage getWindData(HttpServletRequest request) {
+        Map<String, Object> params = WebUtils.getParametersStartingWith(request, null);
+        if (!params.containsKey("monitorPointIds")) {
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        String[] monitorPointIds = params.remove("monitorPointIds").toString().split(",");
+        params.put("monitorPointIds", monitorPointIds);
+        List<Object> result = historyFiveMinutelyService.getAreaWindData(params);
+        return ResultMessage.ok(result);
+    }
+
+    @GetMapping("getMacSensors")
+    @ApiOperation(value = "������mac������������������������", notes = "������mac������������������������")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String"),
+            @ApiImplicitParam(name = "mac", value = "������mac", required = true, paramType = "query", dataType = "String")
+    })
+    public ResultMessage getMacSensors(HttpServletRequest request) {
+        Map<String, Object> params = WebUtils.getParametersStartingWith(request, null);
+        if (!params.containsKey("mac")) {
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        Map<String, Object> sensorsInfo = deviceService.getSensorsByMac(params.get("mac").toString());
+        return ResultMessage.ok(sensorsInfo);
+    }
+
+    @GetMapping("getTrendChartData")
+    @ApiOperation(value = "���������������������������������", notes = "���������������������������������")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String"),
+            @ApiImplicitParam(name = "mac", value = "������mac", required = true, paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "sensorCode", value = "������code", required = true, paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "type", value = "���������������������day���,������month���,������year���", required = true, paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "time", value = "������������", required = true, paramType = "query", dataType = "String")
+    })
+    public ResultMessage getTrendChartData(HttpServletRequest request) {
+        Map<String, Object> params = WebUtils.getParametersStartingWith(request, null);
+        if (!params.containsKey("mac") || !params.containsKey("sensorCode") || !params.containsKey("type") || !params.containsKey("time")) {
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        List<Map<String, Object>> sensorsInfo = deviceService.getTrendChartData(params);
+        return ResultMessage.ok(sensorsInfo);
+    }
+
+    @GetMapping("getMapPath")
+    @ApiOperation(value = "������������������������������", notes = "������������������������������")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String"),
+            @ApiImplicitParam(name = "organizationId", value = "������id", required = true, paramType = "query", dataType = "String")
+    })
+    public ResultMessage getMapPath(HttpServletRequest request) {
+        Map<String, Object> params = WebUtils.getParametersStartingWith(request, null);
+        if (!params.containsKey("organizationId")) {
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        List<Map<String, Object>> result = sysAreaService.getMapPath(Integer.parseInt(params.get("organizationId").toString()));
+        return ResultMessage.ok(result);
+    }
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/entity/HistoryMonthly.java b/screen-api/src/main/java/com/moral/api/entity/HistoryMonthly.java
new file mode 100644
index 0000000..ecd7b52
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/entity/HistoryMonthly.java
@@ -0,0 +1,45 @@
+package com.moral.api.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-07-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class HistoryMonthly extends Model<HistoryMonthly> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ������mac
+     */
+    private String mac;
+
+    /**
+     * ������
+     */
+    private Date time;
+
+    /**
+     * ������
+     */
+    private String value;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return null;
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/mapper/DeviceMapper.java b/screen-api/src/main/java/com/moral/api/mapper/DeviceMapper.java
index f49f9df..589c2e8 100644
--- a/screen-api/src/main/java/com/moral/api/mapper/DeviceMapper.java
+++ b/screen-api/src/main/java/com/moral/api/mapper/DeviceMapper.java
@@ -1,5 +1,8 @@
 package com.moral.api.mapper;
 
+import java.util.List;
+import java.util.Map;
+
 import com.moral.api.entity.Device;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
@@ -13,4 +16,7 @@
  */
 public interface DeviceMapper extends BaseMapper<Device> {
 
+    /*���������������������������*/
+    List<Map<String, Object>> getTrendChartData(Map<String, Object> params);
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java b/screen-api/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java
index cd5aec7..2ec37a9 100644
--- a/screen-api/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java
+++ b/screen-api/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java
@@ -1,7 +1,11 @@
 package com.moral.api.mapper;
 
+import java.util.List;
+import java.util.Map;
+
 import com.moral.api.entity.HistoryFiveMinutely;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.moral.api.pojo.dto.Wind.WindData;
 
 /**
  * <p>
@@ -13,4 +17,6 @@
  */
 public interface HistoryFiveMinutelyMapper extends BaseMapper<HistoryFiveMinutely> {
 
+    List<WindData> getAreaWindData(Map<String, Object> params);
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java b/screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java
new file mode 100644
index 0000000..4d498d0
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java
@@ -0,0 +1,16 @@
+package com.moral.api.mapper;
+
+import com.moral.api.entity.HistoryMonthly;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * ��������� Mapper ������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-07-20
+ */
+public interface HistoryMonthlyMapper extends BaseMapper<HistoryMonthly> {
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/dto/Wind/WindData.java b/screen-api/src/main/java/com/moral/api/pojo/dto/Wind/WindData.java
new file mode 100644
index 0000000..6c56f2d
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/dto/Wind/WindData.java
@@ -0,0 +1,20 @@
+package com.moral.api.pojo.dto.Wind;
+
+import lombok.Data;
+
+@Data
+public class WindData {
+
+    //������
+    private Double longitude;
+
+    //������
+    private Double latitude;
+
+    //������������
+    private Double windDir;
+
+    //������
+    private Double windSpeed;
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/DeviceService.java b/screen-api/src/main/java/com/moral/api/service/DeviceService.java
index 53d8109..bfb323d 100644
--- a/screen-api/src/main/java/com/moral/api/service/DeviceService.java
+++ b/screen-api/src/main/java/com/moral/api/service/DeviceService.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -14,5 +15,13 @@
  * @since 2021-06-28
  */
 public interface DeviceService extends IService<Device> {
+
     List<Device> getDevicesByMonitorPointId(Integer monitorPointId);
+
+    //������mac������������������
+    Map<String, Object> getSensorsByMac(String mac);
+
+    //���������������������������������
+    List<Map<String, Object>> getTrendChartData(Map<String,Object> params);
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java b/screen-api/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java
index 58e3e02..aaefcd2 100644
--- a/screen-api/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java
+++ b/screen-api/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java
@@ -6,6 +6,7 @@
 import com.moral.api.pojo.form.historyFiveMinutely.QueryDeviceAndFiveMinuteDataForm;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -25,4 +26,7 @@
             * @Date: 2021/7/16
             */
     List<DeviceAndFiveMinuteDataDTO> queryDeviceAndFiveMinuteData(QueryDeviceAndFiveMinuteDataForm form);
+
+    //������5������������������
+    List<Object> getAreaWindData(Map<String,Object> params);
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/HistoryMonthlyService.java b/screen-api/src/main/java/com/moral/api/service/HistoryMonthlyService.java
new file mode 100644
index 0000000..529f0ac
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/HistoryMonthlyService.java
@@ -0,0 +1,16 @@
+package com.moral.api.service;
+
+import com.moral.api.entity.HistoryMonthly;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * ��������� ���������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-07-20
+ */
+public interface HistoryMonthlyService extends IService<HistoryMonthly> {
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/SysAreaService.java b/screen-api/src/main/java/com/moral/api/service/SysAreaService.java
index 0cb05dd..a972152 100644
--- a/screen-api/src/main/java/com/moral/api/service/SysAreaService.java
+++ b/screen-api/src/main/java/com/moral/api/service/SysAreaService.java
@@ -1,5 +1,8 @@
 package com.moral.api.service;
 
+import java.util.List;
+import java.util.Map;
+
 import com.moral.api.entity.SysArea;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +16,6 @@
  */
 public interface SysAreaService extends IService<SysArea> {
 
+    List<Map<String, Object>> getMapPath(Integer orgId);
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
index e103c8c..4ae4498 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
@@ -2,14 +2,23 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.moral.api.entity.Device;
+import com.moral.api.entity.Sensor;
 import com.moral.api.mapper.DeviceMapper;
 import com.moral.api.service.DeviceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.service.HistoryHourlyService;
 import com.moral.constant.Constants;
+import com.moral.constant.RedisConstants;
+import com.moral.util.DateUtils;
+
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -25,12 +34,58 @@
     @Autowired
     DeviceMapper deviceMapper;
 
+    @Autowired
+    private RedisTemplate redisTemplate;
+
     @Override
     public List<Device> getDevicesByMonitorPointId(Integer monitorPointId) {
         QueryWrapper<Device> wrapper = new QueryWrapper();
         wrapper.eq("is_delete", Constants.NOT_DELETE);
-        wrapper.eq("monitor_point_id",monitorPointId);
+        wrapper.eq("monitor_point_id", monitorPointId);
         List<Device> devices = deviceMapper.selectList(wrapper);
         return devices;
     }
+
+    @Override
+    public Map<String, Object> getSensorsByMac(String mac) {
+        //���redis���������������������������
+        Device device = (Device) redisTemplate.opsForHash().get(RedisConstants.DEVICE_INFO, mac);
+        List<Sensor> sensors = device.getVersion().getSensors();
+        Map<String, Object> result = new HashMap<>();
+        for (Sensor sensor : sensors) {
+            String sensorCode = sensor.getCode();
+            String name = sensor.getName();
+            result.put(sensorCode, name);
+        }
+        return result;
+    }
+
+    @Override
+    public List<Map<String, Object>> getTrendChartData(Map<String, Object> params) {
+        Object type = params.get("type");
+        String start = params.remove("time").toString();
+        String end;
+        String timeUnits;
+        String dateFormat;
+        List<Map<String, Object>> result = new ArrayList<>();
+        if ("day".equals(type)) {
+            end = DateUtils.getDateAddDay(start, 1);
+            timeUnits = "hourly";
+            dateFormat = "%H";
+        } else if ("month".equals(type)) {
+            end = DateUtils.getDateAddMonth(start, 1);
+            timeUnits = "daily";
+            dateFormat = "%d";
+        } else {
+            end = DateUtils.getDateAddYear(start, 1);
+            timeUnits = "monthly";
+            dateFormat = "%m";
+        }
+        params.put("dateFormat", dateFormat);
+        params.put("timeUnits", timeUnits);
+        params.put("start", start);
+        params.put("end", end);
+        return deviceMapper.getTrendChartData(params);
+    }
+
 }
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..dac6205 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,22 +1,29 @@
 package com.moral.api.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.moral.api.entity.Device;
 import com.moral.api.entity.HistoryFiveMinutely;
 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.util.DateUtils;
+
+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.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,8 +41,12 @@
 
     @Autowired
     MonitorPointService monitorPointService;
+
     @Autowired
     RedisTemplate redisTemplate;
+
+    @Autowired
+    private HistoryFiveMinutelyMapper historyFiveMinutelyMapper;
 
     @Override
     public List<DeviceAndFiveMinuteDataDTO> queryDeviceAndFiveMinuteData(QueryDeviceAndFiveMinuteDataForm form) {
@@ -57,11 +68,11 @@
             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));
+            Map<String, Object> value = new HashMap<>();
+            if (sensorValues != null && sensorValues.get(sensorCode) != null)
+                value.put(sensorCode, sensorValues.get(sensorCode));
             else
-                value.put(sensorCode,null);
+                value.put(sensorCode, null);
             dto.setDevice(device);
             dto.setSensorValue(value);
             dtos.add(dto);
@@ -69,4 +80,196 @@
         return dtos;
     }
 
+    @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;
+    }
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistoryMonthlyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistoryMonthlyServiceImpl.java
new file mode 100644
index 0000000..586b30e
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/impl/HistoryMonthlyServiceImpl.java
@@ -0,0 +1,20 @@
+package com.moral.api.service.impl;
+
+import com.moral.api.entity.HistoryMonthly;
+import com.moral.api.mapper.HistoryMonthlyMapper;
+import com.moral.api.service.HistoryMonthlyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * ��������� ���������������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-07-20
+ */
+@Service
+public class HistoryMonthlyServiceImpl extends ServiceImpl<HistoryMonthlyMapper, HistoryMonthly> implements HistoryMonthlyService {
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java
index 2c755cb..83e23db 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java
@@ -1,10 +1,26 @@
 package com.moral.api.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.moral.api.entity.Menu;
+import com.moral.api.entity.MonitorPoint;
 import com.moral.api.entity.SysArea;
+import com.moral.api.mapper.MonitorPointMapper;
 import com.moral.api.mapper.SysAreaMapper;
 import com.moral.api.service.SysAreaService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.constant.Constants;
+
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -17,4 +33,75 @@
 @Service
 public class SysAreaServiceImpl extends ServiceImpl<SysAreaMapper, SysArea> implements SysAreaService {
 
+    @Autowired
+    private SysAreaMapper sysAreaMapper;
+
+    @Autowired
+    private MonitorPointMapper monitorPointMapper;
+
+    @Override
+    public List<Map<String, Object>> getMapPath(Integer orgId) {
+        //������������id������������������
+        QueryWrapper<MonitorPoint> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("province_code", "city_code", "area_code")
+                .eq("organization_id", orgId)
+                .eq("is_delete", Constants.NOT_DELETE);
+        List<MonitorPoint> monitorPoints = monitorPointMapper.selectList(queryWrapper);
+        Set<Integer> cityCodes = new HashSet<>();
+        for (MonitorPoint monitorPoint : monitorPoints) {
+            cityCodes.add(monitorPoint.getProvinceCode());
+            cityCodes.add(monitorPoint.getCityCode());
+            cityCodes.add(monitorPoint.getAreaCode());
+        }
+
+        QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>();
+        sysAreaQueryWrapper.select("area_code", "area_name", "parent_code").in("area_code", cityCodes);
+        List<SysArea> allAreas = sysAreaMapper.selectList(sysAreaQueryWrapper);
+
+        //���������������
+        List<SysArea> oneSysArea = allAreas.stream()
+                .filter(o -> o.getParentCode().equals(0))
+                .sorted(Comparator.comparing(SysArea::getAreaCode))
+                .collect(Collectors.toList());
+
+        List<Map<String, Object>> newList = new ArrayList<>();
+        //������������������
+        oneSysArea.forEach(o -> {
+            Map<String, Object> sysAreaMap = new LinkedHashMap<>();
+            sysAreaMap.put("provinceCode", o.getAreaCode());
+            sysAreaMap.put("provinceName", o.getAreaName());
+            sysAreaMap.put("cities", getAreasByRecursion(o, allAreas));
+            newList.add(sysAreaMap);
+        });
+        return newList;
+    }
+
+    //������������������������������������
+    private List<Map<String, Object>> getAreasByRecursion(SysArea sysArea, List<SysArea> sysAreas) {
+        SysArea newSysArea = new SysArea();
+        newSysArea.setParentCode(sysArea.getAreaCode());
+        //������������������������������
+        List<SysArea> nextLevel = sysAreas.stream()
+                .filter(o -> o.getParentCode().equals(sysArea.getAreaCode()))
+                .collect(Collectors.toList());
+        List<Map<String, Object>> list = new ArrayList<>();
+
+        if (nextLevel.size() > 0) {
+            nextLevel.forEach(o -> {
+                Map<String, Object> sysMap = new LinkedHashMap<>();
+                if (o.getAreaCode().toString().endsWith("00")) {
+                    sysMap.put("cityCode", o.getAreaCode());
+                    sysMap.put("cityName", o.getAreaName());
+                    sysMap.put("provinceCode", o.getParentCode());
+                    sysMap.put("areas", getAreasByRecursion(o, sysAreas));
+                } else {
+                    sysMap.put("areaCode", o.getAreaCode());
+                    sysMap.put("areaName", o.getAreaName());
+                    sysMap.put("cityCode", o.getParentCode());
+                }
+                list.add(sysMap);
+            });
+        }
+        return list;
+    }
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
index 12dad29..f8cd551 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
@@ -225,11 +225,11 @@
             nextLevelMenus.forEach(o -> {
                 Map<String, Object> menuMap = new LinkedHashMap<>();
                 menuMap.put("id", o.getId());
-                menuMap.put("name", o.getName());
+                menuMap.put("label", o.getName());
                 menuMap.put("url", o.getUrl());
                 menuMap.put("icon", o.getIcon());
                 //���������������
-                menuMap.put("child", getMenusByRecursion(o, menus));
+                menuMap.put("children", getMenusByRecursion(o, menus));
                 list.add(menuMap);
             });
         }
diff --git a/screen-api/src/main/resources/mapper/DeviceMapper.xml b/screen-api/src/main/resources/mapper/DeviceMapper.xml
index 493dc7b..94cde21 100644
--- a/screen-api/src/main/resources/mapper/DeviceMapper.xml
+++ b/screen-api/src/main/resources/mapper/DeviceMapper.xml
@@ -2,28 +2,39 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.moral.api.mapper.DeviceMapper">
 
-        <!-- ������������������������ -->
-        <resultMap id="BaseResultMap" type="com.moral.api.entity.Device">
-                    <id column="id" property="id" />
-                    <result column="name" property="name" />
-                    <result column="mac" property="mac" />
-                    <result column="address" property="address" />
-                    <result column="longitude" property="longitude" />
-                    <result column="latitude" property="latitude" />
-                    <result column="state" property="state" />
-                    <result column="operate_ids" property="operateIds" />
-                    <result column="monitor_point_id" property="monitorPointId" />
-                    <result column="organization_id" property="organizationId" />
-                    <result column="device_version_id" property="deviceVersionId" />
-                    <result column="profession" property="profession" />
-                    <result column="tech" property="tech" />
-                    <result column="detector" property="detector" />
-                    <result column="purchaser" property="purchaser" />
-                    <result column="create_time" property="createTime" />
-                    <result column="update_time" property="updateTime" />
-                    <result column="install_time" property="installTime" />
-                    <result column="is_delete" property="isDelete" />
-                    <result column="extend" property="extend" />
-        </resultMap>
+    <!-- ������������������������ -->
+    <resultMap id="BaseResultMap" type="com.moral.api.entity.Device">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="mac" property="mac"/>
+        <result column="address" property="address"/>
+        <result column="longitude" property="longitude"/>
+        <result column="latitude" property="latitude"/>
+        <result column="state" property="state"/>
+        <result column="operate_ids" property="operateIds"/>
+        <result column="monitor_point_id" property="monitorPointId"/>
+        <result column="organization_id" property="organizationId"/>
+        <result column="device_version_id" property="deviceVersionId"/>
+        <result column="profession" property="profession"/>
+        <result column="tech" property="tech"/>
+        <result column="detector" property="detector"/>
+        <result column="purchaser" property="purchaser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="install_time" property="installTime"/>
+        <result column="is_delete" property="isDelete"/>
+        <result column="extend" property="extend"/>
+    </resultMap>
 
+    <!--���������������������������-->
+    <select id="getTrendChartData" resultType="java.util.Map">
+        SELECT
+        DATE_FORMAT(`time`,#{dateFormat}) AS `time`,
+        `value`->'$.${sensorCode}' AS '${sensorCode}'
+        FROM history_${timeUnits}
+        WHERE mac = #{mac}
+        AND `time` <![CDATA[>=]]> #{start}
+        AND `time` <![CDATA[<]]> #{end}
+        ORDER BY `time`
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/screen-api/src/main/resources/mapper/HistoryFiveMinutely202107Mapper.xml b/screen-api/src/main/resources/mapper/HistoryFiveMinutely202107Mapper.xml
deleted file mode 100644
index d5ef167..0000000
--- a/screen-api/src/main/resources/mapper/HistoryFiveMinutely202107Mapper.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.moral.api.mapper.HistoryFiveMinutely202107Mapper">
-
-        <!-- ������������������������ -->
-        <resultMap id="BaseResultMap" type="com.moral.api.entity.HistoryFiveMinutely">
-                    <result column="mac" property="mac" />
-                    <result column="time" property="time" />
-                    <result column="value" property="value" />
-        </resultMap>
-
-</mapper>
\ No newline at end of file
diff --git a/screen-api/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml b/screen-api/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml
new file mode 100644
index 0000000..4e0901b
--- /dev/null
+++ b/screen-api/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.moral.api.mapper.HistoryFiveMinutelyMapper">
+
+    <!--������5������������������-->
+    <select id="getAreaWindData" resultType="com.moral.api.pojo.dto.Wind.WindData">
+        SELECT
+        d.longitude AS longitude,
+        d.latitude AS latitude,
+        CASE WHEN
+        h.value->'$.a01007' = 0 THEN 0.1 ELSE h.value->'$.a01007' END AS windSpeed,
+        h.value->'$.a01008' AS windDir
+        FROM history_five_minutely_${timeUnits} h ,
+        `device` AS d
+        WHERE d.mac = h.mac
+        AND d.mac IN
+        (SELECT mac FROM device WHERE monitor_point_id IN
+            <foreach item="monitorPointId" collection="monitorPointIds" index="index" open="(" separator="," close=")">
+                #{monitorPointId}
+            </foreach>
+        )
+        AND h.time = (SELECT max(time) FROM history_five_minutely_${timeUnits})
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml b/screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml
new file mode 100644
index 0000000..942a9a0
--- /dev/null
+++ b/screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.moral.api.mapper.HistoryMonthlyMapper">
+
+    <!-- ������������������������ -->
+    <resultMap id="BaseResultMap" type="com.moral.api.entity.HistoryMonthly">
+        <result column="mac" property="mac"/>
+        <result column="time" property="time"/>
+        <result column="value" property="value"/>
+    </resultMap>
+
+</mapper>
\ No newline at end of file
diff --git a/screen-common/src/main/java/com/moral/util/DateUtils.java b/screen-common/src/main/java/com/moral/util/DateUtils.java
index 1d777ef..8e61079 100644
--- a/screen-common/src/main/java/com/moral/util/DateUtils.java
+++ b/screen-common/src/main/java/com/moral/util/DateUtils.java
@@ -16,6 +16,10 @@
 
 public class DateUtils {
     /**
+     * ������������(yyyy)
+     */
+    public static final String yyyy = "yyyy";
+    /**
      * ������������(yyyy-MM-dd)
      */
     public static final String yyyy_MM_dd_EN = "yyyy-MM-dd";
@@ -746,8 +750,8 @@
      * @param days
      * @return
      */
-    public static String getDateAddDay(String date, int days, String format) {
-        DateFormat df = getDateFormat(format);
+    public static String getDateAddDay(String date, int days) {
+        DateFormat df = getDateFormat(yyyy_MM_dd_EN);
         try {
             Calendar cal = Calendar.getInstance();
             cal.setTime(df.parse(date));
@@ -791,7 +795,7 @@
      * @return
      */
     public static String getDateAddMonth(String date, int m) {
-        DateFormat df = getDateFormat(yyyyMM_EN);
+        DateFormat df = getDateFormat(yyyy_MM_EN);
         try {
             Calendar cal = Calendar.getInstance();
             cal.setTime(df.parse(date));
@@ -1337,7 +1341,18 @@
         return getDate(dateToDateString(calendar.getTime(), yyyy_MM_dd_EN));
     }
 
-    public static void main(String[] args) {
-        System.out.println(getFirstDayOfCurrMonth());
+
+    /*���������������������*/
+    public static String getDateAddYear(String date, int year) {
+        DateFormat df = getDateFormat(yyyy);
+        try {
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(df.parse(date));
+            cal.add(Calendar.YEAR, year);
+            date = df.format(cal.getTime());
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+        return date;
     }
 }

--
Gitblit v1.8.0