# 资产设备领域反推设计文档（基于实际代码）

**领域编号**: 4.3  
**模块**: module-asset  
**反推日期**: 2026-04-23  
**数据来源**: ether-pms/module-asset + ether-admin/src  

---

## 一、领域概述

### 1.1 领域职责

资产设备领域负责物业设备资产的全生命周期管理，核心职责包括：

- **设备台账管理**：设备主表 + 4张扩展表的分类扩展模式，覆盖电梯/暖通/消防/能源计量四大专业设备
- **设备健康预测**：基于 MTBF/MTTR 指标的健康评分算法，5级健康等级评估
- **故障历史管理**：4级故障等级、4种故障类型、4种修复结果的全流程故障记录
- **归属主体管理**：4种归属类型（项目自有/公司统筹/业主自置/租赁设备），3种主体类型
- **设备导入导出**：Excel 批量导入导出，含文件校验与行数限制
- **设备与空间关联**：通过 spaceNodeId 关联空间节点树

### 1.2 核心概念

| 概念 | 说明 | 对应实体 |
|------|------|----------|
| **设备台账** | 设备基础信息与运行状态 | Equipment |
| **电梯扩展** | 电梯专业参数（载重/速度/注册号等） | EquipmentElevator |
| **暖通扩展** | 暖通空调专业参数（制冷量/制热量/能效比等） | EquipmentHvac |
| **消防扩展** | 消防设备专业参数（探测范围/联动/分区等） | EquipmentFire |
| **能源计量扩展** | 能源表计专业参数（表常数/精度/通讯等） | EquipmentEnergy |
| **健康评分** | 设备健康度评估结果 | EquipmentHealthScore |
| **故障历史** | 设备故障与维修记录 | EquipmentFailureHistory |
| **归属主体** | 设备归属方信息 | OwnershipEntity |

### 1.3 架构模式

**主表 + 扩展表模式**：Equipment 为主表，通过 `equipmentType` 字段区分设备类型，每种专业设备类型对应一张扩展表，通过 `equipment_id`（unique）一对一关联。这种设计避免了主表字段膨胀，同时保持了扩展的灵活性。

```
Equipment (主表)
  ├── EquipmentElevator (电梯扩展) ← equipment_id UNIQUE
  ├── EquipmentHvac (暖通扩展) ← equipment_id UNIQUE
  ├── EquipmentFire (消防扩展) ← equipment_id UNIQUE
  └── EquipmentEnergy (能源计量扩展) ← equipment_id UNIQUE
```

---

## 二、数据结构设计

### 2.1 Equipment（设备主表）

**表名**: `asset_equipment`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | UUID | 是 | 主键，自动生成 |
| projectId | UUID | 是 | 所属项目ID |
| spaceNodeId | UUID | 否 | 关联空间节点ID |
| equipmentCode | VARCHAR(50) | 是 | 设备编码，全局唯一 |
| equipmentName | VARCHAR(100) | 是 | 设备名称 |
| equipmentType | VARCHAR(30) | 是 | 设备类型枚举 |
| equipmentCategory | VARCHAR(50) | 否 | 设备分类 |
| systemType | VARCHAR(50) | 否 | 系统类型枚举（8大系统） |
| ownershipType | VARCHAR(20) | 是 | 归属类型枚举，默认 PROJECT |
| owningEntityId | UUID | 否 | 归属主体ID |
| owningEntityName | VARCHAR(100) | 否 | 归属主体名称（冗余） |
| assetCode | VARCHAR(50) | 否 | 资产编号 |
| serialNumber | VARCHAR(100) | 否 | 出厂编号 |
| model | VARCHAR(100) | 否 | 型号 |
| manufacturer | VARCHAR(100) | 否 | 厂商 |
| supplier | VARCHAR(100) | 否 | 供应商 |
| status | VARCHAR(20) | 是 | 设备状态枚举，默认 ACTIVE |
| operationStatus | VARCHAR(20) | 否 | 运行状态 |
| installationLocation | VARCHAR(200) | 否 | 安装位置 |
| installationDate | DATE | 否 | 安装日期 |
| designLifeYears | INTEGER | 否 | 设计寿命(年) |
| ratedPower | DECIMAL(10,2) | 否 | 额定功率(kW) |
| ratedVoltage | VARCHAR(20) | 否 | 额定电压(V) |
| ratedCurrent | DECIMAL(10,2) | 否 | 额定电流(A) |
| maintenanceVendor | VARCHAR(100) | 否 | 维保商 |
| maintenanceVendorContact | VARCHAR(50) | 否 | 维保联系人 |
| maintenanceVendorPhone | VARCHAR(20) | 否 | 维保电话 |
| maintenanceContractNo | VARCHAR(50) | 否 | 维保合同编号 |
| maintenanceContractStart | DATE | 否 | 维保合同开始日期 |
| maintenanceContractEnd | DATE | 否 | 维保合同结束日期 |
| purchaseDate | DATE | 否 | 购置日期 |
| purchasePrice | DECIMAL(12,2) | 否 | 购置价格(元) |
| warrantyExpireDate | DATE | 否 | 保修到期日期 |
| energyConsumptionStandard | DECIMAL(12,2) | 否 | 能耗标准(kW·h/年) |
| inspectionCycle | INTEGER | 否 | 年检周期(月) |
| nextInspectionDate | DATE | 否 | 下次年检日期 |
| lastInspectionDate | DATE | 否 | 上次年检日期 |
| lastInspectionResult | VARCHAR(20) | 否 | 上次年检结果 |
| specialEquipmentType | VARCHAR(50) | 否 | 特种设备类型 |
| specialEquipmentCert | VARCHAR(100) | 否 | 特种设备证书 |
| attributes | JSON/TEXT | 否 | 扩展属性(JSON) |
| photos | JSONB | 否 | 设备照片列表 |
| documents | JSONB | 否 | 电子文档列表 |
| manualUrl | VARCHAR(500) | 否 | 手册URL |
| remarks | VARCHAR(1000) | 否 | 备注 |
| isDeleted | BOOLEAN | 否 | 逻辑删除标记，默认 false |
| createdAt | DATETIME | 是 | 创建时间 |
| updatedAt | DATETIME | 是 | 更新时间 |
| createdBy | UUID | 否 | 创建人 |
| updatedBy | UUID | 否 | 更新人 |

