ether-docs/_archive/domains-old/03-ASSET.md

26 KiB
Raw Blame History

设施设备领域技术方案

领域编号: 4.3
微服务: ether-asset
最后更新: 2026-04-26

更新记录:

  • 2026-04-26: 反向同步实际代码实现到文档。主要变更设备类型枚举更新为10种新增ENERGY_METER/LANDSCAPE/KITCHENAC→HVACFIRE_FIGHTING→FIRE_PROTECTIONPOWER_SUPPLY→ELECTRICAL删除PARKING设备状态枚举更新NORMAL→ACTIVEFAULT→INACTIVEMAINTAINING→MAINTENANCE新增4张专业扩展表Elevator/Hvac/Fire/Energy新增系统类型SystemType 9种新增归属管理OwnershipType+OwnershipEntity新增健康评分算法MTBF/MTTR标注为Beta新增故障历史EquipmentFailureHistory新增设备照片/文档JSONB内嵌新增Excel导入导出新增特种设备管理新增能耗标准字段字段名变更code→equipmentCode, name→equipmentName, locationDesc→installationLocation维保计划迁移至独立API维保记录升级为维保工单标注TODO: 维保完成率计算暂返回1.0。

一、领域概述

1.1 领域职责

设施设备领域负责管理物业资产全生命周期:

  • 设备台账管理(电梯、空调、消防、给排水、供配电等)
  • 设备维保计划与记录
  • 设备故障管理
  • 设备与工单联动

1.2 核心概念

概念 说明 对应实体
设备台账 设备基础信息和运行状态 Equipment
电梯扩展 电梯专业参数(载重/速度/注册号等) EquipmentElevator
暖通扩展 暖通空调专业参数(制冷量/制热量/能效比等) EquipmentHvac
消防扩展 消防设备专业参数(探测范围/联动/分区等) EquipmentFire
能源计量扩展 能源表计专业参数(表常数/精度/通讯等) EquipmentEnergy
健康评分 设备健康度评估结果 EquipmentHealthScore
故障历史 设备故障与维修记录 EquipmentFailureHistory
归属主体 设备归属方信息 OwnershipEntity
维保计划 定期保养计划已迁移至独立API MaintenancePlan
维保工单 维保执行工单(原维保记录升级) MaintenanceTask

二、领域模型

2.1 聚合根设计

Equipment设备台账

@Entity
@Table(name = "asset_equipment")
@Data
public class Equipment {
    @Id
    private UUID id;
    private UUID projectId;

    private String equipmentCode;   // 设备编码原code
    private String equipmentName;   // 设备名称原name

    // 分类
    private EquipmentType type;     // 10种设备类型
    private EquipmentStatus status; // ACTIVE/INACTIVE/MAINTENANCE/SCRAPPED

    // 系统类型(新增)
    private SystemType systemType;  // 所属系统类型9种

    // 品牌型号
    private String brand;
    private String model;
    private String specifications;
    private String serialNumber;

    // 厂商信息
    private String manufacturer;
    private String supplier;
    private String supplierPhone;

    // 位置
    private UUID spaceNodeId;       // 关联空间节点
    private String installationLocation; // 安装位置原locationDesc

    // 时间
    private LocalDate purchaseDate;
    private LocalDate installDate;
    private LocalDate warrantyDate;
    private Integer lifespanYears;  // 设计寿命(年)

    // 维保
    private Integer maintenanceCycle;     // 保养周期(天)
    private LocalDate lastMaintenanceDate;
    private LocalDate nextMaintenanceDate;

    // 负责人
    private UUID managerId;
    private String managerName;
    private String contactPhone;

    // 归属管理(新增)
    private OwnershipType ownershipType;  // SELF(自持)/DEVELOPER(开发商)/OWNER(业主)/VENDOR(厂商)
    private UUID ownershipEntityId;       // 归属主体ID

    // 特种设备管理(新增)
    private Boolean isSpecialEquipment;   // 是否特种设备
    private String specialEquipmentCode;  // 特种设备使用登记证编号
    private String specialEquipmentType;  // 特种设备类型
    private LocalDate specialInspectionDate; // 特种设备检验日期
    private LocalDate nextSpecialInspectionDate; // 下次检验日期

