docs(design): 删除磁盘监控设计文档并更新前端页面结构规范

- 删除 frontend/src/views/systemMonitor/2026-04-22-disk-monitor-design.md 设计文档
- 删除 frontend/src/views/tools/addLedger/API_DEBUG.md 调试文档
- 在 AGENTS.md 中新增前端页面结构归档章节,规范复杂工具页结构
- 明确 index.vue、components/、utils/ 职责边界和拆分原则
- 规定页面级类型和 contract 脚本管理方式
- 统一复杂页面拆分优先顺序和注意事项
This commit is contained in:
2026-05-14 09:17:25 +08:00
parent 5b3ca264c4
commit f7d297decf
72 changed files with 5125 additions and 3028 deletions

View File

@@ -0,0 +1,247 @@
import type { AddLedger } from '@/api/tools/addLedger/interface'
export type LedgerContextIds = {
engineeringId: string
projectId: string
deviceId: string
}
export function generateGuidText() {
return window.crypto.randomUUID().replace(/-/g, '')
}
export function createEmptyEngineeringForm(): AddLedger.EngineeringForm {
return {
id: '',
name: '',
province: '',
city: '',
description: ''
}
}
export function createEmptyProjectForm(parentEngineeringId = ''): AddLedger.ProjectForm {
return {
id: '',
engineeringId: parentEngineeringId,
parentId: parentEngineeringId,
name: '',
area: '',
description: ''
}
}
export function createEmptyEquipmentForm(parentProjectId = '', parentEngineeringId = ''): AddLedger.EquipmentForm {
return {
id: '',
engineeringId: parentEngineeringId,
projectId: parentProjectId,
parentId: parentProjectId,
name: '',
ndid: '',
mac: '',
dev_type: '',
dev_model: '',
dev_access_method: '',
node_id: '',
node_process: '',
upgrade: 0
}
}
export function createEmptyLineForm(parentDeviceId = ''): AddLedger.LineForm {
return {
id: '',
line_id: generateGuidText(),
deviceId: parentDeviceId,
parentId: parentDeviceId,
name: '',
line_no: undefined,
conType: undefined,
vol_grade: undefined,
position: '',
ct_ratio: undefined,
ct2_ratio: undefined,
pt_ratio: undefined,
pt2_ratio: undefined,
short_circuit_capacity: undefined,
basic_capacity: undefined,
protocol_capacity: undefined,
dev_capacity: undefined,
monitor_obj: '',
is_govern: 0,
monitor_user: '',
is_important: 0
}
}
const resolveString = (data: Record<string, unknown>, ...keys: string[]) => {
for (const key of keys) {
const value = data[key]
if (value === null || value === undefined) continue
const text = String(value).trim()
if (text) return text
}
return ''
}
const resolveNumber = (data: Record<string, unknown>, ...keys: string[]) => {
for (const key of keys) {
const value = data[key]
if (value === null || value === undefined || value === '') continue
const parsed = Number(value)
if (Number.isFinite(parsed)) return parsed
}
return undefined
}
const normalizeLevel = (value: unknown): AddLedger.NodeLevel => {
const level = Number(value)
if (level === 0 || level === 1 || level === 2 || level === 3) {
return level
}
return 0
}
export const normalizeTreeNode = (node: AddLedger.LedgerTreeNode): AddLedger.NormalizedTreeNode => {
const rawNode = node as Record<string, unknown>
const id = resolveString(rawNode, 'id', 'Id')
const children = Array.isArray(node.children) ? node.children.map(normalizeTreeNode).filter(item => item.id) : []
return {
id,
pid: resolveString(rawNode, 'parentId', 'pid', 'Pid'),
pids: resolveString(rawNode, 'parentIds', 'pids', 'Pids'),
name: resolveString(rawNode, 'name', 'Name') || id || '--',
level: normalizeLevel(rawNode.level ?? rawNode.Level),
children,
raw: node
}
}
export const findNodePath = (
nodes: AddLedger.NormalizedTreeNode[],
id: string,
path: AddLedger.NormalizedTreeNode[] = []
): AddLedger.NormalizedTreeNode[] => {
for (const node of nodes) {
const nextPath = [...path, node]
if (node.id === id) return nextPath
const matchedPath = findNodePath(node.children, id, nextPath)
if (matchedPath.length) return matchedPath
}
return []
}
export const resolveContextFromPath = (path: AddLedger.NormalizedTreeNode[]): LedgerContextIds => {
return {
engineeringId: path.find(item => item.level === 0)?.id || '',
projectId: path.find(item => item.level === 1)?.id || '',
deviceId: path.find(item => item.level === 2)?.id || ''
}
}
export const normalizeEngineeringDetail = (
detail: AddLedger.NodeDetail | null,
node?: AddLedger.NormalizedTreeNode
): AddLedger.EngineeringForm => {
const data = (detail || {}) as Record<string, unknown>
return {
id: resolveString(data, 'id', 'engineeringId') || node?.id || '',
name: resolveString(data, 'name') || node?.name || '',
province: resolveString(data, 'province'),
city: resolveString(data, 'city'),
description: resolveString(data, 'description')
}
}
export const normalizeProjectDetail = (
detail: AddLedger.NodeDetail | null,
node?: AddLedger.NormalizedTreeNode,
context: LedgerContextIds = { engineeringId: '', projectId: '', deviceId: '' }
): AddLedger.ProjectForm => {
const data = (detail || {}) as Record<string, unknown>
return {
id: resolveString(data, 'id', 'projectId') || node?.id || '',
engineeringId: resolveString(data, 'engineeringId', 'associated_engineering') || context.engineeringId,
parentId: context.engineeringId,
name: resolveString(data, 'name') || node?.name || '',
area: resolveString(data, 'area'),
description: resolveString(data, 'description')
}
}
export const normalizeEquipmentDetail = (
detail: AddLedger.NodeDetail | null,
node?: AddLedger.NormalizedTreeNode,
context: LedgerContextIds = { engineeringId: '', projectId: '', deviceId: '' }
): AddLedger.EquipmentForm => {
const data = (detail || {}) as Record<string, unknown>
return {
id: resolveString(data, 'id', 'equipmentId') || node?.id || '',
engineeringId: resolveString(data, 'engineeringId', 'associated_engineering') || context.engineeringId,
projectId: resolveString(data, 'projectId', 'associated_project') || context.projectId,
parentId: context.projectId,
name: resolveString(data, 'name') || node?.name || '',
ndid: resolveString(data, 'ndid'),
mac: resolveString(data, 'mac'),
dev_type: resolveString(data, 'dev_type', 'devType'),
dev_model: resolveString(data, 'dev_model', 'devModel'),
dev_access_method: resolveString(data, 'dev_access_method', 'devAccessMethod'),
node_id: resolveString(data, 'node_id', 'nodeId'),
node_process: resolveString(data, 'node_process', 'nodeProcess'),
upgrade: resolveNumber(data, 'upgrade') ?? 0
}
}
export const normalizeLineDetail = (
detail: AddLedger.NodeDetail | null,
node?: AddLedger.NormalizedTreeNode,
context: LedgerContextIds = { engineeringId: '', projectId: '', deviceId: '' }
): AddLedger.LineForm => {
const data = (detail || {}) as Record<string, unknown>
const lineId = resolveString(data, 'line_id', 'lineId', 'id') || node?.id || generateGuidText()
return {
id: resolveString(data, 'id') || lineId,
line_id: lineId,
deviceId: resolveString(data, 'deviceId', 'device_id') || context.deviceId,
parentId: context.deviceId,
name: resolveString(data, 'name') || node?.name || '',
line_no: resolveNumber(data, 'line_no', 'lineNo'),
conType: resolveNumber(data, 'conType'),
vol_grade: resolveNumber(data, 'vol_grade', 'volGrade'),
position: resolveString(data, 'position'),
ct_ratio: resolveNumber(data, 'ct_ratio', 'ctRatio'),
ct2_ratio: resolveNumber(data, 'ct2_ratio', 'ct2Ratio'),
pt_ratio: resolveNumber(data, 'pt_ratio', 'ptRatio'),
pt2_ratio: resolveNumber(data, 'pt2_ratio', 'pt2Ratio'),
short_circuit_capacity: resolveNumber(data, 'short_circuit_capacity', 'shortCircuitCapacity'),
basic_capacity: resolveNumber(data, 'basic_capacity', 'basicCapacity'),
protocol_capacity: resolveNumber(data, 'protocol_capacity', 'protocolCapacity'),
dev_capacity: resolveNumber(data, 'dev_capacity', 'devCapacity'),
monitor_obj: resolveString(data, 'monitor_obj', 'monitorObj'),
is_govern: resolveNumber(data, 'is_govern', 'isGovern') ?? 0,
monitor_user: resolveString(data, 'monitor_user', 'monitorUser'),
is_important: resolveNumber(data, 'is_important', 'isImportant') ?? 0
}
}
export const buildLineNoOptions = (lineNos: number[], currentLineNo?: number) => {
const values = new Set(lineNos.filter(item => Number.isInteger(item) && item >= 1 && item <= 20))
if (currentLineNo && currentLineNo >= 1 && currentLineNo <= 20) {
values.add(currentLineNo)
}
return Array.from(values)
.sort((left, right) => left - right)
.map(item => ({ label: `${item} 号线路`, value: item }))
}