# 跨域业务流程 - 详细设计

**文档类型**: 详细设计文档
**生成日期**: 2026-05-18
**数据来源**: REVERSE-FINANCE.md + REVERSE-AUTH.md + 路由/API层源码 + 后端实体分析

---

## 一、业主报修全流程

### 1.1 流程概述

业主报修是Ether系统中最核心的跨域业务流程，涉及从业主发起报修到最终评价的完整生命周期：

**业主提交报修 -> 系统创建工单 -> 调度派单 -> 维保人员执行 -> 业主验收 -> 评价反馈**

### 1.2 涉及域和功能点

| 步骤 | 涉及域 | 功能点 | API端点 |
|------|--------|--------|---------|
| 1. 业主身份识别 | 认证域 | 业主登录、Token验证 | `POST /api/auth/login` |
| 2. 项目/空间定位 | 空间域 | 获取业主关联房产 | `GET /api/mdm/space-nodes/project/{projectId}/tree` |
| 3. 设备关联（可选） | 设备域 | 按空间查询设备 | `GET /api/asset/equipment/by-space/{spaceNodeId}` |
| 4. 创建工单 | 运营域 | 创建报修工单 | `POST /api/wo/work-orders` |
| 5. 工单派发 | 运营域 | 指派维保人员 | `POST /api/wo/work-orders/{id}/assign` |
| 6. 开始执行 | 运营域 | 维保人员接单 | `POST /api/wo/work-orders/{id}/start` |
| 7. 完成工单 | 运营域 | 填写处理结果 | `POST /api/wo/work-orders/{id}/complete` |
| 8. 业主验收 | 运营域 | 确认维修结果 | `POST /api/wo/work-orders/{id}/verify` |
| 9. 评价反馈 | 运营域 | 评分评价 | `POST /api/wo/work-orders/{id}/verify` (含rating) |
| 10. 备件消耗 | 备件域 | 出库记录 | `POST /api/ops/spare-parts/out-stock` |
| 11. 审计记录 | 认证域 | 操作日志 | 自动记录（AOP） |

### 1.3 数据流图

```mermaid
flowchart TD
    A[业主登录] -->|POST /api/auth/login| B[获取Token+角色]
    B --> C[选择项目/房产]
    C -->|GET /api/mdm/space-nodes/project/id/tree| D[加载空间树]
    D --> E{是否关联设备?}
    E -->|是| F[选择设备]
    F -->|GET /api/asset/equipment/by-space/spaceNodeId| G[设备列表]
    E -->|否| H[直接描述问题]
    G --> I[填写报修信息]
    H --> I
    I -->|POST /api/wo/work-orders| J[工单创建 PENDING]
    J -->|POST /api/wo/work-orders/id/assign| K[派发 ASSIGNED]
    K -->|POST /api/wo/work-orders/id/start| L[执行中 IN_PROGRESS]
    L --> M{是否需要备件?}
    M -->|是| N[备件出库]
    N -->|POST /api/ops/spare-parts/out-stock| O[更新库存]
    M -->|否| P[填写处理结果]
    O --> P
    P -->|POST /api/wo/work-orders/id/complete| Q[已完成 COMPLETED]
    Q -->|POST /api/wo/work-orders/id/verify| R[已验收 VERIFIED]
    R --> S[评价评分]

    style A fill:#e1f5fe
    style J fill:#fff3e0
    style K fill:#e3f2fd
    style L fill:#fff8e1
    style Q fill:#e8f5e9
    style R fill:#e0f7fa
```

### 1.4 状态流转图

```mermaid
stateDiagram-v2
    [*] --> PENDING: 业主提交报修
    PENDING --> ASSIGNED: 管理员派单
    PENDING --> CANCELLED: 业主取消
    ASSIGNED --> IN_PROGRESS: 维保人员开始执行
    ASSIGNED --> PENDING: 退回重派
    ASSIGNED --> CANCELLED: 管理员取消
    IN_PROGRESS --> SUSPENDED: 挂起（缺件/等审批）
    IN_PROGRESS --> RETURNED: 退回（无法处理）
    IN_PROGRESS --> COMPLETED: 填写处理结果
    SUSPENDED --> IN_PROGRESS: 恢复执行
    RETURNED --> ASSIGNED: 重新派单
    COMPLETED --> VERIFIED: 业主验收通过
    COMPLETED --> IN_PROGRESS: 验收不通过，返工
    VERIFIED --> [*]: 流程结束
    CANCELLED --> [*]: 流程结束
```

