From fb0f23e70bd20430aa6e8276fee7e24fd702021a Mon Sep 17 00:00:00 2001 From: wr <1754607820@qq.com> Date: Tue, 26 Aug 2025 18:15:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E7=BA=A7=E8=AF=84=E4=BC=B0=E8=81=94?= =?UTF-8?q?=E8=B0=83=E5=92=8C=E5=AF=BC=E5=87=BA=E8=AF=84=E4=BC=B0=E7=BB=93?= =?UTF-8?q?=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/param/assess/AssessParam.java | 18 + .../pojo/param/assess/AssessUserQuery.java | 3 + .../advance/pojo/po/assess/AssessUser.java | 5 + .../pojo/vo/assess/AssessResultVO.java | 117 ++++++ .../advance/utils/ExcelTemplateReplacer.java | 279 +++++++++++++ .../assess/AssessLoadParamController.java | 1 - .../assess/AssessResultController.java | 1 + .../AssessShockLoadParamController.java | 1 - .../assess/AssessUserController.java | 50 ++- .../assess/SecondaryEvaluationController.java | 63 ++- .../assess/SecondaryEvaluationService.java | 28 +- .../assess/impl/AssessUserServiceImpl.java | 5 +- .../impl/SecondaryEvaluationServiceImpl.java | 382 +++++++++++++++--- .../advance-boot/src/main/resources/pgjg.xlsx | Bin 0 -> 19563 bytes .../src/main/resources/pgjgmb.xlsx | Bin 0 -> 16831 bytes .../harmonic/api/HarmDataFeignClient.java | 11 + .../HarmDataFeignClientFallbackFactory.java | 8 + .../harmonic/pojo/vo/AssessEvaluation.java | 28 ++ .../com/njcn/harmonic/utils/WordUtil2.java | 2 +- .../controller/HistoryResultController.java | 10 + .../mapper/RStatDataHarmRateIDMapper.java | 13 + .../mapper/RStatDataHarmRateVDMapper.java | 13 + .../service/HistoryResultService.java | 6 + .../impl/HistoryResultServiceImpl.java | 113 +++++- 24 files changed, 1070 insertions(+), 87 deletions(-) create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/assess/AssessParam.java create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/vo/assess/AssessResultVO.java create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/utils/ExcelTemplateReplacer.java create mode 100644 pqs-advance/advance-boot/src/main/resources/pgjg.xlsx create mode 100644 pqs-advance/advance-boot/src/main/resources/pgjgmb.xlsx create mode 100644 pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/AssessEvaluation.java create mode 100644 pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatDataHarmRateIDMapper.java create mode 100644 pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatDataHarmRateVDMapper.java diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/assess/AssessParam.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/assess/AssessParam.java new file mode 100644 index 000000000..6e6d3a25d --- /dev/null +++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/assess/AssessParam.java @@ -0,0 +1,18 @@ +package com.njcn.advance.pojo.param.assess; + +import com.njcn.common.pojo.param.StatisticsBizBaseParam; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wr + * @description + * @date 2025/8/26 17:05 + */ +@Data +public class AssessParam extends StatisticsBizBaseParam { + + @ApiModelProperty(name="assessId",value="评估用户id") + private String assessId; + +} diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/assess/AssessUserQuery.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/assess/AssessUserQuery.java index 7d93f0019..01f03e8a3 100644 --- a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/assess/AssessUserQuery.java +++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/assess/AssessUserQuery.java @@ -90,6 +90,9 @@ public class AssessUserQuery extends BaseParam implements Serializable { @ApiModelProperty(value = "线路名称,例:35kV 南站一线") private String lineName; + @ApiModelProperty(value = "线路名称,例:35kV 南站一线") + private String lineScale; + @ApiModelProperty(value = "供电设备容量,单位MVA,例:100.00") private BigDecimal powersupplyCapacity; diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/po/assess/AssessUser.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/po/assess/AssessUser.java index a4a365abc..494948359 100644 --- a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/po/assess/AssessUser.java +++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/po/assess/AssessUser.java @@ -106,6 +106,11 @@ public class AssessUser extends BaseEntity implements Serializable { */ private String lineName; + /** + * 线路名称:例:35kV 南站一线 + */ + private String lineScale; + /** * 供电设备容量,单位MVA,例:100.00 */ diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/vo/assess/AssessResultVO.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/vo/assess/AssessResultVO.java new file mode 100644 index 000000000..54d4d6f53 --- /dev/null +++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/vo/assess/AssessResultVO.java @@ -0,0 +1,117 @@ +package com.njcn.advance.pojo.vo.assess; + +import com.njcn.advance.pojo.po.assess.AssessUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author wr + * @description + * @date 2025/8/20 17:22 + */ +@Data +public class AssessResultVO { + + private AssessUser user; + + /** + * 电压波动结果 + */ + private EvaluationResult fluc; + + /** + * 闪变评估结果 + */ + private EvaluationResult plt; + + /** + * 无功设备不运行 + */ + private List capOff; + + /** + * 无功设备全运行 + */ + private List capOn; + + /** + * 三相电压不平衡 + */ + private List unblance; + + + /** + * 谐波电压评估结果 + */ + private List harmV; + + /** + * 谐波电流评估结果 + */ + private List harmI; + + @Data + public static class EvaluationResult { + + @ApiModelProperty("冲击负荷个数") + private Integer inPactLoadNum; + + @ApiModelProperty("值") + private BigDecimal data; + + @ApiModelProperty("国标限值") + private BigDecimal limitData; + + @ApiModelProperty("判断") + private Boolean isQualified; + } + + /** + * 用户无功设备不运行 + */ + @Data + public static class Useless { + + @ApiModelProperty("百分比") + private BigDecimal percent; + + @ApiModelProperty("有名值") + private BigDecimal voltagePercent; + + @ApiModelProperty("电压上偏差限值") + private BigDecimal capUP; + + @ApiModelProperty("电压下偏差限值") + private BigDecimal capDown; + + @ApiModelProperty("判断") + private Boolean isQualified; + } + + @Data + public static class Harm { + + @ApiModelProperty("未投入") + private BigDecimal notInvested; + + @ApiModelProperty("已投入") + private BigDecimal hasInvested; + + @ApiModelProperty("限值") + private BigDecimal limitData; + + @ApiModelProperty("未投入判断") + private Boolean isNotQualified; + + @ApiModelProperty("已投入判断") + private Boolean isHasQualified; + + @ApiModelProperty("判断") + private Boolean isQualified; + } + + +} diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/utils/ExcelTemplateReplacer.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/utils/ExcelTemplateReplacer.java new file mode 100644 index 000000000..f1800782d --- /dev/null +++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/utils/ExcelTemplateReplacer.java @@ -0,0 +1,279 @@ +package com.njcn.advance.utils; + +import lombok.Data; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFColor; +import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.jetbrains.annotations.NotNull; +import org.springframework.core.io.ClassPathResource; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +public class ExcelTemplateReplacer { + + // 用于包装替换值和样式启用状态的类 + public static class ReplacementData { + private Object value; + private boolean enableStyle; + + public ReplacementData(Object value, boolean enableStyle) { + this.value = value; + this.enableStyle = enableStyle; + } + + public Object getValue() { + return value; + } + + public boolean isEnableStyle() { + return enableStyle; + } + + // 便捷的创建方法 + public static ReplacementData create(Object value, boolean enableStyle) { + return new ReplacementData(value, enableStyle); + } + } + + /** + * 替换Excel模板中的占位符,支持设置是否启用样式 + * + * @param templatePath 模板文件路径 + * @param outputPath 输出文件路径 + * @param data 替换数据,包含值和样式启用状态 + * @param fixedStyle 固定样式配置 + * @throws IOException IO异常 + */ + public static void replaceTemplate(String templatePath, String outputPath, + Map data, CellStyleConfig fixedStyle) + throws IOException { + try (InputStream is = new FileInputStream(templatePath); + Workbook workbook = new XSSFWorkbook(is)) { + // 创建固定样式 + CellStyle style = createFixedStyle(workbook, fixedStyle); + for (Sheet sheet : workbook) { + for (Row row : sheet) { + if (row == null) continue; + for (Cell cell : row) { + if (cell == null) continue; + + String cellValue = getCellValue(cell); + if (cellValue != null && !cellValue.isEmpty()) { + for (Map.Entry entry : data.entrySet()) { + String placeholder = entry.getKey(); + ReplacementData replacement = entry.getValue(); + + if (cellValue.contains(placeholder)) { + // 替换占位符内容 + setCellValue(cell, replacement.getValue()); + + // 根据标志决定是否应用样式 + if (replacement.isEnableStyle() && style != null) { + cell.setCellStyle(style); + } + } + } + } + } + } + } + + // 写入输出文件 + try (OutputStream os = new FileOutputStream(outputPath)) { + workbook.write(os); + } + } + } + + public static void replaceDownTemplate(String templatePath, + String fileName, + Map data, + CellStyleConfig fixedStyle, + HttpServletResponse response) + throws IOException { + try (InputStream is = new ClassPathResource(templatePath).getInputStream(); + Workbook workbook = new XSSFWorkbook(is)) { + // 创建固定样式 + CellStyle style = createFixedStyle(workbook, fixedStyle); + for (Sheet sheet : workbook) { + for (Row row : sheet) { + if (row == null) continue; + for (Cell cell : row) { + if (cell == null) continue; + + String cellValue = getCellValue(cell); + if (cellValue != null && !cellValue.isEmpty()) { + for (Map.Entry entry : data.entrySet()) { + String placeholder = entry.getKey(); + ReplacementData replacement = entry.getValue(); + + if (cellValue.contains(placeholder)) { + // 替换占位符内容 + setCellValue(cell, replacement.getValue()); + + // 根据标志决定是否应用样式 + if (replacement.isEnableStyle() && style != null) { + cell.setCellStyle(style); + } + } + } + } + } + } + } + + // 写入输出文件 + try { + ServletOutputStream outputStream = response.getOutputStream(); + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); + response.setContentType("application/octet-stream;charset=UTF-8"); + workbook.write(outputStream); + outputStream.close(); + } catch (Exception e) { + System.out.println("评估结果异常" + e); + } finally { + if (workbook != null) { + workbook.close(); + } + } + } + } + + /** + * 创建固定样式 + */ + private static CellStyle createFixedStyle(Workbook workbook, CellStyleConfig config) { + if (config == null) return null; + + CellStyle style = workbook.createCellStyle(); + + // 设置背景颜色 + if (config.getBackgroundColor() != null) { + if (config.getBackgroundColor() instanceof XSSFColor) { + ((XSSFCellStyle) style).setFillForegroundColor((XSSFColor) config.getBackgroundColor()); + } else if (config.getBackgroundColor() instanceof Short) { + style.setFillForegroundColor((Short) config.getBackgroundColor()); + } + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + } + // 可以添加更多固定样式设置,如边框、对齐方式等 + style.setBorderBottom(BorderStyle.THIN); + style.setBorderTop(BorderStyle.THIN); + style.setBorderLeft(BorderStyle.THIN); + style.setBorderRight(BorderStyle.THIN); + // 设置字体颜色 + if (config.getFontColor() != null) { + Font font = workbook.getFontAt((short)0); + if (config.getFontColor() instanceof XSSFColor) { + ((XSSFFont) font).setColor((XSSFColor) config.getFontColor()); + } else if (config.getFontColor() instanceof Short) { + font.setColor((Short) config.getFontColor()); + } + font.setFontHeightInPoints((short)10); + font.setBold(true); + font.setItalic(true); + font.setUnderline(Font.U_SINGLE_ACCOUNTING); + style.setFont(font); + style.setAlignment(HorizontalAlignment.RIGHT); + }else{ + style.setAlignment(HorizontalAlignment.CENTER); + } + return style; + } + + /** + * 获取单元格的值 + */ + private static String getCellValue(Cell cell) { + if (cell == null) return ""; + + switch (cell.getCellType()) { + case STRING: + return cell.getStringCellValue(); + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + return cell.getDateCellValue().toString(); + } + return String.valueOf(cell.getNumericCellValue()); + case BOOLEAN: + return String.valueOf(cell.getBooleanCellValue()); + case FORMULA: + return cell.getCellFormula(); + default: + return ""; + } + } + + /** + * 设置单元格的值 + */ + private static void setCellValue(Cell cell, Object value) { + // 自动判断类型 + if (value instanceof BigDecimal) { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(((BigDecimal) value).doubleValue()); + } else if (value instanceof Number) { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(((Number) value).doubleValue()); + } else if (value instanceof Boolean) { + cell.setCellType(CellType.BOOLEAN); + cell.setCellValue((Boolean) value); + } else { + cell.setCellType(CellType.STRING); + cell.setCellValue(value.toString()); + } + } + + // 单元格样式配置类 + @Data + public static class CellStyleConfig { + private Object backgroundColor; // 支持Short(索引色)或XSSFColor(自定义色) + private Object fontColor; // 支持Short(索引色)或XSSFColor(自定义色) + private short fontSize; // 支持Short(索引色)或XSSFColor(自定义色) + + public CellStyleConfig(Object backgroundColor, Object fontColor, short fontSize) { + this.backgroundColor = backgroundColor; + this.fontColor = fontColor; + this.fontSize = fontSize; + } + + } + + public static void main(String[] args) { + try { + // 准备替换数据,第三个参数为样式启用标志:true启用,false不启用 + Map data = new HashMap<>(); + data.put("${name}", ReplacementData.create("2024-10-25", true)); // 不启用样式 + data.put("${noti2}", ReplacementData.create(30.35, true)); // 启用样式 + data.put("${age}", ReplacementData.create(30, true)); // 启用样式 + + // 执行替换 + replaceTemplate("C:\\Users\\web2023\\Desktop\\xf.xlsx", "C:\\Users\\web2023\\Desktop\\cc.xlsx", data, getCellStyleConfig()); + System.out.println("Excel模板替换完成!"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 定义固定样式:浅蓝色背景,黑色字体 + * + * @return + */ + public static CellStyleConfig getCellStyleConfig() { + XSSFColor lightBlue = new XSSFColor(new java.awt.Color(166, 165, 165), null); + CellStyleConfig fixedStyle = new CellStyleConfig( + lightBlue, + IndexedColors.BLACK.getIndex(), + (short)10 + ); + return fixedStyle; + } +} diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessLoadParamController.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessLoadParamController.java index f3001dea1..878004d0e 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessLoadParamController.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessLoadParamController.java @@ -90,7 +90,6 @@ public class AssessLoadParamController extends BaseController { } @ApiOperation("删除评估用户负荷参数") - @ApiImplicitParam(name = "loadId", value = "用户负荷ID", required = true, type = "String") @PostMapping("/delete") public HttpResult delete(@RequestBody List loadId) { boolean result = assessLoadParamService.removeByIds(loadId); diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessResultController.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessResultController.java index 75f94190c..7a066ee24 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessResultController.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessResultController.java @@ -18,5 +18,6 @@ import com.njcn.web.controller.BaseController; @RequestMapping("/assessResult") public class AssessResultController extends BaseController { + } diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessShockLoadParamController.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessShockLoadParamController.java index b4576447a..e999eca01 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessShockLoadParamController.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessShockLoadParamController.java @@ -92,7 +92,6 @@ public class AssessShockLoadParamController extends BaseController { } @ApiOperation("删除评估用户冲击负荷参数") - @ApiImplicitParam(name = "inpactloadId", value = "冲击负荷ID", required = true, type = "String") @PostMapping("/delete") public HttpResult delete(@RequestBody List inpactloadId) { boolean result = assessShockLoadParamService.removeByIds(inpactloadId); diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessUserController.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessUserController.java index 8dfe6f0d3..220ac234c 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessUserController.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/AssessUserController.java @@ -1,20 +1,19 @@ package com.njcn.advance.controller.assess; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.njcn.advance.pojo.param.assess.AssessUserQuery; -import com.njcn.advance.pojo.po.assess.AssessUser; -import com.njcn.advance.service.assess.IAssessUserService; +import com.njcn.advance.pojo.po.assess.*; +import com.njcn.advance.service.assess.*; import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.utils.HttpResultUtil; -import com.njcn.web.factory.PageFactory; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; @@ -26,7 +25,7 @@ import java.util.List; /** *

- * 前端控制器 + * 前端控制器 *

* * @author cdf @@ -39,6 +38,12 @@ import java.util.List; public class AssessUserController extends BaseController { private final IAssessUserService assessUserService; + private final IAssessTransformerParamService transformerParamService; + private final IAssessCapacitorParamService capacitorParamService; + private final IAssessWindLoadParamService windLoadParamService; + private final IAssessLoadParamService loadParamService; + private final IAssessShockLoadParamService shockLoadParamService; + @ApiOperation("获取评估用户列表") @PostMapping("/list") @@ -47,40 +52,40 @@ public class AssessUserController extends BaseController { .like(assessUserQuery.getDeptName() != null, AssessUser::getDeptName, assessUserQuery.getDeptName()) .like(assessUserQuery.getUserScale() != null, AssessUser::getUserScale, assessUserQuery.getUserScale()); List list = assessUserService.list(wrapper); - return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), list,CommonResponseEnum.SUCCESS.getMessage()); + return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), list, CommonResponseEnum.SUCCESS.getMessage()); } @ApiOperation("分页查询评估用户") @PostMapping("/page") public HttpResult> page(@RequestBody AssessUserQuery assessUserQuery) { Page pageData = assessUserService.page(assessUserQuery); - return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), pageData,CommonResponseEnum.SUCCESS.getMessage()); + return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), pageData, CommonResponseEnum.SUCCESS.getMessage()); } @ApiOperation("根据ID获取评估用户详情") @ApiImplicitParam(name = "assessId", value = "评估用户ID", required = true, type = "String") - @GetMapping("getInfo") + @GetMapping("/getInfo") public HttpResult getInfo(@RequestParam("assessId") String assessId) { AssessUser assessUser = assessUserService.getByAssessId(assessId); - return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), assessUser,CommonResponseEnum.SUCCESS.getMessage()); + return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), assessUser, CommonResponseEnum.SUCCESS.getMessage()); } @ApiOperation("新增评估用户") - @PostMapping("add") + @PostMapping("/add") public HttpResult add(@RequestBody @Validated AssessUserQuery assessUser) { String result = assessUserService.add(assessUser); - if(StrUtil.isNotBlank(result)){ - return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), result,CommonResponseEnum.SUCCESS.getMessage()); - }else { - return HttpResultUtil.assembleResult(CommonResponseEnum.FAIL.getCode(), null,CommonResponseEnum.FAIL.getMessage()); + if (StrUtil.isNotBlank(result)) { + return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), result, CommonResponseEnum.SUCCESS.getMessage()); + } else { + return HttpResultUtil.assembleResult(CommonResponseEnum.FAIL.getCode(), null, CommonResponseEnum.FAIL.getMessage()); } } @ApiOperation("修改评估用户") - @PostMapping("edit") + @PostMapping("/edit") public HttpResult edit(@RequestBody @Validated AssessUserQuery.UpdateAssessUserQuery updateAssessUserQuery) { assessUserService.update(updateAssessUserQuery); - return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), true,CommonResponseEnum.SUCCESS.getMessage()); + return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), true, CommonResponseEnum.SUCCESS.getMessage()); } @@ -88,11 +93,18 @@ public class AssessUserController extends BaseController { @ApiImplicitParam(name = "assessIds", value = "评估用户ID列表,用逗号分隔", required = true, type = "String") @PostMapping("/batchDel") public HttpResult batchDelete(@RequestBody List assessIds) { - boolean result = assessUserService.removeByIds(assessIds); - return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), result,CommonResponseEnum.SUCCESS.getMessage()); + boolean result = false; + if (CollUtil.isNotEmpty(assessIds)) { + transformerParamService.remove(new LambdaQueryWrapper().in(AssessTransformerParam::getAssessId, assessIds)); + capacitorParamService.remove(new LambdaQueryWrapper().in(AssessCapacitorParam::getAssessId, assessIds)); + windLoadParamService.remove(new LambdaQueryWrapper().in(AssessWindLoadParam::getAssessId, assessIds)); + loadParamService.remove(new LambdaQueryWrapper().in(AssessLoadParam::getAssessId, assessIds)); + shockLoadParamService.remove(new LambdaQueryWrapper().in(AssessShockLoadParam::getAssessId, assessIds)); + result = assessUserService.removeByIds(assessIds); + } + return HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), result, CommonResponseEnum.SUCCESS.getMessage()); } - } diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/SecondaryEvaluationController.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/SecondaryEvaluationController.java index 0f3fe64ef..461656e7e 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/SecondaryEvaluationController.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/assess/SecondaryEvaluationController.java @@ -1,23 +1,25 @@ package com.njcn.advance.controller.assess; -import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityQueryDataParam; -import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityDataVO; import com.njcn.advance.pojo.dto.assess.AssessTreeDTO; +import com.njcn.advance.pojo.param.assess.AssessParam; +import com.njcn.advance.pojo.vo.assess.AssessResultVO; import com.njcn.advance.service.assess.SecondaryEvaluationService; import com.njcn.common.pojo.annotation.OperateInfo; import com.njcn.common.pojo.enums.common.LogEnum; import com.njcn.common.pojo.enums.response.CommonResponseEnum; +import com.njcn.common.pojo.param.StatisticsBizBaseParam; import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.utils.HttpResultUtil; import com.njcn.web.controller.BaseController; import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; /** @@ -33,24 +35,61 @@ import java.util.List; @Api(tags = "二级评估") @RequiredArgsConstructor public class SecondaryEvaluationController extends BaseController { + private final SecondaryEvaluationService secondaryEvaluationService; + @OperateInfo(info = LogEnum.BUSINESS_COMMON) @PostMapping("/evaluation") - @ApiOperation("评估-主页面") - public HttpResult evaluation(@RequestParam String assessId,@RequestParam("file") MultipartFile file) { + @ApiOperation("导入数据计算评估结果") + public HttpResult evaluation(@RequestParam("assessId") String assessId, + @ApiParam(value = "文件", required = true) @RequestPart("file") MultipartFile file) { String methodDescribe = getMethodDescribe("evaluation"); - secondaryEvaluationService.evaluation(assessId,file); - return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS,true , methodDescribe); + AssessParam param=new AssessParam(); + param.setAssessId(assessId); + secondaryEvaluationService.evaluation(param, file); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe); } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/lineEvaluation") + @ApiOperation("监测点数据计算评估结果") + public HttpResult lineEvaluation(@RequestBody AssessParam param) { + String methodDescribe = getMethodDescribe("lineEvaluation"); + secondaryEvaluationService.evaluation(param, null); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe); + } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) @PostMapping("/evaluationTree") - @ApiOperation("评估-树") - public HttpResult evaluationTree(@RequestParam("deptId")String deptId) { + @ApiOperation("评估树") + public HttpResult> evaluationTree(@RequestParam("deptId") String deptId) { String methodDescribe = getMethodDescribe("evaluationTree"); - List tree = secondaryEvaluationService.evaluationTree(deptId); - return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS,true , methodDescribe); + List tree = secondaryEvaluationService.evaluationTree(deptId); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, tree, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/assessResult") + @ApiOperation("评估结果") + public HttpResult assessResult(@RequestParam("assessId") String assessId) { + String methodDescribe = getMethodDescribe("assessResult"); + AssessResultVO resultVO = secondaryEvaluationService.assessResult(assessId); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, resultVO, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @GetMapping("/downAssessResult") + @ApiOperation("导出评估结果") + public void assessResult(HttpServletResponse response, @RequestParam("assessId") String assessId) throws IOException { + secondaryEvaluationService.downAssessResult(response, assessId); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @GetMapping("/downTemplateAssessResult") + @ApiOperation("导出评估结果模板") + public void assessResult(HttpServletResponse response) throws IOException { + secondaryEvaluationService.downTemplateAssessResult(response); } } diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/SecondaryEvaluationService.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/SecondaryEvaluationService.java index f8402cf33..3e27b7f86 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/SecondaryEvaluationService.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/SecondaryEvaluationService.java @@ -1,8 +1,12 @@ package com.njcn.advance.service.assess; import com.njcn.advance.pojo.dto.assess.AssessTreeDTO; +import com.njcn.advance.pojo.param.assess.AssessParam; +import com.njcn.advance.pojo.vo.assess.AssessResultVO; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; /** @@ -13,7 +17,29 @@ import java.util.List; * @version V1.0.0 */ public interface SecondaryEvaluationService { - void evaluation(String assessId, MultipartFile file); + + void evaluation(AssessParam param, MultipartFile file); List evaluationTree(String deptId); + + /** + * 查询评估结果 + * @param assessId + * @return + */ + AssessResultVO assessResult(String assessId); + + /** + * 导出评估结果 + * @param response + */ + void downAssessResult(HttpServletResponse response,String assessId) throws IOException; + + /** + * 导出pms3.0模板 + * @param response + * @param + * @throws IOException + */ + void downTemplateAssessResult(HttpServletResponse response) throws IOException; } diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/impl/AssessUserServiceImpl.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/impl/AssessUserServiceImpl.java index 73f1ef848..28cdbd40f 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/impl/AssessUserServiceImpl.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/impl/AssessUserServiceImpl.java @@ -39,8 +39,9 @@ public class AssessUserServiceImpl extends ServiceImpl pageData = this.page(pageParam, wrapper); return pageData; diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/impl/SecondaryEvaluationServiceImpl.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/impl/SecondaryEvaluationServiceImpl.java index d7b3e4fd9..e5dd36b21 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/impl/SecondaryEvaluationServiceImpl.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/assess/impl/SecondaryEvaluationServiceImpl.java @@ -1,27 +1,43 @@ package com.njcn.advance.service.assess.impl; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.njcn.advance.pojo.dto.assess.AssessTreeDTO; import com.njcn.advance.pojo.dto.assess.HarmonicsIAndZDTO; +import com.njcn.advance.pojo.param.assess.AssessParam; import com.njcn.advance.pojo.po.assess.*; +import com.njcn.advance.pojo.vo.assess.AssessResultVO; import com.njcn.advance.service.assess.*; import com.njcn.advance.utils.EasyExcelUtil; +import com.njcn.advance.utils.ExcelTemplateReplacer; import com.njcn.advance.utils.assess.*; import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.common.pojo.param.StatisticsBizBaseParam; import com.njcn.device.biz.pojo.po.Overlimit; import com.njcn.device.biz.utils.COverlimitUtil; +import com.njcn.harmonic.api.HarmDataFeignClient; +import com.njcn.harmonic.pojo.vo.AssessEvaluation; import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.enums.DicDataTypeEnum; import com.njcn.system.pojo.po.DictData; import com.njcn.user.api.DeptFeignClient; import lombok.RequiredArgsConstructor; import org.apache.commons.math3.complex.Complex; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; @@ -57,70 +73,84 @@ public class SecondaryEvaluationServiceImpl implements SecondaryEvaluationServic private final IAssessWindLoadParamService iAssessWindLoadParamService; private final DeptFeignClient deptFeignClient; + private final HarmDataFeignClient harmDataFeignClient; @Override @Transactional(rollbackFor = Exception.class) - public void evaluation(String assessId, MultipartFile file) { + public void evaluation(AssessParam param, MultipartFile file) { //解析文件取CP95值 2-50次谐波电流含有率,电压含有率,负序电流,三项不平衡度,A,B,C三项最大; - + String assessId = param.getAssessId(); List iMax; Double unbalance; List uMax; Double iNeg; - try { - List> maps = EasyExcelUtil.syncRead(file.getInputStream(), 0, 0); - //电流含有率 - List> maps1 = maps.subList(3, 52); - //负序电流 - List> maps2 = maps.subList(52, 53); - //电压含有率 - List> maps3 = maps.subList(56, 105); - //三项不平衡度 - List> maps4 = maps.subList(105, 106); + if (StrUtil.isNotBlank(param.getId())) { + AssessEvaluation data = harmDataFeignClient.getHarmIAndHarmVData(param).getData(); + if (ObjUtil.isNotNull(data)){ + iMax = data.getIMax(); + unbalance = data.getUnbalance(); + uMax = data.getUMax(); + iNeg = data.getINeg(); + }else{ + throw new BusinessException("评估原始数据有误!请检查数据是否为空"); + } + } else { + try { + List> maps = EasyExcelUtil.syncRead(file.getInputStream(), 0, 0); + //电流含有率 + List> maps1 = maps.subList(3, 52); + //负序电流 + List> maps2 = maps.subList(52, 53); + //电压含有率 + List> maps3 = maps.subList(56, 105); + //三项不平衡度 + List> maps4 = maps.subList(105, 106); - iMax = maps1.stream().map(temp -> { - double a = Double.valueOf(temp.get(5)); - double b = Double.valueOf(temp.get(10)); - double c = Double.valueOf(temp.get(15)); - double v = a > b ? a : b; - double max = v > c ? v : c; - return max; + iMax = maps1.stream().map(temp -> { + double a = Double.valueOf(temp.get(5)); + double b = Double.valueOf(temp.get(10)); + double c = Double.valueOf(temp.get(15)); + double v = a > b ? a : b; + double max = v > c ? v : c; + return max; - }).collect(Collectors.toList()); - iNeg = maps2.stream().map(temp -> { - double a = Double.valueOf(temp.get(5)); - double b = Double.valueOf(temp.get(10)); - double c = Double.valueOf(temp.get(15)); - double v = a > b ? a : b; - double max = v > c ? v : c; - return max; + }).collect(Collectors.toList()); + iNeg = maps2.stream().map(temp -> { + double a = Double.valueOf(temp.get(5)); + double b = Double.valueOf(temp.get(10)); + double c = Double.valueOf(temp.get(15)); + double v = a > b ? a : b; + double max = v > c ? v : c; + return max; - }).findFirst().get(); + }).findFirst().get(); - uMax = maps3.stream().map(temp -> { - double a = Double.valueOf(temp.get(5)); - double b = Double.valueOf(temp.get(10)); - double c = Double.valueOf(temp.get(15)); - double v = a > b ? a : b; - double max = v > c ? v : c; - return max; + uMax = maps3.stream().map(temp -> { + double a = Double.valueOf(temp.get(5)); + double b = Double.valueOf(temp.get(10)); + double c = Double.valueOf(temp.get(15)); + double v = a > b ? a : b; + double max = v > c ? v : c; + return max; - }).collect(Collectors.toList()); + }).collect(Collectors.toList()); - unbalance = maps4.stream().map(temp -> { - double a = Double.valueOf(temp.get(5)); - double b = Double.valueOf(temp.get(10)); - double c = Double.valueOf(temp.get(15)); - double v = a > b ? a : b; - double max = v > c ? v : c; - return max; + unbalance = maps4.stream().map(temp -> { + double a = Double.valueOf(temp.get(5)); + double b = Double.valueOf(temp.get(10)); + double c = Double.valueOf(temp.get(15)); + double v = a > b ? a : b; + double max = v > c ? v : c; + return max; - }).findFirst().get(); + }).findFirst().get(); - } catch (Exception e) { - throw new BusinessException("解析文件失败,请按模版上传文件"); + } catch (Exception e) { + throw new BusinessException("解析文件失败,请按模版上传文件"); + } } + AssessResult assessResult = new AssessResult(); AssessResultAddition assessResultAddition = new AssessResultAddition(); AssessOverlimit assessOverlimit = new AssessOverlimit(); @@ -482,6 +512,266 @@ public class SecondaryEvaluationServiceImpl implements SecondaryEvaluationServic return result; } + @Override + public AssessResultVO assessResult(String assessId) { + AssessResultVO resultVO = null; + AssessResult result = iAssessResultService.getById(assessId); + AssessUser byId = iAssessUserService.getById(assessId); + if (ObjUtil.isNotNull(result) && ObjUtil.isNotNull(byId)) { + resultVO = new AssessResultVO(); + resultVO.setUser(byId); + //取出电压字典,并获取电压系数 + List dictDataList = dicDataFeignClient.getDicDataByTypeName(DicDataTypeEnum.DEV_VOLTAGE_STAND.getName()).getData(); + AssessUser assessUser = iAssessUserService.lambdaQuery().eq(AssessUser::getAssessId, assessId).one(); + Double userScale = getVoltage(assessUser.getUserScale(), dictDataList); + + AssessResultAddition resultAddition = iAssessResultAdditionService.getById(assessId); + AssessOverlimit overLimit = iAssessOverlimitService.getById(assessId); + List list = iAssessShockLoadParamService.list(new LambdaQueryWrapper() + .eq(AssessShockLoadParam::getAssessId, assessId)); + + //冲击负荷数量 + Integer sum = list.stream().mapToInt(x -> x.getInpactloadNum().intValue()).sum(); + + //电压波动评估结果 + AssessResultVO.EvaluationResult fluc = new AssessResultVO.EvaluationResult(); + fluc.setInPactLoadNum(sum); + fluc.setData(result.getApproFluc()); + fluc.setLimitData(overLimit.getFluc()); + fluc.setIsQualified(NumberUtil.isLess(fluc.getData(), fluc.getLimitData())); + resultVO.setFluc(fluc); + //闪变评估结果 + AssessResultVO.EvaluationResult plt = new AssessResultVO.EvaluationResult(); + plt.setInPactLoadNum(sum); + plt.setData(result.getPlt()); + plt.setLimitData(overLimit.getPlt()); + plt.setIsQualified(NumberUtil.isLess(plt.getData(), plt.getLimitData())); + resultVO.setPlt(plt); + + //用户无功设备不运行 + resultVO.setCapOff(capOff(result, userScale, overLimit)); + + //用户无功设备全运行 + resultVO.setCapOn(capOn(result, userScale, overLimit)); + + //三项电压不平平衡 + List unblance = new ArrayList<>(); + AssessResultVO.EvaluationResult evaluationResult = new AssessResultVO.EvaluationResult(); + evaluationResult.setData(result.getAccurUnblance()); + evaluationResult.setLimitData(overLimit.getUnblance()); + evaluationResult.setIsQualified(NumberUtil.isLess(evaluationResult.getData(), evaluationResult.getLimitData())); + unblance.add(evaluationResult); + + evaluationResult = new AssessResultVO.EvaluationResult(); + evaluationResult.setData(result.getApproUnblance().multiply(BigDecimal.valueOf(200))); + evaluationResult.setLimitData(overLimit.getUnblance()); + evaluationResult.setIsQualified(NumberUtil.isLess(evaluationResult.getData(), evaluationResult.getLimitData())); + unblance.add(evaluationResult); + + resultVO.setUnblance(unblance); + + resultVO.setHarmI(getHarms(result, resultAddition, overLimit, "i")); + resultVO.setHarmV(getHarms(result, resultAddition, overLimit, "v")); + } + return resultVO; + } + + @Override + public void downAssessResult(HttpServletResponse response, String assessId) throws IOException { + AssessResultVO resultVO = this.assessResult(assessId); + if (ObjUtil.isNotNull(resultVO)) { + Map data = new HashMap<>(); + data.put("${name}", ExcelTemplateReplacer.ReplacementData.create(resultVO.getUser().getAssessName(), false)); + data.put("${subname}", ExcelTemplateReplacer.ReplacementData.create(resultVO.getUser().getPowerstationName(), false)); + data.put("${subvname}", ExcelTemplateReplacer.ReplacementData.create(resultVO.getUser().getBusName(), false)); + data.put("${linename}", ExcelTemplateReplacer.ReplacementData.create(resultVO.getUser().getLineName(), false)); + //电压 + AssessResultVO.EvaluationResult fluc = resultVO.getFluc(); + data.put("${num}", ExcelTemplateReplacer.ReplacementData.create(fluc.getInPactLoadNum(), false)); + data.put("${fluc}", ExcelTemplateReplacer.ReplacementData.create(fluc.getData(), !fluc.getIsQualified())); + data.put("${fluclimt}", ExcelTemplateReplacer.ReplacementData.create(fluc.getLimitData(), false)); + data.put("${isfluc}", ExcelTemplateReplacer.ReplacementData.create(isData(fluc.getIsQualified()), false)); + + //闪变 + AssessResultVO.EvaluationResult plt = resultVO.getPlt(); + data.put("${plt}", ExcelTemplateReplacer.ReplacementData.create(plt.getData(), !plt.getIsQualified())); + data.put("${pltlimt}", ExcelTemplateReplacer.ReplacementData.create(plt.getLimitData(), false)); + data.put("${isplt}", ExcelTemplateReplacer.ReplacementData.create(isData(plt.getIsQualified()), false)); + + List unblance = resultVO.getUnblance(); + data.put("${app}", ExcelTemplateReplacer.ReplacementData.create(unblance.get(0).getData(), !unblance.get(0).getIsQualified())); + data.put("${acc}", ExcelTemplateReplacer.ReplacementData.create(unblance.get(1).getData(), !unblance.get(1).getIsQualified())); + data.put("${unblance}", ExcelTemplateReplacer.ReplacementData.create(unblance.get(0).getLimitData(), false)); + data.put("${isapp}", ExcelTemplateReplacer.ReplacementData.create(isData(unblance.get(0).getIsQualified()), false)); + data.put("${isacc}", ExcelTemplateReplacer.ReplacementData.create(isData(unblance.get(1).getIsQualified()), false)); + + List capOff = resultVO.getCapOff(); + data.put("${up}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(0).getCapUP(), false)); + data.put("${down}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(0).getCapDown(), false)); + + data.put("${noth100}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(0).getPercent(), !capOff.get(0).getIsQualified())); + data.put("${noth60}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(1).getPercent(), !capOff.get(1).getIsQualified())); + data.put("${noth0}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(2).getPercent(), !capOff.get(2).getIsQualified())); + data.put("${notl100}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(3).getPercent(), !capOff.get(3).getIsQualified())); + data.put("${notl60}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(4).getPercent(), !capOff.get(4).getIsQualified())); + data.put("${notl0}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(5).getPercent(), !capOff.get(5).getIsQualified())); + data.put("${ynoth100}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(0).getVoltagePercent(), false)); + data.put("${ynoth60}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(1).getVoltagePercent(), false)); + data.put("${ynoth0}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(2).getVoltagePercent(), false)); + data.put("${ynotl100}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(3).getVoltagePercent(), false)); + data.put("${ynotl60}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(4).getVoltagePercent(), false)); + data.put("${ynotl0}", ExcelTemplateReplacer.ReplacementData.create(capOff.get(5).getVoltagePercent(), false)); + data.put("${isnoth100}", ExcelTemplateReplacer.ReplacementData.create(isData(capOff.get(0).getIsQualified()), false)); + data.put("${isnoth60}", ExcelTemplateReplacer.ReplacementData.create(isData(capOff.get(1).getIsQualified()), false)); + data.put("${isnoth0}", ExcelTemplateReplacer.ReplacementData.create(isData(capOff.get(2).getIsQualified()), false)); + data.put("${isnotl100}", ExcelTemplateReplacer.ReplacementData.create(isData(capOff.get(3).getIsQualified()), false)); + data.put("${isnotl60}", ExcelTemplateReplacer.ReplacementData.create(isData(capOff.get(4).getIsQualified()), false)); + data.put("${isnotl0}", ExcelTemplateReplacer.ReplacementData.create(isData(capOff.get(5).getIsQualified()), false)); + + List capOn = resultVO.getCapOn(); + data.put("${hash100}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(0).getPercent(), !capOn.get(0).getIsQualified())); + data.put("${hash60}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(1).getPercent(), !capOn.get(1).getIsQualified())); + data.put("${hash0}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(2).getPercent(), !capOn.get(2).getIsQualified())); + data.put("${hasl100}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(3).getPercent(), !capOn.get(3).getIsQualified())); + data.put("${hasl60}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(4).getPercent(), !capOn.get(4).getIsQualified())); + data.put("${hasl0}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(5).getPercent(), !capOn.get(5).getIsQualified())); + data.put("${yhash100}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(0).getVoltagePercent(), false)); + data.put("${yhash60}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(1).getVoltagePercent(), false)); + data.put("${yhash0}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(2).getVoltagePercent(), false)); + data.put("${yhasl100}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(3).getVoltagePercent(), false)); + data.put("${yhasl60}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(4).getVoltagePercent(), false)); + data.put("${yhasl0}", ExcelTemplateReplacer.ReplacementData.create(capOn.get(5).getVoltagePercent(), false)); + data.put("${ishash100}", ExcelTemplateReplacer.ReplacementData.create(isData(capOn.get(0).getIsQualified()), false)); + data.put("${ishash60}", ExcelTemplateReplacer.ReplacementData.create(isData(capOn.get(1).getIsQualified()), false)); + data.put("${ishash0}", ExcelTemplateReplacer.ReplacementData.create(isData(capOn.get(2).getIsQualified()), false)); + data.put("${ishasl100}", ExcelTemplateReplacer.ReplacementData.create(isData(capOn.get(3).getIsQualified()), false)); + data.put("${ishasl60}", ExcelTemplateReplacer.ReplacementData.create(isData(capOn.get(4).getIsQualified()), false)); + data.put("${ishasl0}", ExcelTemplateReplacer.ReplacementData.create(isData(capOn.get(5).getIsQualified()), false)); + List harmI = resultVO.getHarmI(); + for (int i = 2; i < harmI.size() + 2; i++) { + data.put("${noti" + i + "}", ExcelTemplateReplacer.ReplacementData.create(harmI.get(i - 2).getNotInvested(), !harmI.get(i - 2).getIsNotQualified())); + data.put("${hasi" + i + "}", ExcelTemplateReplacer.ReplacementData.create(harmI.get(i - 2).getHasInvested(), !harmI.get(i - 2).getIsHasQualified())); + data.put("${limi" + i + "}", ExcelTemplateReplacer.ReplacementData.create(harmI.get(i - 2).getLimitData(), false)); + data.put("${isi" + i + "}", ExcelTemplateReplacer.ReplacementData.create(isData(harmI.get(i - 2).getIsQualified()), false)); + } + List harmV = resultVO.getHarmV(); + for (int i = 2; i < harmV.size() + 2; i++) { + data.put("${notv" + i + "}", ExcelTemplateReplacer.ReplacementData.create(harmV.get(i - 2).getNotInvested(), !harmV.get(i - 2).getIsNotQualified())); + data.put("${hasv" + i + "}", ExcelTemplateReplacer.ReplacementData.create(harmV.get(i - 2).getHasInvested(), !harmV.get(i - 2).getIsHasQualified())); + data.put("${limv" + i + "}", ExcelTemplateReplacer.ReplacementData.create(harmV.get(i - 2).getLimitData(), false)); + data.put("${isv" + i + "}", ExcelTemplateReplacer.ReplacementData.create(isData(harmV.get(i - 2).getIsQualified()), false)); + } + + ExcelTemplateReplacer.replaceDownTemplate("pgjg.xlsx", + resultVO.getUser().getAssessName() + "_评估结果.xlsx", + data, + ExcelTemplateReplacer.getCellStyleConfig(), + response); + + + } + + } + + @Override + public void downTemplateAssessResult(HttpServletResponse response) throws IOException { + try (InputStream is = new ClassPathResource("pgjgmb.xlsx").getInputStream(); + Workbook workbook = new XSSFWorkbook(is)) { + try { + ServletOutputStream outputStream = response.getOutputStream(); + response.setHeader("Content-Disposition", "attachment; filename= 评估模板"); + response.setContentType("application/octet-stream;charset=UTF-8"); + workbook.write(outputStream); + outputStream.close(); + } catch (Exception e) { + System.out.println("评估结果异常" + e); + } finally { + if (workbook != null) { + workbook.close(); + } + } + } + } + + private String isData(Boolean b) { + if (b) { + return "合格"; + } + return "不合格"; + } + + private List getHarms(AssessResult result, AssessResultAddition resultAddition, AssessOverlimit overLimit, String type) { + List harmI = new ArrayList<>(); + try { + AssessResultVO.Harm harm; + for (int i = 2; i < 51; i++) { + harm = new AssessResultVO.Harm(); + String fieldName = type + i; + Field notField = result.getClass().getDeclaredField(fieldName); + notField.setAccessible(true); + harm.setNotInvested(new BigDecimal(notField.get(result).toString())); + Field hasField = resultAddition.getClass().getDeclaredField(fieldName); + hasField.setAccessible(true); + harm.setHasInvested(new BigDecimal(hasField.get(resultAddition).toString())); + if (ObjUtil.equals(type, "v")) { + if (i % 2 == 0) { + fieldName = "vevent"; + } else { + fieldName = "vodd"; + } + Field limitField = overLimit.getClass().getDeclaredField(fieldName); + limitField.setAccessible(true); + harm.setLimitData(new BigDecimal(limitField.get(overLimit).toString())); + } else { + Field limitField = overLimit.getClass().getDeclaredField(fieldName); + limitField.setAccessible(true); + harm.setLimitData(new BigDecimal(limitField.get(overLimit).toString())); + } + harm.setIsNotQualified(NumberUtil.isLess(harm.getNotInvested(), harm.getLimitData())); + harm.setIsHasQualified(NumberUtil.isLess(harm.getHasInvested(), harm.getLimitData())); + harm.setIsQualified(harm.getIsNotQualified() && harm.getIsHasQualified()); + harmI.add(harm); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return harmI; + } + + private List capOn(AssessResult result, Double userScale, AssessOverlimit overLimit) { + List capOn = new ArrayList<>(); + capOn.add(getUseless(result.getCapOnH100Deltav(), userScale, overLimit)); + capOn.add(getUseless(result.getCapOnH60Deltav(), userScale, overLimit)); + capOn.add(getUseless(result.getCapOnH0Deltav(), userScale, overLimit)); + capOn.add(getUseless(result.getCapOnL100Deltav(), userScale, overLimit)); + capOn.add(getUseless(result.getCapOnL60Deltav(), userScale, overLimit)); + capOn.add(getUseless(result.getCapOnL0Deltav(), userScale, overLimit)); + return capOn; + } + + private List capOff(AssessResult result, Double userScale, AssessOverlimit overLimit) { + List capOff = new ArrayList<>(); + capOff.add(getUseless(result.getCapOffH100Deltav(), userScale, overLimit)); + capOff.add(getUseless(result.getCapOffH60Deltav(), userScale, overLimit)); + capOff.add(getUseless(result.getCapOffH0Deltav(), userScale, overLimit)); + capOff.add(getUseless(result.getCapOffL100Deltav(), userScale, overLimit)); + capOff.add(getUseless(result.getCapOffL60Deltav(), userScale, overLimit)); + capOff.add(getUseless(result.getCapOffL0Deltav(), userScale, overLimit)); + return capOff; + } + + private AssessResultVO.Useless getUseless(BigDecimal result, Double userScale, AssessOverlimit overLimit) { + AssessResultVO.Useless uselessOffH100; + uselessOffH100 = new AssessResultVO.Useless(); + uselessOffH100.setPercent(result); + uselessOffH100.setVoltagePercent(NumberUtil.round(uselessOffH100.getPercent().multiply(BigDecimal.valueOf(userScale)), 2)); + uselessOffH100.setCapUP(overLimit.getDltavUp()); + uselessOffH100.setCapDown(overLimit.getDltavDown()); + uselessOffH100.setIsQualified(NumberUtil.isLess(uselessOffH100.getPercent(), uselessOffH100.getCapUP()) && + NumberUtil.isGreater(uselessOffH100.getPercent(), uselessOffH100.getCapDown())); + return uselessOffH100; + } + private AssessOverlimit assembleOverlimit(AssessOverlimit assessOverlimit, String assessId, Overlimit overlimit, double dmaxLimit, double flickerLimit, VoltageDeviationUtil.VoltageDeviationLimits voltageDeviationLimits, double voltageUnbalanceLimit) { assessOverlimit.setAssessId(assessId); assessOverlimit.setVodd(BigDecimal.valueOf(overlimit.getUharm3()).setScale(3, RoundingMode.HALF_UP)); diff --git a/pqs-advance/advance-boot/src/main/resources/pgjg.xlsx b/pqs-advance/advance-boot/src/main/resources/pgjg.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..49cbb2ed70e53b51c47b073cca43b36e27dbc95e GIT binary patch literal 19563 zcmd5^by$_l)sZR{E4fZfo54bb1a@u5E_ zWqSq!A`1!vg8XYYJsTSa7fXxu*e(e$X5_#l-y>u@>q!h0>Nzz2-c-0U*T}g!_R3U$ zLx4u+2R{Pv<<7A7h|s9+Fa5_lo~G54?hiE;H|&nx&*SUw@4->UFs!~Wa- z*|+nnK6S5AM!tIIZG~GR7r#kJG!0qb_NYWzs;2m7^S$Bh6XvE&6b<#C9UM17T~DrW z?oJ+%6KycgS@(w8>vZ-=nRno;W?$An3n7KQ^@oc<_aA0SBzOcp#6q>|PObp4`Lewb z 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 RF+eat+<_&zb0SZ4{|89w*|Y!v literal 0 HcmV?d00001 diff --git a/pqs-advance/advance-boot/src/main/resources/pgjgmb.xlsx b/pqs-advance/advance-boot/src/main/resources/pgjgmb.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e1695c6515bffdfd74f929b6b708a39aefbc3fde GIT binary patch literal 16831 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 z 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 SSur605&!`Lm&t#R_x}Ls@h6)A literal 0 HcmV?d00001 diff --git a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/api/HarmDataFeignClient.java b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/api/HarmDataFeignClient.java index e0209947c..64c796931 100644 --- a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/api/HarmDataFeignClient.java +++ b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/api/HarmDataFeignClient.java @@ -1,11 +1,13 @@ package com.njcn.harmonic.api; import com.njcn.common.pojo.constant.ServerInfo; +import com.njcn.common.pojo.param.StatisticsBizBaseParam; import com.njcn.common.pojo.response.HttpResult; import com.njcn.harmonic.api.fallback.HarmDataFeignClientFallbackFactory; import com.njcn.harmonic.pojo.param.HistoryHarmParam; import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO; +import com.njcn.harmonic.pojo.vo.AssessEvaluation; import com.njcn.influx.pojo.dto.HarmHistoryDataDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -44,4 +46,13 @@ public interface HarmDataFeignClient { */ @PostMapping("/getLinesRate") HttpResult> getLinesRate(@RequestBody StatSubstationBizBaseParam param); + + + /** + * 评估结果获取谐波电压和谐波电流含有率、三项不平横度和负序电流 + * @param param + * @return + */ + @PostMapping("/getHarmIAndHarmVData") + HttpResult getHarmIAndHarmVData(@RequestBody StatisticsBizBaseParam param); } diff --git a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/api/fallback/HarmDataFeignClientFallbackFactory.java b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/api/fallback/HarmDataFeignClientFallbackFactory.java index b51c78885..caa37d296 100644 --- a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/api/fallback/HarmDataFeignClientFallbackFactory.java +++ b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/api/fallback/HarmDataFeignClientFallbackFactory.java @@ -2,12 +2,14 @@ package com.njcn.harmonic.api.fallback; import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.common.pojo.param.StatisticsBizBaseParam; import com.njcn.common.pojo.response.HttpResult; import com.njcn.device.biz.utils.DeviceEnumUtil; import com.njcn.harmonic.api.HarmDataFeignClient; import com.njcn.harmonic.pojo.param.HistoryHarmParam; import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO; +import com.njcn.harmonic.pojo.vo.AssessEvaluation; import com.njcn.influx.pojo.dto.HarmHistoryDataDTO; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j; @@ -50,6 +52,12 @@ public class HarmDataFeignClientFallbackFactory implements FallbackFactory getHarmIAndHarmVData(StatisticsBizBaseParam param) { + log.error("{}异常,降级处理,异常为:{}", "评估结果获取谐波电压和谐波电流含有率、三项不平横度和负序电流", throwable.toString()); + throw new BusinessException(finalExceptionEnum); + } }; } } diff --git a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/AssessEvaluation.java b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/AssessEvaluation.java new file mode 100644 index 000000000..f56b5e349 --- /dev/null +++ b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/AssessEvaluation.java @@ -0,0 +1,28 @@ +package com.njcn.harmonic.pojo.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author wr + * @description + * @date 2025/8/26 14:38 + */ +@Data +public class AssessEvaluation implements Serializable { + + @ApiModelProperty("2-50次谐波电流含有率") + private List iMax; + + @ApiModelProperty("三项不平衡度") + private Double unbalance; + + @ApiModelProperty("2-50次谐波电压含有率") + private List uMax; + + @ApiModelProperty("负序电流") + private Double iNeg; +} diff --git a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/utils/WordUtil2.java b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/utils/WordUtil2.java index b781af70d..f1bec12af 100644 --- a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/utils/WordUtil2.java +++ b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/utils/WordUtil2.java @@ -71,7 +71,7 @@ public class WordUtil2 { CustomXWPFDocument doc = null; //读取报告模板 try { - inStream = new ClassPathResource(path).getInputStream();; + inStream = new ClassPathResource(path).getInputStream(); doc = new CustomXWPFDocument(inStream); this.replaceInTable(doc,params,tableList); this.replaceInPara(doc, params); diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/HistoryResultController.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/HistoryResultController.java index 6f35ef862..11c21089a 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/HistoryResultController.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/HistoryResultController.java @@ -13,6 +13,7 @@ import com.njcn.harmonic.pojo.param.HistoryParam; import com.njcn.harmonic.pojo.param.NormHistoryParam; import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO; +import com.njcn.harmonic.pojo.vo.AssessEvaluation; import com.njcn.harmonic.pojo.vo.HistoryDataResultVO; import com.njcn.harmonic.pojo.vo.StatHarmonicOrgVO; import com.njcn.harmonic.service.HistoryResultService; @@ -127,4 +128,13 @@ public class HistoryResultController extends BaseController { ); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getHarmIAndHarmVData") + @ApiOperation("评估结果获取谐波电压和谐波电流含有率、三项不平横度和负序电流") + @ApiImplicitParam(name = "param", value = "获取越线监测点越线次数请求参数", required = true) + public HttpResult getHarmIAndHarmVData(@RequestBody StatisticsBizBaseParam param) { + String methodDescribe = getMethodDescribe("getHarmIAndHarmVData"); + AssessEvaluation harmIAndHarmVData = historyResultService.getHarmIAndHarmVData(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, harmIAndHarmVData, methodDescribe); + } } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatDataHarmRateIDMapper.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatDataHarmRateIDMapper.java new file mode 100644 index 000000000..98b892ff8 --- /dev/null +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatDataHarmRateIDMapper.java @@ -0,0 +1,13 @@ +package com.njcn.harmonic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.njcn.harmonic.pojo.po.day.RStatDataHarmrateIDPO; + +/** + * @Description: + * @Author: wr + * @Date: 2024/7/31 9:24 + */ +public interface RStatDataHarmRateIDMapper extends BaseMapper { + +} diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatDataHarmRateVDMapper.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatDataHarmRateVDMapper.java new file mode 100644 index 000000000..2b27ba58d --- /dev/null +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatDataHarmRateVDMapper.java @@ -0,0 +1,13 @@ +package com.njcn.harmonic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.njcn.harmonic.pojo.po.day.RStatDataHarmrateVDPO; + +/** + * @Description: + * @Author: wr + * @Date: 2024/7/31 9:24 + */ +public interface RStatDataHarmRateVDMapper extends BaseMapper { + +} diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/HistoryResultService.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/HistoryResultService.java index 3934d60ce..06ddc0882 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/HistoryResultService.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/HistoryResultService.java @@ -4,6 +4,7 @@ import com.njcn.common.pojo.param.StatisticsBizBaseParam; import com.njcn.harmonic.pojo.param.HistoryHarmParam; import com.njcn.harmonic.pojo.param.HistoryParam; import com.njcn.harmonic.pojo.param.NormHistoryParam; +import com.njcn.harmonic.pojo.vo.AssessEvaluation; import com.njcn.harmonic.pojo.vo.HistoryDataResultVO; import com.njcn.harmonic.pojo.vo.StatHarmonicOrgVO; import com.njcn.influx.pojo.dto.HarmHistoryDataDTO; @@ -47,4 +48,9 @@ public interface HistoryResultService { * @return HarmHistoryDataDTO */ HarmHistoryDataDTO getHistoryHarmData(HistoryHarmParam historyHarmParam); + + /** + * 二级评估评估数据 + */ + AssessEvaluation getHarmIAndHarmVData(StatisticsBizBaseParam param); } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/HistoryResultServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/HistoryResultServiceImpl.java index 857efbf2e..5fa753cea 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/HistoryResultServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/HistoryResultServiceImpl.java @@ -1,14 +1,17 @@ package com.njcn.harmonic.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.njcn.common.pojo.constant.BizParamConstant; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.pojo.param.StatisticsBizBaseParam; import com.njcn.common.utils.PubUtils; +import com.njcn.dataProcess.pojo.po.RStatDataHarmRateVD; import com.njcn.device.biz.commApi.CommTerminalGeneralClient; import com.njcn.device.biz.pojo.dto.LineDevGetDTO; import com.njcn.device.biz.pojo.po.Overlimit; @@ -16,19 +19,21 @@ import com.njcn.device.biz.pojo.po.PqsDeviceUnit; import com.njcn.device.biz.utils.COverlimitUtil; import com.njcn.event.api.EventDetailFeignClient; import com.njcn.event.pojo.po.EventDetail; +import com.njcn.event.pojo.po.RmpEventDetailPO; import com.njcn.harmonic.enums.HarmonicResponseEnum; -import com.njcn.harmonic.mapper.StatHarmonicOrgDMapper; -import com.njcn.harmonic.mapper.StatHarmonicOrgMMapper; -import com.njcn.harmonic.mapper.StatHarmonicOrgQMapper; -import com.njcn.harmonic.mapper.StatHarmonicOrgYMapper; +import com.njcn.harmonic.mapper.*; import com.njcn.harmonic.pojo.QueryResultLimitVO; import com.njcn.harmonic.pojo.param.HistoryHarmParam; import com.njcn.harmonic.pojo.param.HistoryParam; import com.njcn.harmonic.pojo.param.NormHistoryParam; +import com.njcn.harmonic.pojo.po.RStatDataVD; +import com.njcn.harmonic.pojo.po.day.*; +import com.njcn.harmonic.pojo.vo.AssessEvaluation; import com.njcn.harmonic.pojo.vo.EventDetailVO; import com.njcn.harmonic.pojo.vo.HistoryDataResultVO; import com.njcn.harmonic.pojo.vo.StatHarmonicOrgVO; import com.njcn.harmonic.service.HistoryResultService; +import com.njcn.harmonic.service.IRStatDataVDService; import com.njcn.influx.imapper.CommonMapper; import com.njcn.influx.imapper.DataHarmRateVMapper; import com.njcn.influx.imapper.DataIMapper; @@ -44,12 +49,15 @@ import com.njcn.system.pojo.po.DictData; import com.njcn.user.api.DeptFeignClient; import com.njcn.user.pojo.dto.DeptDTO; import com.njcn.web.utils.WebUtil; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; @@ -90,6 +98,10 @@ public class HistoryResultServiceImpl implements HistoryResultService { private final DicDataFeignClient dicDataFeignClient; + private final RStatDataIDMapper dataIDMapper; + private final RStatDataVDMapper dataVDMapper; + private final RStatDataHarmRateVDMapper dataHarmRateVDMapper; + private final RStatDataHarmRateIDMapper dataHarmRateIDMapper; @Override public List getHistoryResult(HistoryParam historyParam) { @@ -1078,6 +1090,99 @@ public class HistoryResultServiceImpl implements HistoryResultService { return new HarmHistoryDataDTO(historyData, overLimit); } + @Override + public AssessEvaluation getHarmIAndHarmVData(StatisticsBizBaseParam param) { + String id = param.getId(); + String startTime = param.getStartTime(); + String endTime = param.getEndTime(); + List rStatDataIDPOS = dataIDMapper.selectList(new LambdaQueryWrapper() + .eq(RStatDataIDPO::getLineId, id) + .eq(RStatDataIDPO::getValueType,"CP95") + .in(RStatDataIDPO::getPhaseType,Arrays.asList("A","B","C")) + .ge(RStatDataIDPO::getTime, DateUtil.beginOfDay(DateUtil.parse(startTime))) + .le(RStatDataIDPO::getTime, DateUtil.endOfDay(DateUtil.parse(endTime))) + ); + List rStatDataVDS = dataVDMapper.selectList(new LambdaQueryWrapper() + .eq(RStatDataVD::getLineId, id) + .eq(RStatDataVD::getValueType,"CP95") + .in(RStatDataVD::getPhasicType,Arrays.asList("A","B","C")) + .ge(RStatDataVD::getTime, DateUtil.beginOfDay(DateUtil.parse(startTime))) + .le(RStatDataVD::getTime, DateUtil.endOfDay(DateUtil.parse(endTime))) + ); + List harmV = dataHarmRateVDMapper.selectList(new LambdaQueryWrapper() + .eq(RStatDataHarmrateVDPO::getLineId, id) + .eq(RStatDataHarmrateVDPO::getValueType,"CP95") + .in(RStatDataHarmrateVDPO::getPhaseType,Arrays.asList("A","B","C")) + .ge(RStatDataHarmrateVDPO::getTime, DateUtil.beginOfDay(DateUtil.parse(startTime))) + .le(RStatDataHarmrateVDPO::getTime, DateUtil.endOfDay(DateUtil.parse(endTime))) + ); + + List harmI = dataHarmRateIDMapper.selectList(new LambdaQueryWrapper() + .eq(RStatDataHarmrateIDPO::getLineId, id) + .eq(RStatDataHarmrateIDPO::getValueType,"CP95") + .in(RStatDataHarmrateIDPO::getPhaseType,Arrays.asList("A","B","C")) + .ge(RStatDataHarmrateIDPO::getTime, DateUtil.beginOfDay(DateUtil.parse(startTime))) + .le(RStatDataHarmrateIDPO::getTime, DateUtil.endOfDay(DateUtil.parse(endTime))) + ); + + AssessEvaluation assessEvaluation=new AssessEvaluation(); + List iMax=new ArrayList<>(); + List uMax=new ArrayList<>(); + if(CollUtil.isNotEmpty(rStatDataIDPOS)&&CollUtil.isNotEmpty(rStatDataVDS)&&CollUtil.isNotEmpty(harmV)&&CollUtil.isNotEmpty(harmI)){ + Double iNeg = rStatDataIDPOS.stream().map(RStatDataIDPO::getINeg).max(Comparator.naturalOrder()).get(); + assessEvaluation.setINeg(iNeg); + BigDecimal vUnbalance = rStatDataVDS.stream().map(RStatDataVD::getVUnbalance).max(Comparator.naturalOrder()).get(); + assessEvaluation.setUnbalance(vUnbalance.doubleValue()); + for (int i = 2; i < 51; i++) { + uMax.add(reflectDataV(harmV,"v"+i).stream().max(Comparator.naturalOrder()).get()); + iMax.add(reflectDataI(harmI,"i"+i).stream().max(Comparator.naturalOrder()).get()); + } + assessEvaluation.setIMax(iMax); + assessEvaluation.setUMax(uMax); + }else{ + return null; + } + return assessEvaluation; + } + + private List reflectDataV(List harmVList,String attribute) { + Field field; + try { + field = RStatDataHarmrateVDPO.class.getDeclaredField(attribute); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + field.setAccessible(true); + return harmVList.stream().map(temp -> { + Double o; + try { + o = (Double) field.get(temp); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + return o; + }).collect(Collectors.toList()); + } + + private List reflectDataI(List harmIList,String attribute) { + Field field; + try { + field = RStatDataHarmrateIDPO.class.getDeclaredField(attribute); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + field.setAccessible(true); + return harmIList.stream().map(temp -> { + Double o; + try { + o = (Double) field.get(temp); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + return o; + }).collect(Collectors.toList()); + } + /*** * 获取指定次数 监测点的历史谐波电流数据 * @author hongawen