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/pom.xml b/pqs-advance/advance-boot/pom.xml index 4dfefee44..2eceb2746 100644 --- a/pqs-advance/advance-boot/pom.xml +++ b/pqs-advance/advance-boot/pom.xml @@ -45,7 +45,11 @@ ${project.version} compile - + + com.njcn + harmonic-api + ${project.version} + com.njcn advance-api @@ -112,6 +116,7 @@ false *.dll + *.xlsx 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 000000000..49cbb2ed7 Binary files /dev/null and b/pqs-advance/advance-boot/src/main/resources/pgjg.xlsx differ 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 000000000..e1695c651 Binary files /dev/null and b/pqs-advance/advance-boot/src/main/resources/pgjgmb.xlsx differ 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