**索引**:
- `idx_equipment_project` (project_id)
- `idx_equipment_space` (space_node_id)
- `idx_equipment_type` (equipment_type)
- `idx_equipment_ownership` (ownership_type)
- `idx_equipment_code` (equipment_code) — UNIQUE
- `idx_equipment_status` (status)
- `idx_eq_project_status` (project_id, status)
- `idx_eq_project_type` (project_id, equipment_type)
- `idx_eq_project_deleted` (project_id, is_deleted)

**内嵌类型**:

EquipmentPhoto（设备照片）:
| 字段 | 类型 | 说明 |
|------|------|------|
| type | String | 照片类型：外观/铭牌/安装位置/环境 |
| url | String | 照片URL |
| remark | String | 备注 |

EquipmentDocument（电子文档）:
| 字段 | 类型 | 说明 |
|------|------|------|
| name | String | 文档名称 |
| url | String | 文档URL |
| size | Long | 文件大小 |
| type | String | 文档类型：manual/certificate/contract/other |
| remark | String | 备注 |

---

### 2.2 EquipmentElevator（电梯扩展表）

**表名**: `asset_equipment_elevator`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | UUID | 是 | 主键 |
| equipmentId | UUID | 是 | 关联设备ID，UNIQUE |
| elevatorType | VARCHAR(30) | 否 | 电梯类型 |
| elevatorModel | VARCHAR(50) | 否 | 电梯型号 |
| loadCapacity | INTEGER | 否 | 载重(kg) |
| speed | DECIMAL(10,2) | 否 | 速度(m/s) |
| floorCount | INTEGER | 否 | 楼层数 |
| shaftDimensions | VARCHAR(50) | 否 | 井道尺寸 |
| pitDepth | DECIMAL(10,2) | 否 | 底坑深度 |
| overheadHeight | DECIMAL(10,2) | 否 | 顶层高度 |
| registrationNo | VARCHAR(50) | 否 | 注册登记号 |
| inspectionCertificate | VARCHAR(100) | 否 | 检验证书 |
| nextInspectionDate | DATE | 否 | 下次检验日期 |
| energyConsumption | DECIMAL(12,2) | 否 | 能耗 |
| maintenanceLevel | VARCHAR(20) | 否 | 维保等级 |
| rescuePlan | VARCHAR(5000) | 否 | 应急救援预案 |
| createdAt | DATETIME | 否 | 创建时间 |
| updatedAt | DATETIME | 否 | 更新时间 |

---

### 2.3 EquipmentHvac（暖通空调扩展表）

**表名**: `asset_equipment_hvac`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | UUID | 是 | 主键 |
| equipmentId | UUID | 是 | 关联设备ID，UNIQUE |
| hvacType | VARCHAR(30) | 否 | 暖通类型 |
| coolingCapacity | DECIMAL(12,2) | 否 | 制冷量 |
| heatingCapacity | DECIMAL(12,2) | 否 | 制热量 |
| airFlow | DECIMAL(12,2) | 否 | 风量 |
| refrigerantType | VARCHAR(30) | 否 | 制冷剂类型 |
| refrigerantCharge | DECIMAL(10,2) | 否 | 制冷剂充注量 |
| energyEfficiencyRatio | DECIMAL(10,2) | 否 | 能效比(EER) |
| coefficientOfPerformance | DECIMAL(10,2) | 否 | 性能系数(COP) |
| installationDate | DATE | 否 | 安装日期 |
| warrantyExpireDate | DATE | 否 | 保修到期日期 |
| filterReplacementCycle | INTEGER | 否 | 滤网更换周期 |
| lastFilterReplacement | DATE | 否 | 上次滤网更换日期 |
| ductType | VARCHAR(30) | 否 | 风管类型 |
| ductDimensions | VARCHAR(50) | 否 | 风管尺寸 |
| createdAt | DATETIME | 否 | 创建时间 |
| updatedAt | DATETIME | 否 | 更新时间 |

---

### 2.4 EquipmentFire（消防扩展表）

**表名**: `asset_equipment_fire`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | UUID | 是 | 主键 |
| equipmentId | UUID | 是 | 关联设备ID，UNIQUE |
| fireEquipmentType | VARCHAR(30) | 否 | 消防设备类型 |
| installationArea | DECIMAL(10,2) | 否 | 安装面积 |
| installationHeight | DECIMAL(10,2) | 否 | 安装高度 |
| detectionRange | DECIMAL(10,2) | 否 | 探测范围 |
| systemType | VARCHAR(30) | 否 | 系统类型 |
| zoneNumber | VARCHAR(20) | 否 | 分区编号 |
| loopNumber | VARCHAR(20) | 否 | 回路编号 |
| linkageEnabled | BOOLEAN | 否 | 是否启用联动 |
| linkageAction | VARCHAR(100) | 否 | 联动动作 |
| inspectionCycle | INTEGER | 否 | 巡检周期 |
| lastInspectionDate | DATE | 否 | 上次巡检日期 |
| nextInspectionDate | DATE | 否 | 下次巡检日期 |
| inspectionResult | VARCHAR(20) | 否 | 巡检结果 |
| specialRequirement | VARCHAR(2000) | 否 | 特殊要求 |
| createdAt | DATETIME | 否 | 创建时间 |
| updatedAt | DATETIME | 否 | 更新时间 |

