yeg
2026-09-07 e4d25726455996e4cbfdba48735ff59f1082aba0
battery-business/src/main/java/com/battery/business/report/FormationReportService.java
@@ -188,6 +188,7 @@
    private Matrix freeze(Matrix matrix, List<FormationField> fields)
    {
        Set<String> selected = new HashSet<>(fields.stream().filter(field -> "metric".equals(field.kind())).map(FormationField::key).toList());
        // 能量效率依赖两项原始能量,即使未展示它们也须冻结,保证快照可复算。
        if (selected.contains("energyEfficiency")) selected.addAll(List.of("chargeEnergy", "dischargeEnergy"));
        var frozen = matrix.items().stream().map(item -> {
            var rows = item.cycles().stream().map(row -> {
@@ -231,6 +232,7 @@
            if (matches.size() == 1) for (String key : FormationField.METRIC_UNITS.keySet())
                if (matches.get(0).get(key) instanceof Number number) values.put(key, new BigDecimal(number.toString()));
            BigDecimal charge = values.get("chargeEnergy"), discharge = values.get("dischargeEnergy");
            // 分母必须为正;允许结果超过 100%,不截断计算结果。
            if (charge != null && discharge != null && charge.signum() > 0)
                values.put("energyEfficiency", discharge.multiply(BigDecimal.valueOf(100)).divide(charge, MathContext.DECIMAL128));
            result.put(Integer.toString(no), values);