From 0fdcf8dad7f5d192629954332acc0f9e6a704e74 Mon Sep 17 00:00:00 2001 From: zhugongping Date: Thu, 10 Sep 2026 11:47:39 +0800 Subject: [PATCH] =?UTF-8?q?20260910:=E5=AF=BC=E5=87=BA=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E4=BC=98=E5=8C=96v2=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 4 +- docs/fastbee-device-report-engine.md | 19 +- docs/锚索测力计模版.docx | Bin 0 -> 90697 bytes .../controller/device/DeviceController.java | 19 + .../controller/report/ReportController.java | 31 +- .../analysis/PrimaryMetricResolver.java | 126 +++++++ .../axial_force/AxialForceAnalyzer.java | 238 ++++++++++-- .../analyzer/crack/CrackMeterAnalyzer.java | 237 +++++++++--- .../DeepDisplacementAnalyzer.java | 240 ++++++++++-- .../inclinometer/InclinometerAnalyzer.java | 238 ++++++++++-- .../rain_gauge/RainGaugeAnalyzer.java | 236 ++++++++++-- .../ranging_meter/RangingMeterAnalyzer.java | 233 ++++++++++-- .../static_level/StaticLevelAnalyzer.java | 341 ++++++++++++++++-- .../strain_gauge/StrainGaugeAnalyzer.java | 238 ++++++++++-- .../thermometer/ThermometerAnalyzer.java | 240 ++++++++++-- .../vibrating_wire/VibratingWireAnalyzer.java | 233 ++++++++++-- .../water_level/WaterLevelAnalyzer.java | 233 ++++++++++-- .../com/fastbee/report/api/ReportEngine.java | 15 - .../com/fastbee/report/api/ReportRequest.java | 4 +- .../fastbee/report/chart/ChartGenerator.java | 55 +++ .../report/chart/MetricChartBuilder.java | 108 ++++++ .../fastbee/report/core/ReportAssembler.java | 24 +- .../fastbee/report/core/ReportContext.java | 6 + .../report/core/ReportContextBuilder.java | 32 +- .../ReportAsyncExecutor.java} | 68 ++-- .../fastbee/report/model/AnalysisResult.java | 25 ++ .../fastbee/report/model/MetricPointData.java | 72 ++++ .../com/fastbee/report/model/ReportModel.java | 10 + .../record/ReportRecordServiceImpl.java | 25 +- .../fastbee/report/renderer/WordRenderer.java | 193 ++++++++-- .../templates/DEVICE_AXIAL_FORCE_V1.docx | Bin 10227 -> 0 bytes .../templates/DEVICE_AXIAL_FORCE_V2.docx | Bin 0 -> 38102 bytes .../templates/DEVICE_CRACK_METER_V1.docx | Bin 1962 -> 0 bytes .../templates/DEVICE_CRACK_METER_V2.docx | Bin 0 -> 38101 bytes .../DEVICE_DEEP_DISPLACEMENT_V1.docx | Bin 1957 -> 0 bytes .../DEVICE_DEEP_DISPLACEMENT_V2.docx | Bin 0 -> 38104 bytes .../templates/DEVICE_INCLINOMETER_V1.docx | Bin 1956 -> 0 bytes .../templates/DEVICE_INCLINOMETER_V2.docx | Bin 0 -> 38101 bytes .../templates/DEVICE_RAIN_GAUGE_V1.docx | Bin 1958 -> 0 bytes .../templates/DEVICE_RAIN_GAUGE_V2.docx | Bin 0 -> 38099 bytes .../templates/DEVICE_RANGING_METER_V1.docx | Bin 1959 -> 0 bytes .../templates/DEVICE_RANGING_METER_V2.docx | Bin 0 -> 38100 bytes .../templates/DEVICE_STATIC_LEVEL_V1.docx | Bin 1960 -> 0 bytes .../templates/DEVICE_STATIC_LEVEL_V2.docx | Bin 0 -> 38104 bytes .../templates/DEVICE_STRAIN_GAUGE_V1.docx | Bin 1956 -> 0 bytes .../templates/DEVICE_STRAIN_GAUGE_V2.docx | Bin 0 -> 38100 bytes .../templates/DEVICE_THERMOMETER_V1.docx | Bin 1955 -> 0 bytes .../templates/DEVICE_THERMOMETER_V2.docx | Bin 0 -> 38101 bytes .../templates/DEVICE_VIBRATING_WIRE_V1.docx | Bin 1955 -> 0 bytes .../templates/DEVICE_VIBRATING_WIRE_V2.docx | Bin 0 -> 38098 bytes .../templates/DEVICE_WATER_LEVEL_V1.docx | Bin 1955 -> 0 bytes .../templates/DEVICE_WATER_LEVEL_V2.docx | Bin 0 -> 38101 bytes .../report/renderer/WordRendererTest.java | 2 +- .../renderer/WordRendererV2TemplateTest.java | 223 ++++++++++++ .../com/fastbee/iot/mapper/DeviceMapper.java | 9 + .../fastbee/iot/mapper/SubGatewayMapper.java | 8 + .../com/fastbee/iot/model/DeviceTreeVO.java | 78 ++++ .../fastbee/iot/service/IDeviceService.java | 8 + .../iot/service/impl/DeviceServiceImpl.java | 151 ++++++++ .../resources/mapper/iot/DeviceMapper.xml | 36 +- .../resources/mapper/iot/SubGatewayMapper.xml | 9 + generate_professional_templates.py | 316 ++++++++++++++++ sql/fastbee-report.sql | 6 +- yack-web/src/api/iot/device.js | 9 + yack-web/src/assets/icons/svg/WORD.svg | 1 + yack-web/src/views/bigScreen/home.scss | 66 ++++ yack-web/src/views/bigScreen/home.vue | 172 +++++++-- yack-web/src/views/dataCenter/analysis.vue | 109 +++++- 68 files changed, 4156 insertions(+), 590 deletions(-) create mode 100644 docs/锚索测力计模版.docx create mode 100644 fastbee-report/src/main/java/com/fastbee/report/analysis/PrimaryMetricResolver.java delete mode 100644 fastbee-report/src/main/java/com/fastbee/report/api/ReportEngine.java create mode 100644 fastbee-report/src/main/java/com/fastbee/report/chart/MetricChartBuilder.java rename fastbee-report/src/main/java/com/fastbee/report/{core/DefaultReportEngine.java => executor/ReportAsyncExecutor.java} (74%) create mode 100644 fastbee-report/src/main/java/com/fastbee/report/model/MetricPointData.java delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_AXIAL_FORCE_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_AXIAL_FORCE_V2.docx delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_CRACK_METER_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_CRACK_METER_V2.docx delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_DEEP_DISPLACEMENT_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_DEEP_DISPLACEMENT_V2.docx delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_INCLINOMETER_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_INCLINOMETER_V2.docx delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_RAIN_GAUGE_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_RAIN_GAUGE_V2.docx delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_RANGING_METER_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_RANGING_METER_V2.docx delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_STATIC_LEVEL_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_STATIC_LEVEL_V2.docx delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_STRAIN_GAUGE_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_STRAIN_GAUGE_V2.docx delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_THERMOMETER_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_THERMOMETER_V2.docx delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_VIBRATING_WIRE_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_VIBRATING_WIRE_V2.docx delete mode 100644 fastbee-report/src/main/resources/templates/DEVICE_WATER_LEVEL_V1.docx create mode 100644 fastbee-report/src/main/resources/templates/DEVICE_WATER_LEVEL_V2.docx create mode 100644 fastbee-report/src/test/java/com/fastbee/report/renderer/WordRendererV2TemplateTest.java create mode 100644 fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceTreeVO.java create mode 100644 generate_professional_templates.py create mode 100644 yack-web/src/assets/icons/svg/WORD.svg diff --git a/.claude/settings.local.json b/.claude/settings.local.json index fab06b55..839f028f 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -68,7 +68,9 @@ "Bash(node --check /Users/admin/IdeaProjects/fastbee/yack-web/src/api/iot/report.js)", "Bash(sed -i '' 's/direction\\)\\);$/direction\\)\\)\\);/' static_level/StaticLevelAnalyzer.java)", "Bash(sed -i '' 's/strainState, direction\\)\\);/strainState, direction\\)\\)\\);/' strain_gauge/StrainGaugeAnalyzer.java)", - "Bash(pip3 install *)" + "Bash(pip3 install *)", + "mcp__filesystem__read_file", + "mcp__filesystem__edit_file" ] } } diff --git a/docs/fastbee-device-report-engine.md b/docs/fastbee-device-report-engine.md index 5e24bbbc..de2e817f 100644 --- a/docs/fastbee-device-report-engine.md +++ b/docs/fastbee-device-report-engine.md @@ -205,19 +205,28 @@ services: ## 4.3 系统配置(oss_config 插入默认记录) ```sql -INSERT INTO oss_config +-- 先停用云 OSS 配置(存量占位符) +UPDATE `oss_config` SET `status` = '1' WHERE `config_key` IN ('aliyun', 'qiniu'); + +-- 插入 MinIO 默认配置(endpoint 为云服务器地址,供后端 S3 SDK 连接) +INSERT IGNORE INTO `oss_config` (tenant_id, tenant_name, config_key, access_key, secret_key, bucket_name, prefix, - endpoint, domain, is_https, region, access_policy, status, del_flag, create_time) + endpoint, domain, is_https, region, access_policy, status, del_flag, create_by, create_time, update_by, update_time, remark) VALUES -(1, 'admin', 'minio', '', '', 'fastbee', 'report', - 'http://:9000', '', 'N', '', '1', '0', '0', NOW()); +(1, 'admin', 'minio', 'supermeminio', 'minio20260909', 'fastbee', 'report', + 'http://47.1.28.77:9000', '', 'N', '', '0', '0', '0', 'admin', NOW(), 'admin', NOW(), 'MinIO默认存储'); ``` 要点: - `status='0'` 设为默认,启动时 `OssApplicationRunner` 自动装载进 Redis(`sys_oss:default_config`)。 +- `endpoint` 为后端连接 MinIO 的 S3 API 地址,需确保端口 9000 在安全组/防火墙放行;若后端与 MinIO 同机部署,可改为 `http://127.0.0.1:9000`。 +- `domain` 为空时,`getUrl()` 返回 `http:///`;若配置了 CDN 或公网域名,可填入以生成更友好的 URL。 - `PlatformType` 增加 `MINIO(5, "MinIO")`(仅用于管理页展示;实际路由走 `config_key`)。 -- bucket 权限 `access_policy=1`(public)时上传后可直接访问 URL;若不想公网直链,下载统一走后端代理。 +- `access_policy=0`(私有),报告下载统一走后端代理接口(`GET /iot/report/download/{reportNo}`),可校验权限和过期状态。 +- `bucket_name='fastbee'`:需在 MinIO 中提前创建此 bucket。 +- `endpoint` 需根据实际 MinIO 部署地址修改(如 `http://192.168.1.100:9000` 或生产域名)。 +- `bucket_name='fastbee'`:需在 MinIO 中提前创建此 bucket。 ## 4.4 报告文件路径 diff --git a/docs/锚索测力计模版.docx b/docs/锚索测力计模版.docx new file mode 100644 index 0000000000000000000000000000000000000000..b7d12e135d7bb5095b8f9c8f24a8820bcdf5ed11 GIT binary patch literal 90697 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 literal 0 HcmV?d00001 diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/device/DeviceController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/device/DeviceController.java index 4a0ea9ad..4f5a86c3 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/device/DeviceController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/device/DeviceController.java @@ -140,6 +140,25 @@ public class DeviceController extends BaseController { return AjaxResult.success(deviceService.selectUserDeviceStatistic(device)); } + /** + * 查询树形设备列表(用于报表生成等场景,网关设备可展开显示子设备) + */ + @PreAuthorize("@ss.hasAnyPermi('iot:device:list,iot:report:generate')") + @GetMapping("/treeList") + @ApiOperation("查询树形设备列表(网关可展开子设备)") + public AjaxResult treeList(Device device) { + LoginUser loginUser = getLoginUser(); + if (null == loginUser.getDeptId()) { + device.setTenantId(loginUser.getUserId()); + } else { + device.setDeptId(loginUser.getDeptId()); + } + if (Objects.isNull(device.getTenantId())) { + device.setTenantId(loginUser.getUserId()); + } + return AjaxResult.success(deviceService.selectDeviceTreeList(device)); + } + /** * 查询所有设备简短列表 */ diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/report/ReportController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/report/ReportController.java index 7678e6a7..4e36e30a 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/report/ReportController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/report/ReportController.java @@ -10,9 +10,9 @@ import com.fastbee.common.exception.ServiceException; import com.fastbee.common.utils.StringUtils; import com.fastbee.oss.service.OssClient; import com.fastbee.oss.service.OssFactory; -import com.fastbee.report.api.ReportEngine; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.api.ReportResult; +import com.fastbee.report.executor.ReportAsyncExecutor; import com.fastbee.report.record.ReportRecord; import com.fastbee.report.record.ReportRecordQuery; import com.fastbee.report.record.ReportRecordService; @@ -53,7 +53,7 @@ public class ReportController extends BaseController { "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; @Resource - private ReportEngine reportEngine; + private ReportAsyncExecutor reportAsyncExecutor; @Resource private ReportRecordService reportRecordService; @@ -62,13 +62,34 @@ public class ReportController extends BaseController { private RedisCache redisCache; /** - * 生成并导出报表(V1 同步生成) + * 异步生成报表(V2 异步生成,立即返回报告编号) */ - @ApiOperation("生成并导出报表") + @ApiOperation("异步生成报表") @PreAuthorize("@ss.hasPermi('iot:report:generate')") @PostMapping("/generate") public AjaxResult generate(@RequestBody ReportRequest request) { - ReportResult result = reportEngine.generate(request); + String reportNo = reportAsyncExecutor.submitAsyncTask(request); + return AjaxResult.success("报表生成任务已提交,请稍后查询状态", reportNo); + } + + /** + * 查询报表生成状态 + */ + @ApiOperation("查询报表生成状态") + @PreAuthorize("@ss.hasAnyPermi('iot:report:list,iot:device:list')") + @GetMapping("/status/{reportNo}") + public AjaxResult status(@PathVariable("reportNo") String reportNo) { + ReportRecord record = reportRecordService.findByReportNo(reportNo); + if (record == null) { + throw new ServiceException("报告不存在"); + } + ReportResult result = ReportResult.builder() + .reportNo(record.getReportNo()) + .status(record.getStatus()) + .fileName(record.getFileName()) + .fileUrl(record.getFileUrl()) + .expireTime(record.getExpireTime()) + .build(); return AjaxResult.success(result); } diff --git a/fastbee-report/src/main/java/com/fastbee/report/analysis/PrimaryMetricResolver.java b/fastbee-report/src/main/java/com/fastbee/report/analysis/PrimaryMetricResolver.java new file mode 100644 index 00000000..5f885d3a --- /dev/null +++ b/fastbee-report/src/main/java/com/fastbee/report/analysis/PrimaryMetricResolver.java @@ -0,0 +1,126 @@ +package com.fastbee.report.analysis; + +import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.core.ReportContext; +import com.fastbee.report.data.MetricData; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * 主监测指标解析器(统一各 Analyzer 的"主指标"判定口径) + * + *

判定规则(按物模型列表顺序,保证稳定、不依赖时序数据返回顺序):

+ *
    + *
  1. 排除辅助指标(角度/温度/电压/电量/信号/湿度等),辅助量不作为主监测指标;
  2. + *
  3. 优先返回名称或标识符命中核心关键词的物模型;
  4. + *
  5. 否则返回第一个有数据的非辅助指标;
  6. + *
  7. 再否则返回第一个非辅助指标;最后兜底第一个物模型。
  8. + *
