package com.moral.service.impl;
|
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.HashSet;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Set;
|
|
import javax.annotation.Resource;
|
|
import org.dom4j.Element;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.client.RestTemplate;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.moral.entity.Area;
|
import com.moral.entity.City;
|
import com.moral.entity.MonitorPoint;
|
import com.moral.entity.Province;
|
import com.moral.mapper.AQIMapper;
|
import com.moral.mapper.AreaMapper;
|
import com.moral.mapper.CityMapper;
|
import com.moral.mapper.DeviceMapper;
|
import com.moral.mapper.ForecastWeatherMapper;
|
import com.moral.mapper.HistoryHourlyMapper;
|
import com.moral.mapper.MonitorPointMapper;
|
import com.moral.mapper.ProvinceMapper;
|
import com.moral.mapper.RealWeatherMapper;
|
import com.moral.service.ForecastWeatherService;
|
import com.moral.util.Dom4jUtils;
|
|
@Service
|
public class ForecastWeatherServiceImpl implements ForecastWeatherService {
|
|
@Resource
|
private ForecastWeatherMapper forecastWeatherMapper;
|
|
@Resource
|
private MonitorPointMapper monitorPointMapper;
|
|
@Resource
|
private AreaMapper areaMapper;
|
|
@Resource
|
private CityMapper cityMapper;
|
|
@Resource
|
private ProvinceMapper provinceMapper;
|
|
@Resource
|
private RealWeatherMapper realWeatherMapper;
|
|
@Resource
|
private AQIMapper aqiMapper;
|
|
@Resource
|
private DeviceMapper deviceMapper;
|
|
@Resource
|
private HistoryHourlyMapper historyHourlyMapper;
|
|
@Override
|
public int insertForecastWeather() throws ParseException {
|
Calendar c = Calendar.getInstance();
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
c.add(Calendar.DAY_OF_MONTH, 1);
|
String nextDay = sdf.format(c.getTime());
|
c.setTime(c.getTime());
|
Date start = sdf1.parse(nextDay + " 01:00:00");
|
c.add(Calendar.DAY_OF_MONTH, 1);
|
String nextNextDay = sdf.format(c.getTime()) + " 00";
|
Date end = sdf1.parse(sdf.format(c.getTime()) + " 01:00:00");
|
RestTemplate restTemplate = new RestTemplate();
|
List<MonitorPoint> monitorPointList = monitorPointMapper.getMonitorPointList();
|
Set<Map<String, Object>> hashSet = new HashSet<>();
|
for (MonitorPoint monitorPoint : monitorPointList) {
|
Map<String, Object> hashMap = new HashMap<>();
|
Integer areaCode = monitorPoint.getAreaCode();
|
Integer cityCode = monitorPoint.getCityCode();
|
Integer provinceCode = monitorPoint.getProvinceCode();
|
String parentName = "";
|
String name1 = "";
|
Integer code = 0;
|
Integer parentCode = 0;
|
if (areaCode != null) {
|
Area area = areaMapper.getAreaByAreaCode(areaCode);
|
City city = cityMapper.getCityByCityCode(cityCode);
|
name1 = area.getAreaName();
|
parentName = city.getCityName();
|
parentCode = city.getCityCode();
|
code = areaCode;
|
if ("市辖区".equals(name1)) {
|
name1 = parentName;
|
Province province = provinceMapper.getProvinceByProvinceCode(provinceCode);
|
parentName = province.getProvinceName();
|
parentCode = province.getProvinceCode();
|
code = cityCode;
|
}
|
} else {
|
City city = cityMapper.getCityByCityCode(cityCode);
|
name1 = city.getCityName();
|
Province province = provinceMapper.getProvinceByProvinceCode(provinceCode);
|
parentName = province.getProvinceName();
|
code = cityCode;
|
parentCode = province.getProvinceCode();
|
if ("市辖区".equals(name1)) {
|
name1 = parentName;
|
parentName = "";
|
code = provinceCode;
|
}
|
}
|
hashMap.put("name1", name1);
|
hashMap.put("parentName", parentName);
|
hashMap.put("cityCode", code);
|
hashMap.put("parentCode", parentCode);
|
hashSet.add(hashMap);
|
}
|
List<Element> elements = Dom4jUtils.readDocument();
|
String cityID = "101190404";
|
for (Map<String, Object> map : hashSet) {
|
String name1 = map.get("name1").toString();
|
for (Element element : elements) {
|
String name2 = element.element("name").getText();
|
String parentName = map.get("parentName").toString();
|
if (name2.equals("大丰市")) {
|
name2 = "大丰区";
|
}
|
if (name1.equals(name2)) {
|
cityID = element.element("Fweathercn").getText();
|
map.put("cityID", cityID);
|
break;
|
}
|
if (name2.endsWith(name1)) {
|
if (name2.startsWith(parentName)) {
|
cityID = element.element("Fweathercn").getText();
|
map.put("cityID", cityID);
|
break;
|
}
|
}
|
}
|
}
|
|
c.setTime(new Date());
|
Date endTime = sdf.parse(sdf.format(c.getTime()));
|
c.add(Calendar.MONTH, -2);
|
Date startTime = sdf.parse(sdf.format(c.getTime()));
|
int count = 0;
|
for (Map<String, Object> map : hashSet) {
|
String id = map.get("cityID").toString();
|
Map<String, Object> dataMap = restTemplate.getForObject("https://api.heweather.net/v7/weather/72h?key=da05c6c4852d4f7aa3364a9236ee9e26&gzip=n&location={1}", Map.class, id);
|
if (dataMap == null) {
|
return count;
|
}
|
String json = JSONObject.toJSONString(dataMap);
|
dataMap = (Map<String, Object>) JSONObject.parse(json);
|
List<Map<String, Object>> nextDayList = new ArrayList<>();
|
String string = dataMap.get("hourly").toString();
|
List<Map<String, Object>> hourlyList = (List<Map<String, Object>>) JSONObject.parse(string);
|
for (Map<String, Object> hourlyMap : hourlyList) {
|
String hour = hourlyMap.get("fxTime").toString().split("T")[0];
|
String hour1 = hourlyMap.get("fxTime").toString().split("\\+")[0].split(":")[0].replace("T", " ");
|
if (hour.equals(nextDay)) {
|
nextDayList.add(hourlyMap);
|
}
|
if (hour1.equals(nextNextDay)) {
|
nextDayList.add(hourlyMap);
|
}
|
}
|
nextDayList.remove(0);
|
for (Map<String, Object> nextDayMap : nextDayList) {
|
String text = nextDayMap.get("text").toString();
|
String condition = "";
|
if ("晴".equals(text)) {
|
condition = "100";
|
} else if ("多云".equals(text)) {
|
condition = "80";
|
} else if ("阴".equals(text)) {
|
condition = "60";
|
} else if ("雷阵雨".equals(text) || "阵雨".equals(text)) {
|
condition = "40";
|
} else if ("小雨".equals(text)) {
|
condition = "20";
|
} else if ("雨".equals(text)) {
|
condition = "0";
|
}
|
nextDayMap.put("condition", condition);
|
}
|
map.put("data", nextDayList);
|
}
|
|
for (Map<String, Object> map : hashSet) {
|
List<Map<String, Object>> resultList = new ArrayList<>();
|
String cityCode = map.get("cityCode").toString();
|
map.put("startTime", startTime);
|
map.put("endTime", endTime);
|
map.put("typeFormat", "%Y-%m-%d %H:%i:%s");
|
Map<String, Object> map1 = new HashMap<>();
|
map1.put("typeFormat", "%Y-%m-%d %H:%i:%s");
|
map1.put("cityCode", Integer.valueOf(cityCode));
|
//根据city_code获取所有monitorPoint
|
Map<String, Object> params = new HashMap<>();
|
if (cityCode.endsWith("0000")) {
|
params.put("provinceCode", Integer.valueOf(cityCode));
|
} else if (cityCode.endsWith("00")) {
|
params.put("cityCode", Integer.valueOf(cityCode));
|
} else {
|
params.put("areaCode", Integer.valueOf(cityCode));
|
}
|
List<Integer> pointList = new ArrayList<>();
|
if (cityCode.equals("130900")) {
|
pointList.add(48);
|
} else {
|
pointList = monitorPointMapper.getMonitorList(params);
|
}
|
List<String> macList = deviceMapper.getMacsByMonitorPointIds(pointList);
|
if (macList.size() != 0) {
|
map.put("macs", macList);
|
}
|
ArrayList<Map<String, Object>> dataList = (ArrayList<Map<String, Object>>) map.get("data");
|
for (Map<String, Object> dataMap : dataList) {
|
Map<String, Object> hashMap = new HashMap<>();
|
hashMap.put("cityCode", cityCode);
|
String time = dataMap.get("fxTime").toString().split("\\+")[0].replace("T", " ") + ":00";
|
int hour = Integer.valueOf(time.substring(11, 13));
|
map.put("time", hour);
|
hashMap.put("time", sdf1.parse(time));
|
String nextDayTemp = dataMap.get("temp").toString();
|
String nextDayCloud = dataMap.get("cloud").toString();
|
Integer condition = Integer.valueOf(dataMap.get("condition").toString());
|
String value="";
|
if (condition >= 80) {
|
value = "80";
|
} else if (condition >= 40) {
|
value = "40";
|
} else if (condition >= 0) {
|
value = "0";
|
}
|
map.put("condition", value);
|
List<Map<String, Object>> tempAndCloudList = realWeatherMapper.getTempAndCloud(map);
|
List<String> times = new ArrayList<>();
|
for (Map<String, Object> tempAndCloudMap : tempAndCloudList) {
|
times.add(tempAndCloudMap.get("time").toString());
|
}
|
map.put("times", times);
|
map1.put("times", times);
|
map1.put("time", hour);
|
List<Map<String, Object>> O3List = aqiMapper.getO3(map1);
|
if (O3List.size() == 0) {
|
map1.put("cityCode", Integer.valueOf(map.get("parentCode").toString()));
|
O3List = aqiMapper.getO3(map1);
|
}
|
List<Map<String, Object>> beamList = new ArrayList<>();
|
if (map.get("macs") != null) {
|
beamList = historyHourlyMapper.getBeamByMacs(map);
|
}
|
for (Map<String, Object> tempAndCloudMap : tempAndCloudList) {
|
String time1 = tempAndCloudMap.get("time").toString();
|
for (Map<String, Object> beamMap : beamList) {
|
if (beamList.size() != 0) {
|
String time2 = beamMap.get("time").toString();
|
if (time1.equals(time2)) {
|
tempAndCloudMap.putAll(beamMap);
|
}
|
}
|
}
|
}
|
|
for (Map<String, Object> tempAndCloudMap : tempAndCloudList) {
|
String time1 = tempAndCloudMap.get("time").toString();
|
for (Map<String, Object> O3Map : O3List) {
|
if (O3List.size() != 0) {
|
String time3 = O3Map.get("time").toString();
|
if (time1.equals(time3)) {
|
tempAndCloudMap.putAll(O3Map);
|
}
|
}
|
}
|
}
|
|
double tempSum = 0.0;//温度和
|
double O3Sum = 0.0;//O3和
|
double sum1 = 0.0;//
|
double sum2 = 0.0;
|
|
double cloudSum = 0.0;//温度和
|
double beamSum = 0.0;//O3和
|
double sum3 = 0.0;//
|
double sum4 = 0.0;
|
int size = tempAndCloudList.size();
|
Map<String, Object> cmap = new HashMap<>();
|
cmap.put("time", hour);
|
for (Map<String, Object> listMap : tempAndCloudList) {
|
//O3
|
double temp = Double.valueOf(listMap.get("temp").toString().replace("\"", "").split("\\.")[0]);
|
if (listMap.get("O3") != null) {
|
double O3 = Double.valueOf(listMap.get("O3").toString().replace("\"", "").split("\\.")[0]);
|
tempSum = tempSum + temp;
|
O3Sum = O3Sum + O3;
|
sum1 = sum1 + temp * O3;
|
sum2 = sum2 + temp * temp;
|
}
|
//光照
|
double cloud = Double.valueOf(listMap.get("cloud").toString().replace("\"", "").split("\\.")[0]);
|
if (listMap.get("beam") != null) {
|
double beam = Double.valueOf(listMap.get("beam").toString().replace("\"", "").split("\\.")[0]);
|
cloudSum = cloudSum + cloud;
|
beamSum = beamSum + beam;
|
sum3 = sum3 + cloud * beam;
|
sum4 = sum4 + cloud * cloud;
|
}
|
}
|
|
if (tempSum != 0.0) {
|
double tempAvg = tempSum / size;
|
double O3Avg = O3Sum / size;
|
double b = (sum1 - size * tempAvg * O3Avg) / (sum2 - size * tempAvg * tempAvg);
|
double a = O3Avg - (b * tempAvg);
|
cmap.put("a", a);
|
cmap.put("b", b);
|
}
|
|
if (cloudSum != 0.0) {
|
double cloudAvg = cloudSum / size;
|
double beamAvg = beamSum / size;
|
double n = (sum3 - size * cloudAvg * beamAvg) / (sum4 - size * cloudAvg * cloudAvg);
|
double m = beamAvg - (n * cloudAvg);
|
cmap.put("m", m);
|
cmap.put("n", n);
|
}
|
if (cmap.get("a") != null) {
|
Double a = Double.valueOf(cmap.get("a").toString());
|
Double b = Double.valueOf(cmap.get("b").toString());
|
double O3C = b * Double.valueOf(nextDayTemp) + a;
|
if (O3C < 1.0) {
|
O3C=1.0;
|
}
|
dataMap.put("O3C", String.valueOf(Math.round(O3C)));
|
}
|
if (cmap.get("m") != null) {
|
Double m = Double.valueOf(cmap.get("m").toString());
|
Double n = Double.valueOf(cmap.get("n").toString());
|
double beam = n * Double.valueOf(nextDayCloud) + m;
|
if (beam < 1.0) {
|
beam=0.0;
|
}
|
dataMap.put("beam", String.valueOf(Math.round(beam)));
|
}
|
dataMap.remove("icon");
|
dataMap.remove("fxTime");
|
hashMap.put("json", JSONObject.toJSONString(dataMap));
|
resultList.add(hashMap);
|
}
|
Map<String, Object> parameters = new HashMap<>();
|
parameters.put("start", start);
|
parameters.put("end", end);
|
parameters.put("cityCode", cityCode);
|
forecastWeatherMapper.deleteByTime(parameters);
|
count = count + forecastWeatherMapper.insertForecastWeather(resultList);
|
}
|
return count;
|
}
|
}
|