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);