ether-docs/02-DESIGN/domains/REVERSE-FINANCE.md

24 KiB
Raw Blame History

财务域功能详细设计文档(反推自代码)

文档类型: 反推设计文档(基于实际代码逆向分析) 生成日期: 2026-04-23 分析方法: 全量搜索 ether-pms 后端代码 + ether-admin 前端代码 对比基线: ether-docs/02-DESIGN/domains/04-FINANCE.md


一、领域概述(当前实现状态)

1.1 总体结论

财务域核心功能FeeItem / FeeBill / FeePayment / FeeRefund均未实现。 不存在 module-finance 模块,不存在任何 fin_* 数据库表,不存在任何收费/账单/支付/退款相关的后端实体、服务或控制器。

当前已实现的与财务域有间接关联的功能,仅有 能耗计量管理EnergyMeter / EnergyConsumption归属在 module-mdm 模块中,实现了能耗数据的采集和简单费用计算(消耗量 × 单价),但未与账单系统对接。

1.2 实现状态总览

功能模块 设计文档状态 实际代码状态 差异
FeeItem收费项目 🟢 已实现 🔴 未实现 设计文档与实际代码不符
FeeBill收费账单 🟢 已实现 🔴 未实现 设计文档与实际代码不符
FeePayment支付记录 🟢 已实现 🔴 未实现 设计文档与实际代码不符
FeeRefund退款记录 🔴 未实现 🔴 未实现 一致
费用催缴定时任务 🟢 已实现 🔴 未实现 设计文档与实际代码不符
滞纳金计算 🟢 已实现 🔴 未实现 设计文档与实际代码不符
能耗计量管理 未在设计文档中 🟢 已实现 在 module-mdm 中实现
能耗费用计算 未在设计文档中 🟢 已实现 简单的 consumption × unitPrice
支付网关对接 🔴 未实现 🔴 未实现 一致
财务报表 🔴 未实现 🔴 未实现 一致

1.3 关键发现

  1. module-finance 模块不存在 — 在 ether-pms 中无此目录
  2. fin_* 数据库表不存在 — 无 FeeItem / FeeBill / FeePayment / FeeRefund 对应的表
  3. 设计文档 04-FINANCE.md 标注"已实现"的功能实际未实现 — 文档中 FeeItem/FeeBill/FeePayment 标记为 🟢 已实现,但代码中找不到任何对应实体
  4. 能耗管理在 module-mdm 中实现 — EnergyMeter / EnergyConsumption 实体、服务、控制器、前端页面均已实现
  5. 前端无任何财务相关页面 — ether-admin 中无 fee/bill/payment/refund 相关视图,仅有 energy 相关视图
  6. 员工端/业主端无财务功能 — ether-app-employee 和 ether-app-owner 中无任何财务相关代码

二、已实现的数据结构(能耗计量相关实体)

2.1 EnergyMeter能源计量点

所在模块: module-mdm 数据库表: ops_energy_meter 源码位置: ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/entity/EnergyMeter.java

字段名 类型 数据库列名 约束 说明
id UUID id PK 主键
projectId UUID project_id NOT NULL 所属项目
meterCode String meter_code NOT NULL, UNIQUE 计量点编码自动生成EM + yyyyMMddHHmmss
meterName String meter_name NOT NULL 计量点名称
energyType EnergyType energy_type NOT NULL 能源类型枚举
spaceNodeId UUID space_node_id 关联空间节点
installationLocation String installation_location 安装位置
ratedCapacity BigDecimal(10,2) rated_capacity 额定容量
unitPrice BigDecimal(10,4) unit_price 单价(用于费用计算)
status Status status NOT NULL 状态枚举,默认 ACTIVE
createdAt LocalDateTime created_at 创建时间
updatedAt LocalDateTime updated_at 更新时间

枚举定义:

public enum EnergyType {
    LIGHTING("照明插座用电"),
    HVAC("空调用电"),
    POWER("动力用电"),
    SPECIAL("特殊用电"),
    WATER("给排水"),
    GAS("燃气");
}

