From 5c36e2e4f4b6827658e52097ae3f4aaa3af878b5 Mon Sep 17 00:00:00 2001 From: xy <748613696@qq.com> Date: Tue, 25 Jun 2024 17:36:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E7=9B=91=E6=B5=8B=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=201.=E5=8A=A8=E6=80=81=E7=94=9F=E6=88=90=E9=A2=84?= =?UTF-8?q?=E5=91=8A=E8=AD=A6=E5=8D=95=E3=80=81=E4=B8=8B=E8=BD=BD=E9=A2=84?= =?UTF-8?q?=E5=91=8A=E8=AD=A6=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/njcn/oss/constant/OssPath.java | 5 + .../device/pq/pojo/vo/ReportLineInfoVo.java | 4 +- .../device/pq/mapper/mapping/LineMapper.xml | 2 +- .../com/njcn/harmonic/utils/WordUtil2.java | 63 ++++-- .../pojo/param/device/OnlineParam.java | 3 + .../pojo/po/device/LineWarning.java | 4 + .../pojo/po/leaflet/WarningLeaflet.java | 4 + .../supervision/pojo/vo/device/OnlineVo.java | 3 + .../pojo/vo/leaflet/WarningLeafletVO.java | 4 + pqs-supervision/supervision-boot/pom.xml | 16 ++ .../device/LineWarningController.java | 4 +- .../device/mapping/LineWarningMapper.xml | 3 +- .../leaflet/mapping/WarningLeafletMapper.xml | 3 +- .../service/device/ILineWarningService.java | 2 +- .../device/impl/LineWarningServiceImpl.java | 202 +++++++++++------- .../leaflet/IWarningLeafletService.java | 3 +- .../impl/WarningLeafletServiceImpl.java | 11 +- ...SupervisionUserComplaintPOServiceImpl.java | 5 +- .../survey/impl/SurveyTestServiceImpl.java | 3 +- .../main/resources/file/warningReport.docx | Bin 18216 -> 18065 bytes 20 files changed, 236 insertions(+), 108 deletions(-) diff --git a/pqs-common/common-oss/src/main/java/com/njcn/oss/constant/OssPath.java b/pqs-common/common-oss/src/main/java/com/njcn/oss/constant/OssPath.java index 2b038d654..34b734dde 100644 --- a/pqs-common/common-oss/src/main/java/com/njcn/oss/constant/OssPath.java +++ b/pqs-common/common-oss/src/main/java/com/njcn/oss/constant/OssPath.java @@ -131,4 +131,9 @@ public interface OssPath { */ String THEME="theme/"; + /** + * 在线监测预告警单 + */ + String ONLINE_REPORT="onlineReport/"; + } diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/ReportLineInfoVo.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/ReportLineInfoVo.java index 6ded74d9b..d308e659f 100644 --- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/ReportLineInfoVo.java +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/ReportLineInfoVo.java @@ -45,8 +45,8 @@ public class ReportLineInfoVo implements Serializable { @ApiModelProperty("供电设备容量") private Double devCapacity; - @ApiModelProperty("供电设备容量") - private Double standardCapacity; + @ApiModelProperty("协议容量") + private Double dealCapacity; @ApiModelProperty("超标天数") private Integer overDays; diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml index 735790c32..eede459e7 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml @@ -1701,7 +1701,7 @@ pd.IP ip, pld.Short_Capacity shortCapacity, pld.Dev_Capacity devCapacity, - pld.Standard_Capacity standardCapacity + pld.Deal_Capacity dealCapacity from pq_line pl left join pq_line_detail pld on pl.Id = pld.Id 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 5513c9c1b..3df4584a9 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 @@ -1,9 +1,12 @@ package com.njcn.harmonic.utils; +import ch.qos.logback.core.rolling.helper.FileStoreUtil; +import cn.hutool.core.collection.CollUtil; import org.apache.poi.xwpf.usermodel.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; +import org.springframework.util.CollectionUtils; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; @@ -51,6 +54,42 @@ public class WordUtil2 { } } + public InputStream getReportFile(String path, Map params, List> tableList) + throws Exception { + path = ClearPathUtil.cleanString(path); + InputStream inStream = null,in = null; + CustomXWPFDocument doc = null; + //读取报告模板 + try { + inStream = new ClassPathResource(path).getInputStream();; + doc = new CustomXWPFDocument(inStream); + this.replaceInTable(doc,params,tableList); + this.replaceInPara(doc, params); + } catch (IOException e) { + logger.error("获取报告模板异常,原因为:" + e); + } finally { + if (null != inStream) { + inStream.close(); + } + } + try { + //临时缓冲区 + ByteArrayOutputStream out = new ByteArrayOutputStream(); + doc.write(out); + byte[] docByteAry = out.toByteArray(); + in = new ByteArrayInputStream(docByteAry); + out.close(); + } catch (Exception e) { + logger.error("输出稳态报告异常,原因为:" + e); + } finally { + if (doc != null) { + doc.close(); + } + } + return in; + } + + /** * 替换段落里面的变量 * @@ -212,14 +251,16 @@ public class WordUtil2 { private static void insertTable(XWPFTable table, List tableList) { //删除占位符行数 table.removeRow(1); - // 创建行,根据需要插入的数据添加新行,不处理表头 - for (int i = 0; i < tableList.size(); i++) { - XWPFTableRow row = table.createRow(); - List cells = row.getTableCells(); - for (int j = 0; j < cells.size(); j++) { - XWPFTableCell cell = cells.get(j); - String s = tableList.get(i)[j]; - cell.setText(s); + if (CollUtil.isNotEmpty(tableList)) { + // 创建行,根据需要插入的数据添加新行,不处理表头 + for (int i = 0; i < tableList.size(); i++) { + XWPFTableRow row = table.createRow(); + List cells = row.getTableCells(); + for (int j = 0; j < cells.size(); j++) { + XWPFTableCell cell = cells.get(j); + String s = tableList.get(i)[j]; + cell.setText(s); + } } } } @@ -247,10 +288,8 @@ public class WordUtil2 { for (XWPFTableRow row : rows) { cells = row.getTableCells(); for (XWPFTableCell cell : cells) { - paras = cell.getParagraphs(); - for (XWPFParagraph para : paras) { - this.replaceInPara(para, params, doc); - } + List paragraphListTable = cell.getParagraphs(); + processParagraphs(paragraphListTable, params, doc); } } } else { diff --git a/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/param/device/OnlineParam.java b/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/param/device/OnlineParam.java index 1d3d86651..5bcee1733 100644 --- a/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/param/device/OnlineParam.java +++ b/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/param/device/OnlineParam.java @@ -59,6 +59,9 @@ public class OnlineParam extends BaseParam implements Serializable { @ApiModelProperty(name = "issueDetail", value = "问题描述") private String issueDetail; + @ApiModelProperty(name = "reformAdvice", value = "整改意见") + private String reformAdvice; + @ApiModelProperty(name = "year", value = "年") private String year; diff --git a/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/po/device/LineWarning.java b/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/po/device/LineWarning.java index 5f3f36af2..63134ad9a 100644 --- a/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/po/device/LineWarning.java +++ b/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/po/device/LineWarning.java @@ -82,4 +82,8 @@ public class LineWarning extends BaseEntity implements Serializable { */ private Integer thresholdResource; + /** + * 预告警单id + */ + private String leafletId; } diff --git a/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/po/leaflet/WarningLeaflet.java b/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/po/leaflet/WarningLeaflet.java index 9a2bfeeca..36c0d8b5c 100644 --- a/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/po/leaflet/WarningLeaflet.java +++ b/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/po/leaflet/WarningLeaflet.java @@ -93,5 +93,9 @@ public class WarningLeaflet extends BaseEntity implements Serializable{ */ private Integer state; + /** + * 预告警单文件路径 + */ + private String filePath; } diff --git a/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/vo/device/OnlineVo.java b/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/vo/device/OnlineVo.java index 077315e5c..dea24e5ed 100644 --- a/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/vo/device/OnlineVo.java +++ b/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/vo/device/OnlineVo.java @@ -73,4 +73,7 @@ public class OnlineVo implements Serializable { @ApiModelProperty("数据来源 0:系统默认 1:自定义") private Integer dataResource; + + @ApiModelProperty("当前流程(null:无流程 1:预警 2:告警)") + private Integer step; } diff --git a/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/vo/leaflet/WarningLeafletVO.java b/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/vo/leaflet/WarningLeafletVO.java index 390ebf1a2..a4a8294c2 100644 --- a/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/vo/leaflet/WarningLeafletVO.java +++ b/pqs-supervision/supervision-api/src/main/java/com/njcn/supervision/pojo/vo/leaflet/WarningLeafletVO.java @@ -1,6 +1,7 @@ package com.njcn.supervision.pojo.vo.leaflet; import com.njcn.db.bo.BaseEntity; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -116,4 +117,7 @@ public class WarningLeafletVO extends BaseEntity implements Serializable{ * 责任单位名称 */ private String dutyOrgName; + + @ApiModelProperty("预告警单下载路径") + private String filePath; } diff --git a/pqs-supervision/supervision-boot/pom.xml b/pqs-supervision/supervision-boot/pom.xml index e550e05ad..c93776d33 100644 --- a/pqs-supervision/supervision-boot/pom.xml +++ b/pqs-supervision/supervision-boot/pom.xml @@ -58,11 +58,26 @@ 1.0.0 compile + + com.njcn + common-oss + ${project.version} + supervision-boot + + org.apache.maven.plugins + maven-resources-plugin + + UTF-8 + + docx + + + org.apache.maven.plugins maven-compiler-plugin @@ -70,6 +85,7 @@ -Xlint:unchecked + org.springframework.boot diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/controller/device/LineWarningController.java b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/controller/device/LineWarningController.java index 60d786469..e011ab4b7 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/controller/device/LineWarningController.java +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/controller/device/LineWarningController.java @@ -75,9 +75,9 @@ public class LineWarningController extends BaseController { @PostMapping("/report") @ApiOperation("发起预告警单") @ApiImplicitParam(name = "param", value = "参数", required = true) - public HttpResult startReport(@RequestBody @Validated OnlineParam.ReportParam param, HttpServletResponse response) { + public HttpResult startReport(@RequestBody @Validated OnlineParam.ReportParam param) { String methodDescribe = getMethodDescribe("startReport"); - lineWarningService.startReport(param,response); + lineWarningService.startReport(param); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, "success", methodDescribe); } diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/mapper/device/mapping/LineWarningMapper.xml b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/mapper/device/mapping/LineWarningMapper.xml index fb8ebc78b..ad72ecd94 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/mapper/device/mapping/LineWarningMapper.xml +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/mapper/device/mapping/LineWarningMapper.xml @@ -14,7 +14,8 @@ B.Obj_Name objectName, A.target_type targetType, A.over_limit_day overLimitDay, - A.initiate_warning_flag dataResource + A.initiate_warning_flag dataResource, + A.step step from supervision_line_warning A left join pq_line p1 on A.line_id = p1.Id diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/mapper/leaflet/mapping/WarningLeafletMapper.xml b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/mapper/leaflet/mapping/WarningLeafletMapper.xml index 57aec79df..e736f9d83 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/mapper/leaflet/mapping/WarningLeafletMapper.xml +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/mapper/leaflet/mapping/WarningLeafletMapper.xml @@ -23,7 +23,8 @@ supervision_warning_leaflet.create_by, supervision_warning_leaflet.create_time, supervision_warning_leaflet.update_by, - supervision_warning_leaflet.update_time + supervision_warning_leaflet.update_time, + supervision_warning_leaflet.file_path FROM supervision_warning_leaflet supervision_warning_leaflet WHERE ${ew.sqlSegment} diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/ILineWarningService.java b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/ILineWarningService.java index 67741eb57..f7f2b4c8e 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/ILineWarningService.java +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/ILineWarningService.java @@ -40,6 +40,6 @@ public interface ILineWarningService extends IService { * @param param * @return */ - void startReport(OnlineParam.ReportParam param, HttpServletResponse response); + void startReport(OnlineParam.ReportParam param); } diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/LineWarningServiceImpl.java b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/LineWarningServiceImpl.java index f18e4cbed..2815bec4b 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/LineWarningServiceImpl.java +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/LineWarningServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.jeffreyning.mybatisplus.service.MppServiceImpl; import com.njcn.common.pojo.enums.common.ServerEnum; @@ -21,6 +22,10 @@ import com.njcn.harmonic.api.RStatLimitRateDClient; import com.njcn.harmonic.pojo.param.RStatLimitQueryParam; import com.njcn.harmonic.pojo.po.day.RStatLimitTargetDPO; import com.njcn.harmonic.pojo.vo.RStatLimitTargetVO; +import com.njcn.harmonic.utils.WordUtil2; +import com.njcn.oss.constant.OssPath; +import com.njcn.oss.utils.FileStorageUtil; +import com.njcn.supervision.enums.ProblemTypeEnum; import com.njcn.supervision.mapper.device.LineWarningMapper; import com.njcn.supervision.pojo.param.device.OnlineParam; import com.njcn.supervision.pojo.po.device.LineWarning; @@ -31,15 +36,18 @@ import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.enums.DicDataEnum; import com.njcn.system.enums.DicDataTypeEnum; import com.njcn.system.pojo.po.DictData; +import com.njcn.user.api.DeptFeignClient; import com.njcn.web.factory.PageFactory; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; import java.lang.reflect.Method; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.function.Function; @@ -63,6 +71,8 @@ public class LineWarningServiceImpl extends MppServiceImpl result = new ArrayList<>(); - //获取指标集合(10个指标,包含总指标) - List dataList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.STEADY_STATIS.getCode()).getData(); + //获取指标集合(8个指标,包含总指标) + List dataList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.INDICATOR_TYPE.getCode()).getData(); Map targetMap = dataList.stream().collect(Collectors.toMap(DictData::getCode, Function.identity())); //获取监测点和部门表关系 List deptLines = deptLineFeignClient.getAllData().getData(); @@ -144,26 +150,22 @@ public class LineWarningServiceImpl extends MppServiceImpl{ String deptId = Objects.isNull(deptLineMap.get(item.getLineId()))?null:deptLineMap.get(item.getLineId()).get(0).getId(); //频率偏差 - LineWarning l1 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.FREQUENCY_DEV.getCode()).getId(),item.getFreqDevOvertime()); + LineWarning l1 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.PLPC_ENUM.getCode()).getId(),item.getFreqDevOvertime()); //电压偏差 - LineWarning l2 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.VOLTAGE_DEV.getCode()).getId(),item.getVoltageDevOvertime()); + LineWarning l2 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.DYPC_ENUM.getCode()).getId(),item.getVoltageDevOvertime()); //长时闪变 - LineWarning l3 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.FLICKER.getCode()).getId(),item.getFlickerOvertime()); + LineWarning l3 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.CSSB_ENUM.getCode()).getId(),item.getFlickerOvertime()); //谐波电压 - LineWarning l4 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.HARMONIC_VOLTAGE.getCode()).getId(),item.getUharmOvertime()); + LineWarning l4 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.XBDY_ENUM.getCode()).getId(),item.getUharmOvertime()); //谐波电流 - LineWarning l5 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.HARMONIC_CURRENT.getCode()).getId(),item.getIharmOvertime()); + LineWarning l5 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.XBDL_ENUM.getCode()).getId(),item.getIharmOvertime()); //间谐波电压 - LineWarning l6 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.INTERHARMONIC_VOLTAGE.getCode()).getId(),item.getInuharmOvertime()); + LineWarning l6 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.JXBDY_ENUM.getCode()).getId(),item.getInuharmOvertime()); //负序电压不平衡度 - LineWarning l7 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.PHASE_VOLTAGE.getCode()).getId(),item.getUbalanceOvertime()); + LineWarning l7 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.SXDYBPHD_ENUM.getCode()).getId(),item.getUbalanceOvertime()); //负序电流 - LineWarning l8 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.NEG_CURRENT.getCode()).getId(),item.getINegOvertime()); - //电压总谐波畸变率 - LineWarning l9 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.THD_V.getCode()).getId(),item.getUaberranceOvertime()); - //总稳态指标 - LineWarning l10 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.TOTAL_INDICATOR.getCode()).getId(),item.getAllOvertime()); - result.addAll(Arrays.asList(l1,l2,l3,l4,l5,l6,l7,l8,l9,l10)); + LineWarning l8 = overData(firstDayOfMonth,item.getLineId(),deptId,targetMap.get(DicDataEnum.FXDL_ENUM.getCode()).getId(),item.getINegOvertime()); + result.addAll(Arrays.asList(l1,l2,l3,l4,l5,l6,l7,l8)); }); } //将装置无数据的统计入库 按运维要求,判断装置的最新数据不是当天,则认为装置无数据 @@ -197,16 +199,16 @@ public class LineWarningServiceImpl extends MppServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.between("A.alarm_time", param.getSearchBeginTime(),param.getSearchEndTime()); + if (CollUtil.isNotEmpty(lineList)) { + queryWrapper.in("A.line_id",lineList); + } //查询无数据的监测点 if (Objects.equals(param.getDataType(),0)){ queryWrapper.eq("A.target_type", "0"); } //查询指标超标的监测点 else { - queryWrapper.ge("A.over_limit_day", param.getAlertThreshold()); - if (CollUtil.isNotEmpty(lineList)) { - queryWrapper.in("A.line_id",lineList); - } + queryWrapper.ge("A.over_limit_day", param.getAlarmThreshold()); if (CollUtil.isNotEmpty(param.getTargetList())) { queryWrapper.in("A.target_type", param.getTargetList()); } @@ -217,19 +219,89 @@ public class LineWarningServiceImpl extends MppServiceImpl allLineWarnings = new ArrayList<>(); + //获取部门名称 + String deptName = deptFeignClient.getDeptById(param.getDeptId()).getData().getName(); + param.setDeptName(deptName); + WordUtil2 wordUtil2 = new WordUtil2(); + String inputUrl = "file/warningReport.docx"; + String fileName = "电能[告]"+param.getYear()+"年"+param.getNumber()+"号-"+param.getDeptName()+"地市 电能质量技术监督告警单.docx"; //获取无数据监测点集合 - List list1 = getReportLineInfo(true,param.getIdList(),null,param.getSearchBeginTime(),param.getSearchEndTime(),param.getDeptId()); + List list1 = getReportLineInfo(true,param.getIdList(),null,param.getSearchBeginTime(),param.getSearchEndTime(),param.getDeptId(),allLineWarnings); //获取谐波电压超标监测点集合 - String vCode = dicDataFeignClient.getDicDataByCode(DicDataEnum.HARMONIC_VOLTAGE.getCode()).getData().getId(); - List list2 = getReportLineInfo(false,param.getIdList(),vCode,param.getSearchBeginTime(),param.getSearchEndTime(),null); + String vCode = dicDataFeignClient.getDicDataByCode(DicDataEnum.XBDY_ENUM.getCode()).getData().getId(); + List list2 = getReportLineInfo(false,param.getIdList(),vCode,param.getSearchBeginTime(),param.getSearchEndTime(),null,allLineWarnings); //获取谐波电流超标监测点集合 - String iCode = dicDataFeignClient.getDicDataByCode(DicDataEnum.HARMONIC_CURRENT.getCode()).getData().getId(); - List list3 = getReportLineInfo(false,param.getIdList(),iCode,param.getSearchBeginTime(),param.getSearchEndTime(),null); + String iCode = dicDataFeignClient.getDicDataByCode(DicDataEnum.XBDL_ENUM.getCode()).getData().getId(); + List list3 = getReportLineInfo(false,param.getIdList(),iCode,param.getSearchBeginTime(),param.getSearchEndTime(),null,allLineWarnings); + try { + Map dataMap = new HashMap(); + dataMap.put("${year}", param.getYear()); + dataMap.put("${number}", param.getNumber()); + dataMap.put("${deptName}", param.getDeptName()); + dataMap.put("${startTime}", new SimpleDateFormat(DatePattern.CHINESE_DATE_PATTERN).format(new SimpleDateFormat(DatePattern.NORM_DATE_PATTERN).parse(param.getSearchBeginTime()))); + dataMap.put("${endTime}", new SimpleDateFormat(DatePattern.CHINESE_DATE_PATTERN).format(new SimpleDateFormat(DatePattern.NORM_DATE_PATTERN).parse(param.getSearchEndTime()))); + dataMap.put("${noData}", CollUtil.isEmpty(list1)?"0":String.valueOf(list1.size())); + dataMap.put("${harmonicV}", CollUtil.isEmpty(list2)?"0":String.valueOf(list2.size())); + dataMap.put("${harmonicI}", CollUtil.isEmpty(list3)?"0":String.valueOf(list3.size())); + dataMap.put("${alarmDay}", String.valueOf(param.getAlarmThreshold())); + List dataList1 = new ArrayList(),dataList2 = new ArrayList(),dataList3 = new ArrayList(); + if (CollUtil.isNotEmpty(list1)) { + list1.forEach(item->{ + dataList1.add(new String[]{deptName,item.getLineVoltage(),item.getLineName(),item.getSubName(),item.getObjName(),item.getSubVName(),item.getUpdateTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)),item.getIp()}); + }); + } + if (CollUtil.isNotEmpty(list2)) { + list2.forEach(item->{ + dataList2.add(new String[]{deptName,item.getLineName(),item.getSubName(),item.getObjName(),String.valueOf(item.getOverDays())}); + }); + } + if (CollUtil.isNotEmpty(list3)) { + list3.forEach(item->{ + dataList3.add(new String[]{deptName,item.getLineName(),item.getSubName(),item.getObjName(),String.valueOf(item.getOverDays()),String.valueOf(item.getShortCapacity()),String.valueOf(item.getDevCapacity()),String.valueOf(item.getDealCapacity())}); + }); + } + List> tableList = Arrays.asList(dataList1,dataList2,dataList3); + InputStream inputStream = wordUtil2.getReportFile(inputUrl,dataMap,tableList); + //上传文件服务器 + String path = fileStorageUtil.uploadStreamSpecifyName(inputStream, OssPath.ONLINE_REPORT, fileName); + //1.生成预告警单数据 + String leafletId = warningLeafletService.createLeaflet( + ProblemTypeEnum.ONLINE.getName() + ,param.getDeptId() + ,IdWorker.get32UUID() + ,null + ,ProblemTypeEnum.ONLINE.getCode() + ,param.getType() + ,param.getIssueDetail() + ,param.getReformAdvice() + ,path); + //2.将选择的数据状态改成预警或者告警 && 将选择的数据添加预告警单id + if (CollUtil.isNotEmpty(allLineWarnings)) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(LineWarning::getId,param.getIdList()) + .notIn(LineWarning::getTargetType,Arrays.asList(vCode,iCode)) + .between(LineWarning::getAlarmTime,param.getSearchBeginTime(),param.getSearchEndTime()); + allLineWarnings.addAll(this.baseMapper.selectList(lambdaQueryWrapper)); + allLineWarnings.forEach(item->{ + item.setStep(param.getType()); + item.setInitiateWarningFlag(1); + if (!Objects.equals(item.getTargetType(),"0")) { + item.setAlertThreshold(param.getAlertThreshold()); + item.setAlarmThreshold(param.getAlarmThreshold()); + } + item.setLeafletId(leafletId); + }); + this.updateBatchByMultiId(allLineWarnings); + } + } catch (Exception e) { + throw new RuntimeException(e); + } } - public List getReportLineInfo(boolean type, List idList, String codeId, String startTime, String endTime, String deptId) { + public List getReportLineInfo(boolean type, List idList, String codeId, String startTime, String endTime, String deptId,List allLineWarnings) { List list = new ArrayList<>(); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); if (type) { @@ -243,6 +315,7 @@ public class LineWarningServiceImpl extends MppServiceImpl warnings = this.baseMapper.selectList(lambdaQueryWrapper); if (CollUtil.isNotEmpty(warnings)) { + allLineWarnings.addAll(warnings); List lineList = warnings.stream().map(LineWarning::getLineId).collect(Collectors.toList()); list = lineFeignClient.getReportLineInfo(lineList).getData(); if (!type){ @@ -292,19 +365,19 @@ public class LineWarningServiceImpl extends MppServiceImpl clazz = limitTarget.getClass(); for (int i = 2; i <= 25; i++) { @@ -316,7 +389,7 @@ public class LineWarningServiceImpl extends MppServiceImpl clazz = limitTarget.getClass(); for (int i = 2; i <= 25; i++) { @@ -328,7 +401,7 @@ public class LineWarningServiceImpl extends MppServiceImpl clazz = limitTarget.getClass(); for (int i = 1; i <= 16; i++) { @@ -340,48 +413,13 @@ public class LineWarningServiceImpl extends MppServiceImpl clazz = limitTarget.getClass(); - for (int i = 2; i <= 25; i++) { - String methodName1 = "getUharm" + i + "Overtime"; - Method method1 = clazz.getMethod(methodName1); - int value1 = (int) method1.invoke(limitTarget); - sum1 += value1; - - String methodName2 = "getIharm" + i + "Overtime"; - Method method2 = clazz.getMethod(methodName2); - int value2 = (int) method2.invoke(limitTarget); - sum2 += value2; - } - for (int i = 1; i <= 16; i++) { - String methodName = "getInuharm" + i + "Overtime"; - Method method = clazz.getMethod(methodName); - int value = (int) method.invoke(limitTarget); - sum3 += value; - } - result = limitTarget.getFreqDevOvertime() - + limitTarget.getVoltageDevOvertime() - + limitTarget.getFlickerOvertime() - + sum1 - + sum2 - + sum3 - + limitTarget.getUbalanceOvertime() - + limitTarget.getINegOvertime() - + limitTarget.getUaberranceOvertime(); - } } catch (Exception e) { e.printStackTrace(); } diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/leaflet/IWarningLeafletService.java b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/leaflet/IWarningLeafletService.java index ca2838c70..a66841548 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/leaflet/IWarningLeafletService.java +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/leaflet/IWarningLeafletService.java @@ -28,8 +28,9 @@ public interface IWarningLeafletService extends IBpmService { * leaflet:单子类型:1:预警单;2:告警单 * issueDetail:问题详细描述 * reformAdvice:整改意见 + * filePath:预告警单文件路径 */ - void createLeaflet(String name, String deptId, String code, String id, Integer problemType, Integer leaflet, String issueDetail,String reformAdvice); + String createLeaflet(String name, String deptId, String code, String id, Integer problemType, Integer leaflet, String issueDetail,String reformAdvice,String filePath); Page alarmPageData(WarningLeafletParam.WarningLeafletQueryParam warningLeafletQueryParam); diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/leaflet/impl/WarningLeafletServiceImpl.java b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/leaflet/impl/WarningLeafletServiceImpl.java index b36db4fa7..888994c86 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/leaflet/impl/WarningLeafletServiceImpl.java +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/leaflet/impl/WarningLeafletServiceImpl.java @@ -18,6 +18,7 @@ import com.njcn.bpm.pojo.dto.BpmProcessInstanceCreateReqDTO; import com.njcn.bpm.pojo.param.instance.BpmProcessInstanceCancelParam; import com.njcn.common.pojo.enums.common.DataStateEnum; import com.njcn.harmonic.pojo.dto.RMpPartHarmonicDetailDTO; +import com.njcn.oss.utils.FileStorageUtil; import com.njcn.supervision.enums.FlowStatusEnum; import com.njcn.supervision.enums.LeafletTypeEnum; import com.njcn.supervision.enums.ProblemTypeEnum; @@ -78,11 +79,14 @@ public class WarningLeafletServiceImpl extends ServiceImpl implements SupervisionUserComplaintPOService{ - private final UserFeignClient userFeignClient; private final IWarningLeafletService warningLeafletService; private final DeptFeignClient deptFeignClient; @@ -117,7 +115,8 @@ public class SupervisionUserComplaintPOServiceImpl extends ServiceImpl6K=b(;O-iNy9HUeTX1)Gcb69n?hAJa?hZi~4k0)R?ivEY-Oso8zWA%o zO?Oq#*;jot>Zwtg2$PZklgxvxW0R!k1p@-5ric&&;>trDSUuF2Q4IIP@;P|=P6=N^ zP?4B;W-YAvb4RI~Sl1|@0`dq}T@TtnJ0w|q6FNhm*dC-TzNW@;BtSUC#<}XLFH!H&?LQGIrd`Md&>dt#OTB$}`AKJtGAx%N=Fs+&^z7{cOFZ zcoMb&---v>r1=yU`EvL^vY#X;a)t0i-*#Vqz3Q}T2VU50RrlUSGHNcLB=VQegy*x> zr=Nu8=`v_FWUv2{EnKS}g?Y3x9r3pP3;&}jB!R1~%+DCapP|}5$#M3AWyd-3y7W1c z{?qIEf6o{8k*8?CPD9B)Ri;@O(fX4a7sAv6{3ne!cD6$TabnZMMQ_d~US(&Ij-s!9 z`#&~hI=$V+@sB1_8h<5HI`#EpE37-}O!>KC3!Q+8IAS4hF zrMxSa$#bSs{NF*AVL>45|HhUs7OL(pt{&_bF78%rzD|xosVWL&oJ6DN2z^7z&yJ~c zZ6wyRv%6Jcvnd2Fc2`}I)0UAmUK<9*e8q^2!gA?hVZMy7s#Z(E@zz{GSDAFy#Kd(^ zpU@1=-)TQRDI3$;>KphuY;kN`H9)?s0@pL`e9VBMIniM}?#mGT)IdqTiU zoFAALPKI(r^&UxP3IDjY2zE1ARDRQr_^qvuC*Dgu2Y|M*&p;Iz?DQh5u#x{*Pk zRq|9UV!*&<4NMShV)`z*eb3#a!9_c|*R4VQ)XeR58*N5LU9}Sw`=|HMgwIaT=33vg)o1Aa0@c(T*s|d zJ2zXwT&!zw1|ToL=q(+L2Sd@PP})gDfVv<5YUv}~i5KIZ+fmCJYU;^9WH!nn!RVMQ zY?v=`-`4B*VGzfM#-9_j-1a9Z-FR&X=XQ#KPJ`fvwJ^Do@tC3`w2ojNDBZ}Nn~mm- zY$l|2TR$nolP9Wf0as>hcKC4L>$)ap96;G-#NRB7)0T=eT^ZGK+zg1kqh16E%J zugbA@?lH+!4pq$GXZ}?O_tj``I3s0=N@xi4n&EY>S}L`}nvk)yno4UBLRLlgNyYZ5 z`Kh!=H=2s;r7|NE&^hh4nG3-N4+y z($rW7wOlh*jkXyKDtp-X^ROBpAmsboi3jwIcc|10v$*5aGlgP%mqT3b22Ic|S#sk}2xzasvf4b>x2&-*xC{9XG8-Skp9G|_Yrvzj+P1t>*Gba!Er zhf3#Y<2X0MC2MLUR7qtq8DE->qllBemEN$%H1Hn^{mN{JN>Ib@2xIL*?AxMf7`mSK z2##MCSg#5{RV}*oEAZoeg~@#H4>KXgs@}XkFUm67atX&I{)dw`(AT$a!br-o6Bihe zElFiRn($chlTtIWGjjcg5pYUily7+`v6mdjl}Tu$7F5Tl08ESu%eI6Eg@urz z0Ri(Qtho6B&nR_?X53NoR^bsg8`V#PVO~ZAhzu2;7560`q&)r`-3Ws~)4Hmnid0^# zeC$z7ndYi*{4Re0gM`W=BxEhMDpk0cC{>QatlO#5OlaigFfBQra~PHonQ1wB>i(ME ze_ogIkUC<_V^AsvpEbx7_3q> zH@36@b{2OEjXHgl_I49y<%QvQ_yLUcJe;sk5%v`bV2maZLk>T@R=K1;iJors27D6TgoION zBcl*5e=UJb{s~V8JjdC-7SB|p9=07am&GA=cl~Pidu-he{#(3!ktyexE(tP(s(Y%_ znn%{ybNfUccx86J!>68`6qlh+@WiYU)G-HrTFW&CBOoj8KRDs$K zM?sbQEYE6a$)zyFkTgm&DepV$HiP>sEAV;;nhO05_DPRET5$Agh&wJTu52^kPp)r;Rj&;fgtmrQfM{z<@3z_HOGnCSAF>P0BqzmVu0cv!{xP zD+!X-x-7`ViX+M-uko{q4Wukx-7px9S)>pV&YUVqdFpF#F^MR0>@z?$FGNEz!67W- zrEW%W1f3o4K z9Ks~*dC~8rHf*+~rwGu!{y`4_f6V@Etl_QTs+8;;?4-?>D00%j}SCX_6K{;zSgbDGp(fD?SLc!wkWu`499w)?_k*x2j(; znY4|qV)$Y-zveU_Oq4RYl~K|AWv%AGibqSK!7_ljSu4C1688ce#|4#znuJ$;_u_?D z68`-g?)ae`tO%d#e`T`l(M8IK(<9C;tzL(iVhfu9&3k)Ve?Aq>V`J8+pczWz;USFs zn3bR;UtNiB*_IU-4)iK;VGrNH))N>znWc|ydRt%ONiq#TgkVT7ojW| zRvw$PX*aV3nOTqGDX8mlV5V8k%_=&L2vFJ|5Ib2(6O?6FTjN>dv|Q?4De-ZuaVhz3 zr4|+7OcK@9uj}WQD=_sqNPqqrW<@a@zpJRnp{#vlS7}7Z!Vj=BH@Bg9%}nzz*nZa? zQ6mELyg)h{%^={(DtwNkAT0Bs1>ASzGKL=S{ys$O`-|N5HDk$r~l1p_aR$@FLv2t_R>}F)}tIlt1IcAnmgE7xJ&e(uS3=G z{>Yk}@9;NgMF)Y^0r*aHl)6T?VOX7&p)JCq8)o3rrZ23zFa=lgGi12qX?L9XVLX6= zSBrpfld(GI(?0%@0Z&0r_2@5+PBHVi5F@|3#@IrE$9pIc`jMViUX(4ry}TN=0-lyI zH(?4qa{ja0k~jTCLQTL@Zg5-@hcfl|je{1O?E~=6=bSb`YY<=HkF>oMh4pBE73jURsN zb*He5He)UzI5c@%)p_5my-p`QZ9xM_1*}+ifo9mFKDQh)O1;qJCRq%dFTWJV+_>^% zhS*m5>f?h?ubU)eEQLZrf3RII=uylt6q~dUg_GTVs)S)WObzaPNIQR@u=h1D z74`=E2{sClMV#QT%amHML9r91)GI^{F>n+ZRu^1E?D7J5kYDdDHVZ++?@l-Z_)h9u zPo7#h@jzh&%*9Og>+T=TFeJM+@U~A*Bc8*4TgvL0luZmb~r3&pkBK+zK*}S zAs7!p%a!LLoEZJgC?({e73I|Bs$V47+@XYMnc8zz--u!!_1qsDsL#}>B-FqnAA40G z)@g{h!bEM z{F544g4;@+qBv^D2Rq`C&As*xHzMDYu6^>`dd_&S^CSOMdA}1(tIbVhI1gl8Z@Dj= znKEe5H@P<%U3P&nLi|glV!G9fnuN@>U%aAE%+JoSTQ+y2Q%01iV94VOs zOXH$5I@so6$s&H(Iwrs9cvd^^YJLEJ)l03cJw_6q%sz1c;3Kj(IEoK<<8Rp7;%vY#ZZo_{kIA?sM$?Gb>Z z%b?-Zu+>;ti2BdoMY}S3`J=8fhBa$gqUrNOn^^9SjjomDl$sRk2v2hp8Y-})saH%S zH0}Dek$kpt`nE>xv|jCofxD9{I&vGiWQ zyr<(!^IOvs6nx6RJP#E7Lvgn54}Nm;rZ2Kdgtc?9){VD2g6KiWgB-z`Y+!v-Zj<-kRxL1}J<#UI!LSDjxyBL{B;sS`m-iQpt- z?%*y$(*;*HL*J;i!34x0rWFa8N!I-yMMNKoq~kF7`M%xBnkwn(qW~CxFE2-}04+W4 zf(ZX8?%?1~54T?71wg{36J^SUf6^VDq^tKSs?@}TZXT}#X^;U$(slMMJBXO>BM6V< zX)^Yg-1=4r@M>_nYJIvEcQ=B1I*{se8BkL1%B%WY2fXFM`Mi3&szdlUFJ=%BFb7>aYW;< zrnf-B6rD+5&&%_wp6?>``sZfgm-7m5z9-F~YvZ6jiM@e8cZW`uJ1VXpeUWfiH3I?vnKgGPB)?oO70JM{cb;pS#TOw!aFSY%70&H3p zBC|hXr98WniLX$1E#;bqZXQPj90 zi^53+aVRvY`bQAQ)x^*w!=8=b-`6%Y%=TscqNKwvTK2Kx4FcTT?hY)lcue|Us7R`~ zF~cNTg8&YkS9cW8T%-<9OLB3b|6UXPy5>n>V;uEZxbXGraE$kEKK_%NSS(V z1`zA&ysc}wVqf`FC=LxD4Q~-N0X94DIWV|xPBMM&KCgs;wHGz@UZOQHY6%W8VW57Z zot@_I4?53hlI0MXkAF{eNL6OS2b;amdV+S40Y~~9cTwDwA`m_~fi^$-qwNpqd(vs$ zc}Jm1)z%wXtGCiDWP5f`Y(_B8G0+lj_7^;@pORpV-*SeU5d5?Oo9PWzpxVGGE8+7s z=V>x!LFqB~pG|5S7{p!(N2Rb#CcJO)xETTRJ7$jphQAT|BaB5I8B`R;XQfVF=Ucq(f`?wT~kVLL)gFc$}c4+S|X<7&UXN~vZG z(P1O9b-CORUyP?!!v>d%*%_$S6V|reYAkHsyLR$$AJcAD>w-K$s&}xH_Y?3 z5VLqIL3XCU{KG&r_YAMnYuoE?b+4N+I*RM_%Kciy*`jlhiwW386uRwB690NZtJ~2K z7%uWF_a07>`R;49ScKOI;5VcdX}U{D@Pt|Gw5?4Cmz8QehrJj#ku?BN;A)Mw_#Po2 z*=|1@(v8nE|3|z&F7feMD;L2stTFcv@;HDY z%f)eIeoSQ3>ea;I#~BL9JH#rg!7L17layPM^R&9N$vj28-Y~jof>l14B*kFL3liNm zRljuQuyuUU`fTKkVQUTuY{p5R-yp7Guvul5M)7=3m$Nwe1Te?r^Emg1g0q})zf|d? zdOQw@b8Pb6uawjyZXUFHGe%0Wb2ii+ zgg9IeGvc(p7(c+;5@|DEv9ZNIY^0^dt~OVBm(!Md<##knY^@ewN3%=VK5vgBJ)x9O0Rx~ZuSOP_jGS7pP+eyQc`Q0!B1>!Hn4W+qTvXwqkv+a6 zX^@!K^D>ra*w>((p)Lz&~DH}TwY{5~9N>pTeC$uuc`NcEi zzDP!-k{q#(?=3ZnI!u+wjf&ny^u5+V-xQvr*^IB^QuYH}bpa^wsbtQHvhQ_75z^J|>C<9z#MIb82z!D0YH3$#n8c zMMGg_AD@ykPx^$Ah_T#d=4X6z}55O8yq2+PGLkD9wRjq`zmtz1W1@x zD7sDkh9HZYNKlXZdzg41i`Cv|$=*b`Tpahe-RIc-P-S#7Rlqs_U@iRNk1hJH>+E^tBhPu8KqZL^Heb=V?K+G}Zo}*x zD#E}_D!Wc|#hs*KzBvIU6476teBVdw=b`{Jn1}~TZv%pL`JvqtSnh~GBh^Er7otWu zNd!)@u!(1C_Vepk^B>O$9sSp@VdsR}EgnM1DSOWdTkJGLN)Ll!H&KU$61$l)%Fu0X zZ8jf|#}cc)?K`Py*;5md*pgbX7BNJkm--zSN8nYwb&8 zDtvEl37Ja7JSSv4nuY{+nbZaXm={>akmikx=F{NM7XgI(a8>f7G*!rakKz8Y%edLb zB^@tJmA_Wc%YO$`2YR; zfhtD8USU^AKynD2A`K=EMgRj6CZ($b}rDgP0(}$**o~n4S4w+hA1NV zw=PA=)Gt@~E5*_i`Iy@!{ion-H})TJ?fN~Z&+pp<-BKqXPeDo8oDWNmxzfW7qac ziItIS!VU#1s!5i_{q>Mt3; zY){n-n{Iz|v$daAV^|~1zvk-?y*nLAmJF$yMM#;*B{ zuID^GASBAE1*mcGF%=Tu6b}cw3u-6C*5%9zCSB@AE>|wTP~lTs0tfgM5U%g2j(J16 z9{{im(}1x5DCKLRg|^oW@`uk)$Vu;`Dc~k zokXGalqkU~SJ?t1axYOb*@BI+Cdea6fA#W_%VO@iA}>L!eB1j+np1P!d8ywhkirII%xtQXGXmpI`2jp!AsU<06}I zOG6zWFCP%_fzh(^$85{{kyX$>cZ|yva}@VC(36vU*%MZ7+4q|EU{t>~Q54DvQ)d|aww(H_9Xh*rE7Km2y2%`uk zyIp_7JI@JB@Lr^@=oBy_05_L{H%Z;dNtDYv^G?73fsg#6F3bgA$pFCwFHr45dVml? z3r6c8OxtK)Gmaev%J5LK9Van|1}3x-eH#4mTV*mj^5a{rQaO#jXZq2|!DrLq>O=EO zU+)YuB;Bxck8B!2cwKfVJ&`Taq9=n&*$=g<;Xs7UY&~~*C$r5Nh9v*K3>p|mukX5a z9cNzOd2A<7+&%iemoAO-P%1>1z11{k-4gx-8OknN)vq_t^ryQBXf#n2Jc@6lxt!&|H@nfxD$x!`HQ*N(x!v9C2XoY{ScYbg>? zLV^twgPco-VSMB1be``YCQ`9{Ah+DU)@=vY(DZS!wtPL!#)aX&0>d5EN&L)9rx` z{k`neS_=A^21+{IZf`YY&IBIBP@17EuFsx=nA9Y}CtVU`yd$N3OPJk+&x~^Ax4=+ZWOCrsZExlA;#0U^s`7x-fGT0{M41zSHmx{1joKGRpeAr{-%t#%B7AxOjnmcV+Blz@r#d4FCm#Q#O5Ek z9T2TYNv6=X-4$l+W=1{vz;Kh9Vx;Y~9>ng$;I2TT|CFMGF@5jD1Sf?Kg^-z@Hs&pO zo;&MJe#}J_)^bT5XSCifkLs9CEx>|(DpwD363C4^+D9AsQ~Er$RT-qj@uU4k141cP z20hlKAIzPU0u?a4aO!gA_Pb%*7S|FvrYxaU$T?&;GR;E2~x_{WUS_Ks@`}{r68o-e#|) z)!qo}94iUYQX`~=TnAQfu*OWtA4mWMswbovJQx@ZAs86?Kkw-7;B3n5V&>{))n?cXTQS}vX`f`qcctv(v<=tBQ8RuPNqg&IX*?M;cS2x6-9Vpof zwss1nmBIP6F?CYG#ATJnd`EsoJcCPS-HfA}JJT%Bu^q+Dc&Dz~@?f{pIC-|Q;dA)( zNgaDsTgB(R?$yNTyM)Y;!vS=I5uH}({mF7m{PCe@RX6lNd9bUI;(7TU*_mDz;PN1rLZvk!wtH=ICjy zJf+sd2Ad(mYFzQ3%KfRAbACjyUDXQ$vlTbD;O|S5&1EFsm`+@SY9Q^keEL#4C*ITIuA`V-WZo_-PVm=C^J0gESfizU`S{siWenEtZis^iLa z;ykyMWyRC?h-fa~4hi6NTiu>FI<)(wU`NTf2j*MRr&w=lrM6^|`}*i`y(q3~X|F;$ zK%jp-58l{*P(FT6)|{elSTEUy`M(TsE!86w_Ac?-&10<^*BT*dv;Sme+z9i54F8_^ z?G_XW&cLz|R^mQ;4`b{3Xj<}#U(Ek!&FFUYwDO$P;`3H_@($>e9{<+O`t2d}x1r_L z>CwU=T;gx3$`pg%VMGUFK8G_#!y4c<(E{X^p8SB;et#0gb#mIxIPXUE5aB{Mc+;|q>DOj-2$8RMWNq|PR!b2@vb zDQk&0i)BhGn)Uv%K#0LoMlQJ3#(|>KclChJ3=OYPvUXBSpk4`i2m0?@A6V37Jy@w4 zi2U=Uklq{i$9O(1QtMw>{J%2b1`j0w>d^U-(|)#MA0Vp)^ZDThG_Cr>YaC=%5`Izs z#(R{@1e5RF%W+ULW3}*zMnV#&r@gFn+HpU|@o}T~ej)D!+;mO%q{4ri3m#oLbXWKI z&2$6re%S^+FG&C+^XOZals?FZsb<@UeC5%`@9odai-1(za*&Ax=hsa^pWxP9G$FX9 zuf|@#0XaqAf?0nlny(TO9J`?um=Zi#nEOVHDmb{&BT$P&-jo6h{)kha;Wv&%jY>xN za9`+4S&7jpwV~ere%KNjK^EvnAD2W^#~Obh*R=i;T~L@#5Gjoqu1+Q$|5Jo6g%hQa zdpbvE>RUAhivs&nr3I!a`55G6X(;|M#w0H%8lYB3_U-CuridzEWfD5vJ{E)ei>;u7 zrCGr-6)II|L_BFuAs7UNARMZNwq~fM5Kmeig%~6P6f^_bycpWCl;OM>rZmyT#A`ir z*+DYe43K-y2BC&iy2lS9wfixz`dRgp!f z;0cC~RW@Rkk)nki?fK1tXfh-no)?Kngb4gmiUdD4Y)c!;Wbj9AP#~l&!3-3`hShfZ z>Zgfx9Y0AvU-d)9I0c>%#~&g6&ljn&bz@8#G6q>W8;e#nmB3M zp+weN=O2Qu;N%!NOiO=6*}JC(Ls^nP;EGs2mmpk6K>-fbhnqQD z(eCi~KAPYW(vc@aypY1j|Dwg9Ydes_PC|){7__a13u*ArmqCYhhX^>ARIVmHMF(NV zl);+h+qAeBy1`G{!kP7ha*a06#AEkcv`|3Q8^o&d$%Zb0&XcR)`9b* zFAP|cwC&6>66C9MjwmX}YYmE$fnid=tj&{E&=d98Wp_S;K(uc<*i@R6R@^iQ+)zwK0zP6#RO&dkN(*1CY1pFQ!N)vR7m zVQ^s~VK&uDnfrKDAvhmMPQL3_w0*xIZElsx>Im9=kA@)%QF!Q}(el**aXI9vcH?Pm z2=h6gtIJO)vtrje=V;81el5Lm>(G_c#qz=CCbz3Re-~Xq{LYtd!F9D`Ge3LRA&2Vg zV36&neQ!tKF^Jz9LPc_Xq|>BohI& zx&e@`;N!Y?ZOO@M%$KMi&n~J_f*~83{X8()^SR-jQXWW_CL4JfEriw1ug-dSA~xqV zSzgbo!$eOtwxy$DHc=PjX;EvNJRJSvss3Y_K2#l7Hil+ojBA0-bf|gPw=uDsb`AcA zUU?hmfSRkvN~ci@<;a$eCZY+|7_SzmWIo`g>b%%lQ9k`;kzZh}lC=cGOg7gT8UF!4 zI8JU3rXKYpcxf>z{Ar#BwE>;ffv^!1dEM~XO_}4}ey|$3UGqR*+jc2pC~^3zGJVW- z;jNR&oedV2u^d8mS7TL8Z_p6)Sd=Oz7IL~)urh|jO~t4cM&ChNQ$6D8BH2MY3}cS7}Nj7FB3S}c0v?XppW#F<2j60E5W9+<7Lgk-5n7-R{KHY`+*vh&Lg$2pu`P^% zZ=EPI9uCCOnf19XN zI#hj>IA2usb7uYEuE_YLlMJx6zgXxrBp1&z&&_$D&P^rmS2WWV(B`tChTX94qxfspqJW94i(CS!{CHnHpKv?Ah!G*=?Ey&_kM5cxZS%r>mWPb zA*@k7TBaeodnQPb!t}i_Y`Zp&IB;v)m^uBkg(UhJ^!-Y)ckt5$mlw-H<>{A}3gy{d zDEKJBu(Vp>AHp$_F?E13ZwJA^wH(UlVu4~9Tv|YS4Y%hBZP)K!pSl)aLHS)_5Cijbx@KN^xGIcp$|$3pr}jfHw#^oB+V zF6BgwDMOw@o?DiBR%|y}?4)n|Of*tn-`hYN0yN}psLx-FnGR6Kub5-WzX_2CA!-x& zg6Fq}u5*|XSNgBejP!*s-#>Ql`bT!W+=+dxc0%AH9p|m!dY#0;(tB}BAYSv>OhGN;;&l%*H%P#9O8`Fj2_7dnl5Glh)YBY&{b_1KJ6& z<0(kM?l98L$3#tSr3>eNR0Px)u~89Zf**}L-G)Iwo}55wop9nKeaC>&iDb=v#I~ON z^CA-az#XgaNQfOV6`&Zb*m5AiThm{Hu~M>7-$$MLr4bN)OuHORNsqaAvp0x|N}dFz z=v+>?vyh7f9vmBOQq0o;*TZjM+}9 z(^5JrZaB*0FG#a3eG^~wuK)eUxhJyiQj(WG&B}5dR{go^r--=mFmIjAk%olO(ky;j zrnkQJy#j~43{AMNcO9FWgOr>W4WXWpRQ5zhbsHUJTS8%jezlZFM3BVE^g8^=^S0t+ z0SJmO3w7D8cW-4}_na+GU`!0~3=v7S3Xs0n(DMjzb>P0Uv7Z0dPA$|^lUlvLsfMjc zosX9EIupmmRBhXBozK-DjD1gd6by}A-`GcXvYZ`ZBjW*Ogjr0S*U5)%;6(@9i*O7W zg>Zd&dU`PU)b8rme!oogKG{2(RI$C`1B`2S2x!+Co}W&Fz27As&SYI>4;83uZfuDe zX5aM@CW`n1HXMu@xBy$E%M6ZKY8=+(%j@^g@QrzKB&@a9p8(D_nmVKQ2hzg7Ld@zJ?ugz&L` zVC>2H;f3-+^I!%9IZ=zl)CzN00mV>4Qur}{_OOCY+BDPUM_^uSUbLnBaU;okv$yqL z3c5FCI~8*jNp!q6u<7RCmqXvO1OB!Vu*@czs|(p0<+Ge9)BE7 zMO=UHlUX?7MHJw)>vCqr3LCaPchL20Y^WL?yn2QWL8D`ikrlMOo@+l;mgZS^`@WlX z7SD6T`82tbNx3r6&DxQ#58ydOpf218a{m4}qu_06V%7(DcACKh^$x=2*7p2`P2GHn zop~{P>PLi2s}NHP z9ds)Nd%z?jPumbLhb-!Xj}LRcCBn>*B&Q0vlYIF4UW7fQY1p{W1jR02x2x@+#Ws8C zJ*=%&cg51D83Zr$EFnZ#AD=Bv=3*&u&UO|*|1z`;zS>nwY+;C`0a7M}GD*=0n;GL_ zlg}uZSJ6fn%5?9Zf9GNG<>_+a4Q?FwG5);foN0D?Zt`qzg4wz?Vqb%LW8U*>rqYld zd3?WLGF6dd)3 zUAj_E=%%lua5TDO2DCB^Q@Po|Ctfw>N3FPc;3WM55MdjNYkPzY+0ZXkkViN+)S~1z zN)=b2XBeTGr!9qK%P?&;K`T!ql`Ewdk^4(L?CaXI*W{qcdY=bLCB0>(m5a?P`@+#t zJXOhI7q@Ju;HulTlhGoJjX7^h-?FF(9WDcczCZi6Bp4Ay@nTiTm^f({N2}A$gws-j zk-a7gAc}`H^b_(DLSuQc=^*i-CAUK%0>kfO3vla(;atxgieo3>`y4>d_O6 z6~-sGiElx}gOSx3k_7aZNGCYk$PtO?apwnZ+TcS=MHPF$DvqSei>FZ2P_HrJwDa(= z=9K6%>;B4&mN`k4yD(7*y#`^>r3Ucneiz8;Yd@hR4&Y3bkFnhi{?TRX5CFerhk_^t zRP#LFb4ZQ7;@8)WsimGnZyeV^Hb6Bm?o=bT6%#Uw2W$3^eqXFKDZbTL@ct1wh~a8E zWa!_16G4>`jN^8KVpEtYM3W&iGDt&fs9@idC*3O?i#%GMHyEPB8@~KC-*3Mj(pvS$ zDVl#|F&(A)@5$uEXsNToiSb!_UOZY$AgP^qzHO)eJ7F@|Tg;HA-Y7V9<4RF{xUiXM zmsMmfXV7|v4}41a5MCR%a-zF|-yD-79vg9k5!VrxI5?z)JKVEQnq(t8QMYlLJiEYp z`uQiWbn0e09Rs~L6q4Q|8I9k(vgVGRx<-97#R?~zE~i_o+YtBgLDMM3cM|emKp1>T zEKt3x^)*7^fB78}T8N16?j}a0?85tlX;eN<`V+Mb( zk6=&M8nS~;3}t;x=se0;@sw6+AXuzCh4~v#@=i!8Xa_q`2hN^#b2HGI{NajuajQzC zIe2~DSE?Oq(!?bvzz+?<{tH?u%XclIU!4O+{G>F!v+(g9eKFJdnc*sN0QWZ5iss-= z)$W}X0ht0%WH&Y(%_&|mm)a$pX$qqyx%U`}Z!hW`aF|Hk2WQ)o9e(YPj2#PEpK{2>%%biMaR zQG%Bl(k#()e(hcnC~?HdONPj;Jz~Z@g1`c3@h2?tw5h-Y+9^qTz}5Uv0l_0A&r*2K zS9}iI?51o@Bt#;YeQFr0#tI4snyAW-+>vkQH<&x87aXnZ$$@WBwj-iKZ)?YzCqB9( zW;zNlD&-i80-TRkHX1`0GmcPGM6f0!DjXpM`$RnT;JCtNVVh3BXBnGxVps(m7Sr@m z0h@6#n-D@UW5|^PFxQc=cF2)1iGZP;sH7Kg9|>iBBbUE3drCIX&=hAl-i&&Zk^$$x z*y&4_oM0{FtOZ|$^Hm&T#E{2?PqvaOo|aY!UC4nz8CxQf>Tpf7BV^T*)-nNkst2A- z^gQyMZv)+@KC2Yj?HKRrW1+gJb-Y;0%QA8b%hn-YRTmx%Al`x9W&~5L<2P&(nEcNr z>HKMEKI$HqCD#0>_&kz?FBi#t8LdjOP9T84x!GkQ6BXdfx%?UiwAFUWf5^$+%~6ad%M0O zw}7k%Ua$I1a$#OH@ps1xVI}JaXaeI4@*fW(o^L=Hg8E96t9@VlMX4McIz(#4<1I93 z+8yuC4Ts_oTcYwTglBw1ytj>QGabp{BC#<+8kk*8&rU{I+hl<#VpqQfAC+ilJ0t@* zv9ZqbelM!q;s>n4Oi9}rb{%}gPD6z95l}1wyrL*0UeK>^oZUPIz_o|*V57H2Zg#a` zkJ9_4%EKn~(_Z5RJPM?+1XNgG{t`P*p&E9d(HD6~yL7O`HOh8z)gz);8#VlWcPyfT zKq60%AGCoCSsBrhXEG%eCc}@yJBaxcN<`&O*U?-!G$Vx!5$a#bCquJ)Vb+*a$}o_xyxC)wGhjN{jFVF*kbBO%83+!P^jxA3dC?Kp}uvG_G1qV z>V-AstrsniY9D@nio*#$-(^(1fs_ujzc01mp9)P&Y1=Ds7`q)Yk{r#i0G`r7r3_7< zAN3!55go7A`}5-)D`|qy9-kX48ss}daGZwc5r#CHt=SX+1S6znn4wCbv@|}UI#V;y zSJWIQUH$1*>-MJQ`=If(OVw9ID&rs0itK0En7jPrpc@oG86PNZN0L+l^3(15+uzl# zVxV`CE}btVK39Ja==0eFM7%?e<*-PVV2^gr;=PUaY%VO8c2yR4q5HU0Oh4VSFa}j{ zB6F&{Hp0SoR-=Vs?2l9i_bDB-7WeU^!A=fqq6Ya6P`y0E*^7YheJk63* z%vZgttJtMeaWo^y)P~c2+`KvBxu#j;Wc?MzfJ0!B@G` z2j(-@T+A6VgrVwKV#l{k+A&8@K%$eG6%0-@RoI$5!jr0uQxiUd7q)TPrC z6*WuCL>n0`>6l_W-BA39UQ8A3-?Deu3EhMrHRrdqWzcqsF%G_tw&jkt*-4;n@5&OSSyjgFB9y=JUR$UyUSxWA)?HV)%O{+i-$>EGOpP<%uEx#X!`_79E^ z$$fGs6t^o-kF80$#IRVUzHG9-N(b6HE z3n`rPm%@QFC5l!4dAw{hkco&?4(^VBch|f}*c?6Y+MkS_EC%Tnv?ISG@W!4;S#M1M zg$>=4qyW>0Z)cBe@@;*SFwppSCyrg^zce^%5_St=W1iU$anI(;ES;sxVk(yh^E8X* zdvCD1`i<(Zv+hsRbb|XpkqF)7sx~2DSC2DG{W+5hL3Xeao+Fi2&gICU5uR5b4gya& zNmE1+!cHJ5Lxc??K_F>LMD2h5oFsZt4ub#oLjJLJRw4dl8T`|HgMovQ{xfHiyhH`S z^OD*`g}~pEUPal!Tap;XxWRXl%*B`q|8Ft=Z|Z+?FBJdOjKqaRG4Rqzm!y5XD4E3=&)r(?m(85;QOaBL8mv7ou0Le*gdg