    // 能耗标准(新增)
    private String energyStandard;        // 能效标准
    private BigDecimal ratedPower;        // 额定功率(kW)
    private BigDecimal energyEfficiencyRating; // 能效等级

    // 二维码
    private String qrCode;

    // 设备照片/文档新增JSONB内嵌
    @JdbcTypeCode(SqlTypes.JSON)
    @Column(columnDefinition = "jsonb")
    private List<AttachmentDTO> photos;   // 设备照片列表

    @JdbcTypeCode(SqlTypes.JSON)
    @Column(columnDefinition = "jsonb")
    private List<AttachmentDTO> documents; // 设备文档列表

    // 扩展属性(JSONB)
    private String attributes;

    // 审计字段
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

系统类型枚举(新增):

public enum SystemType {
    ELEVATOR_SYSTEM("电梯系统"),
    HVAC_SYSTEM("暖通系统"),
    FIRE_SYSTEM("消防系统"),
    PLUMBING_SYSTEM("给排水系统"),
    ELECTRICAL_SYSTEM("供配电系统"),
    SECURITY_SYSTEM("安防系统"),
    LANDSCAPE_SYSTEM("园林系统"),
    DRAINAGE_SYSTEM("排污系统"),
    OTHER("其他");
}

归属类型枚举(新增):

public enum OwnershipType {
    SELF("自持"),
    DEVELOPER("开发商"),
    OWNER("业主"),
    VENDOR("厂商");
}

附件DTO:

@Data
public class AttachmentDTO {
    private String name;      // 文件名
    private String url;       // 文件URL
    private String type;      // 文件类型
    private Long size;        // 文件大小
    private LocalDateTime uploadedAt; // 上传时间
}

设备类型枚举:

// 设备类型枚举10种
public enum EquipmentType {
    ELEVATOR("电梯"),
    HVAC("暖通空调"),
    FIRE_PROTECTION("消防设备"),
    PLUMBING("给排水"),
    ELECTRICAL("供配电"),
    ENERGY_METER("能源计量"),
    SECURITY("安防设备"),
    LANDSCAPE("园林景观"),
    KITCHEN("厨房设备"),
    OTHER("其他设备");
}

EquipmentElevator电梯扩展表新增

@Entity
@Table(name = "asset_equipment_elevator")
@Data
public class EquipmentElevator {
    @Id
    private UUID id;
    private UUID equipmentId;       // 关联设备ID
    private UUID projectId;

    private Integer loadCapacity;   // 载重(kg)
    private BigDecimal speed;       // 速度(m/s)
    private Integer floors;         // 楼层数
    private Integer stops;          // 停站数
    private String doorType;        // 门类型
    private String driveType;       // 驱动方式
    private String registrationCode; // 使用登记证编号
    private LocalDate inspectionExpiryDate; // 检验有效期

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

EquipmentHvac暖通扩展表新增

@Entity
@Table(name = "asset_equipment_hvac")
@Data
public class EquipmentHvac {
    @Id
    private UUID id;
    private UUID equipmentId;
    private UUID projectId;

    private BigDecimal coolingCapacity;  // 制冷量(kW)
    private BigDecimal heatingCapacity;  // 制热量(kW)
    private BigDecimal cop;              // 能效比
    private String refrigerant;          // 制冷剂
    private BigDecimal airflow;          // 风量(m³/h)
    private String pipeType;             // 管道类型
    private BigDecimal pipeLength;       // 管道长度(m)

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

EquipmentFire消防扩展表新增

@Entity
@Table(name = "asset_equipment_fire")
@Data
public class EquipmentFire {
    @Id
    private UUID id;
    private UUID equipmentId;
    private UUID projectId;

    private String detectionRange;       // 探测范围
    private Boolean hasLinkage;          // 是否联动
    private String fireZone;             // 防火分区
    private String extinguishingAgent;   // 灭火剂类型
    private BigDecimal agentCapacity;    // 灭火剂容量
    private LocalDate lastTestDate;      // 上次测试日期
    private LocalDate nextTestDate;      // 下次测试日期

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

EquipmentEnergy能源计量扩展表新增

@Entity
@Table(name = "asset_equipment_energy")
@Data
public class EquipmentEnergy {
    @Id
    private UUID id;
    private UUID equipmentId;
    private UUID projectId;