---

### 2.5 EquipmentEnergy（能源计量扩展表）

**表名**: `asset_equipment_energy`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | UUID | 是 | 主键 |
| equipmentId | UUID | 是 | 关联设备ID，UNIQUE |
| meterType | VARCHAR(30) | 否 | 表计类型 |
| energyType | VARCHAR(30) | 否 | 能源类型 |
| meterModel | VARCHAR(50) | 否 | 表计型号 |
| meterSpecification | VARCHAR(50) | 否 | 表计规格 |
| meterConstant | DECIMAL(10,4) | 否 | 表常数 |
| accuracyClass | VARCHAR(10) | 否 | 精度等级 |
| readingType | VARCHAR(20) | 否 | 抄表方式 |
| lastReadingDate | DATE | 否 | 上次抄表日期 |
| lastReadingValue | DECIMAL(12,2) | 否 | 上次读数 |
| currentReadingValue | DECIMAL(12,2) | 否 | 当前读数 |
| unitPrice | DECIMAL(10,4) | 否 | 单价 |
| billingType | VARCHAR(20) | 否 | 计费方式 |
| communicationType | VARCHAR(30) | 否 | 通讯方式 |
| communicationAddress | VARCHAR(50) | 否 | 通讯地址 |
| verificationCycle | INTEGER | 否 | 检定周期 |
| nextVerificationDate | DATE | 否 | 下次检定日期 |
| verificationCertificate | VARCHAR(100) | 否 | 检定证书 |
| createdAt | DATETIME | 否 | 创建时间 |
| updatedAt | DATETIME | 否 | 更新时间 |

---

### 2.6 EquipmentHealthScore（健康评分表）

**表名**: `ops_equipment_health_score`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | UUID | 是 | 主键 |
| projectId | UUID | 是 | 项目ID |
| equipmentId | UUID | 是 | 设备ID |
| equipmentCode | VARCHAR(50) | 否 | 设备编码（冗余） |
| equipmentName | VARCHAR(100) | 否 | 设备名称（冗余） |
| healthScore | DECIMAL(5,2) | 是 | 健康度评分(0-100) |
| failureDeduction | DECIMAL(5,2) | 否 | 故障扣分 |
| maintenanceDeduction | DECIMAL(5,2) | 否 | 维保扣分 |
| ageDeduction | DECIMAL(5,2) | 否 | 年龄扣分 |
| failureCount30d | INTEGER | 否 | 近30天故障次数 |
| maintenanceCompletionRate | DECIMAL(5,4) | 否 | 维保完成率 |
| equipmentAgeYears | DECIMAL(10,2) | 否 | 设备年龄(年) |
| operationHours30d | DECIMAL(12,2) | 否 | 近30天运行时长 |
| mtbfHours | DECIMAL(12,2) | 否 | MTBF(小时) |
| mttrHours | DECIMAL(12,2) | 否 | MTTR(小时) |
| healthLevel | VARCHAR(20) | 否 | 健康等级枚举 |
| calculatedAt | DATETIME | 是 | 计算时间 |
| calculationPeriodDays | INTEGER | 否 | 计算周期天数 |
| remarks | VARCHAR(1000) | 否 | 备注 |
| createdAt | DATETIME | 否 | 创建时间 |
| updatedAt | DATETIME | 否 | 更新时间 |

**索引**:
- `idx_health_equipment` (equipment_id)
- `idx_health_calc_time` (calculated_at)
- `idx_health_project` (project_id)

---

### 2.7 EquipmentFailureHistory（故障历史表）

**表名**: `ops_equipment_failure_history`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | UUID | 是 | 主键 |
| projectId | UUID | 是 | 项目ID |
| equipmentId | UUID | 是 | 设备ID |
| equipmentCode | VARCHAR(50) | 否 | 设备编码（冗余） |
| equipmentName | VARCHAR(100) | 否 | 设备名称（冗余） |
| failureTime | DATETIME | 是 | 故障时间 |
| failureType | VARCHAR(50) | 否 | 故障类型枚举 |
| failureLevel | VARCHAR(20) | 否 | 故障等级枚举 |
| failureReason | VARCHAR(2000) | 否 | 故障原因 |
| failureDescription | VARCHAR(2000) | 否 | 故障描述 |
| repairStartTime | DATETIME | 否 | 修复开始时间 |
| repairEndTime | DATETIME | 否 | 修复结束时间 |
| repairDurationHours | DOUBLE | 否 | 修复时长(小时) |
| repairPerson | VARCHAR(100) | 否 | 修复人 |
| repairResult | VARCHAR(20) | 否 | 修复结果枚举 |
| downtimeHours | DOUBLE | 否 | 停机时长(小时) |
| maintenanceCost | DECIMAL(12,2) | 否 | 维修费用 |
| isScheduled | BOOLEAN | 是 | 是否计划停机，默认 false |
| relatedTaskId | UUID | 否 | 关联工单ID |
| remarks | VARCHAR(1000) | 否 | 备注 |
| createdAt | DATETIME | 否 | 创建时间 |
| updatedAt | DATETIME | 否 | 更新时间 |
| createdBy | UUID | 否 | 创建人 |

**索引**:
- `idx_failure_equipment` (equipment_id)
- `idx_failure_time` (failure_time)
- `idx_failure_project` (project_id)
- `idx_efh_project_time` (project_id, failure_time)
- `idx_efh_equipment_time` (equipment_id, failure_time DESC)

---

### 2.8 OwnershipEntity（归属主体表）

