jinpengyong
2021-07-21 7c50c777eda4fa9dfdf54535a7d6ab0520243267
风场数据,城市切换
1 files deleted
7 files added
12 files modified
715 ■■■■■ changed files
screen-api/src/main/java/com/moral/api/controller/WebController.java 78 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/entity/HistoryMonthly.java 45 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/mapper/DeviceMapper.java 6 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java 6 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/pojo/dto/Wind/WindData.java 20 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/DeviceService.java 9 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java 4 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/HistoryMonthlyService.java 16 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/SysAreaService.java 5 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java 57 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java 211 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/HistoryMonthlyServiceImpl.java 20 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java 87 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java 4 ●●●● patch | view | raw | blame | history
screen-api/src/main/resources/mapper/DeviceMapper.xml 57 ●●●●● patch | view | raw | blame | history
screen-api/src/main/resources/mapper/HistoryFiveMinutely202107Mapper.xml 12 ●●●●● patch | view | raw | blame | history
screen-api/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml 25 ●●●●● patch | view | raw | blame | history
screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml 12 ●●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/DateUtils.java 25 ●●●● patch | view | raw | blame | history
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);
    }
}
screen-api/src/main/java/com/moral/api/entity/HistoryMonthly.java
New file
@@ -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;
    }
}
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);
}
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);
}
screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java
New file
@@ -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> {
}
screen-api/src/main/java/com/moral/api/pojo/dto/Wind/WindData.java
New file
@@ -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;
}
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);
}
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);
}
screen-api/src/main/java/com/moral/api/service/HistoryMonthlyService.java
New file
@@ -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> {
}
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);
}
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);
    }
}
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;
    }
}
screen-api/src/main/java/com/moral/api/service/impl/HistoryMonthlyServiceImpl.java
New file
@@ -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 {
}
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;
    }
}
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);
            });
        }
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>
screen-api/src/main/resources/mapper/HistoryFiveMinutely202107Mapper.xml
File was deleted
screen-api/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml
New file
@@ -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>
screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml
New file
@@ -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>
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;
    }
}