| | |
| | | export function getSpliceReport(id:number, editing=false){return data<SavedSpliceReport>(`/${id}${editing?'/editing':''}`)} |
| | | export function editSpliceReport(id:number,body:Record<string, unknown>){return data<SavedSpliceReport>(`/${id}/versions`,'POST',body)} |
| | | export function deleteSpliceReport(id:number){return data<void>(`/${id}`,'DELETE')} |
| | | export function listSpliceVersions(id:number){return data<Array<{versionNo:number;operatorName:string;createdAt:number;changeSummary:string}>>(`/${id}/versions`)} |
| | | export function refreshSpliceSource(id:number,baseVersionNo:number,changeSummary:string){return data<SavedSpliceReport>(`/${id}/refresh-source`,'POST',{baseVersionNo,changeSummary})} |
| | |
| | | import { ref } from 'vue' |
| | | import { listSpliceReports, createSpliceReport, editSpliceReport, deleteSpliceReport } from '@/api/spliceReports' |
| | | import { listSpliceReports, getSpliceReport, createSpliceReport, editSpliceReport, deleteSpliceReport } from '@/api/spliceReports' |
| | | export type SpliceTestSelection = { id:number; testBatteryId?:number; name:string; type:string; durationMinutes:number } |
| | | export interface SpliceReportRecord { id:number; name:string; creator:string; createdAt:string; experimentName:string; batteryGroup:string; samples:string[]; tests:SpliceTestSelection[]; batteryFields:string[]; specialFields:string[]; detailFieldValues:Record<string,Record<string,string>>; metrics:string[]; seriesColors:string[] } |
| | | export type SpliceReportPayload = Omit<SpliceReportRecord,'id'|'createdAt'> |
| | |
| | | await createSpliceReport({ name: data.name, description: data.experimentName, selections, settings: { batteryFields: data.batteryFields, specialFields: data.specialFields, detailFieldValues: data.detailFieldValues, metrics: data.metrics, seriesColors: data.seriesColors } }) |
| | | await load() |
| | | } |
| | | async function updateReport(id:number,data:SpliceReportPayload){await editSpliceReport(id,data as unknown as Record<string, unknown>);await load();return true} |
| | | async function getReport(id:number){return getSpliceReport(id,true)} |
| | | async function updateReport(id:number,baseVersionNo:number,data:SpliceReportPayload,changeSummary='更新拼接报表设置'){ |
| | | await editSpliceReport(id,{baseVersionNo,name:data.name,description:data.experimentName,settings:{batteryFields:data.batteryFields,specialFields:data.specialFields,detailFieldValues:data.detailFieldValues,metrics:data.metrics,seriesColors:data.seriesColors},changeSummary}) |
| | | await load();return true |
| | | } |
| | | async function removeReport(id:number){await deleteSpliceReport(id);await load()} |
| | | return {records,load,createReport,updateReport,removeReport} |
| | | return {records,load,getReport,createReport,updateReport,removeReport} |
| | | } |
| | |
| | | const route = useRoute() |
| | | const router = useRouter() |
| | | const currentUser = getCurrentUser() |
| | | const { records, createReport, updateReport } = useSpliceReports() |
| | | const { records, load: loadReports, getReport, createReport, updateReport } = useSpliceReports() |
| | | const { fields: managedGroupFields } = useBatteryGroupFields() |
| | | const editingId = computed(() => { |
| | | const value = Number(route.params.id) |
| | |
| | | { id: 106, name: '循环后静置测试', type: '静置', durationMinutes: 45 }, |
| | | ]) |
| | | onMounted(async () => { |
| | | const sources = await getSpliceSources() |
| | | const [sources] = await Promise.all([getSpliceSources(), loadReports()]) |
| | | candidateTests.value = sources.map(source => ({ id: source.selection.testId, testBatteryId: source.selection.testBatteryId, name: source.name, type: source.type, durationMinutes: 0 })) as SpliceTestSelection[] |
| | | if (!editingId.value && candidateTests.value.length) selectedTests.value = [candidateTests.value[0]] |
| | | if (editingId.value) { |
| | | const saved = await getReport(editingId.value) |
| | | reportName.value = saved.name |
| | | experimentName.value = saved.description || '' |
| | | const settings = saved.settings || {} |
| | | selectedTests.value = saved.selections.map(selection => { |
| | | const candidate = candidateTests.value.find(item => item.id === selection.testId) |
| | | return { id: selection.testId, testBatteryId: selection.testBatteryId, name: candidate?.name || `测试${selection.testId}`, type: candidate?.type || '未知', durationMinutes: candidate?.durationMinutes || 0 } |
| | | }) |
| | | const savedSettings = settings as Record<string, unknown> |
| | | batteryFields.value = Array.isArray(savedSettings.batteryFields) ? [...savedSettings.batteryFields as string[]] : batteryFields.value |
| | | specialFields.value = Array.isArray(savedSettings.specialFields) ? [...savedSettings.specialFields as string[]] : specialFields.value |
| | | Object.keys(detailFieldValues).forEach(field => delete detailFieldValues[field]) |
| | | if (savedSettings.detailFieldValues && typeof savedSettings.detailFieldValues === 'object') Object.entries(savedSettings.detailFieldValues as Record<string, Record<string, string>>).forEach(([field, values]) => { detailFieldValues[field] = { ...values } }) |
| | | formationMetricDefinitions.forEach(metric => { metricVisible[metric.key] = Array.isArray(savedSettings.metrics) ? (savedSettings.metrics as string[]).includes(metric.key) : true }) |
| | | if (Array.isArray(savedSettings.seriesColors)) seriesColors.value = [...savedSettings.seriesColors as string[]] |
| | | dynamicDetailFields.value.forEach(ensureDetailField) |
| | | } else if (candidateTests.value.length) selectedTests.value = [candidateTests.value[0]] |
| | | }) |
| | | |
| | | const batteryFields = ref(['额定容量', '内阻']) |
| | |
| | | metrics: enabledMetrics.value.map(metric => metric.key), |
| | | seriesColors: [...seriesColors.value], |
| | | } |
| | | editingId.value ? updateReport(editingId.value, payload) : createReport(payload) |
| | | if (editingId.value) { |
| | | const saved = await getReport(editingId.value) |
| | | await updateReport(editingId.value, saved.versionNo, payload) |
| | | } else await createReport(payload) |
| | | saving.value = false |
| | | ElMessage.success(editingId.value ? '拼接报表已更新' : '拼接报表已保存') |
| | | await router.push('/report-splice') |