yeg
2026-09-08 c19dbe36f39315c5bc4d2b17f2969517b442d0ad
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
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.battery.business.report;
 
import com.battery.business.domain.TBatteryGroupField;
import com.battery.business.service.ITBatteryGroupFieldService;
import com.ruoyi.common.exception.ServiceException;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
 
/** 模板复用共享定义的编号;结构校验属于业务层,不交给 REST 控制器。 */
@Service
public class CompareFieldTemplateService
{
    private final CompareFieldTemplateRepository templates;
    private final ITBatteryGroupFieldService definitions;
    public CompareFieldTemplateService(CompareFieldTemplateRepository templates, ITBatteryGroupFieldService definitions)
    { this.templates = templates; this.definitions = definitions; }
 
    /** 名称不重复且共享字段仍有效时,新增不含数据值的模板。 */
    public long create(CompareFieldTemplateRequest request, long userId, String userName)
    {
        var fields = validate(request);
        return templates.insert(request.name().trim(), fields, userId, userName);
    }
 
    /** 修改模板仅影响后续主动应用的草稿,既有版本不重新解析模板。 */
    public void update(long id, CompareFieldTemplateRequest request)
    {
        var fields = validate(request);
        templates.update(id, request.name().trim(), fields);
    }
 
    private List<CompareField> validate(CompareFieldTemplateRequest request)
    {
        if (request.name() == null || request.name().isBlank() || request.name().length() > 100
                || request.fields() == null || request.fields().isEmpty() || request.fields().size() > 100
                || request.fields().stream().anyMatch(java.util.Objects::isNull)) throw new ServiceException("模板名称和字段不能为空");
        var names = new HashSet<String>();
        var ids = new HashSet<Long>();
        var current = definitions.selectBatteryGroupFieldList(new TBatteryGroupField());
        return request.fields().stream().map(field -> {
            if (!names.add(field.name())) throw new ServiceException("模板字段不能重复");
            if (!"battery".equals(field.category())) return field;
            var definition = current.stream().filter(item -> field.fieldDefinitionId() == null
                    ? item.getFieldName().equals(field.name()) : item.getFieldId().equals(field.fieldDefinitionId())).findFirst()
                    .orElseThrow(() -> new ServiceException("共享字段不存在,请重新选择电池组字段:" + field.name()));
            if (!ids.add(definition.getFieldId())) throw new ServiceException("共享字段不能重复");
            return new CompareField(field.name(), field.category(), field.unit(), definition.getFieldId(), field.displayName());
        }).toList();
    }
}