    private String meterConstant;        // 表常数
    private String accuracyClass;        // 精度等级
    private String communicationProtocol; // 通讯协议
    private String meterCategory;        // 表计类别
    private BigDecimal ctRatio;          // CT变比
    private BigDecimal ptRatio;          // PT变比
    private LocalDate calibrationDate;   // 校验日期
    private LocalDate nextCalibrationDate; // 下次校验日期

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

EquipmentHealthScore健康评分新增Beta

@Entity
@Table(name = "asset_equipment_health_score")
@Data
public class EquipmentHealthScore {
    @Id
    private UUID id;
    private UUID equipmentId;
    private UUID projectId;

    private BigDecimal score;            // 健康评分(0-100)
    private String level;                // 健康等级: EXCELLENT/GOOD/FAIR/POOR
    private BigDecimal mtbf;             // 平均故障间隔时间(MTBF, 小时)
    private BigDecimal mttr;             // 平均修复时间(MTTR, 小时)
    private Integer totalFailures;       // 总故障次数
    private Integer totalMaintenance;    // 总维保次数
    private BigDecimal availability;     // 可用率(%)
    private LocalDateTime calculatedAt;  // 计算时间

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

Beta标注: 健康评分算法基于MTBF/MTTR计算当前为Beta版本评分模型和权重参数需根据实际运行数据持续优化。

EquipmentFailureHistory故障历史新增

@Entity
@Table(name = "asset_equipment_failure_history")
@Data
public class EquipmentFailureHistory {
    @Id
    private UUID id;
    private UUID equipmentId;
    private UUID projectId;

    private LocalDateTime failureTime;   // 故障时间
    private String failureType;          // 故障类型
    private String failureDescription;   // 故障描述
    private String faultCause;           // 故障原因
    private String solution;             // 解决方案
    private UUID repairWorkOrderId;      // 关联维修工单
    private LocalDateTime resolvedTime;  // 修复时间
    private Long downtimeMinutes;        // 停机时长(分钟)
    private String reportedBy;           // 报告人

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

OwnershipEntity归属主体新增

@Entity
@Table(name = "asset_ownership_entity")
@Data
public class OwnershipEntity {
    @Id
    private UUID id;
    private UUID projectId;

    private OwnershipType type;          // SELF/DEVELOPER/OWNER/VENDOR
    private String name;                 // 归属方名称
    private String contactPerson;        // 联系人
    private String contactPhone;         // 联系电话
    private String address;              // 地址
    private String description;          // 描述

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

MaintenancePlan维保计划

注意: 维保计划已迁移至独立API/api/asset/maintenance-plans),不再嵌套在设备管理接口下。

@Entity
@Table(name = "asset_maintenance_plan")
@Data
public class MaintenancePlan {
    @Id
    private UUID id;
    private UUID projectId;
    private UUID equipmentId;      // 关联设备

    private String name;
    private MaintenanceType type;  // DAILY/WEEKLY/MONTHLY/QUARTERLY/YEARLY

    // 周期
    private Integer cycleDays;     // 周期天数
    private String cronExpression; // Cron表达式

    // 内容
    private String content;        // 保养内容描述
    private String checkItems;     // 检查项清单(JSON)

    // 负责人
    private UUID maintainerId;
    private String maintainerName;

    // 提醒
    private Integer remindDays;    // 提前提醒天数

    // 状态
    private Boolean enabled;

    // 审计字段
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

MaintenanceTask维保工单原MaintenanceRecord升级

注意: 原MaintenanceRecord已升级为MaintenanceTask维保工单增加了工单状态流转、费用记录、签名确认等字段。

@Entity
@Table(name = "asset_maintenance_task")
@Data
public class MaintenanceTask {
    @Id
    private UUID id;
    private UUID equipmentId;
    private UUID planId;           // 关联计划
    private UUID projectId;

    // 工单信息
    private String taskCode;       // 工单编号
    private MaintenanceTaskStatus status; // PENDING/IN_PROGRESS/COMPLETED/CANCELLED

    // 维保信息
    private LocalDate maintenanceDate;
    private MaintenanceType type;
    private String content;

    // 执行人
    private UUID maintainerId;
    private String maintainerName;

    // 结果
    private MaintenanceResult result; // NORMAL/ABNORMAL
    private String remark;
    private String images;

    // 检查项结果
    private String checkResults;   // [{"item":"检查A","result":"PASS"}]

