- 更新纵坐标刻度算法,优化小数趋势图范围显示 - 添加稳态趋势图全屏模式和共享工具组件 - 实现多图联动的鼠标悬停竖线同步功能 - 调整主线线宽分档策略,降低最大线宽限制 - 重构稳态趋势工具栏,优化谐波次数选择逻辑 - 添加周时间周期搜索支持和自定义时间范围选择 - 完善稳态数据表格和指示器浮动面板功能 - 优化稳态趋势图性能,添加LTB采样和动画控制 - 修复数据表格打开前的趋势数据验证问题 - 统一时间轴标签格式化和网格对齐处理
154 lines
7.3 KiB
JavaScript
154 lines
7.3 KiB
JavaScript
/* eslint-env node */
|
|
import fs from 'node:fs'
|
|
import path from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
|
|
const currentDir = path.dirname(fileURLToPath(import.meta.url))
|
|
const pageFile = path.join(currentDir, '..', 'index.vue')
|
|
const apiFile = path.resolve(currentDir, '../../../../api/steady/steadyDataView/index.ts')
|
|
const interfaceFile = path.resolve(currentDir, '../../../../api/steady/steadyDataView/interface/index.ts')
|
|
const componentDir = path.join(currentDir, '..', 'components')
|
|
const utilsDir = path.join(currentDir, '..', 'utils')
|
|
|
|
const read = file => fs.readFileSync(file, 'utf8')
|
|
const pageSource = read(pageFile)
|
|
const apiSource = read(apiFile)
|
|
const interfaceSource = read(interfaceFile)
|
|
const componentSource = fs.existsSync(componentDir)
|
|
? fs
|
|
.readdirSync(componentDir)
|
|
.filter(file => file.endsWith('.vue'))
|
|
.map(file => read(path.join(componentDir, file)))
|
|
.join('\n')
|
|
: ''
|
|
const utilitySource = fs.existsSync(utilsDir)
|
|
? fs
|
|
.readdirSync(utilsDir)
|
|
.filter(file => file.endsWith('.ts'))
|
|
.map(file => read(path.join(utilsDir, file)))
|
|
.join('\n')
|
|
: ''
|
|
|
|
const expectations = [
|
|
['page imports extracted trend workbench', /SteadyTrendWorkbench/],
|
|
['trend workbench component exists', fs.existsSync(path.join(componentDir, 'SteadyTrendWorkbench.vue'))],
|
|
['floating indicator panel component exists', fs.existsSync(path.join(componentDir, 'SteadyIndicatorFloatingPanel.vue'))],
|
|
['components import ledger tree panel', /SteadyLedgerTree/],
|
|
['components import indicator tree panel', /SteadyIndicatorTree/],
|
|
['components import trend toolbar', /SteadyTrendToolbar/],
|
|
['components import trend chart panel', /SteadyTrendChartPanel/],
|
|
['page does not import trend summary panel', /SteadyTrendSummaryPanel/],
|
|
['page does not import data table panel', /SteadyDataTablePanel/],
|
|
['components render floating indicator panel', /indicator-floating-panel/],
|
|
['page defaults floating indicator panel expanded', /indicatorPanelCollapsed\s*=\s*ref\(false\)/],
|
|
['page restores default harmonic order when harmonic filter becomes visible', /DEFAULT_HARMONIC_ORDERS[\s\S]*showHarmonicOrders\.value[\s\S]*trendForm\.value\.harmonicOrders\.length[\s\S]*DEFAULT_HARMONIC_ORDERS/],
|
|
['API exposes ledger tree endpoint', /\/steady\/data-view\/ledger-tree/],
|
|
['API exposes indicator tree endpoint', /\/steady\/data-view\/indicator-tree/],
|
|
['API exposes trend query endpoint', /\/steady\/data-view\/trend\/query/],
|
|
['API exposes trend day endpoint', /\/steady\/data-view\/trend\/day/],
|
|
['API disables global loading for trend query', /querySteadyTrend[\s\S]*\/steady\/data-view\/trend\/query[\s\S]*loading:\s*false/],
|
|
['API disables global loading for trend day query', /querySteadyTrendDay[\s\S]*\/steady\/data-view\/trend\/day[\s\S]*loading:\s*false/],
|
|
['API does not expose trend summary endpoint', /\/steady\/data-view\/trend\/summary/],
|
|
['interfaces define trend query params', /interface\s+SteadyTrendQueryParams/],
|
|
['interfaces define trend series', /interface\s+SteadyTrendSeries/],
|
|
['interfaces do not define trend summary', /interface\s+SteadyTrendSummary/],
|
|
['components render ledger checkbox tree', /show-checkbox[\s\S]*@check/],
|
|
['components render indicator checkbox tree', /indicator-tree[\s\S]*show-checkbox[\s\S]*@check/],
|
|
['components reuse LineChart', /<LineChart/],
|
|
['toolbar uses shared time period search', /TimePeriodSearch/],
|
|
['toolbar labels stat quality filters', /toolbar-field__label[\s\S]*统计:[\s\S]*toolbar-field__label[\s\S]*数据质量:/],
|
|
['toolbar does not render bucket selector', /modelValue\.bucket|bucketOptions|粒度:|选择时间粒度/],
|
|
['toolbar does not render phase selector', /modelValue\.phases|phaseOptions|resolvePhaseLabel/],
|
|
['toolbar renders quality flag with switch', /<el-switch[\s\S]*@update:model-value="handleQualityFlagChange"/],
|
|
['toolbar maps valid quality flag to zero', /active-text="有效"[\s\S]*:active-value="0"/],
|
|
['utilities default to valid quality flag zero', /qualityFlag:\s*0/],
|
|
['utilities default harmonic order to second harmonic', /DEFAULT_HARMONIC_ORDERS\s*=\s*\[2\]/],
|
|
['utilities collect selected line ids', /export const collectSelectedLineIds/],
|
|
['utilities validate selection limits', /export const validateTrendSelection[\s\S]*24/],
|
|
['utilities do not require phase selection', /if\s*\(!phases\.length\)/],
|
|
['utilities cap harmonic order count at three', /MAX_HARMONIC_ORDER_COUNT\s*=\s*3/],
|
|
['utilities validate harmonic orders', /export const validateHarmonicOrders[\s\S]*最多选择 \$\{MAX_HARMONIC_ORDER_COUNT\} 个/],
|
|
['utilities count harmonic orders as one indicator in selection estimates', /const harmonicMultiplier\s*=\s*1/],
|
|
[
|
|
'toolbar does not provide harmonic quick groups',
|
|
/HARMONIC_ORDER_QUICK_GROUPS|harmonic-select__quick|appendHarmonicQuickOrders/
|
|
],
|
|
[
|
|
'toolbar warns when harmonic selection exceeds three instead of using silent multiple-limit',
|
|
/(?=[\s\S]*MAX_HARMONIC_ORDER_COUNT)(?=[\s\S]*ElMessage\.warning\(`谐波次数最多选择 \$\{MAX_HARMONIC_ORDER_COUNT\} 个`\))(?![\s\S]*multiple-limit)/
|
|
],
|
|
['utilities build trend query payload', /export const buildSteadyTrendQueryPayload/],
|
|
['utilities strip milliseconds from trend query time', /formatSteadyTrendQueryTime[\s\S]*replace\(\s*\/\\\.\[\^.\]\+\$\//],
|
|
['utilities do not send bucket in trend query payload', /bucket:\s*formState\.bucket/],
|
|
['utilities do not send phases in trend query payload', /phases:\s*formState\.phases/],
|
|
['trend query params do not include bucket', /interface\s+SteadyTrendQueryParams\s*{[^}]*bucket\??:\s*string/],
|
|
['trend query params do not include phases', /phases:\s*string\[\]/],
|
|
['utilities build chart options', /export const buildSteadyTrendChartOptions/]
|
|
]
|
|
|
|
const sourceByExpectation = [
|
|
pageSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
pageSource,
|
|
componentSource,
|
|
pageSource,
|
|
pageSource,
|
|
apiSource,
|
|
apiSource,
|
|
apiSource,
|
|
apiSource,
|
|
apiSource,
|
|
apiSource,
|
|
apiSource,
|
|
interfaceSource,
|
|
interfaceSource,
|
|
interfaceSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
componentSource,
|
|
utilitySource,
|
|
utilitySource,
|
|
utilitySource,
|
|
utilitySource,
|
|
utilitySource,
|
|
utilitySource,
|
|
utilitySource,
|
|
utilitySource,
|
|
componentSource,
|
|
componentSource,
|
|
utilitySource,
|
|
utilitySource,
|
|
utilitySource,
|
|
interfaceSource,
|
|
interfaceSource,
|
|
utilitySource,
|
|
utilitySource
|
|
]
|
|
|
|
const failures = expectations.filter(([name, pattern], index) => {
|
|
const matched = typeof pattern === 'boolean' ? pattern : pattern.test(sourceByExpectation[index])
|
|
return name.includes('does not') || name.includes('do not') ? matched : !matched
|
|
})
|
|
|
|
if (failures.length) {
|
|
console.error('steadyDataView trend contract failed:')
|
|
for (const [name] of failures) {
|
|
console.error(`- ${name}`)
|
|
}
|
|
process.exit(1)
|
|
}
|
|
|
|
console.log('steadyDataView trend contract passed')
|