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