**表名**: `asset_ownership_entity`

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | UUID | 是 | 主键 |
| entityType | VARCHAR(20) | 是 | 主体类型枚举 |
| entityName | VARCHAR(100) | 是 | 主体名称 |
| entityCode | VARCHAR(50) | 否 | 主体编码 |
| contactPerson | VARCHAR(50) | 否 | 联系人 |
| contactPhone | VARCHAR(20) | 否 | 联系电话 |
| contactAddress | VARCHAR(255) | 否 | 联系地址 |
| businessLicense | VARCHAR(50) | 否 | 营业执照号 |
| legalRepresentative | VARCHAR(50) | 否 | 法人代表 |
| contractNo | VARCHAR(50) | 否 | 合同编号 |
| contractStartDate | DATE | 否 | 合同开始日期 |
| contractEndDate | DATE | 否 | 合同结束日期 |
| rentalFee | DECIMAL(12,2) | 否 | 租赁费用 |
| status | VARCHAR(20) | 否 | 状态，默认 ACTIVE |
| isDeleted | BOOLEAN | 否 | 逻辑删除，默认 false |
| createdAt | DATETIME | 否 | 创建时间 |
| updatedAt | DATETIME | 否 | 更新时间 |

**索引**:
- `idx_ownership_entity_type` (entity_type)
- `idx_ownership_entity_code` (entity_code)

---

### 2.9 枚举定义汇总

#### EquipmentType（设备类型 — 10种）

| 枚举值 | 中文 | 对应扩展表 |
|--------|------|------------|
| ELEVATOR | 电梯系统 | EquipmentElevator |
| HVAC | 暖通空调 | EquipmentHvac |
| FIRE_PROTECTION | 消防系统 | EquipmentFire |
| PLUMBING | 给排水系统 | — |
| ELECTRICAL | 电气系统 | — |
| ENERGY_METER | 能源计量 | EquipmentEnergy |
| SECURITY | 弱电系统 | — |
| LANDSCAPE | 景观绿化 | — |
| KITCHEN | 厨余设备 | — |
| OTHER | 其他设备 | — |

#### EquipmentStatus（设备状态 — 4种）

| 枚举值 | 中文 |
|--------|------|
| ACTIVE | 在用 |
| INACTIVE | 停用 |
| MAINTENANCE | 维保中 |
| SCRAPPED | 已报废 |

#### OwnershipType（归属类型 — 4种）

| 枚举值 | 中文 |
|--------|------|
| PROJECT | 项目自有 |
| COMPANY | 公司统筹 |
| OWNER | 业主自置 |
| RENTAL | 租赁设备 |

#### SystemType（系统类型 — 9种，商业地产8大系统+其他）

| 枚举值 | 中文 |
|--------|------|
| HVAC | 暖通空调 |
| FIRE | 消防系统 |
| ELEVATOR | 电梯系统 |
| ELECTRICAL | 电气系统 |
| PLUMBING | 给排水 |
| BAS | 弱电智能化 |
| KITCHEN | 餐饮厨房 |
| LANDSCAPE | 景观 |
| OTHER | 其他 |

#### FailureType（故障类型 — 4种）

| 枚举值 | 中文 |
|--------|------|
| SUDDEN | 突发故障 |
| SCHEDULED | 计划停机 |
| WARNING | 预警 |
| OTHER | 其他 |

#### FailureLevel（故障等级 — 4级）

| 枚举值 | 中文 |
|--------|------|
| LOW | 轻微 |
| MEDIUM | 一般 |
| HIGH | 严重 |
| CRITICAL | 危急 |

#### RepairResult（修复结果 — 4种）

| 枚举值 | 中文 |
|--------|------|
| FIXED | 已修复 |
| PARTIAL_FIXED | 部分修复 |
| REPLACED | 更换新设备 |
| PENDING | 待处理 |

#### HealthLevel（健康等级 — 5级）

| 枚举值 | 中文 | 分数范围 |
|--------|------|----------|
| EXCELLENT | 优秀 | [90, 100) |
| GOOD | 良好 | [75, 90) |
| FAIR | 一般 | [60, 75) |
| POOR | 较差 | [40, 60) |
| CRITICAL | 危急 | [0, 40) |

#### EntityType（归属主体类型 — 3种）

| 枚举值 | 中文 |
|--------|------|
| COMPANY | 公司 |
| OWNER | 业主 |
| RENTAL_COMPANY | 租赁公司 |

---

### 2.10 实体关系图

```
┌──────────────────┐     1:1     ┌───────────────────────┐
│   Equipment      │─────────────│  EquipmentElevator    │
│   (主表)          │             └───────────────────────┘
│                  │     1:1     ┌───────────────────────┐
│  equipmentType ──│─────────────│  EquipmentHvac        │
│  determines →    │             └───────────────────────┘
│                  │     1:1     ┌───────────────────────┐
│  owningEntityId ─│─────────────│  EquipmentFire        │
│       ↓          │             └───────────────────────┘
│                  │     1:1     ┌───────────────────────┐
│  spaceNodeId ────│─────────────│  EquipmentEnergy      │
│       ↓          │             └───────────────────────┘
│                  │
│                  │     1:N     ┌───────────────────────┐
│                  │─────────────│ EquipmentHealthScore  │
│                  │             └───────────────────────┘
│                  │     1:N     ┌───────────────────────┐
│                  │─────────────│ EquipmentFailureHist. │
│                  │             └───────────────────────┘
└──────────────────┘
       │
       │ owningEntityId
       ↓
┌──────────────────┐
│ OwnershipEntity  │
└──────────────────┘

外部关联:
  Equipment.spaceNodeId → SpaceNode.id (module-mdm)
```

---

## 三、API接口设计

### 3.1 EquipmentController

**基础路径**: `/api/asset/equipment`

#### 设备主表 CRUD