### 1.5 异常场景处理

| 异常场景 | 触发条件 | 处理策略 | 涉及API |
|---------|---------|---------|---------|
| 设备不存在 | 业主选择的设备ID在数据库中不存在 | 返回404错误，提示设备不存在，允许不关联设备提交 | `GET /api/asset/equipment/{id}` |
| 派单失败 | 指定的维保人员不存在或不可用 | 返回错误提示，管理员重新选择人员 | `POST /api/wo/work-orders/{id}/assign` |
| 执行超时 | 工单超过SLA时间未完成 | 系统自动标记超时，通知项目经理 | 定时任务检查 |
| 验收不通过 | 业主对维修结果不满意 | 工单回退到IN_PROGRESS，维保人员返工 | `POST /api/wo/work-orders/{id}/complete` -> 重新执行 |
| 备件缺货 | 维修所需备件库存不足 | 工单挂起SUSPENDED，等待备件入库 | `GET /api/ops/spare-parts/low-stock` |
| 业主取消 | 业主在派单前取消 | 工单状态变为CANCELLED | `POST /api/wo/work-orders/{id}/cancel` |
| 重复提交 | 业主短时间内重复提交相同报修 | 前端防抖 + 后端幂等校验 | `POST /api/wo/work-orders` |
| 维保人员退回 | 维保人员无法处理该工单 | 工单退回RETURNED，管理员重新派单 | `POST /api/wo/work-orders/{id}/return` |
| 工单挂起 | 执行中遇到阻塞（等审批/等配件） | 工单挂起SUSPENDED，解除后恢复 | `POST /api/wo/work-orders/{id}/suspend` |
| 业主未验收 | 完成后业主长时间未验收 | 超过7天自动验收通过 | 定时任务检查 |

### 1.6 权限控制

| 角色 | 可执行操作 | 数据范围 |
|------|-----------|---------|
| 业主(OWNER) | 创建工单、查看自己的工单、验收、评价 | 仅自己创建的工单（SELF） |
| 项目管理员(PROJECT_ADMIN) | 查看项目所有工单、派单、取消 | 本项目工单（PROJECT） |
| 维保人员(MAINTENANCE) | 查看分配给自己的工单、开始、完成、退回 | 分配给自己的工单（SELF） |
| 系统管理员(SYS_ADMIN) | 所有操作 | 全部数据（ALL） |

**权限校验点**:

```
创建工单: 业主只能为关联房产创建工单
派单: 仅项目管理员/系统管理员可派单
执行: 仅被指派的维保人员可开始/完成
验收: 仅工单创建者（业主）可验收
评价: 仅工单创建者（业主）可评价
```

---

## 二、设备全生命周期管理

### 2.1 流程概述

设备全生命周期管理覆盖设备从采购入库到最终报废的完整过程：

**采购登记 -> 安装调试 -> 正常运行 -> 定期维保 -> 巡检监控 -> 故障维修 -> 报废处置**

### 2.2 涉及域和功能点

