From 7100c8a4f7dd3fc7d53ffead4475d7a8abc51c12 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期三, 09 九月 2026 02:32:44 +0800
Subject: [PATCH] 完善循环拼接与首页待办真实数据接口
---
battery-business/src/main/java/com/battery/business/report/SpliceReportService.java | 47 +++++++++++++++++++++++++++++++----------------
1 files changed, 31 insertions(+), 16 deletions(-)
diff --git a/battery-business/src/main/java/com/battery/business/report/SpliceReportService.java b/battery-business/src/main/java/com/battery/business/report/SpliceReportService.java
index 841f84d..1506ecc 100644
--- a/battery-business/src/main/java/com/battery/business/report/SpliceReportService.java
+++ b/battery-business/src/main/java/com/battery/business/report/SpliceReportService.java
@@ -9,6 +9,7 @@
import com.battery.business.domain.TTest;
import com.battery.business.domain.TTestBattery;
import com.battery.business.service.ITTestService;
+import com.battery.business.service.ITBatteryGroupService;
import com.battery.business.service.ITestDataQueryService;
import com.ruoyi.common.exception.ServiceException;
import org.springframework.stereotype.Service;
@@ -21,8 +22,9 @@
private final ITestDataQueryService data;
private final SpliceReportRepository reports;
private final SpliceFieldTemplateService templates;
- public SpliceReportService(ITTestService tests, ITestDataQueryService data, SpliceReportRepository reports, SpliceFieldTemplateService templates) {
- this.tests = tests; this.data = data; this.reports = reports; this.templates = templates;
+ private final ITBatteryGroupService groups;
+ public SpliceReportService(ITTestService tests, ITestDataQueryService data, SpliceReportRepository reports, SpliceFieldTemplateService templates, ITBatteryGroupService groups) {
+ this.tests = tests; this.data = data; this.reports = reports; this.templates = templates; this.groups = groups;
}
public record Candidate(SpliceReportRequest.Selection selection,String name,String type,long groupId,String group,String batteryNo,long startedAt){}
public record Matrix(List<Map<String,Object>> segments,List<Integer> cycleNos){}
@@ -39,7 +41,7 @@
}
/** 校验每个测试电池来源并按提交顺序逐段接续真实循环。 */
public Matrix preview(List<SpliceReportRequest.Selection> selections) {
- if (selections == null || selections.size() < 2 || selections.contains(null)
+ if (selections == null || selections.size() < 2 || selections.stream().anyMatch(Objects::isNull)
|| new HashSet<>(selections).size() != selections.size())
throw new ServiceException("请选择至少两个不重复的检测完成测试电池");
Map<Long, TTest> loaded = new LinkedHashMap<>();
@@ -54,14 +56,14 @@
}
List<Map<String, Object>> segments = new ArrayList<>();
Set<Integer> mappedCycles = new TreeSet<>();
- Integer previousEnd = null;
+ int position = 0;
for (var entry : selected.entrySet()) {
long testId = entry.getKey().testId();
- List<Map<String, Object>> cycles = data.cycles(testId), steps = data.steps(testId), records = data.records(testId);
+ List<Map<String, Object>> cycles = data.cycles(testId), steps = data.steps(testId);
TTestBattery battery = entry.getValue();
var rows = batteryRows(cycles, battery);
var stepRows = batteryRows(steps, battery);
- var nos = java.util.stream.Stream.of(rows, stepRows, batteryRows(records, battery)).flatMap(List::stream)
+ var nos = java.util.stream.Stream.of(rows, stepRows).flatMap(List::stream)
.map(this::cycle).filter(no -> no > 0).distinct().sorted().toList();
Map<String, Object> segment = new LinkedHashMap<>();
segment.put("source", candidate(loaded.get(testId), battery));
@@ -79,12 +81,14 @@
});
frozen.put("fieldValues", values); segment.put("consoleDetail", frozen);
}
- segment.put("originalCycleNos", nos); segment.put("statistics", statistics(rows, stepRows, nos));
- // 每个测试电池独立计算偏移;空段不占用循环,各指标共用同一定位。
- int offset = previousEnd == null || nos.isEmpty() ? 0 : previousEnd + 1 - nos.get(0);
- segment.put("offset", offset);
- for (int no : nos) mappedCycles.add(no + offset);
- if (!nos.isEmpty()) previousEnd = nos.get(nos.size() - 1) + offset;
+ BigDecimal factor = capacityFactor(battery);
+ segment.put("capacityFactor", factor);
+ segment.put("originalCycleNos", nos); segment.put("statistics", statistics(rows, stepRows, nos, factor));
+ // 累计位置只计实际循环点;原循环号单独冻结,不能用数值偏移保留缺号空位。
+ Map<String,Integer> positions = new LinkedHashMap<>();
+ segment.put("offset", position);
+ for (int no : nos) { positions.put(Integer.toString(no), ++position); mappedCycles.add(position); }
+ segment.put("cyclePositions", positions);
segments.add(segment);
}
return new Matrix(segments, new ArrayList<>(mappedCycles));
@@ -92,7 +96,13 @@
private List<Map<String, Object>> batteryRows(List<Map<String, Object>> rows, TTestBattery battery) {
return rows.stream().filter(row -> Objects.equals(row.get("batteryNo"), battery.getBatteryNo())).toList();
}
- private Map<String,Object> statistics(List<Map<String,Object>> rows, List<Map<String,Object>> stepRows, List<Integer> nos) {
+ private BigDecimal capacityFactor(TTestBattery battery) {
+ var group = groups.selectBatteryGroupById(battery.getGroupId());
+ if (group == null || group.getF() == null) return null;
+ try { var value = new BigDecimal(group.getF().trim()); return value.signum() == 0 ? null : value; }
+ catch (NumberFormatException error) { return null; }
+ }
+ private Map<String,Object> statistics(List<Map<String,Object>> rows, List<Map<String,Object>> stepRows, List<Integer> nos, BigDecimal factor) {
Map<String,Object> result = new LinkedHashMap<>();
for (int no : nos) {
Map<String,Object> values = new LinkedHashMap<>();
@@ -105,9 +115,14 @@
if (charge != null && discharge != null && charge.doubleValue() > 0)
values.put("energyEfficiency", new BigDecimal(discharge.toString()).multiply(BigDecimal.valueOf(100))
.divide(new BigDecimal(charge.toString()), MathContext.DECIMAL128));
+ // 与项目图表一致:Ah 转 mAh 后除以来源电池组 F,缺失或零分母不补值。
+ Number capacity = num(values.get("dischargeCapacity"));
+ if (capacity != null && factor != null)
+ values.put("dischargeCapacityF", new BigDecimal(capacity.toString()).multiply(BigDecimal.valueOf(1000)).divide(factor, MathContext.DECIMAL128));
}
// 查询接口按实际发生顺序返回工步;先选末记录再取值,空值不得向前回退。
- var actualSteps = stepRows.stream().filter(row -> cycle(row) == no).toList();
+ var actualSteps = stepRows.stream().filter(row -> cycle(row) == no)
+ .sorted(Comparator.comparingInt(row -> row.get("stepNo") instanceof Number value ? value.intValue() : 0)).toList();
if (!actualSteps.isEmpty()) values.put("finalVoltage1", actualSteps.get(actualSteps.size() - 1).get("endVoltage"));
result.put(Integer.toString(no), values);
}
@@ -124,7 +139,7 @@
validateStatistics(settings, matrix.segments());
validateSourceDetails(settings, matrix.segments());
Map<String,Object> snapshot = new LinkedHashMap<>();
- snapshot.put("spliceMode", "battery-segments");
+ snapshot.put("spliceMode", "project-cycles");
snapshot.put("name", request.name().trim()); snapshot.put("description", request.description());
snapshot.put("selections", request.selections()); snapshot.put("segments", matrix.segments());
snapshot.put("cycleNos", matrix.cycleNos()); snapshot.put("settings", settings);
@@ -179,7 +194,7 @@
overrides.keySet().retainAll(statisticKeys(matrix.segments()));
settings.put("statisticValues", overrides);
snapshot.put("settings", settings); snapshot.put("segments", matrix.segments()); snapshot.put("cycleNos", matrix.cycleNos());
- snapshot.put("spliceMode", "battery-segments");
+ snapshot.put("spliceMode", "project-cycles");
reports.append(id, base + 1, snapshot.getString("name"), snapshot.toJSONString(), uid, user, "按最新来源生成:" + summary.trim());
return get(id, null);
}
--
Gitblit v1.7.1