From 3bc015d338ec545a5a8e9251d71a7f5e1f21d799 Mon Sep 17 00:00:00 2001 From: hongawen <83944980@qq.com> Date: Thu, 6 Apr 2023 16:03:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/CustomReportServiceImpl.java | 53 +++++++--- .../mysql/Impl/line/ReportServiceImpl.java | 97 ++++++++++++++----- 2 files changed, 110 insertions(+), 40 deletions(-) diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/CustomReportServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/CustomReportServiceImpl.java index 1b9f7f35e..2b7a85fda 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/CustomReportServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/CustomReportServiceImpl.java @@ -2,6 +2,7 @@ package com.njcn.harmonic.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.StrPool; import cn.hutool.core.util.StrUtil; import cn.hutool.json.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -182,11 +183,11 @@ public class CustomReportServiceImpl implements CustomReportService { } @Override - public void viewCustomReportTemplateById(String id,HttpServletResponse response){ + public void viewCustomReportTemplateById(String id, HttpServletResponse response) { ExcelRptTemp excelRptTemp = excelRptTempMapper.selectById(id); - try{ - fileStorageUtil.downloadStream(response,excelRptTemp.getContent()); - }catch (Exception exception){ + try { + fileStorageUtil.downloadStream(response, excelRptTemp.getContent()); + } catch (Exception exception) { throw new BusinessException(HarmonicResponseEnum.REPORT_TEMPLATE_DOWNLOAD_ERROR); } @@ -221,22 +222,28 @@ public class CustomReportServiceImpl implements CustomReportService { @Override - public void getCustomReport(ReportSearchParam reportSearchParam, HttpServletResponse response) { + public void getCustomReport(ReportSearchParam reportSearchParam, HttpServletResponse response) { ExcelRptTemp excelRptTemp = excelRptTempMapper.selectById(reportSearchParam.getTempId()); if (Objects.isNull(excelRptTemp)) { throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_ACTIVE); } //先查询库里是否存在已解析的报表数据,存在直接返回/不存在解析数据 LambdaQueryWrapper lambdaQuery = new LambdaQueryWrapper<>(); - lambdaQuery.eq(ExcelRpt::getLineId, reportSearchParam.getLineId()).eq(ExcelRpt::getTempId, reportSearchParam.getTempId()); - List excelRpts = excelRptMapper.selectList(lambdaQuery); - try{ - if (excelRpts.size() > 0) { - fileStorageUtil.downloadStream(response, excelRpts.get(0).getContent()); + lambdaQuery + .eq(ExcelRpt::getLineId, reportSearchParam.getLineId()) + .eq(ExcelRpt::getTempId, reportSearchParam.getTempId()) + //年季月周日 + .eq(ExcelRpt::getType, reportSearchParam.getType()) + //报表日期 + .eq(ExcelRpt::getDataDate, reportSearchParam.getStartTime()); + ExcelRpt excelRpts = excelRptMapper.selectOne(lambdaQuery); + try { + if (Objects.nonNull(excelRpts)) { + fileStorageUtil.downloadStream(response, excelRpts.getContent()); } else { fileStorageUtil.downloadStream(response, analyzeReport(reportSearchParam, excelRptTemp)); } - }catch (Exception exception){ + } catch (Exception exception) { throw new BusinessException(HarmonicResponseEnum.REPORT_DOWNLOAD_ERROR); } @@ -351,18 +358,18 @@ public class CustomReportServiceImpl implements CustomReportService { } + /** * 解析报表数据 */ private String analyzeReport(ReportSearchParam reportSearchParam, ExcelRptTemp excelRptTemp) { //根据content,获取v值并进行处理 List reportTemplateDTOList = new ArrayList<>(); - JSONArray jsonArray = null; + JSONArray jsonArray ; + InputStream fileStream = null; try { //通过文件服务器获取 -// String objectUrl = fileStorageUtil.getFileUrl(excelRptTemp.getContent()); -// jsonArray = JSONUtil.parseArray(urlToString(objectUrl)); - InputStream fileStream = fileStorageUtil.getFileStream(excelRptTemp.getContent()); + fileStream = fileStorageUtil.getFileStream(excelRptTemp.getContent()); jsonArray = new JSONArray(new JSONTokener(fileStream, new JSONConfig())); jsonArray.forEach(item -> { JSONObject jsonObject = (JSONObject) item; @@ -405,6 +412,12 @@ public class CustomReportServiceImpl implements CustomReportService { }); } catch (Exception e) { throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_JSON); + }finally { + try { + fileStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } } List endList = new ArrayList<>(); @@ -502,8 +515,16 @@ public class CustomReportServiceImpl implements CustomReportService { if (!InfluxDBTableConstant.DATA_FLICKER.equals(data.getClassId()) && !InfluxDBTableConstant.DATA_FLUC.equals(data.getClassId()) && !InfluxDBTableConstant.DATA_PLT.equals(data.getClassId())) { sql.append(InfluxDBSqlConstant.AND).append(InfluxDBTableConstant.VALUE_TYPE).append(InfluxDBSqlConstant.EQ).append(InfluxDBSqlConstant.QM).append(data.getStatMethod()).append(InfluxDBSqlConstant.QM); } - sql.append(InfluxDBSqlConstant.TZ); + //时间范围处理 + sql + .append(InfluxDBSqlConstant.AND) + .append("time ").append(InfluxDBSqlConstant.GE).append("'").append(reportSearchParam.getStartTime()).append(InfluxDBSqlConstant.START_TIME).append("'") + .append(InfluxDBSqlConstant.AND) + .append("time ").append(InfluxDBSqlConstant.LT).append("'").append(reportSearchParam.getEndTime()).append(InfluxDBSqlConstant.END_TIME).append("'"); + + sql.append(InfluxDBSqlConstant.TZ); + System.out.println(sql); //根据不同的库表赋值 QueryResult queryResult = influxDbUtils.query(String.valueOf(sql)); diff --git a/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/Impl/line/ReportServiceImpl.java b/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/Impl/line/ReportServiceImpl.java index 387d6ec35..3c887488e 100644 --- a/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/Impl/line/ReportServiceImpl.java +++ b/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/Impl/line/ReportServiceImpl.java @@ -1,6 +1,8 @@ package com.njcn.prepare.harmonic.service.mysql.Impl.line; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.*; @@ -17,7 +19,6 @@ import com.njcn.harmonic.pojo.po.ExcelRptTemp; import com.njcn.influxdb.param.InfluxDBSqlConstant; import com.njcn.influxdb.param.InfluxDBTableConstant; import com.njcn.influxdb.utils.InfluxDbUtils; -import com.njcn.minioss.bo.MinIoUploadResDTO; import com.njcn.oss.constant.OssPath; import com.njcn.oss.utils.FileStorageUtil; import com.njcn.prepare.harmonic.constant.AlgorithmParam; @@ -37,14 +38,15 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile; -import javax.annotation.Resource; import java.io.*; import java.net.URL; +import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; /** * 自定义报表 + * * @author qijian * @date 2022/10/20 */ @@ -79,7 +81,7 @@ public class ReportServiceImpl implements ReportService { //有监测点,匹配监测点的数据进行处理 //无监测点,查询稳态所有监测点 List list = reportParam.getLineIds(); - if (CollUtil.isEmpty(list)){ + if (CollUtil.isEmpty(list)) { list = new ArrayList<>(); Map> map = deptLineFeignClient.getLineByDeptRelation(AlgorithmParam.STEADY_STATE).getData(); Collection> values = map.values(); @@ -89,39 +91,47 @@ public class ReportServiceImpl implements ReportService { } //根据content进行处理 - List dataList = new ArrayList<>(); - JSONArray jsonArray = null; + List dataList; + JSONArray jsonArray; for (ExcelRptTemp excelRptTemp : reportTemplateList) { + InputStream fileStream = null; try { //获取content解析数据 -// String objectUrl = fileStorageUtil.getFileUrl(excelRptTemp.getContent()); -// jsonArray = JSONUtil.parseArray(urlToString(objectUrl)); - InputStream fileStream = fileStorageUtil.getFileStream(excelRptTemp.getContent()); + fileStream = fileStorageUtil.getFileStream(excelRptTemp.getContent()); jsonArray = new JSONArray(new JSONTokener(fileStream, new JSONConfig())); dataList = getDataList(jsonArray); } catch (Exception e) { throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_JSON); + }finally { + try { + fileStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } } //查询influxDB数据 List endList = new ArrayList<>(); for (String lineId : list) { + //先判断该模板是否是当前监测点部门的 + + if (CollUtil.isNotEmpty(dataList)) { //开始组织sql dataList.stream().forEach(data -> { StringBuilder sql = new StringBuilder(InfluxDBSqlConstant.SELECT); switch (data.getStatMethod()) { case InfluxDBTableConstant.MAX: - assSql(data, sql, endList, InfluxDBSqlConstant.MAX, lineId); + assSql(data, sql, endList, InfluxDBSqlConstant.MAX, lineId, reportParam); break; case InfluxDBTableConstant.MIN: - assSql(data, sql, endList, InfluxDBSqlConstant.MIN, lineId); + assSql(data, sql, endList, InfluxDBSqlConstant.MIN, lineId, reportParam); break; case InfluxDBTableConstant.AVG: - assSql(data, sql, endList, InfluxDBSqlConstant.AVG, lineId); + assSql(data, sql, endList, InfluxDBSqlConstant.AVG, lineId, reportParam); break; case InfluxDBTableConstant.CP95: - assSql(data, sql, endList, InfluxDBSqlConstant.CP95, lineId); + assSql(data, sql, endList, InfluxDBSqlConstant.CP95, lineId, reportParam); break; default: break; @@ -141,9 +151,9 @@ public class ReportServiceImpl implements ReportService { //周:例如2022年第五周,传入2022-01-23(周一)进行匹配,有则更新无则插入 //日:直接插入,无需配对 //文件上传到文件服务器,存入文件名 - if (BizParamConstant.STAT_BIZ_DAY.equals(reportParam.getType().toString())){ + if (BizParamConstant.STAT_BIZ_DAY.equals(reportParam.getType().toString())) { rptInsert(reportParam, lineId, excelRptTemp, contentToOss(jsonArray.toString())); - }else{ + } else { rptBiz(reportParam, lineId, excelRptTemp, contentToOss(jsonArray.toString())); } } @@ -154,14 +164,15 @@ public class ReportServiceImpl implements ReportService { /** * rpt业务方法 + * * @param reportParam,lineId,excelRptTemp,afterContent 参数 * @return 结果 */ private void rptBiz(LineParam reportParam, String lineId, ExcelRptTemp excelRptTemp, String afterContent) { LambdaQueryWrapper lambdaQuery = new LambdaQueryWrapper<>(); - lambdaQuery.eq(ExcelRpt::getLineId, lineId).eq(ExcelRpt::getTempId, excelRptTemp.getId()).eq(ExcelRpt::getType, reportParam.getType()).eq(ExcelRpt::getDataDate,reportParam.getDataDate()); + lambdaQuery.eq(ExcelRpt::getLineId, lineId).eq(ExcelRpt::getTempId, excelRptTemp.getId()).eq(ExcelRpt::getType, reportParam.getType()).eq(ExcelRpt::getDataDate, reportParam.getDataDate()); ExcelRpt excelRpt = excelRptMapper.selectOne(lambdaQuery); - if (excelRpt != null){ + if (excelRpt != null) { excelRpt.setContent(afterContent); excelRptMapper.updateById(excelRpt); } else { @@ -171,6 +182,7 @@ public class ReportServiceImpl implements ReportService { /** * 新增rpt方法 + * * @param reportParam,lineId,excelRptTemp,afterContent 参数 * @return 结果 */ @@ -190,6 +202,7 @@ public class ReportServiceImpl implements ReportService { /** * 根据数据填充content + * * @param jsonArray 参数 * @return 结果 */ @@ -225,6 +238,7 @@ public class ReportServiceImpl implements ReportService { /** * 获取content解析数据 + * * @param jsonArray 参数 * @return 结果 */ @@ -274,15 +288,17 @@ public class ReportServiceImpl implements ReportService { /** * 组装influxDB查询sql,查询value并封装endlist + * * @param data,sql,endList,method,reportSearchParam 参数 + * @param reportParam * @return 结果 */ - private void assSql(ReportTemplateDTO data, StringBuilder sql, List endList, String method, String lineId) { + private void assSql(ReportTemplateDTO data, StringBuilder sql, List endList, String method, String lineId, LineParam reportParam) { //sql拼接示例:select MAX(IHA2) as IHA2 from power_quality_data where Phase = 'A' and LineId='1324564568' and Stat_Method='max' tz('Asia/Shanghai') //cp95函数特殊处理 PERCENTILE(field_key, N) - if (InfluxDBSqlConstant.CP95.equals(method)){ + if (InfluxDBSqlConstant.CP95.equals(method)) { sql.append(method).append(InfluxDBSqlConstant.LBK).append(data.getTemplateName()).append(InfluxDBSqlConstant.NUM_95).append(InfluxDBSqlConstant.RBK).append(InfluxDBSqlConstant.AS_VALUE); - }else{ + } else { sql.append(method).append(InfluxDBSqlConstant.LBK).append(data.getTemplateName()).append(InfluxDBSqlConstant.RBK).append(InfluxDBSqlConstant.AS_VALUE); } sql.append(InfluxDBSqlConstant.FROM).append(data.getClassId()).append(InfluxDBSqlConstant.WHERE).append(InfluxDBTableConstant.LINE_ID).append(InfluxDBSqlConstant.EQ).append(InfluxDBSqlConstant.QM).append(lineId).append(InfluxDBSqlConstant.QM); @@ -292,11 +308,44 @@ public class ReportServiceImpl implements ReportService { } //data_flicker、data_fluc、data_plt 无 value_type - if (!InfluxDBTableConstant.DATA_FLICKER.equals(data.getClassId()) && !InfluxDBTableConstant.DATA_FLUC.equals(data.getClassId()) && !InfluxDBTableConstant.DATA_PLT.equals(data.getClassId())){ + if (!InfluxDBTableConstant.DATA_FLICKER.equals(data.getClassId()) && !InfluxDBTableConstant.DATA_FLUC.equals(data.getClassId()) && !InfluxDBTableConstant.DATA_PLT.equals(data.getClassId())) { sql.append(InfluxDBSqlConstant.AND).append(InfluxDBTableConstant.VALUE_TYPE).append(InfluxDBSqlConstant.EQ).append(InfluxDBSqlConstant.QM).append(data.getStatMethod()).append(InfluxDBSqlConstant.QM); } + String startTime; + String endTime; + DateTime dateTime = new DateTime(reportParam.getDataDate(), DatePattern.NORM_DATE_PATTERN); + //时间范围需要处理下 + switch (reportParam.getType()){ + case 1: + startTime = DateUtil.beginOfYear(dateTime).toString(DatePattern.NORM_DATETIME_PATTERN); + endTime = DateUtil.endOfYear(dateTime).toString(DatePattern.NORM_DATETIME_PATTERN); + break; + case 2: + startTime = DateUtil.beginOfQuarter(dateTime).toString(DatePattern.NORM_DATETIME_PATTERN); + endTime = DateUtil.endOfQuarter(dateTime).toString(DatePattern.NORM_DATETIME_PATTERN); + break; + case 3: + startTime = DateUtil.beginOfMonth(dateTime).toString(DatePattern.NORM_DATETIME_PATTERN); + endTime = DateUtil.endOfMonth(dateTime).toString(DatePattern.NORM_DATETIME_PATTERN); + break; + case 4: + startTime = DateUtil.beginOfWeek(dateTime).toString(DatePattern.NORM_DATETIME_PATTERN); + endTime = DateUtil.endOfWeek(dateTime).toString(DatePattern.NORM_DATETIME_PATTERN); + break; + default: + startTime = DateUtil.beginOfDay(dateTime).toString(DatePattern.NORM_DATETIME_PATTERN); + endTime = DateUtil.endOfDay(dateTime).toString(DatePattern.NORM_DATETIME_PATTERN); + break; + } + sql + .append(InfluxDBSqlConstant.AND) + .append("time ").append(InfluxDBSqlConstant.GE).append("'").append(startTime).append("'") + .append(InfluxDBSqlConstant.AND) + .append("time ").append(InfluxDBSqlConstant.LT).append("'").append(endTime).append("'"); + sql.append(InfluxDBSqlConstant.TZ); + System.out.println(sql); //根据不同的库表赋值 QueryResult queryResult = influxDbUtils.query(String.valueOf(sql)); @@ -304,7 +353,7 @@ public class ReportServiceImpl implements ReportService { List results = queryResult.getResults(); if (results.size() != 0) { QueryResult.Result result = results.get(0); - if (result.getSeries() != null){ + if (result.getSeries() != null) { List seriess = result.getSeries(); if (seriess.size() != 0) { QueryResult.Series series = seriess.get(0); @@ -341,7 +390,7 @@ public class ReportServiceImpl implements ReportService { /** * 将字符串写入指定文件 * - * @param res 原字符串 + * @param res 原字符串 * @param filePath 文件路径 * @return 成功标记 */ @@ -351,7 +400,7 @@ public class ReportServiceImpl implements ReportService { BufferedWriter bufferedWriter = null; File distFile = new File(filePath); try { - if (!distFile.getParentFile().exists()){ + if (!distFile.getParentFile().exists()) { distFile.getParentFile().mkdirs(); } bufferedReader = new BufferedReader(new StringReader(res)); @@ -413,7 +462,7 @@ public class ReportServiceImpl implements ReportService { BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); StringBuffer buffer = new StringBuffer(); String line = " "; - while ((line = in.readLine()) != null){ + while ((line = in.readLine()) != null) { buffer.append(line); } return buffer.toString();