package com.battery.business.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 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))) 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("FN", "C", "method2", "manual", "chargePerGram", "chargePerGramTotal", "capacity1v", "capacity1vf", "dischargeInflection", "dischargeInflectionTotal").contains(key) && !"manual".equals(kind))) throw new ServiceException("固定字段不能改变来源分类"); } /** 模板和字段设置均拒绝混入测量、测试选择或人工值。 */ @JsonAnySetter public void rejectUnknown(String field, Object value) { throw new ServiceException("化成字段不允许提交属性:" + field); } }