public enum Status {
    ACTIVE, INACTIVE
}

与原设计文档的差异:

项目 原设计04-FINANCE.md 实际实现 差异说明
所属模块 ether-finance module-mdm 归属不同模块
能源类型 FeeType: PROPERTY/PARKING/WATER/ELECTRICITY/GAS/HEATING/REPAIR_FUND/OTHER EnergyType: LIGHTING/HVAC/POWER/SPECIAL/WATER/GAS 实际更细分(按用电分项),但缺少供暖、物业费等
单价精度 NUMERIC(12,2) BigDecimal(10,4) 实际精度更高4位小数
计费方式 BillingMethod: FIXED/AREA/USAGE/CUSTOM 未实现计费方式枚举
账期/到期日 billDay/dueDay/overdueDay 未实现账期管理
滞纳金 enableLateFee/lateFeeRate/maxLateFee 未实现滞纳金

2.2 EnergyConsumption能耗记录

所在模块: module-mdm 数据库表: ops_energy_consumption 源码位置: ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/entity/EnergyConsumption.java

字段名 类型 数据库列名 约束 说明
id UUID id PK 主键
projectId UUID project_id NOT NULL 所属项目
meterId UUID meter_id NOT NULL 关联计量点
consumptionDate LocalDate consumption_date NOT NULL 记录日期
previousReading BigDecimal(12,2) previous_reading 上次读数
currentReading BigDecimal(12,2) current_reading 当前读数
consumption BigDecimal(12,2) consumption NOT NULL 消耗量 = current previous
amount BigDecimal(10,2) amount 费用 = consumption × unitPrice
recordedBy UUID recorded_by 记录人
recordMethod RecordMethod record_method 记录方式,默认 MANUAL
remarks String(1000) remarks 备注
createdAt LocalDateTime created_at 创建时间

数据库索引:

idx_ec_meter_date   -- (meter_id, consumption_date)
idx_ec_project_date -- (project_id, consumption_date)

枚举定义:

public enum RecordMethod {
    MANUAL,  // 手动录入
    IOT      // IoT自动采集
}

与原设计文档的差异:

项目 原设计FeeBill 实际实现EnergyConsumption 差异说明
实体性质 账单(应收费用单据) 能耗记录(抄表数据) 本质不同,能耗记录不是账单
账单编号 billNo 无账单编号
关联业主 ownerId 未关联业主
关联房产 spaceNodeId 间接通过meter.spaceNodeId 未直接关联
账期 billPeriod/billDate/dueDate/overdueDate consumptionDate 无账期概念
金额体系 amount/lateFee/discount/payableAmount/paidAmount amount仅计算值 无应收/已付/优惠/滞纳金
状态流转 UNPAID/PARTIAL_PAID/PAID/OVERDUE/CANCELLED 无状态 无支付状态
用量单位 usageAmount + usageUnit consumption 无独立用量单位

三、已实现的API接口

3.1 后端APIEnergyController

基础路径: /api/ops/energy 源码位置: ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/controller/EnergyController.java

3.1.1 计量点管理

方法 路径 说明 请求参数 响应类型
POST /meters 创建计量点 EnergyMeter JSON ApiResponse<EnergyMeter>
GET /meters 查询计量点列表 projectId(必填), energyType(可选) ApiResponse<List<EnergyMeter>>
GET /meters/{id} 获取计量点详情 path: id ApiResponse<EnergyMeter>
PUT /meters/{id} 更新计量点 path: id, EnergyMeter JSON ApiResponse<EnergyMeter>
DELETE /meters/{id} 删除计量点(软删除) path: id ApiResponse<Void>

3.1.2 能耗记录

方法 路径 说明 请求参数 响应类型
POST /consumption 录入能耗数据 {meterId, currentReading, recordedBy} ApiResponse<EnergyConsumption>
GET /consumption/{meterId} 查询能耗记录 path: meterId, startDate(可选), endDate(可选) ApiResponse<List<EnergyConsumption>>