| 方法 | 路径 | 说明 | 请求体 | 响应 |
|------|------|------|--------|------|
| POST | `/` | 创建设备 | Equipment | Equipment |
| GET | `/{id}` | 获取设备详情 | — | Equipment |
| PUT | `/{id}` | 更新设备 | Equipment | Equipment |
| DELETE | `/{id}` | 删除设备 | — | Void |
| POST | `/batch-delete` | 批量删除 | List\<UUID\> | Void |

#### 设备导入导出

| 方法 | 路径 | 说明 | 请求 | 响应 |
|------|------|------|------|------|
| POST | `/import` | Excel导入 | MultipartFile + projectId | Map(successCount, failCount, failDetails) |
| GET | `/export` | Excel导出 | projectId | byte[] (xlsx) |

**导入校验规则**:
- 文件类型：仅支持 .xlsx / .xls
- 文件大小：最大 10MB
- 行数限制：最大 1000 行
- 文件不能为空

#### 设备查询

| 方法 | 路径 | 说明 | 参数 | 响应 |
|------|------|------|------|------|
| GET | `/by-project/{projectId}` | 按项目查询 | — | List\<Equipment\> |
| GET | `/by-space/{spaceNodeId}` | 按空间查询 | — | List\<Equipment\> |
| GET | `/by-type` | 按类型查询 | type: EquipmentType | List\<Equipment\> |
| GET | `/by-ownership` | 按归属查询 | ownership: OwnershipType | List\<Equipment\> |

#### 设备统计

| 方法 | 路径 | 说明 | 参数 | 响应 |
|------|------|------|------|------|
| GET | `/stats/by-type/{projectId}` | 按类型统计 | — | Map\<String, Long\> |
| GET | `/stats/by-ownership/{projectId}` | 按归属统计 | — | Map\<String, Long\> |
| GET | `/stats/count/{projectId}` | 项目设备总数 | — | Long |

#### 电梯扩展

| 方法 | 路径 | 说明 | 请求体 | 响应 |
|------|------|------|--------|------|
| GET | `/{id}/elevator` | 获取电梯扩展 | — | EquipmentElevator |
| PUT | `/{id}/elevator` | 更新电梯扩展 | EquipmentElevator | EquipmentElevator |

#### 暖通扩展

| 方法 | 路径 | 说明 | 请求体 | 响应 |
|------|------|------|--------|------|
| GET | `/{id}/hvac` | 获取暖通扩展 | — | EquipmentHvac |
| PUT | `/{id}/hvac` | 更新暖通扩展 | EquipmentHvac | EquipmentHvac |

#### 能源计量扩展

| 方法 | 路径 | 说明 | 请求体 | 响应 |
|------|------|------|--------|------|
| GET | `/{id}/energy` | 获取能源扩展 | — | EquipmentEnergy |
| PUT | `/{id}/energy` | 更新能源扩展 | EquipmentEnergy | EquipmentEnergy |

#### 消防扩展

| 方法 | 路径 | 说明 | 请求体 | 响应 |
|------|------|------|--------|------|
| GET | `/{id}/fire` | 获取消防扩展 | — | EquipmentFire |
| PUT | `/{id}/fire` | 更新消防扩展 | EquipmentFire | EquipmentFire |

---

### 3.2 EquipmentHealthController

**基础路径**: `/api/asset/equipment-health`

| 方法 | 路径 | 说明 | 请求体/参数 | 响应 |
|------|------|------|-------------|------|
| GET | `/{equipmentId}` | 获取最新健康度 | — | EquipmentHealthScore |
| GET | `/{equipmentId}/history` | 健康度历史 | — | List\<EquipmentHealthScore\> |
| POST | `/calculate` | 计算健康度 | { equipmentId: UUID } | EquipmentHealthScore |
| POST | `/failure-history` | 记录故障 | EquipmentFailureHistory | EquipmentFailureHistory |
| GET | `/failure-history/{equipmentId}` | 获取故障历史 | — | List\<EquipmentFailureHistory\> |
| GET | `/mtbf/{equipmentId}` | 计算MTBF | days: Integer (默认30) | { equipmentId, days, mtbfHours } |
| GET | `/mttr/{equipmentId}` | 计算MTTR | days: Integer (默认30) | { equipmentId, days, mttrHours } |

---

### 3.3 OwnershipEntityController

**基础路径**: `/api/asset/ownership-entity`

| 方法 | 路径 | 说明 | 请求体 | 响应 |
|------|------|------|--------|------|
| POST | `/` | 创建归属主体 | OwnershipEntity | OwnershipEntity |
| GET | `/{id}` | 获取归属主体 | — | OwnershipEntity |
| PUT | `/{id}` | 更新归属主体 | OwnershipEntity | OwnershipEntity |
| DELETE | `/{id}` | 删除归属主体（逻辑删除） | — | Void |
| GET | `/by-type` | 按类型查询 | type: EntityType | List\<OwnershipEntity\> |
| GET | `/` | 获取全部（未删除） | — | List\<OwnershipEntity\> |

**注意**: OwnershipEntityController 直接注入 Repository，未经过 Service 层，属于简化实现。

---

## 四、业务规则

### 4.1 设备分类体系（10种 EquipmentType）

设备类型采用 10 大分类体系，其中 4 种有专业扩展表：

