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
package com.battery.business.service.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<String> batteryFields, List<String> specialFields, Map<String, String> fieldValues)
{
    /** 校验填写值属于本份详情的字段,名称不解释为共享编号、单位或设备事实。 */
    public void validate()
    {
        Set<String> 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<String> keys, String category, List<String> 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); }
}