diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index cde5586f..af129f4c 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -822,6 +822,16 @@ "node": ">= 0.4" } }, + "node_modules/echarts": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz", + "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.0.0" + } + }, "node_modules/entities": { "version": "7.0.1", "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", @@ -1799,6 +1809,12 @@ "node": ">=14.0.0" } }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, "node_modules/type-detect": { "version": "4.1.0", "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.1.0.tgz", @@ -2152,6 +2168,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zrender": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-6.0.0.tgz", + "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } } } } diff --git a/package-lock.json b/package-lock.json index 7fc7d703..354534bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "ant-design-vue": "^4.2.6", "axios": "^1.7.0", + "echarts": "^6.0.0", "pinia": "^2.1.7", "vue": "^3.4.0", "vue-router": "^4.3.0" @@ -1552,6 +1553,16 @@ "node": ">= 0.4" } }, + "node_modules/echarts": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz", + "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.0.0" + } + }, "node_modules/entities": { "version": "7.0.1", "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", @@ -2529,6 +2540,12 @@ "node": ">=14.0.0" } }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, "node_modules/type-detect": { "version": "4.1.0", "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.1.0.tgz", @@ -2882,6 +2899,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zrender": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-6.0.0.tgz", + "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } } } } diff --git a/package.json b/package.json index c1d47aa3..5b560685 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "dependencies": { "ant-design-vue": "^4.2.6", "axios": "^1.7.0", + "echarts": "^6.0.0", "pinia": "^2.1.7", "vue": "^3.4.0", "vue-router": "^4.3.0" diff --git a/src/api/equipment-health.ts b/src/api/equipment-health.ts new file mode 100644 index 00000000..cfcd4080 --- /dev/null +++ b/src/api/equipment-health.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request' + +// ==================== 设备健康度类型 ==================== + +export interface EquipmentHealth { + equipmentId: string + equipmentName: string + healthScore: number + healthLevel: string + lastCheckTime: string + nextCheckTime?: string + riskLevel: string + mainRiskFactors: string[] + maintenanceSuggestions: string[] +} + +export interface HealthHistory { + id: string + equipmentId: string + healthScore: number + healthLevel: string + recordTime: string + factors: Record +} + +export interface EquipmentFailure { + id: string + equipmentId: string + equipmentName: string + failureTime: string + failureType: string + failureLevel: string + description: string + repairTime?: string + repairMethod?: string + status: string +} + +export interface MTBFData { + equipmentId: string + equipmentName: string + mtbfDays: number + totalFailures: number + totalOperatingDays: number + lastFailureTime?: string +} + +export interface MTTRData { + equipmentId: string + equipmentName: string + mttrHours: number + totalRepairTime: number + totalRepairs: number + lastRepairTime?: string +} + +export interface HealthTrendData { + date: string + score: number + level: string +} + +// ==================== 设备健康 API ==================== + +// 获取设备健康度 +export function getEquipmentHealth(equipmentId: string) { + return request.get(`/api/v1/ops/equipment-health/${equipmentId}`) +} + +// 获取健康度历史 +export function getHealthHistory(equipmentId: string, days: number = 30) { + return request.get(`/api/v1/ops/equipment-health/${equipmentId}/history`, { + params: { days } + }) +} + +// 计算设备健康度 +export function calculateHealth(equipmentId: string) { + return request.post(`/api/v1/ops/equipment-health/calculate`, { equipmentId }) +} + +// 获取故障历史列表 +export function getFailureHistory(equipmentId: string) { + return request.get(`/api/v1/ops/equipment-failure-history/${equipmentId}`) +} + +// 记录故障 +export function recordFailure(data: { + equipmentId: string + failureTime: string + failureType: string + failureLevel: string + description: string +}) { + return request.post('/api/v1/ops/equipment-failure-history', data) +} + +// 获取 MTBF +export function getEquipmentMTBF(equipmentId: string) { + return request.get(`/api/v1/ops/equipment-mtbf/${equipmentId}`) +} + +// 获取 MTTR +export function getEquipmentMTTR(equipmentId: string) { + return request.get(`/api/v1/ops/equipment-mttr/${equipmentId}`) +} diff --git a/src/api/inspection-template.ts b/src/api/inspection-template.ts new file mode 100644 index 00000000..95b847fa --- /dev/null +++ b/src/api/inspection-template.ts @@ -0,0 +1,75 @@ +import request from '@/utils/request' + +// ==================== 点检模板类型 ==================== + +export interface InspectionItem { + id: string + itemName: string + checkMethod: string + checkStandard: string + isRequired: boolean + remarks?: string +} + +export interface InspectionTemplate { + id: string + name: string + equipmentType: string + projectId: string + projectName: string + inspectionItems: InspectionItem[] + enabled: boolean + createdBy?: string + createdAt?: string + updatedAt?: string +} + +export interface TemplateFormData { + id?: string + name: string + equipmentType: string + projectId: string + inspectionItems: InspectionItem[] + enabled?: boolean +} + +// ==================== 点检模板 API ==================== + +// 获取模板列表 +export function getInspectionTemplates(projectId: string) { + return request.get('/api/v1/ops/inspection-templates', { + params: { projectId } + }) +} + +// 获取模板详情 +export function getInspectionTemplateDetail(id: string) { + return request.get(`/api/v1/ops/inspection-templates/${id}`) +} + +// 创建模板 +export function createInspectionTemplate(data: TemplateFormData) { + return request.post('/api/v1/ops/inspection-templates', data) +} + +// 更新模板 +export function updateInspectionTemplate(id: string, data: TemplateFormData) { + return request.put(`/api/v1/ops/inspection-templates/${id}`, data) +} + +// 复制模板 +export function copyInspectionTemplate(id: string, targetProjectId?: string) { + return request.post(`/api/v1/ops/inspection-templates/${id}/copy`, { + targetProjectId + }) +} + +// 按设备类型获取模板 +export function getTemplatesByEquipmentType(equipmentType: string) { + return request.get(`/api/v1/ops/inspection-templates/by-type/${equipmentType}`) +} + +// 删除模板 +export function deleteInspectionTemplate(id: string) { + return request.delete(`/api/v1/ops/inspection-templates/${id}`) +} diff --git a/src/components/PageHeader/index.vue b/src/components/PageHeader/index.vue index c1a4abcd..710ca21d 100644 --- a/src/components/PageHeader/index.vue +++ b/src/components/PageHeader/index.vue @@ -31,7 +31,9 @@ const handleBack = () => {

{{ title }}

- +