    // 费用(新增)
    private BigDecimal laborCost;  // 人工费
    private BigDecimal partsCost;  // 材料费
    private BigDecimal totalCost;  // 总费用

    // 签名确认(新增)
    private String signature;      // 签名图片URL

    // 关联工单
    private UUID workOrderId;      // 异常时关联的维修工单

    // 下次维保
    private LocalDate nextMaintenanceDate;

    // 审计字段
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

public enum MaintenanceTaskStatus {
    PENDING("待执行"),
    IN_PROGRESS("执行中"),
    COMPLETED("已完成"),
    CANCELLED("已取消");
}

三、设备与工单联动

3.1 故障自动报修

@Component
public class EquipmentFaultHandler {

    @Autowired
    private WorkOrderService workOrderService;

    @EventListener
    public void onEquipmentFault(EquipmentFaultEvent event) {
        Equipment equipment = event.getEquipment();

        // 创建设备维修工单
        WorkOrder workOrder = new WorkOrder();
        workOrder.setOrderType(WorkOrderType.REPAIR);
        workOrder.setTitle("设备故障: " + equipment.getEquipmentName());
        workOrder.setDescription(event.getFaultDescription());
        workOrder.setEquipmentId(equipment.getId());
        workOrder.setSpaceNodeId(equipment.getSpaceNodeId());
        workOrder.setPriority(WorkOrderPriority.HIGH);
        workOrder.setSource(WorkOrderSource.FAULT);

        workOrderService.create(workOrder);

        // 更新设备状态
        equipment.setStatus(EquipmentStatus.INACTIVE);
        equipmentRepository.save(equipment);
    }
}

3.2 维保到期提醒

@Component
public class MaintenanceReminderJob {