3.1.3 能耗统计

方法 路径 说明 请求参数 响应类型
GET /statistics/by-type 按类型统计消耗 projectId, month(yyyy-MM-dd) ApiResponse<Map<EnergyType, BigDecimal>>
GET /statistics/unit-consumption 单方能耗 projectId, month(yyyy-MM-dd) ApiResponse<BigDecimal>

3.2 前端API封装

源码位置: ether-admin/src/api/energy.ts

函数名 HTTP方法 URL 说明
getEnergyMeters GET /api/ops/energy/meters 获取计量点列表
getEnergyMeter GET /api/ops/energy/meters/{id} 获取计量点详情
createEnergyMeter POST /api/ops/energy/meters 创建计量点
updateEnergyMeter PUT /api/ops/energy/meters/{id} 更新计量点
deleteEnergyMeter DELETE /api/ops/energy/meters/{id} 删除计量点
recordEnergyConsumption POST /api/ops/energy/consumption 录入能耗
getEnergyConsumption GET /api/ops/energy/consumption/{meterId} 获取能耗记录
getConsumptionByType GET /api/ops/energy/statistics/by-type 按类型统计
getUnitConsumption GET /api/ops/energy/statistics/unit-consumption 单方能耗

3.3 前端页面路由

源码位置: ether-admin/src/router/index.ts

路径 路由名 组件 说明
energy/meters EnergyMeters views/energy/MeterList.vue 计量点管理
energy/consumption EnergyConsumption views/energy/ConsumptionRecord.vue 能耗录入
energy/statistics EnergyStatistics views/energy/EnergyStatistics.vue 能耗统计

四、已实现的业务规则

4.1 计量点管理规则

规则 实现位置 说明
编码自动生成 EnergyMeterServiceImpl.generateMeterCode() 格式:EM + yyyyMMddHHmmss,确保唯一性(冲突时追加后缀)
默认状态 EnergyMeterServiceImpl.createMeter() 新建计量点默认状态为 ACTIVE
软删除 EnergyMeterServiceImpl.deleteMeter() 删除操作将状态设为 INACTIVE非物理删除
查询过滤 EnergyMeterRepository.findByProjectIdAndStatus() 按项目查询时仅返回 ACTIVE 状态的计量点
部分更新 EnergyMeterServiceImpl.updateMeter() 仅更新非空字段

4.2 能耗录入规则

