package com.battery.business.service.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 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(); var ids = new HashSet(); 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(); } }