ether-docs/02-DESIGN/domains/03-ASSET.md

371 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 设施设备领域技术方案
**领域编号**: 4.3
**微服务**: ether-asset
**最后更新**: 2026-02-14
---
## 一、领域概述
### 1.1 领域职责
设施设备领域负责管理物业资产全生命周期:
- 设备台账管理(电梯、空调、消防、给排水、供配电等)
- 设备维保计划与记录
- 设备故障管理
- 设备与工单联动
### 1.2 核心概念
| 概念 | 说明 | 对应实体 |
| ------------ | ---------------------------- | ----------------- |
| **设备台账** | 设备基础信息和运行状态 | Equipment |
| **维保计划** | 定期保养计划 | MaintenancePlan |
| **维保记录** | 保养执行记录 | MaintenanceRecord |
| **设备类型** | 设备分类(电梯/空调/消防等) | EquipmentType |
---
## 二、领域模型
### 2.1 聚合根设计
#### Equipment设备台账
```java
@Entity
@Table(name = "asset_equipment")
@Data
public class Equipment {
@Id
private UUID id;
private UUID projectId;
private String code; // 设备编码
private String name; // 设备名称
// 分类
private EquipmentType type; // ELEVATOR/AC/FIRE/PLUMBING/POWER
private EquipmentStatus status; // NORMAL/FAULT/MAINTAINING/SCRAPPED
// 品牌型号
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 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 String qrCode;
// 扩展属性(JSONB)
private String attributes;
// 审计字段
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
```
**设备类型枚举**:
```java
public enum EquipmentType {
ELEVATOR("电梯"),
AIR_CONDITIONER("空调"),
FIRE_FIGHTING("消防设备"),
PLUMBING("给排水"),
POWER_SUPPLY("供配电"),
SECURITY("安防设备"),
PARKING("停车设备"),
OTHER("其他");
}
```
#### MaintenancePlan维保计划
```java
@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;
}
```
#### MaintenanceRecord维保记录
```java
@Entity
@Table(name = "asset_maintenance_record")
@Data
public class MaintenanceRecord {
@Id
private UUID id;
private UUID equipmentId;
private UUID planId; // 关联计划
// 维保信息
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 UUID workOrderId; // 异常时关联的维修工单
// 下次维保
private LocalDate nextMaintenanceDate;
// 审计字段
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
```
---
## 三、设备与工单联动
### 3.1 故障自动报修
```java
@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.getName());
workOrder.setDescription(event.getFaultDescription());
workOrder.setEquipmentId(equipment.getId());
workOrder.setSpaceNodeId(equipment.getSpaceNodeId());
workOrder.setPriority(WorkOrderPriority.HIGH);
workOrder.setSource(WorkOrderSource.IOT);
workOrderService.create(workOrder);
// 更新设备状态
equipment.setStatus(EquipmentStatus.FAULT);
equipmentRepository.save(equipment);
}
}
```
### 3.2 维保到期提醒
```java
@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.NORMAL);
for (Equipment equipment : equipments) {
notificationService.sendMaintenanceReminder(equipment);
}
}
}
```
---
## 四、实现状态与差异
### 4.1 实现状态
| 功能模块 | 实现状态 | 备注 |
| ----------------- | ----------- | ---------------------- |
| Equipment | 🟢 已实现 | 基础CRUD、二维码生成 |
| MaintenancePlan | 🟢 已实现 | 已迁移至 ether-asset |
| MaintenanceRecord | 🟢 已实现 | 已迁移至 ether-asset |
| 设备二维码 | 🟢 已实现 | 支持扫码查看设备信息 |
| 故障自动工单 | 🟡 部分实现 | 设备状态变更可关联工单 |
| IoT集成 | 🔴 未实现 | 待开发 |
### 4.2 与设计方案的差异
| 设计项 | 设计方案 | 现有实现 | 差异分析 |
| ------------ | ------------ | ----------- | --------------------------------------- |
| **维保归属** | ether-asset | ether-asset | ✅ 已修正:维保实体已统一在 ether-asset |
| **设备管理** | ether-asset | ether-asset | ✅ 已修正:设备实体已统一在 ether-asset |
| **设备联动** | 故障自动工单 | 部分实现 | 🟡 功能完善中 |
### 4.3 改进计划
| 优先级 | 改进项 | 说明 |
| ------ | ------------------ | ---------------------------------------------------- |
| ~~P1~~ | ~~迁移维保实体~~ | ~~将MaintenancePlan/Record迁移到ether-asset~~ 已完成 |
| P2 | 完善故障自动工单 | 设备状态变更时自动创建维修工单 |
| P2 | 完善设备二维码功能 | 支持扫码报修 |
| P3 | IoT传感器接入 | 对接传感器数据 |
---
## 五、数据库表结构
```sql
-- 设备台账表
CREATE TABLE asset_equipment (
id UUID PRIMARY KEY,
project_id UUID NOT NULL,
code VARCHAR(50) NOT NULL,
name VARCHAR(100) NOT NULL,
type VARCHAR(20) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'NORMAL',
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,
location_desc 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),
qr_code VARCHAR(255),
attributes JSONB,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
UNIQUE(project_id, code)
);
-- 维保计划表
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_record (
id UUID PRIMARY KEY,
equipment_id UUID NOT NULL,
plan_id UUID,
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,
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_maintenance_plan_equipment ON asset_maintenance_plan(equipment_id);
CREATE INDEX idx_maintenance_record_equipment ON asset_maintenance_record(equipment_id);
```
---
**文档维护**: 本领域技术方案由 ether-asset 服务负责人维护