123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846 |
- package com.jiayue.biz.service.impl;
- import cn.hutool.core.date.DateTime;
- import cn.hutool.core.lang.TypeReference;
- import cn.hutool.db.Entity;
- import cn.hutool.json.JSONArray;
- import com.alibaba.fastjson.JSON;
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import com.jiayue.biz.conf.RequestDataHelper;
- import com.jiayue.biz.domain.*;
- import com.jiayue.biz.mapper.WindTowerDataParentTableMapper;
- import com.jiayue.biz.service.*;
- import com.jiayue.biz.util.CalculationUtil;
- import com.jiayue.biz.util.CommonUtil;
- import com.jiayue.biz.util.FileUtil;
- import com.jiayue.common.core.text.Convert;
- import com.jiayue.common.utils.DateUtil;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.*;
- import java.math.BigDecimal;
- import java.math.RoundingMode;
- import java.net.URLEncoder;
- import java.nio.charset.StandardCharsets;
- import java.sql.Timestamp;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.*;
- import java.util.stream.Collectors;
- /**
- * 测风塔父表数据Service业务层处理
- *
- * @author whc
- * @date 2022-08-04
- */
- @Slf4j
- @Service
- public class WindTowerDataParentTableServiceImpl extends ServiceImpl<WindTowerDataParentTableMapper, WindTowerDataParentTable> implements WindTowerDataParentTableService {
- @Autowired
- WindTowerDataChildTableService windTowerDataChildTableService;
- @Autowired
- EquipmentAttributeServiceImpl equipmentAttributeService;
- @Autowired
- WindTowerInfoServiceImpl windTowerInfoService;
- @Autowired
- AnalysisLogServiceImpl analysisLogService;
- @Autowired
- DisplayConfigServiceImpl displayConfigService;
- @Autowired
- ProphaseAnemometryDataService prophaseAnemometryDataService;
- @Autowired
- ProphaseAnemometryDataOrgService prophaseAnemometryDataOrgService;
- @Autowired
- ProphaseWeatherDataOrgService prophaseWeatherDataOrgService;
- @Autowired
- ProphaseWeatherDataService prophaseWeatherDataService;
- /**
- * 组装数据
- *
- * @param allData 数据
- * @param equipmentId 设备编号
- * @param eTime 时间
- * @param type 文件类型
- * @param operation 操作类型(DataRecalculation数据重算)
- */
- public void packageData(List<Map<String, Object>> allData, String equipmentId, String eTime, String type, String operation, WindTowerInfo windTowerInfo) {
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
- if (type.equals("rld")) {
- simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- }
- if (type.equals("sld")) {
- simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmm");
- }
- if (type.equals("eol")) {
- simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm");
- }
- String eqNo = equipmentId;
- if (null == windTowerInfo) {
- List<WindTowerInfo> windTowerInfoList = windTowerInfoService.list();
- windTowerInfo = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(eqNo)).collect(Collectors.toList()).get(0);
- }
- String windTowerInfoHeights = windTowerInfo.getHeights();
- String windTowerInfoWdHeights = windTowerInfo.getWdHeights();
- String[] wdHeight = windTowerInfoWdHeights.split(",");
- String[] heights = windTowerInfoHeights.split(",");
- HashSet<String> heightAll = new HashSet<>();
- heightAll.addAll(Arrays.asList(wdHeight));
- heightAll.addAll(Arrays.asList(heights));
- try {
- //所有数据
- for (Map<String, Object> m : allData) {
- if (!operation.equals("DataRecalculation")) {
- this.packageOrgData(m, heightAll, simpleDateFormat, eqNo, "org");
- }
- //异常数据赋值为-99
- if (m.get("abnormalType") != null) {
- if (m.get("abnormalType").toString().contains(",")) {
- String[] abnormalTypes = m.get("abnormalType").toString().split(",");
- for (String abnormalType : abnormalTypes) {
- m.put(abnormalType, -99f);
- }
- } else {
- m.put(m.get("abnormalType").toString(), -99f);
- }
- }
- this.packageOrgData(m, heightAll, simpleDateFormat, eqNo, "noOrg");
- }
- } catch (Exception e) {
- log.error("处理文件数据入库错误:{}", e);
- }
- }
- public void packageOrgData(Map<String, Object> m, HashSet<String> heightAll, SimpleDateFormat simpleDateFormat, String equipmentId, String org) {
- for (String height : heightAll) {
- ProphaseAnemometryData one = new ProphaseAnemometryData();
- //组装子表数据
- one.setWsAve(m.get("wsAve_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wsAve_" + height)).setScale(2, RoundingMode.HALF_UP)));
- one.setWsMin(m.get("wsMin_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wsMin_" + height)).setScale(2, RoundingMode.HALF_UP)));
- one.setWsMax(m.get("wsMax_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wsMax_" + height)).setScale(2, RoundingMode.HALF_UP)));
- one.setWsSta(m.get("wsSta_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wsSta_" + height)).setScale(2, RoundingMode.HALF_UP)));
- one.setWsInst(m.get("wsInst_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wsInst_" + height)).setScale(2, RoundingMode.HALF_UP)));
- one.setWdAve(m.get("wdAve_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wdAve_" + height)).setScale(2, RoundingMode.HALF_UP)));
- one.setWdMax(m.get("wdMax_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wdMax_" + height)).setScale(2, RoundingMode.HALF_UP)));
- one.setWdMin(m.get("wdMin_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wdMin_" + height)).setScale(2, RoundingMode.HALF_UP)));
- one.setWdSta(m.get("wdSta_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wdSta_" + height)).setScale(2, RoundingMode.HALF_UP)));
- one.setWdInst(m.get("wdInst_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wdInst_" + height)).setScale(2, RoundingMode.HALF_UP)));
- one.setLayerHeight(height);
- one.setEquipmentId(equipmentId);
- if (m.get("time") != null) {
- try {
- try {
- one.setTs(new Timestamp(simpleDateFormat.parse(m.get("time").toString()).getTime()));
- } catch (ParseException e) {
- one.setTs(new Timestamp(new Date(Long.parseLong(m.get("time").toString())).getTime()));
- }
- } catch (Exception e) {
- log.error("时间转换异常:" + e);
- }
- }
- if (org.equals("org")) {
- prophaseAnemometryDataOrgService.insertOneWithNew(one);
- } else {
- prophaseAnemometryDataService.insertOneWithNew(one);
- }
- }
- ProphaseWeatherData prophaseAnemometryPublicData = new ProphaseWeatherData();
- prophaseAnemometryPublicData.setEquipmentId(equipmentId);
- if (m.get("paMax") != null)
- //kpa转hpa
- if (BigDecimal.valueOf(Double.parseDouble(m.get("paMax").toString())).compareTo(new BigDecimal(200)) < 0)
- prophaseAnemometryPublicData.setPaMax(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paMax").toString()).multiply(new BigDecimal(10)).setScale(2, RoundingMode.HALF_UP)));
- else
- prophaseAnemometryPublicData.setPaMax(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paMax").toString())));
- if (m.get("paMin") != null)
- //kpa转hpa
- if (BigDecimal.valueOf(Double.parseDouble(m.get("paMin").toString())).compareTo(new BigDecimal(200)) < 0)
- prophaseAnemometryPublicData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paMin").toString()).multiply(new BigDecimal(10)).setScale(2, RoundingMode.HALF_UP)));
- else
- prophaseAnemometryPublicData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paMin").toString())));
- if (m.get("paAve") != null)
- //kpa转hpa
- if (BigDecimal.valueOf(Double.parseDouble(m.get("paAve").toString())).compareTo(new BigDecimal(200)) < 0)
- prophaseAnemometryPublicData.setPaAve(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paAve").toString()).multiply(new BigDecimal(10)).setScale(2, RoundingMode.HALF_UP)));
- else
- prophaseAnemometryPublicData.setPaAve(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paAve").toString())));
- prophaseAnemometryPublicData.setPaSta(m.get("paSta") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paSta")).setScale(2, RoundingMode.HALF_UP)));
- prophaseAnemometryPublicData.setTMax(m.get("tMax") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("tMax")).setScale(2, RoundingMode.HALF_UP)));
- prophaseAnemometryPublicData.setTMin(m.get("tMin") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("tMin")).setScale(2, RoundingMode.HALF_UP)));
- prophaseAnemometryPublicData.setTAve(m.get("tAve") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("tAve")).setScale(2, RoundingMode.HALF_UP)));
- prophaseAnemometryPublicData.setTSta(m.get("tSta") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("tSta")).setScale(2, RoundingMode.HALF_UP)));
- prophaseAnemometryPublicData.setRhMax(m.get("rhMax") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("rhMax")).setScale(2, RoundingMode.HALF_UP)));
- prophaseAnemometryPublicData.setRhMin(m.get("rhMin") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("rhMin")).setScale(2, RoundingMode.HALF_UP)));
- prophaseAnemometryPublicData.setRhAve(m.get("rhAve") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("rhAve")).setScale(2, RoundingMode.HALF_UP)));
- prophaseAnemometryPublicData.setRhSta(m.get("rhSta") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("rhSta")).setScale(2, RoundingMode.HALF_UP)));
- //计算空气密度 1.293*(273/(273+温度摄氏度))*气压百帕/1013
- if (prophaseAnemometryPublicData.getTAve() != null && prophaseAnemometryPublicData.getPaAve() != null &&
- prophaseAnemometryPublicData.getTAve() != -99 && prophaseAnemometryPublicData.getPaAve() > 0) {
- BigDecimal airDensity = BigDecimal.valueOf(1.293).multiply(new BigDecimal(273).divide(new BigDecimal(273).add(BigDecimal.valueOf(prophaseAnemometryPublicData.getTAve())), 2, RoundingMode.HALF_UP)).multiply(BigDecimal.valueOf(prophaseAnemometryPublicData.getPaAve())).divide(new BigDecimal(1013), 2, RoundingMode.HALF_UP);
- prophaseAnemometryPublicData.setAirDensity(Convert.toFloat(airDensity));
- } else {
- //随机数 上限1.28 下限1.15
- Random random = new Random();
- int randNumber = random.nextInt(128 - 115 + 1) + 115;
- BigDecimal air = BigDecimal.valueOf(randNumber).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
- prophaseAnemometryPublicData.setAirDensity(Convert.toFloat(air));
- }
- if (m.get("time") != null) {
- try {
- try {
- prophaseAnemometryPublicData.setTs(new Timestamp(simpleDateFormat.parse(m.get("time").toString()).getTime()));
- } catch (ParseException e) {
- prophaseAnemometryPublicData.setTs(new Timestamp(new Date(Long.parseLong(m.get("time").toString())).getTime()));
- }
- } catch (Exception e) {
- log.error("时间转换异常:" + e);
- }
- }
- if (org.equals("org")) {
- prophaseWeatherDataOrgService.insertOne(prophaseAnemometryPublicData);
- } else {
- prophaseWeatherDataService.insertOne(prophaseAnemometryPublicData);
- }
- }
- //通道数据保存
- public void saveDataForTunnel(HashMap<String, BigDecimal> dataMap, HashSet<Integer> heightSet, String equipmentNo, String time) {
- Timestamp curentTimestamp = new Timestamp(DateUtil.parse(time).getTime());
- for (Integer height : heightSet) {
- // List<EquipmentAttribute> eqHeight = equipmentAttributes.stream().filter(e -> e.getFieldName().equals(height.toString())).collect(Collectors.toList());
- ProphaseAnemometryData prophaseAnemometryData = new ProphaseAnemometryData();
- prophaseAnemometryData.setLayerHeight(height.toString());
- prophaseAnemometryData.setWsAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsAve" + height) == null ? null : dataMap.get("wsAve" + height).toString())));
- prophaseAnemometryData.setWsMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsMin" + height) == null ? null : dataMap.get("wsMin" + height).toString())));
- prophaseAnemometryData.setWsMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsMax" + height) == null ? null : dataMap.get("wsMax" + height).toString())));
- prophaseAnemometryData.setWsSta(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsSta" + height) == null ? null : dataMap.get("wsSta" + height).toString())));
- prophaseAnemometryData.setWsInst(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsInst" + height) == null ? null : dataMap.get("wsInst" + height).toString())));
- prophaseAnemometryData.setWsGust(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsGust" + height) == null ? null : dataMap.get("wsGust" + height).toString())));
- prophaseAnemometryData.setWdAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wdAve" + height) == null ? null : dataMap.get("wdAve" + height).toString())));
- prophaseAnemometryData.setWdMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wdMax" + height) == null ? null : dataMap.get("wdMax" + height).toString())));
- prophaseAnemometryData.setWdMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wdMin" + height) == null ? null : dataMap.get("wdMin" + height).toString())));
- prophaseAnemometryData.setWdSta(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wdSta" + height) == null ? null : dataMap.get("wdSta" + height).toString())));
- prophaseAnemometryData.setWdInst(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wdInst" + height) == null ? null : dataMap.get("wdInst" + height).toString())));
- prophaseAnemometryData.setEquipmentId(equipmentNo);
- prophaseAnemometryData.setTs(curentTimestamp);
- prophaseAnemometryDataOrgService.insertOneWithNew(prophaseAnemometryData);
- prophaseAnemometryDataService.insertOneWithNew(prophaseAnemometryData);
- }
- ProphaseWeatherData prophaseWeatherData = new ProphaseWeatherData();
- prophaseWeatherData.setEquipmentId(equipmentNo);
- if (dataMap.get("paMax") != null) {
- //kpa转hpa
- if (BigDecimal.valueOf(Double.parseDouble(dataMap.get("paMax").toString())).compareTo(new BigDecimal(200)) < 0)
- prophaseWeatherData.setPaMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paMax").toString()).multiply(new BigDecimal(10)).setScale(4, RoundingMode.HALF_UP)));
- else
- prophaseWeatherData.setPaMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paMax").toString())));
- }
- if (dataMap.get("paMin") != null) {
- //kpa转hpa
- if (BigDecimal.valueOf(Double.parseDouble(dataMap.get("paMin").toString())).compareTo(new BigDecimal(200)) < 0)
- prophaseWeatherData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paMin").toString()).multiply(new BigDecimal(10)).setScale(4, RoundingMode.HALF_UP)));
- else
- prophaseWeatherData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paMin").toString())));
- }
- if (dataMap.get("paInst") != null) {
- //kpa转hpa
- if (BigDecimal.valueOf(Double.parseDouble(dataMap.get("paInst").toString())).compareTo(new BigDecimal(200)) < 0)
- prophaseWeatherData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paInst").toString()).multiply(new BigDecimal(10)).setScale(4, RoundingMode.HALF_UP)));
- else
- prophaseWeatherData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paInst").toString())));
- }
- if (dataMap.get("paAve") != null) {
- //kpa转hpa
- if (BigDecimal.valueOf(Double.parseDouble(dataMap.get("paAve").toString())).compareTo(new BigDecimal(200)) < 0)
- prophaseWeatherData.setPaAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paAve").toString()).multiply(new BigDecimal(10)).setScale(4, RoundingMode.HALF_UP)));
- else
- prophaseWeatherData.setPaAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paAve").toString())));
- }
- prophaseWeatherData.setPaSta(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paSta") == null ? null : dataMap.get("paSta").toString())));
- prophaseWeatherData.setTMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("tMax") == null ? null : dataMap.get("tMax").toString())));
- prophaseWeatherData.setTMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("tMin") == null ? null : dataMap.get("tMin").toString())));
- prophaseWeatherData.setTAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("tAve") == null ? null : dataMap.get("tAve").toString())));
- prophaseWeatherData.setTSta(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("tSta") == null ? null : dataMap.get("tSta").toString())));
- prophaseWeatherData.setTInst(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("tInst") == null ? null : dataMap.get("tInst").toString())));
- prophaseWeatherData.setRhMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("rhMax") == null ? null : dataMap.get("rhMax").toString())));
- prophaseWeatherData.setRhMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("rhMin") == null ? null : dataMap.get("rhMin").toString())));
- prophaseWeatherData.setRhAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("rhAve") == null ? null : dataMap.get("rhAve").toString())));
- prophaseWeatherData.setRhSta(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("rhSta") == null ? null : dataMap.get("rhSta").toString())));
- prophaseWeatherData.setRhInst(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("rhInst") == null ? null : dataMap.get("rhInst").toString())));
- //计算空气密度
- if (dataMap.get("tAve") != null && dataMap.get("paAve") != null) {
- BigDecimal airDensity = BigDecimal.valueOf(1.293).multiply(new BigDecimal(273).divide(new BigDecimal(273).add(dataMap.get("tAve")), 2, RoundingMode.HALF_UP)).multiply(dataMap.get("paAve")).divide(new BigDecimal(1013), 2, RoundingMode.HALF_UP);
- prophaseWeatherData.setAirDensity(Convert.toFloat(airDensity));
- }
- log.info("dataMap.get(tAve):{} ,,, {}", dataMap.get("tAve"), dataMap.get("paAve"));
- //设置时间
- prophaseWeatherData.setTs(curentTimestamp);
- prophaseWeatherDataService.insertOne(prophaseWeatherData);
- prophaseWeatherDataOrgService.insertOne(prophaseWeatherData);
- }
- /**
- * 根据时间范围和设备id查询数据
- *
- * @param startTime 开始时间
- * @param endTime 结束时间
- * @param equipmentId 设备id
- * @return List<Map < String, Object>>
- */
- public List<Map<String, Object>> selectDataByBetweenTimeAndEquipmetId(Date startTime, Date endTime, String equipmentId) {
- return selectByBetweenTimeAndEquipmetId(startTime, endTime, equipmentId);
- }
- /**
- * 根据条件查询数据并分页
- *
- * @param startTime 开始时间
- * @param endTime 结束时间
- * @param equipmentId 设备id
- * @return
- */
- public Map<String, Object> selectDataPageByBetweenTimeAndEquipmetId(Date startTime, Date endTime, String equipmentId, Integer pageNo, Integer pageSize) {
- List<Map<String, Object>> maps = selectByBetweenTimeAndEquipmetId(startTime, endTime, equipmentId);
- Map<String, Object> map = new HashMap<>();
- map.put("count", maps.size());
- map.put("list", maps.stream().skip((pageNo - 1) * pageSize).limit(pageSize).collect(Collectors.toList()));
- return map;
- }
- //原实时数据查询
- public List<Map<String, Object>> selectByBetweenTimeAndEquipmetIdOld(Date startTime, Date endTime, String equipmentId) {
- List<Entity> windTowerDataParentTables = baseMapper.selectDataByBetweenTimeAndEquipmetId(equipmentId, startTime, endTime);
- //entity转JOSN数组
- JSONArray array = new JSONArray(windTowerDataParentTables);
- //JSON数据转List<Map<String, Object>>
- List<Map<String, Object>> maps = JSON.parseObject(array.toString(), new TypeReference<List<Map<String, Object>>>() {
- });
- //最终转换后的map
- List<Map<String, Object>> newMaps = new ArrayList<>();
- // 数据库查出来的结果父一行 子多行 一父多子转换成一父一子
- for (int i = 0; i < maps.size(); i++) {
- Map<String, Object> newMap = new HashMap<>();
- int finalI = i;
- maps.get(i).forEach((key, value) -> {
- if (!newMaps.isEmpty()) {
- //有数据的情况下 如果parent_id相等 则代表应合并成一条
- if (newMaps.get(newMaps.size() - 1).get("parent_id").equals(maps.get(finalI).get("parent_id"))) {
- //只有风速风向有层高
- if (key.contains("ws_") || key.contains("wd_")) {
- newMaps.get(newMaps.size() - 1).put(key + maps.get(finalI).get("field_name"), value);
- }
- } else {
- if (key.contains("ws_") || key.contains("wd_")) {
- newMap.put(key + maps.get(finalI).get("field_name"), value);
- } else {
- newMap.put(key, value);
- }
- }
- } else {
- if (key.contains("ws_") || key.contains("wd_")) {
- newMap.put(key + maps.get(finalI).get("field_name"), value);
- } else {
- newMap.put(key, value);
- }
- }
- });
- //在合并数据的时候是直接往list里put newMap就是空的 如果直接add的话会报错空指针
- if (!newMap.isEmpty()) {
- newMaps.add(newMap);
- }
- }
- return newMaps;
- }
- /**
- * 实时数据查询
- *
- * @param timeBegin 开始时间
- * @param timeEnd 结束时间
- * @param equipmentId 设备编号
- * @return List<Map < String, Object>> 实时数据
- */
- private List<Map<String, Object>> selectByBetweenTimeAndEquipmetId(Date timeBegin, Date timeEnd, String equipmentId) {
- Timestamp startTime = new Timestamp(timeBegin.getTime());
- Timestamp endTime = new Timestamp(timeEnd.getTime());
- HashSet<String> heightSet = new HashSet<>();
- //获取测风塔数据
- List<WindTowerInfo> list = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, equipmentId).list();
- List<Map<String, Object>> mapList = new ArrayList<>();
- List<ProphaseAnemometryData> prophaseAnemometryPublicData = prophaseAnemometryDataOrgService.selectAll(equipmentId, startTime, endTime);
- List<ProphaseWeatherData> prophaseAnemometryPublicDataList = prophaseWeatherDataOrgService.selectPublicData(equipmentId, startTime, endTime);
- String heights = list.get(0).getHeights();
- String wdHeights = list.get(0).getWdHeights();
- //将层高加入list
- heightSet.addAll(Arrays.asList(heights.split(",")));
- heightSet.addAll(Arrays.asList(wdHeights.split(",")));
- //组装数据
- for (ProphaseWeatherData anemometryPublicData : prophaseAnemometryPublicDataList) {
- HashMap<String, Object> dataMap = new HashMap<>();
- List<ProphaseAnemometryData> prophaseAnemometryData = prophaseAnemometryPublicData.stream().filter(p -> p.getTs().getTime() == anemometryPublicData.getTs().getTime()).collect(Collectors.toList());
- dataMap.put("time", anemometryPublicData.getTs().getTime());
- dataMap.put("tAve", anemometryPublicData.getTAve());
- dataMap.put("tMax", anemometryPublicData.getTMax());
- dataMap.put("tMin", anemometryPublicData.getTMin());
- dataMap.put("tSta", anemometryPublicData.getTSta());
- dataMap.put("tInst", anemometryPublicData.getTInst());
- dataMap.put("rhAve", anemometryPublicData.getRhAve());
- dataMap.put("rhMax", anemometryPublicData.getRhMax());
- dataMap.put("rhMin", anemometryPublicData.getRhMin());
- dataMap.put("rhSta", anemometryPublicData.getRhSta());
- dataMap.put("rhInst", anemometryPublicData.getRhInst());
- dataMap.put("paAve", anemometryPublicData.getPaAve());
- dataMap.put("paMax", anemometryPublicData.getPaMax());
- dataMap.put("paMin", anemometryPublicData.getPaMin());
- dataMap.put("paSta", anemometryPublicData.getPaSta());
- dataMap.put("paInst", anemometryPublicData.getPaInst());
- dataMap.put("airdensity", anemometryPublicData.getAirDensity());
- if (prophaseAnemometryData.size() > 0) {
- for (ProphaseAnemometryData prophaseAnemometryDatum : prophaseAnemometryData) {
- dataMap.put("wsAve_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWsAve());
- dataMap.put("wsMax_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWsMax());
- dataMap.put("wsMin_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWsMin());
- dataMap.put("wsSta_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWsSta());
- dataMap.put("wsInst_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWsInst());
- dataMap.put("wdAve_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWdAve());
- dataMap.put("wdMax_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWdMax());
- dataMap.put("wdMin_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWdMin());
- dataMap.put("wdSta_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWdSta());
- dataMap.put("wdInst_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWdInst());
- }
- }
- //过滤value为空的数据
- Map<String, Object> collect = dataMap.entrySet().stream().filter(h -> h.getValue() != null).collect(Collectors.toMap(Map.Entry::getKey, h -> h.getValue()));
- mapList.add(collect);
- }
- return mapList;
- }
- /**
- * 导出测风塔数据
- *
- * @param startTime
- * @param endTime
- * @param equipmentId
- */
- public void export(HttpServletResponse response, Long startTime, Long endTime, String equipmentId) {
- try {
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- BufferedOutputStream bos = null;
- StringBuilder templateContent = new StringBuilder();
- List<Map<String, Object>> mapList = selectDataByBetweenTimeAndEquipmetId(new Date(startTime), new Date(endTime), equipmentId);
- //根据设备编号查找此场站显示的列
- List<DisplayConfig> displayConfigs = displayConfigService.findByDisplaySign(equipmentId);
- //把显示列分割数组
- String[] strings;
- if (displayConfigs.size() > 0) {
- strings = displayConfigs.get(0).getShowCode().split(",");
- } else {
- //获取层高根据层高拼
- //String s = "equipment_id,time,t_inst,t_max,t_min,t_ave,t_sta,rh_inst,rh_max,rh_min,rh_ave,rh_sta,pa_inst,pa_max,pa_min,pa_ave,ws_inst150,ws_max150,ws_min150,ws_ave150,ws_sta150,wd_inst150,wd_max150,wd_min150,wd_ave150,wd_sta150,ws_inst150A,ws_max150A,ws_min150A,ws_ave150A,ws_sta150A,wd_inst150A,wd_max150A,wd_min150A,wd_ave150A,wd_sta150A,ws_inst140,ws_max140,ws_min140,ws_ave140,ws_sta140,wd_inst140,wd_max140,wd_min140,wd_ave140,wd_sta140,ws_inst140A,ws_max140A,ws_min140A,ws_ave140A,ws_sta140A,wd_inst140A,wd_max140A,wd_min140A,wd_ave140A,wd_sta140A,ws_inst120,ws_max120,ws_min120,ws_ave120,ws_sta120,wd_inst120,wd_max120,wd_min120,wd_ave120,wd_sta120,ws_inst80,ws_max80,ws_min80,ws_ave80,ws_sta80,wd_inst80,wd_max80,wd_min80,wd_ave80,wd_sta80,ws_inst90,ws_max90,ws_min90,ws_ave90,ws_sta90,wd_inst90,wd_max90,wd_min90,wd_ave90,wd_sta90,ws_inst100,ws_max100,ws_min100,ws_ave100,ws_sta100,wd_inst100,wd_max100,wd_min100,wd_ave100,wd_sta100,ws_inst110,ws_max110,ws_min110,ws_ave110,ws_sta110,wd_inst110,wd_max110,wd_min110,wd_ave110,wd_sta110,ws_inst120,ws_max120,ws_min120,ws_ave120,ws_sta120,wd_inst120,wd_max120,wd_min120,wd_ave120,wd_sta120,wd_inst140,wd_max140,wd_min140,wd_ave140,wd_sta140,ws_inst140,ws_max140,ws_min140,ws_ave140,ws_sta140,wd_inst150,wd_max150,wd_min150,wd_ave150,wd_sta150,ws_inst150,ws_max150,ws_min150,ws_ave150,ws_sta150,airDensity";
- StringBuffer stringBuffer = new StringBuffer();
- stringBuffer.append("equipment_id")
- .append(",").append("time")
- .append(",").append("t_inst")
- .append(",").append("t_max")
- .append(",").append("t_min")
- .append(",").append("t_ave")
- .append(",").append("t_sta")
- .append(",").append("rh_inst")
- .append(",").append("rh_max")
- .append(",").append("rh_min")
- .append(",").append("rh_ave")
- .append(",").append("rh_sta")
- .append(",").append("pa_inst")
- .append(",").append("pa_max")
- .append(",").append("pa_min")
- .append(",").append("pa_ave")
- .append(",").append("pa_sta");
- //所有层高
- String[] height = {"200", "200A", "190", "190A", "180", "180A", "170", "170A", "160", "160A", "150", "150A", "140", "140A", "120", "120A", "110", "110A", "100", "100A", "90", "90A", "80", "80A", "70", "70A", "50", "50A", "30", "30A", "10", "10A"};
- Map<String, Object> map = new HashMap<>();
- if (!mapList.isEmpty()) {
- map = mapList.get(0);
- }
- //把拼装后的属性和共有的属性拼装
- StringBuffer key = getKey(height);
- stringBuffer.append(key);
- String[] strs = stringBuffer.toString().split(",");
- StringBuffer strBuffer = new StringBuffer();
- for (String s : strs) {
- if (map.get(s) != null) {
- strBuffer.append(s).append(",");
- }
- }
- strBuffer.append("air_density");
- strings = strBuffer.toString().split(",");
- }
- //表头
- String header = "";
- //内容
- StringBuilder content = new StringBuilder();
- for (String s : strings) {
- //获取动态的表头
- header += getName(s) + ",";
- }
- header += "\r\n";
- templateContent.append(header);
- //拼接内容
- if (!mapList.isEmpty()) {
- for (Map<String, Object> map : mapList) {
- for (String string : strings) {
- if (string.equals("time")) {
- content.append(sdf.format(map.get(string))).append(",");
- } else {
- content.append(map.get(string)).append(",");
- }
- }
- content.append("\r\n");
- }
- }
- templateContent.append(content);
- sdf = new SimpleDateFormat("yyyy-MM-dd");
- response.setContentType("application/x-msdownload;charset=UTF-8");// 文件下载必须配置为application/x-msdownload
- response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(sdf.format(startTime) + "至" + sdf.format(endTime) + "测风塔文件" + ".csv", "UTF-8"));// 中文文件名必须使用URLEncoder.encode进行转码
- byte[] templateContentBytes = new byte[0];
- templateContentBytes = templateContent.toString().getBytes(StandardCharsets.UTF_8);
- bos = new BufferedOutputStream(response.getOutputStream());// 向response中写入文件流
- bos.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});// 指定csv文件用UTF-8字符集打开
- bos.write(templateContentBytes);
- response.flushBuffer();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 导出测风塔数据文件
- *
- * @param equipmentId
- */
- public void exportAll(HttpServletRequest request, HttpServletResponse response, String equipmentId, Long startTime, Long endTime) {
- try {
- File dataFile = new File(FileUtil.getSystemFilePath() + File.separator + equipmentId);
- File[] files = dataFile.listFiles();
- String zipPath = FileUtil.getSystemFilePath() + File.separator + equipmentId + File.separator + equipmentId + "数据文件.zip";
- List<File> files1 = Arrays.stream(files).map(file -> {
- String name = file.getName();
- if (name.contains(".rld")) {
- String[] rldNameTime = name.split("_");
- long time = DateUtil.parse(rldNameTime[1], "yyyy-MM-dd").getTime();
- if (time >= startTime && time <= endTime) {
- return file;
- }
- } else if (name.contains(".RWD")) {
- String rwdNameTime = name.substring(equipmentId.length(), equipmentId.length() + 8);
- long time = DateUtil.parse(rwdNameTime, "yyyyMMdd").getTime();
- if (time >= startTime && time <= endTime) {
- return file;
- }
- } else if (name.contains(".elog")) {
- String[] elogNameTime = name.split("_");
- long time = DateUtil.parse(elogNameTime[1], "yyyyMMdd").getTime();
- if (time >= startTime && time <= endTime) {
- return file;
- }
- }
- return null;
- }).filter(file -> file != null && file.getName().contains(equipmentId)).collect(Collectors.toList());
- String[] strDir = new String[files1.size()];
- for (int i = 0; i < files1.size(); i++) {
- strDir[i] = files1.get(i).toString();
- }
- FileOutputStream fos2 = new FileOutputStream(new File(zipPath));
- //压缩
- CommonUtil.toZip(strDir, fos2, true);
- downLoadFile(request, response, zipPath);
- File deleteFile = new File(zipPath);
- //下载完删除本地压缩包
- deleteFile.delete();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 文件下载
- *
- * @param request HttpServletRequest
- * @param response HttpServletResponse
- * @param zipPath 路径
- */
- public void downLoadFile(HttpServletRequest request,
- HttpServletResponse response,
- String zipPath) {
- response.setContentType("text/html;charset=utf-8");
- try {
- request.setCharacterEncoding("UTF-8");
- } catch (UnsupportedEncodingException e1) {
- log.error("系统错误:" + e1.getMessage(), e1);
- }
- InputStream ins = null;
- BufferedInputStream bins = null;
- try {
- File df = new File(zipPath);
- ins = new FileInputStream(df);
- bins = new BufferedInputStream(ins);
- OutputStream outs = response.getOutputStream();
- BufferedOutputStream bouts = new BufferedOutputStream(outs);
- response.setHeader("Content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(df.getName(), "UTF-8"));
- response.setContentType("application/x-msdownload; charset=utf-8");
- int bytesRead = 0;
- byte[] buffer = new byte[8192];
- while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {
- bouts.write(buffer, 0, bytesRead);
- }
- bouts.flush();
- bouts.close();
- } catch (Exception e) {
- log.error("系统错误:" + e.getMessage(), e);
- } finally {
- if (bins != null) {
- try {
- bins.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (ins != null) {
- try {
- ins.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- /**
- * 根据传入的层高 返回拼装的属性
- *
- * @param height 层高
- * @return
- */
- private StringBuffer getKey(String[] height) {
- StringBuffer strings = new StringBuffer();
- for (String s : height) {
- strings.append(",").append("ws_inst").append(s).append(",").append("ws_max").append(s).append(",").append("ws_min").append(s).append(",").append("ws_ave").append(s).append(",").append("ws_sta").append(s).append(",").append("wd_inst").append(s).append(",").append("wd_max").append(s).append(",").append("wd_min").append(s).append(",").append("wd_ave").append(s).append(",").append("wd_sta").append(s);
- }
- return strings;
- }
- /**
- * 根据属性名返回表头
- *
- * @param name 属性名
- * @return
- */
- private String getName(String name) {
- if (name.equals("equipment_id")) {
- return "设备编号";
- } else if (name.equals("time")) {
- return "时间";
- } else if (name.equals("t_inst")) {
- return "温度瞬时值";
- } else if (name.equals("t_max")) {
- return "温度最大值";
- } else if (name.equals("t_min")) {
- return "温度最小值";
- } else if (name.equals("t_ave")) {
- return "温度平均值";
- } else if (name.equals("t_sta")) {
- return "温度标差值";
- } else if (name.equals("rh_inst")) {
- return "湿度瞬时值";
- } else if (name.equals("rh_max")) {
- return "湿度最大值";
- } else if (name.equals("rh_min")) {
- return "湿度最小值";
- } else if (name.equals("rh_ave")) {
- return "湿度平均值";
- } else if (name.equals("rh_sta")) {
- return "湿度标差值";
- } else if (name.equals("pa_inst")) {
- return "气压瞬时值";
- } else if (name.equals("pa_max")) {
- return "气压最大值";
- } else if (name.equals("pa_min")) {
- return "气压最小值";
- } else if (name.equals("pa_ave")) {
- return "气压平均值";
- } else if (name.equals("pa_sta")) {
- return "气压标差值";
- } else if (name.contains("ws_inst")) {
- return name.substring(7) + "米风速瞬时值";
- } else if (name.contains("ws_max")) {
- return name.substring(6) + "米风速最大值";
- } else if (name.contains("ws_min")) {
- return name.substring(6) + "米风速最小值";
- } else if (name.contains("ws_ave")) {
- return name.substring(6) + "米风速平均值";
- } else if (name.contains("ws_sta")) {
- return name.substring(6) + "米风速标差值";
- } else if (name.contains("wd_inst")) {
- return name.substring(7) + "米风向瞬时值";
- } else if (name.contains("wd_max")) {
- return name.substring(6) + "米风向最大值";
- } else if (name.contains("wd_min")) {
- return name.substring(6) + "米风向最小值";
- } else if (name.contains("wd_ave")) {
- return name.substring(6) + "米风向平均值";
- } else if (name.contains("wd_sta")) {
- return name.substring(6) + "米风向标差值";
- } else if (name.equals("air_density")) {
- return "空气密度";
- } else {
- return "";
- }
- }
- /**
- * 存一条数据
- *
- * @param windTowerDataParentTable
- * @param windTowerDataChildTable
- * @param equipmentId
- */
- public void saveByEquipmentId(WindTowerDataParentTable windTowerDataParentTable, WindTowerDataChildTable windTowerDataChildTable, String equipmentId) {
- Map<String, Object> map = new HashMap<>();
- map.put("equipment_id", equipmentId);
- RequestDataHelper.setRequestData(map);
- windTowerDataChildTableService.saveByEquipmentId(windTowerDataChildTable, equipmentId);
- this.save(windTowerDataParentTable);
- }
- /**
- * 存多条数据
- *
- * @param windTowerDataParentTableList
- * @param windTowerDataChildTableList
- * @param equipmentId
- */
- public void saveBatchByEquipmentId(List<WindTowerDataParentTable> windTowerDataParentTableList, List<WindTowerDataChildTable> windTowerDataChildTableList, String equipmentId) {
- Map<String, Object> map = new HashMap<>();
- map.put("equipment_id", equipmentId);
- RequestDataHelper.setRequestData(map);
- windTowerDataChildTableService.saveBatchByEquipmentId(windTowerDataChildTableList, equipmentId);
- this.saveBatch(windTowerDataParentTableList);
- }
- /**
- * 删除数据
- *
- * @param equipmentId 设备编号
- * @param startTime 开始时间
- * @param endTime 结束时间
- */
- public void deleteDataByBetweenTimeAndEquipmetId(Date startTime, Date endTime, String equipmentId) {
- baseMapper.deleteDataByBetweenTimeAndEquipmetId(equipmentId, startTime, endTime);
- }
- /**
- * 删除父表数据
- *
- * @param startTime 开始时间
- * @param endTime 结束时间
- * @param equipmentId 设备编号
- */
- public void deleteBetweenTimeAndEquipmentIdAndParent(Date startTime, Date endTime, String equipmentId) {
- baseMapper.deleteBetweenTimeAndEquipmentIdAndParent(equipmentId, startTime, endTime);
- }
- /**
- * 数据完整性
- *
- * @param equipmentId 设备编号
- * @return List<Map < String, Object>>
- */
- public List<Map<String, Object>> countDataIntegrity(String equipmentId, String startTime, String endTime) {
- return baseMapper.countDataIntegrity(equipmentId, startTime, endTime);
- }
- /**
- * 根据设备编号获取该设备的第一条数据
- *
- * @param equipmentId 设备编号
- * @return WindTowerDataParentTable
- */
- public WindTowerDataParentTable getFirstData(String equipmentId) {
- return baseMapper.getFirstData(equipmentId);
- }
- /**
- * 根据设备编号获取该设备的最后一条数据
- *
- * @param equipmentId 设备编号
- * @return WindTowerDataParentTable
- */
- public WindTowerDataParentTable getLastData(String equipmentId) {
- return baseMapper.getLastData(equipmentId);
- }
- /**
- * 根据设备编号获取最新一天的数据
- *
- * @param equipmentId 设备编号
- * @return List<Map < String, Object>>
- */
- public List<Map<String, Object>> getStartTimeAndEndTimeForData(String equipmentId) {
- WindTowerDataParentTable towerDataParentTableServiceLastData = getLastData(equipmentId);
- Date endTime = towerDataParentTableServiceLastData.getTime();
- DateTime dateTime = DateUtil.beginOfDay(endTime);
- return selectDataByBetweenTimeAndEquipmetId(new Date(dateTime.getTime()), endTime, equipmentId);
- }
- }
|