1237 lines
36 KiB
Markdown
1237 lines
36 KiB
Markdown
#
|
||
Ether 智慧物业管理平台 - 领域技术实现方案
|
||
|
||
**文档版本**: v1.0
|
||
**最后更新**: 2026-02-10
|
||
**编制依据**: 需求规格说明书、领域模型详细设计、现有代码实现
|
||
|
||
---
|
||
|
||
## 一、领域划分总览
|
||
|
||
根据需求规格说明书,系统划分为 **6大领域**:
|
||
|
||
| 领域 | 微服务 | 核心职责 | 实现状态 |
|
||
|------|--------|----------|----------|
|
||
| **4.1 空间与主数据领域** | ether-mdm | 物理数字孪生底座 | 🟡 部分实现 |
|
||
| **4.2 运营调度领域** | ether-ops | 工单、巡检、排班、访客 | 🟢 基本实现 |
|
||
| **4.3 设施设备领域** | ether-asset | 资产台账、维保计划 | 🟡 部分实现 |
|
||
| **4.4 财务计费领域** | ether-finance | 账单、支付、退款 | 🟡 部分实现 |
|
||
| **4.5 权限与账户领域** | ether-auth | RBAC、访客凭证、项目隔离 | 🟢 基本实现 |
|
||
| **4.6 集成中心领域** | ether-hub | 外部系统适配、IoT网关 | 🔴 未实现 |
|
||
|
||
**图例说明**: 🟢 基本实现 | 🟡 部分实现 | 🔴 未实现
|
||
|
||
---
|
||
|
||
## 二、各领域技术实现方案
|
||
|
||
### 2.1 空间与主数据领域 (ether-mdm)
|
||
|
||
#### 2.1.1 领域职责
|
||
- 管理物理空间的数字孪生(园区→楼栋→楼层→房间)
|
||
- 房产明细与权属关系
|
||
- 业主信息管理
|
||
- 巡检管理(计划、任务、记录)
|
||
- 访客管理(预约、记录、黑名单)
|
||
|
||
#### 2.1.2 核心聚合根设计
|
||
|
||
```java
|
||
// 聚合根: SpaceNode - 空间节点
|
||
@Entity
|
||
@Table(name = "mdm_space_node")
|
||
public class SpaceNode {
|
||
@Id
|
||
private UUID id;
|
||
|
||
private UUID projectId;
|
||
private String code; // 节点编码
|
||
private String name; // 节点名称
|
||
private SpaceNodeType nodeType; // 类型: PROJECT/BUILDING/FLOOR/ROOM/AREA
|
||
private SpaceNodeStatus status;
|
||
|
||
// 树形结构
|
||
private UUID parentId;
|
||
private String treePath; // Ltree路径: 1.2.3.4
|
||
private Integer level;
|
||
|
||
// 空间属性
|
||
private BigDecimal areaSqm;
|
||
private BigDecimal longitude;
|
||
private BigDecimal latitude;
|
||
private String address;
|
||
|
||
// 扩展属性(JSONB)
|
||
private String attributes;
|
||
}
|
||
|
||
// 聚合根: RoomDetail - 房间详情
|
||
@Entity
|
||
@Table(name = "mdm_room_detail")
|
||
public class RoomDetail {
|
||
@Id
|
||
private UUID id;
|
||
private UUID spaceNodeId; // 关联SpaceNode
|
||
|
||
// 房产属性
|
||
private String roomType; // 住宅/商铺/办公/仓库
|
||
private BigDecimal buildArea; // 建筑面积
|
||
private BigDecimal usableArea; // 使用面积
|
||
private String orientation; // 朝向
|
||
private Integer floor; // 所在楼层
|
||
|
||
// 状态
|
||
private RoomStatus status; // 空置/已售/已租/装修中
|
||
}
|
||
|
||
// 聚合根: Ownership - 产权信息
|
||
@Entity
|
||
@Table(name = "mdm_ownership")
|
||
public class Ownership {
|
||
@Id
|
||
private UUID id;
|
||
|
||
private UUID spaceNodeId; // 关联房产
|
||
private UUID ownerId; // 关联业主
|
||
|
||
// 产权属性
|
||
private OwnershipType type; // 产权/使用权/租赁权
|
||
private BigDecimal sharePercent; // 产权份额
|
||
private LocalDate startDate; // 起始日期
|
||
private LocalDate endDate; // 结束日期(租赁)
|
||
|
||
// 证件信息
|
||
private String certType; // 证件类型
|
||
private String certNo; // 证件号码
|
||
private String certFileUrl; // 证件扫描件
|
||
}
|
||
|
||
// 聚合根: Owner - 业主
|
||
@Entity
|
||
@Table(name = "mdm_owner")
|
||
public class Owner {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
// 基本信息
|
||
private String name;
|
||
private String phone;
|
||
private String email;
|
||
private OwnerType type; // 个人/企业
|
||
|
||
// 证件信息
|
||
private String idCardType;
|
||
private String idCardNo;
|
||
|
||
// 关联账户
|
||
private UUID userId; // 关联系统用户
|
||
}
|
||
```
|
||
|
||
#### 2.1.3 现有实现与设计方案差异
|
||
|
||
| 设计项 | 设计方案 | 现有实现 | 差异分析 |
|
||
|--------|----------|----------|----------|
|
||
| **SpaceNode** | 使用PostGIS的geometry类型 | 使用longitude/latitude字段 | ⚠️ 移除了PostGIS依赖,简化实现 |
|
||
| **RoomDetail** | 独立实体,关联SpaceNode | 已实现 | ✅ 符合设计 |
|
||
| **Ownership** | 独立聚合根 | 已实现 | ✅ 符合设计 |
|
||
| **Owner** | 独立聚合根 | 已实现 | ✅ 符合设计 |
|
||
| **树形结构** | 使用PostgreSQL ltree扩展 | 使用treePath字符串 | ⚠️ 未使用ltree扩展 |
|
||
|
||
#### 2.1.4 巡检管理实现
|
||
|
||
```java
|
||
// 聚合根: InspectionPlan - 巡检计划
|
||
@Entity
|
||
@Table(name = "mdm_inspection_plan")
|
||
public class InspectionPlan {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String name;
|
||
private String description;
|
||
|
||
// 巡检类型
|
||
private InspectionType type; // 日常/定期/专项
|
||
|
||
// 周期配置
|
||
private String cronExpression; // Cron表达式
|
||
private LocalTime executeTime; // 执行时间
|
||
|
||
// 关联巡检点
|
||
@OneToMany(mappedBy = "plan")
|
||
private List<InspectionPoint> points;
|
||
}
|
||
|
||
// 实体: InspectionPoint - 巡检点
|
||
@Entity
|
||
@Table(name = "mdm_inspection_point")
|
||
public class InspectionPoint {
|
||
@Id
|
||
private UUID id;
|
||
private UUID planId;
|
||
|
||
private UUID spaceNodeId; // 关联空间节点
|
||
private String name;
|
||
private String description;
|
||
private Integer sortOrder;
|
||
|
||
// 检查项(JSONB)
|
||
private String checkItems; // [{"item":"消防设施","standard":"正常"}]
|
||
}
|
||
|
||
// 聚合根: InspectionTask - 巡检任务
|
||
@Entity
|
||
@Table(name = "mdm_inspection_task")
|
||
public class InspectionTask {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
private UUID planId; // 关联计划
|
||
|
||
private String taskNo;
|
||
private LocalDate planDate; // 计划日期
|
||
|
||
// 执行人
|
||
private UUID inspectorId;
|
||
private String inspectorName;
|
||
|
||
// 状态
|
||
private TaskStatus status; // 待执行/执行中/已完成/逾期
|
||
|
||
// 时间记录
|
||
private LocalDateTime startTime;
|
||
private LocalDateTime endTime;
|
||
|
||
// 关联记录
|
||
@OneToMany(mappedBy = "task")
|
||
private List<InspectionRecord> records;
|
||
}
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现 InspectionPlan、InspectionPoint、InspectionTask、InspectionRecord
|
||
|
||
#### 2.1.5 访客管理实现
|
||
|
||
```java
|
||
// 聚合根: VisitorAppointment - 访客预约
|
||
@Entity
|
||
@Table(name = "mdm_visitor_appointment")
|
||
public class VisitorAppointment {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
// 访客信息
|
||
private String visitorName;
|
||
private String visitorPhone;
|
||
private String visitorIdCard;
|
||
private VisitorType visitorType; // 访客/快递/外卖/维修
|
||
|
||
// 被访人信息
|
||
private UUID hostId;
|
||
private String hostName;
|
||
private String hostPhone;
|
||
private UUID spaceNodeId; // 访问地点
|
||
|
||
// 预约信息
|
||
private LocalDate visitDate;
|
||
private LocalTime visitTime;
|
||
private String purpose;
|
||
|
||
// 凭证
|
||
private String qrCode; // 动态二维码
|
||
private LocalDateTime qrExpireTime;
|
||
|
||
// 状态
|
||
private AppointmentStatus status; // 待确认/已确认/已取消/已完成
|
||
}
|
||
|
||
// 实体: VisitorAccessRecord - 访客通行记录
|
||
@Entity
|
||
@Table(name = "mdm_visitor_access_record")
|
||
public class VisitorAccessRecord {
|
||
@Id
|
||
private UUID id;
|
||
private UUID appointmentId;
|
||
|
||
// 通行信息
|
||
private LocalDateTime entryTime;
|
||
private LocalDateTime exitTime;
|
||
private String entryGate; // 入口
|
||
private String exitGate; // 出口
|
||
|
||
// 验证方式
|
||
private VerifyType verifyType; // 二维码/身份证/人脸识别
|
||
private String verifyCode;
|
||
}
|
||
|
||
// 实体: VisitorBlacklist - 访客黑名单
|
||
@Entity
|
||
@Table(name = "mdm_visitor_blacklist")
|
||
public class VisitorBlacklist {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String visitorName;
|
||
private String visitorPhone;
|
||
private String visitorIdCard;
|
||
|
||
private String reason; // 拉黑原因
|
||
private LocalDateTime blockTime;
|
||
private LocalDateTime expireTime; // 过期时间(null为永久)
|
||
}
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现 VisitorAppointment、VisitorAccessRecord、VisitorBlacklist
|
||
|
||
#### 2.1.6 改进计划
|
||
|
||
| 优先级 | 改进项 | 说明 |
|
||
|--------|--------|------|
|
||
| P1 | 完善SpaceNode树形结构 | 考虑引入ltree扩展或实现路径枚举模式 |
|
||
| P2 | 添加空间搜索功能 | 基于经纬度的附近空间查询 |
|
||
| P3 | 优化房产绑定流程 | 实现业主-房产-账户的自动关联 |
|
||
|
||
---
|
||
|
||
### 2.2 运营调度领域 (ether-ops)
|
||
|
||
#### 2.2.1 领域职责
|
||
- 综合工单管理(创建、分配、处理、关闭)
|
||
- 工单流转记录
|
||
- 消息通知系统(模板、规则、渠道)
|
||
- 工单统计与分析
|
||
|
||
#### 2.2.2 核心聚合根设计
|
||
|
||
```java
|
||
// 聚合根: WorkOrder - 综合工单
|
||
@Entity
|
||
@Table(name = "ops_work_order")
|
||
public class WorkOrder {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String orderNo; // 工单编号: WO2024021000001
|
||
|
||
// 工单类型
|
||
private WorkOrderType orderType; // 维修/投诉/保洁/安保/其他
|
||
private WorkOrderStatus status; // 状态机
|
||
private WorkOrderPriority priority; // 紧急/高/中/低
|
||
private WorkOrderSource source; // 来源: APP/电话/巡检/IoT
|
||
|
||
// 基本信息
|
||
private String title;
|
||
private String description;
|
||
|
||
// 报修人信息
|
||
private UUID reporterId;
|
||
private String reporterName;
|
||
private String reporterPhone;
|
||
private String reporterAddress;
|
||
|
||
// 关联信息
|
||
private UUID spaceNodeId; // 关联空间
|
||
private UUID equipmentId; // 关联设备
|
||
|
||
// 处理人信息
|
||
private UUID assigneeId;
|
||
private String assigneeName;
|
||
private LocalDateTime assignedAt;
|
||
private LocalDateTime acceptedAt;
|
||
private LocalDateTime startedAt;
|
||
private LocalDateTime completedAt;
|
||
private LocalDateTime closedAt;
|
||
|
||
// 费用
|
||
private BigDecimal actualCost;
|
||
private BigDecimal materialCost;
|
||
private BigDecimal laborCost;
|
||
|
||
// 结果
|
||
private String resultDescription;
|
||
private Integer satisfactionScore;
|
||
private String satisfactionComment;
|
||
|
||
// 附件
|
||
private String images;
|
||
private String attachments;
|
||
|
||
// 扩展属性
|
||
private String attributes;
|
||
}
|
||
|
||
// 实体: WorkOrderFlow - 工单流转记录
|
||
@Entity
|
||
@Table(name = "ops_work_order_flow")
|
||
public class WorkOrderFlow {
|
||
@Id
|
||
private UUID id;
|
||
private UUID workOrderId;
|
||
|
||
// 流转信息
|
||
private WorkOrderStatus fromStatus;
|
||
private WorkOrderStatus toStatus;
|
||
private String action; // 操作: 分配/接单/完成/关闭
|
||
|
||
// 操作人
|
||
private UUID operatorId;
|
||
private String operatorName;
|
||
private LocalDateTime operateTime;
|
||
|
||
// 备注
|
||
private String remark;
|
||
}
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现 WorkOrder、WorkOrderFlow,包含完整状态机
|
||
|
||
#### 2.2.3 状态机设计
|
||
|
||
```
|
||
CREATED(已创建)
|
||
↓ [分配]
|
||
ASSIGNED(已分配)
|
||
↓ [接单]
|
||
ACCEPTED(已接单)
|
||
↓ [开始处理]
|
||
IN_PROGRESS(处理中)
|
||
↓ [完成]
|
||
COMPLETED(已完成)
|
||
↓ [关闭]
|
||
CLOSED(已关闭)
|
||
|
||
特殊流转:
|
||
- 任意状态 → SUSPENDED(已挂起) → 恢复
|
||
- ASSIGNED → RETURNED(已退回) → 重新分配
|
||
```
|
||
|
||
**实现状态**: ✅ 状态机已实现,包含所有状态流转
|
||
|
||
#### 2.2.4 消息通知系统
|
||
|
||
```java
|
||
// 聚合根: NotificationChannel - 通知渠道
|
||
@Entity
|
||
@Table(name = "ops_notification_channel")
|
||
public class NotificationChannel {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String name;
|
||
private ChannelType type; // 站内信/短信/邮件/推送/企业微信
|
||
|
||
// 配置(JSONB)
|
||
private String config; // 渠道配置参数
|
||
private Boolean enabled;
|
||
private Integer priority; // 优先级
|
||
}
|
||
|
||
// 聚合根: NotificationTemplate - 消息模板
|
||
@Entity
|
||
@Table(name = "ops_notification_template")
|
||
public class NotificationTemplate {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String name;
|
||
private String code; // 模板编码
|
||
|
||
// 模板内容
|
||
private String titleTemplate;
|
||
private String contentTemplate;
|
||
|
||
// 变量定义
|
||
private String variables; // ["orderNo", "title", "assigneeName"]
|
||
|
||
// 适用渠道
|
||
private String channels; // ["SITE_MESSAGE", "SMS"]
|
||
}
|
||
|
||
// 聚合根: NotificationRule - 通知规则
|
||
@Entity
|
||
@Table(name = "ops_notification_rule")
|
||
public class NotificationRule {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String name;
|
||
private String eventType; // 事件类型: WORK_ORDER_CREATED
|
||
|
||
// 触发条件
|
||
private String conditions; // JSON条件表达式
|
||
|
||
// 通知配置
|
||
private String templateCode; // 关联模板
|
||
private String receivers; // 接收人配置: ["CREATOR", "ASSIGNEE"]
|
||
private String channels; // 通知渠道
|
||
|
||
private Boolean enabled;
|
||
}
|
||
|
||
// 实体: NotificationHistory - 通知历史
|
||
@Entity
|
||
@Table(name = "ops_notification_history")
|
||
public class NotificationHistory {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
// 通知内容
|
||
private String title;
|
||
private String content;
|
||
private String eventType;
|
||
|
||
// 接收人
|
||
private UUID receiverId;
|
||
private String receiverName;
|
||
private String receiverPhone;
|
||
|
||
// 渠道信息
|
||
private ChannelType channel;
|
||
private String channelMsgId; // 渠道消息ID
|
||
|
||
// 状态
|
||
private NotificationStatus status; // 待发送/已发送/发送失败/已读
|
||
private LocalDateTime sendTime;
|
||
private LocalDateTime readTime;
|
||
|
||
// 关联业务
|
||
private String businessType;
|
||
private String businessId;
|
||
}
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现 NotificationChannel、NotificationTemplate、NotificationRule、NotificationHistory
|
||
|
||
#### 2.2.5 工单与通知集成
|
||
|
||
```java
|
||
// 工单事件监听器
|
||
@Component
|
||
public class WorkOrderEventListener {
|
||
|
||
@EventListener
|
||
public void onWorkOrderCreated(WorkOrderCreatedEvent event) {
|
||
// 触发通知规则
|
||
notificationService.triggerRule("WORK_ORDER_CREATED", event.getWorkOrder());
|
||
}
|
||
|
||
@EventListener
|
||
public void onWorkOrderAssigned(WorkOrderAssignedEvent event) {
|
||
notificationService.triggerRule("WORK_ORDER_ASSIGNED", event.getWorkOrder());
|
||
}
|
||
}
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现工单与通知系统集成
|
||
|
||
#### 2.2.6 改进计划
|
||
|
||
| 优先级 | 改进项 | 说明 |
|
||
|--------|--------|------|
|
||
| P2 | 添加工单满意度评价 | 业主对工单处理结果的评价 |
|
||
| P2 | 实现SLA监控 | 工单超时预警和升级机制 |
|
||
| P3 | 智能派单算法 | 基于位置、负载、技能的自动派单 |
|
||
|
||
---
|
||
|
||
### 2.3 设施设备领域 (ether-asset)
|
||
|
||
#### 2.3.1 领域职责
|
||
- 设备台账管理
|
||
- 设备维保计划
|
||
- 设备故障管理
|
||
- 设备与工单联动
|
||
|
||
#### 2.3.2 核心聚合根设计
|
||
|
||
```java
|
||
// 聚合根: Equipment - 设备台账
|
||
@Entity
|
||
@Table(name = "asset_equipment")
|
||
public class Equipment {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String code; // 设备编码
|
||
private String name; // 设备名称
|
||
|
||
// 分类
|
||
private EquipmentType equipmentType; // 电梯/空调/消防/给排水/供配电
|
||
private EquipmentStatus status; // 正常/故障/维修中/报废
|
||
|
||
// 品牌型号
|
||
private String brand;
|
||
private String model;
|
||
private String specifications;
|
||
private String serialNumber;
|
||
|
||
// 厂商信息
|
||
private String manufacturer;
|
||
private String supplier;
|
||
|
||
// 位置
|
||
private UUID spaceNodeId;
|
||
private String locationDesc;
|
||
|
||
// 时间
|
||
private LocalDate purchaseDate;
|
||
private LocalDate installDate;
|
||
private LocalDate warrantyDate;
|
||
|
||
// 维保
|
||
private Integer maintenanceCycle; // 保养周期(天)
|
||
private LocalDate lastMaintenanceDate;
|
||
private LocalDate nextMaintenanceDate;
|
||
|
||
// 负责人
|
||
private UUID managerId;
|
||
private String managerName;
|
||
private String contactPhone;
|
||
|
||
// 扩展属性
|
||
private Map<String, Object> attributes;
|
||
}
|
||
|
||
// 聚合根: MaintenancePlan - 维保计划
|
||
@Entity
|
||
@Table(name = "asset_maintenance_plan")
|
||
public class MaintenancePlan {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
private UUID equipmentId;
|
||
|
||
private String name;
|
||
private MaintenanceType type; // 日常保养/定期检修/大修
|
||
|
||
// 周期
|
||
private Integer cycleDays; // 周期天数
|
||
private String cronExpression;
|
||
|
||
// 内容
|
||
private String content; // 保养内容
|
||
private String checkItems; // 检查项清单
|
||
|
||
// 负责人
|
||
private UUID maintainerId;
|
||
private String maintainerName;
|
||
}
|
||
|
||
// 实体: MaintenanceRecord - 维保记录
|
||
@Entity
|
||
@Table(name = "asset_maintenance_record")
|
||
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; // 正常/异常/需维修
|
||
private String remark;
|
||
private String images;
|
||
|
||
// 关联工单
|
||
private UUID workOrderId; // 如产生维修工单
|
||
}
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现 Equipment,⚠️ MaintenancePlan、MaintenanceRecord 在 ether-mdm 中实现
|
||
|
||
#### 2.3.3 现有实现与设计方案差异
|
||
|
||
| 设计项 | 设计方案 | 现有实现 | 差异分析 |
|
||
|--------|----------|----------|----------|
|
||
| **Equipment** | 在 ether-asset 服务 | 在 ether-asset 服务 | ✅ 符合设计 |
|
||
| **MaintenancePlan** | 在 ether-asset 服务 | 在 ether-mdm 服务 | ❌ 领域归属错误 |
|
||
| **MaintenanceRecord** | 在 ether-asset 服务 | 在 ether-mdm 服务 | ❌ 领域归属错误 |
|
||
|
||
#### 2.3.4 设备与工单联动
|
||
|
||
```java
|
||
// 设备故障自动创建工单
|
||
@Component
|
||
public class EquipmentFaultHandler {
|
||
|
||
@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);
|
||
}
|
||
}
|
||
```
|
||
|
||
**实现状态**: ⚠️ 设计已定义,待实现
|
||
|
||
#### 2.3.5 改进计划
|
||
|
||
| 优先级 | 改进项 | 说明 |
|
||
|--------|--------|------|
|
||
| P1 | 迁移维保相关实体 | 将 MaintenancePlan、MaintenanceRecord 从 ether-mdm 迁移到 ether-asset |
|
||
| P2 | 实现设备故障自动工单 | 设备状态变更时自动创建维修工单 |
|
||
| P2 | 添加设备二维码 | 为每台设备生成唯一二维码,支持扫码查看/报修 |
|
||
| P3 | 设备IoT集成 | 对接传感器数据,实现故障预警 |
|
||
|
||
---
|
||
|
||
### 2.4 财务计费领域 (ether-finance)
|
||
|
||
#### 2.4.1 领域职责
|
||
- 收费项目管理
|
||
- 账单生成与管理
|
||
- 支付处理
|
||
- 费用催缴通知
|
||
|
||
#### 2.4.2 核心聚合根设计
|
||
|
||
```java
|
||
// 聚合根: FeeItem - 收费项目
|
||
@Entity
|
||
@Table(name = "fin_fee_item")
|
||
public class FeeItem {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String code; // 项目编码
|
||
private String name; // 项目名称
|
||
private FeeType type; // 物业费/停车费/水电费/维修基金
|
||
|
||
// 计费规则
|
||
private BillingMethod billingMethod; // 固定金额/按面积/按用量/自定义
|
||
private BigDecimal unitPrice; // 单价
|
||
private String unit; // 单位: 元/月、元/㎡·月
|
||
|
||
// 账期
|
||
private Integer billDay; // 账单日(每月几号)
|
||
private Integer dueDay; // 到期日(每月几号)
|
||
private Integer overdueDay; // 逾期日(每月几号)
|
||
|
||
// 滞纳金
|
||
private Boolean enableLateFee;
|
||
private BigDecimal lateFeeRate; // 滞纳金比例(日)
|
||
|
||
// 状态
|
||
private Boolean enabled;
|
||
}
|
||
|
||
// 聚合根: FeeBill - 收费账单
|
||
@Entity
|
||
@Table(name = "fin_fee_bill")
|
||
public class FeeBill {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String billNo; // 账单编号
|
||
|
||
// 关联信息
|
||
private UUID feeItemId; // 收费项目
|
||
private UUID spaceNodeId; // 关联房产
|
||
private UUID ownerId; // 关联业主
|
||
|
||
// 账期
|
||
private String billPeriod; // 账期: 2024-02
|
||
private LocalDate billDate; // 账单日期
|
||
private LocalDate dueDate; // 到期日期
|
||
private LocalDate overdueDate; // 逾期日期
|
||
|
||
// 金额
|
||
private BigDecimal amount; // 应收金额
|
||
private BigDecimal lateFee; // 滞纳金
|
||
private BigDecimal discount; // 优惠金额
|
||
private BigDecimal payableAmount; // 应付金额
|
||
private BigDecimal paidAmount; // 已付金额
|
||
|
||
// 状态
|
||
private BillStatus status; // 未缴费/部分缴费/已缴费/已逾期/已取消
|
||
|
||
// 关联支付记录
|
||
@OneToMany(mappedBy = "bill")
|
||
private List<FeePayment> payments;
|
||
}
|
||
|
||
// 实体: FeePayment - 支付记录
|
||
@Entity
|
||
@Table(name = "fin_fee_payment")
|
||
public class FeePayment {
|
||
@Id
|
||
private UUID id;
|
||
private UUID billId;
|
||
|
||
private String paymentNo; // 支付流水号
|
||
private BigDecimal amount; // 支付金额
|
||
|
||
// 支付方式
|
||
private PaymentMethod method; // 微信支付/支付宝/现金/转账
|
||
private String thirdPartyNo; // 第三方支付流水号
|
||
|
||
// 状态
|
||
private PaymentStatus status; // 待支付/支付成功/支付失败/已退款
|
||
|
||
// 时间
|
||
private LocalDateTime paymentTime;
|
||
private String remark;
|
||
}
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现 FeeItem、FeeBill、FeePayment
|
||
|
||
#### 2.4.3 费用催缴通知
|
||
|
||
```java
|
||
// 定时任务: 费用催缴
|
||
@Component
|
||
public class FeeReminderJob {
|
||
|
||
@Scheduled(cron = "0 0 9 * * ?") // 每天9点执行
|
||
public void remindUpcomingDue() {
|
||
// 查询3天内到期的账单
|
||
List<FeeBill> upcomingBills = feeBillRepository
|
||
.findByDueDateBetweenAndStatus(LocalDate.now(), LocalDate.now().plusDays(3), BillStatus.UNPAID);
|
||
|
||
for (FeeBill bill : upcomingBills) {
|
||
notificationService.sendFeeReminder(bill, "FEE_UPCOMING_DUE");
|
||
}
|
||
}
|
||
|
||
@Scheduled(cron = "0 0 9,18 * * ?") // 每天9点和18点执行
|
||
public void remindOverdue() {
|
||
// 查询已逾期的账单
|
||
List<FeeBill> overdueBills = feeBillRepository
|
||
.findByOverdueDateBeforeAndStatus(LocalDate.now(), BillStatus.UNPAID);
|
||
|
||
for (FeeBill bill : overdueBills) {
|
||
// 计算滞纳金
|
||
calculateLateFee(bill);
|
||
notificationService.sendFeeReminder(bill, "FEE_OVERDUE");
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现费用催缴定时任务
|
||
|
||
#### 2.4.4 现有实现与设计方案差异
|
||
|
||
| 设计项 | 设计方案 | 现有实现 | 差异分析 |
|
||
|--------|----------|----------|----------|
|
||
| **FeeItem** | 在 ether-finance 服务 | 在 ether-finance 服务 | ✅ 符合设计 |
|
||
| **FeeBill** | 在 ether-finance 服务 | ether-finance + ether-mdm 重复 | ❌ 存在重复实体 |
|
||
| **FeePayment** | 在 ether-finance 服务 | ether-finance + ether-mdm 重复 | ❌ 存在重复实体 |
|
||
|
||
#### 2.4.5 改进计划
|
||
|
||
| 优先级 | 改进项 | 说明 |
|
||
|--------|--------|------|
|
||
| P1 | 清理重复实体 | 删除 ether-mdm 中的 FeeItem、FeeBill、FeePayment |
|
||
| P2 | 实现退款功能 | 支持账单退款和退款审批流程 |
|
||
| P2 | 添加财务报表 | 收费统计、欠费分析、收入趋势 |
|
||
| P3 | 对接支付网关 | 集成微信支付、支付宝 SDK |
|
||
|
||
---
|
||
|
||
### 2.5 权限与账户领域 (ether-auth)
|
||
|
||
#### 2.5.1 领域职责
|
||
- 用户认证与授权
|
||
- RBAC权限模型
|
||
- 项目隔离
|
||
- 访客凭证管理
|
||
|
||
#### 2.5.2 核心聚合根设计
|
||
|
||
```java
|
||
// 聚合根: User - 系统用户
|
||
@Entity
|
||
@Table(name = "auth_user")
|
||
public class User {
|
||
@Id
|
||
private UUID id;
|
||
|
||
private String username;
|
||
private String password;
|
||
private String salt; // 密码盐值
|
||
|
||
// 基本信息
|
||
private String realName;
|
||
private String phone;
|
||
private String email;
|
||
|
||
// 状态
|
||
private UserStatus status;
|
||
private LocalDateTime lastLoginTime;
|
||
|
||
// 关联角色
|
||
@ManyToMany
|
||
@JoinTable(name = "auth_user_role")
|
||
private List<Role> roles;
|
||
}
|
||
|
||
// 聚合根: Role - 角色
|
||
@Entity
|
||
@Table(name = "auth_role")
|
||
public class Role {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String name;
|
||
private String code;
|
||
private RoleType type; // 系统预设/自定义
|
||
private DataScope dataScope; // 数据权限范围
|
||
|
||
// 关联权限
|
||
@ManyToMany
|
||
@JoinTable(name = "auth_role_permission")
|
||
private List<Permission> permissions;
|
||
}
|
||
|
||
// 聚合根: Permission - 权限
|
||
@Entity
|
||
@Table(name = "auth_permission")
|
||
public class Permission {
|
||
@Id
|
||
private UUID id;
|
||
|
||
private String name;
|
||
private String code; // 权限编码: user:create
|
||
private PermissionType type; // 菜单/按钮/API
|
||
|
||
// 菜单属性
|
||
private String path; // 路由路径
|
||
private String component; // 组件路径
|
||
private String icon; // 图标
|
||
private Integer sortOrder;
|
||
|
||
// 树形结构
|
||
private UUID parentId;
|
||
}
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现 User、Role、Permission、UserRole、RolePermission
|
||
|
||
#### 2.5.3 项目隔离实现
|
||
|
||
```java
|
||
// 项目上下文拦截器
|
||
@Component
|
||
public class ProjectContextInterceptor implements HandlerInterceptor {
|
||
|
||
@Override
|
||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
||
String projectId = request.getHeader("X-Project-ID");
|
||
if (StringUtils.hasText(projectId)) {
|
||
ProjectContextHolder.setCurrentProjectId(UUID.fromString(projectId));
|
||
}
|
||
return true;
|
||
}
|
||
}
|
||
|
||
// 项目上下文持有者
|
||
public class ProjectContextHolder {
|
||
private static final ThreadLocal<UUID> PROJECT_CONTEXT = new ThreadLocal<>();
|
||
|
||
public static void setCurrentProjectId(UUID projectId) {
|
||
PROJECT_CONTEXT.set(projectId);
|
||
}
|
||
|
||
public static UUID getCurrentProjectId() {
|
||
return PROJECT_CONTEXT.get();
|
||
}
|
||
}
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现 ProjectContextInterceptor、ProjectContextHolder
|
||
|
||
#### 2.5.4 访客凭证系统
|
||
|
||
```java
|
||
// 访客凭证已在 ether-mdm 的 VisitorAppointment 中实现
|
||
// 包含动态二维码生成和过期机制
|
||
```
|
||
|
||
**实现状态**: ✅ 已实现动态二维码凭证
|
||
|
||
#### 2.5.5 改进计划
|
||
|
||
| 优先级 | 改进项 | 说明 |
|
||
|--------|--------|------|
|
||
| P2 | 完善数据权限 | 实现基于角色的数据范围控制(全部/部门/个人) |
|
||
| P3 | 添加操作日志 | 记录用户关键操作,支持审计 |
|
||
| P3 | 实现单点登录 | 支持多端统一登录态 |
|
||
|
||
---
|
||
|
||
### 2.6 集成中心领域 (ether-hub)
|
||
|
||
#### 2.6.1 领域职责
|
||
- 外部系统适配(停车系统、门禁系统、政府监管平台)
|
||
- IoT设备接入
|
||
- 数据同步与转换
|
||
- 集成日志记录
|
||
|
||
#### 2.6.2 核心聚合根设计
|
||
|
||
```java
|
||
// 聚合根: IntegrationAdapter - 集成适配器
|
||
@Entity
|
||
@Table(name = "hub_integration_adapter")
|
||
public class IntegrationAdapter {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String name;
|
||
private String systemType; // PARKING/ACCESS/GOVERNMENT/IOT
|
||
private String protocol; // HTTP/MQTT/HTTPS/SOAP
|
||
|
||
// 连接配置
|
||
private String baseUrl;
|
||
private String authType; // NONE/API_KEY/OAUTH2/JWT
|
||
private String authConfig; // 认证配置(JSON)
|
||
|
||
// 状态
|
||
private Boolean enabled;
|
||
private AdapterStatus status; // 在线/离线/错误
|
||
private LocalDateTime lastPingTime;
|
||
}
|
||
|
||
// 实体: IntegrationLog - 集成日志
|
||
@Entity
|
||
@Table(name = "hub_integration_log")
|
||
public class IntegrationLog {
|
||
@Id
|
||
private UUID id;
|
||
private UUID adapterId;
|
||
|
||
// 请求信息
|
||
private String requestId;
|
||
private String operation; // 操作类型
|
||
private String requestData; // 请求数据
|
||
|
||
// 响应信息
|
||
private String responseData; // 响应数据
|
||
private Integer httpStatus; // HTTP状态码
|
||
private String errorMessage; // 错误信息
|
||
|
||
// 时间
|
||
private LocalDateTime requestTime;
|
||
private LocalDateTime responseTime;
|
||
private Long durationMs; // 耗时
|
||
|
||
// 状态
|
||
private LogStatus status; // 成功/失败/超时
|
||
}
|
||
|
||
// IoT设备接入
|
||
@Entity
|
||
@Table(name = "hub_iot_device")
|
||
public class IoTDevice {
|
||
@Id
|
||
private UUID id;
|
||
private UUID projectId;
|
||
|
||
private String deviceId; // 设备唯一标识
|
||
private String deviceType; // 传感器类型
|
||
private String protocol; // MQTT/CoAP/HTTP
|
||
|
||
// 关联信息
|
||
private UUID equipmentId; // 关联设备台账
|
||
|
||
// MQTT配置
|
||
private String mqttTopic; // 订阅主题
|
||
private String lastPayload; // 最后上报数据
|
||
private LocalDateTime lastReportTime;
|
||
|
||
// 状态
|
||
private DeviceStatus status; // 在线/离线/故障
|
||
}
|
||
```
|
||
|
||
**实现状态**: 🔴 未实现,需要新建 ether-hub 微服务
|
||
|
||
#### 2.6.3 集成场景
|
||
|
||
| 集成系统 | 协议 | 功能 |
|
||
|---------|------|------|
|
||
| 停车系统 | HTTP API | 车牌识别、车位状态同步 |
|
||
| 门禁系统 | HTTP/MQTT | 访客二维码下发、通行记录上报 |
|
||
| 政府监管 | HTTP API | 投诉工单同步、数据上报 |
|
||
| IoT传感器 | MQTT | 实时数据采集、故障报警 |
|
||
|
||
#### 2.6.4 改进计划
|
||
|
||
| 优先级 | 改进项 | 说明 |
|
||
|--------|--------|------|
|
||
| P2 | 创建 ether-hub 服务 | 新建集成中心微服务 |
|
||
| P3 | 实现停车系统集成 | 对接停车系统API |
|
||
| P3 | 实现门禁系统集成 | 对接门禁系统,支持访客二维码 |
|
||
| P3 | 实现IoT接入 | MQTT Broker配置,设备接入 |
|
||
|
||
---
|
||
|
||
## 三、领域间关系图
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 前端层 (B端/C端/G端) │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
│
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ API网关 (ether-gateway) │
|
||
│ JWT认证 / 限流 / 路由转发 │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
│
|
||
┌─────────────────────┼─────────────────────┐
|
||
│ │ │
|
||
┌───────▼──────┐ ┌────────▼────────┐ ┌──────▼──────┐
|
||
│ ether-auth │ │ ether-mdm │ │ ether-ops │
|
||
│ 权限与账户 │◄──►│ 空间与主数据 │◄──►│ 运营调度 │
|
||
│ │ │ │ │ │
|
||
│ • User │ │ • SpaceNode │ │ • WorkOrder │
|
||
│ • Role │ │ • RoomDetail │ │ • Notification│
|
||
│ • Permission │ │ • Owner │ │ │
|
||
└──────────────┘ │ • Visitor │ └─────────────┘
|
||
│ │ • Inspection │ │
|
||
│ └─────────────────┘ │
|
||
│ │ │
|
||
│ ┌────────────────┼────────────────┐ │
|
||
│ │ │ │ │
|
||
┌───────▼────▼───┐ ┌────────▼────────┐ ┌────▼─▼──────┐
|
||
│ ether-asset │ │ ether-finance │ │ ether-hub │
|
||
│ 设施设备 │ │ 财务计费 │ │ 集成中心 │
|
||
│ │ │ │ │ │
|
||
│ • Equipment │ │ • FeeItem │ │ • Adapter │
|
||
│ • Maintenance │ │ • FeeBill │ │ • IoTDevice │
|
||
│ │ │ • FeePayment │ │ │
|
||
└────────────────┘ └─────────────────┘ └─────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 四、总体差异分析汇总
|
||
|
||
### 4.1 领域归属差异
|
||
|
||
| 实体 | 设计归属 | 实际归属 | 差异等级 |
|
||
|------|----------|----------|----------|
|
||
| EquipmentMaintenance | ether-asset | ether-mdm | 🔴 高 |
|
||
| FeeItem/FeeBill/FeePayment | ether-finance | ether-mdm + ether-finance | 🔴 高 |
|
||
| InspectionPlan/Task | ether-ops | ether-mdm | 🟡 中 |
|
||
| VisitorAppointment | ether-ops | ether-mdm | 🟡 中 |
|
||
|
||
### 4.2 缺失实现
|
||
|
||
| 领域 | 缺失内容 | 优先级 |
|
||
|------|----------|--------|
|
||
| ether-hub | 整个微服务未创建 | P2 |
|
||
| ether-asset | MaintenancePlan/Record 迁移 | P1 |
|
||
| ether-finance | 退款功能、财务报表 | P2 |
|
||
| ether-ops | SLA监控、智能派单 | P3 |
|
||
|
||
### 4.3 技术实现差异
|
||
|
||
| 设计项 | 设计方案 | 实际实现 | 影响 |
|
||
|--------|----------|----------|------|
|
||
| 空间坐标 | PostGIS geometry | longitude/latitude | 功能降级 |
|
||
| 树形结构 | PostgreSQL ltree | 字符串路径 | 性能影响 |
|
||
| 设备联动 | 事件驱动 | 未实现 | 功能缺失 |
|
||
|
||
---
|
||
|
||
## 五、改进路线图
|
||
|
||
### Phase 1: 领域归属调整(1-2周)
|
||
|
||
1. **迁移 Maintenance 相关实体**
|
||
- 将 EquipmentMaintenance 从 ether-mdm 迁移到 ether-asset
|
||
- 更新外键关联和查询逻辑
|
||
|
||
2. **清理财务重复实体**
|
||
- 删除 ether-mdm 中的 FeeItem、FeeBill、FeePayment
|
||
- 统一使用 ether-finance 的实体
|
||
|
||
3. **调整巡检和访客归属**
|
||
- 评估是否需要将 Inspection、Visitor 迁移到 ether-ops
|
||
- 或保持现状,在文档中明确领域边界
|
||
|
||
### Phase 2: 功能完善(2-4周)
|
||
|
||
1. **创建设备联动**
|
||
- 实现设备故障自动创建工单
|
||
- 工单完成后更新设备状态
|
||
|
||
2. **完善财务功能**
|
||
- 实现退款功能
|
||
- 添加财务报表
|
||
|
||
3. **增强权限系统**
|
||
- 实现数据权限范围控制
|
||
- 添加操作日志
|
||
|
||
### Phase 3: 集成中心(4-6周)
|
||
|
||
1. **创建 ether-hub 服务**
|
||
- 基础框架搭建
|
||
- 数据库表设计
|
||
|
||
2. **实现停车系统集成**
|
||
- 对接停车系统API
|
||
- 车位状态同步
|
||
|
||
3. **实现门禁集成**
|
||
- 访客二维码下发
|
||
- 通行记录上报
|
||
|
||
---
|
||
|
||
## 六、文档维护
|
||
|
||
**维护原则**:
|
||
- 每次领域调整时更新本文档
|
||
- 新增实体时必须明确领域归属
|
||
- 定期(每季度)审查领域边界
|
||
|
||
**更新记录**:
|
||
|
||
| 版本 | 日期 | 更新内容 | 作者 |
|
||
|------|------|----------|------|
|
||
| v1.0 | 2026-02-10 | 初始版本,汇总各领域实现状态与差异 | - |
|