规则 实现位置 说明
仪表状态校验 EnergyConsumptionServiceImpl.recordConsumption() 只能对 ACTIVE 状态的仪表进行抄表(错误码 6102
读数递增校验 EnergyConsumptionServiceImpl.recordConsumption() 当前读数不能小于上次读数(错误码 6103
仪表存在性校验 EnergyConsumptionServiceImpl.recordConsumption() 仪表不存在时抛出异常(错误码 6101
自动获取上次读数 EnergyConsumptionServiceImpl.recordConsumption() 从最近一条记录获取 previousReading首次抄表为 0
自动计算消耗量 EnergyConsumptionServiceImpl.recordConsumption() consumption = currentReading previousReading
自动计算费用 EnergyConsumptionServiceImpl.recordConsumption() amount = consumption × meter.unitPrice单价为空时为 0
默认手动录入 EnergyConsumptionServiceImpl.recordConsumption() recordMethod 默认设为 MANUAL

4.3 能耗统计规则

规则 实现位置 说明
按月统计 EnergyConsumptionServiceImpl.getConsumptionByType() 根据 month 参数计算月份起止日期
类型初始化 EnergyConsumptionServiceImpl.getConsumptionByType() 所有 EnergyType 初始化为 BigDecimal.ZERO
按类型汇总(简化) EnergyConsumptionServiceImpl.getConsumptionByType() ⚠️ 当前实现将项目总消耗全部归入 LIGHTING 类型,未按 meter.energyType 真正分项汇总
单方能耗 EnergyConsumptionServiceImpl.getUnitConsumption() 遍历项目所有 ACTIVE 计量点,累加月度消耗量

4.4 已知实现缺陷

缺陷 严重度 说明
按类型统计不准确 🔴 getConsumptionByType() 将总消耗全部归入 LIGHTING代码注释也承认"实际业务中应按 meter.energyType 汇总"
前后端能源类型不一致 🟡 后端 EnergyType 枚举为 LIGHTING/HVAC/POWER/SPECIAL/WATER/GAS前端 energyTypeMap 为 ELECTRICITY/WATER/GAS/CENTRAL_HEATING/CENTRAL_COOLING
无账期概念 🟡 能耗记录只有 consumptionDate无账单周期、到期日等概念
费用仅为计算值 🟡 amount 字段仅是 consumption × unitPrice 的计算结果,非正式账单金额
无支付流程 🔴 无支付记录、支付状态、支付方式等
无业主关联 🟡 能耗记录不关联业主,无法按业主统计费用

五、与原需求文档 04-FINANCE.md 的差异对比表

5.1 实体级差异

设计项 04-FINANCE.md 设计方案 实际代码实现 差异等级
FeeItem 实体 已定义完整实体code/name/type/billingMethod/unitPrice/unit/billDay/dueDay/overdueDay/enableLateFee/lateFeeRate/maxLateFee 不存在 🔴 完全缺失
FeeBill 实体 已定义完整实体billNo/feeItemId/spaceNodeId/ownerId/billPeriod/billDate/dueDate/overdueDate/usageAmount/amount/lateFee/discount/payableAmount/paidAmount/status 不存在 🔴 完全缺失
FeePayment 实体 已定义完整实体paymentNo/amount/method/thirdPartyNo/status/failReason/paymentTime 不存在 🔴 完全缺失
FeeRefund 实体 已定义完整实体refundNo/amount/reason/status/approverId/approveTime/thirdPartyRefundNo/refundTime 不存在 🔴 完全缺失
fin_fee_item 表 已定义 DDL 不存在 🔴 完全缺失
fin_fee_bill 表 已定义 DDL 不存在 🔴 完全缺失
fin_fee_payment 表 已定义 DDL 不存在 🔴 完全缺失
fin_fee_refund 表 已定义 DDL 不存在 🔴 完全缺失
EnergyMeter 实体 未在设计文档中 在 module-mdm 中实现 🟡 设计文档遗漏
EnergyConsumption 实体 未在设计文档中 在 module-mdm 中实现 🟡 设计文档遗漏
ops_energy_meter 表 未在设计文档中 已创建 🟡 设计文档遗漏
ops_energy_consumption 表 未在设计文档中 已创建 🟡 设计文档遗漏

5.2 功能级差异

功能 04-FINANCE.md 状态 实际状态 差异说明
收费项目管理CRUD 🟢 已实现 🔴 未实现 无 FeeItem 代码
账单生成 🟢 已实现 🔴 未实现 无 FeeBill 代码
账单状态流转 🟢 已实现 🔴 未实现 无状态机
支付处理 🟢 已实现 🔴 未实现 无 FeePayment 代码
费用催缴(定时任务) 🟢 已实现 🔴 未实现 无 FeeReminderJob 代码
滞纳金计算 🟢 已实现 🔴 未实现 无计算逻辑
退款流程 🔴 未实现 🔴 未实现 一致
支付网关对接 🔴 未实现 🔴 未实现 一致
财务报表 🔴 未实现 🔴 未实现 一致
能耗计量点管理 未提及 🟢 已实现 设计文档遗漏
能耗抄表录入 未提及 🟢 已实现 设计文档遗漏
能耗费用计算 未提及 🟢 已实现(简化) 设计文档遗漏
能耗统计分析 未提及 🟢 已实现(有缺陷) 设计文档遗漏

5.3 枚举差异

枚举 04-FINANCE.md 定义 实际代码定义 差异
收费类型 FeeType PROPERTY/PARKING/WATER/ELECTRICITY/GAS/HEATING/REPAIR_FUND/OTHER 不存在 完全缺失
计费方式 BillingMethod FIXED/AREA/USAGE/CUSTOM 不存在 完全缺失
账单状态 BillStatus UNPAID/PARTIAL_PAID/PAID/OVERDUE/CANCELLED 不存在 完全缺失
支付方式 PaymentMethod WECHAT/ALIPAY/CASH/BANK_TRANSFER/CARD 不存在 完全缺失
支付状态 PaymentStatus PENDING/SUCCESS/FAILED/REFUNDED 不存在 完全缺失
退款状态 RefundStatus PENDING/APPROVED/REJECTED/REFUNDED 不存在 完全缺失
能源类型 EnergyType 未定义 LIGHTING/HVAC/POWER/SPECIAL/WATER/GAS 设计文档遗漏
记录方式 RecordMethod 未定义 MANUAL/IOT 设计文档遗漏

六、待实现功能清单

6.1 P0 — 核心财务功能(必须实现)

编号 功能 说明 依赖 预估工作量
FIN-001 创建 module-finance 模块 独立的财务模块,包含 entity/service/controller/repository 分层 0.5天
FIN-002 FeeItem 收费项目实体 含 code/name/type/billingMethod/unitPrice/unit/billDay/dueDay/overdueDay/enableLateFee/lateFeeRate/maxLateFee FIN-001 1天
FIN-003 FeeItem CRUD API 创建/查询/更新/禁用收费项目 FIN-002 1.5天
FIN-004 FeeBill 账单实体 含 billNo/feeItemId/spaceNodeId/ownerId/billPeriod/billDate/dueDate/overdueDate/amount/lateFee/discount/payableAmount/paidAmount/status FIN-002 1.5天
FIN-005 账单自动生成 根据收费项目规则,按账期自动生成账单 FIN-003, FIN-004 3天
FIN-006 账单状态流转 UNPAID → PARTIAL_PAID → PAID / OVERDUE → CANCELLED FIN-004 1天
FIN-007 FeePayment 支付记录实体 含 paymentNo/amount/method/thirdPartyNo/status/failReason/paymentTime FIN-004 1天
FIN-008 支付记录 API 线下收款登记、支付记录查询 FIN-007 1.5天
FIN-009 能耗数据与账单对接 将 EnergyConsumption 的 amount 作为按用量计费的账单数据来源 FIN-005, 能耗模块 2天
FIN-010 财务管理前端页面 收费项目/账单/支付记录的管理页面 FIN-003, FIN-006, FIN-008 4天

6.2 P1 — 重要功能(近期实现)

编号 功能 说明 依赖 预估工作量
FIN-011 费用催缴定时任务 到期提醒3天内、逾期催缴、周汇总 FIN-006 2天
FIN-012 滞纳金自动计算 逾期天数 × 日利率,不超过上限 FIN-006, FIN-002 1.5天
FIN-013 FeeRefund 退款实体与流程 退款申请 → 审批 → 执行 FIN-007 3天
FIN-014 业主端缴费功能 业主查看账单、在线缴费 FIN-006, FIN-008 3天
FIN-015 修复能耗按类型统计 getConsumptionByType() 应按 meter.energyType 真正分项汇总 0.5天
FIN-016 统一前后端能源类型枚举 后端 LIGHTING/HVAC/POWER/SPECIAL/WATER/GAS 与前端 ELECTRICITY/WATER/GAS/CENTRAL_HEATING/CENTRAL_COOLING 对齐 0.5天

6.3 P2 — 增强功能(中期实现)

编号 功能 说明 依赖 预估工作量
FIN-017 支付网关对接 微信支付/支付宝 SDK 集成 FIN-008 5天
FIN-018 财务报表 收费统计、欠费分析、收入趋势 FIN-006, FIN-008 4天
FIN-019 按面积计费 根据房产面积 × 单价计算物业费 FIN-002, 空间节点面积数据 2天
FIN-020 固定金额计费 每月固定金额的收费项目(如停车费) FIN-002 1天
FIN-021 批量账单生成 一次性为项目所有业主生成账单 FIN-005 2天
FIN-022 账单导出 导出 Excel/PDF 格式账单 FIN-006 1.5天
FIN-023 IoT 自动抄表 对接 IoT 平台自动采集能耗数据 能耗模块 3天

6.4 P3 — 远期规划

编号 功能 说明 依赖 预估工作量
FIN-024 自定义计费规则 支持阶梯电价、分时计费等复杂规则 FIN-002 5天
FIN-025 预缴费管理 业主预存费用、自动扣款 FIN-008 3天
FIN-026 发票管理 开票申请、发票打印 FIN-008 3天
FIN-027 对账功能 支付流水与银行流水对账 FIN-017 3天
FIN-028 财务审批流 大额退款、减免审批流程 FIN-013 4天

七、架构建议

7.1 模块归属调整

当前能耗管理EnergyMeter / EnergyConsumption放在 module-mdm 中,建议:

  • 方案A推荐: 保持能耗管理在 module-mdm财务域通过接口引用能耗数据。能耗是基础数据MDM费用计算是业务逻辑Finance职责分离清晰。
  • 方案B: 将能耗管理迁移至 module-finance。耦合度高不推荐。

7.2 数据流设计

EnergyMeter (module-mdm)          FeeItem (module-finance)
       │                                │
       ▼                                ▼
EnergyConsumption ──费用计算──→ FeeBill (自动/手动生成)
  (抄表数据)                        │
                                    ▼
                              FeePayment (支付记录)
                                    │
                                    ▼
                              FeeRefund (退款记录)

7.3 设计文档修正建议

04-FINANCE.md 中标记 FeeItem/FeeBill/FeePayment 为"🟢 已实现"与实际代码不符,建议:

  1. 将 FeeItem/FeeBill/FeePayment/FeeReminderJob 的状态修正为"🔴 未实现"
  2. 补充 EnergyMeter / EnergyConsumption 的设计说明
  3. 明确能耗管理与财务计费的边界和对接方式

八、代码文件索引

8.1 后端文件

文件 路径
EnergyMeter 实体 ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/entity/EnergyMeter.java
EnergyConsumption 实体 ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/entity/EnergyConsumption.java
EnergyController ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/controller/EnergyController.java
EnergyMeterService ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/service/EnergyMeterService.java
EnergyMeterServiceImpl ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/service/impl/EnergyMeterServiceImpl.java
EnergyConsumptionService ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/service/EnergyConsumptionService.java
EnergyConsumptionServiceImpl ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/service/impl/EnergyConsumptionServiceImpl.java
EnergyMeterRepository ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/repository/EnergyMeterRepository.java
EnergyConsumptionRepository ether-pms/module-mdm/src/main/java/com/ether/pms/mdm/repository/EnergyConsumptionRepository.java
EnergyMeterServiceTest ether-pms/module-mdm/src/test/java/com/ether/pms/mdm/service/EnergyMeterServiceTest.java

8.2 前端文件

文件 路径
能耗 API ether-admin/src/api/energy.ts
计量点管理页面 ether-admin/src/views/energy/MeterList.vue
能耗录入页面 ether-admin/src/views/energy/ConsumptionRecord.vue
能耗统计页面 ether-admin/src/views/energy/EnergyStatistics.vue
路由配置(能耗部分) ether-admin/src/router/index.ts (L121-135)

8.3 文档文件

文件 路径
原设计文档 ether-docs/02-DESIGN/domains/04-FINANCE.md
特性清单 ether-docs/01-REQUIREMENTS/FEATURE_LIST.md

文档说明: 本文档基于 2026-04-23 对 ether-pms 和 ether-admin 代码库的全量搜索结果生成。核心结论:财务域的 FeeItem/FeeBill/FeePayment/FeeRefund 四大实体及所有相关功能均未在代码中实现仅能耗计量管理EnergyMeter/EnergyConsumption在 module-mdm 中有完整实现。04-FINANCE.md 中标注"已实现"的状态需修正。