| 步骤 | 涉及域 | 功能点 | API端点 |
|------|--------|--------|---------|
| 1. 设备采购登记 | 设备域 | 创建设备记录 | `POST /api/asset/equipment` |
| 2. 安装位置关联 | 空间域 | 关联空间节点 | `PUT /api/asset/equipment/{id}` (spaceNodeId) |
| 3. 扩展信息录入 | 设备域 | 电梯/暖通/消防等扩展 | `PUT /api/asset/equipment/{id}/elevator` 等 |
| 4. 照片/文档上传 | 设备域 | 照片和文档管理 | PhotoManager / DocumentManager |
| 5. 归属主体关联 | 设备域 | 设置归属类型和主体 | `GET /api/asset/ownership-entity` |
| 6. 正常运行监控 | 设备域 | 健康度计算 | `POST /api/asset/equipment-health/calculate` |
| 7. 定期维保 | 维保域 | 创建维保计划 | `POST /api/mdm/maintenance-plans` |
| 8. 维保执行 | 维保域 | 维保工单流转 | `POST /api/ops/maintenance-tasks/{id}/start` 等 |
| 9. 巡检监控 | 巡检域 | 巡检记录 | `POST /api/mdm/inspection-records` |
| 10. 故障维修 | 运营域 | 创建维修工单 | `POST /api/wo/work-orders` |
| 11. 健康度评估 | 设备域 | MTBF/MTTR分析 | `GET /api/asset/equipment-health/mtbf/{id}` |
| 12. 设备报废 | 设备域 | 更新设备状态 | `PUT /api/asset/equipment/{id}` (status=SCRAPPED) |

### 2.3 数据流图

```mermaid
flowchart TD
    A[设备采购] -->|POST /api/asset/equipment| B[设备登记]
    B --> C[安装调试]
    C -->|PUT /api/asset/equipment/id + spaceNodeId| D[关联空间位置]
    D -->|PUT /api/asset/equipment/id/elevator| E[录入扩展信息]
    E --> F[正常运行]
    F -->|POST /api/asset/equipment-health/calculate| G[健康度评估]
    G --> H{设备状态判断}
    H -->|健康| I[定期维保]
    H -->|预警| J[加强巡检]
    H -->|异常| K[故障维修]

    I -->|POST /api/mdm/maintenance-plans| L[创建维保计划]
    L -->|定时任务| M[生成维保工单]
    M -->|POST /api/ops/maintenance-tasks/id/start| N[执行维保]
    N -->|POST /api/ops/maintenance-tasks/id/complete| O[维保完成]
    O --> F

    J -->|POST /api/mdm/inspection-records| P[巡检记录]
    P --> Q{发现异常?}
    Q -->|是| K
    Q -->|否| F

    K -->|POST /api/wo/work-orders| R[创建维修工单]
    R -->|POST /api/wo/work-orders/id/complete| S[维修完成]
    S -->|POST /api/asset/equipment-health/calculate| T[重新评估健康度]
    T --> H

    F --> U{达到报废条件?}
    U -->|是| V[设备报废]
    U -->|否| I
    V -->|PUT /api/asset/equipment/id status=SCRAPPED| W[报废处置]

    style F fill:#e8f5e9
    style K fill:#ffebee
    style V fill:#f3e5f5
```

### 2.4 状态流转图

```mermaid
stateDiagram-v2
    [*] --> PURCHASED: 采购登记
    PURCHASED --> INSTALLING: 安装调试
    INSTALLING --> COMMISSIONING: 调试验收
    COMMISSIONING --> RUNNING: 验收通过
    COMMISSIONING --> INSTALLING: 验收不通过
    RUNNING --> MAINTENANCE: 定期维保
    RUNNING --> INSPECTION: 巡检监控
    RUNNING --> FAULT: 故障发生
    MAINTENANCE --> RUNNING: 维保完成
    INSPECTION --> RUNNING: 巡检正常
    INSPECTION --> FAULT: 巡检发现异常
    FAULT --> REPAIRING: 维修中
    REPAIRING --> RUNNING: 维修完成
    REPAIRING --> SCRAPPED: 无法修复
    RUNNING --> SCRAPPED: 达到使用年限
    RUNNING --> SCRAPPED: 经济性报废
    SCRAPPED --> [*]
```

### 2.5 异常场景处理

