yeg
2026-09-02 4eff5e59655489e1334981f8d50aac3dde7e65c3
支持工步图表跨循环观察
2个文件已修改
26 ■■■■■ 已修改文件
src/components/ConsoleChartPanel.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tests/test-console-step-chart.contract.test.mjs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/ConsoleChartPanel.vue
@@ -91,20 +91,36 @@
const stepOptions = computed<StepOption[]>(() => {
  const actual = new Map<string, StepOption>()
  const actualAcrossCycles = new Map<number, StepOption>()
  for (const record of props.records) {
    const cycleNo = Number(record.cycleNo)
    const stepNo = Number(record.stepNo)
    if (!Number.isFinite(cycleNo) || !Number.isFinite(stepNo) || cycleNo <= 0 || stepNo <= 0) continue
    const value = `actual:${cycleNo}:${stepNo}`
    if (!actual.has(value)) actual.set(value, { value, label: `${cycleNo}-${stepNo} ${record.stepName || '-'}`, cycleNo, stepNo })
    if (!actualAcrossCycles.has(stepNo)) actualAcrossCycles.set(stepNo, {
      value: `actual:all:${stepNo}`,
      label: `全部循环-${stepNo} ${record.stepName || '-'}`,
      cycleNo: 0,
      stepNo,
    })
  }
  const logical: StepOption[] = []
  const logicalAcrossCycles: StepOption[] = []
  for (const cycleNo of cycleOptions.value) {
    for (const mapping of props.logicStepMappings || []) {
      logical.push({ value: `logical:${cycleNo}:${mapping.logicalNo}`, label: `${cycleNo}-逻辑${mapping.logicalNo} ${mapping.logicalName}`, cycleNo, logical: mapping })
    }
  }
  return [...actual.values(), ...logical]
  for (const mapping of props.logicStepMappings || []) {
    logicalAcrossCycles.push({
      value: `logical:all:${mapping.logicalNo}`,
      label: `全部循环-逻辑${mapping.logicalNo} ${mapping.logicalName}`,
      cycleNo: 0,
      logical: mapping,
    })
  }
  return [...actualAcrossCycles.values(), ...actual.values(), ...logicalAcrossCycles, ...logical]
})
function ensureDetailFieldValues() {
@@ -230,9 +246,9 @@
function selectedRecords() {
  const option = stepOptions.value.find(item => item.value === selectedStep.value)
  if (!option) return []
  const cycle = selectedCycle.value ? Number(selectedCycle.value) : option.cycleNo
  const cycle = selectedCycle.value ? Number(selectedCycle.value) : option.cycleNo > 0 ? option.cycleNo : null
  return props.records.filter(record => {
    if (Number(record.cycleNo) !== cycle) return false
    if (cycle !== null && Number(record.cycleNo) !== cycle) return false
    const stepNo = Number(record.stepNo)
    if (option.logical) return stepNo >= option.logical.startStepNo && stepNo <= option.logical.endStepNo
    return stepNo === option.stepNo
@@ -309,7 +325,7 @@
    series: selectedCells.value.map((cell, index) => ({
      name: cell.no,
      type: 'line',
      smooth: true,
      smooth: false,
      showSymbol: false,
      lineStyle: { width: 2 },
      data: timestamps.map(timestamp => {
tests/test-console-step-chart.contract.test.mjs
@@ -9,6 +9,8 @@
assert.match(chart, /POSITIVE_POTENTIAL/)
assert.match(chart, /NEGATIVE_POTENTIAL/)
assert.match(chart, /selectedRecords\(\)/)
assert.match(chart, /全部循环/)
assert.match(chart, /smooth: false/)
assert.match(chart, /暂无当前测试实时数据/)
assert.doesNotMatch(chart, /const stepOptions = \['5-21 恒流充电'/)
assert.doesNotMatch(chart, /function seriesValues\(/)