import type { ReportTestDetails } from '@/utils/reportTestDetails'
|
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?: ReportTestDetails
|
}
|
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 ?? ''}`
|
}
|