| 异常场景 | 触发条件 | 处理策略 |
|---------|---------|---------|
| 设备重复登记 | 相同序列号/资产编码已存在 | 后端校验唯一性，返回409冲突 |
| 安装位置冲突 | 同一空间节点已有同类型设备 | 允许同空间多设备，但给出提示 |
| 维保计划冲突 | 同一设备存在重叠的维保计划 | 校验计划周期不重叠 |
| 健康度计算失败 | 设备缺少历史数据 | 返回默认健康度，标记为"数据不足" |
| 维修无法修复 | 多次维修后仍故障 | 建议报废，升级审批流程 |
| 备件不兼容 | 维修使用的备件与设备不匹配 | 备件选择时按设备类型筛选 |
| 巡检数据异常 | 巡检结果与设备状态不符 | 标记为"需复核"，触发二次巡检 |
| 报废审批 | 高价值设备报废 | 需项目经理审批确认 |

### 2.6 权限控制

| 角色 | 可执行操作 | 数据范围 |
|------|-----------|---------|
| 系统管理员(SYS_ADMIN) | 设备全生命周期操作 | ALL |
| 项目管理员(PROJECT_ADMIN) | 本项目设备管理 | PROJECT |
| 工程人员(ENGINEERING) | 设备登记、维保、巡检 | PROJECT + DEPARTMENT |
| 维保人员(MAINTENANCE) | 执行维保工单 | SELF（分配给自己的） |
| 业主(OWNER) | 查看关联设备信息 | SELF（关联房产的设备） |

---

## 三、预防性维保调度流程

### 3.1 流程概述

预防性维保调度是基于维保计划自动生成维保工单的定时调度流程：

**创建维保计划 -> 定时调度检查 -> 自动生成维保工单 -> 派单执行 -> 验收 -> 更新设备记录**

### 3.2 涉及域和功能点

| 步骤 | 涉及域 | 功能点 | API端点 |
|------|--------|--------|---------|
| 1. 创建维保计划 | 维保域 | 设置设备、周期、维保内容 | `POST /api/mdm/maintenance-plans` |
| 2. 定时调度检查 | 维保域 | MaintenanceScheduler检查到期计划 | 定时任务（Cron） |
| 3. 自动生成工单 | 运营域 | 根据计划创建维保工单 | `POST /api/ops/maintenance-tasks` |
| 4. 自动派单 | 运营域 | 按计划指定维保人员/供应商 | `POST /api/ops/maintenance-tasks/{id}/assign` |
| 5. 执行维保 | 运营域 | 维保人员执行 | `POST /api/ops/maintenance-tasks/{id}/start` |
| 6. 记录备件消耗 | 备件域 | 出库记录 | `POST /api/ops/spare-parts/out-stock` |
| 7. 完成维保 | 运营域 | 填写维保结果 | `POST /api/ops/maintenance-tasks/{id}/complete-details` |
| 8. 验收 | 运营域 | 验收确认 | `POST /api/ops/maintenance-tasks/{id}/verify` |
| 9. 更新计划 | 维保域 | 更新lastDate和nextDate | `PUT /api/mdm/maintenance-plans/{id}` |
| 10. 更新设备 | 设备域 | 更新设备维保信息 | `PUT /api/asset/equipment/{id}` |

### 3.3 数据流图

```mermaid
flowchart TD
    A[管理员创建维保计划] -->|POST /api/mdm/maintenance-plans| B[计划存储 ACTIVE]
    B --> C{MaintenanceScheduler}
    C -->|每天凌晨检查| D{nextDate <= 今天?}
    D -->|是| E{计划状态=ACTIVE?}
    D -->|否| C
    E -->|是| F[自动生成维保工单]
    E -->|否| C
    F -->|POST /api/ops/maintenance-tasks| G[工单 PENDING]
    G -->|POST /api/ops/maintenance-tasks/id/assign| H[派发 ASSIGNED]
    H -->|POST /api/ops/maintenance-tasks/id/start| I[执行中 IN_PROGRESS]
    I --> J{需要备件?}
    J -->|是| K[备件出库]
    K -->|POST /api/ops/spare-parts/out-stock| L[更新库存]
    J -->|否| M[填写维保结果]
    L --> M
    M -->|POST /api/ops/maintenance-tasks/id/complete-details| N[已完成 COMPLETED]
    N -->|POST /api/ops/maintenance-tasks/id/verify| O[已验收 VERIFIED]
    O -->|PUT /api/mdm/maintenance-plans/id| P[更新计划lastDate/nextDate]
    P -->|PUT /api/asset/equipment/id| Q[更新设备维保信息]
    Q --> C

    style C fill:#fff3e0
    style F fill:#e3f2fd
    style O fill:#e0f7fa
```

