package com.ruoyi.system.controller; import com.ruoyi.system.domain.SysUnitConvert; import com.ruoyi.system.service.ISysUnitConvertService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.math.RoundingMode; @Component public class UnitConvert { private final ISysUnitConvertService sysUnitConvertService; @Autowired public UnitConvert(ISysUnitConvertService sysUnitConvertService) { this.sysUnitConvertService = sysUnitConvertService; } public double ConvertUniter(String unitType, double oldValue, int oldUnit, int newUnit) { // 查询旧单位信息 if ("temperature".equalsIgnoreCase(unitType)) { return handleTemperatureConversion(BigDecimal.valueOf(oldValue), (long) oldUnit, (long) newUnit).doubleValue(); } else { SysUnitConvert tempUnit = new SysUnitConvert(); tempUnit.setUnitType(unitType); tempUnit.setUnitOrder((long) oldUnit); SysUnitConvert oldUnitInfo = sysUnitConvertService.selectSysUnitConvertUnitByTypeOrder(tempUnit); if (oldUnitInfo == null) { throw new IllegalArgumentException("旧单位 '" + oldUnit + "' 不存在或不可用"); } tempUnit=new SysUnitConvert();; tempUnit.setUnitType(unitType); tempUnit.setBaseUnit("Y"); SysUnitConvert baseUnitInfo = sysUnitConvertService.selectSysUnitConvertUnitByTypeOrder(tempUnit); if (baseUnitInfo == null) { throw new IllegalArgumentException("基准单位 不存在或不可用"); } tempUnit=new SysUnitConvert(); tempUnit.setUnitType(unitType); tempUnit.setUnitOrder((long) newUnit); // 查询新单位信息 SysUnitConvert newUnitInfo = sysUnitConvertService.selectSysUnitConvertUnitByTypeOrder(tempUnit); if (newUnitInfo == null) { throw new IllegalArgumentException("新单位 '" + newUnit + "' 不存在或不可用"); } BigDecimal oldFactor = oldUnitInfo.getConversionFactor(); BigDecimal newFactor = newUnitInfo.getConversionFactor(); // 检查旧单位转换因子是否为零 if (oldFactor.compareTo(BigDecimal.ZERO) == 0) { throw new ArithmeticException("旧单位 '" + oldUnit + "' 的转换因子为零,无法进行转换"); } // 计算基准值:oldValue / oldFactor int scale = 20; // 设置足够大的精度以避免精度丢失 BigDecimal baseValue = BigDecimal.valueOf(oldValue).divide(oldFactor, scale, RoundingMode.HALF_UP); // 计算新值:baseValue * newFactor BigDecimal newValue = baseValue.multiply(newFactor); // 四舍五入到合理的小数位数(例如10位) newValue = newValue.setScale(10, RoundingMode.HALF_UP); return newValue.doubleValue(); } } // 温度转换方法 public BigDecimal handleTemperatureConversion(BigDecimal oldValue, Long oldUnit, Long newUnit) { final BigDecimal THIRTY_TWO = BigDecimal.valueOf(32); final BigDecimal FIVE = BigDecimal.valueOf(5); final BigDecimal NINE = BigDecimal.valueOf(9); final BigDecimal TWO_HUNDRED_SEVENTY_THREE_POINT_ONE_FIVE = BigDecimal.valueOf(273.15); // 使用原始值计算 BigDecimal celsius; if (oldUnit == 0) { celsius = oldValue; } else if (oldUnit == 1) { celsius = oldValue.subtract(THIRTY_TWO).multiply(FIVE).divide(NINE, 10, RoundingMode.HALF_UP); } else if (oldUnit == 2) { celsius = oldValue.subtract(TWO_HUNDRED_SEVENTY_THREE_POINT_ONE_FIVE); } else { throw new IllegalArgumentException("无效温度单位"); } if (newUnit == 0) { return celsius; } else if (newUnit == 1) { return celsius.multiply(NINE).divide(FIVE, 10, RoundingMode.HALF_UP).add(THIRTY_TWO); } else if (newUnit == 2) { return celsius.add(TWO_HUNDRED_SEVENTY_THREE_POINT_ONE_FIVE); } throw new IllegalArgumentException("无效温度单位"); } }