| 设备类型 | 扩展表 | 专业参数特点 |
|----------|--------|-------------|
| ELEVATOR（电梯系统） | EquipmentElevator | 载重、速度、楼层数、注册号、检验证书、应急救援预案 |
| HVAC（暖通空调） | EquipmentHvac | 制冷/制热量、制冷剂、能效比(EER)、性能系数(COP)、滤网更换 |
| FIRE_PROTECTION（消防系统） | EquipmentFire | 探测范围、分区/回路编号、联动控制、巡检周期 |
| ENERGY_METER（能源计量） | EquipmentEnergy | 表常数、精度等级、通讯方式、检定周期 |
| PLUMBING（给排水系统） | — | 使用主表通用字段 |
| ELECTRICAL（电气系统） | — | 使用主表通用字段 |
| SECURITY（弱电系统） | — | 使用主表通用字段 |
| LANDSCAPE（景观绿化） | — | 使用主表通用字段 |
| KITCHEN（厨余设备） | — | 使用主表通用字段 |
| OTHER（其他设备） | — | 使用主表通用字段 + attributes JSON 扩展 |

**扩展策略**: 无扩展表的设备类型通过主表的 `attributes` JSON 字段存储额外属性。

### 4.2 归属管理（4种 OwnershipType）

| 归属类型 | 说明 | 关联主体 |
|----------|------|----------|
| PROJECT | 项目自有 | 无需关联外部主体 |
| COMPANY | 公司统筹 | 可关联 EntityType=COMPANY 的主体 |
| OWNER | 业主自置 | 可关联 EntityType=OWNER 的主体 |
| RENTAL | 租赁设备 | 可关联 EntityType=RENTAL_COMPANY 的主体 |

**数据冗余**: Equipment 表同时存储 `owningEntityId` 和 `owningEntityName`，避免频繁关联查询。

### 4.3 主表+扩展表模式

**设计原则**:
- 主表存储所有设备类型的公共字段（约40个）
- 扩展表通过 `equipment_id`（UNIQUE）一对一关联主表
- 扩展表仅存储专业特有字段
- 扩展表的读写通过主设备ID路径：`GET /{id}/elevator`、`PUT /{id}/elevator`
- 扩展表采用 saveOrUpdate 模式：存在则更新，不存在则新建

**扩展表服务接口模式**（以电梯为例）:
```java
public interface EquipmentElevatorService {
    Optional<EquipmentElevator> getByEquipmentId(UUID equipmentId);
    EquipmentElevator saveOrUpdate(EquipmentElevator elevator);
}
```

### 4.4 健康评分算法

#### 评分公式

```
健康度 = 基础分(100) - 故障扣分 - 维保扣分 - 年龄扣分
```

#### 扣分规则

| 扣分项 | 计算公式 | 参数 | 上限 |
|--------|----------|------|------|
| 故障扣分 | 故障次数(近30天) × 5 | FAILURE_DEDUCTION_PER_COUNT = 5 | 无上限 |
| 维保扣分 | (1 - 维保完成率) × 20 | MAINTENANCE_DEDUCTION_FACTOR = 20 | 20分 |
| 年龄扣分 | 设备年龄(年) × 2 | AGE_DEDUCTION_PER_YEAR = 2 | 10分(MAX_AGE_DEDUCTION) |

**最低分**: 0分（不会为负数）

#### 健康等级映射

| 等级 | 分数范围 | 颜色(前端) |
|------|----------|------------|
| EXCELLENT（优秀） | [90, 100) | 绿色 |
| GOOD（良好） | [75, 90) | 青色 |
| FAIR（一般） | [60, 75) | 橙色 |
| POOR（较差） | [40, 60) | 红色 |
| CRITICAL（危急） | [0, 40) | 红色 |

#### MTBF 计算（平均故障间隔时间）

```
MTBF = 运行时间(小时) / 故障次数
```

- 计算周期：默认30天，可自定义
- 运行时间：从第一个故障到最后一个故障的时间跨度
- 若仅1次故障：使用默认期间天数 × 24小时
- 无故障时返回 0

#### MTTR 计算（平均修复时间）

```
MTTR = 总修复时间(小时) / 修复次数
```

- 仅统计已完成修复的故障记录（repairDurationHours 不为空）
- 无修复记录时返回 0

#### 设备年龄计算

```java
设备年龄 = 安装年份 + 安装月份/12
```

- 优先使用 `installationDate`
- 若无安装日期，使用 `createdAt` 的日期部分
- 均无则返回 0

**已知问题**: 当前实现中 `calculateEquipmentAge()` 方法错误地使用了 `SpaceNode.maintenanceContractStart` 而非 `Equipment.installationDate`，因为健康评分服务查询的是 SpaceNode 而非 Equipment 实体。

### 4.5 故障等级（4级 FailureLevel）

| 等级 | 中文 | 典型场景 |
|------|------|----------|
| LOW | 轻微 | 指示灯故障、外观损伤 |
| MEDIUM | 一般 | 单个传感器故障、局部渗漏 |
| HIGH | 严重 | 主控制器故障、系统部分失效 |
| CRITICAL | 危急 | 电梯困人、消防系统瘫痪 |

### 4.6 故障记录自动计算

记录故障时自动计算：
- **修复时长**：`repairDurationHours = (repairEndTime - repairStartTime) / 60`（分钟转小时）
- **停机时长**：`downtimeHours = (repairStartTime - failureTime) / 60`（故障到开始修复的时间）

### 4.7 设备导入规则

| 规则 | 限制 |
|------|------|
| 文件格式 | .xlsx / .xls |
| 文件大小 | 最大 10MB |
| 行数限制 | 最大 1000 行 |
| 文件编码 | UTF-8 |
| 空文件 | 拒绝 |

### 4.8 逻辑删除

所有实体采用逻辑删除模式：
- Equipment: `isDeleted` 字段，默认 false
- OwnershipEntity: `isDeleted` 字段，默认 false
- 查询时过滤已删除记录：`findByIdAndIsDeletedFalse`

---

## 五、前端操作流程

### 5.1 页面结构