### 3.4 定时调度设计（MaintenanceScheduler）

**调度器配置**:

| 配置项 | 值 | 说明 |
|--------|-----|------|
| Cron表达式 | `0 0 6 * * ?` | 每天凌晨6点执行 |
| 检查范围 | 所有ACTIVE状态的维保计划 | nextDate <= 当天 |
| 生成策略 | 每个到期计划生成一个维保工单 | triggerType = PLAN |
| 防重复 | 检查同一计划+同一天是否已生成工单 | 避免重复生成 |
| 通知 | 生成工单后通知项目管理员 | 待实现 |

**调度逻辑伪代码**:

```
MaintenanceScheduler.execute():
  1. 查询所有 ACTIVE 状态的维保计划
  2. 过滤 nextDate <= 今天 的计划
  3. 对每个到期计划:
     a. 检查是否已生成工单（planId + 当天日期）
     b. 若未生成，创建维保工单:
        - taskType = PREVENTIVE
        - triggerType = PLAN
        - equipmentId = plan.equipmentId
        - title = "预防性维护: " + plan.planName
        - assignedVendor = plan.assignedVendor
     c. 更新计划 lastDate = 今天, nextDate = 今天 + plan.cycleDays
  4. 发送通知给相关项目管理员
```

**nextDate计算规则**:

```
nextDate = lastDate + cycleDays
首次: nextDate = 创建日期 + cycleDays
完成后: nextDate = 实际完成日期 + cycleDays
```

### 3.5 异常场景处理

| 异常场景 | 触发条件 | 处理策略 |
|---------|---------|---------|
| 计划已暂停 | 计划状态为SUSPENDED | 跳过该计划，不生成工单 |
| 计划已停用 | 计划状态为INACTIVE | 跳过该计划，不生成工单 |
| 设备已报废 | 关联设备状态为SCRAPPED | 自动暂停计划，通知管理员 |
| 重复生成 | 同一计划同一天已生成工单 | 跳过，幂等处理 |
| 供应商不可用 | assignedVendor对应的供应商已失效 | 生成工单但不自动派单，通知管理员手动派单 |
| 备件不足 | 维保所需备件库存不足 | 工单挂起SUSPENDED，等待备件入库 |
| 维保超时 | 工单超过预估时间未完成 | 通知项目经理，标记超时 |
| 调度服务宕机 | 定时任务未执行 | 启动时补偿执行，检查遗漏的计划 |

### 3.6 权限控制

| 角色 | 可执行操作 | 数据范围 |
|------|-----------|---------|
| 系统管理员(SYS_ADMIN) | 创建/修改/删除维保计划 | ALL |
| 项目管理员(PROJECT_ADMIN) | 创建/修改本项目维保计划 | PROJECT |
| 工程人员(ENGINEERING) | 查看维保计划 | PROJECT |
| 维保人员(MAINTENANCE) | 执行分配的维保工单 | SELF |
| 外部供应商 | 执行指派的维保工单 | SELF（通过assignedVendor） |

---

## 四、巡检异常处理流程

### 4.1 流程概述

巡检异常处理流程描述巡检过程中发现异常后的上报和处理机制：

**巡检执行 -> 发现异常 -> 上报异常 -> 创建工单 -> 处理异常 -> 复检确认**

### 4.2 涉及域和功能点