+ * + * @author FastBee + * @date 2026-09-10 + */ +@Component +public class PrimaryMetricResolver { + + /** 辅助指标关键词(这些物模型不作为主监测指标) */ + private static final String[] AUXILIARY_KEYWORDS = { + "角度", "angle", "温度", "temperature", "电压", "voltage", + "电量", "battery", "信号", "signal", "湿度", "humidity", + "电压值", "battery_voltage" + }; + + /** + * 解析主监测指标标识符 + * + * @param context 报告上下文(提供物模型列表,顺序稳定) + * @param byIdentity 时序数据分组(用于判断是否有数据) + * @param keywords 核心关键词(如"位移"、"缝宽"、"轴力") + * @return 主监测指标标识符;无物模型时返回 null + */ + public String resolve(ReportContext context, Map> byIdentity, String... keywords) { + return resolve(context, byIdentity, false, keywords); + } + + /** + * 解析主监测指标标识符 + * + * @param allowAuxiliary 是否允许辅助指标(角度/温度等)作为主指标。 + * 倾角计、温度计等设备的主监测指标本身就是"角度/温度",需传 true。 + */ + public String resolve(ReportContext context, Map> byIdentity, + boolean allowAuxiliary, String... keywords) { + List models = context.getThingsModels(); + if (models == null || models.isEmpty()) { + return byIdentity.isEmpty() ? null : byIdentity.keySet().iterator().next(); + } + + String firstWithData = null; + String firstAny = null; + + for (ThingsModel model : models) { + String identity = model.getIdentifier(); + if (identity == null || identity.trim().isEmpty()) { + continue; + } + String name = model.getModelName() == null ? identity : model.getModelName(); + String lower = (name + " " + identity).toLowerCase(); + boolean auxiliary = isAuxiliary(lower); + + // 核心关键词命中优先(倾角计/温度计允许辅助指标作为主指标) + if (!auxiliary || allowAuxiliary) { + for (String keyword : keywords) { + if (lower.contains(keyword.toLowerCase())) { + return identity; + } + } + } + + // 辅助指标不参与"第一个"兜底 + if (auxiliary && !allowAuxiliary) { + continue; + } + + boolean hasData = byIdentity.containsKey(identity); + if (firstAny == null) { + firstAny = identity; + } + if (firstWithData == null && hasData) { + firstWithData = identity; + } + } + + if (firstWithData != null) { + return firstWithData; + } + if (firstAny != null) { + return firstAny; + } + // 全部是辅助指标时,退回第一个物模型 + return models.get(0).getIdentifier(); + } + + /** + * 是否为辅助指标(角度/温度/电压/电量/信号/湿度等) + */ + public boolean isAuxiliary(String nameAndIdentifier) { + for (String keyword : AUXILIARY_KEYWORDS) { + if (nameAndIdentifier.contains(keyword)) { + return true; + } + } + return false; + } + + /** + * 是否需要生成独立图表(辅助指标中仅温度/电压等少量关注项可跳过) + */ + public boolean isChartWorthy(String nameAndIdentifier) { + return !nameAndIdentifier.contains("电量") + && !nameAndIdentifier.contains("battery") + && !nameAndIdentifier.contains("信号") + && !nameAndIdentifier.contains("signal"); + } +} diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/axial_force/AxialForceAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/axial_force/AxialForceAnalyzer.java index 63b6785a..1efef286 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/axial_force/AxialForceAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/axial_force/AxialForceAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.axial_force; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -60,6 +63,12 @@ public class AxialForceAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.AXIAL_FORCE; @@ -68,23 +77,41 @@ public class AxialForceAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); - + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -96,31 +123,14 @@ public class AxialForceAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:优先名称/标识符命中关键词的物模型,排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, false, "轴力", "应力", "force", "stress"); + result.setPrimaryIdentifier(primaryIdentity); buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; } - /** - * 主监测指标:优先名称/标识符含"力/stress/压力/拉力",否则取第一个有数据的指标 - */ - private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("force") || lower.contains("stress") || lower.contains("轴力") || lower.contains("应力") || lower.contains("压力") || lower.contains("拉力")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; - } - private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { Statistics statistics = result.getStatistics().get(primaryIdentity); TrendAnalysis trend = result.getTrends().get(primaryIdentity); @@ -129,6 +139,32 @@ public class AxialForceAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据(支持多物模型标识符,如红线/白线/绿线) + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { @@ -151,6 +187,15 @@ public class AxialForceAnalyzer implements ReportAnalyzer { statistics.getMax().toPlainString(), unit, statistics.getMin().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal ratio = statistics.getCurrent().abs().divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "当前轴力占控制值比例:%.2f%%(控制值:%s%s)。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -166,24 +211,137 @@ public class AxialForceAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("轴力/应力时程曲线", metricName, unit, data); - result.getCharts().put("timeSeriesChart", png); + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String forceState = (statistics.getCurrent() != null && statistics.getCurrent().compareTo(BigDecimal.ZERO) >= 0) ? "受拉" : "受压"; + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + return String.format( + "本期轴力/应力监测数据显示:当前轴力为%s%s,处于%s状态,较初始值变化%s%s,变化速率为%s%s/天,轴力呈%s趋势。" + + "统计期内最大轴力%s%s,最小轴力%s%s,平均轴力%s%s。", + statistics.getCurrent().toPlainString(), unit, + forceState, + statistics.getDelta().toPlainString(), unit, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getMin().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { - return null; + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, String unit) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("轴力呈增大趋势,需关注结构受力状态变化。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("轴力呈减小趋势,结构受力状态趋于稳定。"); + } else { + advice.append("轴力变化稳定,结构受力状态正常。"); + } + } + + // 基于受力状态给出建议 + String forceState = (statistics.getCurrent() != null && statistics.getCurrent().compareTo(BigDecimal.ZERO) >= 0) ? "受拉" : "受压"; + if ("受拉".equals(forceState)) { + advice.append("当前结构处于受拉状态,需关注材料抗拉强度。"); + } else { + advice.append("当前结构处于受压状态,需关注材料抗压强度。"); + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即采取加固措施,并组织专业人员进行安全评估。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加密监测频率,准备应急预案。"); + } + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多物模型标识符) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/crack/CrackMeterAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/crack/CrackMeterAnalyzer.java index 62cc210b..55b32b5f 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/crack/CrackMeterAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/crack/CrackMeterAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.crack; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -34,7 +37,7 @@ import java.util.Objects; import java.util.stream.Collectors; /** - * 裂缝计专项分析器(V1:当前/初始宽度、变化量、速率、趋势、预警、时程图) + * 裂缝计专项分析器(当前/初始宽度、变化量、速率、趋势、预警、时程图) * * @author FastBee * @date 2026-08-16 @@ -60,6 +63,12 @@ public class CrackMeterAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.CRACK_METER; @@ -68,22 +77,41 @@ public class CrackMeterAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -95,31 +123,14 @@ public class CrackMeterAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:优先名称/标识符命中关键词的物模型,排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, false, "裂缝宽度", "缝宽", "width"); + result.setPrimaryIdentifier(primaryIdentity); buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; } - /** - * 主监测指标:优先名称/标识符含“宽度/缝宽/width”,否则取第一个有数据的指标 - */ - private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("width") || lower.contains("缝宽") || lower.contains("宽度")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; - } - private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { Statistics statistics = result.getStatistics().get(primaryIdentity); TrendAnalysis trend = result.getTrends().get(primaryIdentity); @@ -128,6 +139,32 @@ public class CrackMeterAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据 + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { @@ -149,6 +186,15 @@ public class CrackMeterAnalyzer implements ReportAnalyzer { statistics.getMax().toPlainString(), unit, statistics.getMin().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal ratio = statistics.getCurrent().divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "当前裂缝宽度占控制值比例:%.2f%%(控制值:%s%s)。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -164,26 +210,133 @@ public class CrackMeterAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("裂缝宽度时程曲线", metricName, unit, data); - // 使用统一键名 timeSeriesChart,兼容所有模板 - result.getCharts().put("timeSeriesChart", png); - result.getCharts().put("crackTrend", png); // 兼容旧版模板 + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + return String.format( + "本期裂缝宽度监测数据显示:当前裂缝宽度为%s%s,较初始值变化%s%s,变化速率为%s%s/天,裂缝呈%s趋势。" + + "统计期内最大裂缝宽度%s%s,最小裂缝宽度%s%s,平均裂缝宽度%s%s。", + statistics.getCurrent().toPlainString(), unit, + statistics.getDelta().toPlainString(), unit, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getMin().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { - return null; + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, String unit) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("裂缝宽度呈增大趋势,建议加强监测频率,关注裂缝发展速率。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("裂缝宽度呈减小趋势,结构状态趋于稳定。"); + } else { + advice.append("裂缝宽度变化稳定,结构状态正常。"); + } + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即采取加固措施,并组织专业人员进行安全评估。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加密监测频率,准备应急预案。"); + } + } + + // 基于变化量给出建议 + BigDecimal absDelta = statistics.getDelta().abs(); + if (absDelta.compareTo(new BigDecimal("1")) > 0) { + advice.append("裂缝变化量较大(>1mm),建议进行详细的结构安全评估。"); + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多物模型标识符) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/deep_displacement/DeepDisplacementAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/deep_displacement/DeepDisplacementAnalyzer.java index 6ceb54a1..509c5bb5 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/deep_displacement/DeepDisplacementAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/deep_displacement/DeepDisplacementAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.deep_displacement; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -60,6 +63,12 @@ public class DeepDisplacementAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.DEEP_DISPLACEMENT; @@ -68,22 +77,41 @@ public class DeepDisplacementAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -95,7 +123,11 @@ public class DeepDisplacementAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:按物模型顺序、排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, + "深部位移", "位移", "displacement", "沉降", "settlement"); + result.setPrimaryIdentifier(primaryIdentity); + buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; @@ -103,21 +135,12 @@ public class DeepDisplacementAnalyzer implements ReportAnalyzer { /** * 主监测指标:优先名称/标识符含"位移/displacement/x/y/z",否则取第一个有数据的指标 + * + * @deprecated 由 {@link PrimaryMetricResolver} 统一解析,保留仅为兼容历史调用 */ + @Deprecated private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("displacement") || lower.contains("位移") || lower.contains("_x") || lower.contains("_y") || lower.contains("_z")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; + return primaryMetricResolver.resolve(context, byIdentity, "位移", "displacement"); } private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { @@ -128,13 +151,39 @@ public class DeepDisplacementAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据(支持多物模型标识符,如不同深度的位移测点) + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { conclusions.add(new Conclusion(seq++, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); } else { conclusions.add(new Conclusion(seq++, String.format( - "统计期内深部水平位移由 %s%s 变化至 %s%s,累计位移量 %s%s,位移方向为%s。", + "统计期内深部位移由 %s%s 变化至 %s%s,累计位移量 %s%s,位移方向为%s。", statistics.getInitial().toPlainString(), unit, statistics.getCurrent().toPlainString(), unit, statistics.getDelta().toPlainString(), unit, @@ -148,6 +197,20 @@ public class DeepDisplacementAnalyzer implements ReportAnalyzer { statistics.getMax().toPlainString(), unit, statistics.getMin().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal ratio = statistics.getDelta().abs().divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "累计位移占控制值比例:%.2f%%(控制值:%s%s),需关注潜在滑动面发展趋势。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } + + // 位移速率评估 + if (rate.compareTo(new BigDecimal("2")) > 0) { + conclusions.add(new Conclusion(seq++, "位移速率较大,需加密监测频次,必要时启动预警机制。")); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -163,24 +226,133 @@ public class DeepDisplacementAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("深部位移时程曲线", metricName, unit, data); - result.getCharts().put("timeSeriesChart", png); + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + return String.format( + "本期深部位移监测数据显示:当前位移为%s%s,较初始值累计变化%s%s,位移速率为%s%s/天,位移方向呈%s趋势。" + + "统计期内最大位移%s%s,最小位移%s%s,平均位移%s%s。土体内部变形监测正常。", + statistics.getCurrent().toPlainString(), unit, + statistics.getDelta().toPlainString(), unit, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getMin().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { - return null; + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, String unit) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("深部位移呈增大趋势,可能存在潜在滑动面发展,需结合地质资料分析滑移面位置与形态。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("深部位移呈减小趋势,土体变形趋于稳定。"); + } else { + advice.append("深部位移变化稳定,土体内部变形正常。"); + } + } + + // 基于位移量级给出建议 + if (statistics.getDelta().abs().compareTo(new BigDecimal("10")) > 0) { + advice.append("累计位移量较大,建议加密监测频率,结合测斜孔剖面图分析位移沿深度分布规律。"); + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即启动应急预案,组织专业人员进行地质灾害评估,必要时采取加固措施。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加强巡视检查,准备应急物资,制定应急预案。"); + } + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多物模型标识符) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + // 补齐模板预留图表位(无数据时用空白图),避免模板标签缺失导致渲染异常 + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/inclinometer/InclinometerAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/inclinometer/InclinometerAnalyzer.java index be080c1f..add00a6b 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/inclinometer/InclinometerAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/inclinometer/InclinometerAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.inclinometer; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -60,6 +63,12 @@ public class InclinometerAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.INCLINOMETER; @@ -68,23 +77,41 @@ public class InclinometerAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); - + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -96,31 +123,14 @@ public class InclinometerAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:优先名称/标识符命中关键词的物模型,排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, true, "倾角", "角度", "angle", "inclin"); + result.setPrimaryIdentifier(primaryIdentity); buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; } - /** - * 主监测指标:优先名称/标识符含"倾角/incline/angle/°",否则取第一个有数据的指标 - */ - private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("incline") || lower.contains("angle") || lower.contains("倾角") || lower.contains("角度")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; - } - private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { Statistics statistics = result.getStatistics().get(primaryIdentity); TrendAnalysis trend = result.getTrends().get(primaryIdentity); @@ -129,6 +139,32 @@ public class InclinometerAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据(支持多物模型标识符,如X轴/Y轴倾角) + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { @@ -150,6 +186,20 @@ public class InclinometerAnalyzer implements ReportAnalyzer { statistics.getMax().toPlainString(), unit, statistics.getMin().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal ratio = statistics.getCurrent().abs().divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "当前倾角占控制值比例:%.2f%%(控制值:%s%s),需关注结构倾斜发展趋势。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } + + // 倾角安全评估 + if (statistics.getCurrent().abs().compareTo(new BigDecimal("5")) > 0) { + conclusions.add(new Conclusion(seq++, "倾角较大,需评估结构倾斜风险,必要时采取纠偏措施。")); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -165,24 +215,132 @@ public class InclinometerAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("倾角时程曲线", metricName, unit, data); - result.getCharts().put("timeSeriesChart", png); + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + return String.format( + "本期倾角监测数据显示:当前倾角为%s%s,较初始值变化%s%s,变化速率为%s%s/天,倾角呈%s趋势。" + + "统计期内最大倾角%s%s,最小倾角%s%s,平均倾角%s%s。结构倾斜监测正常。", + statistics.getCurrent().toPlainString(), unit, + statistics.getDelta().toPlainString(), unit, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getMin().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { - return null; + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, String unit) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("倾角呈增大趋势,结构倾斜加剧,需分析倾斜原因与影响。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("倾角呈减小趋势,结构倾斜趋缓或回正。"); + } else { + advice.append("倾角变化稳定,结构倾斜状态正常。"); + } + } + + // 基于倾角量级给出建议 + if (statistics.getCurrent().abs().compareTo(new BigDecimal("3")) > 0) { + advice.append("当前倾角较大,建议结合建筑物使用年限、基础形式等因素综合评估结构安全性。"); + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即评估结构安全性,必要时采取纠偏或加固措施。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加密监测频率,制定纠偏预案。"); + } + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多物模型标识符) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/rain_gauge/RainGaugeAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/rain_gauge/RainGaugeAnalyzer.java index 97a66b27..d1e5e8dc 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/rain_gauge/RainGaugeAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/rain_gauge/RainGaugeAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.rain_gauge; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -60,6 +63,12 @@ public class RainGaugeAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.RAIN_GAUGE; @@ -68,23 +77,41 @@ public class RainGaugeAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); - + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -96,31 +123,14 @@ public class RainGaugeAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:优先名称/标识符命中关键词的物模型,排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, false, "雨量", "降雨", "降水量", "rain"); + result.setPrimaryIdentifier(primaryIdentity); buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; } - /** - * 主监测指标:优先名称/标识符含"雨量/rain/precipitation",否则取第一个有数据的指标 - */ - private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("rain") || lower.contains("雨量") || lower.contains("precipitation") || lower.contains("降水")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; - } - private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { Statistics statistics = result.getStatistics().get(primaryIdentity); TrendAnalysis trend = result.getTrends().get(primaryIdentity); @@ -129,6 +139,32 @@ public class RainGaugeAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据(支持多物模型标识符) + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { @@ -149,6 +185,20 @@ public class RainGaugeAnalyzer implements ReportAnalyzer { rate.toPlainString(), unit, statistics.getMax().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal ratio = statistics.getDelta().abs().divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "累计降雨量占控制值比例:%.2f%%(控制值:%s%s),需关注降雨对边坡稳定性的影响。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } + + // 降雨强度评估 + if (statistics.getDelta().abs().compareTo(new BigDecimal("50")) > 0) { + conclusions.add(new Conclusion(seq++, "统计期内降雨量较大,需加强巡视检查,关注排水设施运行状况。")); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -164,24 +214,130 @@ public class RainGaugeAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("降雨量时程曲线", metricName, unit, data); - result.getCharts().put("timeSeriesChart", png); + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + return String.format( + "本期降雨监测数据显示:统计期内累计降雨量%s%s,平均日降雨量%s%s/天,降雨呈%s趋势。" + + "统计期内最大单次降雨%s%s,平均降雨强度%s%s。环境气象监测正常。", + statistics.getDelta().abs().toPlainString(), unit, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { - return null; + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, String unit) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("降雨呈增强趋势,需关注降雨对边坡稳定性、地下水位的影响。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("降雨呈减弱趋势,天气转好。"); + } else { + advice.append("降雨强度平稳,气象条件正常。"); + } + } + + // 基于累计降雨量给出建议 + if (statistics.getDelta().abs().compareTo(new BigDecimal("30")) > 0) { + advice.append("统计期内降雨量较大,建议结合地质资料分析降雨对边坡稳定性的影响,必要时加密监测频次。"); + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即启动应急预案,加强巡视检查,做好防汛准备。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加强巡视检查,关注排水设施运行状况,准备应急物资。"); + } + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多物模型标识符) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/ranging_meter/RangingMeterAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/ranging_meter/RangingMeterAnalyzer.java index fae4f411..7ea9d86d 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/ranging_meter/RangingMeterAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/ranging_meter/RangingMeterAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.ranging_meter; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -60,6 +63,12 @@ public class RangingMeterAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.RANGING_METER; @@ -68,23 +77,41 @@ public class RangingMeterAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); - + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -96,31 +123,14 @@ public class RangingMeterAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:优先名称/标识符命中关键词的物模型,排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, false, "距离", "位移", "distance"); + result.setPrimaryIdentifier(primaryIdentity); buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; } - /** - * 主监测指标:优先名称/标识符含"距离/distance/range",否则取第一个有数据的指标 - */ - private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("distance") || lower.contains("range") || lower.contains("距离") || lower.contains("测距")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; - } - private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { Statistics statistics = result.getStatistics().get(primaryIdentity); TrendAnalysis trend = result.getTrends().get(primaryIdentity); @@ -129,6 +139,32 @@ public class RangingMeterAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据(支持多物模型标识符) + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { @@ -150,6 +186,15 @@ public class RangingMeterAnalyzer implements ReportAnalyzer { statistics.getMax().toPlainString(), unit, statistics.getMin().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal ratio = statistics.getDelta().abs().divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "距离变化占控制值比例:%.2f%%(控制值:%s%s),需关注收敛变形趋势。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -165,24 +210,132 @@ public class RangingMeterAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("测距时程曲线", metricName, unit, data); - result.getCharts().put("timeSeriesChart", png); + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + return String.format( + "本期测距监测数据显示:当前测距为%s%s,较初始值变化%s%s,变化速率为%s%s/天,测距呈%s趋势。" + + "统计期内最大测距%s%s,最小测距%s%s,平均测距%s%s。变形监测正常。", + statistics.getCurrent().toPlainString(), unit, + statistics.getDelta().toPlainString(), unit, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getMin().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { - return null; + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, String unit) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("测距呈增大趋势,可能存在收敛变形,需分析变形原因与速率。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("测距呈减小趋势,可能存在挤压变形或测点位移,需结合其他监测数据分析。"); + } else { + advice.append("测距变化稳定,变形正常。"); + } + } + + // 基于变化量级给出建议 + if (statistics.getDelta().abs().compareTo(new BigDecimal("5")) > 0) { + advice.append("距离变化较大,建议分析变形原因,评估结构安全性。"); + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即评估结构安全性,必要时采取加固措施。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加密监测频率,准备应急预案。"); + } + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多物模型标识符) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/static_level/StaticLevelAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/static_level/StaticLevelAnalyzer.java index f85c5ef1..428b99e6 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/static_level/StaticLevelAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/static_level/StaticLevelAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.static_level; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -60,6 +63,12 @@ public class StaticLevelAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.STATIC_LEVEL; @@ -68,23 +77,41 @@ public class StaticLevelAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); - + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -96,31 +123,14 @@ public class StaticLevelAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:优先名称/标识符命中关键词的物模型,排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, false, "沉降", "高程", "settlement"); + result.setPrimaryIdentifier(primaryIdentity); buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; } - /** - * 主监测指标:优先名称/标识符含"高程/elevation/level/沉降",否则取第一个有数据的指标 - */ - private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("elevation") || lower.contains("level") || lower.contains("高程") || lower.contains("沉降") || lower.contains("水准")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; - } - private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { Statistics statistics = result.getStatistics().get(primaryIdentity); TrendAnalysis trend = result.getTrends().get(primaryIdentity); @@ -129,6 +139,32 @@ public class StaticLevelAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit, result.getStatistics(), window); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据(支持多测点高程监测) + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { @@ -150,6 +186,22 @@ public class StaticLevelAnalyzer implements ReportAnalyzer { statistics.getMax().toPlainString(), unit, statistics.getMin().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal absDelta = statistics.getDelta().abs(); + BigDecimal ratio = absDelta.divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "累计沉降量占控制值比例:%.2f%%(控制值:%s%s)。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } + + // 不均匀沉降评估(多测点场景) + String differentialSettlement = assessDifferentialSettlement(result.getStatistics()); + if (StringUtils.isNotEmpty(differentialSettlement)) { + conclusions.add(new Conclusion(seq++, differentialSettlement)); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -165,24 +217,235 @@ public class StaticLevelAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("静力水准时程曲线", metricName, unit, data); - result.getCharts().put("timeSeriesChart", png); + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + String settlementType = getSettlementType(statistics.getDelta()); + + return String.format( + "本期静力水准监测数据显示:当前高程为%s%s,较初始值变化%s%s(%s),变化速率为%s%s/天,结构呈%s趋势。" + + "统计期内最大沉降量%s%s,最小沉降量%s%s,平均沉降量%s%s。", + statistics.getCurrent().toPlainString(), unit, + statistics.getDelta().toPlainString(), unit, settlementType, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getMin().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, + String unit, Map allStatistics, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; + } + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("结构呈持续下沉趋势,需关注沉降速率变化及周边环境影响因素。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("结构呈回弹隆起趋势,需关注回弹原因及对结构的影响。"); + } else { + advice.append("沉降变化稳定,结构状态正常。"); + } + } + + // 基于沉降量给出建议 + BigDecimal absDelta = statistics.getDelta().abs(); + if (absDelta.compareTo(new BigDecimal("10")) > 0) { + advice.append("累计沉降量较大(>10mm),建议进行详细的地基稳定性评估。"); + } + + // 基于沉降速率给出建议 + if (window != null) { + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + if (rate != null && rate.compareTo(new BigDecimal("2")) > 0) { + advice.append(String.format("沉降速率较快(%.2fmm/天),需加密监测频率。", rate.doubleValue())); + } + } + + // 不均匀沉降分析 + if (allStatistics != null && allStatistics.size() > 1) { + String differentialAdvice = analyzeDifferentialSettlement(allStatistics); + if (StringUtils.isNotEmpty(differentialAdvice)) { + advice.append(differentialAdvice); + } + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即采取地基加固措施,并组织专业人员进行安全评估。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加密监测频率,制定应急预案。"); + } + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多测点高程监测) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + /** + * 评估不均匀沉降(多测点场景) + */ + private String assessDifferentialSettlement(Map allStatistics) { + if (allStatistics == null || allStatistics.size() < 2) { return null; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + BigDecimal maxDelta = null; + BigDecimal minDelta = null; + + for (Statistics stats : allStatistics.values()) { + if (stats == null || stats.getDelta() == null) { + continue; + } + if (maxDelta == null || stats.getDelta().abs().compareTo(maxDelta) > 0) { + maxDelta = stats.getDelta().abs(); + } + if (minDelta == null || stats.getDelta().abs().compareTo(minDelta) < 0) { + minDelta = stats.getDelta().abs(); + } + } + + if (maxDelta != null && minDelta != null) { + BigDecimal differential = maxDelta.subtract(minDelta); + if (differential.compareTo(new BigDecimal("5")) > 0) { + return String.format("存在不均匀沉降,测点间最大沉降差为%s%s,建议关注结构整体稳定性。", + differential.toPlainString(), "mm"); + } + } + + return null; + } + + /** + * 分析不均匀沉降(用于专业建议) + */ + private String analyzeDifferentialSettlement(Map allStatistics) { + if (allStatistics == null || allStatistics.size() < 2) { + return ""; + } + + BigDecimal maxDelta = null; + BigDecimal minDelta = null; + + for (Statistics stats : allStatistics.values()) { + if (stats == null || stats.getDelta() == null) { + continue; + } + if (maxDelta == null || stats.getDelta().abs().compareTo(maxDelta) > 0) { + maxDelta = stats.getDelta().abs(); + } + if (minDelta == null || stats.getDelta().abs().compareTo(minDelta) < 0) { + minDelta = stats.getDelta().abs(); + } + } + + if (maxDelta != null && minDelta != null) { + BigDecimal differential = maxDelta.subtract(minDelta); + if (differential.compareTo(new BigDecimal("5")) > 0) { + return "存在明显不均匀沉降现象,需关注对结构整体稳定性的影响。"; + } + } + + return ""; + } + + /** + * 判断沉降类型 + */ + private String getSettlementType(BigDecimal delta) { + if (delta == null) { + return "待分析"; + } + if (delta.compareTo(BigDecimal.ZERO) > 0) { + return "下沉"; + } else if (delta.compareTo(BigDecimal.ZERO) < 0) { + return "隆起"; + } + return "稳定"; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/strain_gauge/StrainGaugeAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/strain_gauge/StrainGaugeAnalyzer.java index c629a472..f702a846 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/strain_gauge/StrainGaugeAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/strain_gauge/StrainGaugeAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.strain_gauge; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -60,6 +63,12 @@ public class StrainGaugeAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.STRAIN_GAUGE; @@ -68,23 +77,41 @@ public class StrainGaugeAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); - + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -96,31 +123,14 @@ public class StrainGaugeAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:优先名称/标识符命中关键词的物模型,排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, false, "应变", "strain"); + result.setPrimaryIdentifier(primaryIdentity); buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; } - /** - * 主监测指标:优先名称/标识符含"应变/strain/με",否则取第一个有数据的指标 - */ - private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("strain") || lower.contains("应变") || lower.contains("με")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; - } - private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { Statistics statistics = result.getStatistics().get(primaryIdentity); TrendAnalysis trend = result.getTrends().get(primaryIdentity); @@ -129,6 +139,32 @@ public class StrainGaugeAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据(支持多物模型标识符) + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { @@ -151,6 +187,15 @@ public class StrainGaugeAnalyzer implements ReportAnalyzer { statistics.getMax().toPlainString(), unit, statistics.getMin().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal ratio = statistics.getCurrent().abs().divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "当前应变占控制值比例:%.2f%%(控制值:%s%s),需关注材料强度储备。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -166,24 +211,137 @@ public class StrainGaugeAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("应变时程曲线", metricName, unit, data); - result.getCharts().put("timeSeriesChart", png); + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String strainState = (statistics.getCurrent() != null && statistics.getCurrent().compareTo(BigDecimal.ZERO) >= 0) ? "拉应变" : "压应变"; + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + return String.format( + "本期应变监测数据显示:当前应变为%s%s,处于%s状态,较初始值变化%s%s,应变速率为%s%s/天,应变呈%s趋势。" + + "统计期内最大应变%s%s,最小应变%s%s,平均应变%s%s。结构变形监测正常。", + statistics.getCurrent().toPlainString(), unit, + strainState, + statistics.getDelta().toPlainString(), unit, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getMin().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { - return null; + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, String unit) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于应变状态给出建议 + String strainState = (statistics.getCurrent() != null && statistics.getCurrent().compareTo(BigDecimal.ZERO) >= 0) ? "拉应变" : "压应变"; + if ("拉应变".equals(strainState)) { + advice.append("当前结构处于拉应变状态,需关注材料抗拉强度。"); + } else { + advice.append("当前结构处于压应变状态,需关注材料抗压强度和稳定性。"); + } + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("应变呈增大趋势,结构变形加剧,需评估应力重分布影响。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("应变呈减小趋势,结构变形趋于稳定。"); + } else { + advice.append("应变变化稳定,结构变形正常。"); + } + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即评估结构安全性,必要时采取加固或卸载措施。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加密监测频率,准备应急预案。"); + } + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多物模型标识符) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/thermometer/ThermometerAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/thermometer/ThermometerAnalyzer.java index 80410950..6bcfe950 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/thermometer/ThermometerAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/thermometer/ThermometerAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.thermometer; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -60,6 +63,12 @@ public class ThermometerAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.THERMOMETER; @@ -68,23 +77,41 @@ public class ThermometerAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); - + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -96,31 +123,14 @@ public class ThermometerAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:优先名称/标识符命中关键词的物模型,排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, true, "温度", "temperature"); + result.setPrimaryIdentifier(primaryIdentity); buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; } - /** - * 主监测指标:优先名称/标识符含"温度/temp/temperature/℃",否则取第一个有数据的指标 - */ - private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("temp") || lower.contains("温度") || lower.contains("temperature")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; - } - private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { Statistics statistics = result.getStatistics().get(primaryIdentity); TrendAnalysis trend = result.getTrends().get(primaryIdentity); @@ -129,6 +139,32 @@ public class ThermometerAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据(支持多物模型标识符) + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { @@ -150,6 +186,21 @@ public class ThermometerAnalyzer implements ReportAnalyzer { statistics.getMax().toPlainString(), unit, statistics.getMin().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal ratio = statistics.getCurrent().abs().divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "当前温度占控制值比例:%.2f%%(控制值:%s%s),需关注温度对结构的影响。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } + + // 温度异常评估 + BigDecimal tempRange = statistics.getMax().subtract(statistics.getMin()); + if (tempRange.compareTo(new BigDecimal("20")) > 0) { + conclusions.add(new Conclusion(seq++, "统计期内温度波动较大,需关注温差对结构变形的影响。")); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -165,24 +216,133 @@ public class ThermometerAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("温度时程曲线", metricName, unit, data); - result.getCharts().put("timeSeriesChart", png); + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + return String.format( + "本期温度监测数据显示:当前温度为%s%s,较初始值变化%s%s,温度变化速率为%s%s/天,温度呈%s趋势。" + + "统计期内最高温度%s%s,最低温度%s%s,平均温度%s%s。环境温度监测正常。", + statistics.getCurrent().toPlainString(), unit, + statistics.getDelta().toPlainString(), unit, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getMin().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { - return null; + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, String unit) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("温度呈上升趋势,需关注高温对材料性能和结构变形的影响。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("温度呈下降趋势,需关注低温对材料性能和结构变形的影响。"); + } else { + advice.append("温度变化平稳,环境温度正常。"); + } + } + + // 基于温差给出建议 + BigDecimal tempRange = statistics.getMax().subtract(statistics.getMin()); + if (tempRange.compareTo(new BigDecimal("15")) > 0) { + advice.append("统计期内温差较大,需分析温差对结构变形的影响,必要时进行温度修正。"); + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即评估温度异常对结构安全的影响,必要时采取保护措施。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加强温度监测,分析温度异常原因。"); + } + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多物模型标识符) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/vibrating_wire/VibratingWireAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/vibrating_wire/VibratingWireAnalyzer.java index ed32ad7e..f34b45ef 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/vibrating_wire/VibratingWireAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/vibrating_wire/VibratingWireAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.vibrating_wire; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -60,6 +63,12 @@ public class VibratingWireAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.VIBRATING_WIRE; @@ -68,23 +77,41 @@ public class VibratingWireAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); - + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -96,31 +123,14 @@ public class VibratingWireAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:优先名称/标识符命中关键词的物模型,排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, false, "频率", "frequency"); + result.setPrimaryIdentifier(primaryIdentity); buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; } - /** - * 主监测指标:优先名称/标识符含"频率/frequency/Hz",否则取第一个有数据的指标 - */ - private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("frequency") || lower.contains("频率") || lower.contains("hz")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; - } - private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { Statistics statistics = result.getStatistics().get(primaryIdentity); TrendAnalysis trend = result.getTrends().get(primaryIdentity); @@ -129,6 +139,32 @@ public class VibratingWireAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据(支持多物模型标识符) + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { @@ -150,6 +186,15 @@ public class VibratingWireAnalyzer implements ReportAnalyzer { statistics.getMax().toPlainString(), unit, statistics.getMin().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal ratio = statistics.getDelta().abs().divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "频率变化占控制值比例:%.2f%%(控制值:%s%s),需结合温度补偿分析应力状态。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -165,24 +210,132 @@ public class VibratingWireAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("振弦频率时程曲线", metricName, unit, data); - result.getCharts().put("timeSeriesChart", png); + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + return String.format( + "本期振弦监测数据显示:当前频率为%s%s,较初始值变化%s%s,频率变化速率为%s%s/天,频率呈%s趋势。" + + "统计期内最大频率%s%s,最小频率%s%s,平均频率%s%s。振弦传感器工作正常。", + statistics.getCurrent().toPlainString(), unit, + statistics.getDelta().toPlainString(), unit, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getMin().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { - return null; + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, String unit) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("振弦频率呈增大趋势,应力状态发生变化,需结合温度补偿计算实际应力值。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("振弦频率呈减小趋势,结构应力状态趋于松弛。"); + } else { + advice.append("振弦频率变化稳定,结构应力状态正常。"); + } + } + + // 基于频率变化量级给出建议 + if (statistics.getDelta().abs().compareTo(new BigDecimal("50")) > 0) { + advice.append("频率变化较大,建议检查传感器零点漂移,进行温度补偿修正。"); + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即校验传感器状态,分析应力超限原因,必要时采取加固措施。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加密监测频率,准备应急预案。"); + } + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多物模型标识符) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/analyzer/water_level/WaterLevelAnalyzer.java b/fastbee-report/src/main/java/com/fastbee/report/analyzer/water_level/WaterLevelAnalyzer.java index 56d28a9f..8ff34a65 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/analyzer/water_level/WaterLevelAnalyzer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/analyzer/water_level/WaterLevelAnalyzer.java @@ -3,6 +3,7 @@ package com.fastbee.report.analyzer.water_level; import com.fastbee.common.enums.MonitorCategory; import com.fastbee.common.utils.StringUtils; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.report.analysis.PrimaryMetricResolver; import com.fastbee.report.analysis.QualityAnalyzer; import com.fastbee.report.analysis.RateCalculator; import com.fastbee.report.analysis.StatisticsCalculator; @@ -11,10 +12,12 @@ import com.fastbee.report.analysis.WarningAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.api.ReportRequest; import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.chart.MetricChartBuilder; import com.fastbee.report.core.ReportContext; import com.fastbee.report.data.MetricData; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; @@ -60,6 +63,12 @@ public class WaterLevelAnalyzer implements ReportAnalyzer { @Resource private ChartGenerator chartGenerator; + @Resource + private PrimaryMetricResolver primaryMetricResolver; + + @Resource + private MetricChartBuilder metricChartBuilder; + @Override public boolean supports(MonitorCategory category) { return category == MonitorCategory.WATER_LEVEL; @@ -68,23 +77,41 @@ public class WaterLevelAnalyzer implements ReportAnalyzer { @Override public AnalysisResult analyze(ReportContext context, ReportRequest request) { AnalysisResult result = new AnalysisResult(); + + // 1. 按物模型标识符分组历史数据 Map> byIdentity = context.getMetricDataList().stream() .filter(d -> d.getIdentity() != null) .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); - if (byIdentity.isEmpty()) { - result.getConclusions().add(new Conclusion(1, "统计期内无有效监测数据,请检查设备上报状态与时间范围。")); + // 2. 获取所有监测物模型(即使没有数据也要显示) + Map allModels = context.getThingsModels().stream() + .filter(m -> m.getIdentifier() != null) + .collect(Collectors.toMap(ThingsModel::getIdentifier, m -> m, (o, n) -> n, LinkedHashMap::new)); + + if (allModels.isEmpty()) { + result.getConclusions().add(new Conclusion(1, "设备未配置监测物模型,请联系管理员配置。")); return result; } - for (Map.Entry> entry : byIdentity.entrySet()) { + // 3. 为每个物模型生成统计数据(包括无数据的物模型) + for (Map.Entry entry : allModels.entrySet()) { String identity = entry.getKey(); - List data = entry.getValue(); - + ThingsModel model = entry.getValue(); + List data = byIdentity.getOrDefault(identity, new ArrayList<>()); + ReportThreshold threshold = context.getThresholds().get(identity); BigDecimal controlValue = threshold == null ? null : threshold.getControlValue(); Statistics statistics = statisticsCalculator.calculate(data); + // 补充物模型信息(确保即使无数据也有 modelName 和 unit) + if (statistics.getModelName() == null || statistics.getModelName().isEmpty()) { + statistics.setModelName(model.getModelName()); + } + if (statistics.getUnit() == null || statistics.getUnit().isEmpty()) { + statistics.setUnit(model.getUnit()); + } + statistics.setIdentifier(identity); + TrendAnalysis trend = trendAnalyzer.analyze(data); QualityAnalysis quality = qualityAnalyzer.analyze(data, context.getTimeWindow(), controlValue); WarningAnalysis warning = warningAnalyzer.analyze( @@ -96,31 +123,14 @@ public class WaterLevelAnalyzer implements ReportAnalyzer { result.getWarnings().put(identity, warning); } - String primaryIdentity = resolvePrimaryIdentity(byIdentity, context); + // 统一主指标口径:优先名称/标识符命中关键词的物模型,排除角度/温度/电压等辅助量 + String primaryIdentity = primaryMetricResolver.resolve(context, byIdentity, false, "水位", "液位", "water"); + result.setPrimaryIdentifier(primaryIdentity); buildConclusions(result, context, primaryIdentity); buildChart(result, context, primaryIdentity); return result; } - /** - * 主监测指标:优先名称/标识符含"水位/level/water/depth",否则取第一个有数据的指标 - */ - private String resolvePrimaryIdentity(Map> byIdentity, ReportContext context) { - String fallback = null; - for (Map.Entry> entry : byIdentity.entrySet()) { - ThingsModel model = findModel(context, entry.getKey()); - String name = model == null ? entry.getKey() : (model.getModelName() == null ? entry.getKey() : model.getModelName()); - String lower = (name + entry.getKey()).toLowerCase(); - if (lower.contains("level") || lower.contains("water") || lower.contains("水位") || lower.contains("水深") || lower.contains("depth")) { - return entry.getKey(); - } - if (fallback == null && !entry.getValue().isEmpty()) { - fallback = entry.getKey(); - } - } - return fallback == null ? byIdentity.keySet().iterator().next() : fallback; - } - private void buildConclusions(AnalysisResult result, ReportContext context, String primaryIdentity) { Statistics statistics = result.getStatistics().get(primaryIdentity); TrendAnalysis trend = result.getTrends().get(primaryIdentity); @@ -129,6 +139,32 @@ public class WaterLevelAnalyzer implements ReportAnalyzer { TimeWindow window = context.getTimeWindow(); String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); + // 生成项目概况总结 + String summary = buildSummary(statistics, trend, unit, window); + result.setSummary(summary); + + // 生成专业分析建议 + String advice = buildProfessionalAdvice(statistics, trend, warning, unit); + result.setProfessionalAdvice(advice); + + // 设置安全评估 + if (warning != null) { + result.setSafetyLevel(convertWarningToSafetyLevel(warning.getStatus())); + result.setSafetyDescription(warning.getDescription()); + } + + // 设置控制值 + ReportThreshold threshold = context.getThresholds().get(primaryIdentity); + if (threshold != null && threshold.getControlValue() != null) { + result.setControlValue(threshold.getControlValue()); + result.setControlValueUnit(threshold.getUnit()); + } + + // 组装多测点数据(支持多物模型标识符) + List metricPoints = buildMetricPoints(result, context); + result.setMetricPoints(metricPoints); + + // 生成详细结论 List conclusions = new ArrayList<>(); int seq = 1; if (statistics == null || statistics.getCount() == 0) { @@ -150,6 +186,15 @@ public class WaterLevelAnalyzer implements ReportAnalyzer { statistics.getMax().toPlainString(), unit, statistics.getMin().toPlainString(), unit, statistics.getAvg().toPlainString(), unit))); + + // 添加控制值对比结论 + if (result.getControlValue() != null && result.getControlValue().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal ratio = statistics.getDelta().abs().divide(result.getControlValue(), 4, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal("100")); + conclusions.add(new Conclusion(seq++, String.format( + "水位变化占控制值比例:%.2f%%(控制值:%s%s),需关注渗流场变化。", + ratio.doubleValue(), result.getControlValue().toPlainString(), result.getControlValueUnit()))); + } } if (trend != null && StringUtils.isNotEmpty(trend.getDescription())) { @@ -165,24 +210,132 @@ public class WaterLevelAnalyzer implements ReportAnalyzer { result.setConclusions(conclusions); } - private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { - List data = context.getMetricDataList().stream() - .filter(d -> Objects.equals(d.getIdentity(), primaryIdentity)) - .collect(Collectors.toList()); - Statistics statistics = result.getStatistics().get(primaryIdentity); - String metricName = statistics == null ? primaryIdentity : statistics.getModelName(); - String unit = statistics == null ? "" : (statistics.getUnit() == null ? "" : statistics.getUnit()); - byte[] png = chartGenerator.timeSeriesChart("水位时程曲线", metricName, unit, data); - result.getCharts().put("timeSeriesChart", png); + /** + * 生成项目概况总结 + */ + private String buildSummary(Statistics statistics, TrendAnalysis trend, String unit, TimeWindow window) { + if (statistics == null || statistics.getCount() == 0) { + return "统计期内无有效监测数据。"; + } + + String direction = trend == null ? "待分析" : directionText(trend.getDirection()); + BigDecimal rate = rateCalculator.ratePerDay(statistics, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + + return String.format( + "本期水位监测数据显示:当前水位为%s%s,较初始值变化%s%s,水位变化速率为%s%s/天,水位呈%s趋势。" + + "统计期内最高水位%s%s,最低水位%s%s,平均水位%s%s。渗流监测正常。", + statistics.getCurrent().toPlainString(), unit, + statistics.getDelta().toPlainString(), unit, + rate.toPlainString(), unit, + direction, + statistics.getMax().toPlainString(), unit, + statistics.getMin().toPlainString(), unit, + statistics.getAvg().toPlainString(), unit + ); } - private ThingsModel findModel(ReportContext context, String identity) { - if (context.getThingsModels() == null) { - return null; + /** + * 生成专业分析建议 + */ + private String buildProfessionalAdvice(Statistics statistics, TrendAnalysis trend, WarningAnalysis warning, String unit) { + if (statistics == null || statistics.getCount() == 0) { + return "建议检查设备上报状态,确保数据采集正常。"; } - return context.getThingsModels().stream() - .filter(m -> Objects.equals(m.getIdentifier(), identity)) - .findFirst().orElse(null); + + StringBuilder advice = new StringBuilder(); + advice.append("专业分析:"); + + // 基于趋势方向给出建议 + if (trend != null) { + if (TrendAnalysis.DIRECTION_UP.equals(trend.getDirection())) { + advice.append("水位呈上升趋势,需关注浸润线位置变化,评估渗流场稳定性。"); + } else if (TrendAnalysis.DIRECTION_DOWN.equals(trend.getDirection())) { + advice.append("水位呈下降趋势,渗流场趋于稳定。"); + } else { + advice.append("水位变化平稳,渗流场稳定。"); + } + } + + // 基于水位变化量级给出建议 + if (statistics.getDelta().abs().compareTo(new BigDecimal("1")) > 0) { + advice.append("水位变化幅度较大,建议分析水位变化原因(降雨、抽排水等),评估对边坡稳定性的影响。"); + } + + // 基于预警状态给出建议 + if (warning != null) { + if (WarningAnalysis.STATUS_ALARM.equals(warning.getStatus())) { + advice.append("当前处于报警状态,建议立即启动排水措施,组织专业人员进行渗流安全评估。"); + } else if (WarningAnalysis.STATUS_WARNING.equals(warning.getStatus())) { + advice.append("当前处于预警状态,建议加强巡视检查,准备应急排水预案。"); + } + } + + return advice.toString(); + } + + /** + * 将预警状态转换为安全等级 + */ + private String convertWarningToSafetyLevel(String warningStatus) { + if (WarningAnalysis.STATUS_ALARM.equals(warningStatus)) { + return "DANGER"; + } else if (WarningAnalysis.STATUS_WARNING.equals(warningStatus)) { + return "WARNING"; + } + return "SAFE"; + } + + /** + * 组装多测点数据(支持多物模型标识符) + */ + private List buildMetricPoints(AnalysisResult result, ReportContext context) { + List points = new ArrayList<>(); + + for (Map.Entry entry : result.getStatistics().entrySet()) { + String identity = entry.getKey(); + Statistics stats = entry.getValue(); + + MetricPointData point = MetricPointData.builder() + .identifier(identity) + .modelName(stats.getModelName()) + .initialValue(stats.getInitial()) + .initialUnit(stats.getUnit()) + .currentValue(stats.getCurrent()) + .currentUnit(stats.getUnit()) + .changeValue(stats.getDelta()) + .changeUnit(stats.getUnit()) + .maxValue(stats.getMax()) + .minValue(stats.getMin()) + .avgValue(stats.getAvg()) + .build(); + + // 设置预警状态 + WarningAnalysis warning = result.getWarnings().get(identity); + if (warning != null) { + point.setWarningStatus(warning.getStatus()); + } + + // 计算变化速率 + TimeWindow window = context.getTimeWindow(); + BigDecimal rate = rateCalculator.ratePerDay(stats, + Duration.between(window.getStartTime(), window.getEndTime()).getSeconds()); + point.setChangeRate(rate); + point.setRateUnit(stats.getUnit() + "/天"); + + points.add(point); + } + + return points; + } + + private void buildChart(AnalysisResult result, ReportContext context, String primaryIdentity) { + // 主指标单图 + 其余指标按单位分组多曲线图(展示所有物模型数据) + Map> byIdentity = context.getMetricDataList().stream() + .filter(d -> d.getIdentity() != null) + .collect(Collectors.groupingBy(MetricData::getIdentity, LinkedHashMap::new, Collectors.toList())); + Map charts = metricChartBuilder.build(result.getStatistics(), primaryIdentity, byIdentity); + result.getCharts().putAll(metricChartBuilder.fillPlaceholders(charts)); } private String statusText(String status) { diff --git a/fastbee-report/src/main/java/com/fastbee/report/api/ReportEngine.java b/fastbee-report/src/main/java/com/fastbee/report/api/ReportEngine.java deleted file mode 100644 index 71e431f4..00000000 --- a/fastbee-report/src/main/java/com/fastbee/report/api/ReportEngine.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fastbee.report.api; - -/** - * 报告引擎入口 - * - * @author FastBee - * @date 2026-08-16 - */ -public interface ReportEngine { - - /** - * 生成报告(V1 同步生成,返回报告编号 / 文件地址 / 过期时间) - */ - ReportResult generate(ReportRequest request); -} diff --git a/fastbee-report/src/main/java/com/fastbee/report/api/ReportRequest.java b/fastbee-report/src/main/java/com/fastbee/report/api/ReportRequest.java index b3596115..47eaca6f 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/api/ReportRequest.java +++ b/fastbee-report/src/main/java/com/fastbee/report/api/ReportRequest.java @@ -35,9 +35,9 @@ public class ReportRequest implements Serializable { @ApiModelProperty("周期锚点日期 yyyy-MM-dd(默认今天,仅周期预设时使用)") private String anchorDate; - @ApiModelProperty("模板编码,如 DEVICE_CRACK_METER_V1") + @ApiModelProperty("模板编码,如 DEVICE_CRACK_METER_V2") private String templateCode; - @ApiModelProperty("导出格式(V1 仅支持 WORD)") + @ApiModelProperty("导出格式(目前仅支持 WORD)") private String format; } diff --git a/fastbee-report/src/main/java/com/fastbee/report/chart/ChartGenerator.java b/fastbee-report/src/main/java/com/fastbee/report/chart/ChartGenerator.java index 1f242ab6..615844a0 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/chart/ChartGenerator.java +++ b/fastbee-report/src/main/java/com/fastbee/report/chart/ChartGenerator.java @@ -18,6 +18,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Comparator; import java.util.List; +import java.util.Map; /** * Java 图表生成器(JFreeChart → PNG,禁止前端生成图表回传后端) @@ -77,4 +78,58 @@ public class ChartGenerator { } return out.toByteArray(); } + + /** + * 生成多曲线时程图 PNG(同名单位的多指标合并展示) + * + * @param title 图表标题 + * @param unit 纵轴单位 + * @param seriesMap 曲线名 → 时序数据(保持插入顺序) + */ + public byte[] multiSeriesChart(String title, String unit, Map> seriesMap) { + TimeSeriesCollection dataset = new TimeSeriesCollection(); + if (seriesMap != null) { + for (Map.Entry> entry : seriesMap.entrySet()) { + TimeSeries series = new TimeSeries(entry.getKey()); + if (entry.getValue() != null) { + entry.getValue().stream() + .filter(d -> d.getTime() != null && d.getNumericValue() != null) + .sorted(Comparator.comparing(MetricData::getTime)) + .forEach(d -> series.add(new Millisecond(d.getTime()), d.getNumericValue().doubleValue())); + } + dataset.addSeries(series); + } + } + + JFreeChart chart = ChartFactory.createTimeSeriesChart( + title, "时间", unit == null ? "数值" : unit, dataset, + true, true, false); + chart.setBackgroundPaint(Color.WHITE); + chart.getTitle().setFont(CN_TITLE_FONT); + + XYPlot plot = chart.getXYPlot(); + plot.setBackgroundPaint(Color.WHITE); + plot.setDomainGridlinePaint(Color.LIGHT_GRAY); + plot.setRangeGridlinePaint(Color.LIGHT_GRAY); + plot.getDomainAxis().setLabelFont(CN_FONT); + plot.getDomainAxis().setTickLabelFont(new Font("SansSerif", Font.PLAIN, 11)); + plot.getRangeAxis().setLabelFont(CN_FONT); + plot.getRangeAxis().setTickLabelFont(new Font("SansSerif", Font.PLAIN, 11)); + chart.getLegend().setItemFont(CN_FONT); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + ChartUtils.writeChartAsPNG(out, chart, 900, 360); + } catch (IOException e) { + throw new IllegalStateException("图表生成失败", e); + } + return out.toByteArray(); + } + + /** + * 生成空白占位图(无数据时保持图文排版稳定) + */ + public byte[] blankChart(String title) { + return multiSeriesChart(title, null, new java.util.LinkedHashMap<>()); + } } diff --git a/fastbee-report/src/main/java/com/fastbee/report/chart/MetricChartBuilder.java b/fastbee-report/src/main/java/com/fastbee/report/chart/MetricChartBuilder.java new file mode 100644 index 00000000..eb6f4456 --- /dev/null +++ b/fastbee-report/src/main/java/com/fastbee/report/chart/MetricChartBuilder.java @@ -0,0 +1,108 @@ +package com.fastbee.report.chart; + +import com.fastbee.report.data.MetricData; +import com.fastbee.report.model.Statistics; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 监测指标图表构建器(主指标单图 + 其余指标按单位分组多曲线图) + * + *

约定 charts 的 key:

+ *
    + *
  • {@code timeSeriesChart}:主监测指标时程曲线(与模板兼容)
  • + *
  • {@code chart2} / {@code chart3}:其余指标按单位分组的时程曲线(最多 2 组)
  • + *
+ * + * @author FastBee + * @date 2026-09-10 + */ +@Component +public class MetricChartBuilder { + + /** 附图最大数量(模板预留 chart2 / chart3 两个位置) */ + private static final int MAX_EXTRA_CHARTS = 2; + + @Resource + private ChartGenerator chartGenerator; + + /** + * 构建图表集合 + * + * @param statisticsMap 全部指标统计 + * @param primaryIdentity 主指标标识符 + * @param byIdentity 指标 → 时序数据 + * @return key 为 timeSeriesChart / chart2 / chart3 的 PNG 映射 + */ + public Map build(Map statisticsMap, + String primaryIdentity, + Map> byIdentity) { + Map charts = new LinkedHashMap<>(); + if (statisticsMap == null || statisticsMap.isEmpty()) { + return charts; + } + + // 1. 主监测指标:单独一张图 + Statistics primary = statisticsMap.get(primaryIdentity); + if (primary == null) { + primary = statisticsMap.values().iterator().next(); + primaryIdentity = primary.getIdentifier(); + } + String primaryUnit = primary.getUnit() == null ? "" : primary.getUnit(); + String primaryName = primary.getModelName() == null ? primaryIdentity : primary.getModelName(); + charts.put("timeSeriesChart", chartGenerator.timeSeriesChart( + primaryName + "时程曲线", primaryName, primaryUnit, + byIdentity.getOrDefault(primaryIdentity, new ArrayList<>()))); + + // 2. 其余指标:按单位分组,同单位合并为一张多曲线图 + Map>> groupedByUnit = new LinkedHashMap<>(); + for (Map.Entry entry : statisticsMap.entrySet()) { + String identity = entry.getKey(); + if (identity.equals(primaryIdentity)) { + continue; + } + Statistics statistics = entry.getValue(); + // 无数据的指标不生成图表 + if (statistics == null || statistics.getCount() == 0) { + continue; + } + String unit = statistics.getUnit() == null ? "" : statistics.getUnit(); + String name = statistics.getModelName() == null ? identity : statistics.getModelName(); + groupedByUnit.computeIfAbsent(unit, k -> new LinkedHashMap<>()) + .put(name, byIdentity.getOrDefault(identity, new ArrayList<>())); + } + + int index = 2; + for (Map.Entry>> entry : groupedByUnit.entrySet()) { + if (index > MAX_EXTRA_CHARTS + 1) { + break; + } + String unit = entry.getKey(); + String title = entry.getValue().keySet().iterator().next() + "等指标时程曲线"; + if (entry.getValue().size() == 1) { + title = entry.getValue().keySet().iterator().next() + "时程曲线"; + } + charts.put("chart" + index, + chartGenerator.multiSeriesChart(title, unit, entry.getValue())); + index++; + } + return charts; + } + + /** + * 补齐模板预留的图表位,避免模板标签无对应数据导致渲染异常 + */ + public Map fillPlaceholders(Map charts) { + Map result = new LinkedHashMap<>(charts); + for (int i = 2; i <= MAX_EXTRA_CHARTS + 1; i++) { + String key = "chart" + i; + result.putIfAbsent(key, chartGenerator.blankChart("暂无数据")); + } + return result; + } +} diff --git a/fastbee-report/src/main/java/com/fastbee/report/core/ReportAssembler.java b/fastbee-report/src/main/java/com/fastbee/report/core/ReportAssembler.java index 988b6b00..c513eebe 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/core/ReportAssembler.java +++ b/fastbee-report/src/main/java/com/fastbee/report/core/ReportAssembler.java @@ -8,6 +8,8 @@ import com.fastbee.report.model.ReportModel; import com.fastbee.report.model.Statistics; import org.springframework.stereotype.Component; +import java.util.UUID; + /** * 报告模型装配器:AnalysisResult + 上下文 → ReportModel * @@ -18,18 +20,29 @@ import org.springframework.stereotype.Component; public class ReportAssembler { public ReportModel assemble(ReportContext context, AnalysisResult analysis) { - String templateCode = StringUtils.isNotEmpty(context.getRequest().getTemplateCode()) - ? context.getRequest().getTemplateCode() - : "DEVICE_" + context.getCategory().name() + "_V1"; + // 默认使用专业模版,如未配置 templateCode 则根据监测分类自动选择 + String templateCode = "DEVICE_" + context.getCategory().name() + "_V2"; ReportPeriod period = context.getTimeWindow().getPeriod(); String serialNumber = context.getDevice().getSerialNumber(); if (StringUtils.isEmpty(serialNumber)) { serialNumber = String.valueOf(context.getDevice().getDeviceId()); } - String fileName = serialNumber + "-" + period.getDesc() + "-监测分析报告.docx"; + // 末尾追加随机后缀,避免同一设备同一周期重复导出时文件名相同 + String randomSuffix = UUID.randomUUID().toString().replace("-", "").substring(0, 6); + String fileName = context.getCategory().getDesc() + "-监测分析报告-" + randomSuffix + ".docx"; - Statistics primary = analysis.getStatistics().values().stream().findFirst().orElse(null); + // 主监测指标:优先使用 Analyzer 解析的 primaryIdentifier(与概况/结论/统计指标口径一致) + Statistics primary = null; + if (StringUtils.isNotEmpty(analysis.getPrimaryIdentifier())) { + primary = analysis.getStatistics().get(analysis.getPrimaryIdentifier()); + } + if (primary == null) { + primary = analysis.getStatistics().values().stream().findFirst().orElse(null); + } + + // 添加监测分类描述 + String categoryDesc = context.getCategory().getDesc() + "监测分析报告"; return ReportModel.builder() .reportNo(context.getReportNo()) @@ -43,6 +56,7 @@ public class ReportAssembler { .productName(context.getProduct().getProductName()) .deviceId(context.getDevice().getDeviceId()) .category(context.getCategory()) + .categoryDesc(categoryDesc) // 添加分类描述 .metricName(primary == null ? null : primary.getModelName()) .metricUnit(primary == null ? null : primary.getUnit()) .analysis(analysis) diff --git a/fastbee-report/src/main/java/com/fastbee/report/core/ReportContext.java b/fastbee-report/src/main/java/com/fastbee/report/core/ReportContext.java index b19ca45e..c2b4974e 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/core/ReportContext.java +++ b/fastbee-report/src/main/java/com/fastbee/report/core/ReportContext.java @@ -42,4 +42,10 @@ public class ReportContext { private Map thresholds; private String reportNo; + + /** 创建人用户名(从主线程传递,避免异步线程无法访问 SecurityContext) */ + private String createBy; + + /** 租户ID(从主线程传递) */ + private Long tenantId; } diff --git a/fastbee-report/src/main/java/com/fastbee/report/core/ReportContextBuilder.java b/fastbee-report/src/main/java/com/fastbee/report/core/ReportContextBuilder.java index a375c86c..1dfd5176 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/core/ReportContextBuilder.java +++ b/fastbee-report/src/main/java/com/fastbee/report/core/ReportContextBuilder.java @@ -4,6 +4,8 @@ import com.fastbee.common.enums.MonitorCategory; import com.fastbee.iot.domain.Device; import com.fastbee.iot.domain.Product; import com.fastbee.iot.domain.ThingsModel; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.core.domain.model.LoginUser; import com.fastbee.iot.mapper.SubGatewayMapper; import com.fastbee.iot.service.IDeviceService; import com.fastbee.iot.service.IProductService; @@ -62,14 +64,14 @@ public class ReportContextBuilder { throw new ReportException("设备不存在: " + request.getDeviceId()); } - // 网关设备特殊处理:使用第一个有监测分类的子设备构建上下文 + // 网关设备不允许直接生成报表:网关是通信中继,真正的监测设备是子设备 Integer deviceType = device.getDeviceType(); if (deviceType != null && deviceType == DEVICE_TYPE_GATEWAY) { - Device subDevice = resolveFirstMonitorSubDevice(request.getDeviceId()); - if (subDevice == null) { - throw new ReportException("网关设备下无可用监测子设备,请选择具体监测设备"); - } - device = subDevice; + List subDeviceIds = subGatewayMapper.selectSubDeviceIdsByGwDeviceId(request.getDeviceId()); + String tip = (subDeviceIds == null || subDeviceIds.isEmpty()) + ? "该网关下未绑定子设备" + : "请选择具体监测设备(网关下有 " + subDeviceIds.size() + " 个子设备)"; + throw new ReportException("网关设备不能直接生成报告。" + tip); } if (device.getProductId() == null) { @@ -110,6 +112,24 @@ public class ReportContextBuilder { context.setMetricDataList(metricDataList); context.setThresholds(thresholds); context.setReportNo(reportNo); + + // 从主线程获取用户信息,传递到异步线程 + String username = null; + Long tenantId = null; + try { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null) { + username = loginUser.getUsername(); + if (loginUser.getUser() != null && loginUser.getUser().getDept() != null) { + tenantId = loginUser.getUser().getDept().getDeptUserId(); + } + } + } catch (Exception ignored) { + // 非登录态(如后台任务)时保持为 null + } + context.setCreateBy(username); + context.setTenantId(tenantId); + return context; } diff --git a/fastbee-report/src/main/java/com/fastbee/report/core/DefaultReportEngine.java b/fastbee-report/src/main/java/com/fastbee/report/executor/ReportAsyncExecutor.java similarity index 74% rename from fastbee-report/src/main/java/com/fastbee/report/core/DefaultReportEngine.java rename to fastbee-report/src/main/java/com/fastbee/report/executor/ReportAsyncExecutor.java index 6acc9b06..a51c6f81 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/core/DefaultReportEngine.java +++ b/fastbee-report/src/main/java/com/fastbee/report/executor/ReportAsyncExecutor.java @@ -1,4 +1,4 @@ -package com.fastbee.report.core; +package com.fastbee.report.executor; import com.fastbee.common.core.redis.RedisCache; import com.fastbee.common.enums.MonitorCategory; @@ -7,10 +7,11 @@ import com.fastbee.oss.entity.UploadResult; import com.fastbee.oss.service.OssFactory; import com.fastbee.report.analyzer.ReportAnalyzer; import com.fastbee.report.analyzer.ReportAnalyzerFactory; -import com.fastbee.report.api.ReportEngine; import com.fastbee.report.api.ReportRequest; -import com.fastbee.report.api.ReportResult; import com.fastbee.report.category.MonitorCategoryResolver; +import com.fastbee.report.core.ReportAssembler; +import com.fastbee.report.core.ReportContext; +import com.fastbee.report.core.ReportContextBuilder; import com.fastbee.report.exception.ReportException; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.ReportModel; @@ -20,6 +21,7 @@ import com.fastbee.report.record.ReportRecord; import com.fastbee.report.record.ReportRecordService; import com.fastbee.report.renderer.ReportRenderer; import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -31,14 +33,14 @@ import java.util.Date; import java.util.concurrent.ThreadLocalRandom; /** - * 默认报告引擎:周期/分类解析 → 上下文装配 → 分析 → 渲染 → MinIO 上传 → 落库 + * 报告异步执行器 * * @author FastBee - * @date 2026-08-16 + * @date 2026-09-10 */ @Slf4j @Component -public class DefaultReportEngine implements ReportEngine { +public class ReportAsyncExecutor { private static final String WORD_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; @@ -70,8 +72,16 @@ public class DefaultReportEngine implements ReportEngine { @Resource private RedisCache redisCache; - @Override - public ReportResult generate(ReportRequest request) { + @Resource + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + + /** + * 异步生成报告 + * + * @param request 报告请求 + * @return 报告编号(立即返回) + */ + public String submitAsyncTask(ReportRequest request) { validate(request); TimeWindow window = periodResolver.resolve(request); MonitorCategory category = categoryResolver.resolveByDeviceId(request.getDeviceId()); @@ -81,36 +91,44 @@ public class DefaultReportEngine implements ReportEngine { String reportNo = generateReportNo(); ReportContext context = contextBuilder.build(request, window, category, reportNo); + + // 创建 CREATING 状态记录 ReportRecord record = reportRecordService.createCreating(context); + + // 提交异步任务到线程池 + final ReportContext finalContext = context; + final ReportRequest finalRequest = request; + threadPoolTaskExecutor.execute(() -> asyncGenerate(finalRequest, finalContext, record)); + + return reportNo; + } + + /** + * 异步执行生成逻辑 + */ + private void asyncGenerate(ReportRequest request, ReportContext context, ReportRecord record) { try { - ReportAnalyzer analyzer = analyzerFactory.get(category); + String reportNo = context.getReportNo(); + log.info("开始异步生成报告 reportNo={} deviceId={}", reportNo, request.getDeviceId()); + + ReportAnalyzer analyzer = analyzerFactory.get(context.getCategory()); AnalysisResult analysis = analyzer.analyze(context, request); ReportModel model = reportAssembler.assemble(context, analysis); byte[] docBytes = reportRenderer.render(model); - String path = buildObjectPath(window, request.getDeviceId(), reportNo); + String path = buildObjectPath(request.getDeviceId(), reportNo); UploadResult upload = OssFactory.instance(redisCache) .upload(docBytes, path, WORD_CONTENT_TYPE); Date expireTime = new Date(System.currentTimeMillis() + RETENTION_DAYS * 24L * 3600 * 1000); + reportRecordService.markSuccess(record, model.getFileName(), upload.getUrl(), expireTime); log.info("报告生成成功 reportNo={} fileUrl={}", reportNo, upload.getUrl()); - return ReportResult.builder() - .reportNo(reportNo) - .status(ReportRecord.STATUS_SUCCESS) - .fileName(model.getFileName()) - .fileUrl(upload.getUrl()) - .expireTime(expireTime) - .build(); } catch (Exception e) { - log.error("报告生成失败 reportNo={} deviceId={}", reportNo, request.getDeviceId(), e); + log.error("报告生成失败 reportNo={} deviceId={}", context.getReportNo(), request.getDeviceId(), e); String message = e instanceof ReportException ? e.getMessage() : (e.getMessage() == null ? e.getClass().getSimpleName() : e.getMessage()); reportRecordService.markFailed(record, message); - if (e instanceof ReportException) { - throw (ReportException) e; - } - throw new ReportException("报告生成失败: " + message, e); } } @@ -123,7 +141,7 @@ public class DefaultReportEngine implements ReportEngine { } if (StringUtils.isNotEmpty(request.getFormat()) && !"WORD".equalsIgnoreCase(request.getFormat())) { - throw new ReportException("V1 仅支持 WORD 格式导出"); + throw new ReportException("目前仅支持 WORD 格式导出"); } } @@ -132,8 +150,8 @@ public class DefaultReportEngine implements ReportEngine { + "-" + String.format("%04d", ThreadLocalRandom.current().nextInt(10000)); } - private String buildObjectPath(TimeWindow window, Long deviceId, String reportNo) { + private String buildObjectPath(Long deviceId, String reportNo) { LocalDate today = LocalDate.now(ZoneOffset.ofHours(8)); return "report/" + today.format(PATH_DATE) + "/device/" + deviceId + "/" + reportNo + ".docx"; } -} +} \ No newline at end of file diff --git a/fastbee-report/src/main/java/com/fastbee/report/model/AnalysisResult.java b/fastbee-report/src/main/java/com/fastbee/report/model/AnalysisResult.java index 74423ef1..2d524335 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/model/AnalysisResult.java +++ b/fastbee-report/src/main/java/com/fastbee/report/model/AnalysisResult.java @@ -2,6 +2,7 @@ package com.fastbee.report.model; import lombok.Data; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -16,6 +17,30 @@ import java.util.Map; @Data public class AnalysisResult { + /** 主监测指标标识符(统一由 Analyzer 解析,ReportAssembler/WordRenderer 共用) */ + private String primaryIdentifier; + + /** 项目概况总结(开头段落,概括关键数据) */ + private String summary; + + /** 专业分析建议(基于设备类型和数据分析的工程建议) */ + private String professionalAdvice; + + /** 安全评估等级(SAFE/WARNING/DANGER/CRITICAL) */ + private String safetyLevel; + + /** 安全评估说明 */ + private String safetyDescription; + + /** 控制值(安全参考基准) */ + private BigDecimal controlValue; + + /** 控制值单位 */ + private String controlValueUnit; + + /** 多指标对比数据(用于详细表格展示) */ + private List metricPoints = new ArrayList<>(); + /** 每个物模型标识符对应的统计指标 */ private Map statistics = new LinkedHashMap<>(); diff --git a/fastbee-report/src/main/java/com/fastbee/report/model/MetricPointData.java b/fastbee-report/src/main/java/com/fastbee/report/model/MetricPointData.java new file mode 100644 index 00000000..0153547f --- /dev/null +++ b/fastbee-report/src/main/java/com/fastbee/report/model/MetricPointData.java @@ -0,0 +1,72 @@ +package com.fastbee.report.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 测点数据(用于详细表格展示,支持多测点设备) + * + * @author FastBee + * @date 2026-09-09 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MetricPointData { + + /** 测点编号(如 MS13-1) */ + private String pointNo; + + /** 测点名称(如 红线/白线/绿线) */ + private String pointName; + + /** 物模型标识符 */ + private String identifier; + + /** 物模型名称 */ + private String modelName; + + /** 初始值 */ + private BigDecimal initialValue; + + /** 初始值单位 */ + private String initialUnit; + + /** 当前值 */ + private BigDecimal currentValue; + + /** 当前值单位 */ + private String currentUnit; + + /** 变化量 */ + private BigDecimal changeValue; + + /** 变化量单位 */ + private String changeUnit; + + /** 变化速率 */ + private BigDecimal changeRate; + + /** 变化速率单位 */ + private String rateUnit; + + /** 最大值 */ + private BigDecimal maxValue; + + /** 最小值 */ + private BigDecimal minValue; + + /** 平均值 */ + private BigDecimal avgValue; + + /** 预警状态(NORMAL/WARNING/ALARM) */ + private String warningStatus; + + /** 备注 */ + private String remark; +} \ No newline at end of file diff --git a/fastbee-report/src/main/java/com/fastbee/report/model/ReportModel.java b/fastbee-report/src/main/java/com/fastbee/report/model/ReportModel.java index a96d6f17..4189d497 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/model/ReportModel.java +++ b/fastbee-report/src/main/java/com/fastbee/report/model/ReportModel.java @@ -5,6 +5,7 @@ import com.fastbee.common.enums.ReportPeriod; import lombok.Builder; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -49,5 +50,14 @@ public class ReportModel { /** 主监测指标单位 */ private String metricUnit; + /** 监测分类描述(如"裂缝计监测分析报告") */ + private String categoryDesc; + + /** 控制值(安全参考基准) */ + private BigDecimal controlValue; + + /** 控制值单位 */ + private String controlValueUnit; + private AnalysisResult analysis; } diff --git a/fastbee-report/src/main/java/com/fastbee/report/record/ReportRecordServiceImpl.java b/fastbee-report/src/main/java/com/fastbee/report/record/ReportRecordServiceImpl.java index c0f6da40..6530ebff 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/record/ReportRecordServiceImpl.java +++ b/fastbee-report/src/main/java/com/fastbee/report/record/ReportRecordServiceImpl.java @@ -1,8 +1,6 @@ package com.fastbee.report.record; -import com.fastbee.common.core.domain.model.LoginUser; import com.fastbee.common.utils.DateUtils; -import com.fastbee.common.utils.SecurityUtils; import com.fastbee.report.core.ReportContext; import com.fastbee.report.mapper.ReportRecordMapper; import org.springframework.stereotype.Service; @@ -38,8 +36,8 @@ public class ReportRecordServiceImpl implements ReportRecordService { record.setStartTime(toGmt8Date(context.getTimeWindow().getStartTime())); record.setEndTime(toGmt8Date(context.getTimeWindow().getEndTime())); record.setStatus(ReportRecord.STATUS_CREATING); - record.setTenantId(currentTenantId()); - record.setCreateBy(SecurityUtils.getUsername()); + record.setTenantId(context.getTenantId()); + record.setCreateBy(context.getCreateBy()); record.setCreateTime(now); record.setExpireTime(new Date(now.getTime() + RETENTION_DAYS * 24L * 3600 * 1000)); reportRecordMapper.insert(record); @@ -58,7 +56,8 @@ public class ReportRecordServiceImpl implements ReportRecordService { update.setFileName(fileName); update.setFileUrl(fileUrl); update.setExpireTime(expireTime); - update.setUpdateBy(SecurityUtils.getUsername()); + // 异步线程中无法访问 SecurityContext,使用创建时的用户名 + update.setUpdateBy(record.getCreateBy()); update.setUpdateTime(DateUtils.getNowDate()); reportRecordMapper.updateById(update); } @@ -69,7 +68,8 @@ public class ReportRecordServiceImpl implements ReportRecordService { update.setId(record.getId()); update.setStatus(ReportRecord.STATUS_FAILED); update.setErrorMessage(errorMessage); - update.setUpdateBy(SecurityUtils.getUsername()); + // 异步线程中无法访问 SecurityContext,使用创建时的用户名 + update.setUpdateBy(record.getCreateBy()); update.setUpdateTime(DateUtils.getNowDate()); reportRecordMapper.updateById(update); } @@ -86,17 +86,4 @@ public class ReportRecordServiceImpl implements ReportRecordService { .eq(ReportRecord::getReportNo, reportNo) .last("limit 1")); } - - private Long currentTenantId() { - try { - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser != null && loginUser.getUser() != null - && loginUser.getUser().getDept() != null) { - return loginUser.getUser().getDept().getDeptUserId(); - } - } catch (Exception ignored) { - // 非登录态(如后台任务)时租户为空 - } - return null; - } } diff --git a/fastbee-report/src/main/java/com/fastbee/report/renderer/WordRenderer.java b/fastbee-report/src/main/java/com/fastbee/report/renderer/WordRenderer.java index c9cab01e..d7469d28 100644 --- a/fastbee-report/src/main/java/com/fastbee/report/renderer/WordRenderer.java +++ b/fastbee-report/src/main/java/com/fastbee/report/renderer/WordRenderer.java @@ -6,14 +6,20 @@ import com.deepoove.poi.data.ByteArrayPictureRenderData; import com.deepoove.poi.data.PictureType; import com.deepoove.poi.data.style.PictureStyle; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; +import com.fastbee.common.utils.StringUtils; import com.fastbee.report.exception.ReportException; import com.fastbee.report.model.AnalysisResult; import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; import com.fastbee.report.model.QualityAnalysis; import com.fastbee.report.model.ReportModel; import com.fastbee.report.model.Statistics; import com.fastbee.report.model.TrendAnalysis; import com.fastbee.report.model.WarningAnalysis; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFTable; +import org.apache.poi.xwpf.usermodel.XWPFTableCell; +import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -21,6 +27,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; @@ -45,12 +52,14 @@ public class WordRenderer implements ReportRenderer { Map data = buildData(model); Configure config = Configure.builder() .bind("conclusions", new LoopRowTableRenderPolicy()) + .bind("metricPoints", new LoopRowTableRenderPolicy()) // 添加多测点数据绑定 .build(); XWPFTemplate tpl = XWPFTemplate.compile(new ByteArrayInputStream(template), config).render(data); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); tpl.write(out); - return out.toByteArray(); + // 后处理:清除循环表格残留的空行,避免排版出现空白行 + return cleanupEmptyTableRows(out.toByteArray()); } catch (IOException e) { throw new ReportException("Word 渲染失败: " + e.getMessage(), e); } finally { @@ -62,10 +71,45 @@ public class WordRenderer implements ReportRenderer { } } + /** + * 清除表格中的空白行(poi-tl 循环表格的标记行渲染后会残留为空行) + */ + private byte[] cleanupEmptyTableRows(byte[] docx) { + try (XWPFDocument document = new XWPFDocument(new ByteArrayInputStream(docx))) { + for (XWPFTable table : document.getTables()) { + List rows = table.getRows(); + for (int i = rows.size() - 1; i >= 0; i--) { + if (isRowBlank(rows.get(i))) { + table.removeRow(i); + } + } + } + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + document.write(buffer); + return buffer.toByteArray(); + } catch (Exception e) { + // 后处理失败时返回原始文档,不影响报告生成 + return docx; + } + } + + /** + * 判断表格行是否完全空白 + */ + private boolean isRowBlank(XWPFTableRow row) { + for (XWPFTableCell cell : row.getTableCells()) { + if (cell.getText() != null && !cell.getText().trim().isEmpty()) { + return false; + } + } + return true; + } + private Map buildData(ReportModel model) { Map data = new HashMap<>(); AnalysisResult analysis = model.getAnalysis() == null ? new AnalysisResult() : model.getAnalysis(); - Statistics primary = analysis.getStatistics().values().stream().findFirst().orElse(null); + // 主监测指标:与概况/结论口径一致(Analyzer 解析的 primaryIdentifier) + Statistics primary = resolvePrimary(analysis); TrendAnalysis trend = primary == null ? null : analysis.getTrends().get(primary.getIdentifier()); QualityAnalysis quality = primary == null ? null : analysis.getQualities().get(primary.getIdentifier()); WarningAnalysis warning = primary == null ? null : analysis.getWarnings().get(primary.getIdentifier()); @@ -95,6 +139,15 @@ public class WordRenderer implements ReportRenderer { statistics.put("totalDelta", str(primary.getTotalDelta())); statistics.put("count", primary.getCount()); statistics.put("unit", primary.getUnit() == null ? "" : primary.getUnit()); + // 带单位的展示值(单位为空时不产生多余空格) + statistics.put("currentWithUnit", withUnit(str(primary.getCurrent()), primary.getUnit())); + statistics.put("initialWithUnit", withUnit(str(primary.getInitial()), primary.getUnit())); + statistics.put("maxWithUnit", withUnit(str(primary.getMax()), primary.getUnit())); + statistics.put("minWithUnit", withUnit(str(primary.getMin()), primary.getUnit())); + statistics.put("avgWithUnit", withUnit(str(primary.getAvg()), primary.getUnit())); + statistics.put("medianWithUnit", withUnit(str(primary.getMedian()), primary.getUnit())); + statistics.put("deltaWithUnit", withUnit(str(primary.getDelta()), primary.getUnit())); + statistics.put("totalDeltaWithUnit", withUnit(str(primary.getTotalDelta()), primary.getUnit())); } else { statistics.put("count", 0); statistics.put("unit", ""); @@ -108,7 +161,7 @@ public class WordRenderer implements ReportRenderer { qualityMap.put("description", quality == null ? "统计期内无有效数据" : quality.getDescription()); Map warningMap = new HashMap<>(); - warningMap.put("status", warning == null ? WarningAnalysis.STATUS_NORMAL : warning.getStatus()); + warningMap.put("status", warning == null ? "正常" : warningStatusText(warning.getStatus())); warningMap.put("description", warning == null ? "统计期内无有效数据" : warning.getDescription()); Map analysisMap = new HashMap<>(); @@ -117,26 +170,68 @@ public class WordRenderer implements ReportRenderer { analysisMap.put("quality", qualityMap); analysisMap.put("warning", warningMap); - Map charts = new HashMap<>(); - // 支持通用图表键名(所有分类使用统一的 timeSeriesChart) - byte[] timeSeriesChart = analysis.getCharts().get("timeSeriesChart"); - if (timeSeriesChart != null) { - ByteArrayPictureRenderData picture = new ByteArrayPictureRenderData(timeSeriesChart, PictureType.PNG); - PictureStyle style = new PictureStyle(); - style.setWidth(640); - style.setHeight(280); - picture.setPictureStyle(style); - charts.put("timeSeriesChart", picture); + // 添加项目概况总结(始终 put,空值兜底) + data.put("summary", StringUtils.isNotEmpty(analysis.getSummary()) + ? analysis.getSummary() : "统计期内无有效监测数据。"); + + // 添加专业分析建议(始终 put,空值兜底) + data.put("professionalAdvice", StringUtils.isNotEmpty(analysis.getProfessionalAdvice()) + ? analysis.getProfessionalAdvice() : "暂无专业分析建议。"); + + // 添加安全评估(始终 put,空值兜底) + data.put("safetyLevel", safetyLevelText(StringUtils.isNotEmpty(analysis.getSafetyLevel()) + ? analysis.getSafetyLevel() : "待评估")); + data.put("safetyDescription", StringUtils.isNotEmpty(analysis.getSafetyDescription()) + ? analysis.getSafetyDescription() : "暂无评估说明。"); + + // 添加控制值(始终 put,空值兜底) + data.put("controlValue", analysis.getControlValue() != null + ? analysis.getControlValue().toPlainString() : "未配置"); + data.put("controlValueUnit", analysis.getControlValueUnit() != null + ? analysis.getControlValueUnit() : ""); + + // 添加多测点数据(始终 put,空列表兜底) + List> metricPointsList = new ArrayList<>(); + if (analysis.getMetricPoints() != null && !analysis.getMetricPoints().isEmpty()) { + for (MetricPointData point : analysis.getMetricPoints()) { + Map pointMap = new HashMap<>(); + pointMap.put("pointNo", point.getPointNo() == null ? "" : point.getPointNo()); + pointMap.put("pointName", point.getPointName() == null ? "" : point.getPointName()); + pointMap.put("identifier", point.getIdentifier()); + pointMap.put("modelName", point.getModelName()); + pointMap.put("initialValue", str(point.getInitialValue())); + pointMap.put("initialUnit", point.getInitialUnit() == null ? "" : point.getInitialUnit()); + pointMap.put("currentValue", str(point.getCurrentValue())); + pointMap.put("currentUnit", point.getCurrentUnit() == null ? "" : point.getCurrentUnit()); + pointMap.put("changeValue", str(point.getChangeValue())); + pointMap.put("changeUnit", point.getChangeUnit() == null ? "" : point.getChangeUnit()); + pointMap.put("changeRate", str(point.getChangeRate())); + pointMap.put("rateUnit", point.getRateUnit() == null ? "" : point.getRateUnit()); + pointMap.put("maxValue", str(point.getMaxValue())); + pointMap.put("minValue", str(point.getMinValue())); + pointMap.put("avgValue", str(point.getAvgValue())); + // 无数据的指标标注"无数据",避免误报为正常 + pointMap.put("warningStatus", point.getCurrentValue() == null + ? "无数据" : warningStatusText(point.getWarningStatus())); + metricPointsList.add(pointMap); + } } - // 兼容旧版裂缝计模板 - byte[] crackTrend = analysis.getCharts().get("crackTrend"); - if (crackTrend != null) { - ByteArrayPictureRenderData picture = new ByteArrayPictureRenderData(crackTrend, PictureType.PNG); + data.put("metricPoints", metricPointsList); + + // 图表:兼容 timeSeriesChart(主指标)/ chart2 / chart3(分组指标)/ crackTrend(旧模板) + Map charts = new HashMap<>(); + for (Map.Entry entry : analysis.getCharts().entrySet()) { + byte[] png = entry.getValue(); + if (png == null || png.length == 0) { + continue; + } + ByteArrayPictureRenderData picture = new ByteArrayPictureRenderData(png, PictureType.PNG); PictureStyle style = new PictureStyle(); - style.setWidth(640); - style.setHeight(280); + // 适配 A4 页面可用宽度(约 15.9cm ≈ 600px) + style.setWidth(600); + style.setHeight(240); picture.setPictureStyle(style); - charts.put("crackTrend", picture); + charts.put(entry.getKey(), picture); } List> conclusions = new ArrayList<>(); @@ -155,7 +250,63 @@ public class WordRenderer implements ReportRenderer { return data; } + /** + * 解析主监测指标统计:优先 primaryIdentifier,兜底第一个 + */ + private Statistics resolvePrimary(AnalysisResult analysis) { + if (StringUtils.isNotEmpty(analysis.getPrimaryIdentifier())) { + Statistics statistics = analysis.getStatistics().get(analysis.getPrimaryIdentifier()); + if (statistics != null) { + return statistics; + } + } + return analysis.getStatistics().values().stream().findFirst().orElse(null); + } + + /** + * 拼接数值与单位(单位为空时只返回数值,避免尾部空格) + */ + private String withUnit(String value, String unit) { + return (unit == null || unit.trim().isEmpty()) ? value : value + " " + unit.trim(); + } + + /** + * 数值格式化:最多保留 6 位小数并去除末尾多余的 0 + * 例:-499.9277470 → -499.927747;3.9844728 → 3.984473;0.000000 → 0 + */ private String str(BigDecimal value) { - return value == null ? "-" : value.toPlainString(); + if (value == null) { + return "-"; + } + BigDecimal formatted = value.setScale(6, RoundingMode.HALF_UP).stripTrailingZeros(); + if (formatted.compareTo(BigDecimal.ZERO) == 0) { + return "0"; + } + return formatted.toPlainString(); + } + + /** 预警状态转中文 */ + private String warningStatusText(String status) { + if (WarningAnalysis.STATUS_ALARM.equals(status)) { + return "报警"; + } + if (WarningAnalysis.STATUS_WARNING.equals(status)) { + return "预警"; + } + return "正常"; + } + + /** 安全等级转中文 */ + private String safetyLevelText(String level) { + if ("DANGER".equals(level)) { + return "危险"; + } + if ("WARNING".equals(level)) { + return "预警"; + } + if ("CRITICAL".equals(level)) { + return "临界"; + } + return "安全"; } } diff --git a/fastbee-report/src/main/resources/templates/DEVICE_AXIAL_FORCE_V1.docx b/fastbee-report/src/main/resources/templates/DEVICE_AXIAL_FORCE_V1.docx deleted file mode 100644 index b427742545d76ce7e92e37c45666dc5f7e813f01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10227 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 bm}1+bLrXI*a0ac6S71ZBC<1?3Q1|kJ|WA5 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 literal 0 HcmV?d00001 diff --git a/fastbee-report/src/main/resources/templates/DEVICE_DEEP_DISPLACEMENT_V1.docx b/fastbee-report/src/main/resources/templates/DEVICE_DEEP_DISPLACEMENT_V1.docx deleted file mode 100644 index 815eb6bbc2ad13e758f3c01d754167ac6ea7c33e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1957 zcmZ`)X*3(?8jgJ(%SaI=w$@TpQnafN-R?D@FN$38!cY5#rzH`3kyytw+d(Qj3=RA+KB?l)E008g;>TM+8 z?_AT2nXHP+1^|e$(8UxPg!TzSyW2+v`-H;PBLf3sty^K85Rus^{&xf(l8%oN@7WcA z4`=cgK>0AkY3J9NAjBM4nIu#OnT@3#OzsRjhqsw2?ZYZRUx$1>cWm{+m2%Yv=oFS+bmC$s@o*ca%>+sD}EtmpIre)FCIrvoS-F`w9B^W4ol? zvM03Z$pL_qN^-iwzCT=_)ox70F3cRSM>M|1jDu$6lon(ZtsKNSVbMN$zKaIZWBQ4< z;xPP#zK3^$ncf@!TM&Y4_=vZO30DYyUUlgOMf)vZ_?PdQYFJ2*k3EU&sP z-unA!3iy)3Doy~v7z6-_vPO$QqP#V{kzQeeto47}`xoZ{yVI9}w7u$${ZDqS$q*8x zW>mQJ%d?yh+6bW>uy<8J#SA>~3~0eS`@*PF%%i(EOekqX=#dUClRNxf30u9ussVgl z(Ij08;_Q_xd^lpbc2li&591y^GSwOq+NW)T#c4t-BTLkz2uW#N_|z)20cvS?Np|;| zNeYK04|k2VL5BHHD6P$QqALyN@zG3N*g{Brb+Ee=^x?~WD=!EZ+E(0k{js#As6V@U zvvw7OmmYXi&J)U>o%~UTu;Z`Pc6;2XW! zO9u-E^8u~8`yoDY5lt;e)E3C`on5reuFeO*iKMNvYsn9=rJPz3f$Jc)?#@fs1c!}*u%tzY`?ZTH13KHeJlm&< zHluwez~GX&j$7^ZWu@8h5b-Q2j!B$nv9KKXAi>f3(7Z)zW)8EG(n2Lrl<=UH!5wSE zbhNe#R@0wNjBDymYL0M(#Hl#O)b*pYr?`8nDs#+UIY|4p$j!ElYn&%EreD`V<$QMT zL$+4KMqfJ=twV`=wA6xmOW7f_JWt8^F{7&d3m1;`bbLvMflBzV9^2%0wCEmsNnaL*`e3?BIO^g1dwH+M%TCiAYLWjJ>MKCkubeg1@ zQbl&ebEt125J^<9&{6jNSsO^vI^W?zxGNJI1ujOq$dCA2mC>K<3Oo#}&v`sJh?55` zws@~E&|BWjVluqQ8EUt!XJUIcn0&C>x7)8%Y+`xsSB~*S$M+NS#WIRKpD+sUoO4l4 z>iqgU>2-=6uBo6%leG`{%@r+U4P*FaK7fE^RI;-@*iXk-+En}(=bH>&k4PP$K|$tH3NHg2Oee-oC{6gxW&ap7*yJJ6J1fWtsECxs|ZMDW)<$ zdS|q;dkUQONfl{->2{)wtz*lfvxi3k?Iv4yM3>AN;R&V3e*>_Unl?ksLS87JY#=MlT2_{tT`tIza`P;#BE+|r2}J=L)sK9fN9cdV>t*wVei(rs->4~rYZQuB>0Fg52U zez4u#Pj|v#hL5YG^c&uZ{3syhyyp@XoZ8sHoIKSZ_o(P_4qnxJhS%KmNRXu0tZkZh z_oR>rhGqtj zWWz8sK=~uH%lQnq`lgcdVg%ite{ys1QCFO`B^x`Co&6R<6qUE5NK?7 diff --git a/fastbee-report/src/main/resources/templates/DEVICE_DEEP_DISPLACEMENT_V2.docx b/fastbee-report/src/main/resources/templates/DEVICE_DEEP_DISPLACEMENT_V2.docx new file mode 100644 index 0000000000000000000000000000000000000000..cdda2a9c5080f45841e37f18ad541f97f02b0f1f GIT binary patch literal 38104 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 diff --git a/fastbee-report/src/main/resources/templates/DEVICE_RAIN_GAUGE_V2.docx b/fastbee-report/src/main/resources/templates/DEVICE_RAIN_GAUGE_V2.docx new file mode 100644 index 0000000000000000000000000000000000000000..55d8d314aaca4c35aa45316b96eeb75c9fa5908f GIT binary patch literal 38099 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 literal 0 HcmV?d00001 diff --git a/fastbee-report/src/main/resources/templates/DEVICE_RANGING_METER_V1.docx b/fastbee-report/src/main/resources/templates/DEVICE_RANGING_METER_V1.docx deleted file mode 100644 index ad6bc3a2dfe52b49b570a511d5fa53c4aaf2bcb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1959 zcmZ`)cTm&W8vO}~QWOMSiW*Q515zRoih_V3#79TK0HG`-p@^^|gx*8nC`iZ91f_05 z31C3lQiT;M(j_Qh1R|jdq2#e~-yiR-@4b6x?wN1qo^R$m-^@AYM(i9y005i>8ZCq! z1`sK_bXG+;1^|LAwAb_T_CtC5Iavk$f_mhj5ct3=%)G_46T(jk;vPsok** zKyk!v0#^>6!oL-SdV9=)uB4wXgHXcS_NTuM+hW@Fr5UDGD+Z8lS@(rr(@-y`iW42+ zmKZS5uouV`)NH(&XLVQv5=3dWp23j(@@uj}mrKB1;*k6g}OMuu1Tszu>-E z{LVUGD{$`S0ub_SiVCL~oyi{(a5J0h(x_bEFNSjac6{!jImwJ^6e;w_>ZK+6*`Gu> znq;T8u@5#i)*35`P2DIt%#+R+2THgBi1kmGipy|L~^i<}Qr`_bx< zf0ni(sPs0#{BQDH{VLyA%aTQwB@Yh^oqSPVj}#TYzqofTr+=5=Ke0YrDj{c_Io=_1 zcge-LDR&>>Af&@@vN47mvpRHfF$=TIwE%KM$fW43g!IA%NfT>94%1*19=)h}e&R;7 z#;QQE*+#XIs^p|VyV5n~NE4l>eq zTr~UpXz%UHAVdxTP!|P&Gpx}9e0-6LNFP`K2dwpf-}|cVTeEY9LT$Um>d=jHM?L<_ zV9b8hw4<1{=Lo0*)KljgGCiC3_74%gOHz{1PxhRt*a{u@3YEft@K0MxaOP^i%&*tj zQ1rvNoyxANc^e;A&eyEmycOQIOL-ln>=Q=YN%6pPoWve&V{wBXGffIdG9O zYc{u*j1@VNd79UyC=e-9)3@3c(&)>)9%U zxLwBe>gxz8Q_`wYCMx0D9cMAS0J-tX9Kil(@iJxdwh;Yea6TTvf?5bIEyM1R6s zLGEn-yz3p3rC1(v0E+Wv#Oui(6phO;reB-N_p>D_A|fUhfupu;`akHpK}hS$**Y( z#^x0>3-0S2@|bCc!ctAZPwbFLDR&s;6)o@`I~dd;@N1s}6fr zJ(dl{$>|?6+&4Vr4NFERk)duLFRm5gz|#AG%lh-s3|vIlK+VXE@Zb`yDbzD1J5Pq_ z9k)_mQmiYQYQd8Yp4|2S5b9T5vOe}f_4h1G5s`pew7{@U5I*rWVY^I8ku7eHu()FmWoEw|m(*S!L1%Zdl-?zeKaalI(;%>j}(XU1lG={LB<| zfkoo8mcv?ed(}eBByBE}qoY?=*gJhpFTRl$Z$SOJqE{%p#^?3gWspyJ6|0dlcXvcWkWo*&u;=basm|G*msAE!3m0pRT-=ft|2Y5Us!?I3=D2{ ztktbilW04=j9Pf!O1gG6=^kBS6*^_xpPW^hr!>W(x2hIUH+1b$%@{Q@d@BnMqNS6a zA+wH;jGAeia+kK;-O$3zBBYRL9__?sw|Ljs$M7o2n3x?g1SMEr%>#uo^rB+fT??6U z17#Sr>UHR73i3C!s;j@_7Nou@KA+QVcb=r#e6OLjYti1CtX9VD=||m!6%Di_Q(R`4 zAPZu6Q+05&prsb{T*hzpAGyjaDNH#CM7-7Xc=!BstM&B>@vAgqf7*;`I4LUn+vCps zuNtwlH5M8=^0pTOH=d$S@r>(C(eO3%f@+1B%mLyKK6Z6;I=znJMrJf{LA9}>I%M7m z?vH!{vqMdrQ^6#?eae8M+%Mc3gaOsG2={1xHMXFlyn zxQU6e(hQeUr64e0?o;^aO4zPwgK?%l2=Aca(~QCGM+^)x*9ZYUQe1|5hvze|A1Ldk z95^o%L5$Z9YOXB`J_ZdT2j1J|lZ~TJfY_$x<50@zLOE4_JB`qP_DY!A41Qbb? z$=B54ox~qr@odnSXzyTYJw{s5=9+#J0ZKe#8TTqN4w{D0=$j}3nG s{(sQ{Ao7?vtHpmL!H>iro%P?ueHQV*eAe9PIOq2-?5s;>;pAV{p9YMBcK`qY diff --git a/fastbee-report/src/main/resources/templates/DEVICE_RANGING_METER_V2.docx b/fastbee-report/src/main/resources/templates/DEVICE_RANGING_METER_V2.docx new file mode 100644 index 0000000000000000000000000000000000000000..8b38756890130991486992cd67432134e27dee9a GIT binary patch literal 38100 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

      1dRu1*;F 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 Xho(j>;0)TFRRVw=I6bUlH_!eC&i{R} literal 0 HcmV?d00001 diff --git a/fastbee-report/src/main/resources/templates/DEVICE_STATIC_LEVEL_V1.docx b/fastbee-report/src/main/resources/templates/DEVICE_STATIC_LEVEL_V1.docx deleted file mode 100644 index d6a9607f502024ba4a69fdded8f43303e0e1d707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1960 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 literal 0 HcmV?d00001 diff --git a/fastbee-report/src/main/resources/templates/DEVICE_STRAIN_GAUGE_V1.docx b/fastbee-report/src/main/resources/templates/DEVICE_STRAIN_GAUGE_V1.docx deleted file mode 100644 index bae0fdbc64280088fd0fc49b48e7b963f4118e49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1956 zcmZ`)c{JPU8vdz$tEHJ1RZFY3Dv?@C6?K&gq8LmBC8c!R`)WfhY_@J=D)P3P!SN1B+6_1bR|@nH<8herAh4%#_c;x^B0P;iWP&6Lz0#SA@MZ1oJ(nt*vZzUt!gyAM8K$M z!12kI&>5ozAmZ`Fk~7sx?8%_Gx9v>3e#L@lk+wik>tgGgyUK`uf%^Mju02W)hV!|) zS?6YwIs2O$>!A>-34`K8f$CbCx5ZDZ&vvVo*I0hl452m;kQ?I#9BLwOmp46e5UU41 zDkZxv(a8YpZ}MDNzt~mJmPM5<6T&DfiFGb1I)|OSQWBD=o4`X5S+jLl0cv|Be>jI;%Bk zjR-(T>VjEdyBdjfk`Gu453t7XNvFlf;Q7R1~xb4S_L(c=37DuU-#Em)gm& z4WB-z(eb6W=HWyH+G%qyVsmB1G9YSgHwhh|Aco3y{$gRPb&_9RQ2Y#hC6q>`*v`l% z#Y^zwj|+Jggev^%OvBET;6xKbOJ%Z}%tOADr+YivB>Oi^ti8Z-(3Zk>b9`jZ*`$+aY}3<;>Gc}V)c2sBmARS2h& zrl^ZntJLPig6UZ>c>b31c`@O;bo<+!$~&1g#y5;o6C;?O^wS#_HV6lUGNjCKrayz} z^~au}yy|x0Vdbl%`X;@#L+$hLWDPWK=XbkztQQ-kR}2ZTEZSaxlsK||Lq3%$ll7;+ zu7Hy6&m|{{sMPZ>+NGqX^9b|v;LdD@0Ud2R{}39w1+s~!)m$d8rw-@|!g&QB_qlxR zG6e+|-)|onY(ziLMTFq-k55b{c@~Pu^Ju(xg0rr_QKfH^g5SC6((L2fp=C|=Vm`$W z(-Tl;<`+E*J!W(Rx98{&-#THYgxqi3@|f=a&C+aY@n=PW`Mp!j>>o6BM^mp?+g%a- zO2GA@CmK~5gq6Z=%$Iy3gWtMcC4nQ-x_46YREZMvb;*yCbeDbKU>V^n(|LC&!;ko% z;bwi0jnAkb!X+w>NNSkqAQL%=t<+K9DX5fekC4iXy0LRuLTewMM~~xZ1xN|F{A2`hpJTZH(q{SR2a0 zpk&9tPfNk2BD>F-FlGp?nky*no*+Rk4$xm#sb~^QRreGfTU7`|!<)+xuw?N#mV8~S z{Hb~+bvNF@w$I!TqaA80RgSwVDAc<>R`$%#yK&JDROmbTB>-Qg$H7O9s?I)m8ERTIQ>3s82wGMU&S^Q?j78nw<- z7J6t=NhYoLk2T3oqxh1!(<+(ChI+4Esn`vv9TvWTIfK|twG>Y`-`7_Y-t|t9+iU&c ze&usmg#Wt(1U1!nPh?sGRu@o82DE4;(qG@y4A}Rt(%h5ac#Tyn_hT<#^m=(t{5a<7oHMYO~b)wlm{y#(R`v%_||G($} o5X~XWZt)*6@ICQ+Tm3ijfKB`_lZ9Dv^L+cl$-YE3j{H^q3Bpu=mjD0& diff --git a/fastbee-report/src/main/resources/templates/DEVICE_STRAIN_GAUGE_V2.docx b/fastbee-report/src/main/resources/templates/DEVICE_STRAIN_GAUGE_V2.docx new file mode 100644 index 0000000000000000000000000000000000000000..48171537a30607c00bac357cba4307bda3896705 GIT binary patch literal 38100 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 diff --git a/fastbee-report/src/main/resources/templates/DEVICE_THERMOMETER_V2.docx b/fastbee-report/src/main/resources/templates/DEVICE_THERMOMETER_V2.docx new file mode 100644 index 0000000000000000000000000000000000000000..c9f5f8ad522db441507582a61d36e4f2391422bc GIT binary patch literal 38101 zcmagEb9^S-wgnp7R>$aA9h)87PCDq=wr$&X(y`I8ZGEwAy!77t+ecx|Y z%`wItvudqbkdp)jLjwW=f&z+GrqZrdD2z=61_By^00Kh&9Mu%EwsJ7Ca?n+BwK1~S zrgO2hXh@WnUFAm#x_CoRqUR-a7eYiY+p+m-LlcW5T%CT$uD(QnCI#~JFvc0GJS`Ut zK^L2m`rwJbTF2Ar(MYZ-Bz&f=ouQgf3|j1wzn({TZp^kP5=$h$C9M~Uj@yF}LdHqAA0E^>ZH1lL+u3eTI)Q4J!!-rNAtYhvPM?)j@cZRL zt!X-KSoas!4$jT(tkK$&`S3XyHZ#|tzBP`rQzYwqWvu5S3_A0e1Vd*gJltNHGNvbp zqZJEefQh$?&Cqm?=N;C2e|&$(Uc#e(WV-^xIyOPjp`3LVdVlS`#{JK_+^()-o_yBD z0t^TU>EG+3Z)5XUS(HYtRvD1mU#P*f9l}f@1>~{f{1ybJh1PLu;xd}%Mu;V1!CDx1 zygZ*m&^dzW??Soixn6#ayetYBL;jNasf<4Qls6=2yAIP(9X7bXI(|TG4^{?Vimvh- zS=&~3a-?z|f)?5#RaLHP#GSa_VC)JX(#BqvdeUJ9fq&zddr_N=jmOlh5x>Z(Q|)8_ zWujce(ng9rgKSti=v(#Aa@Uec9+vNbyJPjFM0f;I5dAl1uu<1?)33`RqL|WzxQu!o zmt#M{%wXLe?&=JWkaJ8dH8HtoN%&9jX>6`%;U4>8b}@exZ1HVt9rm(M;dE=N36z&3DZ*kOH6!YDynzwi1p1W8#`QlkQ7uIz*J0&zzAjB9%0`DAX$>L`-H|-xv~MQ9wc(k zd&~vgfGN|*S`)Y~4ZzIs7+8M-r_ydjQAg_1xCpjVtrb};OBK8@KhppkdHsYw1@EN7 zJxUYa&^936@D~Yy>Jp(xLbyL7GIj2}zA7=LVA~{Ux8_xn2?o}O_}%R1N$XCrH~w$orH6~HhJ$_^gZ-IQ-Ayt zAD=qYFdy9mheSuOBNLtA(umd6Rp9ixhj;z?bCz;v+*P(yij##s$$RI;GivW9D=p*) zM%N~=!}2Bgd}VFEkXq&G-opjQ{uHUMplRP(m-mK-C&1)n7mttmlpZ%)Rb^|Bh7S2u ze?TP8V{c%tpBpOL_EA)y?cg`)f|vw72ddr=9Nmptdfg`L^Ycv)JmKT(DIYL~5}A4- zy!VSQ6RozJosJYC6{#_V6%&GGU?IPZ?rTZqA!?Ei6c!u)asgg~PaSB4c0) z4T)LlYBzN0!p9JKEI157DS(Kkd0Gy(wwo(wL548~K8V)bBTt28R1EcmA;QnG{On{! z9v0*+53nPjNlPY;yVA9Vh{NNnF!HRvE~~5aelY#fX14jV)_S`eNkt^IcWoCU=Y$dZ zr2qVt6K>h~SILd?#*BE4)EQM%gtB%$-G(*qYu@{-yk1Z_*t|>4LdhAJS-(Pzzr_&^ zjQ}nGw6sR`(`D`3cmvQ3nK2VsDsh($O3?TQ4gqVViSuKb1aBZ$S$|!cyA7^!19)SB zfb1otLGBZsK-p=s?t6-^fh4&q78*7N(kSnECPt!6emz$9gWn$9LRf1Lc9fz2|l zS&k#mxiWilW}NTGqq|;-*Aa=jU7Cb_aWT)zsxk^p$SgOX-4%-cvjZ_1uv10Um!HE0 zUq#+q{Sq-SkBMzc#jODWLpfEE|L&6DtYJ{#Q`bW%p^PxYAhWE0UhRy0Ibr9_*>>33`C zKtN0-ea*{H01o;p1oK5XEZ~xrfJEi-x2v9BXqU(8iaH|YRY?8#Vo)yWMyGPE*Ag`4 z6{i{;?NKyqp9Ck9pm^)uE#Jb~d`ujI#FJc{&ZfJZcWuuBus*4FFck=qs52YhZH5Qp<8uuWN`F1>CBHKy&_7y>Qgpj(w!qE!g<`K70zZH z1S(5ZEqF+lY}nSIM6O74PYPks^4;z_THgg5!qUiYv*wQ``ZUCIma5a0#6;hT$c_Vm ze*b%g{CQl;V2JEOt2A1)sExaG?Z+roa|G|J8GCpt-$_dK;_rn_SqQe>V30ZKSuR{7 zzo>c7WK@I-aJ^mqken<~noBXq8Y~!5N5cRR6Ko_Qi!~D;bW_Y4E009;wLWcdo?(S* z&!@7wnKkXEs`iA{d#X zAXo6K(9Eiy7u5!`W)H*OFA;C5YwKs-&~xOxo7ij3C#0?6nX0rxM3sEMC`KJC!#~hs z_xG&;@2wqg7oul-xXQ;@JOf-Ff+ASalVZWJF@$0!!Xk(nUur=QV({YD=AdhA-;OM; z0M8pLo)?-=hfP`YY4a1->Vh{?jL;LI^mL2_IkRPtO1oewBP(jQtf1B`^j*Hj0z>Ui#_QFH1QoRLU6`vCxEcE48N=UDwfo^_U@sC&DnEj z^&c2BnJC!HSDR&pjJS|ziI2M^!nVgMrc0QhU?0SLFn3+1rkjgpAb;ri4?1{dVav8y zw~fDM`y2-AD;i4g3Hj%E_%?*8k6|rn8s!?7EBWxFN2k;lD30lmt%N-h+lN)%p;v@L zM!v+}tIbrZ)DnYa#EfST-h@zsUnO=PT*kp4D7{Dfs-5WOO1)wJ=gM#8gNwrS*%FR^ zwuE?}E#Y4)|KB$>|GxhJeRGo_AnVV76?E|q(;FC%R%8{9eVRw!MkQKZ=n*Ko5_d1O zx2d^qNF%i43wU7l%%-rM9luvx*x5UrnZHwzYd19A=iq(1-&Y=;80XCE~t)814LbTIxa;& zI6KS1t&R9h}|#-pdpeUqT8?4EvQ5m3_T6 zN%oc7>1r^JC;u7x|MXfuDt|4P9tfyP85{`lUtZfgxLO$5|J7q@ugC3(CVlo;B_+7J zt}vuT-Hbe_KBTM2je`Iy_iDS~;uL>YC&i{1=E9*0zh2K%jn0;Mvoz0pTDlf(3=d*3}UhhaA98Wvv zE*j@qNvm&GZ|C8B3xo9U?@it>CkNG0#e9t?0PV-8^{eva`L>sX*`vGi;9$V9>suZ7 zyU|DMMj*Y{8i7ty@#SP+ad7h9_F~f_z3NNy;-2YE^RktUH@BLtHp>FN8st+!+ zm!Cd;Uf+AooBNH-BV{*gC$~2m5%Q`_r}4p=zP!5g?bj+nQuOLw+lx)kOIKi;`$~2D z-QeEpy+g!1_p6K8yVQHw2j;1BF<||mI%#m;_=YF}2jQ{~dhpq}k<045Pjz7wVCu9+ zGfV$G+;Dhza2PozTNPD2xA(MfYX5-*&GU}k`M7HLa=uYVr;0K7+Hhv~aAarM@p66e zaFi~t?FKjK>D$D1ZT zeAXAC!{Uqc;@RDum%GvZ^zqqQw}*2t7gxZ!>&>tChl9KG1Hki<(_6N{srhh7`P=Hb zL+9Hgd6ew?MfsiiZp(Ign~`BWK^~$-zB7TM-A;6urIoXNXG}bf?rU`TkiG$ZQo_L< zQ`l9Teqjz}6k#|=)f`geGg8zu63HEr)*aEnv5?eUa7u45`BSQABoo|y1h0c7V?)yS!G~JG7KYd_=W0mX61v_{|kbLJP3p6al>prm%q*5RRpTC`|23 z1FQeMF+Rf+5sbl6k3|ZIZwCk4CcRj3jR+vT+tsE8qj!ZJ>J{Gr@w16*@*&LFrRBFm z{``j)uuDq_PW!o2P;vvL?q53zp(tEoq5e7ExpMxiEs@KxCO?MEHO9ZNt&3y-gc7;J ziV6G)o%%$h`NaK?(7&k&#dus*VSD~3K{U>%9tEU7Dt>*&!TwS49}@o!YA)Wn0jd4Z zQU4~aX;thRBgQYL9lRii%=*)T|0xkzfc5uAytoHK2tv^To*AQtYZk}V~>RsmL z^&HVm8N}6HP1%Y2B;w=jGvK*qqY_L-;VVo#cW!|2?}pzuZ|{p-wSnubg8~5}miSHS zp6z4%(Y;H6I-}tawKdQBPP(SiN*DSN@5hW~Iy87(YcJSMmuCPA-UUm?%E3|l8n^m4 zysoR&;*-X#!@g;BgY=jEolT$`!a1lc7`6A}HPp=ZQ?&8b%?gVlzGNNPlQd=AaTrnXWg;J1au6ct7@^DFW{Ph z&f5bs?fo(4E`IQC@QrBBhdHzZaLjtOdT(7kq}};q>5fjykgnB;OaGxLE6Iij+B(qiJnvd>>s3lT@(ZK?zpfAg*^}L{)*6j?U>o+5CE?b9C{d zRcq&1Z*Q67^#d-?XHQpeSAapsx>px>m;1+v_leWnm4lZfdkTY&_gc2h3+DR)0EEZe zC-`)nTZ_Q2`eJ=`6!0A5AwK-3!Dw|Xuk_He9Gq8V6u*b~BKe(c0A5>%%2{?RIj7Ro z->GurAp0?W6cZdvH~+V;NP;Y^htZMZ_*9_+y{TULTsKCXZ)FvBbFEoR0mqqw{fgNB zFLx7}ul>B$7$d6y4|Gt?L6St^lWib|hxUnV1Z*v&E*3N5Od8K;=H4FX197V7Bo>ty zbyMQ9_6Xe+z^U&L4d(EQh}ykni?p$hC4=igWe~uI`0F8Yt9>{Zw3f0Rb*{+To{eMd z>aL9^YJUFRQ13WB+xH)w^=1a*B4C@rcT&_v>KU0ORi1h``yHJ=u~l^biN-Wg8VFDQ zPXy_fSK$x4B0MMoBTYKsCfHFhYJK{8@I8eQc`bxLM6$X{i~}k*uhxYp3vy}`m#+xq zk2OuY+U4ydKgtvYrZpNtp^l}s-b2DLr)S;;?&j!Urf%M532fc>UT;L{GjQoudCXRf z==*YMsx!ueHu|aQq2VgWdRgvP1+E||JWs4r+>v zS#BU@HtF)<6r3o^b2wjm%di$J!$jCOj2~2JI0ssrJ69^`T=d$YD$G)4>1D@56GulQ zzlW!2m{HCa%=d<-musX&;W0M!+rVklZ_=v<^VECYp>!zh$}b}3ASnm2V&VFbfD1c+ zxj6e0iMsIHz0bzw$;|&H>T2%aTq*M`pYXbJg;U)Bw!GEQ5W(P6{XXC4hy zZy_Gi7|}`?`AKsFN5Z~jo8oXg1ow9GN=QjTQPVD1+OLyRV-{UoeCJAGw7$h_@>PF$0?adiS5KL{2<{{gvc)$^k zvq0_#bj*88CS}f=53JiKuU=Ihf1dO(z_L<1qRtP01H_gSFK1x#2co5pU*%vP;w;z9G6a+YjA8!SOQOtWm>(JaJ)OX`6TE>_NAybnYw&hRE0#6 zc8fOoLrn`O=Ri5eDr#azz=^9B47#+~Q@r+R=v$;DSgZP40*ZF%1pC)xQa3W*cc0QY z2LSBEY&2DuYR^wo!bR*KoqXJthzA#WfC()0pY}0==}neJ;+t?&CL*?UFSE%}xH*W{ zPPt?Yn=^4k z@3uK*I5~e5UC+MXc(k~?bv@mbWpA_a0-OW-ZZ>_9w^5_&RXoC}JFm12siRp-)hdWP;mhhwtxi=POFha-32vRs1n;LEZaGt@qv{G1 zlz~5!K{uBmvwlX+1Mv)u37doHrVA)EiDAber90WT`LN}TpM%svHN+Z0w_t-xbFadB z@Igvn+Z$)s;+FZLP2-xw;(>P5I`^7JZ4^bFtsq>qxB}Vm zVI71WBEA((BD*z)W54o8%33oX{Kh`4b4KkZq#Q%+_Ty~MB!}%j$a8#pbtzNh-Y?VV zlrFdF$b*+a+7%H-W-GA|#ckF$3iA@;7l#f%MlM?&O)i^#cj(E>MhLXb>Dc^69-9<6 zWnR+`_NvtF0I!Xv{Vgj@#*xc_41ZIc7Ua~b;T9)z_(RSXm=4Eh=$8W*U~B$#0JtHt z8_6h&8#6?Pi!a+1g_O;XVbwi)M=q5Zaz|wU)asD%tuZ3Sgu{dkKilOR@a_JXNqFF> zyPOS3HD1zGdX#;;58GB{R9TY9VI+;@;W(a+!Bah9n@>5r$vsYo{vVhYgTrwa!$WO;9HD{;;O#kUv%8QstA&Y(t{j2-MCZxF2L#m8$)#g8xg=1z6V@7UP4A* z6Q|67Ec)gKzWcn#it_?#`l_5Q=xo4!mspF1 zU*r5pjd>;#9us+XeQ3SE$~+Not8l#XHV0Dx65^-judhTBPN$& zp2eNTSQPuYxpo-OlwfZB3<`C_yzxEZ^c3lcdn3NJVgbA6P^<+S8bLJ-;sXn)1IaA;edR%Uy)|1J#8{42~3Z68Q^A$Fx^*pEYe}f zMY>v=qoZS;|Lr)Cjg@$=d?j1>VqcW7x;RN(TeyRx+*s4=7W+=28y1{9S0_#A)~3`= zo_-l&*omqnc@dQ=(rp_)7wWF;-f_B(63s#zu_5i4@OWIEWtFOMvLqQq=j#^q-3(q{ zu;hGuRkB6!4=(h%(UZbN(T+<|jQ}_0m+ixKDcIe+xxDi55;l{0i||z5d>t5KQO~f)C1Cw~Kzl?> z7czrCV*qCLPe`S=>u;mix-Wff^;6u_Ur&&Jj76mzJ&W+QV066Wb;Ldm&tE09a&K~5 zqKHuCsWFqdmDr2jthh9;CzfGr7#X6;ZFY2m0f#f10qXeE%EsTEy?3U+?kaK6-6dG8 z8l&9J|0aCyh)O>XNbg*b3bwz7LM=&e^fHdkcATA*Gj~LPQ^{{CdC)A}`EsY}9|1$P z1079`oj*sAB!NZ#ovkUQSkk3@p6S@4L!6Aqj8$qoCX>K{HcH+$+OK+8FDGe5V_7B- z3b3rR^|BaS{~ffT+Dzk|Wb&$m*I~!qQ;wCR@-z(KVK$9IH=GwOPZ9oW4r!07C}P5kihT!UBrg?abl`B! z?xTu6*W>|=52ufgcm+vo( z*rpgBE1%F#agFhmLu&6dLrw;5@EM(DrpPfK`O0O*wUhHps4*Tgh}q@&P=_#R!1Tcc zipWU0P-5Rz|JzEz@0NAfz^VP~Yb{mM)poYxGH zec52z!Csv4p$E zfMj&dgW}i{ex>r1EwQ}l_8*Ky~jWoThgB1sAuQUabVYPRrILRoD23;2r=Lh!nG zfssKCsIUD(svQEWbv z%P>#jxvHC_3Bp?k`c8q7f8jd}PsT7FbvhsS8%;K9uNLd^skYw$X4%Gy9s^aTm><^? z##hW&iU^6rhZ2k!qTgT_969_5COmh@f`aJ;1h~aNweGvqUFz?ceB7P(Gk&H7O!o8UJC6iP9tXpNdezFo)gZK6pdW2|$d57$o!|YEr6d za3aQBvFeymLzy(OJoW|urZHAoy7KGn$rS0Iyif5z^UmH9qA6VUgsAH`$`erNh8FcV>P{#ib8ri>2a`?@wg03Nms)^eeI%a)LvmHza72M4|3VhAJ>=b{-wI#)w(o@FFvt%<+M<4q+BAKz>+EETF zL>m55f@_F$Fem#kl2L!10x$WN0{>qMho=y3qBsdBLXH1c$o0P!x=uW;?+;n4;C7Tu znWR;`O~m6zW=pC4_!o+kM9fJzFwT` zCVi|BbfyN%V~J}8BmG}*Ir1Zn&FknHii?+ZSlsX+CLB&{&-;4C&s#+zIUwuqbPj$N zkJCa-TO$NzT`+i7HrDU2G|Ln2mzX7Z58xkbUqc6M`Ne1zukYq6R66PRXmij2Blr1+ z#00j%i>yRs^7bKv-bF!(|LMuI)#vBn6LL1naA>yg6()L7Tu6-k$eL?N7b6%^!!fw~ zse{SX4A^Oq>uj3z#nWqNP1Fo>Hm3DL2?FYQ+!aml&0cE2?o{UWpqti>F_OC7Em3HC z0?Asuv{Ti7Z4-UA%snW5`k{ZQCI6yE`J{%F)Y^Oy9c$TGfKSr^pl#4^>6AK zGSqN{|AYFfvmd%WG+TGWqvd;t9`tc#Sr3ZUY!(fTuk$I9nqPY(Y1;`OYB-5Y$Y+CG z({H0jY`AUJ7svXec(SISzXQ;NGMWv(T!`J|J_q*?`Mu-NC%GczU*t`U-%!Kp{txnL zJ@KulsN~HxyMM@g^~9ePR3Bkfo8-}EdL3pU4;5Qt={t0FHamP$gDiRa&Fv@p)o1jm<7_1 zKWmVZ{o?4{x2oFEfv8)THpOyR(8^P4Lt;_Po3ySHINa|-8{-RoCs;G*PJ~2u0z`(o zG)BXB($FA;1LpL+PTfmrMsDr}&{xddm0~&%%`z391hX(H+sCE&IisljU3LC;h$w9VIE{R2O~C8iy!;0k)a`AXbCke0>4nz;q2kYv#|+m{ zrDsEmpqD0;#@S?M3yRC4THCk3Rle~`r_KI)Mi>4DFFZTqZlr$PQ5RC==u-s!tt~eD zW#u>r6olvPoXi+WI-aHLYN}KwjU4+yc=lVKDM%x;@=fIIx1-Xsd^&4RY4Z;2%=2%R zPTOn-~~ zndWmQHSYoVChb;sTr!F)GrMvDDCLkY*A)<+<^NXMo?KSAA({A71M+7YKeKSR-$xQB zO|O&NZR=vizjD-gC>s9#Z(uj>vxa{qdGxLFu5+Mu_See4l9bdu?kEiXJIUb0KS{E~ z{zg-9-jpKoF}0HQvgFlOPbtwjD928VE||3UgxS(cu~#J;=#?wa#(`ro4ZxIoeR^|L`ag4-&er{pksWXsKJs4J-{c-W zhO7ruV8Ph;IV#>jlsT*opS=)W%x9a?4unY>in$AZ2S#7w7PVbjf{W*)?Rm#B*ATPSHoy=mLrX`Lh94?*c*s)$9VoAZ_y!(2&!; z^qaZgMF4=O3?k|1(ZgW5l4QSCVvde#Xm|OzmYccwwh8fsV{UQHLDQo>v`HWMGg6#t zf12ks|7o660O&41s}{(An%5{>^^bW=I;^^5#;4*b|0oRH4!m}Zy4;J5H{JqfsVPOB zQsPDf>rg^~_N7Yn2eA>~OCdxeW-lY%DRJuL?G7Jk(xxf|T8h|io37qsMkt<9)C7m< zbvF>`H`F&Q!e?7D{T+1N;TFLL0*j@~;^kc{dJeN(7&8MPm`<>gOfO}|tz$l>6(P5x z9Rg#gT4Fq2aDIVz_HmH;+16Irxt{r`4f&XfDivgZ&Z|k-hl+(ZmsRYhCdQZbd7lCA zB0QLQ)~v{4CEKh6t9h`h=dPm%ehTi|{}6J4yg54n)&C%Ox-6QE|Y{Y4QHq?^9l@V)Vl78ecc*r$d~Lh;O} z(mb@w=F1uWvp+nEO*wUQnsUfDCqOsp69+fQCiHFaMqVKPei~Xzh_FXL<$0(od;<@g z>)xo!2F_q_%sVrcamTFD?D(7lMJf*E*ybqaNZayeDNWUg!)dR?)0 zES`8(l8158dL-UjX|UqFp|&RfS;~e=y1xj#&xYMBW7cF!F8Jl^&8K<2uV6vo41B)w z0%Ni+TH^bv99FU^y0DSZt9o8Z1YoBy6epCSPuM_Kp-+y}Q2nnqDVsyE9;`JcMRypf zx-Zg_^QqZX62Q^0PBG7aQ^A^-HU)l~0K9+j*HfveDddDFXgHXa163Xx!))EVk{VC1 zJiy5LO*u{z{aE!AM*Z38jlF;Ar6S4=Gte5!%}E||$W!jp@AM}xz3}2Y)`zEt4KE!1 z>}=vcM4JbyZ41&SUVHGJw097jpB{9-`d!UAvLhc0re=5N zEFLb)Y~6cbHGX1j3^;pvZP`d{Rs7FV9mw)Hm4>G-Xc~H*5s>Em<6pD?T$Q6@s_xS} z?_*=9DYNk8*OdeotDOyw6Tg!9rEbD!Qr2$)f}xRcl5$KxM#(8-YuyElHQ4d=<3WYe z?OaIBXhlE_42CqLh!`h@B14#Zx``pXW|4g+O79#zmD%!+qO`g`pB|K5Ebix#c@^NO zz%yF!z7|&_D$RelsVx2x3qC!kJfCpxM>k7>uS_v>EQWhsv4G7zvZT>NEQ|=LavLCX zQadkul8Zt>21Rw{*xtW5lFHsn=y~Ix73Kk@=ytvvY5^ygDyw_JW;AjVd83#+IVVWq zhA_7XTQV1HW3GMrPzb0uQ2(AJs}d9>hb90tw_qX!`6%HF;(MIXwvuD4H*4ZE>aqtPqCO_ z4?)W9i-CCOJZJiaP7mVz;5>{My1VoI((E^FkVpcZs!>- zpMrb-TX4_hoZml!xBduz{1p6kG4hVHEybhUk#)1fkDx5N9Q}19+OTmx+OX&!;P$P> zk)FYS0e{uzWEu=N{^0}T_3YL~si0Ph+dKKyjTFFT0R55_BEvCV6vgU)61HK*8*KoqzBv~*?}E5|RpbHjQhVG;MB z*e|;jobMK|q#9H1GwUU#OJ>Js`SWeIYf;`dtFavfrOT5X>(AVSj{#=je5w^&2MRsW zpVEpxEn(ELuGzwL>Fj%g@ONC}K!3f3aie-9k~;2jIp(x@2PpK&{`glh|6jdnoAzJ? z(4ZOFLVo%?)zqqU`B~9azw9RN*XQ+p7b>NvJk0YQRiD6)tDMwc9VT4r$zAvb2rjiP z?0!BDNL~V_O08i5f33xEBTCzlRMhk!EkEO!N(TO7VP$O?ELp@7&Af-(hKI?~Viu@8 z!>`sn`rQkpRRRs)2DLWuOpilHK$X!gylj9ffcJuqr>CWrK}zJhl%WOIh96FZc&|G> zn!KPb{kFh*7$=6vkYotk!wJ{yPP>ihnFz5qAmEzTIc*5Qrrg8}tiVN596SS&jA!wcH1 zxwzj#MzIx+>2%v_8Buj#?fAxlvm@|I#cjD{Z#7>&F@X(2M>!)$admS2T9UrERFR=z z*Qpm6IG?K%iLxbP-$4JL0JgG!0FFcd0l}ZZMtw)WXRaG8~aCq zm~du=;s$IrU)>)f;#o_icK86AN0fX3zx%LYZ16mgKzpuudu+EiD*jQR=|A27#U8|G z%LUeaFc{T@6O#?9#};rlO~Ag9z~l}*Xq#9HG#FkP2Wx}3MxOdN{lT|?=!<`taBqQs zCcnSkY~2WnIlF?Qh3m$M!>VyZip3=)ijvai z+7zB&v~e3QEjm$75njPy!H zBl0|3Yj$L3iR>)xw`f}*tmk!Wge}*l59nrG9jC^W28xh-y3B=eE0!*vX*JHgoQiNe z0o6K=@7XgDt)^ug0L4nSwemk|w9I`cg)bB!m2Edb{eY73r@MR&MgbwKy=H$#ZS&U_3E&+i=#lq8q;78XKYi1v}IJLOH#D5l4#bdN{(dF)7$yMsSX+$J5CWENN-nt zW?#4Lg74CKS&2d&Z({U&pom)q;=)>@Vhl`$oZ)Lg;&7haFZs|!)3Fi1(2J*by5`?w zG8GYO>X2&7E*7*j_c&O_AHoJkC`T;CYg&5Rbc>@SI1CK6OqmtF10%1~9!w_I-wdTg zEbEx)QzA`HMV2Zw$yCTEN5bALT`S-=_LJ1GnW#tasz#*v5fT#jo@b3A8q`ZME!BXi zQLz%$QYR`b(5{)BI%rqrYV0ed2%SO`9TO5GU$2IYvk`|Z^2IBph&%QZ($i7sl243` z;IUHFQe_tSe;8$*tlGySw4K%01s=FEUun{s7#+hEEuo|g>TPBEhV~FLV*$U?P3nQ= zpa=8}5wm_~*>gCiN5coT)KGdF7d*j;r7kK9SHuN3puS|EyvXteQsFMSXZK%J44+h3 z5r3!{!haiV)lRbg_)L>2#g&1;&B9=)Rry&*JS!2MOXx-oyItU0Et8>2(#dmDs*l!J z>QP6h2{=xJLY-gwMD8_Z-^o;p7^!bMy5X1NjV4%AZlPf@5(zEal@oLh`l4Kd+P zeU?Y8nqzOjC}4Ci?LlweTF=1fvyj$^Nhhwn?utz2f)d)HjIAPiGq?1S%@HDlE>U)_`%{7+;W3 z|Bca2T^$sHT%{4CjeTXkuth-Jvi!FM7Cc;7s-C zgjJqyCT~vZRncaH40qumn|ftVQ>pc&#l1uC+Dx0;TtuQhTY><0p!UIHo4oLZ)}HEM zD|tWwc&xfGa>ziA(A|MW`saHR^f4vY_a0Uz*pyy^Y21cUE3`1^GF+_UNxJ}Ndh(bl z#F#0M?;3v4V5m^!NK!G4B_{5`#Uwsf{5|O}`FdZy${hs*w{~SU396{Jj+-C@M5OWK}rQ!qz)uBZMbUQYs&QSjx z5CL%Q96$6}$8D|oV~xPn3&_UD$^~e238(DhTo8{F4uL=&{y>aI)CYK~rHTIZ+LNL& z42u6!0gL#zioouhFEZuwDph8Vm3{}Z9PnDHO<@S=oxB!Vk4Qvb=wWacf)Ga1rpG5) z*D;v$(qega&QM@tBjjvX=%H89TiT$kxueoocD{KBsEeC1LXYzH$GbdcAgTM;sIq4r zl(()*zXlNF1#YPiy?u0Ge(C{TiRQ}XxG@{v(%p^61i(Y#&V|CyHNrLoBkafj?loa6 zJ)+?)`AB6Eglgo1DI$(q29KEP?#s&!_?)xiZ1w3aP$@p|QHd44F2kmZ!d!O51fW4t z&V{1QIelWF{h56TU^ks9Vg%nNE07gZI2+CD^^xsQ%BIC~eS?2eK7lCz z0fPAhRQX>(tbc%x`Sx}A3gkYR%>&T>S}pM#VgE+Rn!jmJZN_X2MU%5uMy5O%4_py~xg(&cBvAM(519P!)Tre)`4k?y2vHb#Zkml)--hg{ssn-Z zFtJ=i5Y63xDzoh281Y(GuCfKCing`Zt(o*GXrnq$QVECHrP}IOi_|R2z-pI z?$K7+*twhTQCx-Q*OSMl56J)gnqSY=ZT1M`i|qTC#fy!O zRUU3yU5vJ_jtcz7^!5GOcWcD-Wao6*Y!$>&XI-|{LFWlQcJ|k<#j}0=mQ}KW{qVbs z@b$OSmSlKcbNcY$n-50_fAQ-FGfz{%eH3f;sH5HWtno|T5{0)FA4S)am#h05tLcqn zt*)mQPxZZbk>yjev6r{^N29j4vl(D@)U%-LiLS->!pqy0SGT>i_1-1F_=DraVAMW- zFgqYUxG8zh&AYk7d3Dd;t}p%W-1N@vjBR-#E?)LPl!}1;rbbscIBO**c=h+O1}9AXl}OE&CQ$?61&KdKW7q>l+UW^-IshlQfG1FO`$kE^9XH>cs^Wv&y&T zcRN#RbqL`V&Pe(DX(uzbn{CspG^w2A;0v$U_6-Y6g6w!M3Aa}|k=-}%kHvNEI&K~- z{NBCd->WxX$@m<2tM7F@U%2o&3AjHTU%56a9@^TfH))*^%jc_y-^ePvDo}*@#unP< zJ?)HJmd;Gt=84^zIKN0v@)cq-c|X;xnjk=y56-`}W!$an4l8%jXKikBO^la5Ro(91 z7`#1s*tNXhZxYl!q;lLcGCsX~)xO>Lov!pgTrjQMJd-TShx)3jY<6HgTRpV8sC}_A zyfW>QT4*$UR4kt?NBcIh#P@Mk-Q+NaVf`ZgPN!4v9Ltu9PYHLt-SRL@e81g{Nrp+o z_x8*6vCiYQMpmZ1i%(4!;r(S$x3PSjRef!9Q?|I+pCF08oIoWydi3t)W&5f3ZuZ#r z=_4!Y#QP#CdJ*t}OR)b@`a5`h)y>-@M-r0f0zaP*KdJgCFGH(Nr=aiE{<-|%mZB}9 zRtVR+{Dk%kBAOHd!uv=4`gTkHh!hVk=24X=TSWsa*{^*DTukdhGP6MvGZW#tDA~D* zl#)znc`n7@PWS1-BntJG&5Bvs>-!LDtj{6l z`#U~&HN5xEr)@DfmaeM%$XuPnY+$lg_h3 ze(CQun^p?5Ro5}|@-1Fn!DhGP$C&PpHX7`_L zTRL7Gp9XcxVzb$t38L^yyt<*?_KN2Zir=(*g9%(|p27(jEER2 zGy-ZgKd;uEa9l^D7iR22_7+faEnBxRZoz}QySoJmZjHOUy95jF?(XjH z?(R--cY-GnAg{?e_r81X|Gn=Y3^s$YtLK_?*6!V_YIoIw^qjgZ1PhR>ErL@gUDblD zM6s?1TSoh$TkdkM3=x5vA`3xVy%$&|AxR@hG_wLO~>sa-+OQLuUEe}a+|UN#Vam-M`?VA|AX?M z4gM45e`bNj-U4Z#n*R-qOJ>d%6c5Ux1q3l55D3Qp53YYx`UZAJk75UG1`BLv^>?#g zJKGOCOrlNiIGbQx@bm9D|JmR_G}nqX0%xa5wt&r0fz95fAzC?BNIoMz-rYw33OXb{ z)S`H)kxb|W@%CEup%{$^rQ!%w$ zR4QNxA8EC%|NHpmD&+7mYrOx*$4FdB0k;Y7Emtnr=PRBzuiwX3^Ji9%>{TQCoF7WQ zOdw&t{d9YRxpeeAecj0FM(4}w*!p$KPz~MOVH}=aO#r{wCg8GvjzAE(xV?6$3;4uj zygl`R+g$M)6JcEW*2d7a`*0ic^>pkQxDxy6VD0|JqHapt5kK@UNU80LD|6ZlCGF+G zq|NJ&^pr+i&+|0y@rQgu2uZ>Qx19KWuo6HNQ8r$-xI#kgPH5YE5uywFt(gqJ`= z5PsvmK>z+7GemaJgKHCOfgAfc(wILd3k_h*pPgmwdA=wNr|(+ccVQ0EKnij6@@xh& zDwhN8wj1_1?#OT+khiH+5F>lLWs1p_I`U}FM#4fhjuS5+&PL7oC6S14F zq=gyL`8R|$l`ACH9lrA5I|wa$E;{NW3D7jAe9U`sVnJ7Rl~$ku5D+ z<)&M1#BHa|+w-Y)Bik^p$YDU(HaWhIkHR*OKrF55;CPDrSaq!`d**H$vkCHr;=`Fi zqa3$<*92h;w>;~4ZSUUgb+fd+ODGDaI1}crvFkL_ap<{@0Vmx>^JG!EqbI(jT@`zl z)wHd#3ycynE8vqUp5r9fr(v02C_+Mktq(8`V<>xI#7i&=&J)o!O3cs?Zc+gPuI8=F z*tn+KcS`HIdI2MR3mx(e1K$_$?n=Ilze#l!cI+o-cPBbwO&j&xO|N`$_oVaQL3G3J zhebPItaI1m%W;dkvDHQ#9&o7twB@Y*ECSeEb~|nDB=L5PYr&-3y2wn);VSxYG&}Q+$_-YS$<)Y4|Yd_WgV{ zDJ^13=f+%*RUh;V7mZ)Zep3I!O=Fb<_o}jgvTc!(OaM-*X2Yrrl)%Ly{Ze!_wpf}y zwK4Ib-l;9|j)yVr(istDak}2~%|vdk(9$hSS~na=j1K|oJZlH_C(lW>nQh@UZfDyr zeyskxZzkQ0W(@{huum@ac>^9XS*BmdKbg76&C|=L0(g_~4uI9?Aea_~FOFA`UqP5QF+~@BtUsX{dxt&iBQ5)JD z$6bu)AA;Q$+B(XQUY~IGO}phwI0~mtd7CWH^mvvU#~2sOpvSibYu=1*YBv)jwir)O zQDOIPmGJ!)Wc98v3BRr4UE3+uXPLV%0>)=Dy2{&GPkkugRXoG#Nc~XOMbXR5( z`q~=E1>%q;9`CV%up>(V|ETF$c{g%#yHEZ0kot=}TzH`ALu^631&sjm#?4;euE1jm zOM9=+Wz?-g?tqtryw!6T?`GzNeE-Gioo5@tlV_Xm16Tt0#53|>`U(sG(Hj#$Ag;v60R1BdxdzKRzRW-1m@)9AjpNqDYq}C58!={6s`? z;G236jvQ=af-ExJNPw;6Xe{%~58g8YuNMF6X)pFEJt{e5L6W2-Nh~XM%&W|%a8R_c zYy7_6ctzT7{1}47S)J5~pJPHGZWh{k7PD}|uht89jjmXXiq6@pk^v0k=P`XpkB<82 zv$Amr(MGi&x3U_z{Wj8vo{ANIU#l{df-cTgoWEYpKRhw4S?7E_)7#3s>oea;ayEZU zIBV(mmVmoX-|D6}6ZiyR;Wr^ z;=%rQh$M3PQanFR{ngmuqWimv_vCt+Pic!M&4|WhwpsCF?K9ZUho3I#7``vV!>|4m zPdl<;*^|+#&AoVdH$FDqP{5I9$dX>lG(JX3>OfG~+P4obbQ%fqutPWBkVZ%f7d?7R z9S{+EtQo7kG;O~8f)M+WhBzt{-_OP!VeoXZ=H*n(WEFl_EC_2Sx!bYF#>=OLn28j0 z^oYc%zXZ3EQT3(Eqno=1VHUD8aZAvElD_AlC0-h_m&Wz-W{1)JB5PI^viBJB8v3Ov zq-Ovum2dVFDBYm^cI#XWEI8I%^TyS8NqKGP#$;c6ZI)~Xy6au{wpENauiN92r8}V= z$=^D$_=Jc@YZ@LGRKy()1|vzm>juc)tJc5!iB1S1(6G|FUj?(0 zrqy)aUBR2>YIyuchcO-~@{<;Z)37O2yg;NYNV2!`?Q3R+St(wrSbG@MF3gK9bX}*K$yB3GN-OiT0uqtj7S_k+< zDftGjeyt6Bf7dB{O*C)^I6V!GWVPd%{;oP_ESQaqd6@wCAH^iQ`kWgXbppW0LY|!V zo)=p(0Yq4`6VIZXUAxwVR|p%pj-!?Z$%bF_v6})t!Qq>ugjzXYkCwdAf=DT9T%E*s zx72xn+@dIVwv1V0T<5#6hqj#gjJ`vyDzly-1tUJi8mc?u(H*ew2$ znrv_PN9vE_l}?_>0ZBH4TT8|-Xjf511A;qSkq{dh)*K6fcFrsNJz4NaTYDGzU&mW+ zeb)Rx{{Ptl*dp$7zHB(Mw{l`2f%|#xe`w`ggHyDC7?2r(HgF)OE66;tI)5L zXR6@rs$lJ8`9oTw;WrVEK}vL;cdIl`s|*mac%Z*ME`vlS`{kWgsT7OPcvzve&Fxm1 zFk10Bwf($jC1Y&ASQP%|;$|i5VFlTFs5I2CW!0~hASYQ(y6ZMTJynLO<7TDmVU-FV zJnh%q#ST(nqF?G^m9)0iu!SR9{>9B|Z30Jbkl}`;9@}Eeq=cY;bU@4MzN3k6>o&~} zNO8An%uIbHPM~WS{&F#bp_84qi+vJQ_*ig#3&(ekg-N-qY5d?p!!C-%=~HLZg-O(L z5@wEfuyIvNmWM<*l3kUgU6pT(7l|H_qMOw%?7mB3fF0K^-$VWfyD2F<1gG9v?%C!R zDE&rwcxt=L@9RrONhz*eHCLG?9}{}Hg?ZkR7j6h~7?qD_7hdde(nF*zvZdRiIL}`h zY&?I|YQCl;ZvFa|GUUUtPG|~?JU^TQtCM-D8gVgp;!OAHccSj-%i(}+4mVyUf!YwU z#fHI|qW4MO8f?Bs1iCnN-eZEYRv!Dk&0hXEs0_K9?Tm(zyM8t06zF0 z>6Fm9cetrgi5LV#n3ZV|ZDAH+pQ?Rze5GoN;1a+D0<-wp3FnYW)wgr17evrjVALf9 zhDJKvR2Tw{Toi?5R5v(2KR6N19)^K{Dm-25Co)N`&d1u4avh7%-pqPeO~_%_ zat0ES**!F|CEZE=Kp12a5d2yP`cvglkltB%c;*MTaA8hkOy@DeOF-yE9U3584|7}|>{+ncR8UPKJ$WJzs>jv4>@eDuQUnCTGLJjT5sOxE%QO^(sD<#LT^NFN3%L)580@1k zgf3IYjI^aH@T&#>A~ei?%SEVRu#JofVluhzZJH4MP$CV9H`s!qAjDw2Y@k=z1)f9Y zIt}AiC@^WWZPpg(SWhb)fiOHQLEKg->a0P`0a~ejFevITqq*RZ)#O=lC?Htre#E8O zJacr@l*T>jrg8wrFMKH|X&EgNK*+a}1h#PE%`S!^d z3=2I&*9bO7bP{AvqEcEo0D)?Dt6ti?uZfI}+J% zCyzM-@p6G*K8k&#-Lvd@Ayx8zZB2%B=rf27g&N0AfI}G1NC^8lu9fiX zQE;4~ALJ+ql!ov7fZu>`P9F;48!h6mk)eTCn9{qQYdt?6!tZ)%q`2s)Oe%>ZkrywKi`1hnBw-7ua(+6WxkZXY3R zH^37m|DgLw<>h_nfuig4Z6G>zCFfNFNw?!1-Uo zR<^rWz60OEG#c0S;=2zSD?p|T1doHAZAQ0(O!xrH2G$(w7C+x*qAMT@s^|8)Hen9;6A;kXY8-G&%Slxxt2dUZ{1p*BfaQ=!`C<$m zG`aErq2~yb2}sn8@qb{<0UfZ(=~lp;{)XgfwO*#s>OF zOvz;lP_-xqZ+sACd_xa`>G&<5l3%=;g}-T*&o9yzKWG>CSjaXry|pb*EcWGsVwpGU z?mE3Taj7QBG=9wnL8HnQl*Rv8ZhtDT+8U^x+y(E5eZVqm@~XW%gry%N1^bz)0kar+ zk|=ep?ZpK|F)P;oKAKI0)oGAC)bs%aJT2H93Jr@q-Jx4kOoIp`U*nM_)D(G&DE+}H z2-C>-Q~4n5+@x;mXSM)y)8pF}PzjgM{d2tY$WxOjDMaZ@;PA#c`PlOMiRQyUUbM3_ke2%9LbyU8D$elXwom9OF~3U@>tzD5O}JX?Lo*EAy^duaLC*nf#}{C|ouS7ZBS(Nsa5mZmGDNWuC`QdB_8~3xX5esz_qE59;3N6Ftx?986_j&F*PxUHq*^c|y z*NHuWj7y{jV+Tn)i!`R+Yqm|J*^z*e`8&DOph-Rci^sHqzB7lV@SIWv(?MK%VFN|S zy5Kra{E$jBdz`HRbkDVN1!Xk7+jU{#D{etScrZyqO`;0-=bD`sd_ro^ioa=QM*SYLyzca) zkh_pOE+`IF4avgpmDz+CY9gkfdEl*>LqGD`+TgADWnL!^p=8#rYKp;xl5RMTb#7<=JS*D6r5_S! zi7oA+QrWkP%JQIx^xEb)hxEp^)AY0ipofRngo&7m?<#I-Sn&T+;SL&Ts%srOAgTQF zcKagls`$4KrQBnnjyI=&>3AF4sAnPhUr4y*Yh?NiJv_@NE9!pzW5vhRcPkzh{{`__ z3bf+m|6;|k!9mc_0n~9weZnnp%U}2LiJLW?p%u$+1NfFt-XN}3v9EL)mb2-TmfTX2 zjW#xI5FI_!o8Qs&Cf8osx9b2L5=ScW<~-Rre0HFgmH>lS_Z{qNsQ_yQYooE}fbSs|x;zJ?b3W_m%?Bc63KGmPMQf+jDu|aK-6!1t~ zB%=r&s*NNdi8UOfz(j#!P&8?lLz6z&`K!9>RHERryen!1sUR${ZB{Q(9EDTra-Jn# zX6o*#D}Gcf8A`_p1~o*04%9@o;-VSkPDI}$S{AG%E(1{BjJ04leK#IsmpT`!+!Zl* zpT@}}(N&!tua00h6ovu@kHXM@Fj}0#uu_&{GAvI)XmeQA98n=yLpF#p3#6g5< zB3rg!X4O;}M)CG#9hu}LLayMT&r5C;&L9L{cdNLiJeq=RWS7z}TSFo;9n zdp1&TA9;w?>yyf_R$>N|{y>;t+QdRSlsv)9&W3$!CIL*x8MVR-o zRyp>%=K2!A1e4qlnr6I&L)#tko0+L4fFDI!-{ z2Oix?F{xV_emv1qp^j1%9hMGGQB)%$H~hIm(wD~cT38Gn{RpcxKTerB(riC%=2M?_ zZutBCi$--tcuYw&+=D7Nd~HIa)Np6|I3a#g+V+8jN*Fz9a!g*7JOEW$VJsU>g{+oJ z0^Nk(pXO}F1fe{&4+&dEIn^jPTugDu9V@tj`v*jW9}VzM;8L!h74=CDow~j*fX0-u zfSL>QJyYwsP+{~}gw$4^luRmAVy043k{J3YY9Z`DQHcnMLz=eLW_eL*Mx!*?I@9eJ}O z{MHFxc}}973pc1B^fegT%70A|ot;0PN2PLFB&8%AE$u`Qy&+}pz%BzSz+sH!L=8w8 zI2SxAY2pT?oRBa6UzAC}{z;iDb;i_McPL$-LtZp0hD;8fo8K(&XSm5c535MDp%FKO zIALZw24&-m%|xx*+cJ46jnBSfr*fma5bF36AC?)krDLSR0p#2Pp_v^*$=QKW z)F;l>puNI%1ua2a3|le<)!wxH2m_2+9Ept$y~69(AWUR5&S9(Sw>@g#lCRg3NWX6! zLDlf3M_p7ACZxcwK3?P`p=r;7fD+*n3P>x`(4Mfoq@Ci8PdX!85-lcDE=ExfG{<_AZ%;fZ^lmRO^R%u0Q&g9^lj;e6(!f#Lit zcwYA%VHavAt_BTXq#&Mi(k99FVoX4aX3IXo!Tl*X=X(WsLy*En6mUzMa0HWKbqTIm z`|-O}L^1FhV+9AeNFkD?D#3HbG#kioDU!ytvz^*ong-zc7M4%&g8io=s+u3kGu=>w z6h=4oV(p1`wS%|pNAOS)W5HlczVA5n6T$y{@`Xf={^Z^#NsedB!oawDefJg2rtaxa z%($`5yvYMZSZGv$`}`&kr7J&l5+# zB>`)OCMUI}Y50Iih9|+5lE=Bh91;j#2&BaAHcuBr%q!A&0FEKS^|*LWlw{vJ*4i03 zF!KYp``pSK&69N3URm9Ninda)-!D+y}L$0253tidzJcc&PH?OKh1^d)Zmv`AST6XBB}fr6J*6Uo##*ouo+bxWf-9@k!!kecqj;SfYLW5(*Job0 zesi39VKfxlId2*pQ6BO8_781lf++p&vRTL)>Ug60;K}(g=^{kwRP#&VQ zS)CL(Ck%%W3<_nRJ;di9$=UsAanRCC;j7?OL9Q?}!$Nqs9h;&2AS<&jHHr_Dk$2e$A)nt*VGb_e_gB8R zo-O(*j1`h#-mhKyY4~&0Pw=1Edr0&N6~MEREkgx-g|@FYUW+e4K%Jjus8OQ zij9DBg+?#+* zV!7l4bG2w^Y>WKx*3FG)1+4N_-P)!rZjl=ON!$7dk^cg%ItihVNn{;Gx9+JpE_Vip9%mE+9DAxAApNSib`Y|2`;pR#j0KA>dH zZvpt0;wW+F$3oz1Ubrw0`3PXmH07H5x*GO%oaRUGSby}H67RV3<)J|J%YrBC!Xl#HJp{pU|Z3tpVf8E5luwAw< zs}=;mlt!}d{%5dHfD-QWxqge_1?!-NNhNvAzv--nZLZ=+uYUJ(ugt;%IE7>#DO|{o zuzEA~T3l5xY(Qb`uzj&0+GSg3jSUAlN#@<*mZas5a=%MK@L8BtfJFQ^P*$J$UW~LV z1lQE7WBTUqU1>mZ=c?A&eq}w$u*^eBf&NG2wzyb;H3^N z(1kBU{(*Ykj9<_BOSjaf(RA@P$Fvc{_3?tPgHr6MvR)b_;3j@Cs8OQ?Ky@%>D6`>p zXHwGSuBX(jIZTf*3q-nYL=CL@etsYRjeNs-sH5DpQK9NA zxoJ(1P}?Q4)X8I%8P>Iej7i{4T5KZ*;&2fDu&}UGJI(R4f(hcdwtY22YBd}T#3vst)a;R`q!&?}1 zaTD4qa9e;o$pa3ER>mLap#+_2Dd(tCAub?9=z>iG98rfGZX#dZsm|kaGgI?26Bn`Q zlmJvx2%ovBwaqgf6{%QbNfC5y-BT0*a7n)%t2%;~O%gxGJ(2?tM|qj|GThih38DD> zqboyxjwF?t_KZ@G@>*1sItl=>Iky9h?Urh)P{_jr$8XAqg-nG(U*Ei1MGp%RCWW}; z07p1CFkNKv zfMG*AEYus9L>u;=+*-M7%FWG$p{3l2i2t;RF)pc=_|fcQX7~aIy8#9-F=4_&DJkJ^ zP8_TrjlSGel#a1hlm+4+K<2XN29O3qvsj~sYOUn~rUmwBb&w3pq(a=x!rau<)tW#` zi|RptQ4$fsLskQbIAdcUiWGi@1s>d~C|?x;dsL4k9BN}dVZf_IoqJa|@glET9?+hj z3Gp^cSPT290hQ>VEHIK1fX*C>{M#8vROmd+TBp2vtYn07NxVrj)@H|k4>BrB8)`~{ zD%W2)Z3p&Y?IQ8AnQ&o&sw93BmXc*kMyn!89X!tPH-g1+yiRKwpIE=Hc-dxu(QpgK zJM5OsSMvh7>^41>zgv!L7Gm0Qpm7(aP;BwvDkW11no)QH`~*HCY0GL=CZ~1rX7~OX z^TSX34O-D4FEa>!L7KV(%Rd=|0fPS0NQE0&>8~FhF(Dat4XT$=Lh4-)g`(MBzHKgTZcV_bo9L;m?$GC?~~2Ir323(T(91J$>o;)q>Xg$-cZ z@hLPNv(Vv=rsFOu9RhXKY(+k3jA=p<1c-{UXkg}t2~Jae9JAQPc09PJaKas>9xaPk zh*iQrSd7WHAMDCo6$BJ$@WHQvA>REV;J(vvkVpc{_csBGLnv-^>@f$nEKe{|IT^B& zAhXf9g^YP&q7tGKDKQ~{OW?!4y<)s%NK>A=5J22OJ6^>1Nn$E~p$t1Dkr+U%-`qb9JQxVt225gp+i%Z-69iQkSf-AYMi z)p4NVj#}JGEX4aePl{XmX1;yx@Tep%3XxuHEB(Nb-V+-eQBRS6wJ}WzPjcz_+Lt1EkM5<`WWl{ME_F}+Kuv^*7odVi< zunT{4nZb&BD{hJ?tb>=$icA**PKy#HvwCqqVES`D260MJ&empeLnS=%8Jf*OePL_; zSY;CP{!L*%R)m+jr0)4CqCYbv4UB8O#O(a2pb?c5-H9e~Xlp6GBtQ(&#~@KDv-a97 zQLzGj)W|kMJi7T^-(|^k^wi4?7AKTlPPpu^}=Cs68$(A zi}-rFcoJDub>rR7wWHm&5~qo1%?+coF&neIy8{B32p)t2sOja(aHE>yQ z8V7vv1K7W{>-LvWL>xE`-k=1}l+f^)CfYm)L^4K(9*CbYQ+FDI!YI3mgHbou*~_DgD3suXz|d$# zrmJV9Q{)*7xTIsb9;hYD!236$Lf%X_rN<7^No|m?rg1j+Nsm8B#CNF-Q{43bLmjsN zyE0RG@OZApP$DU`)m8#fzigK%|Cd9h0aR7fF~i;dBz+GUbU?MUF3%507{S&}p>R+^uG z?9<y+!ttpyxa=z(x5w|`7T)(5&?N6Rx4(voa{!mn_!8k5F zhEGf;#|pq4Op}WZ=eK_eC|Fs=#Ok1}a|k*zn9Y2iMBt^2!|=!rqIkB?gk)Ukh>A@| zgFh0UGu;z%`%SI*Be2^`et#7t!P*tj6kD0yV9O`^j0uS*_oc0JUP_$M*vZnQk4ay zT=iJnC#KQb;Y{xUT!qb*Va5AZ_+CciYh5rR?SmPKh>`$*_|WsTryPHF%w*BP$WK^(=4KqEhE70XrPoQ^ojoc;86-*Z}7zX+NHxYH5btm=q5 zXA|L7ZFvEiVtF}sW!G+?t&BTZW9R(=`wkzl09X_D+MkdcZ^Ln#0$rR;Y4bU|wgJL9 ziF=l||3csK8XtA6>L zBzjEY2_*(L#V`kdT3v-g53b@0k9qw>!rm5ebvEPqQW=D=?$-B6)}_r88~BKp2qm*di;E@i0eVt#_bQ)AC0EWyU%1z0uA zEK}IW`L@Ye<|^;GV#Ej8Wnx42hpbJJ-quS-pVciru zKP7m9`Ow%0T}$Mt%sW5^yXUW{>VeF9kMlf|wsyK8Jf-z>g4OQX)n$B!mhn`4g^1=!$EtS8-0)0S98!_qoS>WgGOL z%PUVb50yYbK|q>;zwZT<{}iVBVq&QDA8+`m**?nwCU}rp&+h(%c%^;gNaoM+ELiv* zi9*dt_ITvXO~A!aQ_nwGH8`+3?kR{*iOaTpaHbe`B=g?a+p|Ea?&V%A8WVmG*)$ra zg5iaU!brb>OT1h!)Gdd6M*JKaHArGu#!@eNjI2GxJ%$~bi-*6ejyH#kVt7Vr8z_*q z3CMRKDb=+=uYRefBAAc5X`$kZmg;96Zve$zcE1u5N1>k@pNnbU$frMnK2`uz=o~q* zn}IR$NxOX`G)}yi;0op=Xs~Hibm*j89z99K*60FYbe*uXSp?2=7|?mkn@3Ho-vrq` z`HI75wf25=aX>(TE+WRTdOKdXxrO|vW52j_os57LcYncwfS~@%F;ifHX=MXL>px|8 zHM2BMXj;Gb;@H#mgEJR;9qWDop!neBS?RLjtb-m2J5Wwx*dK)jH&)A$;&{M9 zCqQvyLZlwajz1fEmKFihTJMDG9vT57j1#LyB7wEb)3u#M#uDvc!5p=D%1{r{fpIeHx%;J6sH}l*5u= z*D+3?)GIL9TDj8Nej?3iE8@p+7n=H_* zyQ8dcf6$kF$Dgb;Qdzra2MNYFRrmeyYuL2QOG-Dzd5MQ?wOIMroBt{}oG3)nIt;9J z-a!Kbg8r{d(%Ia^#)R?Dk@-*EGfi2$bq=iVA8N?$2aC_^F5&H>7ps@c#R#Y^!ZD2^ zTGmtwM5kok2$v4Mz6P7M18^731GQCxA1>x!({1sa5l{56sMo@&6daF+WWSL^kB~g^ zdG+WiUN4=85P<#)b&z>|)I3ylM5U+cuzSan4zCGzy=fpTL4r0NNsY@h=}GD5WJ#wq)@n$h z&Dblx2a{k(KNy4~G37T^?w1BBW^qZ${GGZ9#LlY`4r<^x#!lJE08{*`mG?G_;fF)q@ zA`@zb>l=(;%$&MAPE_|@hlkF$`HCl~VHmyK{q<>oJ!Ph^LYz_e)AQld{zwhMt2RUr z?5hLn+tDw^H}7ZapXX0s?6SR@Kt>aKw|$;3TJ(CfeUT*x&uemCZ}!&C?f8G+g;0vN zB0z;mZh&}(2JoJMT*%AO=rxk#)RX6dWA2eT4-h(?2tzXXKLl3vUC9vpiTWbWLGP{>jH=WmqNsJ^1w;p=n7)B`0=T)wPv?O9luFJmMfVHiX!LIt*_sCb;(gb=W z2p-`uY!sf8$R^p46u?Et#X!hAIV0tfynsit|F$;BPymR7@%83{JJbr2un4bEPtKNE3_YwZLASCZvU*<3QLlXY1^zxq!j+583FMH6!M3bF|DGp{ z647dLzB+&Taji#kbkN&gXnRbYdj03k0izYXNK4axI45+4u3(ulnEXN4a$-}DjI%GR z0;)ZC#vRh@)=95`=D3w@{?}ff&EQ4@gZh$R>z@VND_p3Zu0!S)Id%uP#aR4iJioci z@qV{3D=nd~l&bh{?6DGl<#X4uIp;E?<-Cq-@Y!`JF?U_t&R08q_;g~eV9uQHAc8U9 zkG9A1TVkYo7#=GYBAD0^rFv@z1AL(jI&ITHs#X190a32@Ru27F8oko{_LEn%u~w4@#M2A)oj%XB;Ed95V?}+GmAEG*W84i(H!vN}0-1 zW`8v1S9MZ->-V=S-3(vm#BkmV2xxBFD&?TlAIPV(x}CO)hLkG#$<)$m=dy;7nv6o571*&J=ifQYXMQT;6(({mN!o zR2Z+1z>>Yc+m$-)ewF~koQ4C?_H2nbuSJF)%6azX-p<*Ni&fO?T;hLYD5=j}zq+^K ztiT@?XQwoR(b5HAL6mbf(vJs9n{<58w*HaUxsa-ys0vb_N(~P3`Sn^r_*dC5cM9d+ zjJ5QEip<3hv%Wfq!7fW+^U&nhZ`&2ACAVCd53AM*GC`ByK5I}hrJ994qF|RAZYkT= z`|{cW*4is}oxnKQD_53xTYvX-p)PM9mdPvSdB=zBc+9ELI3Q~Y(A&uEP3FiKddRe> z;6jRC^$;9^Q)%b&AGpJ@W)RU9bo108okUOaBI~L6R#ISUHOvzrAr?hxYE&(5Sw{T$ zPGTuPe3IYrluUwR#r1(Hil2NfYiY}mQa6*DT_Q@ob2NZ!& z3YK#Y1|YF_Y{(ZY9F{#8V52I@B`i!*m~Zg7P zd@NDFI?HTj!@Z0hvMY$qs+M9Dt>K(@SVm)txJ|~WPYIPq8f{EP22YSBYRDMetk))& z(l`f}ldN{MKyGv$=tYB=a&2)jbp4Vurdzb1r(etadpC^^)-i_bwMOUXe{Bwu?aQ-L z0{p;(0%ortfq#u$oSf}!)NQO8Eu2kk{(S6JMb^RfGogX}@D?45A1mewMO#orrbNku ztCoEJ1{L2KUugJyE3{|F?Th`$k&Wyd7$F-EphZ;D$sW%0QVc-&H_Ma1nMIA zhpxYB#{OH~pMtSbGj+iH92sh-OOCkFyxhc$Do_0p6>ROZJ#j_sOmk?_$98Fnt?qm! zaBP+>{NF#EYkzltmmDp8{(IeBTq!J}h1ahl07-hTEUm2RsX0*S}KlKoIP%7bxk=_|t7h(~> zZq+%YcLw0MTltPM(lmCU8gYd@q}H*8_Z?xcO3Wa?smiLzly#^Iyso^0{WH04>X4D$ z1qwC<3dj0~@OR1bj&}A=e|j}5w$3(y2~G4%cmM6)7;`R!Ia;U$2({Icln%a|FS#}8 zx=2*{o2M)fyV1y(YUisZUOa)rKwJIFSsKbY3Njew3f{cn%+4NmHqud^Y94+INba@( z@(~g)XV-0qk*WnK21K%3g2S|_o0E-Bv&m*s30qDNsKWtW+_5Zysb1&p2n?D{2Gm3& z2P}$8ola@*QCQON7{FDfjxQ>l4(TQepU<731< z&zD|7Th#|)Ra--$zY#mb&&lrffAVcHd$QG+j6?stOD6gGU!%0x*^n?R;G9etFuVKr zn8Vh^#?ZtOI4kp>-A$=)+U{{-b#0dj#))Y+g(a{-ur=ljs_I0Ekv83dP+--b<%}{j zZCpuT8coqwW(kyrv&x{lPDFk5+2(%p0=z)}e7O#Y-$D#SbK=+y(ju*Sqc}tR@00h` zuM=wyY$nU5)M)WYJ!gjIUGaB})xvg|rIdzPgRG&IDsl^6SUBMJZ|7Yyn9{NoFv z+V0%x^1SO1pPha_B65_toYgR-HnK{bVrNN?#JO%0WvfJyZ{16KQ5WYIxrw?%V`{n~ zY4mj=mS$if$yCke=vn%>pC7&v-#SXjrxjpQP-RRnkjYA5XL|Ie$$jOFiOoXPXHSeM zqo6TPgTJL)`b?@R%b*ZRO@`k0;aOpb-*4UWtp>OP*PQ(B^dMstPVpDrFpGGVLD_jA z?U2w37tc1osbMkstca-krVWwS`J0`)P+IoQ`r7T9TmCWQ5EMn7S=3PWF94Ub_HW^c z%U?}~=k`AgJ1FXoqlTgh{BYsBB*hIWXKn?{lX`ZPQ>wcq-B#}VVXeAmcdxpxWpqWN zx~@NOL-*;Z=?otPd5SVZ*=C{heCzty-4}+;<_ZSiYkVfF*_b<&j7&B|^LqE)=j}IQ zBVm|fC|5$6DtlDjGscZq?gs$NiHOCsDHv;6P93^(I567{a`-~Azj1UqnIV_I=JhSg z;k(?d5yq$ODW2OV9nN1c-B1*IT}M?8P)7=E=O=>cUZ1wHJ8qg(%wAxs5oM}_qja*k z6MDZ+{#r%Xb5rx$#{bH5TpsQEyZeKz7(6cSE+RCjysq{SH=P^jrrTWs9vwQ?gseAP zkA3U5n%Z0=GyQ7p|I^laM>UbPVSMPlnIKg}5m=gZ1U{NrRz(CwR)wV#10f(%7Lrh6 zs8WQ`MT7-WKR^;)7x<`4RRp99(xPDKp+f}ugdJF1U=H)g%$a-U`Q4d&&b{+K?|aV7 z;qGcZbsCA4KKqs~FxFc=+w$@>kD^Llh3Lm>Zf`gHY!OzJ{TcNZov=RH&1}jh*ZvhN zr?CfF$pQeOk^mqCu2|sjytkJr(0PIL)5F0PeG=t~K+gQ)<_WWe8SBZQ#{9>XhEM3OIuPf!sW8ybpB|8siApA!7DwwX2u&6Uvez#msDr6*$9fasqrU40%5}Mk&Cjp zW8*X*`^8C0ePHwxRsQ?rQ>=47dD&P7N8Z9A*%Te8in^IUETys{1A=cBo3A@l4bO?9 zqT|h2>?1G@309VEl!2*&TLe8=>09LiH%EGpy$vE+H+2ThuH^YfV|^$=5Xbt3n6=13 z=hQsPt7rTwmd>>%Y?rHeI7=ZlJ>PvnyU@Vxsb~c3Mp@I5#@9qL>`be?CX!^qo}~L> zb&&Fs7CBnI!p4*=h`Q{^f8y!+hLh{4rtVVblo;i!k4;i=-=*nkRZ8OK^y6dai=zaP z?w7sWrTZ^^(54djU&J<0f5!gW@Mnp7d|OCE3>P!|=_3Y1{GrYEjIv1t7FF)!*ow~) zfEDvHr^|x6pAl0(Yp)JGwh0!6Mf_&?IJSVBboGX|SXbzU!>Wk^731-oYN_yeV-?~W z)j%x{{-h|rMI>$df>jpD_czH_`AGZg`PSSiD}BU_dhE;y=U?m9iQ}a7BV{L%$1=^l z*oyx_@r$6=5HyY2zNObyc4lf6~oBO`rSVXP{Rk3AN{{LMl!LTN)zCb8Sr39aF zRf-ZM%_k=pLKQ7rNT~^HGw2RW@VQYq!9!}h;_o6GT9lkBpB-pbi!wlM^bI;u&=l0h zLi$O*erXR_Nys{W;N8rK0UNC3(e#)Bl@7kW=cFqO#OC7e`H{QD$SGLX=^}t3q(P-$ zrN$gB?3U*I-wXBX&LUnsh;X?H5&d~eLazy_fvz z(l$S$)xxQV)-}tE@w212mbU}P2Z(3dmhzcH4KMYu?QJQnt(!>7x%K zO<$>JIaC4h6>FF&vJY3L>GPb9Xn)(uQ;fe-_+vMQL}G0zgatE38t>V4qvE2~N`OnK z)8gngyh>knSD$~I(|Nx6Lo#f9o=vy#MM09PI0Sm;kB@f*`*^iT_L&o(M=~sPJ7D%t zHzhpW+9gZGLhjG9I&ntJdBq6al&TYXI3Xb%UAmYrx#57g`Cwi*uqnP<15Oj>RIIzJ zIP9Nk@7lsN!RAPfh;3Htvv?ZcJS~B`7fJq-{TB7b9_~+d6EoVY(6rFONUBft%T~dEbbBKzj*o9 zMID~BDF}~ivrbHK=zEF5eU0Z>YxS0zsy~zW5Qe0i>YABY$d?z@_HSAsn8Ku|ba^Mm zJ+!5ep=+L_mw0_%@;xK4in{!M@4(%rdL+Hp(Ar;>ZL<}fK>-*U6Qfn|QVN(y=K7%qk9dYRAmX1G ze>=2?3M0e0EL_1$IzXYoKH)gn^6$IH>5kWSCK@VV9vBds2IXjG0N~#z4+dNQl{!iCJ zecvCPJw+6#99nqUl`CL&=JCSJA{2@38)^LHQv?F2khvfIbc4jp zlOYGXaVP+4baw$Yp?d)b*K%7kWnp_+`<*0|0<~JZl#cM7QQ2p_pn7OLxT{A; c?U`cxqeF8O7H|e_%_;%F0h}JT@mptq1Fd|85C8xG literal 0 HcmV?d00001 diff --git a/fastbee-report/src/main/resources/templates/DEVICE_VIBRATING_WIRE_V1.docx b/fastbee-report/src/main/resources/templates/DEVICE_VIBRATING_WIRE_V1.docx deleted file mode 100644 index d744600db87e101b57ffc420018886b3c55eeab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1955 zcmZ`)cTm&W8vRKxQF>kKsuYP32rN~RwhIynF;r=h4PdAW(u@cgs>ljbBZ43$EVx8^ zQAFB;flve@prIuopakhfAshGo@!tC0yLaZE`DX6yoMUIr&LIi_01wcFkZ|vJ zOE+P#s_J6^Ai_ddv*4f`-a$7!?W3-Fhq|jr1_ngiwb^z-1gE3;`ct{H^t>mLOl^<2gugOZ+OvJS@-t-X%vD;i?X3XMO70F7 z+*=f`*Y;6*cWXPQiICiVcLLcT zh|un~$Y=-b{vnUrr?Y*vELqO51PbKPe*{!f-2+canQ0B=;guHa5*2w1Oif3v*d@+ST{3kW{iBLyJ;y%Dlx4v;~eoUNrX0OE%Sgh#X@zwI#Uzq<$D;we&%YlUXZe z?f&-6W<0b`m879&y*W5D>NQ`y88C=Ha36rT;F_f?U)>)wO!G`yeCw+0Qi) zWOj<|t|8GPq!MwdANZw(L5!PJsC-Y?PZpq&E26gXbmGR<9(-P?c*F_uru@3{j0BZg zOJ?%pC&8mI&GtnwQCqoQsK;F16jYc?Y+WZtA|_%s-%HH|^bxpHS|&*=jujaf4Wx7C zBpYH=?nKYLA}3+{`8>&i&|9hrao5%Sm4pIwd+`IQ#)Yf7jy;``P`Q>1+hBUrv<|_0 zrgAvKhi{OW09|~etSv;4$Zxkq*^l@o(lP8+`Te{<#=^xV#j}cFwlj~o^n1XoIH{ZM% za@yUy$+YTzc*@Dn&OI8nN9H{>NiS)ZYcH~ka7G#6E!&k@Uc50U6%FNfCikueibaJjg^iwXdXem(yssJhuN z24*ByHA>y!&eOm3>f}8L8`G%Lc zLXTTf{Jf!#A9Mte{*g2)DuLRKo9 zeeA(_oP>r8r5<%WtBoY3c5XvP%X9ztSun$%QeIGItX8Ibwqjp#03dnqA%U3Y)kI3! z5Cs=TyyRXHl*N|8BqE-BlW#5Jbc3#|NT@kB+;VtrhH2Pj+ZS@~7hvZssN zi?(eM@se^lt8QiqzKW)<(K;p<<{SN;Dws_m>LJ6=7xv(qcIOZZ^UN5^(ISv@v{E?q zF7zB_ZNmrsJZ5$(_HMM{A!m`I#zNnR=;%VfX;WiHrQ7xQ5q0G28n{@-?I~u_+mGcu zbIPsD;N8}S(+)_Rs>8G*S>{|uB)^^YF*Z^5|DS3sd;9yuvTXc+X59A;zW4oq(E%X# mm^`b+f26?o#P418-^2qJ@xMIQ&YF|!+ZT4$ZDHZq-_>6fsD4HO diff --git a/fastbee-report/src/main/resources/templates/DEVICE_VIBRATING_WIRE_V2.docx b/fastbee-report/src/main/resources/templates/DEVICE_VIBRATING_WIRE_V2.docx new file mode 100644 index 0000000000000000000000000000000000000000..ec8c2d4eb9a30ecc744d41dbe5374bbcc61821d2 GIT binary patch literal 38098 zcmagFV|XRox&|8CR>$ZV9h=>;?WAL;W81cE+eXJm$DDCG&Wv%>Yps3G-sjwN@1M$i zM%DM~t65`I&5FDfI0Oa=2nY;Fj0%lTm10p`5-14B7!(Ky`p2l2h^>vIv5ljivYVZ; zgARkMwN+D+jNFbH>f0FtmNHkSdj4B$@P!NnF-xy?QO~EWjUMHEIvf{}I6@b=k ze@x!_b;8Gm^ijlDEc}Jsz%*o(~KlS8*N?{HpK8 zU%HC-o!0#Gzf034Q)|5@eJVuli8FZic!Dpfz!l~1ds!;k*cTYPC(VDxkkJK^|Bo)Z zQA!Cud~|OU3-!3x#M+@MrO6sGV{;ZFN!X*`ibxzzN0-O8Wn#5I zb;z4(Ra`L~1&GKg>AI5NLQQs}4RV?`@|MiD0=^y4lao!VxlfrmZ3Za#*i94uW~xiM z&}@oX_JSFm)ndQ+&wxUM;g!rkPV?E1fKWdIGP34c~<;Myr z*uAINf{bd|4GN5y1P$m(xTH9S-*Vd>E1QhfcsBdw7NF2tGndwxaEoX7#*Tl3qp1b_ zdr*83QApf{pHVox2IkwEA=dhHwipdpRZ?L8Meo!6HKi%{_p#mx1v~_}+H7!%3}zka zU!mM&gY|5z3&B$)S*?o2c}K!Zs4^?Ts)F&K+sP1#_c5rC{rm{S63F5kP|I412|+SZ zOY=a(k_Qc>r*t9amn&cce(YF5IOA1o%IzL)YBA%jH6yM$*0w)=zh?IF{-lW*`1{*W zeZ_-Jr^1LgdiX#z>R%YVdjg_J+GmK>NUP1%Y#7ilj?D?;`T{(tnNrpMAMqTf;v6 z=!+Eu2nfo*_r<`@?yt5ekK3#

      #geLg+Y#n?nmJ;Kcj?5}Fm+z^jeVY*`p1m5hUE zW8U@ldJM(n3T6a`@ig!}H;z3o37J4Q%9^QQjz8v)$lGtgHPwUw2{DIuNR^*qAEAlx4I_rh&K?-}4%yNayy&ubvq z;f<#a#7gyLYN6LrXR$r%Lc_USY~ZgVpCd=-$dW7!Z2N9ebJYFT?PFW-8p?QLk)-aB zAf9-HmtU|%X;wv`H9y5BG^e5a)Q#ER{N~_9NT|97R|gHh-g`dCszpx}G$&YTM4@dr+v*s?*y&2vs3d5B(^WpZR6CeDE3lyh!YXdA{${DQH>uBUSp-Viiee4T*}~@gg}wpx310%#urAyOW2IZ8~pc0;BTV;JTbySslSgvgMdhj z{r!b?vHfAh`0=fEvi_Ky{+tM5EEwe&(E#0fkPd7wjjNsd}JvzMC0VbQ{CnfViOqLIaN^Yk%sAFuL|1yZ@baAV{l z;Lyy}f)0mZ5r1;`*hRKY8dk2va5AffNztFF`AoxitdP#& zdPz}^GNc!D%%~Urq{4w)`S>s)&$qFS+qB4=-vcP)orhxZo> zA*%=qu8@oM);P3}arfLh)C?#OolTti$}BInRJ}q2C$;Y8RZdSZpF1+{ntU`{s>3o; zJ5};;fTs{M<<*2x%avwej;E_&(#3keQRky8uIM` z)XYwilt5Q28RPi!T<63$6tLB2F+TV(hm0=8y0=#yYuoWvb&Jg*A`}Y+gA1O1uPMNVr0hz2XhFRvKz9m1EwyI7+Uz5SB!sRU@O}1l12Sf}a8oEE{6! z_LL+)myk?KNRZ;bLzWPY&K79?a;B}Jk%GR@S>&j=3t+6ImD?&sV^L;c41qB|j7udb zjwu-Mwf-8xt+z{`2{ry(=P%kh<(e!3B z=r4Zi#@$k}G|&4f0tYF}{-c;sV!@Du^>Pj!m__qPyhGSs`dmRx`8IaJ`MQ&k+RhPp zX1XyRm{Z0jM%w~C;0TM1UgT1;O6KRch2K0XB!xlk(+|Hf=o-rA$P|+IHZRtR(5GP( zjp(V>&g}_jK{H^EHkhJU&tod*AR&U00vBEF-B0AwaPO<<3WKk|t|hfDDO7AZ^_Wc) zX2m((1*t1_anPnojA43iCpNynrOM@a>vpBuj-lf;zH45Zjzl0@8ds4W0Md<6n6R<^ zKpP>$kC=>oNycJ@Ly|~IIwyxiF}shkbJKvxE>*;`CE8XqN0AoJ5niEG7UEwA2Nh%S zuZ~S`Kfjn4vxg`9jN`_N3fE&joTxtlYg3E4FV)}4MmFbX2BJ@dueGws||P; zS^HNQ^c*+{E!F<0@h&(FG}BM|t<_91gLg;KgsP5+{B~swm<@Pp`qWXsu+&y}@5vj! zoWnMzgVum^HL6(>wtEF*bH;Gj5$QXA)K>%5koqV(?AgW8eD1m0Ln45ZYm>gY@)_N+ z^1LI{PM;ox3|RyM2&V7%tvujSo~fLS41;sr7sqgkAG}hW$JYr^p$#BBqdAgDUfopt zIDezER8Ci=+N^t`@VQ5~}R9n0Q}EGTpCA|CD9OYJX=sOB~o z3q;kc8SiBmU7iJ!I^Dw$WI6JvLx3-HI|Sq~bJPm6kfy`Gd%4J=$vK?hth7CxQ`TCW zI~3MlRr#N)4n3kQo?Gbh+=^2n4hIjDQ;}yRR6J>Zz)2fd(Q{?^ao{a>HIKan>-i&^ z;a?tUOmFxnNj2X6ssa*u=x|46N<~2^@*M+yC5@{#4V*SDUnyx;^TmMO0fPMz#c0D@ zXG28GzS&yZ@=@%0+7gUNru0v{>qc_$oeZL|rG7sHW#OETZU8HhH)sePr@$z~cI6G5 zmNuR$GRfCnq(e=*lIBfFzot2KB`aZ1nj&YJx_>b7K6l_)ishtwYk`V6e&PL+{$tBI zH600GVxsqdCc+#W{#E*uMnM|T2bs)6~<3{WNL+6xM9UU3( zp6o2HP^-#N41$v+Lm0)MLP1sc5W;9V%~LEt~9eH&kVG?tI`;P}US zkl+eG00&Zq34`C3!t8T55E{!V0n zOKZc3PGr{)aL?|QLuEZbd8hPilLv>kQPQ6?5)2t*K1kjejn@=8<+Qg!Tt&#TiWru= zwvWAQnO9h5_N*?+tnyGYQRW4%u8m@_9*(>z&qlBfvpTBq=&MqEa6N}6n1<+Ve5yf6 zPPU_a2kF&hb?bFkrRBE3M!G}awrqo{e?KZj-SVQo4jCJT{_e%$4Di8-z~>cO7tW+{ zkwBz)-|t06I|@w?LiIiqeBjH2zWEryT!7U9L~+mI~u)-%k1ZFH_O{h^efx99BzJ5A@fi zI9G3HYaqBD1Lhe2Gi!zDg7rK`5RhsWND$@ z4UU|omzfXUmwXMic^F{hQ9~VmZYV88FK@F}Q=9Tk_zd;T-f>YEkCK}sO?|T$mq?ve z4$~neNO=6RfB%U^?hSa+(_?kvtwj`_@p`_2J@Tv#+dE_8Cpx_$6Uja;- z?(QmDQh?_eK5sj9_EA?B6aWfQ`eNE=k;)LtfB(4&K8ddl=L*)Tgci=AWL#%#zJ!&M0sDJuH9g zzC9e%E1q4SHOd8cQVP!v@M9zrwo4uHUQF{7bhp1fYT)N?v z_v-^?wA|Z81<-P@ZKtBc*eHQ0AK9wFg-GegZcLB0jf+EfYyzI%OH9OwfgxjZ;vtYF z{HnvCD3>~#ID)Hs0j2o~CHe`43`n94BpEspkzNQ%?GNERQ!_o3@>$PT^~~QEOUn7o zDYH)n$FKMp<}an}oxctGF@)23jSl&&>YcAYH78e@e6_oLodX4UI@A>F6Gv|Be0tt#OI%H0w;H)Y{)Vd13M{7elBBkB@$SPhFdRpD62 zxmWYowFB3_7R3X;;#!mas1*XlP{RnH?lZZ?-UUUYtF3d{(+ztsD#}UKz^JrG+5RC5 z^qfHACR};p*j44vBryC`;qVGM1QbSPlksT&3&m2fLYz0nAaBB{9FT>?6B%HNGY2xD z8fG^pX9Qxxv3MGBD1ix`kPtiM7prcOfyBT)9eM~xH~5i$iA^wnyZ9Dg;>Y&mU!xdHrR)S0>!KeTQa;l zCk|rzmjU(0qwnhLUJcz0E#p?drgfFzq#O--oztx_7iPt(@5xOUa( z6ZVPYB96LfU&hY+_`G-~^HV%M=8}rdRWMw%N;zG>QcooZE0%__6c%+nGFy#w9IyUkJGrx@a>XU7)8k7Yle1pAv?dE zvT2+A7S>V%owQs%1aDYe(}_d1(Uxnk}b@d*L_NbU0MaHQldok@w zaC`hBqMD*3TF5CmQgH$&nCuTSztyM6s)}i=sdwvvfUnxfcn0n>rTBzh4FU>rbgEi z&?_nKd+H2Uh8^g{&aZ?5_(hoSced`SPY#rROxw5Q%w4pd@3tr}+EsjdxowpRKaN?m zb&2!wkv-WsuI=@~ydOLBZGU@uP=g2-|za0X=_F@{5fV_K}~ZzEKPz>gdwA$ZeW@tvuG>iI#YC56+dY7 zFqQp0$X|mswg<1lJlSO9DOJ0b#oDoXSDM)kf)Ivmni)^LqNy-{*2DLGzT%ruwX5 zPFmg>sh0})?KeV)J-RBUerMe#W1?%#yr5Wxeht@495Pi%eP&M9tf z&&~_Ipa3}1Kgr1P?K^jag`tEP#8wDUnzmRYGpn@POaJDetJ^oOnjs*`gbqd%>2dIp zD8u?H;(kwz4=r%4MHkW(HyTcTz(60duP8FVjrhA*c2B8EVCB};hUj!*Ze7yK6_LV; zmT6C?fKRrc&oe35ohT~5B69C2+y z%_y_dqO##F!K)vw%YX~KM^rw610yAUBfH$a4)+vwOf6{<=V7VsoLvL~mo0?k$0W(~ zI>qYXHLCYUUjMgP%)uPtv@cZp-O5+Vw~c95S#G-L{9?np8&sC3_9e4NxDjn^=Eu5# zhP7mTY3QQZyf{-vllX^~iUe`5kM)i;p8Lb&nsbNA^Q+FaW`jkmV&5gvmhM(Mz~AZE z4;|_d8$SlBnWoZ2xi2hS6jKHoS_{*8qx^y7EjytqY>(~JEtADpD#7eH_`YP2qAs5< z&OSw<|N7}MVCVX15%3&+wSS7T$wTL{t=##&e>o`AE#xec=6nIxbctLbJEy%Kx6kn1 zc{x+UX)bE}2L(yKns0CuNKIgesSe47z*WWPrtXXwNrn4H+om#E=k2VR@KM?`&nBAJ zP)`}G7-g)24RVdGYgBeF z9-t@{9Y@D?-b!)B(Jqm0uV^s@8;?t+!}OgeW0L%gi@xa)V>El7VOePaQP0Z1QGG}U z7G70{VkwV2tghB8y&U* zg0nH`XLC)Bnc;S4&Pjn~AmskH1Wl1?;`O=#FYWNTic& zu)85$%l^`7*|XL|+s^5$7d0od(>^A6c3LO&#Zgv3EaoN&=1WxhmxfrkjswbA&uNoI zUKY{nRT-!RqqJ{}naGC9ZbX2SvKdQFt{q8h(3y!Wo7YmVH%E_v@@%Wn>}Z4YtzeL- zytJSCtahB~ZI#m##x_nZyQdY)J6akB<-}qtUcV>#LnWi!6B{@_6}P9*R?L1?C6l7x zrcZfS*T%~|REf2To|+SK=4pq3Ei3VosCyh?jgo?B*H}+P(+Qj6{Cq<0PQm}?TNdvK zfS;O=q3KcUGczY%!u{SYz*~iUc##j7!of6ih!xIgu`ZU_LYOfXvuAjoPl?9QMYeU$ zqxiK|>h*%XJWK?4!qFxp!5q7*6cLXuk0Yg^NX05NFj_S@&AH>)T6v82;(qgkxxov# z!!66r{k`~l{_V!I&BMLt@uoayhm9ZL5;$u4&J*L)gS^0H9*p}#nnKZuNcG|O7 zEnsweWj8w~vKmX!V3T6Bc&@>Q^y{+voYso?ghX6~FWB7YVf@KXw@ux^ySVNWh_`zG z$h}kDe7aA9Y}+p&VAISz8{u7}io6@KqQTPcT-~+Yr;?oL-n~Nf_PfhHcjouFhT;@; zkXZ`&)-rUqS@a?Z-_V4pC751@kYbBCZY)ZMvqOh3NABb~SUpTroH1-0F1QTu8oZ|f zw9K`GNlqPpxj)7%z9l>XcvqcEzj^d#arD_L(nUu;QXYpN<4QyO%MO=$>^dYX*b=V|J+o%C&HW|fK6e{Jm+PbS)1fPz^&Mtc9*sC^SJdFl+KA|_2{P4`VeTl23|ikB&j2rVJ_WX{Fwt+P>sONk@~>RNKh)jLmpjk5o7PE z-(UVj#Oe+pc)>Xi@OUYJk*?s~!Rx7sJ};HDFzxA{6qLk&kq?L)^3#hhgt(H^osSt` ztogXtYhhAiF_WOwfupLbXZ5Rb zQV^v%-&E3bD*wj-Mt@_u7xJx5I@q`k-aFn8=5zf*26v99=6(pwvL@N0JqgL$!qKjn}jISPz_m7n}m z4*XX+pZlNk+z|O1iyXwRj9cH%Y|VE^RNz5ny0y-%>4Fp}BgSQ*yE)SAK+%a@gpkgmPByXN>y2!0vnY#kx z3eu=EO=-#!I!%=O4q_e*u>8(xwu2hON(Z?q{e<{rQiE-crf9k}1x)wzHY{+CAU{NE zv9mhGD&#v4=EC@CQPS70%deV&?kdkaM;p@cd%%VKiilDU(?zR@H2wlzIM+O1ss$;B zP(lV3#uJJ)k`-AzptsjDulGuQox4h^l_>)qI!F`Z@lI088 zVY66(MZ+UX+3m*b__f~i07t_N@9gJOlUimaW##NFyyzox*|67D8F&Eq?SmzRxGldSanHI@L8}+@5E*iInqZf*vI(SjOynmuWGKy=EDG1 zbhn?E;u^kz7uHy4o|A2vC7qc6b^s>5jU2LGwQ-00cHZ3_lM;8n@?wI*vzOd8fEDS$8pi^>B>R1|O3FPNYaTD`}W zLnjIbe4t{(NgIuFrcz3?1KURj_Ye!@otPQ9i>_9Tn4l^iU=}#Y7)Z(x3zu)t%(&)Q zo~s|w&hgC&)FbL|bR*7&9f+CT<>sido&_r9C3Vw_%jmJ5vdB3V1u#c&7@&+HL`tYA zc`)MN)c!k4;cwPTsI>qwWQT$bEr(AtsmlOAccH)TkOn}Jh zSq8^*BsQkInixo`hfobjNYwM@rDtkmQKLu+8Bqfst!lRkRm0fq1q%g>kwOW2_drp> z4Qa3aLu(v^YUGWY(bJrSeAnxGSHKINC$vXq5$zlenWA!DtMNl-e-C=lYe-*hI}t|s z5%tK@6~`iC_qp;Pu&y@E6r+S<%t)AmaK#o(gBa?6Yn6g0#hS;&5{X-pHTtDCGLdPS z%6C;iO&3hC0rHIstKh0mJhsU}>L%0Ih;c zJaHP>Fe6!XaeNMi|E4icMW*WW{OJt&AK$+TKYZtGi_jIfc01SOxFYf3NB`|R-{=GK zV}rBYjbkn}XxQFw_?cxbY-089r;*lo(~RQ#e^cpD@JD4C@*kBu;D1#5`>IRV0oEP) zaUAONBG`ij3w_&PLH7h#-$4g^qnTr|MCpoY>4HfcvPLT5A@9$eL&Fp00ByHj|avjowS62=; z$N@NIE{lOgJXTNI%2_gc2sFG#zm%2rFn@6+kbJY$YBpRgq76^tu9gsxaZNaCA*U_W z3j;agenQ}eo;~w+IfY@M&T^f{btNfjomTri=4sKKVt=5V3N!ZH%^XTY;L{Cr z_?55uXMYDGOQ^$1iHGr&h8u=&kv9g2z3gA($?@crmf&l3=!b(W{PwZ{>0rW|K`u)L z`ak=0}=+oh%14SM13ylrx zKonbz%;FzF1qVh$N&H!p=V&Z0ASUK+mgCXw+$m1=qq&k9`%|>mk}pLvqeo!z4$_8D zs2g(9q1M~A7)WH)&6}zl=5EgFhYZC?HHUshO-%F-z2L-zTeQ4u3kSj&FEglO9|B&A~jeL+RLH|YG!pw>u!SH{O&+1ET zKSrl)t^fFkykB49QBmyyPOU`&W3JzE4*E!`Esn8EPj{=!uZ{1a@k={g)~EN*qcO>R z;KSi=YF9BtN#Qe{I#T#?lxU@EZOjlOb$(2jZ?`t%t#U|~C7nH`x`34ij2YS8GQD}AgVEKs<1!Gi>a;uM4eeR+aT z;Iyep1P{XbX@j<(*n-m18(^T6wI|JT9+qt`It^iET7G~}Wj3dz@=a&cF8r6b9@?aY z<|`a&I#j+nre128cMccJeKTW$lQ|d0suq z1qb7MJ*O~1kx5|dxtb}HO{c`Y7oBI#HwSC}qH+^8&w5-|Ucg|>Eo0ebn|01weT{36=x|DMcE*YE6p z+rCu!FOQn{#iKv}4eZ8a-smrr$E;Pr?xFVi#?^nBl+rrsDhm7CWJuBOmv{xFGNY_3PdF1L;pGaCUH^=WvrmL-8R`s0D}%HY|LtKWAwAll~% z$)Hd9lA3UZaCG$KDFY{%H&R`O2*w`uZmLBWHB4=uyaH@Tr38L?+m&Xa$Mgr8^nsud zL3~y$q27>uR_nWcJfR$LfnX{!In%L%UB_Px0)%^G4jcOX*M!mFKYgq^EayccgUhXtuZqH#wv-2Bw{CoEa0T7;O1u=V zOVMD;j^WDKqc>R&;4TLJm?piz_5{<9K?i*=|DfsqLF>%@1zt7a`Uef0(<8tHkVgC4 z*m@UoK}%%-ex2P_qZ7n7;G1h6%AJEpU8P8ODLwm)*biqQ zLU8YLReeCHbJ?3d)^(>z1Y@aF&=HfauN%S+WO2%5z+-HKX8itt ziyI>TBMw2>HSd9K&xrYwz_WojH0X02#4cFmh)PLJwC3f)8p$_Vd3i6A;K4dz0I=#%ZPE`A#)hOO!ZsmBRuED zkMNuW!S@8&wZZ-~yk@!Tf5KbVW!IZ9`7M$9kHVmxplhe-%l)VXlWkD8+A{PRWnK)3 zE@dQGKboWfFguC;RALlT&T{hIQs-{|-iV-VH-t??O=6;Wm=vy~@J0;`?rXZ~p2TNjPC^rLj5&M%}ZLXTOagR+~#1dJLW%(GF zt(S9xXMcE-T5{_bwB%85PC;%mrVejVO&L27jlIDF{57?ek>QWc6!>T={eq5K>tAWg zhtA+{EW5K*@F#3Beh4@RB>)o#U!*}=24A?%APl`fJBPW$xc*ke{!-O4^0I2{R5JCV ztN`b#{Xn|C+GN9hLu*TER>px&ey{|3z=7K;Ytdp(Dg5d4%}03sFA%|yOaguiLKAYX z+7bt9TsCs4dhk)OYx>^FL=eB>s7|TF9&tfz!XBMwVFq99QnyCnJ=tqbi-A~ade1Ua zi)lGDlAtm0&aqE_Q^8x7wFG^H0D5rv*HfwJ8Pvo_SOmD$Lp44+qZ~b8X|0!cK49$p zrUI{paiZoCtKsbTjYB}$r4riB7m#(do6~&M(8s*xpBazd`Vl2S_WQ@CO>aDdoE*|W zL|cby9lvBuz4sBj>48vN9~tz%_+KqJaiX3Gr{(nK<^}^62ZWy@)MDT)sTjDct?n<& z?LGQmG|jL!hg`h9x9udiEB|M!4(0fq%OcW#X&HH+5s~NqlV5AVLba1pn%?6Z|3h=P z`4`dY&#Q@SHoKc#r~ai0%e}-;O6!?G&ur^SR5P9JVdO?`T9cf_+ zzH}kP!iwfDjr+BYzjITm)#}g8x5)xBm!!_z?VgDGJElk?L9D#J<(#PgEXLf%!5PW7NDDV^sVPaOd{YSl{r! zfIsVSvkXU=eD{U(esb@jR?@Z2%z^VR#(J4?$nDk@gcMNzuJl24{B1Fcm8U-YKY+g) zLiUW09(^R?pA$^&59b}Z)Zx9^#o)U2l3U_W^cBD1ciG$uPOg7W_onSw;u8L0iGNNR zq`)mfX$`jghwEkK%P&q(3g22kvi`~I(H{=a6^G3&_;pu;e> zhyKWSrlno?@}r|^{y8nYFHai>t~APz`Pk>XYQ8~TSGj5Zx-9s#(|d@&pm@}`aR&vs zp!tbdsn;lJ+oZ1IM* z_TPr+W1bqJK#?Wxj38eB@w?ZUk%bs%6AGbaLxIWI_J)*rQ`nbPKjuyFsyJ~4o+-LQ z8j@3&x4s=@xNlemo!|nU0Gq!rdYiNFilN_rsh(i`00N}%3TsNq&T7ed5K-7}-PPk3 zI+~+sLbumm+nA>JYS%9wk`swvI)2+VXS?nx~tmaarchT2+>cQ@25A z=zO7GEZUxga})D_0@%y_0XPZ!3&8H)#UB7M+yOIu)=L<@yyePWnJH`6X%Y|#X3Cu% zh99`ydUbb%OkgXS*5wOm9aHuN{2ai6vm@|C0q?uw@3Y_8to%oTR>17wCkHU!ZC7~9 z;Sh9FZfp*iK6}8~ED`5sB8vy;uzgY)$Z$keJiHyjI%V45^oOkf(3gBS<=uw-Fn_Sq zYTFS3+Hvrc^?#OAgAW59ULUZK2`GKR@OnDEUEIJiBJ^S<;MIAd#p4r`zLL}D*%h5% zv~|UgDiyIyB^SAD=3M7kp02773H0VLE?3` z-s;537S&xgXw|VX+`#YN3}2zg7}(3aHc5*u0}?6!c$o*~ULsR6*KU$^ITPuA3a)*U z(6?{+wT7N!2plKH-X`F<**foy9I;49O!vYqv^-&4XlhTo&4KVD*@^AW~w|{?oh(RFg&-wzWD4Ejmt; zdfHT_6~;A-a~J)Ze62&JG_iA7l2c+*)XUX~Ne=ReRe?mMG-=mCVnzlUL&~YKF(OW? zdYbGn!SBY|r)v&zNF8Sl^+AVjU#_(1O^r_wikHz+hxNC!{KEQ(zuQc(5DlCS#B!(9Un5qjHB^Y4xyL_VMt@yA!Ui}6SN{QrEl+FR7@XKIFWy- zm?C}}Zr4q7eE+b?lIq4pMjfW)J={2PU8F*EH=S1;mnf_yWk>7ja>;BPeA)6cXGL+4f#)gvtUGau~{ zui@H1C=MLoPruh+wAD8>{%E8va`LGgzlRcwrLdI~@~;v6N2~hrb`?Y8>&nVy;>_W( zZLj{YB$5UeP+8LHF^Fx_fA1)mfSu=EVA?BG)km_;l0uc0Je5}G(d(f2?#$09=>Nv( zuAu=AMX6exz&4|@h) zUKW3D*;VmYlPqu1Fo#A}ZcCZ%wAGzs|N2~q`a)!q14p6|Z;;O6Qip=*l=i;ba64sS zAY`0|C~D|Xt_bkZD&ymK63hu@_P0KE7WmYDqFMZ=aT|{g}}!S{(aLTOFpl#L=lgs z7oP@I`3PFstXo2ME4P0+hk+oB(xpixXdTfwS2z!uObF5+E?p3k@sct#>&J%(8f6?e zP*VZO8`aZ5IEpC#IeE~{{eWCy##~|eEc_=ZOfX9;emSP4TJ%b1^>W?#o* zFUpAL*So+#h>uZnTw#V?#cb<bFNKSW>JiWPZKa5&lHvj9swxJH*d>!QAO zQ*InWP7u1KJ@WC@g)`F!x%!$XpX>g`=#~LE`SH(nF!&2$hzrf|O(94J2|xQyIm(Xd z_)Fi@*o0x4dEkmkqgNm!XL<+n^8!DvS@HG;j8^DWANQ!Fil0~D)4sx8cEtu_z)&xQ zVJtX*U|{^Y`VhfyxlqLlzfM=8DyDKbTQ(S=I-Hizis$)-{N!Qh{&Pu!{6+TxMEwsC z+#jH-{{mwF19T#Apes-)|Ng}?5aX}elCT;6Z-nf{o6fXW?B*~Gd0Q1!>croH(qxbi zvf{#UffyEIaFQNDt0HhfBC0AP#lL*O74)V>uXHG+@-akyg+t_}+l=#T%89N%6gm$V z&od%3!lUlx5JpoZE|jNIlwYG+ApEEcReJr$LG8y}IrgR**@pYmtned=-72Nh*FjxA zWNcMYIErWDd2!Hg#$%3E=v95Z@ z+vVaGZhFV@6el`2)wWT^etN%!@Xr2lVAJNk%v=2{XUpg2LJwd| zwY7eB7Xbw9x;5x_zaLERpJ%*3Uc5iOow{_q=1h-o=v+So&pT>rkS{KB?w*$}HoMmN zcEUwW3#4h-7XD25IqfEN)P zuVrm1hJWVlzn%f)-IQ|eTN?d8NhRMp!*re%CGnYxx=qCM4UIZdU_$*tGOX-KbQ7=su8c( z-vC$N7^jDMYHaK|w{hYc!^Rn1ZAffyJgGD;y^>DTtq#3aPuF^EIc#f|eyLhiy|%vn zFsIdk5?$qvQn;ISw&1wgF~3Te&P@rq@P6ssw8AFJN#K!me_;^Yd-Zu=+R&-z<+CB| z-!J*OcH^Bw$VIUBR?qi|hmf0y_uc7*XS4FYqoZbv-Wj=Kv1as@qN=A7O+;YgSI45) z50kd#Gt-VmQV$mHPg2tYMc6DpkF{&2NYE9-i?1D-zzw}ol^(|Itu3CZ$+E}l+r1mZ z*GJDEZEts5MD_P+T(`{3k8j>}uXh8#SNrcTST^jQ$d(ks{M1ypy0D&X?%Q3}KiL>v znfFNlYBqXMs+g|8V4YePc)zM?ah$-ieU^D+&~0#u<47Zt z@NFwj=|3T3NE0Ewy*F&^v=xj=^U-4;S9@_(HnCGQ9x&l!+YVD$43k-yiY`RUElj1B zX2B}(DE)N4%LpM;Y_M)s%FfvkjJ`1CfB`(OAm%=JI|mST=WO%_eGDCKe+=P#41Ku+ z3V5g!ymdeBh$FD|RNqaHuL7;b>oT+N(mM38)_xwI?E;S(_8~cnPtqSR@9d{t=0*H7 z-fFjO6z{aYkK4moi80p5MQm88*+v<1ddp~RZfvzw3~PE6#J^Sz^)pUKgzV2BJleN) zJv%)P>z2pmaJUdf6O?-Q!n*I5EFPA;>hy;YxzRmQfcF{il`Pum+2-x#wbI!kR_lRn z;K9GE^H*=`PVxQhi}OtBk5;lBR;o)tf}0+QOpLPQ4XZIE|KyoXg-eUS;~F1UkJ_>s zx=w@1(5&}xu&ZvqiJu8RJ98&{52;Dre?a+t^% zxbfnmdT-)MJ)M5Ii5C`=c!NAV4!L?AWaTLR#=GWQ_i7ew%R}o0OJ~a+)DTY`-6R#UbV|O4}Ss!q{rl0Ay~lwL)cqD#kFkR!ng$w?(XguB)B#1?(PyS zxVyW%ySuwP!QBa-K!Cg^=iK}5x&QaRe=yh##;%@g&RM&6ud3ZuORlyEPMvgB3$hZ$ zx*lv9?TePTw8(n3uaN(%S}#tY7@dBUz4+12S7lz75bARLv;nls=t+ZES8?0n5Y$?+ z9T`}4(hV@KN)%hrsh=8P%c0G_9@2waAR$8i^u7Z)yBNI&QT88puE)!oK@gRcfhVZH z0Z$NJ0#C#OPt=OFLfZcu0&f|n1>`jyw}*W1z0tp3{ocrJ$_5m#xbz*R@g4pT%6~Ta zPn7?e1r~b?qjqG!NDETsh zg!%TDauTmJ@LNx}Huj?X#X9ZFCjmesx1Q|GM)+S1k};0u4d< zjrRim`*+L`**y=gO{@iO?Bhsd{+ui{fH8k|ma*sgqA;AkYkA*=IYa{~#L>&M8OW$y z4z!cM*D7(W=Z!H|pa~J9U!xwPMGnTiEqkF(RIKYS2#XTC*kZpDH3T_1Qoc{bZn}~d zW<=-T5Y|+#kXU#4%7gDDNHfL1hBTP*XFAn7^KtTrFW_Cc;VpnI)j*Zkpp<%V`|+?4 zmTp*CRS*%V1-MnB4DNRatbRuh?Gk#ff!X^yAEgHKyItx|1ac52Tba}?AEhs$o7Byk z-+w76SZG&7%p7a>v%4n3VVM|}+%Lq#uqXNDb}TE=S7ET~Az>CobiXvE=(35D#}Ig> z$tU^vsB*YYVTWr~fjNHJKII#>5H#6`y5f!jm!&&^>)xdR|8Z`{%j-T*mb;!@U-y0j z-&@@%f{Wvt*VD^Oj3|G`q4%BU>%#tc{Y#^OE(e}WIm1iq+ILPyJbGIsyT?Vgv}l!^ zZn+V+oi=aJr`C;Z!?+@c0b$$Z_&Poc+dKlXw5o&SDehy{wW{oyyJ^fO$QOzaX9kUO z-11!$ge~0itmn18d$-rk()KQ)D460*n778R(@4jm=Q;+QbQjH&Mdgm3_>Oi}>{(XR zw#F_nO318$Po{W|lU$#MWqzRu2?e%3z&MPd?12$4!6-OSMAs-WLqE7l1qisBw=QGj znr`1It>@|mjPNaV$TtjpU%G$U5hWrE$YTr8*zBRq5jjBv-YzHU~}2+w6&AO+cB;MlWyxGGbM+s=)=+IT(iC| zs4joqiR$Lb3Iml&@WsxekJ=!{R=mZRSw*%%Kpi=MMg3KIH{Tqt1eIi7l-sq(bd>uY4+5{ z#D{vPw!}Lg#A<@w>UqtexFWrRV>gKS$Wa!yRbM)c*3%CsVWm0_A zk+MkPE`t-kKsI7)yY)rmvI)7>ao&VT@>Fq$HCJlmvRU8y-Cez*<5m^}Q^gNkm*|7h zn3V055BO8gW=k8NbPYDps!tV44hgE#zm*WM+XS!Nm#%BZym`5q6y*!cVX7}>6(n~w zSdJ6cn0t@&Ds5*af6PiJc+k3M zF`j=2c3WucC_j3A!r3?NmM`HboHpfcvOLq{S!x_(Tr7hg-xjQSGrFnWOpMrKJUvB) z-Mdx7_g9eByTT;=(&oa(ZU5%*&F_@8+tzigSzy{)DM<}6WX;~`p=jTFwEb3b1mCSQ z1yC=n>t1#q~RTdwshCk0C7W zy*`&ww+gufUJmkB&t1HmnG^E;7pHfgZ3IuAZMqL&3EUIU$b;!CEc{1rOe77VL_A^- zCs=U>MvF+!Z0Y-g_8YIy4nM|5HouRw;wJp~jQnxmLnd;JnHh>AU7C~_CRFkh5ygRT z>ODAeu!#w>$Z#V8wvwZ<%r8H9&jh?${Hv$E*r)WU%`6+9t|% zNL|?Km5wZlYH7YJ^))wg$Hr=~!K^t^ilt#xZ8xf z#vw!-)qdQ{YT)+UNFRDCR``9b%1{crI9GB0dNu#>#IRdh&HK=U^ECeE`di6qT%);;WJ+-flIZ2QCtC(ZUHP^c zn2_c3i&IGO!2&f@#^t`FmK)|-ETC?93fp)i(`zq-REVEKOW7)L<*?l1D6?3hDrt!a z``aOs$mL7%{517fV}pzC?t#NrEuJ(Z8jsm##f!DiU^^dvx};_-~ns7!o68+U}k)5V&XQ!$fO_+7Cetexa;#~vFmpB7>!Qqa*O z5~uzW+)75(moATP?iz$y$j-zqK?6$qo`aTnX~bR{*UOt7M)!-XSyjm1W5{dhm!^=O z0kBlQ*-xN!gYw(0b1|^sSZ~c6SKlS&wV@l6eeJbbvKi>Ecir1oG1|Otk4u*Bgmxr< z>%`&{A|9=2cwA5scQ_b~B=xQvAbYP`|L!L`A%sBRK3rdu?5qA^a21`RnzVlv%u1S8 z({*YTA)HZtaA0^olXlkDnqZe-L603Qo^a@u=d zY{>)=VaZNBi*9!9S`%I&Y~VVMS{5W5e$mHn3iJerZ;ldb<$OI_@P@OvX;toMg0K%=L$gERATpv%uw7*WG!@sHGG zd%HhUe-y8D@L>n2pcV}FYowcd86~La@0``RB)s$St zX7_jrcc$78qk4QPeoqcWDb|q}6l0TN%+mi_P27HDT-df#$-nw_V zOE+hEa)j(`__wCqfqkpDU`lG4$>v3f$!LjLIlZc=BKKGk+N8}}ZbG&VCbktbq8|49 zD!WSQ>IMR%1wwr3absKws40+9L(rr1)Yu;@9HPu7E-N>oBw#TZptPE&q}`#<>H4Uv z@liL;E7=^MI~RAFMYijtpSNM2cL0yc8L{!Q2o#GRTzE;VLZ&zCVVSDlF2&R8P9Hel zMMJq>K5;UNkP{GQv6}#VB6|#OSuSi*?bYJPrtWN_=wyE?T;WmF3qU*d{rEywifQZEd{q1oXBr@4A@2pCtSbWCA3axE!x5|Xk ziqEO-=RGSKWBbLT@HZDXD_IXK$j(Ehp?)o^eys#K$!gMFw*l&@GE5yeD^(AxRPf+w zzveD>kOC9^QV*-7wXKFN9MSSGZdPj(IC6swHzf7g7F#AI1ofi>T2}WRO?+FoX?8%0 zyH#Um>ML;qUAyp?ixCW+?6h6%lc2)Kg6ms2zH=;0%3V$42M-!{Q6x^EI-4#`qK=a= zbG(C%t5UK&B*KyGswC~Id|SLo^neuItZrfVT?zy2xOVv-@;}&3N!cMd_0Dq7Hn%|O zH^ReH+g*NNUouKcapkJH$~5_y(912%^On4DLx{tud_24GVuzC+B5jc^-4?}p{>otE z`J-0zH63y5*RPZzAC7fGQ&{Br;S^Y%%uCgXi?I`Dx=+6obw^(g2W)e=@hS<_hKMaT z49*n2Px97a^ED#S#i{ci6O^^`*zaxj^2Z^Ms>G6pqEAK2Z&q(cSD!Dngiaoa(PB;s zh^_+rCGLctzZ+6(3DS8^uI6X<>U1a<3uPOE*5ZTU_EK#37bSURp8-x?5|^@wF3lK) zT_}aidFwjubf6$o5Eo0v>Ahl~Y<@gkQZp&iJY*;th*Vgw0zmO#-sk}aXz~N_!S_g~ zgwDOgO@&ItARxl5OoM0(vk3cC?W^M}RZ|3)045Na#m`PShfJ!zom0Iag0=#qE+H^9 z(&47U5NPD0C?uo0!SVUQiD)KIr|s}C3#9UPRg6Y{l^+VlXF5YAbZCb?S#GWT6P9R7Mf~8MI+| zTLUOk5&av|0L0afWM>)?5Pfr~;9QS0aRn}*+VT?HEAua(Ap~c9?cf?+@$ ze+gCditOA3!_+^2`V27~2=gVwRsw*+Zr1f6lY_&yC9g0wEomS`gafLyp3l;Jy+rZK`vTHy$U;b95lwn9;74Pp+^O6`L|QGXfD1%Iq2&w@h%!AkcdF3skd zqnoBQ?nxg9UJd`*HA|WhAZ-ssEBGYW?!plKpCKrMVfJnoe@M+9V!lA!U^C3OPrhJS z=oz|3urZ>OAafG6y4mCWHy>KT#WzP$#lJ{$CGNePFL2M}0IBo(Q!gxkP*vE0LgkO(> z;{^R6M?s)8eBTHB27Gh+Pzc{>5r2&g4W!JhPiggs+$FDjHpn^huyr=Fb+@v0bxMqf z1WCh`-tAoL`SB2b*GnVCMMq^)NgRp1c!^x39&I5BTfj|Hrf*AWdm?%r(LSmliA3*{ zS*6iD75*Gmlr>g$G?=6NxbJ*4Q}fbS!8u<+2;I=vS?E{<)uTI>IjLG>EN@t$R!@1j zIiVTogY>%_<+rZ46kGRbW9=kc&n%YkR;L>ae05ALLR{a1-SEQ5#>Lb|;K+9S2w}Sc zo+$YT-A5`f?>i3^U7v3Q(WxsruM$YQJUL?@5^kSO==;w@R<=V|7zN02^o%vtP1E(vBlGMQh+xFjj;W-#wOxv#YH|k7{}Q&c z-M#W1_ztGgxULu9eaKh=GF>2e9PE6nlt!%C#;Wnbkuwzvqq|hGl~>H@j^|FJ*Bi?n z46ZSj8$VBJf~g_Y^&!>mc}X<)inB0Cv+&Mi4(>*$!8w+;7&y1<|96!36~f_Nvh+kc zx3z-n=c#j1x7QJt&!2UF7o8z@dM9+g-5B%3e0qdpFW<;56P$Ib^^nzR|={G3el|4lO|yJ{k+%3jyST?fwwdXzZFyp`FBcTcyis@8 z>9vVVHA$xNYc>cPRj!~c{>O6rQ+d_aK<(r%ct`95mQj;e?cE_P{TM0O&rA)N#mJLH zscUU7E+C3ovG(`TY$B{qgXE#64T!Rk1V04$Wuh=4^Bat zM!uiQ2Vv(XbyGjH1(=&2->!g4xP0!PMVOn!a{%TTpLzw0iPJ$L#llRxQ_WqezX18X$A@Ag zPB#czDHMw==^l9`e*v2$P7m8d%g4t4ON`_HQ;fM9+b@fz3hJ~pT_HsZ)?b>Myl3hJ z_1xE(<(fIYIkZ+;;9XOiTG-#XpM8y3sGAUVs%27W88+A58n(XAbJuyQS9!~J+`qm~ z>hWJZrVaF+IV^?elp>f8;?fHnC_2^! z*Ky*9RGQi2Yz3fuu9Yh&qv_qQ3kzRy3kt%6NfK%jRk%Ob?6lw$QhQ#kEP4EX+lrd{ zBGU9J7A)tG2GZxCDbZy|$o>Onx|sb37cRN4_DZ2j9({Y(gk+dxEhxEuM>H&WSKiIm zWI`^Wfnq1NC&3PA%;37ssJc-xg#h=84{b-(jH2jj@>~5u#R^-W(W^G<_mJgvryqsf zh1_vLaj0rY7Iv@9Cd5z^F$K*7Z^az?k=ND+Z^bY3I&lakvu;&W3?`Ix!*Q&0JA*#R z7IX&TV6~YHk>_@1UIyIy-*SMl$?J+14{XjPN0Cu6`p&{1J`_;lF+b&5(H<`SkT^?h zX%CgkzExC~2R)?MHpe-nH?EzgrzHSAJhUcE#7ulwaZAI3|Cb7P&_GjN>(Bv7<(IeH z7kO93zjY|(9s_l}IsHq=+t@}u3(5aN!X;lL(`V@6Sw2}&_v;@kKBm4~@u>JOh{sZ( z6(9c>D~1gYf`$&Djzj7bZY{mY+{Y(w)^LVaEV~WhTRwS%xK_o!(q&lArcYXOOGP%? z*t9`(^h|GlN7I{Jdu89Q18_(jsl=P}WaIGJfm&Ju3|`%Lu&bp4tQCxV2a%0za86wn zf8(;uScyjwsJ>!31&gnZ#-0Pdhgj(H9E{HSte-a@h>$5rFvAqBol>hHUVe0^bojLg z60bOc=8W|=nTBX`Bm={WY${Rj8s2~>?C3upZ&`>JBsdT@tLP_2*OrH#SbvThwHhl_ z=qFJCss4)P(qMvRuq7k7ktxR$-d^rOTW~}1dnXRMYI^NK5%ynZ!&Eb%8qO$ zaVs0)gfCpLF%fS?HW94;j#?*1M_+^9SbuK#j#}xb{x|9nPEz67AJn?wxW4&xzWXc; zD@`n@P)KRa#$l@VekaMSrdp=0d~(x;C*i=uq}d71!`#jGF_e%WGgHhKX!EGcKT&Dfq!#VFdNCMYyhu=GDMJ! zB6O%Wl7J-EaEt;I1&Tq@q*)G4`dsI)>Z((Tg3I!*s1c-su)wxiy+CmkPN~azmUx+| zyQi-BQLSVs9U~aj5CJ++6V-}~W{^7(eUE5au#&h8KzTFPg5C7pc#K`@T&Qwa#N2%v zCyzu|b#}Zug56LU3K%>JL;t~OaSFpqS>9JOzyWt^aRc?|Frqy6DydlCM4t?+0 zNNEQBaw!_puredQb0~YHZcFi&O8^%%Q<;8rCv#bf(!tc&AjV-8y6SE4#p`ll7k~LDq^BlvC!L}Ga)v67uXOht zUL&eWiO#SZ1??hH#7`ITYi^=mFQ&m&4h8Z2h(8X};pcra6Rb9}TV~(DscQwR({sf+ zBs4yvH8Oc(!_wouCwq;`Xxz-oER@0szzi%_nA}tGKDIZXNGP!hCcLyK`=f**lz=gr zfOxJIygm9jfmXv=L$(*8q;fGF?94JtkV2AW#&k;{j`}+eb%|* z@Aoen)fM3}CDCvXs@(9k35im}o$2F*_(^Ho2NEh_^rXo#c~SBJRAq&+Y%~?JS}F;2 z6MBD|vl$bF^3*;gY!&5Hqug*Y#UXdB;0Ep=5Dk7bz&n9Uxq4RACpmQL`nmubQ^o>n zF3k5#t>;38(O(f#TX|A4sZfcTN=Zp#=%1*Cu>V9QLJTG+T&$%?MNt0R0_|F$1#urR z-YuBw2v2w-x?hdhDfK`}^iWe6%3SOSr-3rrQc

      {863XE;{!Go%|2qeaLs@&5rO} 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 aitUaL%}vxk|nsYxN;_+a)j4JL|V4d}Ph zX2+GSW&rjVc`k2WAyw05k)zAQK}YBN2p_bf!uL0Mu<=5x1Q%#$rc^@SB8yBEwEgI2 zQI~fNFk>_9uQ47D~EHKyv$Y)5e1%0I-=v+Q9tur zB~Y|oJpN&%)#PmrO>ztx@h~)G2}oGDwEDJGwfkI!X(o8S$76pu(XryOP~j}#Y~qnUd%0wqVFlcDNurdy7zWy}L`+ ze;uu-8O2l13;-HJ0KiQjE!gkAhoXm{`vYJ4`oHh}6TIJ6M4hks0Jn3vXxrH7D(mW2 z3bB|nS1Ck}h-&GQ?ofWIub(tkj`PS-Qn5S~Z%d7_k}O$!8Osq;+GiF?2_^%3nqKR{N_xvFRPT4KdgLAX8|RB<9A+cr5^+z1 z9%C4G6?Km08E&YR=y<0M4;M=k=dn~>aIw+E>v&16nAYypubB{>1}}PG@yo*EFK9An zH5ZHMTG5WmzHi>8mGOe*%#|3m-*Y}j#}oHxc52^v6}!M+oHg8W>okmk8>+UUPN=Lj zJtfY=$oPuO?=ExW0ei!<)vdSDQ=HCbt}fF(xtENlmII_Y76(^Buk5Ozm>aMzt6 zax15|gjHa9c$qY*0^S;3p+psm8uD$&+mt4qr$hKpY{>TtAH1DTSUT#a`bZ~U?WsVh z;^;~E)u*_FLgNav`z$PDW1zTTYsqeDNEPC@^|oTUZLm+1oA8sQpjJ`RHYS|=(Q5Z= z*-f$+IYrE06E%Oc3NIn;C6azOih$w)_@Tyvo;IOb3poLtaK07U%qNk3YIq z*{Ra5MTJ#xFT{TGa&Y!Q-ln`jd+!)3*C%RWAio~InMasd_t$Sea?lak&LX(Tj>6I4 zAo4QYXk~b-Phmvq<36*%V}2EDa95I3mAwfosPO7P8$O$%MtU}}6Mg4Eoi3~Avu!^0 zp#pz>E!hpP^yyr0SaJ1!0M@k}*m@-t8iez)PQpak5!5m4-hnGL(~{m6k5sp*Q*j&I zBQ5+x?PovhUKPo#d_R89=-v@I`VPk26YZ3tR1ZSvJI;=u%i? zXR2&M^{>FiLUz;LEjh^gl=6bA5%=KE20z1r#h_5%N%(QO>^^F-9+&h9iPMriN-R4l2uOj>PheC|DKsJB+;7%&oC(|=PjDRS%4%$e-g zgVC5B+Zl_Lu$lGrva;89XE%qezU`SdvB1n382Om~f2z^#?avcQxAFg(aX&Wr(f9vF p2Y^Th2))IBq`;5FA6@m|#A7<~zdROZ&cgcr3lsek==kB!>JMuwhNb`j diff --git a/fastbee-report/src/main/resources/templates/DEVICE_WATER_LEVEL_V2.docx b/fastbee-report/src/main/resources/templates/DEVICE_WATER_LEVEL_V2.docx new file mode 100644 index 0000000000000000000000000000000000000000..d40d586008c0e12f61a02985fed44376219b1f61 GIT binary patch literal 38101 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 literal 0 HcmV?d00001 diff --git a/fastbee-report/src/test/java/com/fastbee/report/renderer/WordRendererTest.java b/fastbee-report/src/test/java/com/fastbee/report/renderer/WordRendererTest.java index d7a46e34..dfee0018 100644 --- a/fastbee-report/src/test/java/com/fastbee/report/renderer/WordRendererTest.java +++ b/fastbee-report/src/test/java/com/fastbee/report/renderer/WordRendererTest.java @@ -38,7 +38,7 @@ public class WordRendererTest { @Override public byte[] resolve(String templateCode) { try (java.io.InputStream in = getClass().getClassLoader() - .getResourceAsStream("templates/DEVICE_CRACK_METER_V1.docx")) { + .getResourceAsStream("templates/DEVICE_CRACK_METER_V2.docx")) { return in == null ? null : cn.hutool.core.io.IoUtil.readBytes(in); } catch (Exception e) { throw new RuntimeException(e); diff --git a/fastbee-report/src/test/java/com/fastbee/report/renderer/WordRendererV2TemplateTest.java b/fastbee-report/src/test/java/com/fastbee/report/renderer/WordRendererV2TemplateTest.java new file mode 100644 index 00000000..727b331f --- /dev/null +++ b/fastbee-report/src/test/java/com/fastbee/report/renderer/WordRendererV2TemplateTest.java @@ -0,0 +1,223 @@ +package com.fastbee.report.renderer; + +import com.fastbee.common.enums.MonitorCategory; +import com.fastbee.common.enums.ReportPeriod; +import com.fastbee.report.chart.ChartGenerator; +import com.fastbee.report.data.MetricData; +import com.fastbee.report.model.AnalysisResult; +import com.fastbee.report.model.Conclusion; +import com.fastbee.report.model.MetricPointData; +import com.fastbee.report.model.QualityAnalysis; +import com.fastbee.report.model.ReportModel; +import com.fastbee.report.model.Statistics; +import com.fastbee.report.model.TrendAnalysis; +import com.fastbee.report.model.WarningAnalysis; +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import java.io.InputStream; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * V2 专业模板渲染冒烟测试:验证循环表格(conclusions/metricPoints)+ 图表 + 概况总结 + * + * @author FastBee + * @date 2026-09-10 + */ +public class WordRendererV2TemplateTest { + + @Test + public void testRenderDeepDisplacementV2() { + WordRenderer renderer = new WordRenderer(); + ReflectionTestUtils.setField(renderer, "templateResolver", new WordTemplateResolver() { + @Override + public byte[] resolve(String templateCode) { + InputStream in = getClass().getClassLoader() + .getResourceAsStream("templates/" + templateCode + ".docx"); + if (in == null) { + throw new IllegalStateException("模板不存在: " + templateCode); + } + return cn.hutool.core.io.IoUtil.readBytes(in); + } + }); + + ReportModel model = buildDeepDisplacementModel(); + byte[] docx = renderer.render(model); + assertNotNull(docx); + assertTrue(docx.length > 0); + String magic = new String(new byte[]{docx[0], docx[1]}, StandardCharsets.ISO_8859_1); + assertTrue("PK".equals(magic), "渲染结果应为有效 docx(zip)"); + + // 输出渲染结果,便于人工检查排版 + try { + java.io.File out = new java.io.File("target/test-output-deep-displacement.docx"); + java.nio.file.Files.write(out.toPath(), docx); + System.out.println("渲染结果已输出: " + out.getAbsolutePath()); + } catch (Exception ignored) { + // 输出失败不影响测试结果 + } + } + + /** 所有 V2 模板均应可渲染(占位符语法校验) */ + @Test + public void testAllV2TemplatesLoadable() { + String[] codes = { + "CRACK_METER_V2", "DEEP_DISPLACEMENT_V2", "AXIAL_FORCE_V2", "STATIC_LEVEL_V2", + "VIBRATING_WIRE_V2", "STRAIN_GAUGE_V2", "WATER_LEVEL_V2", "RANGING_METER_V2", + "INCLINOMETER_V2", "THERMOMETER_V2", "RAIN_GAUGE_V2"}; + for (String suffix : codes) { + InputStream in = getClass().getClassLoader() + .getResourceAsStream("templates/DEVICE_" + suffix + ".docx"); + assertNotNull(in, "模板缺失: DEVICE_" + suffix); + } + } + + private ReportModel buildDeepDisplacementModel() { + // 场景:设备配置了 3 个监测物模型,但只有 Z轴位移 有数据 + // 其他物模型(X轴位移、温度)也应该在报告中显示,标注"无数据" + + // 第一个物模型:Z轴位移(有数据) + Statistics zStats = new Statistics(); + zStats.setIdentifier("zDisplacement"); + zStats.setModelName("Z轴位移"); + zStats.setUnit("mm"); + zStats.setCount(144); + zStats.setCurrent(new BigDecimal("-499.928")); + zStats.setInitial(new BigDecimal("-499.92792")); + zStats.setMax(new BigDecimal("-499.9272")); + zStats.setMin(new BigDecimal("-499.928")); + zStats.setAvg(new BigDecimal("-499.927747")); + zStats.setMedian(new BigDecimal("-499.927730")); + zStats.setDelta(new BigDecimal("-0.00008")); + zStats.setTotalDelta(new BigDecimal("0.02554")); + + // 第二个物模型:X轴位移(无数据)- 会在报告中显示"无数据" + Statistics xStats = new Statistics(); + xStats.setIdentifier("xDisplacement"); + xStats.setModelName("X轴位移"); + xStats.setUnit("mm"); + xStats.setCount(0); // 无数据 + + // 第三个物模型:温度(无数据)- 会在报告中显示"无数据" + Statistics tempStats = new Statistics(); + tempStats.setIdentifier("temperature"); + tempStats.setModelName("温度"); + tempStats.setUnit("℃"); + tempStats.setCount(0); // 无数据 + + TrendAnalysis trend = new TrendAnalysis(); + trend.setIdentifier("zDisplacement"); + trend.setModelName("Z轴位移"); + trend.setDirection(TrendAnalysis.DIRECTION_STABLE); + trend.setSlope(new BigDecimal("-0.000439")); + trend.setRSquared(new BigDecimal("0.1053")); + trend.setDescription("整体波动较大,无明显趋势,日变化速率 -0.000439,拟合优度 R²=0.1053"); + + QualityAnalysis quality = new QualityAnalysis(); + quality.setTotal(144); + quality.setMissing(0); + quality.setDuplicate(12); + quality.setOutOfRange(0); + quality.setCompletenessRate(new BigDecimal("1.0")); + quality.setDescription("统计期内共 144 条数据,预估缺数 0 条,完整率 100.00%,重复值 12 条"); + + WarningAnalysis warning = new WarningAnalysis(); + warning.setStatus(WarningAnalysis.STATUS_NORMAL); + warning.setDescription("未配置结构化阈值,暂按正常处理"); + + AnalysisResult analysis = new AnalysisResult(); + analysis.setPrimaryIdentifier("zDisplacement"); // 主监测指标 + // 添加所有物模型的统计数据(包括无数据的) + analysis.getStatistics().put("zDisplacement", zStats); + analysis.getStatistics().put("xDisplacement", xStats); + analysis.getStatistics().put("temperature", tempStats); + + analysis.getTrends().put("zDisplacement", trend); + analysis.getQualities().put("zDisplacement", quality); + analysis.getWarnings().put("zDisplacement", warning); + + analysis.setSummary("本期深部位移监测数据显示:当前Z轴位移为-499.928mm,较初始值变化-0.00008mm,位移呈稳定趋势。"); + analysis.setProfessionalAdvice("专业分析:位移变化稳定,结构状态正常。建议保持现有监测频率。"); + analysis.setSafetyLevel("SAFE"); + analysis.setSafetyDescription("监测指标处于正常范围。"); + analysis.setControlValue(new BigDecimal("500")); + analysis.setControlValueUnit("mm"); + + // 添加所有测点数据(包括无数据的) + analysis.getMetricPoints().add(MetricPointData.builder() + .identifier("zDisplacement") + .modelName("Z轴位移") + .initialValue(new BigDecimal("-499.92792")) + .currentValue(new BigDecimal("-499.928")) + .changeValue(new BigDecimal("-0.00008")) + .changeRate(new BigDecimal("-0.000160")) + .maxValue(new BigDecimal("-499.9272")) + .minValue(new BigDecimal("-499.928")) + .avgValue(new BigDecimal("-499.927747")) + .warningStatus("NORMAL") + .build()); + + // X轴位移无数据 + analysis.getMetricPoints().add(MetricPointData.builder() + .identifier("xDisplacement") + .modelName("X轴位移") + .warningStatus("无数据") + .build()); + + // 温度无数据 + analysis.getMetricPoints().add(MetricPointData.builder() + .identifier("temperature") + .modelName("温度") + .warningStatus("无数据") + .build()); + + analysis.getConclusions().add(new Conclusion(1, "统计期内深部位移由 -499.92792 变化至 -499.928,位移方向为稳定。")); + analysis.getConclusions().add(new Conclusion(2, "平均位移速率 -0.000160mm/天。")); + analysis.getConclusions().add(new Conclusion(3, "共监测 3 个物模型:Z轴位移(有数据)、X轴位移(无数据)、温度(无数据)。")); + + List chartData = new ArrayList<>(); + long base = System.currentTimeMillis(); + for (int i = 0; i < 10; i++) { + MetricData point = new MetricData(); + point.setIdentity("zDisplacement"); + point.setModelName("Z轴位移"); + point.setUnit("mm"); + point.setTime(new Date(base + i * 3600_000L)); + point.setValue(String.valueOf(-499.928 + i * 0.001)); + point.setNumericValue(BigDecimal.valueOf(-499.928 + i * 0.001)); + chartData.add(point); + } + byte[] png = new ChartGenerator().timeSeriesChart("深部位移时程曲线", "Z轴位移", "mm", chartData); + analysis.getCharts().put("timeSeriesChart", png); + // 附图:其他指标分组图(模板预留 chart2 / chart3) + java.util.Map> grouped = new java.util.LinkedHashMap<>(); + grouped.put("X轴位移", chartData); + analysis.getCharts().put("chart2", new ChartGenerator().multiSeriesChart("其他指标时程曲线", "mm", grouped)); + analysis.getCharts().put("chart3", new ChartGenerator().blankChart("暂无数据")); + + return ReportModel.builder() + .reportNo("REPORT-20260910090000-0001") + .templateCode("DEVICE_DEEP_DISPLACEMENT_V2") // 注意:模板文件名是 DEVICE_DEEP_DISPLACEMENT_V2.docx + .fileName("D1903E4N060G-自定义-监测分析报告.docx") + .periodDesc("2026-09-09 20:58:18 ~ 2026-09-10 08:58:18") + .period(ReportPeriod.CUSTOM) + .generatedAt(new Date()) + .deviceName("固定式测斜仪_1") + .serialNumber("D1903E4N060G") + .productName("固定式测斜仪") + .deviceId(20001L) + .category(MonitorCategory.DEEP_DISPLACEMENT) + .categoryDesc("深部位移监测分析报告") + .metricName("Z轴位移") + .metricUnit("mm") + .analysis(analysis) + .build(); + } +} \ No newline at end of file diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java index 798c181b..59c7c707 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java @@ -400,6 +400,15 @@ public interface DeviceMapper extends BaseMapperX { */ List selectDeviceListByDeviceIds(@Param("deviceIdList") List deviceIdList); + /** + * 树形设备列表专用轻量查询:只查树所需字段,复用简短列表的权限过滤, + * 避开 is_owner/sub_device_count 逐行关联子查询 + * + * @param device 查询条件 + * @return 设备简短列表(仅含树所需字段) + */ + List selectDeviceTreeBaseList(Device device); + /** * 根据监控设备channelId获取设备 * diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SubGatewayMapper.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SubGatewayMapper.java index 4dc5d5a0..0e7b7ca4 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SubGatewayMapper.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SubGatewayMapper.java @@ -118,4 +118,12 @@ public interface SubGatewayMapper { * @return 子设备ID列表 */ List selectSubDeviceIdsByGwDeviceId(Long gwDeviceId); + + /** + * 根据网关设备ID列表批量查询网关与子设备关联(一次查询替代逐网关循环查询) + * + * @param gwDeviceIdList 网关设备ID列表 + * @return 网关与子设备关联集合 + */ + List selectSubGatewayListByGwDeviceIds(@Param("gwDeviceIdList") List gwDeviceIdList); } diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceTreeVO.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceTreeVO.java new file mode 100644 index 00000000..59a09f17 --- /dev/null +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/model/DeviceTreeVO.java @@ -0,0 +1,78 @@ +package com.fastbee.iot.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 树形设备VO(用于设备选择器,网关可展开显示子设备) + * + * @author FastBee + * @date 2026-09-09 + */ +@Data +@ApiModel(value = "DeviceTreeVO", description = "树形设备VO") +public class DeviceTreeVO { + + /** + * 设备ID + */ + @ApiModelProperty("设备ID") + private Long deviceId; + + /** + * 设备名称 + */ + @ApiModelProperty("设备名称") + private String deviceName; + + /** + * 设备序列号 + */ + @ApiModelProperty("设备序列号") + private String serialNumber; + + /** + * 产品ID + */ + @ApiModelProperty("产品ID") + private Long productId; + + /** + * 产品名称 + */ + @ApiModelProperty("产品名称") + private String productName; + + /** + * 设备类型(1=直连设备,2=网关设备,3=摄像头) + */ + @ApiModelProperty("设备类型(1=直连设备,2=网关设备,3=摄像头)") + private Integer deviceType; + + /** + * 设备状态(1-未激活,2-禁用,3-在线,4-离线) + */ + @ApiModelProperty("设备状态(1-未激活,2-禁用,3-在线,4-离线)") + private Integer status; + + /** + * 是否为叶子节点(网关=false,其他=true) + */ + @ApiModelProperty("是否为叶子节点(网关=false,其他=true)") + private Boolean isLeaf; + + /** + * 子设备列表(仅网关设备有子设备) + */ + @ApiModelProperty("子设备列表") + private List children; + + /** + * 设备完整路径名称(如:网关A / 子设备A-1) + */ + @ApiModelProperty("设备完整路径名称") + private String fullPath; +} \ No newline at end of file diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java index dc4d0c69..c103324f 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java @@ -432,4 +432,12 @@ public interface IDeviceService { public int updateDeviceBySerialNumber(Device device); + /** + * 查询树形设备列表(网关设备可展开显示子设备) + * + * @param device 查询条件 + * @return 树形设备列表 + */ + List selectDeviceTreeList(Device device); + } diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java index cec4da61..25b7c26c 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java @@ -87,6 +87,10 @@ import static com.fastbee.common.utils.SecurityUtils.isAdmin; public class DeviceServiceImpl implements IDeviceService { private static final Logger log = LoggerFactory.getLogger(DeviceServiceImpl.class); + /** + * SQL IN 子句分批大小(防止过长 IN 列表) + */ + private static final int SQL_IN_BATCH_SIZE = 1000; @Value("${server.broker.port}") private Long brokerPort; @Autowired @@ -146,6 +150,8 @@ public class DeviceServiceImpl implements IDeviceService { @Autowired private DeviceMapper deviceMapper; @Resource + private ProductMapper productMapper; + @Resource private PlatformDeviceMappingMapper platformDeviceMappingMapper; @Autowired private DeviceUserMapper deviceUserMapper; @@ -2374,4 +2380,149 @@ public class DeviceServiceImpl implements IDeviceService { return deviceMapper.selectSerialNumbersByProductId(productId); } + /** + * 查询树形设备列表(网关设备可展开显示子设备) + * + * @param device 查询条件 + * @return 树形设备列表 + */ + @Override + public List selectDeviceTreeList(Device device) { + long startTime = System.currentTimeMillis(); + // 1. 轻量查询所有设备(包含网关和普通设备),只取树所需字段,避开逐行关联子查询 + List allDevices = deviceMapper.selectDeviceTreeBaseList(device); + + // 2. 收集网关设备ID,一次批量查询所有网关-子设备关系(替代逐网关循环查询) + List gatewayIds = allDevices.stream() + .filter(d -> d.getDeviceType() != null && d.getDeviceType() == 2) + .map(DeviceShortOutput::getDeviceId) + .collect(Collectors.toList()); + + Map> gatewaySubDeviceMap = new HashMap<>(); + Set allSubDeviceIds = new HashSet<>(); + for (List batch : partitionList(gatewayIds, SQL_IN_BATCH_SIZE)) { + for (SubGateway relation : subGatewayMapper.selectSubGatewayListByGwDeviceIds(batch)) { + gatewaySubDeviceMap.computeIfAbsent(relation.getGwDeviceId(), k -> new ArrayList<>()) + .add(relation.getSubDeviceId()); + allSubDeviceIds.add(relation.getSubDeviceId()); + } + } + + // 3. 批量查询子设备信息(轻量查询只查网关/直连设备,子设备需单独查)+ 一次性批量查询产品名称 + Map subDeviceMap = new HashMap<>(); + if (!allSubDeviceIds.isEmpty()) { + List subDevices = new ArrayList<>(); + for (List batch : partitionList(new ArrayList<>(allSubDeviceIds), SQL_IN_BATCH_SIZE)) { + subDevices.addAll(deviceMapper.selectDeviceListByDeviceIds(batch)); + } + subDeviceMap = buildSubDeviceShortMap(subDevices); + } + + // 4. 合并设备映射:网关/直连设备 + 子设备 + Map deviceMap = allDevices.stream() + .collect(Collectors.toMap(DeviceShortOutput::getDeviceId, d -> d, (a, b) -> a)); + deviceMap.putAll(subDeviceMap); // 添加子设备 + + // 5. 构建树形结构(用 Set 判断子设备归属,避免嵌套遍历扫描) + List treeList = new ArrayList<>(); + for (DeviceShortOutput d : allDevices) { + Integer deviceType = d.getDeviceType(); + + // 网关设备 + if (deviceType != null && deviceType == 2) { + DeviceTreeVO gatewayNode = buildDeviceTreeVO(d, false); + + // 添加子设备 + List subDeviceIds = gatewaySubDeviceMap.get(d.getDeviceId()); + if (subDeviceIds != null && !subDeviceIds.isEmpty()) { + List children = new ArrayList<>(); + for (Long subId : subDeviceIds) { + DeviceShortOutput subDevice = deviceMap.get(subId); + if (subDevice != null) { + DeviceTreeVO childNode = buildDeviceTreeVO(subDevice, true); + childNode.setFullPath(d.getDeviceName() + " / " + (subDevice.getDeviceName() != null ? subDevice.getDeviceName() : subDevice.getSerialNumber())); + children.add(childNode); + } + } + gatewayNode.setChildren(children); + } + treeList.add(gatewayNode); + } + // 直连设备或摄像头(不在网关下) + else if (deviceType == null || deviceType == 1 || deviceType == 3) { + if (!allSubDeviceIds.contains(d.getDeviceId())) { + DeviceTreeVO node = buildDeviceTreeVO(d, true); + treeList.add(node); + } + } + } + log.info("树形列表统计时间:{}", System.currentTimeMillis() - startTime); + + return treeList; + } + + /** + * 子设备列表转 DeviceShortOutput 映射,产品名称一次批量查询(替代逐设备查询产品) + */ + private Map buildSubDeviceShortMap(List subDevices) { + Set productIds = subDevices.stream() + .map(Device::getProductId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + Map productNameMap = new HashMap<>(); + for (List batch : partitionList(new ArrayList<>(productIds), SQL_IN_BATCH_SIZE)) { + for (Product product : productMapper.selectProductListByProductIds(batch)) { + productNameMap.put(product.getProductId(), product.getProductName()); + } + } + + Map subDeviceMap = new HashMap<>(); + for (Device sub : subDevices) { + DeviceShortOutput shortOutput = new DeviceShortOutput(); + shortOutput.setDeviceId(sub.getDeviceId()); + shortOutput.setDeviceName(sub.getDeviceName()); + shortOutput.setSerialNumber(sub.getSerialNumber()); + shortOutput.setProductId(sub.getProductId()); + shortOutput.setDeviceType(sub.getDeviceType()); + shortOutput.setStatus(sub.getStatus()); + if (sub.getProductId() != null) { + shortOutput.setProductName(productNameMap.get(sub.getProductId())); + } + subDeviceMap.put(sub.getDeviceId(), shortOutput); + } + return subDeviceMap; + } + + /** + * 将列表按固定大小切分,用于控制 SQL IN 子句长度 + */ + private static List> partitionList(List list, int size) { + List> parts = new ArrayList<>(); + for (int i = 0; i < list.size(); i += size) { + parts.add(new ArrayList<>(list.subList(i, Math.min(i + size, list.size())))); + } + return parts; + } + + /** + * 构建DeviceTreeVO对象 + */ + private DeviceTreeVO buildDeviceTreeVO(DeviceShortOutput d, boolean isLeaf) { + DeviceTreeVO vo = new DeviceTreeVO(); + vo.setDeviceId(d.getDeviceId()); + vo.setDeviceName(d.getDeviceName()); + vo.setSerialNumber(d.getSerialNumber()); + vo.setProductId(d.getProductId()); + vo.setProductName(d.getProductName()); + vo.setDeviceType(d.getDeviceType()); + vo.setStatus(d.getStatus()); + vo.setIsLeaf(isLeaf); + if (d.getDeviceName() != null) { + vo.setFullPath(d.getDeviceName()); + } else { + vo.setFullPath(d.getSerialNumber()); + } + return vo; + } + } diff --git a/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml b/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml index a6ba4d5a..5d756484 100644 --- a/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml +++ b/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml @@ -419,18 +419,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update iot_device set things_model_value=#{stringValue} where device_id = #{deviceId} - + select d.device_id, d.device_name, p.product_id, p.product_name,p.device_type, + d.tenant_id, d.tenant_name, d.serial_number,d.gw_dev_code, + d.firmware_version, d.status,d.rssi,d.is_shadow,d.is_simulate ,d.location_way, + d.things_model_value, d.active_time,d.create_time, if(null = d.img_url or '' = d.img_url, p.img_url, d.img_url) as img_url, + d.longitude, d.latitude, + case + when (select count(device_id) from iot_device_share du where du.device_id = d.device_id and du.user_id = #{tenantId}) then 0 + else 1 + end as is_owner, + (select count(1) from iot_device d1 where d1.gw_dev_code = d.serial_number) as sub_device_count, + p.protocol_code,p.transport,p.guid,d.project_id + + + + + + +