yeg
2026-09-07 970efe1c40ab8b9667cc60d89874e88bfccb9704
补齐拼接报表版本编辑回填
3个文件已修改
40 ■■■■■ 已修改文件
src/api/spliceReports.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/stores/spliceReports.ts 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/SpliceReportForm.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/spliceReports.ts
@@ -13,3 +13,5 @@
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})}
src/stores/spliceReports.ts
@@ -1,5 +1,5 @@
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'>
@@ -12,7 +12,11 @@
    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}
}
src/views/SpliceReportForm.vue
@@ -19,7 +19,7 @@
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)
@@ -44,9 +44,26 @@
  { 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(['额定容量', '内阻'])
@@ -274,7 +291,10 @@
    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')