| 步骤 | 涉及域 | 功能点 | API端点 |
|------|--------|--------|---------|
| 1. 加载巡检模板 | 巡检域 | 获取点检模板 | `GET /api/ops/inspection-templates?projectId=` |
| 2. 执行巡检 | 巡检域 | 创建巡检记录 | `POST /api/mdm/inspection-records` |
| 3. 记录巡检项 | 巡检域 | 逐项检查并记录 | InspectionRecordItem[] |
| 4. 发现异常 | 巡检域 | 标记异常项 + 问题描述 | problems[] + status=ABNORMAL |
| 5. 完成巡检 | 巡检域 | 提交巡检结果 | `POST /api/mdm/inspection-records/{id}/complete` |
| 6. 自动创建工单 | 运营域 | 根据异常自动创建工单 | `POST /api/wo/work-orders` |
| 7. 派单处理 | 运营域 | 指派维修人员 | `POST /api/wo/work-orders/{id}/assign` |
| 8. 维修执行 | 运营域 | 执行维修 | `POST /api/wo/work-orders/{id}/start` -> `complete` |
| 9. 复检 | 巡检域 | 对异常项进行复检 | `POST /api/mdm/inspection-records` (复检记录) |
| 10. 更新设备状态 | 设备域 | 更新设备运行状态 | `PUT /api/asset/equipment/{id}` |

### 4.3 数据流图

```mermaid
flowchart TD
    A[巡检人员选择设备] -->|GET /api/ops/inspection-templates| B[加载点检模板]
    B --> C[逐项检查]
    C --> D{检查结果}
    D -->|全部正常| E[标记NORMAL]
    D -->|部分预警| F[标记WARNING]
    D -->|发现异常| G[标记ABNORMAL]

    E -->|POST /api/mdm/inspection-records/id/complete| H[巡检完成]
    F --> H
    G --> I[记录异常详情]
    I -->|problems数组| J[提交巡检记录]
    J -->|POST /api/mdm/inspection-records/id/complete| K[巡检完成 ABNORMAL]

    K --> L{异常严重度}
    L -->|HIGH 严重| M[自动创建紧急工单]
    L -->|MEDIUM 中等| N[自动创建普通工单]
    L -->|LOW 轻微| O[记录待处理]

    M -->|POST /api/wo/work-orders priority=URGENT| P[工单 PENDING]
    N -->|POST /api/wo/work-orders priority=MEDIUM| P
    O --> Q[定期汇总处理]

    P -->|POST /api/wo/work-orders/id/assign| R[派发 ASSIGNED]
    R -->|POST /api/wo/work-orders/id/start| S[执行中 IN_PROGRESS]
    S -->|POST /api/wo/work-orders/id/complete| T[已完成 COMPLETED]
    T -->|POST /api/wo/work-orders/id/verify| U[已验收 VERIFIED]

    U --> V[复检]
    V -->|POST /api/mdm/inspection-records 复检记录| W{复检结果}
    W -->|通过| X[更新设备状态正常]
    W -->|不通过| Y[重新创建工单]
    X -->|PUT /api/asset/equipment/id| Z[流程结束]
    Y --> P

    style G fill:#ffebee
    style K fill:#fff3e0
    style M fill:#ffcdd2
    style X fill:#e8f5e9
```

### 4.4 异常场景处理

| 异常场景 | 触发条件 | 处理策略 |
|---------|---------|---------|
| 巡检模板缺失 | 设备类型无对应模板 | 允许自由录入巡检项，提示管理员创建模板 |
| 巡检中断 | 巡检过程中网络断开 | 本地暂存巡检数据，恢复后提交 |
| 异常误报 | 巡检人员误判为异常 | 复检时纠正，工单可取消 |
| 工单创建失败 | 自动创建工单时后端异常 | 巡检记录仍保存，手动创建工单 |
| 维修后复检不通过 | 异常未完全修复 | 重新创建工单，升级优先级 |
| 多次复检不通过 | 同一异常反复出现 | 标记为"顽固故障"，建议设备报废评估 |
| 巡检人员不足 | 无可用巡检人员 | 延迟巡检，通知项目经理 |
| 设备无法巡检 | 设备位置不可达或停机 | 记录原因，标记为"待巡检" |

### 4.5 权限控制

