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<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); }
|
}
|