579 lines
26 KiB
Markdown
579 lines
26 KiB
Markdown
# 跨域业务流程 - 详细设计
|
||
|
||
**文档类型**: 详细设计文档
|
||
**生成日期**: 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:* 权限
|
||
- 业主端:仅查看自己的账单和支付记录
|