| 角色 | 可执行操作 | 数据范围 |
|------|-----------|---------|
| 巡检人员(INSPECTOR) | 执行巡检、记录异常 | SELF（分配给自己的巡检任务） |
| 项目管理员(PROJECT_ADMIN) | 查看巡检结果、派单处理 | PROJECT |
| 维保人员(MAINTENANCE) | 处理异常工单 | SELF（分配给自己的工单） |
| 系统管理员(SYS_ADMIN) | 管理巡检模板 | ALL |

---

## 五、能耗计费流程

### 5.1 流程概述

能耗计费流程覆盖从抄表到最终支付的完整计费链路，部分环节已实现：

**抄表录入 -> 消耗量计算 -> 费用计算 -> 账单生成 -> 催缴提醒 -> 支付 -> 滞纳金计算 [部分实现]**

### 5.2 涉及域和功能点

| 步骤 | 涉及域 | 功能点 | 实现状态 | API端点 |
|------|--------|--------|---------|---------|
| 1. 计量点管理 | MDM域 | 创建/管理计量点 | 已实现 | `POST/GET/PUT/DELETE /api/ops/energy/meters` |
| 2. 抄表录入 | MDM域 | 录入能耗读数 | 已实现 | `POST /api/ops/energy/consumption` |
| 3. 消耗量计算 | MDM域 | currentReading - previousReading | 已实现 | 自动计算 |
| 4. 费用计算 | MDM域 | consumption * unitPrice | 已实现 | 自动计算 |
| 5. 按类型统计 | MDM域 | 按能源类型汇总 | 已实现(有缺陷) | `GET /api/ops/energy/statistics/by-type` |
| 6. 单方能耗 | MDM域 | 项目总消耗/总面积 | 已实现 | `GET /api/ops/energy/statistics/unit-consumption` |
| 7. 收费项目配置 | 财务域 | 创建按用量计费的收费项目 | 未实现 | `POST /api/finance/fee-items` |
| 8. 账单生成 | 财务域 | 根据能耗数据生成账单 | 未实现 | `POST /api/finance/bills/generate` |
| 9. 催缴提醒 | 财务域 | 到期/逾期提醒 | 未实现 | 定时任务 |
| 10. 滞纳金计算 | 财务域 | 逾期天数 * 日利率 | 未实现 | 定时任务 |
| 11. 线下收款 | 财务域 | 登记支付 | 未实现 | `POST /api/finance/payments` |
| 12. 线上支付 | 财务域 | 微信/支付宝 | 未实现 | `POST /api/finance/payments/online/prepare` |
| 13. 退款 | 财务域 | 退款申请/审批/执行 | 未实现 | `POST /api/finance/refunds` |

### 5.3 数据流图

```mermaid
flowchart TD
    subgraph 已实现
        A[创建计量点] -->|POST /api/ops/energy/meters| B[EnergyMeter]
        B --> C[抄表录入]
        C -->|POST /api/ops/energy/consumption| D[EnergyConsumption]
        D -->|自动计算| E[consumption = current - previous]
        E -->|自动计算| F[amount = consumption * unitPrice]
        F --> G[能耗统计]
        G -->|GET /api/ops/energy/statistics/by-type| H[按类型汇总]
        G -->|GET /api/ops/energy/statistics/unit-consumption| I[单方能耗]
    end

    subgraph 未实现
        F --> J[收费项目配置]
        J -->|POST /api/finance/fee-items type=ELECTRICITY/WATER/GAS billingMethod=USAGE| K[FeeItem]
        K --> L[账单自动生成]
        L -->|POST /api/finance/bills/generate sourceType=AUTO sourceId=EnergyConsumption.id| M[FeeBill UNPAID]
        M --> N{到期提醒}
        N -->|到期前3天| O[发送提醒]
        N -->|逾期| P[计算滞纳金]
        P -->|lateFee = 逾期天数 * payableAmount * lateFeeRate| Q[更新滞纳金]
        M --> R[支付]
        R -->|线下| S[登记收款 POST /api/finance/payments]
        R -->|线上| T[发起支付 POST /api/finance/payments/online/prepare]
        S --> U[FeePayment SUCCESS]
        T --> V[等待回调]
        V --> U
        U --> W[更新账单状态 PAID]
        U --> X{需要退款?}
        X -->|是| Y[申请退款 POST /api/finance/refunds]
        Y --> Z[审批]
        Z --> AA[执行退款]
        X -->|否| AB[流程结束]
    end

    style A fill:#e8f5e9
    style B fill:#e8f5e9
    style C fill:#e8f5e9
    style D fill:#e8f5e9
    style E fill:#e8f5e9
    style F fill:#e8f5e9
    style G fill:#e8f5e9
    style H fill:#e8f5e9
    style I fill:#e8f5e9
    style J fill:#fff3e0
    style K fill:#fff3e0
    style L fill:#fff3e0
    style M fill:#fff3e0
    style N fill:#fff3e0
    style O fill:#fff3e0
    style P fill:#fff3e0
    style Q fill:#fff3e0
    style R fill:#fff3e0
    style S fill:#fff3e0
    style T fill:#fff3e0
    style U fill:#fff3e0
    style V fill:#fff3e0
    style W fill:#fff3e0
    style X fill:#fff3e0
    style Y fill:#fff3e0
    style Z fill:#fff3e0
    style AA fill:#fff3e0
    style AB fill:#fff3e0
```

