From c446496609a8c7dae49d49d0d29f8aa3642a0b27 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Fri, 9 Jan 2026 17:17:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E6=95=B0=E4=BD=8D=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mappers/ex/DeviceInfoMapperExt.xml | 3 +- .../dashboard/back/vo/data/BaseData.java | 3 ++ .../back/service/common/CommonOpt.java | 25 +++++++--- .../impl/DeviceDataAccumulateServiceImpl.java | 7 +-- .../impl/DeviceDataMeasureServiceImpl.java | 7 +-- .../dashboard/back/util/CommonUtil.java | 47 +++++++++++++++++++ 6 files changed, 79 insertions(+), 13 deletions(-) diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceInfoMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceInfoMapperExt.xml index e682c5f..3e20449 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceInfoMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceInfoMapperExt.xml @@ -20,7 +20,8 @@ device_info.gateway_info_id, data_provider_gateway_info.name as gatewayInfoName, device_info.unit, - device_info.data_mapping + device_info.data_mapping, + device_info.dashboard_decimal_places diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/BaseData.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/BaseData.java index 4231e9c..4a32f7f 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/BaseData.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/BaseData.java @@ -56,4 +56,7 @@ public class BaseData { @Schema(description = "data mapping", example = "{\"default\":{\"1\":\"漏水\",\"2\":\"漏电\",\"3\":\"起火\"}") private String dataMapping; + @Schema(description = "数据小数位数", example = "2") + private Integer dashboardDecimalPlaces; + } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java index 6ca7fad..e4e59ce 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java @@ -266,6 +266,10 @@ public class CommonOpt { public List getLineData(Long companyId, LineDataSearchParams lineDataSearchParams, int deviceType) { List lineDataList = new ArrayList<>(); for (String attrCode : lineDataSearchParams.getAttrCodeList()){ + DeviceInfo deviceInfo = getDeviceInfoByDeviceId(lineDataSearchParams.getDeviceId()); + if (null == deviceInfo){ + continue; + } LineData lineData = new LineData(); lineData.setAttrCode(attrCode); try { @@ -328,9 +332,9 @@ public class CommonOpt { try (ResultSet result = preparedStatement.executeQuery()) { if (result.next()) { if (deviceType == 2) { - processResult(result, lineData, lastDayValue); + processResult(result, lineData, deviceInfo, lastDayValue); } else if (deviceType == 3) { - processResult(result, lineData); + processResult(result, lineData, deviceInfo); } } } @@ -349,6 +353,15 @@ public class CommonOpt { return lineDataList; } + private DeviceInfo getDeviceInfoByDeviceId(String deviceId) { + DeviceInfoExample example = new DeviceInfoExample(); + example.createCriteria() + .andDeviceIdEqualTo(deviceId) + .andFlagEqualTo(0); + List list = deviceInfoMapperExt.selectByExample(example); + return list.isEmpty() ? null : list.get(0); + } + private Double getLastDayValue(Connection conn, String date, String deviceId) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy_MM_dd"); // 解析日期字符串为 LocalDate 对象 @@ -386,7 +399,7 @@ public class CommonOpt { return null; } - private void processResult(ResultSet result, LineData lineData) { + private void processResult(ResultSet result, LineData lineData, DeviceInfo deviceInfo) { try { // 用于存储 xData 和 yData List xDataList = new ArrayList<>(); @@ -417,7 +430,7 @@ public class CommonOpt { // 将 rawData解析 添加到 yData // String value = extractFirstValue(mapper, rawData); - yDataList.add(StringUtils.isBlank(value) ? "0" : value); + yDataList.add(CommonUtil.formatDecimal(StringUtils.isBlank(value) ? "0" : value, deviceInfo.getDashboardDecimalPlaces())); } while (result.next()); @@ -429,7 +442,7 @@ public class CommonOpt { } } - private void processResult(ResultSet result, LineData lineData, Double lastDayValue) { + private void processResult(ResultSet result, LineData lineData, DeviceInfo deviceInfo, Double lastDayValue) { try { // 用于存储 xData 和 yData List xDataList = new ArrayList<>(); @@ -477,7 +490,7 @@ public class CommonOpt { //只取每小时的最后一条数据 for (Map.Entry entry : lastHourData.entrySet()) { xDataList.add(entry.getKey()); // 添加每小时的时间 - yDataList.add(entry.getValue()); // 添加每小时最后一条数据的值 + yDataList.add(CommonUtil.formatDecimal(entry.getValue(), deviceInfo.getDashboardDecimalPlaces())); // 添加每小时最后一条数据的值 } // 将处理后的数据加入到 lineData 中 diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAccumulateServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAccumulateServiceImpl.java index 6971924..c537cc4 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAccumulateServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAccumulateServiceImpl.java @@ -24,6 +24,7 @@ import com.dongjian.dashboard.back.model.DeviceRawdataRealtime; import com.dongjian.dashboard.back.model.DeviceRawdataRealtimeExample; import com.dongjian.dashboard.back.service.DeviceDataAccumulateService; import com.dongjian.dashboard.back.service.common.CommonOpt; +import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.util.DateUtil; import com.dongjian.dashboard.back.vo.data.DeviceAccumulateData; import com.dongjian.dashboard.back.vo.device.DeviceIncrement; @@ -131,9 +132,9 @@ public class DeviceDataAccumulateServiceImpl implements DeviceDataAccumulateServ String deviceId = data.getDeviceId().toLowerCase(); // 填充今天/昨天/去年值 - data.setCumulativeValue(getIncrement(todayMap.get(deviceId), DeviceIncrement::getTodayIncrement)); - data.setYesterdayValue(getIncrement(yesterdayMap.get(deviceId), DeviceIncrement::getYesterdayIncrement)); - data.setLastYearValue(getIncrement(lastYearMap.get(deviceId), DeviceIncrement::getLastYearIncrement)); + data.setCumulativeValue(CommonUtil.formatDecimal(getIncrement(todayMap.get(deviceId), DeviceIncrement::getTodayIncrement), data.getDashboardDecimalPlaces())); + data.setYesterdayValue(CommonUtil.formatDecimal(getIncrement(yesterdayMap.get(deviceId), DeviceIncrement::getYesterdayIncrement), data.getDashboardDecimalPlaces())); + data.setLastYearValue(CommonUtil.formatDecimal(getIncrement(lastYearMap.get(deviceId), DeviceIncrement::getLastYearIncrement), data.getDashboardDecimalPlaces())); //处理111状态映射 // data.setStatus111(commonOpt.buildStatus111(deviceId, deviceId85To111Map, deviceInfo111Map, realtime111Map, objectMapper)); diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataMeasureServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataMeasureServiceImpl.java index 5a3dd2f..30e35d3 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataMeasureServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataMeasureServiceImpl.java @@ -18,6 +18,7 @@ import com.dongjian.dashboard.back.model.DeviceRawdataRealtimeExample; import com.dongjian.dashboard.back.service.DeviceDataMeasureService; import com.dongjian.dashboard.back.service.common.CommonOpt; import com.dongjian.dashboard.back.service.common.LineDataHourAggregator; +import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.data.DeviceMeasureData; import com.dongjian.dashboard.back.vo.device.LineData; import com.fasterxml.jackson.databind.JsonNode; @@ -173,9 +174,9 @@ public class DeviceDataMeasureServiceImpl implements DeviceDataMeasureService { .collect(Collectors.joining(",")); // 设置 data 中的属性 - data.setMeasurementValue(measurementValues); - data.setMaxValue(maxValues); - data.setMinValue(minValues); + data.setMeasurementValue(CommonUtil.formatDecimal(measurementValues, data.getDashboardDecimalPlaces())); + data.setMaxValue(CommonUtil.formatDecimal(maxValues, data.getDashboardDecimalPlaces())); + data.setMinValue(CommonUtil.formatDecimal(minValues, data.getDashboardDecimalPlaces())); } //处理111状态映射 diff --git a/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/CommonUtil.java b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/CommonUtil.java index 047c7ec..ddd3965 100644 --- a/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/CommonUtil.java +++ b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/CommonUtil.java @@ -1,6 +1,8 @@ package com.dongjian.dashboard.back.util; import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @@ -10,6 +12,8 @@ import java.util.stream.Collectors; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -20,6 +24,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class CommonUtil { + private static final Logger logger = LoggerFactory.getLogger(CommonUtil.class); + private static final String decimalsRegex = "[.](.*)"; private static final String hexStringRegex = "^[A-Fa-f0-9]+$"; @@ -761,4 +767,45 @@ public class CommonUtil { return multiValueMap; } + /** + * 控制字符串数字的小数位数(四舍五入) + * + * @param number 数字,如 "12.3456" + * @param scale 保留的小数位数,如 2 + * @return 处理后的字符串,如 "12.35" + */ + public static String formatDecimal(Object number, Integer scale) { + if (number == null) { + return null; + } + if (null == scale){ + scale = 2; + } + + try { + BigDecimal bd; + + if (number instanceof BigDecimal) { + bd = (BigDecimal) number; + } else if (number instanceof Number) { + // 包含 Double / Integer / Long / double 等 + bd = BigDecimal.valueOf(((Number) number).doubleValue()); + } else if (number instanceof String) { + String str = ((String) number).trim(); + if (str.isEmpty()) { + return str; + } + bd = new BigDecimal(str); + } else { + // 非法类型,直接返回原值 + return number.toString(); + } + + return bd.setScale(scale, RoundingMode.HALF_UP).toPlainString(); + } catch (Exception e) { + logger.error("非法数字格式: {}", number, e); + return number.toString(); + } + } + }