# Ether 主数据域(MDM)功能详细设计文档 **版本**: v1.0(反推自代码) **生成日期**: 2026-04-23 **数据来源**: module-mdm 实际代码反推 **代码路径**: `ether-pms/module-mdm` --- ## 一、领域概述 ### 1.1 领域职责 主数据域(Master Data Management)是 Ether 系统的基础数据层,负责管理物业项目全生命周期的核心主数据,为所有业务域(工单、收费、巡检、维保等)提供统一的数据基座。 核心职责: - **项目管理**:项目创建、状态流转、成员管理、功能配置 - **空间节点管理**:统一空间体系,树形结构管理楼栋/单元/房间/车位/设备房等 - **巡检标准管理**:巡检标准项库、巡检模板管理 - **巡检记录管理**:设备巡检记录、巡检结果跟踪 - **备件库存管理**:备件台账、分类管理、出入库操作、低库存预警 - **能耗计量管理**:计量点管理、能耗抄表记录、能耗统计分析 ### 1.2 核心概念 | 概念 | 说明 | 对应实体 | |------|------|----------| | **项目** | 物业管理的基本单元,所有业务数据的归属 | Project | | **空间节点** | 统一的空间体系,支持树形层级 | SpaceNode | | **项目配置** | 项目级别的功能开关 | ProjectConfig | | **项目统计** | 项目维度的汇总统计 | ProjectStatistics | | **状态历史** | 项目状态变更记录 | ProjectStatusHistory | | **巡检标准项** | 设备巡检的检查标准库 | InspectionItem | | **巡检模板** | 按设备类型组织的巡检检查项集合 | InspectionTemplate | | **巡检记录** | 实际巡检执行记录 | InspectionRecord | | **备件** | 维修用备品备件 | SparePart | | **备件分类** | 备件的分类体系 | SparePartCategory | | **备件记录** | 备件出入库流水 | SparePartRecord | | **计量点** | 能源计量仪表 | EnergyMeter | | **能耗记录** | 能源消耗抄表记录 | EnergyConsumption | ### 1.3 领域边界 ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ 主数据域(MDM)边界 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 项目管理 │ │ 空间节点 │ │ 巡检标准 │ │ 备件库存 │ │ 能耗计量 │ │ │ │ Project │ │SpaceNode │ │InspectItem│ │SparePart │ │ Energy │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 项目配置 │ │ 设备扩展 │ │ 巡检模板 │ │ 备件分类 │ │ 计量点 │ │ │ │ Config │ │Equipment │ │ Template │ │ Category │ │ Meter │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ ├─────────────────────────────────────────────────────────────────────────────┤ │ 依赖关系: │ │ - 所有实体均以 projectId 为核心维度 │ │ - SpaceNode 是空间基座,设备/计量点/巡检均关联空间节点 │ │ - 巡检模板引用巡检标准项 │ │ - 备件记录关联备件和工单 │ └─────────────────────────────────────────────────────────────────────────────┘ ``` --- ## 二、数据结构设计 ### 2.1 实体总览 | # | 实体 | 表名 | 模块 | 说明 | |---|------|------|------|------| | 1 | Project | mdm_project | 项目管理 | 项目基础信息 | | 2 | ProjectConfig | mdm_project_config | 项目管理 | 项目功能配置 | | 3 | ProjectStatistics | mdm_project_statistics | 项目管理 | 项目统计快照 | | 4 | ProjectStatusHistory | mdm_project_status_history | 项目管理 | 状态变更历史 | | 5 | SpaceNode | mdm_space_node | 空间管理 | 统一空间节点(含设备扩展) | | 6 | InspectionItem | mdm_inspection_item | 巡检标准 | 巡检标准项 | | 7 | InspectionTemplate | ops_inspection_template | 巡检模板 | 巡检检查模板 | | 8 | InspectionRecord | mdm_inspection_record | 巡检记录 | 巡检执行记录 | | 9 | SparePart | ops_spare_part | 备件管理 | 备件台账 | | 10 | SparePartCategory | ops_spare_part_category | 备件管理 | 备件分类 | | 11 | SparePartRecord | ops_spare_part_record | 备件管理 | 出入库记录 | | 12 | EnergyMeter | ops_energy_meter | 能耗管理 | 计量点 | | 13 | EnergyConsumption | ops_energy_consumption | 能耗管理 | 能耗记录 | ### 2.2 Project(项目) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键,自动生成 | | code | String(50) | 是 | 项目编码,唯一,正则 `^[a-zA-Z0-9_-]+$`,2-50位 | | name | String(100) | 是 | 项目名称,2-100位 | | description | String(500) | 否 | 项目描述 | | address | String(100) | 否 | 项目地址 | | projectType | Enum(ProjectType) | 否 | 项目类型,默认 RESIDENTIAL | | province | String(50) | 否 | 省 | | city | String(50) | 否 | 市 | | district | String(50) | 否 | 区 | | longitude | Double | 否 | 经度 | | latitude | Double | 否 | 纬度 | | status | String(20) | 是 | 项目状态,默认 ACTIVE | | buildingCount | Integer | 否 | 楼栋数 | | unitCount | Integer | 否 | 单元数 | | roomCount | Integer | 否 | 房间数 | | floorCount | Integer | 否 | 楼层数 | | logo | String(200) | 否 | 项目Logo | | contact | String(200) | 否 | 联系人 | | contactPhone | String(20) | 否 | 联系电话,正则 `^1[3-9]\d{9}$` | | createdAt | LocalDateTime | 是 | 创建时间,自动填充 | | updatedAt | LocalDateTime | 是 | 更新时间,自动填充 | **枚举:ProjectType** | 值 | 描述 | |----|------| | RESIDENTIAL | 住宅 | | OFFICE | 办公 | | INDUSTRIAL_PARK | 产业园区 | **项目状态值(String类型,非枚举)** | 值 | 描述 | 前端颜色 | |----|------|----------| | ACTIVE | 正常 | success | | DISABLED | 禁用 | error | | PENDING | 待审核 | warning | | ARCHIVED | 已归档 | default | ### 2.3 ProjectConfig(项目配置) | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | UUID | 是 | - | 主键 | | projectId | UUID | 是 | - | 项目ID,唯一 | | enableReservation | Boolean | 否 | false | 预约功能 | | enableVisitor | Boolean | 否 | false | 访客功能 | | enableComplaint | Boolean | 否 | true | 投诉功能 | | enablePayment | Boolean | 否 | false | 缴费功能 | | enableAnnouncement | Boolean | 否 | true | 公告功能 | | enableSurvey | Boolean | 否 | false | 问卷功能 | | enableVote | Boolean | 否 | false | 投票功能 | | enableMaintenance | Boolean | 否 | true | 报修功能 | | enableAsset | Boolean | 否 | false | 资产功能 | | customConfig | String(5000) | 否 | - | 自定义配置JSON | | createdAt | LocalDateTime | - | 自动 | 创建时间 | | updatedAt | LocalDateTime | - | 自动 | 更新时间 | ### 2.4 ProjectStatistics(项目统计) | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | id | UUID | - | 主键 | | projectId | UUID | - | 项目ID,唯一 | | memberCount | Integer | 0 | 成员数 | | buildingCount | Integer | 0 | 楼栋数 | | unitCount | Integer | 0 | 单元数 | | roomCount | Integer | 0 | 房间数 | | ownerCount | Integer | 0 | 业主数 | | tenantCount | Integer | 0 | 租户数 | | lastSyncedAt | LocalDateTime | - | 最后同步时间 | | createdAt | LocalDateTime | 自动 | 创建时间 | | updatedAt | LocalDateTime | 自动 | 更新时间 | ### 2.5 ProjectStatusHistory(状态变更历史) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键 | | projectId | UUID | 是 | 项目ID | | fromStatus | String(20) | 否 | 原状态 | | toStatus | String(20) | 是 | 新状态 | | reason | String(500) | 否 | 变更原因 | | operatorId | UUID | 否 | 操作人ID | | operatorName | String(50) | 否 | 操作人姓名 | | createdAt | LocalDateTime | 自动 | 创建时间 | ### 2.6 SpaceNode(空间节点)— 核心实体 SpaceNode 是 MDM 域最复杂的实体,采用统一空间模型 + 设备扩展字段的设计。 #### 2.6.1 基础字段 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键 | | projectId | UUID | 是 | 项目ID(注意:列名为 project_code) | | name | String(100) | 是 | 节点名称,1-100位 | | fullName | String(500) | 否 | 全路径名称 | | shortName | String(50) | 否 | 简称 | | nodeCategory | Enum(NodeCategory) | 是 | 节点大类 | | nodeType | Enum(NodeType) | 是 | 节点类型 | | usageType | String(30) | 否 | 用途类型 | | parentId | UUID | 否 | 父节点ID | | treePath | String(1000) | 否 | 物理路径 id.id.id | | treePathName | String(1000) | 否 | 名称路径 项目/楼栋/单元/房间 | | level | Integer | 否 | 层级深度,默认0 | | sortOrder | Integer | 否 | 排序号,默认0 | | status | String(20) | 否 | 状态,默认 ACTIVE | | deliveryStatus | String(20) | 否 | 交付状态 | | decorationStatus | String(20) | 否 | 装修状态 | #### 2.6.2 面积信息 | 字段 | 类型 | 说明 | |------|------|------| | buildingArea | BigDecimal(10,2) | 建筑面积(㎡) | | usableArea | BigDecimal(10,2) | 使用面积(㎡) | | sharedArea | BigDecimal(10,2) | 公摊面积(㎡) | | landArea | BigDecimal(10,2) | 占地面积(㎡) | #### 2.6.3 地理信息 | 字段 | 类型 | 说明 | |------|------|------| | longitude | BigDecimal(10) | 经度 | | latitude | BigDecimal(10) | 纬度 | | altitude | BigDecimal(8,2) | 海拔 | | floorNumber | Integer | 楼层号(正数地上,负数地下) | #### 2.6.4 地址信息 | 字段 | 类型 | 说明 | |------|------|------| | province | String(50) | 省 | | city | String(50) | 市 | | district | String(50) | 区 | | street | String(100) | 街道 | | address | String(255) | 详细地址 | #### 2.6.5 扩展属性 | 字段 | 类型 | 说明 | |------|------|------| | attributes | String(2000) | 类型特定属性(JSON格式) | #### 2.6.6 设备扩展字段(isEquipment=true 时使用) | 字段 | 类型 | 说明 | |------|------|------| | isEquipment | Boolean | 是否为设备节点,默认false | | designLifeYears | Integer | 设计寿命(年) | | ratedPower | BigDecimal(10,2) | 额定功率 | | ratedVoltage | BigDecimal(10,2) | 额定电压 | | ratedCurrent | BigDecimal(10,2) | 额定电流 | | maintenanceVendor | String(100) | 维保厂商 | | maintenanceVendorContact | String(50) | 维保联系人 | | maintenanceVendorPhone | String(20) | 维保电话 | | maintenanceContractNo | String(50) | 维保合同号 | | maintenanceContractStart | LocalDate | 合同开始日期 | | maintenanceContractEnd | LocalDate | 合同结束日期 | | specialEquipmentType | String(50) | 特种设备类型 | | specialEquipmentCert | String(100) | 特种设备证书 | | inspectionCycle | Integer | 巡检周期(天) | | nextInspectionDate | LocalDate | 下次年检日期 | | lastInspectionDate | LocalDate | 上次年检日期 | | lastInspectionResult | String(20) | 上次年检结果 | | commonSpareParts | String(2000) | 常用备件(JSON) | | energyConsumptionStandard | BigDecimal(12,2) | 能耗标准 | | installationEnvironment | String(50) | 安装环境 | | protectionLevel | String(20) | 防护等级 | #### 2.6.7 系统字段 | 字段 | 类型 | 说明 | |------|------|------| | createdAt | LocalDateTime | 创建时间 | | updatedAt | LocalDateTime | 更新时间 | | createdBy | UUID | 创建人 | | updatedBy | UUID | 更新人 | | isDeleted | Boolean | 软删除标记,默认false | #### 2.6.8 NodeCategory 枚举(节点大类) | 值 | 描述 | |----|------| | BUILDING | 建筑空间 | | PARKING | 停车空间 | | FACILITY | 设施空间 | | AREA | 区域空间 | #### 2.6.9 NodeType 枚举(节点类型)— 含分类和层级 | 值 | 描述 | 所属大类 | 层级序号 | |----|------|----------|----------| | BUILDING | 楼栋 | BUILDING | 1 | | UNIT | 单元 | BUILDING | 2 | | FLOOR | 楼层 | BUILDING | 3 | | ROOM | 房间 | BUILDING | 4 | | SHOP | 商铺 | BUILDING | 2 | | GARAGE | 车库 | PARKING | 1 | | PARKING_AREA | 停车区域 | PARKING | 2 | | PARKING_SPACE | 车位 | PARKING | 3 | | EQUIPMENT_ROOM | 设备房 | FACILITY | 1 | | PROPERTY_OFFICE | 物业用房 | FACILITY | 1 | | SECURITY_ROOM | 门岗 | FACILITY | 1 | | PUBLIC_ROOM | 公共用房 | FACILITY | 1 | | PUBLIC_AREA | 公共区域 | AREA | 1 | | GREEN_AREA | 绿化区域 | AREA | 1 | | ROAD | 道路 | AREA | 1 | #### 2.6.10 索引设计 | 索引名 | 列 | 说明 | |--------|-----|------| | idx_space_node_project | project_id | 按项目查询 | | idx_space_node_parent | parent_id | 查子节点 | | idx_space_node_type | node_type | 按类型查询 | | idx_space_node_tree_path | tree_path | 路径查询 | | idx_sn_project_parent | project_id, parent_id | 项目+父节点 | | idx_sn_project_type | project_id, node_type | 项目+类型 | | idx_sn_project_isequipment | project_id, is_equipment | 项目+设备 | | idx_sn_project_nextinspection | project_id, next_inspection_date | 年检预警 | ### 2.7 InspectionItem(巡检标准项) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键 | | equipmentType | String(50) | 否 | 设备类型 | | systemType | String(50) | 否 | 系统类型 | | itemName | String(200) | 是 | 检查项名称 | | checkMethod | String(200) | 否 | 检查方法 | | standardValue | String(100) | 否 | 标准值 | | isRequired | Boolean | 否 | 是否必检,默认true | | remark | String(500) | 否 | 备注 | | sortOrder | Integer | 否 | 排序号 | | status | Enum(Status) | 否 | 状态,默认ACTIVE | | createdAt | LocalDateTime | 自动 | 创建时间 | | updatedAt | LocalDateTime | 自动 | 更新时间 | **枚举:Status** | 值 | 描述 | |----|------| | ACTIVE | 启用 | | INACTIVE | 停用 | ### 2.8 InspectionTemplate(巡检模板) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键 | | projectId | UUID | 是 | 项目ID | | templateCode | String | 是 | 模板编码,唯一 | | templateName | String | 是 | 模板名称 | | equipmentType | String | 是 | 设备类型 | | inspectionItems | String(5000) | 否 | 检查项(JSON) | | estimatedDuration | Integer | 否 | 预计耗时(分钟) | | status | Enum(Status) | 否 | 状态,默认ACTIVE | | version | Integer | 否 | 版本号,默认1 | | createdBy | String | 否 | 创建人 | | createdAt | LocalDateTime | 自动 | 创建时间 | | updatedAt | LocalDateTime | 自动 | 更新时间 | ### 2.9 InspectionRecord(巡检记录) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键 | | planId | UUID | 否 | 巡检计划ID | | equipmentId | UUID | 是 | 设备ID | | inspectionDate | LocalDate | 是 | 巡检日期 | | inspector | String(200) | 是 | 巡检人 | | status | Enum(CheckStatus) | 否 | 检查状态,默认NORMAL | | checkInTime | LocalDateTime | 否 | 签到时间 | | checkInLocation | String(100) | 否 | 签到位置 | | checkInPhoto | String(200) | 否 | 签到照片 | | items | JSONB | 否 | 检查项结果列表 | | problems | JSONB | 否 | 异常问题列表 | | completed | Boolean | 否 | 是否完成,默认false | | completedTime | LocalDateTime | 否 | 完成时间 | | createdAt | LocalDateTime | 自动 | 创建时间 | **枚举:CheckStatus** | 值 | 描述 | |----|------| | NORMAL | 正常 | | WARNING | 预警 | | ABNORMAL | 异常 | **items JSONB 结构示例**: ```json [ { "itemId": "uuid", "itemName": "检查项", "value": "实测值", "result": "PASS/FAIL", "remark": "备注" } ] ``` **problems JSONB 结构示例**: ```json [ { "desc": "问题描述", "photo": "照片URL", "severity": "LOW/MEDIUM/HIGH" } ] ``` **索引设计**: | 索引名 | 列 | |--------|-----| | idx_ir_equipment_date | equipment_id, inspection_date | | idx_ir_inspectiondate | inspection_date | ### 2.10 SparePart(备件) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键 | | projectId | UUID | 是 | 项目ID | | sparePartCode | String | 是 | 备件编码,唯一 | | sparePartName | String | 是 | 备件名称 | | categoryId | UUID | 否 | 分类ID | | specification | String(500) | 否 | 规格型号 | | unit | String(50) | 是 | 计量单位 | | safeStock | Integer | 否 | 安全库存,默认0 | | currentStock | Integer | 否 | 当前库存,默认0 | | unitPrice | BigDecimal(10,2) | 否 | 单价 | | supplier | String(200) | 否 | 供应商 | | supplierContact | String | 否 | 供应商联系方式 | | location | String(200) | 否 | 存放位置 | | remarks | String(1000) | 否 | 备注 | | status | Enum(Status) | 否 | 状态,默认ACTIVE | | createdAt | LocalDateTime | 自动 | 创建时间 | | updatedAt | LocalDateTime | 自动 | 更新时间 | **枚举:Status** | 值 | 描述 | |----|------| | ACTIVE | 启用 | | INACTIVE | 停用 | **索引**:`idx_sp_project_status(project_id, status)` ### 2.11 SparePartCategory(备件分类) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键 | | parentId | UUID | 否 | 父分类ID(支持树形) | | categoryCode | String | 是 | 分类编码,唯一 | | categoryName | String | 是 | 分类名称 | | description | String(500) | 否 | 描述 | | sortOrder | Integer | 否 | 排序号 | | createdAt | LocalDateTime | 自动 | 创建时间 | ### 2.12 SparePartRecord(备件出入库记录) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键 | | recordCode | String | 是 | 记录编码,唯一 | | recordType | Enum(RecordType) | 是 | 记录类型 | | sparePartId | UUID | 是 | 备件ID | | quantity | Integer | 是 | 数量 | | balance | Integer | 是 | 余额(操作后库存) | | relatedOrderId | UUID | 否 | 关联工单ID | | recordedBy | UUID | 否 | 操作人ID | | recordDate | LocalDateTime | 否 | 操作时间,默认当前 | | remarks | String(1000) | 否 | 备注 | **枚举:RecordType** | 值 | 描述 | |----|------| | IN | 入库 | | OUT | 出库 | | CHECK | 盘点 | | ADJUST | 调整 | ### 2.13 EnergyMeter(计量点) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键 | | projectId | UUID | 是 | 项目ID | | meterCode | String | 是 | 计量点编码,唯一 | | meterName | String | 是 | 计量点名称 | | energyType | Enum(EnergyType) | 是 | 能源类型 | | spaceNodeId | UUID | 否 | 关联空间节点 | | installationLocation | String | 否 | 安装位置 | | ratedCapacity | BigDecimal(10,2) | 否 | 额定容量 | | unitPrice | BigDecimal(10,4) | 否 | 单价 | | status | Enum(Status) | 否 | 状态,默认ACTIVE | | createdAt | LocalDateTime | 自动 | 创建时间 | | updatedAt | LocalDateTime | 自动 | 更新时间 | **枚举:EnergyType** | 值 | 描述 | |----|------| | LIGHTING | 照明插座用电 | | HVAC | 空调用电 | | POWER | 动力用电 | | SPECIAL | 特殊用电 | | WATER | 给排水 | | GAS | 燃气 | ### 2.14 EnergyConsumption(能耗记录) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | id | UUID | 是 | 主键 | | projectId | UUID | 是 | 项目ID | | meterId | UUID | 是 | 计量点ID | | consumptionDate | LocalDate | 是 | 消耗日期 | | previousReading | BigDecimal(12,2) | 否 | 上次读数 | | currentReading | BigDecimal(12,2) | 否 | 本次读数 | | consumption | BigDecimal(12,2) | 是 | 消耗量 | | amount | BigDecimal(10,2) | 否 | 金额 | | recordedBy | UUID | 否 | 记录人 | | recordMethod | Enum(RecordMethod) | 否 | 记录方式,默认MANUAL | | remarks | String(1000) | 否 | 备注 | | createdAt | LocalDateTime | 自动 | 创建时间 | **枚举:RecordMethod** | 值 | 描述 | |----|------| | MANUAL | 手动录入 | | IOT | IoT自动采集 | **索引**: | 索引名 | 列 | |--------|-----| | idx_ec_meter_date | meter_id, consumption_date | | idx_ec_project_date | project_id, consumption_date | ### 2.15 实体关系图 ``` Project (1) ──→ (N) SpaceNode 通过 projectId 关联 Project (1) ──→ (1) ProjectConfig 通过 projectId 唯一关联 Project (1) ──→ (1) ProjectStatistics 通过 projectId 唯一关联 Project (1) ──→ (N) ProjectStatusHistory 通过 projectId 关联 SpaceNode (1) ──→ (N) SpaceNode 通过 parentId 自关联(树形) SpaceNode (1) ──→ (0..1) Equipment 通过 isEquipment 标记(设备扩展字段) EnergyMeter (1) ──→ (N) EnergyConsumption 通过 meterId 关联 EnergyMeter ──→ SpaceNode 通过 spaceNodeId 关联 SparePartCategory (1) ──→ (N) SparePartCategory 通过 parentId 自关联(树形) SparePartCategory (1) ──→ (N) SparePart 通过 categoryId 关联 SparePart (1) ──→ (N) SparePartRecord 通过 sparePartId 关联 InspectionItem ──→ InspectionTemplate 通过 equipmentType 逻辑关联 InspectionTemplate ──→ InspectionRecord 通过 planId 逻辑关联 InspectionRecord ──→ SpaceNode(Equipment) 通过 equipmentId 关联 ``` --- ## 三、API接口设计 ### 3.1 ProjectController — `/api/mdm/projects` | 编号 | 方法 | 路径 | 说明 | 请求参数 | |------|------|------|------|----------| | PM-001 | GET | / | 分页查询项目列表 | keyword, status, page, size, sortBy, sortDirection | | PM-010 | GET | /selector | 获取项目选择器列表 | - | | PM-005 | GET | /generate-code | 生成项目编码 | - | | - | GET | /{id} | 按ID查询项目 | id(Path) | | - | GET | /code/{code} | 按编码查询项目 | code(Path) | | - | POST | / | 创建项目 | Project(Body) | | - | PUT | /{id} | 更新项目 | id(Path), Project(Body) | | - | DELETE | /{id} | 删除项目 | id(Path) | | PM-003 | GET | /{id}/members | 获取项目成员列表 | id(Path), page, size | | PM-003 | POST | /{id}/members | 添加项目成员 | id(Path), AddMemberRequest(Body) | | PM-003 | DELETE | /{id}/members/{memberId} | 移除项目成员 | id(Path), memberId(Path) | | PM-002 | GET | /{id}/statistics | 获取项目统计数据 | id(Path) | | PM-006 | PUT | /{id}/status | 变更项目状态 | id(Path), ChangeStatusRequest(Body) | | PM-008 | GET | /{id}/config | 获取项目配置 | id(Path) | | PM-008 | PUT | /{id}/config | 更新项目配置 | id(Path), ProjectConfigDTO(Body) | | PM-009 | GET | /{projectId}/delete-check | 项目删除前检查 | projectId(Path) | **关键DTO**: ```typescript // ProjectQueryRequest { keyword?: string; status?: string; page?: number; size?: number; sortBy?: string; sortDirection?: string } // ChangeStatusRequest { status: string; reason?: string } // AddMemberRequest { userIds: string[]; roleInProject: string } // ProjectDeleteCheckVO { canDelete: boolean; reason?: string; statistics: ProjectDeleteStatistics } ``` ### 3.2 SpaceNodeController — `/api/mdm/space-nodes` | 编号 | 方法 | 路径 | 说明 | 请求参数 | |------|------|------|------|----------| | - | GET | / | 分页查询空间节点 | page, size | | - | GET | /{id} | 查询节点详情 | id(Path) | | - | GET | /project/{projectId} | 按项目查询节点列表 | projectId(Path) | | - | GET | /project/{projectId}/tree | 获取项目空间树 | projectId(Path) | | - | GET | /project/{projectId}/roots | 获取项目根节点 | projectId(Path) | | - | GET | /project/{projectId}/type/{nodeType} | 按项目+类型查询 | projectId(Path), nodeType(Path) | | - | GET | /parent/{parentId}/children | 获取子节点列表 | parentId(Path) | | - | POST | / | 创建空间节点 | SpaceNodeCreateDTO(Body) | | - | POST | /batch | 批量创建节点 | List\(Body) | | - | PUT | /{id} | 更新节点 | id(Path), SpaceNodeUpdateDTO(Body) | | - | DELETE | /{id} | 删除节点 | id(Path) | | - | GET | /{id}/delete-check | 删除前检查 | id(Path) | | - | DELETE | /{id}/cascade | 级联删除(含子节点) | id(Path) | | - | GET | /{id}/equipment | 获取设备详情 | id(Path) | | - | GET | /equipment | 获取设备列表 | projectId(Param) | | - | GET | /special-equipment | 获取特种设备列表 | projectId(Param) | | - | GET | /expiring-inspection | 获取即将年检设备 | projectId(Param), daysAhead(默认90) | | - | POST | /equipment | 创建设备 | EquipmentCreateDTO(Body) | | - | POST | /equipment/batch | 批量创建设备 | List\(Body) | | - | POST | /equipment/import | Excel导入设备 | file(Multipart), projectId(Param) | | - | GET | /{buildingId}/floor-info | 获取楼栋楼层信息 | buildingId(Path) | | - | GET | /debug/floor-numbers | 调试:检查房间楼层号 | projectId(Param) | **关键DTO**: ```typescript // SpaceNodeCreateDTO / SpaceNodeUpdateForm { projectId, name, nodeCategory, nodeType, parentId?, buildingArea?, ... } // SpaceNodeTreeDTO extends SpaceNode { ...SpaceNode, children: SpaceNodeTreeDTO[] } // SpaceNodeDeleteCheckDTO { nodeId, nodeName, childCount, childTypeCount, totalDescendantCount } // EquipmentCreateDTO { projectId, name, nodeType, parentId?, ...设备扩展字段 } // FloorInfoVO { buildingId, buildingName, totalFloors, undergroundFloors, floors: FloorDetailVO[] } ``` ### 3.3 InspectionItemController — `/api/mdm/inspection-items` | 方法 | 路径 | 说明 | 请求参数 | |------|------|------|----------| | POST | / | 创建巡检标准项 | InspectionItem(Body) | | GET | / | 查询巡检标准项列表 | equipmentType?, systemType?, activeOnly? | | GET | /{id} | 获取标准项详情 | id(Path) | | PUT | /{id} | 更新标准项 | id(Path), InspectionItem(Body) | | DELETE | /{id} | 删除标准项 | id(Path) | **查询逻辑**:activeOnly=true → 仅启用项;equipmentType+systemType → 双条件过滤;equipmentType → 单条件过滤;systemType → 系统类型过滤;无参数 → 全部。 ### 3.4 InspectionTemplateController — `/api/ops/inspection-templates` | 方法 | 路径 | 说明 | 请求参数 | |------|------|------|----------| | GET | / | 获取项目模板列表 | projectId(Param) | | POST | / | 创建模板 | InspectionTemplate(Body) | | GET | /{id} | 获取模板详情 | id(Path) | | PUT | /{id} | 更新模板 | id(Path), InspectionTemplate(Body) | | POST | /{id}/copy | 复制模板 | id(Path), newName(Param) | | GET | /by-type/{equipmentType} | 按设备类型查模板 | equipmentType(Path) | ### 3.5 InspectionRecordController — `/api/mdm/inspection-records` | 方法 | 路径 | 说明 | 请求参数 | |------|------|------|----------| | POST | / | 创建巡检记录 | InspectionRecord(Body) | | GET | / | 查询巡检记录列表 | equipmentId?, planId?, inspector?, status?, startDate?, endDate? | | GET | /{id} | 获取记录详情 | id(Path) | | PUT | /{id} | 更新记录 | id(Path), InspectionRecord(Body) | | DELETE | /{id} | 删除记录 | id(Path) | | POST | /{id}/complete | 完成巡检记录 | id(Path) | **查询逻辑**:equipmentId+日期范围 → 设备+日期;equipmentId → 设备;planId → 计划;inspector → 巡检人;status → 状态;日期范围 → 时间段;无参数 → 全部。 ### 3.6 SparePartController — `/api/ops/spare-parts` | 方法 | 路径 | 说明 | 请求参数 | |------|------|------|----------| | GET | /categories | 获取分类列表 | - | | POST | /categories | 创建分类 | SparePartCategory(Body) | | GET | / | 获取备件列表 | projectId(Param), categoryId? | | GET | /{id} | 获取备件详情 | id(Path) | | POST | / | 创建备件 | SparePart(Body) | | PUT | /{id} | 更新备件 | id(Path), SparePart(Body) | | DELETE | /{id} | 删除备件 | id(Path) | | GET | /low-stock | 获取低库存备件 | projectId(Param) | | POST | /in-stock | 入库操作 | StockRequest(Body) | | POST | /out-stock | 出库操作 | OutStockRequest(Body) | | GET | /{id}/records | 获取备件出入库记录 | id(Path) | **关键请求体**: ```typescript // StockRequest { sparePartId: UUID; quantity: Integer; recordedBy?: UUID; remarks?: String } // OutStockRequest { sparePartId: UUID; quantity: Integer; relatedOrderId?: UUID; recordedBy?: UUID; remarks?: String } ``` ### 3.7 EnergyController — `/api/ops/energy` | 方法 | 路径 | 说明 | 请求参数 | |------|------|------|----------| | POST | /meters | 创建计量点 | EnergyMeter(Body) | | GET | /meters | 获取计量点列表 | projectId(Param), energyType? | | GET | /meters/{id} | 获取计量点详情 | id(Path) | | PUT | /meters/{id} | 更新计量点 | id(Path), EnergyMeter(Body) | | DELETE | /meters/{id} | 删除计量点 | id(Path) | | POST | /consumption | 录入能耗记录 | RecordConsumptionRequest(Body) | | GET | /consumption/{meterId} | 获取能耗记录 | meterId(Path), startDate?, endDate? | | GET | /statistics/by-type | 按类型统计能耗 | projectId(Param), month(Param) | | GET | /statistics/unit-consumption | 单位面积能耗 | projectId(Param), month(Param) | **关键请求体**: ```typescript // RecordConsumptionRequest { meterId: UUID; currentReading: BigDecimal; recordedBy?: UUID } ``` --- ## 四、业务规则 ### 4.1 空间节点树形管理 #### 4.1.1 树形结构规则 ``` 项目 (Project) ├── 楼栋 (BUILDING) ← NodeCategory.BUILDING, order=1 │ ├── 单元 (UNIT) ← NodeCategory.BUILDING, order=2 │ │ ├── 楼层 (FLOOR) ← NodeCategory.BUILDING, order=3 │ │ │ └── 房间 (ROOM) ← NodeCategory.BUILDING, order=4 │ │ └── 房间 (ROOM) ← 可跳过楼层直接挂房间 │ └── 公共用房 (PUBLIC_ROOM) ├── 商铺 (SHOP) ← NodeCategory.BUILDING, order=2(直接挂在项目下) ├── 车库 (GARAGE) ← NodeCategory.PARKING, order=1 │ ├── 停车区域 (PARKING_AREA) ← NodeCategory.PARKING, order=2 │ │ └── 车位 (PARKING_SPACE) ← NodeCategory.PARKING, order=3 ├── 设备房 (EQUIPMENT_ROOM) ← NodeCategory.FACILITY, order=1 ├── 物业用房 (PROPERTY_OFFICE) ├── 门岗 (SECURITY_ROOM) ├── 公共区域 (PUBLIC_AREA) ← NodeCategory.AREA, order=1 ├── 绿化区域 (GREEN_AREA) └── 道路 (ROAD) ``` #### 4.1.2 树形路径维护 - **treePath**:物理路径,格式 `id1.id2.id3`,用于快速查询所有子孙节点 - **treePathName**:名称路径,格式 `项目/楼栋/单元/房间`,用于展示 - **level**:层级深度,根节点为0,每层+1 - 创建/移动节点时自动维护 treePath 和 treePathName #### 4.1.3 设备扩展模式 SpaceNode 通过 `isEquipment` 字段标记是否为设备节点。设备节点在基础空间字段之外,额外使用设备扩展字段(维保信息、巡检周期、特种设备证书等)。这种设计将设备信息嵌入空间节点,而非独立设备实体。 #### 4.1.4 删除规则 - 删除前必须调用 `delete-check` 接口检查子节点数量 - 普通删除:仅删除当前节点(有子节点时拒绝) - 级联删除:删除当前节点及所有子孙节点 - 软删除:通过 `isDeleted` 标记,非物理删除 #### 4.1.5 批量操作 - 批量创建:通过 `batch` 接口,受 `BatchOperationValidator` 限制数量 - Excel导入设备:支持 .xlsx/.xls 格式,最大1000行,文件类型校验 ### 4.2 项目状态流转 #### 4.2.1 状态值 | 状态 | 描述 | 可流转到 | |------|------|----------| | PENDING | 待审核 | ACTIVE, DISABLED | | ACTIVE | 正常 | DISABLED, ARCHIVED | | DISABLED | 禁用 | ACTIVE, ARCHIVED | | ARCHIVED | 已归档 | -(终态) | #### 4.2.2 状态变更规则 - 每次状态变更必须记录 `ProjectStatusHistory`(fromStatus, toStatus, reason, operatorId, operatorName) - 删除项目前必须调用 `delete-check` 检查关联数据 - 存在应收未收费用时无法删除项目 #### 4.2.3 项目成员管理 - 成员角色:PROJECT_MANAGER(项目经理)、PROJECT_ADMIN(项目管理员)、OPERATION_STAFF(运营人员)、FINANCE_STAFF(财务人员)、VIEWER(查看者) - 员工类型:SECURITY(保安)、CLEANING(保洁)、GARDEN(绿化)、MAINTENANCE(维修)、CUSTOMER_SERVICE(客服)、PROJECT_STAFF(项目人员) - 支持批量添加成员 ### 4.3 巡检标准项管理 #### 4.3.1 标准项库 - 巡检标准项按 `equipmentType`(设备类型)和 `systemType`(系统类型)分类 - 每个标准项包含:检查项名称、检查方法、标准值、是否必检 - 标准项状态:ACTIVE(启用)/INACTIVE(停用) - 支持按 activeOnly=true 仅查询启用项 #### 4.3.2 巡检模板 - 模板按项目+设备类型组织 - 模板包含检查项列表(JSON格式存储) - 支持模板版本管理(version字段) - 支持模板复制(copy接口) - 模板与标准项通过 equipmentType 逻辑关联 #### 4.3.3 巡检记录 - 记录关联设备(equipmentId)和计划(planId) - 检查结果状态:NORMAL(正常)/WARNING(预警)/ABNORMAL(异常) - 支持签到信息(时间、位置、照片) - 检查项结果和异常问题以JSONB存储 - 完成操作:调用 `complete` 接口标记完成 ### 4.4 备件库存管理 #### 4.4.1 库存管理规则 - 每个备件有 `currentStock`(当前库存)和 `safeStock`(安全库存) - 当 `currentStock < safeStock` 时触发低库存预警 - 低库存查询:`low-stock` 接口返回低于安全库存的备件列表 #### 4.4.2 出入库操作 | 操作 | 说明 | 关键字段 | |------|------|----------| | 入库(IN) | 增加库存 | sparePartId, quantity, recordedBy, remarks | | 出库(OUT) | 减少库存 | sparePartId, quantity, relatedOrderId, recordedBy, remarks | | 盘点(CHECK) | 库存盘点 | sparePartId, quantity, recordedBy | | 调整(ADJUST) | 库存调整 | sparePartId, quantity, recordedBy | - 每次操作记录 `SparePartRecord`,包含操作后余额(balance) - 出库可关联工单(relatedOrderId) - 出库时校验库存不能为负 #### 4.4.3 备件分类 - 支持树形分类(parentId 自关联) - 分类编码唯一 - 备件通过 categoryId 关联分类 ### 4.5 能耗计量管理 #### 4.5.1 计量点管理 - 计量点按能源类型分类:照明插座用电、空调用电、动力用电、特殊用电、给排水、燃气 - 计量点关联空间节点(spaceNodeId) - 计量点状态:ACTIVE(启用)/INACTIVE(停用) #### 4.5.2 能耗记录 - 抄表记录包含:上次读数、本次读数、消耗量、金额 - 消耗量 = 本次读数 - 上次读数 - 金额 = 消耗量 × 单价(计量点的 unitPrice) - 记录方式:MANUAL(手动录入)/IOT(IoT自动采集) #### 4.5.3 能耗统计 - **按类型统计**:`getConsumptionByType(projectId, month)` → `Map` - **单位面积能耗**:`getUnitConsumption(projectId, month)` → 总能耗/总建筑面积 - 支持按日期范围查询能耗趋势 --- ## 五、前端操作流程 ### 5.1 项目管理流程 ``` 项目列表页 → 新建项目 │ ├── 填写项目基本信息(编码、名称、类型、地址) ├── 系统自动生成项目编码(generate-code) ├── 创建后自动初始化 ProjectConfig(默认配置) └── 跳转到项目详情 项目详情页 ├── 基本信息Tab:编辑项目信息 ├── 成员管理Tab: │ ├── 查看成员列表(分页) │ ├── 添加成员(从企业员工中选择) │ └── 移除成员 ├── 空间管理Tab:跳转到空间节点管理 ├── 统计数据Tab:查看项目统计 ├── 配置管理Tab:功能开关配置 └── 状态管理:变更项目状态(需填写原因) 项目删除 ├── 先调用 delete-check 检查关联数据 ├── 有应收未收费用 → 无法删除 └── 无关联数据 → 确认删除 ``` ### 5.2 空间节点管理流程 ``` 空间管理页(左侧树 + 右侧详情) │ ├── 左侧树形导航 │ ├── 加载项目空间树(getSpaceTree) │ ├── 点击节点 → 右侧显示详情 │ └── 展开/折叠节点 │ ├── 右侧详情区 │ ├── 节点基本信息 │ ├── 面积信息 │ ├── 地址信息 │ └── 子节点列表(表格) │ ├── 新增节点 │ ├── 选择父节点 │ ├── 选择节点类型(NodeType) │ ├── 自动填充 NodeCategory │ └── 填写名称、面积等信息 │ ├── 批量创建 │ ├── 批量创建楼栋/单元/房间 │ └── 受 BatchOperationValidator 限制 │ ├── 设备管理 │ ├── 创建设备(isEquipment=true) │ ├── 批量创建设备 │ ├── Excel导入设备 │ ├── 查看设备列表 │ ├── 查看特种设备列表 │ └── 查看即将年检设备(90天内) │ └── 删除节点 ├── 删除前检查(delete-check) └── 确认删除或级联删除 ``` ### 5.3 巡检管理流程 ``` 巡检标准项管理 │ ├── 标准项列表页 │ ├── 按设备类型/系统类型筛选 │ ├── 仅查看启用项(activeOnly) │ ├── 新增标准项 │ ├── 编辑标准项 │ └── 停用/启用标准项 │ └── 巡检模板管理 ├── 模板列表页(按项目筛选) ├── 新增模板 │ ├── 选择设备类型 │ ├── 配置检查项(从标准项库选择) │ └── 设置预计耗时 ├── 编辑模板 ├── 复制模板 └── 按设备类型查模板 巡检记录管理 │ ├── 记录列表页 │ ├── 按设备/计划/巡检人/状态/日期筛选 │ └── 查看记录详情 │ ├── 创建巡检记录 │ ├── 选择设备 │ ├── 填写巡检日期和巡检人 │ ├── 逐项填写检查结果 │ ├── 上报异常问题 │ └── 签到(时间、位置、照片) │ └── 完成巡检 └── 调用 complete 接口标记完成 ``` ### 5.4 备件管理流程 ``` 备件分类管理 │ ├── 分类列表 ├── 新增分类(支持树形层级) └── 编辑分类 备件台账管理 │ ├── 备件列表页 │ ├── 按项目筛选 │ ├── 按分类筛选 │ ├── 低库存预警标识 │ └── 新增/编辑/删除备件 │ ├── 入库操作 │ ├── 选择备件 │ ├── 输入入库数量 │ └── 确认入库 → 更新 currentStock │ ├── 出库操作 │ ├── 选择备件 │ ├── 输入出库数量 │ ├── 可关联工单 │ └── 确认出库 → 更新 currentStock │ └── 出入库记录 └── 查看备件的所有操作流水 低库存预警 │ └── 低库存备件列表(currentStock < safeStock) ``` ### 5.5 能耗管理流程 ``` 计量点管理 │ ├── 计量点列表页 │ ├── 按项目筛选 │ ├── 按能源类型筛选 │ └── 新增/编辑/删除计量点 │ └── 计量点详情 ├── 关联空间节点 ├── 额定容量、单价 └── 状态管理 能耗抄表 │ ├── 录入能耗 │ ├── 选择计量点 │ ├── 输入本次读数 │ ├── 系统自动计算消耗量和金额 │ └── 选择记录方式(手动/IoT) │ └── 能耗记录查询 ├── 按计量点查询 └── 按日期范围查询 能耗统计 │ ├── 按类型统计 │ └── 指定月份各能源类型消耗量 │ └── 单位面积能耗 └── 总能耗/总建筑面积 ``` --- ## 六、与原需求文档 02-SPACE_NODE_DESIGN.md 的差异对比 ### 6.1 数据模型差异 | 对比项 | 原需求文档设计 | 实际代码实现 | 差异分析 | |--------|---------------|-------------|----------| | **API路径前缀** | `/api/v1/mdm/space-nodes` | `/api/mdm/space-nodes` | 去掉了v1版本号 | | **code字段** | 有 `code` 列,`UNIQUE(project_id, code)` | 无 `code` 列,列名 `project_code` 实际存 projectId | 原设计的空间编码未实现,project_code 列名与实际存储不匹配 | | **PostGIS字段** | `location GEOMETRY(Point)`, `boundary GEOMETRY(Polygon)` | 无PostGIS字段 | 地图服务未实现,仅保留经纬度数值字段 | | **attributes字段** | JSONB类型 | String(2000) | 降级为字符串存储JSON,未使用PostgreSQL JSONB | | **设备扩展字段** | 未设计(设备独立为 asset_equipment 表) | SpaceNode 内嵌设备扩展字段 | 实际采用"空间+设备"混合模型,isEquipment标记 | | **NodeType枚举** | 无 PUBLIC_ROOM | 增加 PUBLIC_ROOM(公共用房) | 实际增加了公共用房类型 | | **删除方式** | 未明确 | 软删除(isDeleted字段) | 实际采用软删除 | | **唯一约束** | `UNIQUE(project_id, code)` | 无唯一约束 | 空间编码唯一性未在数据库层面约束 | | **索引** | GIST空间索引、GIN属性索引 | 普通B-tree索引 | 无空间索引和JSON索引 | ### 6.2 API接口差异 | 对比项 | 原需求文档设计 | 实际代码实现 | 差异分析 | |--------|---------------|-------------|----------| | **树形查询** | `GET /tree` 全局树 | `GET /project/{projectId}/tree` 按项目 | 实际按项目维度查询,更合理 | | **祖先节点** | `GET /{id}/ancestors` | 未实现 | 祖先链查询缺失 | | **子孙节点** | `GET /{id}/descendants` | 未实现 | 可通过 treePath LIKE 查询替代 | | **移动节点** | `PUT /{id}/move` | 未实现 | 节点移动功能缺失 | | **类型快捷查询** | `/buildings`, `/rooms`, `/parking-spaces`, `/shops` | `GET /project/{projectId}/type/{nodeType}` | 统一为按类型查询,更通用 | | **批量更新** | `PUT /batch` | 未实现 | 仅支持批量创建 | | **批量删除** | `DELETE /batch` | 未实现 | 仅支持单个/级联删除 | | **导入模板下载** | `GET /export/template` | 未实现 | 无模板下载接口 | | **数据导出** | `GET /export` | 未实现 | 无导出功能 | | **地图相关** | `/map/markers`, `/map/boundaries`, `/{id}/location`, `/{id}/boundary` | 未实现 | 地图服务完全未实现 | | **统计分析** | `/statistics`, `/statistics/by-type`, `/statistics/by-status` | 未实现 | 空间统计接口缺失 | | **删除前检查** | 未设计 | `GET /{id}/delete-check` | 实际增加了安全检查 | | **级联删除** | 未设计 | `DELETE /{id}/cascade` | 实际增加了级联删除 | | **设备管理** | 未设计(设备独立模块) | 设备CRUD集成在SpaceNodeController | 空间与设备管理合并 | | **Excel导入** | 空间节点导入 | 仅设备导入 | 空间节点批量导入未实现 | | **楼层信息** | 未设计 | `GET /{buildingId}/floor-info` | 实际增加了楼栋楼层信息接口 | ### 6.3 前端差异 | 对比项 | 原需求文档设计 | 实际代码实现 | 差异分析 | |--------|---------------|-------------|----------| | **地图模式** | 高德地图集成,支持标注/绘制/路径 | 未实现 | 地图功能完全未开发 | | **MapEditor组件** | AMap SDK集成 | 未实现 | - | | **空间编码** | 自动生成空间编码规则 | 未实现 | SpaceNode无code字段 | | **批量创建房间** | 支持 startFloor/endFloor/roomsPerFloor 模板 | 仅支持 DTO 列表批量创建 | 智能批量创建未实现 | ### 6.4 业务规则差异 | 对比项 | 原需求文档设计 | 实际代码实现 | 差异分析 | |--------|---------------|-------------|----------| | **设备模型** | 独立 Equipment 实体(asset_equipment表) | SpaceNode 内嵌设备扩展字段 | 两种模型并存:module-mdm 用 SpaceNode 扩展,module-asset 用独立 Equipment | | **项目统计** | 数据库视图实时计算 | ProjectStatistics 实体快照 | 实际采用快照模式,需手动同步 | | **空间编码** | 自动生成编码规则 | 未实现 | 无自动编码机制 | | **PostGIS** | 空间查询(范围搜索、距离计算) | 未使用 | 无空间数据库能力 | ### 6.5 差异总结 | 类别 | 已实现 | 部分实现 | 未实现 | |------|--------|----------|--------| | **数据模型** | 基础字段、树形结构、NodeType枚举 | 设备扩展字段(混合模型) | PostGIS、JSONB、空间编码 | | **API接口** | 基础CRUD、树形查询、设备管理 | 批量操作 | 地图服务、统计分析、导入导出 | | **前端** | 树形导航、表单编辑 | - | 地图模式、智能批量创建 | | **业务规则** | 删除检查、级联删除 | - | 空间编码、空间查询 | --- ## 附录A:服务层接口清单 | 服务 | 关键方法 | |------|----------| | ProjectService | create, update, delete, findById, findByCode, queryProjects, getSelectorList, generateCode, changeStatus, checkProjectDelete | | ProjectMemberService | getMembers, addMembers, removeMember | | ProjectConfigService | getConfig, updateConfig | | ProjectStatisticsService | getStatistics | | SpaceNodeService | create, batchCreate, update, delete, deleteWithChildren, findById, findByProjectId, getTreeByProjectId, findRootsByProjectId, findChildren, findByProjectIdAndNodeType, checkDeleteInfo, getEquipmentById, getEquipmentList, getSpecialEquipmentList, getExpiringInspectionEquipment, createEquipment, batchCreateEquipment, importEquipmentFromExcel, getBuildingFloorInfo | | InspectionItemService | createItem, getItemById, updateItem, deleteItem, getAllItems, getActiveItems, getItemsByEquipmentType, getItemsBySystemType, getItemsByEquipmentTypeAndSystemType | | InspectionTemplateService | createTemplate, getTemplateById, updateTemplate, getTemplatesByProject, getTemplatesByType, copyTemplate | | InspectionRecordService | createRecord, getRecordById, updateRecord, deleteRecord, completeRecord, getAllRecords, getRecordsByEquipment, getRecordsByEquipmentAndDateRange, getRecordsByPlan, getRecordsByInspector, getRecordsByStatus, getRecordsByDateRange | | SparePartService | createSparePart, getSparePartById, updateSparePart, deleteSparePart, getSparePartsByProject, getSparePartsByCategory, getLowStockParts, inStock, outStock, getSparePartRecords, getCategories, createCategory | | EnergyMeterService | createMeter, getMeterById, updateMeter, deleteMeter, getMetersByProject, getMetersByType | | EnergyConsumptionService | recordConsumption, getConsumptionByMeter, getConsumptionByMeterAndDateRange, getConsumptionByType, getUnitConsumption | --- ## 附录B:前端API文件对照 | 前端文件 | 对应后端Controller | 说明 | |----------|-------------------|------| | `src/api/project.ts` | ProjectController | 项目CRUD、成员、配置、统计 | | `src/api/space.ts` | SpaceNodeController | 空间节点CRUD、树形查询 | | `src/api/inspection-item.ts` | InspectionItemController | 巡检标准项CRUD | | `src/api/inspection-template.ts` | InspectionTemplateController | 巡检模板CRUD | | `src/api/inspection-record.ts` | InspectionRecordController | 巡检记录CRUD | | `src/api/sparepart.ts` | SparePartController | 备件CRUD、出入库 | | `src/api/energy.ts` | EnergyController | 计量点CRUD、能耗记录 | | `src/api/maintenance-plan.ts` | - | 维保计划(独立模块) | | `src/types/project.ts` | - | 项目相关类型定义 | | `src/types/space.ts` | - | 空间节点类型定义 | --- **文档生成说明**:本文档基于 `ether-pms/module-mdm` 模块的实际代码反推生成,涵盖13个实体、7个控制器、11个服务接口的完整分析。所有字段、枚举、API端点均来源于实际代码,与原需求文档的差异已在第六章详细对比。