### 5.4 异常场景处理

| 异常场景 | 触发条件 | 处理策略 | 实现状态 |
|---------|---------|---------|---------|
| 读数递减 | 当前读数小于上次读数 | 拒绝录入，返回错误码6103 | 已实现 |
| 仪表不存在 | meterId在数据库中不存在 | 拒绝录入，返回错误码6101 | 已实现 |
| 仪表已停用 | 仪表状态为INACTIVE | 拒绝录入，返回错误码6102 | 已实现 |
| 单价未设置 | meter.unitPrice为null | amount设为0 | 已实现 |
| 按类型统计错误 | 全部归入LIGHTING | 修复为按meter.energyType分项汇总 | 待修复 |
| 前后端枚举不一致 | 后端6种 vs 前端5种 | 统一枚举定义 | 待修复 |
| 能耗数据缺失 | 账期内无抄表记录 | 生成0元账单，标记"无抄表数据" | 未实现 |
| 业主无关联房产 | 生成账单时业主无房产 | 跳过该业主，记录日志 | 未实现 |
| 重复生成账单 | 同一收费项目+业主+账期 | 幂等校验，跳过已存在的账单 | 未实现 |
| 支付超时 | 线上支付未收到回调 | 对账任务检查，人工介入 | 未实现 |
| 滞纳金溢出 | 计算结果超过maxLateFee | 截断为maxLateFee上限 | 未实现 |
| 部分支付后退款 | 业主部分支付后申请退款 | 按支付记录逐笔退款 | 未实现 |

### 5.5 权限控制

| 角色 | 可执行操作 | 数据范围 |
|------|-----------|---------|
| 系统管理员(SYS_ADMIN) | 管理计量点、收费项目、账单 | ALL |
| 项目管理员(PROJECT_ADMIN) | 查看本项目能耗和账单 | PROJECT |
| 财务人员(FINANCE_STAFF) | 收费登记、账单管理 | PROJECT |
| 财务主管(FINANCE_SUPERVISOR) | 退款审批、财务报表 | PROJECT |
| 业主(OWNER) | 查看自己的账单、在线缴费 | SELF |
| 巡检/维保人员 | 抄表录入 | SELF（分配给自己的） |

**已实现的权限控制**:

- 计量点管理：无特定角色限制（仅要求已登录）
- 能耗录入：无特定角色限制（仅要求已登录）
- 能耗统计：无特定角色限制（仅要求已登录）

**待实现的权限控制**:

- 收费项目管理：finance:fee-item:* 权限
- 账单管理：finance:bill:* 权限
- 支付管理：finance:payment:* 权限
- 退款管理：finance:refund:* 权限
- 业主端：仅查看自己的账单和支付记录
