- 在补数任务面板中添加入库类型单选按钮组,支持 MySQL 和 InfluxDB - 更新 AddData 接口定义,添加 StorageType 相关类型和选项接口 - 修改补数 API 请求逻辑,根据入库类型动态调整接口路径前缀 - 重构台账设备表单,统一使用装置网络参数作为 MAC 和 NDID 的单一数据源 - 优化台账线路表单,仅当存在 ID 时才设置 lineId 字段,避免空值传递 - 添加入库类型列表获取接口和相关数据处理逻辑 - 更新台账字典代码常量,新增终端型号字典码 - 优化台账树节点添加逻辑,增加前置条件验证和禁用原因提示 - 添加 InfluxDB 配置文件到额外资源目录 - 更新稳定数据分析视图,优化台账树数据结构处理和样式布局 - 完善 API 调试契约检查,确保设备和线路数据映射正确性 - 优化趋势查询性能,禁用全局加载状态提升用户体验
90 lines
4.4 KiB
JavaScript
90 lines
4.4 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 componentDir = path.join(currentDir, '..', 'components')
|
|
const apiFile = path.resolve(currentDir, '../../../../api/steady/steadyDataView/index.ts')
|
|
const interfaceFile = path.resolve(currentDir, '../../../../api/steady/steadyDataView/interface/index.ts')
|
|
|
|
const source = fs.readFileSync(pageFile, 'utf8')
|
|
const componentSource = fs.existsSync(componentDir)
|
|
? fs
|
|
.readdirSync(componentDir)
|
|
.filter(file => file.endsWith('.vue'))
|
|
.map(file => fs.readFileSync(path.join(componentDir, file), 'utf8'))
|
|
.join('\n')
|
|
: ''
|
|
const readComponent = file => fs.readFileSync(path.join(componentDir, file), 'utf8')
|
|
const toolbarSource = readComponent('SteadyTrendToolbar.vue')
|
|
const chartPanelSource = readComponent('SteadyTrendChartPanel.vue')
|
|
const floatingPanelSource = readComponent('SteadyIndicatorFloatingPanel.vue')
|
|
const indicatorTreeSource = readComponent('SteadyIndicatorTree.vue')
|
|
const viewSource = `${source}\n${componentSource}`
|
|
const apiSource = fs.readFileSync(apiFile, 'utf8')
|
|
const interfaceSource = fs.readFileSync(interfaceFile, 'utf8')
|
|
|
|
const forbiddenPatterns = [
|
|
['data detail tab is removed', /数据明细|name="detail"|SteadyDataTablePanel/, source],
|
|
['detail ProTable is removed', /buildSteadyDataQueryParams|SteadyDataSearchParams/, source],
|
|
['trend summary panel is removed', /SteadyTrendSummaryPanel|trendSummary|loading\.summary/, source],
|
|
[
|
|
'page detail API is removed',
|
|
/getSteadyDataPage|getSteadyDataDetail|getSteadyDataTemplates|\/steady\/data-view\/page|\/steady\/data-view\/detail|\/steady\/data-view\/templates/,
|
|
apiSource
|
|
],
|
|
['trend summary API is removed', /getSteadyTrendSummary|\/steady\/data-view\/trend\/summary/, apiSource],
|
|
[
|
|
'page detail types are removed',
|
|
/PageResult|SteadyDataPageParams|SteadyDataDetailParams|SteadyDataTemplate|SteadyDataRecord/,
|
|
interfaceSource
|
|
],
|
|
[
|
|
'trend summary types are removed',
|
|
/SteadyTrendSummary|SteadyTrendSummaryItem/,
|
|
interfaceSource
|
|
],
|
|
['chart panel title text is removed', /panel-title/, chartPanelSource],
|
|
['collapsed indicator vertical trigger is removed', /indicator-collapsed-trigger/, floatingPanelSource],
|
|
['collapsed indicator label is removed', /collapsedLabel/, floatingPanelSource]
|
|
]
|
|
|
|
const requiredPatterns = [
|
|
['page defines SteadyDataView component name', /name:\s*'SteadyDataView'/, source],
|
|
['page renders extracted trend workbench', /<SteadyTrendWorkbench/, source],
|
|
['trend workbench component exists', /SteadyTrendWorkbench/, viewSource],
|
|
['floating indicator panel component exists', /SteadyIndicatorFloatingPanel/, viewSource],
|
|
['components keep trend chart panel', /SteadyTrendChartPanel/, viewSource],
|
|
['components keep right floating indicator panel', /indicator-floating-panel/, viewSource],
|
|
['indicator panel defaults expanded', /indicatorPanelCollapsed\s*=\s*ref\(false\)/, source],
|
|
['indicator panel supports collapsed state', /is-collapsed/, viewSource],
|
|
['API keeps trend query endpoint', /\/steady\/data-view\/trend\/query/, apiSource],
|
|
[
|
|
'trend toolbar reserves four evenly distributed search columns',
|
|
/grid-template-columns:\s*repeat\(4,\s*minmax\(0,\s*1fr\)\)\s*auto/,
|
|
toolbarSource
|
|
],
|
|
['trend toolbar keeps actions after four search columns', /grid-column:\s*5/, toolbarSource],
|
|
['floating indicator panel expanded width is reduced', /width:\s*300px/, floatingPanelSource],
|
|
['floating indicator collapsed state keeps icon only', /width:\s*0/, floatingPanelSource],
|
|
['floating indicator body is hidden when collapsed', /\.indicator-floating-panel\.is-collapsed\s+\.indicator-panel-body/, floatingPanelSource],
|
|
['indicator tree header separates title and refresh icon', /justify-content:\s*flex-start/, indicatorTreeSource]
|
|
]
|
|
|
|
const failures = [
|
|
...forbiddenPatterns.filter(([, pattern, target]) => pattern.test(target)),
|
|
...requiredPatterns.filter(([, pattern, target]) => !pattern.test(target))
|
|
]
|
|
|
|
if (failures.length) {
|
|
console.error('steadyDataView visible contract failed:')
|
|
for (const [name] of failures) {
|
|
console.error(`- ${name}`)
|
|
}
|
|
process.exit(1)
|
|
}
|
|
|
|
console.log('steadyDataView visible contract passed')
|