yeg
2026-09-29 b78295e8da96c3e5e76befeef9582ce5273dbb74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.battery.business.service.report;
 
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.ruoyi.common.exception.ServiceException;
 
/** 化成字段结构不携带数据;实际测量与已确认计算结果不可伪装成人工项。 */
public record FormationField(String key, String scope, String kind, String displayName, String unit, Long fieldDefinitionId)
{
    public static final Map<String, String> METRIC_UNITS = Map.of("chargeCapacity", "mAh", "dischargeCapacity", "mAh",
            "chargeEnergy", "mWh", "dischargeEnergy", "mWh", "efficiency", "%", "energyEfficiency", "%");
 
    public FormationField
    {
        if (key == null || key.isBlank() || key.length() > 100 || key.contains("|")
                || !("detail".equals(scope) || "cycle".equals(scope))
                || !("battery".equals(kind) || "metric".equals(kind) || "manual".equals(kind) || "calculated".equals(kind)))
            throw new ServiceException("化成字段身份或分类无效");
        displayName = displayName == null ? key : displayName.trim();
        unit = unit == null ? "" : unit.trim();
        if (displayName.isBlank() || displayName.length() > 100 || unit.length() > 30
                || ("battery".equals(kind) && !"detail".equals(scope))
                || (fieldDefinitionId != null && (fieldDefinitionId <= 0 || !"battery".equals(kind)))
                || ("metric".equals(kind) && (!"cycle".equals(scope) || !unit.equals(METRIC_UNITS.get(key)))))
            throw new ServiceException("化成字段展示名称、单位或共享身份无效");
        if ((METRIC_UNITS.containsKey(key) && !"metric".equals(kind))
                || (java.util.Set.of("Z", "H", "F", "A", "B").contains(key) && !"battery".equals(kind))
                || (java.util.Set.of("method", "method2", "manual").contains(key) && !"manual".equals(kind))
                || (FormationReportCalculations.RESULTS.contains(key) && !"calculated".equals(kind))
                || ("calculated".equals(kind) && (!FormationReportCalculations.RESULTS.contains(key)
                        || !(java.util.Set.of("FN", "C").contains(key) ? "detail" : "cycle").equals(scope))))
            throw new ServiceException("固定字段不能改变来源分类");
    }
 
    /** 模板和字段设置均拒绝混入测量、测试选择或人工值。 */
    @JsonAnySetter
    public void rejectUnknown(String field, Object value) { throw new ServiceException("化成字段不允许提交属性:" + field); }
}