From 119e854f111f8eeebc271c13e60a9613a74d5fe6 Mon Sep 17 00:00:00 2001 From: wangshilong Date: Mon, 9 Dec 2024 11:41:11 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B2=BE=E5=BA=A6=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/decode/impl/FactorDecodeHandler.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/FactorDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/FactorDecodeHandler.java index b40a2c2..f1033f4 100644 --- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/FactorDecodeHandler.java +++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/FactorDecodeHandler.java @@ -4,6 +4,7 @@ import cn.hutool.core.map.MapUtil; import com.isu.gaswellwatch.modbus.data.ModbusMessage; import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.springframework.stereotype.Component; import java.math.BigDecimal; @@ -29,14 +30,28 @@ public class FactorDecodeHandler implements DecodeHandler { @Override public String decode(Map commandPointMap, String value) { + String factorStr = MapUtil.getStr(commandPointMap, "factor"); + if (StringUtils.isNotBlank(factorStr) && NumberUtils.isCreatable(value)) { + BigDecimal factor = new BigDecimal(factorStr); + BigDecimal numberValue = new BigDecimal(value); + int precision = MapUtil.getInt(commandPointMap, "precision", 0); + switch (factor.compareTo(BigDecimal.ZERO)) { + case -1 -> { + return numberValue.multiply(factor.abs()).toString(); + } + case 1 -> { + return numberValue.divide(factor, precision, RoundingMode.HALF_UP).toString(); + } + } + } return value; } @Override public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) { - point.setValue(this.decode(commandPointMap, point.getParseValue())); + point.setValue(point.getParseValue()); String factorStr = MapUtil.getStr(commandPointMap, "factor"); - if (StringUtils.isNotBlank(factorStr) && StringUtils.isNotBlank(point.getParseValue())) { + if (StringUtils.isNotBlank(factorStr) && NumberUtils.isCreatable(point.getParseValue())) { BigDecimal factor = new BigDecimal(factorStr); BigDecimal value = new BigDecimal(point.getValue()); int precision = MapUtil.getInt(commandPointMap, "precision", 0);