yeg
2026-09-08 04727e869a75072de42ef2df49ab8d8aada27bda
完成 Ticket04 对比图表交互
2个文件已修改
19 ■■■■■ 已修改文件
battery-business/src/main/java/com/battery/business/report/CompareReportRequest.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
battery-business/src/main/java/com/battery/business/report/CompareReportService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
battery-business/src/main/java/com/battery/business/report/CompareReportRequest.java
@@ -22,7 +22,8 @@
    public record Settings(@NotNull List<String> metrics, @NotNull List<String> seriesColors,
            @NotNull List<String> batteryTemplateFields, @NotNull List<String> specialFields,
            @NotNull Map<String, @NotNull Map<String, String>> detailFieldValues,
            List<@NotNull @Valid CompareField> fieldStructure)
            List<@NotNull @Valid CompareField> fieldStructure,
            List<@NotNull String> hiddenSeriesKeys)
    {
        /** 展示设置不能夹带测量快照或其他未支持的修改。 */
        @com.fasterxml.jackson.annotation.JsonAnySetter
battery-business/src/main/java/com/battery/business/report/CompareReportService.java
@@ -94,6 +94,7 @@
        if (request == null || request.selections() == null || request.selections().size() < 2)
            throw new ServiceException("请至少添加两条比对项");
        validateSettings(request.settings());
        validateHiddenSeries(request.settings(), request.selections());
        List<Item> items = preview(request.selections()).stream().map(item -> new Item(item.source(), item.zeroTime(), item.records(), item.logicalMapping(),
                item.businessFields().stream().filter(field -> selectedBusinessField(field, request.settings())).toList())).toList();
        Map<String, Object> snapshot = new LinkedHashMap<>();
@@ -128,6 +129,8 @@
    {
        var snapshot = currentSnapshot(id, request.baseVersionNo());
        validateSettings(request.settings());
        var items = JSON.parseArray(JSON.toJSONString(snapshot.get("items")), Item.class);
        validateHiddenSeries(request.settings(), items.stream().map(item -> item.source().selection()).toList());
        snapshot.put("name", request.name().trim()); snapshot.put("description", request.description());
        snapshot.put("experimentName", request.experimentName()); snapshot.put("settings", snapshotSettings(request.settings()));
        reports.append(id, request.baseVersionNo() + 1, request.name().trim(), JSON.toJSONString(snapshot, JSONWriter.Feature.WriteMapNullValue),
@@ -196,12 +199,25 @@
                && (field.fieldDefinitionId() == null ? field.name().equals(value.getFieldName()) : field.fieldDefinitionId().equals(value.getFieldDefinitionId())));
    }
    private void validateHiddenSeries(CompareReportRequest.Settings settings, List<Selection> selections)
    {
        // 仅允许隐藏本版本的完整来源范围,不按同名测试或电池合并身份。
        var hidden = settings.hiddenSeriesKeys();
        if (hidden == null) return;
        var keys = selections.stream().map(item -> item.testId() + "|" + item.testBatteryId() + "|" + item.cycleNo()
                + "|" + Objects.toString(item.stepNo(), "") + "|" + Objects.toString(item.logicalNo(), "")).toList();
        if (hidden.stream().anyMatch(Objects::isNull) || new HashSet<>(hidden).size() != hidden.size() || !keys.containsAll(hidden))
            throw new ServiceException("隐藏曲线必须属于当前报表且不能重复");
    }
    private Map<String, Object> snapshotSettings(CompareReportRequest.Settings settings)
    {
        var result = new LinkedHashMap<String, Object>();
        result.put("metrics", settings.metrics()); result.put("seriesColors", settings.seriesColors());
        result.put("batteryTemplateFields", settings.batteryTemplateFields()); result.put("specialFields", settings.specialFields());
        result.put("detailFieldValues", settings.detailFieldValues());
        // 旧版缺少显隐设置时保持原快照结构,新增设置只随新版本冻结。
        if (settings.hiddenSeriesKeys() != null) result.put("hiddenSeriesKeys", settings.hiddenSeriesKeys());
        // 独立复制结构而非保存模板引用,重开、编辑与打印均不重新读取模板或共享定义。
        if (settings.fieldStructure() != null) result.put("fieldStructure", settings.fieldStructure());
        return result;