| 页面 | 路径 | 说明 |
|------|------|------|
| 设备列表 | EquipmentList.vue | 设备台账主列表，含筛选/新增/编辑/删除/导入导出 |
| 设备详情 | EquipmentDetail.vue | 设备完整信息展示（基本信息/技术参数/维保/财务/照片/文档） |
| 设备健康 | EquipmentHealth.vue | 健康度评分/趋势图/MTBF/MTTR/故障历史 |
| 巡检管理 | Inspection.vue | 巡检标准项 + 巡检记录 |
| 维保计划 | MaintenancePlan.vue | 维保计划管理 |
| 维保工单 | MaintenanceTask.vue | 维保工单管理（创建/分配/执行/完成/验证） |
| 照片管理 | components/PhotoManager.vue | 设备照片上传与管理 |
| 文档管理 | components/DocumentManager.vue | 电子文档上传与管理 |

### 5.2 设备台账管理流程

```
设备列表页
  ├── 筛选条件：项目(必选) + 设备类型 + 归属类型 + 关键词
  ├── 操作按钮：新增设备 / 导入 / 导出 / 批量删除
  ├── 列表展示：编码/名称/类型/归属/状态/安装位置/维保商/年检日期
  ├── 行操作：查看详情 / 编辑 / 删除
  └── 统计标签：按类型统计 + 按归属统计
```

### 5.3 设备详情展示流程

```
设备详情页
  ├── 基本信息：编码/名称/类型/归属/型号/厂商/供应商/出厂编号/资产编号/安装位置/安装日期
  ├── 技术参数：额定功率/额定电压/额定电流/设计寿命/能耗标准
  ├── 维保信息：维保单位/联系人/电话/合同编号/合同起止日期
  ├── 财务信息：购置日期/购置价格/保修到期日期
  ├── 特种设备信息（条件显示）：设备类型/证书/检验周期/上次/下次检验
  ├── 设备照片：照片画廊 + 上传
  └── 电子文档：文档列表 + 上传
```

### 5.4 健康预测操作流程

```
设备健康页
  ├── 选择项目 → 加载设备列表
  ├── 选择设备 → 点击查询
  ├── 健康度概览（4个统计卡片）
  │   ├── 健康度评分（颜色随分数变化：≥80绿/≥60橙/<60红）
  │   ├── 健康等级（Tag标签）
  │   ├── 风险等级（Tag标签）
  │   └── 最后检测时间
  ├── MTBF/MTTR 指标卡片
  │   ├── MTBF：平均故障间隔天数 + 总故障次数 + 总运行时长
  │   └── MTTR：平均修复小时 + 总维修次数 + 总维修时长
  ├── 健康度趋势图（ECharts 折线图，近30天）
  ├── 风险因素 + 维护建议
  └── 故障历史表格（时间/类型/等级/描述/维修时间/状态）
```

### 5.5 维保管理流程

```
维保计划页
  ├── 选择项目 → 加载设备列表
  ├── 创建计划：名称/设备/类型/周期/下次维保日期
  └── 计划列表：名称/设备/类型/周期/下次日期/状态

维保工单页
  ├── 工单列表：编号/标题/设备/类型/触发类型/优先级/状态
  ├── 工单操作：创建/分配/开始执行/完成/验证/取消
  └── 工单统计卡片
```

### 5.6 归属主体管理流程

```
归属主体（在设备表单中通过下拉选择使用）
  ├── 创建主体：类型/名称/联系人/电话/地址/营业执照/法人/合同信息/租赁费用
  ├── 按类型筛选：公司/业主/租赁公司
  └── 设备表单中：归属类型 → 联动归属主体下拉
```

---

## 六、与原需求文档 03-ASSET.md 的差异对比

### 6.1 数据模型差异

| 对比项 | 原需求文档(03-ASSET.md) | 实际实现 | 差异分析 |
|--------|------------------------|----------|----------|
| **设备类型枚举** | 8种(ELEVATOR/AC/FIRE_FIGHTING/PLUMBING/POWER_SUPPLY/SECURITY/PARKING/OTHER) | 10种(ELEVATOR/HVAC/FIRE_PROTECTION/PLUMBING/ELECTRICAL/ENERGY_METER/SECURITY/LANDSCAPE/KITCHEN/OTHER) | ⚠️ 枚举值名称和数量均不同；新增ENERGY_METER/LANDSCAPE/KITCHEN；AC→HVAC；FIRE_FIGHTING→FIRE_PROTECTION；POWER_SUPPLY→ELECTRICAL；删除PARKING |
| **设备状态枚举** | NORMAL/FAULT/MAINTAINING/SCRAPPED | ACTIVE/INACTIVE/MAINTENANCE/SCRAPPED | ⚠️ 枚举值名称不同：NORMAL→ACTIVE, FAULT→INACTIVE, MAINTAINING→MAINTENANCE |
| **扩展表** | 无（仅attributes JSONB） | 4张扩展表(Elevator/Hvac/Fire/Energy) | 🔴 重大差异：实际实现了专业扩展表模式 |
| **系统类型** | 无 | SystemType(9种，商业地产8大系统) | 🔴 新增：原需求无此概念 |
| **归属管理** | 无 | OwnershipType(4种) + OwnershipEntity(3种主体) | 🔴 新增：原需求无此概念 |
| **健康评分** | 无 | EquipmentHealthScore + MTBF/MTTR算法 | 🔴 新增：原需求无此概念 |
| **故障历史** | 无 | EquipmentFailureHistory(4级故障/4种类型/4种修复结果) | 🔴 新增：原需求无此概念 |
| **设备照片/文档** | 无 | JSONB内嵌(EquipmentPhoto/EquipmentDocument) | 🔴 新增：原需求无此概念 |
| **维保计划** | MaintenancePlan实体(在asset模块) | 迁移至独立API(maintenance-plan.ts) | ⚠️ 架构调整：维保计划独立 |
| **维保记录** | MaintenanceRecord实体(在asset模块) | 迁移至维保工单(maintenance-task.ts) | ⚠️ 架构调整：维保记录升级为工单 |
| **设备编码字段** | code | equipmentCode | ⚠️ 字段名不同 |
| **设备名称字段** | name | equipmentName | ⚠️ 字段名不同 |
| **位置描述** | locationDesc | installationLocation | ⚠️ 字段名不同 |
| **品牌字段** | brand | 无(使用manufacturer) | ⚠️ 原需求有brand，实际用manufacturer替代 |
| **规格字段** | specifications | 无 | 🔴 原需求有，实际未实现 |
| **负责人** | managerId/managerName/contactPhone | 无(使用维保商字段替代) | 🔴 原需求有设备负责人，实际改为维保商 |
| **二维码** | qrCode | 无 | 🔴 原需求有，实际未实现 |
| **导入导出** | 无 | Excel导入导出(含校验) | 🔴 新增：原需求无此概念 |
| **批量删除** | 无 | batch-delete接口 | 🔴 新增 |
| **财务信息** | purchaseDate/installDate/warrantyDate | purchaseDate/purchasePrice/warrantyExpireDate + 更多 | ⚠️ 实际更丰富 |
| **特种设备** | 无 | specialEquipmentType/specialEquipmentCert/inspectionCycle | 🔴 新增 |
| **能耗标准** | 无 | energyConsumptionStandard | 🔴 新增 |

