ether-docs/_archive/DOMAIN_IMPLEMENTATION_PLAN.md

1237 lines
36 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

#
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 | 初始版本,汇总各领域实现状态与差异 | - |