package com.battery.business.report; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.ruoyi.common.exception.ServiceException; /** 报表专属详情完整结构及人工值;空列表表示移除全部对应字段,不回退控制台。 */ public record ReportSourceDetail(List batteryFields, List specialFields, Map fieldValues) { /** 校验填写值属于本份详情的字段,名称不解释为共享编号、单位或设备事实。 */ public void validate() { Set keys = new HashSet<>(); collect(keys, "battery", batteryFields); collect(keys, "special", specialFields); if (fieldValues == null || !keys.containsAll(fieldValues.keySet()) || fieldValues.values().stream().anyMatch(value -> value == null || value.length() > 500)) throw new ServiceException("测试详情字段或填写值无效"); } private static void collect(Set keys, String category, List names) { if (names == null || names.size() > 100) throw new ServiceException("测试详情字段列表无效"); for (String name : names) if (name == null || name.isBlank() || name.length() > 100 || name.contains("\n") || name.contains("\r") || !keys.add(category + "|" + name)) throw new ServiceException("测试详情字段名称无效或重复"); } /** 详情仅接收字段结构和值,不能夹带实验或测量快照。 */ @JsonAnySetter public void rejectUnknown(String name, Object value) { throw new ServiceException("测试详情不允许提交属性:" + name); } }