### 6.2 功能差异

| 功能 | 原需求文档 | 实际实现 | 差异 |
|------|-----------|----------|------|
| **设备CRUD** | ✅ | ✅ | 一致 |
| **设备与空间关联** | ✅ | ✅ | 一致 |
| **设备二维码** | ✅ | ❌ | 未实现 |
| **故障自动工单** | ✅ (事件驱动) | 🟡 (故障记录+关联工单ID) | 部分实现，非事件驱动 |
| **IoT集成** | 🟡 (计划) | ❌ | 未实现 |
| **维保到期提醒** | ✅ (定时任务) | 🟡 (前端展示下次维保日期) | 无后端定时提醒 |
| **设备健康预测** | ❌ | ✅ (完整算法+前端图表) | 超出原需求 |
| **归属主体管理** | ❌ | ✅ (3种主体+4种归属) | 超出原需求 |
| **专业扩展表** | ❌ | ✅ (4张扩展表) | 超出原需求 |
| **Excel导入导出** | ❌ | ✅ (含校验) | 超出原需求 |
| **MTBF/MTTR** | ❌ | ✅ (可配置周期) | 超出原需求 |
| **设备照片/文档** | ❌ | ✅ (JSONB内嵌) | 超出原需求 |
| **维保计划** | ✅ (asset模块内) | ✅ (独立API) | 架构调整 |
| **维保记录** | ✅ (asset模块内) | ✅ (升级为维保工单) | 架构升级 |

### 6.3 实现状态总结

| 模块 | 状态 | 说明 |
|------|------|------|
| 设备主表CRUD | 🟢 完成 | 含批量删除 |
| 4张扩展表 | 🟢 完成 | 电梯/暖通/消防/能源 |
| 健康评分算法 | 🟢 完成 | 含MTBF/MTTR |
| 故障历史管理 | 🟢 完成 | 含自动计算修复/停机时长 |
| 归属主体管理 | 🟢 完成 | 直接Repository操作 |
| Excel导入导出 | 🟢 完成 | 含完整校验 |
| 设备统计 | 🟢 完成 | 按类型/归属/总数 |
| 前端设备列表 | 🟢 完成 | 含筛选/分页/操作 |
| 前端设备详情 | 🟢 完成 | 含照片/文档管理 |
| 前端健康预测 | 🟢 完成 | 含ECharts趋势图 |
| 维保完成率计算 | 🟡 TODO | 代码中标记TODO，暂返回1.0 |
| 设备二维码 | 🔴 未实现 | 原需求有但未实现 |
| IoT集成 | 🔴 未实现 | 原需求有但未实现 |
| 故障自动工单(事件驱动) | 🔴 未实现 | 原需求有但未实现 |
| 维保到期定时提醒 | 🔴 未实现 | 原需求有但未实现 |

### 6.4 已知代码问题

| 问题 | 位置 | 说明 |
|------|------|------|
| 健康评分查询SpaceNode而非Equipment | EquipmentHealthServiceImpl | calculateHealthScore() 查询 SpaceNode 而非 Equipment 实体，导致设备年龄计算使用 maintenanceContractStart 而非 installationDate |
| projectId硬编码为全零UUID | EquipmentHealthServiceImpl | `UUID.fromString("00000000-0000-0000-0000-000000000000")`，应从设备实体获取 |
| OwnershipEntityController绕过Service层 | OwnershipEntityController | 直接注入Repository，不符合分层架构 |
| 维保完成率固定为1.0 | EquipmentHealthServiceImpl | TODO标记，暂跳过维保完成率计算 |
| 前端EquipmentType与后端SystemType不一致 | equipment.ts | 前端SystemType含FIRE_PROTECTION，后端SystemType含FIRE |
| 扩展表仅4种有对应 | EquipmentType vs 扩展表 | PLUMBING/ELECTRICAL/SECURITY/LANDSCAPE/KITCHEN/OTHER 无扩展表 |

---

**文档说明**: 本文档基于 module-asset 模块的实际代码反推生成，与原需求文档 03-ASSET.md 存在显著差异，主要体现在：实际实现远超原需求（健康预测/归属管理/扩展表/导入导出），但部分原需求功能未实现（二维码/IoT/事件驱动工单/定时提醒）。
