yeg
2026-09-08 dc1c47ea58be0c321c7a62d4435c3bbd498c2948
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import { request, type ApiResponse } from './request'
import type { PersistedTestRecord, TestLogicStepMapping } from './tests'
import type { CompareMetricKey } from '@/stores/compareReports'
 
export interface CompareReportSummary {
  id: number
  name: string
  creator: string
  createdAt: number
}
 
/** 读取授权用户可见的全部报表摘要,筛选和分页由现有列表处理。 */
export async function listCompareReports() {
  return (await request<ApiResponse & { rows: CompareReportSummary[] }>('/system/compare-report/list')).rows
}
 
/** 删除整份报表及全部版本,后端在同一事务保留最小删除日志。 */
export async function deleteCompareReport(id: number) {
  await request<ApiResponse>(`/system/compare-report/${id}`, { method: 'DELETE' })
}
 
export interface CompareSelection {
  testId: number
  testBatteryId: number
  cycleNo: number
  stepNo: number | null
  logicalNo: number | null
}
export interface CompareCandidate {
  selection: CompareSelection
  name: string
  type: string
  groupId: number
  batteryGroup: string
  batteryNo: string
  process: string
  experimentName?: string | null
  consoleDetail?: { experimentName: string | null; batteryFields: string[]; specialFields: string[]; fieldValues: Record<string, Record<string, string>> } | null
}
export interface CompareItem {
  source: CompareCandidate
  zeroTime: number | null
  records: PersistedTestRecord[]
  logicalMapping: TestLogicStepMapping | null
  businessFields: Array<{ fieldDefinitionId: number; fieldName: string; fieldType: string; fieldValue: string | null }>
}
export interface CompareSettings {
  metrics: CompareMetricKey[]
  seriesColors: string[]
  hiddenSeriesKeys?: string[]
  batteryTemplateFields: string[]
  specialFields: string[]
  detailFieldValues: Record<string, Record<string, string>>
  fieldStructure?: CompareField[]
  sourceDetailOverrides?: Record<string, { experimentName?: string; fieldValues?: Record<string, string> }>
}
export interface CreateCompareReport {
  name: string
  description: string
  experimentName: string
  selections: CompareSelection[]
  settings: CompareSettings
}
export interface SavedCompareReport extends CompareReportSummary {
  versionNo: number
  operatorName: string
  versionCreatedAt: number
  changeSummary: string
  description: string
  experimentName: string
  items: CompareItem[]
  settings: CompareSettings
  units: Record<string, string>
  displayUnits: Record<string, string>
}
/** 字段结构不包含值;共享编号用于取数,展示名称和单位随报表版本冻结。 */
export interface CompareField { name: string; category: 'battery' | 'special'; unit: string; displayName?: string; fieldDefinitionId?: number | null }
export interface CompareFieldTemplate { id: number; name: string; type: string; fields: CompareField[]; creator: string; updatedAt: number }
/** 查看、新增或编辑权限均可读取所属报表模板。 */
export async function listCompareFieldTemplates() {
  return (await request<ApiResponse & { data: CompareFieldTemplate[] }>('/system/compare-report/templates')).data
}
/** 模板新增只发送字段结构,后端验证共享定义身份并拒绝夹带数据值。 */
export async function createCompareFieldTemplate(name: string, fields: CompareFieldTemplate['fields']) {
  return (await request<ApiResponse & { id: number }>('/system/compare-report/templates', { method: 'POST', body: JSON.stringify({ name, fields }) })).id
}
/** 显式覆盖模板只影响后续应用,不修改任何报表版本。 */
export async function updateCompareFieldTemplate(id: number, name: string, fields: CompareField[]) {
  await request<ApiResponse>(`/system/compare-report/templates/${id}`, { method: 'PUT', body: JSON.stringify({ name, fields }) })
}
 
/** 按报表新增权限读取检测完成测试中的可选来源。 */
export async function getCompareSources() {
  return (await request<ApiResponse & { data: CompareCandidate[] }>('/system/compare-report/sources')).data
}
/** 由后端校验所选范围并返回当前有效测量与业务字段。 */
export async function previewCompareReport(selections: CompareSelection[]) {
  return (await request<ApiResponse & { data: CompareItem[] }>('/system/compare-report/preview', {
    method: 'POST', body: JSON.stringify(selections),
  })).data
}
/** 提交来源身份和展示设置;保存时由后端重读测量并生成独立首版。 */
export async function createCompareReport(data: CreateCompareReport) {
  return (await request<ApiResponse & { data: SavedCompareReport }>('/system/compare-report', {
    method: 'POST', body: JSON.stringify(data),
  })).data
}
/** 读取独立快照;编辑权限入口只返回最新基准,指定历史版须使用查看权限入口。 */
export async function getCompareReport(id: number, versionNo?: number, editing = false) {
  const suffix = editing ? '/editing' : versionNo === undefined ? '' : `/versions/${versionNo}`
  return (await request<ApiResponse & { data: SavedCompareReport }>(`/system/compare-report/${id}${suffix}`)).data
}
 
export interface CompareVersionSummary {
  versionNo: number
  operatorName: string
  createdAt: number
  changeSummary: string
}
 
/** 历史与修订摘要共用正式版本列表。 */
export async function listCompareVersions(id: number) {
  return (await request<ApiResponse & { data: CompareVersionSummary[] }>(`/system/compare-report/${id}/versions`)).data
}
 
/** 通过独立导出权限读取指定版本,打印不能使用页面草稿或重新读取来源。 */
export async function getComparePrintVersion(id: number, versionNo: number) {
  return (await request<ApiResponse & { data: SavedCompareReport }>(`/system/compare-report/${id}/versions/${versionNo}/print`)).data
}
 
/** 修订 CSV 使用正式版本摘要,后端校验导出权限。 */
export async function exportCompareVersions(id: number) {
  return (await request<ApiResponse & { data: CompareVersionSummary[] }>(`/system/compare-report/${id}/versions/export`)).data
}
 
/** 普通编辑只提交展示值,来源范围与测量沿用快照;后端拒绝陈旧基准。 */
export async function editCompareReport(id: number, data: Omit<CreateCompareReport, 'selections'> & { baseVersionNo: number; changeSummary: string }) {
  return (await request<ApiResponse & { data: SavedCompareReport }>(`/system/compare-report/${id}/versions`, {
    method: 'POST', body: JSON.stringify(data),
  })).data
}
 
/** 主动按最新来源生成独立版本,保留已有人工表格值。 */
export async function refreshCompareSource(id: number, baseVersionNo: number, changeSummary: string) {
  return (await request<ApiResponse & { data: SavedCompareReport }>(`/system/compare-report/${id}/refresh-source`, {
    method: 'POST', body: JSON.stringify({ baseVersionNo, changeSummary }),
  })).data
}
 
/** 按完整所选范围区分比对项,同一电池的不同循环或工步不合并。 */
export function compareSelectionKey(item: CompareSelection) {
  return `${item.testId}|${item.testBatteryId}|${item.cycleNo}|${item.stepNo ?? ''}|${item.logicalNo ?? ''}`
}