package com.gyee.power.fitting.service.custom.curve; import com.gyee.power.fitting.common.alg.PowerProcessALG; import com.gyee.power.fitting.common.alg.WindDirectionALG; import com.gyee.power.fitting.common.config.GyeeConfig; import com.gyee.power.fitting.common.constants.Constants; import com.gyee.power.fitting.common.spring.InitialRunner; import com.gyee.power.fitting.common.util.FileUtil; import com.gyee.power.fitting.common.util.PowerFittingUtil; import com.gyee.power.fitting.common.util.SnowFlakeUtil; import com.gyee.power.fitting.model.ProBasicModelPower; import com.gyee.power.fitting.model.ProEconPowerFittingAnalySis; import com.gyee.power.fitting.model.anno.AnnotationTool; import com.gyee.power.fitting.model.anno.FixedVo; import com.gyee.power.fitting.model.custom.PowerPointData; import com.gyee.power.fitting.model.custom.TableTitle; import com.gyee.power.fitting.service.ProEconPowerFittingAnalySisService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class DataProcessService { @Autowired private GyeeConfig config; @Autowired private ProEconPowerFittingAnalySisService powerService; /** * 数据预处理 * * @param ids 预处理数据的ID * @param maxs 最大风速 * @param mins 最小风速 * @param maxp 最大功率 * @param minp 最小功率 * @param isfbw 是否并网 * @param isfhl 是否合理值 * @param isbw 并网后10分钟 * @param istj 停机前10分钟 * @param isglpc 功率曲线偏差 * @param isqfh 是否欠符合 * @param qfhdj 欠符合等级 * @return */ public void dataProcess(List ids, Double maxs, Double mins, Double maxp, Double minp, Boolean isfbw, Boolean isfhl, Boolean isbw, Boolean istj, Boolean isglpc, Boolean isqfh, Integer qfhdj) { ids.forEach(id -> { ProEconPowerFittingAnalySis obj = powerService.selectItemById(id); if (obj == null) return; /** 读取csv数据 转换成对象数组 **/ List eis = new ArrayList<>(); List list = FileUtil.readFile(obj.getPath(), true); for (int i = 1; i < list.size(); i++) { eis.add(new PowerPointData(list.get(i).split(","), false)); } /** 风速 -> 保证功率 来自数据库 **/ List modelPowerList = InitialRunner.modelPowerDetailNewMap.get(InitialRunner.wtNewMap.get(obj.getWindturbineId()).getModelId()); Map modelPowerMap = modelPowerList.stream().collect(Collectors.toMap(ProBasicModelPower::getSpeed, ProBasicModelPower::getEnsurePower)); /** 数据预处理 **/ List data = PowerProcessALG.dataProcess(eis, modelPowerMap, maxs, mins, maxp, minp, isfbw, isfhl, isbw, istj, isglpc, isqfh, qfhdj); /** 静风频率 **/ List ls = WindDirectionALG.frequency(data.stream().map(PowerPointData::getSpeed).collect(Collectors.toList()), 3); double frequency = ls.get(0); double speed = ls.get(1); String content = assemble(data); String fileName = config.getFilePathProcess() + obj.getStation() + "_" + obj.getCode() + "_" + SnowFlakeUtil.generateIdL() / 100000 + ".csv"; boolean flag = FileUtil.writeFile(fileName, content); if (flag) { // TODO 保存数据库 obj.setPath(fileName); obj.setFrequency(frequency); obj.setSpeedavg(speed); obj.setType(Constants.DATA_PROCESS); powerService.insertItem(obj); } System.out.println("功率曲线拟合数据预处理完成:" + obj.getWindturbineId()); }); } /** * 数据预处理模块展示 tree * * @return */ public List dataProcessTree() { List list = powerService.selectList(Constants.DATA_PROCESS); List ls = PowerFittingUtil.powerDataTree(list, Constants.DATA_PROCESS); return ls; } /** * 组装表格数据 * @param id * @return */ public Map dataProcessShow(String id){ Map map = new HashMap<>(); /** 添加标题 **/ List fxList = AnnotationTool.getFixedVoList(PowerPointData.class); List lt = fxList.stream().map(d -> new TableTitle(d.getName(), d.getDes())).collect(Collectors.toList()); /** 添加内容 读取前500行 **/ List list = new ArrayList<>(); ProEconPowerFittingAnalySis obj = powerService.selectItemById(id); List ls = FileUtil.readFile(obj.getPath(), false); for (int i = 1; i < ls.size(); i++){ String[] split = ls.get(i).split(","); PowerPointData data = new PowerPointData(split, true); list.add(data); } map.put("title", lt); map.put("data", list); return map; } private String assemble(List list) { StringBuilder sb = setTitle(); for (PowerPointData obj : list){ List ls = AnnotationTool.getValueList(obj); String data = ls.stream().filter(f -> !StringUtils.isEmpty(f.getRemark())).map(FixedVo::getKey).collect(Collectors.joining(",")); sb.append(data).append("\n"); } return sb.toString(); } private StringBuilder setTitle() { StringBuilder sb = new StringBuilder(); List list = AnnotationTool.getFixedVoList(PowerPointData.class); String columnName = list.stream().map(FixedVo::getDes).collect(Collectors.joining(",")); sb.append(columnName).append("\n"); return sb; } }