    @Scheduled(cron = "0 0 9 * * ?") // 每天9点执行
    public void remindUpcomingMaintenance() {
        // 查询7天内到期的维保计划
        LocalDate targetDate = LocalDate.now().plusDays(7);

        List<Equipment> equipments = equipmentRepository
            .findByNextMaintenanceDateBeforeAndStatus(targetDate, EquipmentStatus.ACTIVE);

        for (Equipment equipment : equipments) {
            notificationService.sendMaintenanceReminder(equipment);
        }
    }
}

四、实现状态与差异

4.1 实现状态

功能模块 实现状态 备注
Equipment 🟢 已实现 基础CRUD字段名已更新(equipmentCode/equipmentName/installationLocation)
EquipmentElevator 🟢 已实现 电梯专业扩展表
EquipmentHvac 🟢 已实现 暖通专业扩展表
EquipmentFire 🟢 已实现 消防专业扩展表
EquipmentEnergy 🟢 已实现 能源计量扩展表
EquipmentHealthScore 🟢 已实现(Beta) 健康评分MTBF/MTTR算法Beta版本
EquipmentFailureHistory 🟢 已实现 故障历史记录
OwnershipEntity 🟢 已实现 归属主体管理
MaintenancePlan 🟢 已实现 已迁移至独立API
MaintenanceTask 🟢 已实现 原MaintenanceRecord升级为维保工单
设备二维码 🟢 已实现 支持扫码查看设备信息
Excel导入导出 🟢 已实现 设备台账Excel导入导出
特种设备管理 🟢 已实现 特种设备登记证/检验日期
能耗标准字段 🟢 已实现 能效标准/额定功率/能效等级
设备照片/文档 🟢 已实现 JSONB内嵌存储
故障自动工单 🟡 部分实现 设备状态变更可关联工单
维保完成率计算 🟡 部分实现 TODO: 当前暂返回1.0,需实现真实计算
IoT集成 🔴 未实现 待开发

4.2 与设计方案的差异

设计项 设计方案 现有实现 差异分析
维保归属 ether-asset ether-asset 已修正:维保实体已统一在 ether-asset
设备管理 ether-asset ether-asset 已修正:设备实体已统一在 ether-asset
设备联动 故障自动工单 部分实现 功能完善中
设备类型 8种枚举 10种枚举 已扩展新增ENERGY_METER/LANDSCAPE/KITCHEN
设备状态 NORMAL/FAULT ACTIVE/INACTIVE 已修正:语义更清晰
专业扩展 4张扩展表 已新增Elevator/Hvac/Fire/Energy
健康评分 Beta实现 已新增基于MTBF/MTTR
归属管理 OwnershipEntity 已新增4种归属类型
维保记录 MaintenanceRecord MaintenanceTask 已升级:增加工单状态/费用/签名
字段命名 code/name/locationDesc equipmentCode/equipmentName/installationLocation 已修正:命名更规范

4.3 改进计划

优先级 改进项 说明
P0 维保完成率计算 当前暂返回1.0,需实现真实计算逻辑
P1 健康评分优化 Beta版评分模型需根据实际运行数据持续优化
P1 完善故障自动工单 设备状态变更时自动创建维修工单
P2 完善设备二维码功能 支持扫码报修
P3 IoT传感器接入 对接传感器数据

五、数据库表结构

-- 设备台账表
CREATE TABLE asset_equipment (
    id UUID PRIMARY KEY,
    project_id UUID NOT NULL,
    equipment_code VARCHAR(50) NOT NULL,
    equipment_name VARCHAR(100) NOT NULL,
    type VARCHAR(20) NOT NULL,
    status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE',
    system_type VARCHAR(30),
    brand VARCHAR(100),
    model VARCHAR(100),
    specifications VARCHAR(500),
    serial_number VARCHAR(100),
    manufacturer VARCHAR(100),
    supplier VARCHAR(100),
    supplier_phone VARCHAR(20),
    space_node_id UUID,
    installation_location VARCHAR(255),
    purchase_date DATE,
    install_date DATE,
    warranty_date DATE,
    lifespan_years INTEGER,
    maintenance_cycle INTEGER,
    last_maintenance_date DATE,
    next_maintenance_date DATE,
    manager_id UUID,
    manager_name VARCHAR(100),
    contact_phone VARCHAR(20),
    ownership_type VARCHAR(20),
    ownership_entity_id UUID,
    is_special_equipment BOOLEAN DEFAULT FALSE,
    special_equipment_code VARCHAR(100),
    special_equipment_type VARCHAR(50),
    special_inspection_date DATE,
    next_special_inspection_date DATE,
    energy_standard VARCHAR(100),
    rated_power DECIMAL(10,2),
    energy_efficiency_rating DECIMAL(3,1),
    qr_code VARCHAR(255),
    photos JSONB,
    documents JSONB,
    attributes JSONB,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
    UNIQUE(project_id, equipment_code)
);

-- 电梯扩展表
CREATE TABLE asset_equipment_elevator (
    id UUID PRIMARY KEY,
    equipment_id UUID NOT NULL REFERENCES asset_equipment(id),
    project_id UUID NOT NULL,
    load_capacity INTEGER,
    speed DECIMAL(5,2),
    floors INTEGER,
    stops INTEGER,
    door_type VARCHAR(50),
    drive_type VARCHAR(50),
    registration_code VARCHAR(100),
    inspection_expiry_date DATE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- 暖通扩展表
CREATE TABLE asset_equipment_hvac (
    id UUID PRIMARY KEY,
    equipment_id UUID NOT NULL REFERENCES asset_equipment(id),
    project_id UUID NOT NULL,
    cooling_capacity DECIMAL(10,2),
    heating_capacity DECIMAL(10,2),
    cop DECIMAL(5,2),
    refrigerant VARCHAR(50),
    airflow DECIMAL(10,2),
    pipe_type VARCHAR(50),
    pipe_length DECIMAL(10,2),
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- 消防扩展表
CREATE TABLE asset_equipment_fire (
    id UUID PRIMARY KEY,
    equipment_id UUID NOT NULL REFERENCES asset_equipment(id),
    project_id UUID NOT NULL,
    detection_range VARCHAR(100),
    has_linkage BOOLEAN,
    fire_zone VARCHAR(100),
    extinguishing_agent VARCHAR(50),
    agent_capacity DECIMAL(10,2),
    last_test_date DATE,
    next_test_date DATE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- 能源计量扩展表
CREATE TABLE asset_equipment_energy (
    id UUID PRIMARY KEY,
    equipment_id UUID NOT NULL REFERENCES asset_equipment(id),
    project_id UUID NOT NULL,
    meter_constant VARCHAR(50),
    accuracy_class VARCHAR(20),
    communication_protocol VARCHAR(50),
    meter_category VARCHAR(50),
    ct_ratio DECIMAL(10,2),
    pt_ratio DECIMAL(10,2),
    calibration_date DATE,
    next_calibration_date DATE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- 健康评分表
CREATE TABLE asset_equipment_health_score (
    id UUID PRIMARY KEY,
    equipment_id UUID NOT NULL REFERENCES asset_equipment(id),
    project_id UUID NOT NULL,
    score DECIMAL(5,2),
    level VARCHAR(20),
    mtbf DECIMAL(12,2),
    mttr DECIMAL(12,2),
    total_failures INTEGER DEFAULT 0,
    total_maintenance INTEGER DEFAULT 0,
    availability DECIMAL(5,2),
    calculated_at TIMESTAMP,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- 故障历史表
CREATE TABLE asset_equipment_failure_history (
    id UUID PRIMARY KEY,
    equipment_id UUID NOT NULL REFERENCES asset_equipment(id),
    project_id UUID NOT NULL,
    failure_time TIMESTAMP NOT NULL,
    failure_type VARCHAR(50),
    failure_description TEXT,
    fault_cause TEXT,
    solution TEXT,
    repair_work_order_id UUID,
    resolved_time TIMESTAMP,
    downtime_minutes BIGINT,
    reported_by VARCHAR(100),
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- 归属主体表
CREATE TABLE asset_ownership_entity (
    id UUID PRIMARY KEY,
    project_id UUID NOT NULL,
    type VARCHAR(20) NOT NULL,
    name VARCHAR(100) NOT NULL,
    contact_person VARCHAR(100),
    contact_phone VARCHAR(20),
    address VARCHAR(255),
    description TEXT,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- 维保计划表
CREATE TABLE asset_maintenance_plan (
    id UUID PRIMARY KEY,
    project_id UUID NOT NULL,
    equipment_id UUID NOT NULL,
    name VARCHAR(100) NOT NULL,
    type VARCHAR(20) NOT NULL,
    cycle_days INTEGER,
    cron_expression VARCHAR(50),
    content TEXT,
    check_items JSONB,
    maintainer_id UUID,
    maintainer_name VARCHAR(100),
    remind_days INTEGER DEFAULT 3,
    enabled BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- 维保工单表(原维保记录表升级)
CREATE TABLE asset_maintenance_task (
    id UUID PRIMARY KEY,
    equipment_id UUID NOT NULL,
    plan_id UUID,
    project_id UUID NOT NULL,
    task_code VARCHAR(50),
    status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
    maintenance_date DATE NOT NULL,
    type VARCHAR(20) NOT NULL,
    content TEXT,
    maintainer_id UUID,
    maintainer_name VARCHAR(100),
    result VARCHAR(20),
    remark VARCHAR(500),
    images TEXT,
    check_results JSONB,
    labor_cost DECIMAL(10,2),
    parts_cost DECIMAL(10,2),
    total_cost DECIMAL(10,2),
    signature VARCHAR(255),
    work_order_id UUID,
    next_maintenance_date DATE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- 创建索引
CREATE INDEX idx_equipment_project ON asset_equipment(project_id);
CREATE INDEX idx_equipment_type ON asset_equipment(type);
CREATE INDEX idx_equipment_status ON asset_equipment(status);
CREATE INDEX idx_equipment_space ON asset_equipment(space_node_id);
CREATE INDEX idx_equipment_next_maintenance ON asset_equipment(next_maintenance_date);
CREATE INDEX idx_equipment_system_type ON asset_equipment(system_type);
CREATE INDEX idx_equipment_ownership ON asset_equipment(ownership_entity_id);
CREATE INDEX idx_equipment_special ON asset_equipment(is_special_equipment) WHERE is_special_equipment = TRUE;
CREATE INDEX idx_maintenance_plan_equipment ON asset_maintenance_plan(equipment_id);
CREATE INDEX idx_maintenance_task_equipment ON asset_maintenance_task(equipment_id);
CREATE INDEX idx_maintenance_task_status ON asset_maintenance_task(status);
CREATE INDEX idx_failure_history_equipment ON asset_equipment_failure_history(equipment_id);
CREATE INDEX idx_health_score_equipment ON asset_equipment_health_score(equipment_id);

文档维护: 本领域技术方案由 ether-asset 服务负责人维护