Files
mileage-bonus/.claude_plans/fizzy-petting-shamir.md
kkfluous 573f8397a6 chore: 添加输入输出文件 + .claude记忆和计划
输入文件:
- 租赁任务考核_2026年{1,2,3}月.xlsx (考核源数据)
- {1,2}月.xlsx (客户盈亏表)
- 车辆里程考核与奖金发放规则(V.1.2).docx

输出文件:
- 里程任务考核_{1,2,3}月核算.xlsx (月度核算结果)
- 里程任务考核_Q1汇总.xlsx (含车辆台账)
- 3月客户盈亏表(待填写).xlsx (模版)

.claude_memory: 项目记忆(规则/偏好/架构/测试车辆)
.claude_plans: 历次计划文件

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:09:24 +08:00

484 lines
23 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
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.
# 还车应结款模块 — 完整实施计划
## Context
OneOS 需要实现完整的「还车应结款」多角色费用核算模块。当前状态:
- **原型**: 3个JSX页面列表/查看/费用明细),需求文档完整
- **老系统**: lingniu_asset_server 有完整实现4表+多部门审批+能源校验),可参考角色设计和业务流程
- **OneOS后端**: ReturnPaymentController/Service 已有骨架但本质是纯CRUD**return_payment 系列表尚未建到数据库**
- **OneOS前端**: 页面UI完成度高但100%使用mock数据
- **数据库现状**: return_vehicle_task(81条)、delivery_vehicle(32条)、traffic_violation(0条)、accident_info(1条)、energy_account(有数据)、vehicle_check_item(轮胎检查项齐全)
### 核心目标
实现多角色4个部门独立填报→提交→审批→生成账单的完整业务流程各部门只能看到和操作自己的费用区块。
---
## 第一阶段:数据库建表 + 角色定义
### 1.1 角色映射(参照老系统 SettlementDepartment
老系统4个结算部门 → OneOS 已有系统角色映射:
| 结算部门 | depCode | OneOS 角色 | role_key | 职责 |
|---------|---------|-----------|----------|------|
| 业务服务组 | BUSINESS | 业务服务组(id=3) / 业务服务主管 / 业务经理 | 业务服务组 | 填写违章违约金、保险上浮、ETC费用、租金计算 |
| 能源采购组 | ENERGY | **需新建角色: 能源采购组** | energy_group | 填写氢量差、能源费补缴、预付款退费 |
| 运维部 | OPERATION | 运维专员 / 运维主管 / 运维助理 | 运维专员 | 填写清洗费、保养维修、车损、证件丢失、轮胎磨损 |
| 安全组 | SAFETY | 安全(id=2026890857448787969) | 安全 | 确认违章清单、事故清单 |
审批角色:
| 角色 | 职责 |
|------|------|
| 业务服务主管 / 业务负责人 | 汇总审核,提交总审批 |
| 财务 / 财务主管 | 生成账单、付款确认 |
| 总经理 | 终审(可选) |
### 1.2 建表SQL重新设计参照老系统+原型需求)
```sql
-- 主表:还车应结款单(一车一单)
CREATE TABLE return_settlement (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
return_task_id BIGINT UNSIGNED NOT NULL COMMENT '关联 return_vehicle_task.id',
delivery_vehicle_id BIGINT UNSIGNED NOT NULL COMMENT '关联 delivery_vehicle.id',
contract_id BIGINT NOT NULL COMMENT '关联 vehicle_lease_contract_info.id',
order_detail_id BIGINT COMMENT '关联 vehicle_lease_order_detail.id',
contract_code VARCHAR(100) COMMENT '合同编号',
project_name VARCHAR(200) COMMENT '项目名称',
customer_id BIGINT COMMENT '客户ID',
customer_name VARCHAR(200) COMMENT '客户名称',
plate_number VARCHAR(50) COMMENT '车牌号',
vehicle_id BIGINT UNSIGNED COMMENT '车辆ID',
business_dept_name VARCHAR(100) COMMENT '业务部门',
business_owner_name VARCHAR(100) COMMENT '业务负责人',
delivery_time DATETIME COMMENT '交车时间',
return_time DATETIME COMMENT '还车时间',
returner_name VARCHAR(100) COMMENT '还车人',
-- 保险标识(从合同/服务项推导)
has_fragile_insurance TINYINT(1) DEFAULT 0 COMMENT '易损保 0否1是',
has_tire_insurance TINYINT(1) DEFAULT 0 COMMENT '轮胎保 0否1是',
has_maintenance_insurance TINYINT(1) DEFAULT 0 COMMENT '养护保 0否1是',
-- 金额汇总
deposit_amount DECIMAL(18,2) DEFAULT 0 COMMENT '保证金总额',
pending_settle_amount DECIMAL(18,2) DEFAULT 0 COMMENT '待结算总额',
should_refund_amount DECIMAL(18,2) DEFAULT 0 COMMENT '应退还总额',
should_pay_amount DECIMAL(18,2) DEFAULT 0 COMMENT '应补缴总额',
-- 审批状态(参照老系统)
approval_status TINYINT DEFAULT 0 COMMENT '0待提交 1撤回 10待审批 20审批中 30审批完成 40审批驳回',
approval_submit_time DATETIME COMMENT '提交审批时间',
is_last_vehicle TINYINT(1) DEFAULT 0 COMMENT '是否合同最后一辆车',
generated_at DATETIME COMMENT '还车应结款生成时间(15天倒计时起点)',
-- 审计字段
del_flag CHAR(1) DEFAULT '0',
create_by BIGINT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_by BIGINT,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_return_task (return_task_id),
INDEX idx_contract (contract_id),
INDEX idx_plate (plate_number),
INDEX idx_status (approval_status)
) COMMENT '还车应结款主表';
-- 部门提交状态表4个部门各一行
CREATE TABLE return_settlement_dept_status (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
settlement_id BIGINT UNSIGNED NOT NULL COMMENT '关联 return_settlement.id',
dep_code VARCHAR(20) NOT NULL COMMENT 'BUSINESS/ENERGY/OPERATION/SAFETY',
dep_name VARCHAR(50) COMMENT '部门名称',
status TINYINT DEFAULT 0 COMMENT '0待提交 1已提交 2已撤回',
submit_by BIGINT COMMENT '提交人ID',
submit_by_name VARCHAR(100) COMMENT '提交人姓名',
submit_time DATETIME COMMENT '提交时间',
total_amount DECIMAL(18,2) DEFAULT 0 COMMENT '部门费用合计',
remark VARCHAR(500),
del_flag CHAR(1) DEFAULT '0',
create_by BIGINT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_by BIGINT,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_settlement (settlement_id),
UNIQUE KEY uk_settlement_dep (settlement_id, dep_code)
) COMMENT '部门提交状态';
-- 业务服务组费用明细
CREATE TABLE return_settlement_business_fee (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
settlement_id BIGINT UNSIGNED NOT NULL,
seq INT COMMENT '序号',
fee_item VARCHAR(200) NOT NULL COMMENT '费用项名称',
amount DECIMAL(18,2) DEFAULT 0 COMMENT '金额',
remark VARCHAR(500),
photos TEXT COMMENT '照片URL JSON数组',
attachments TEXT COMMENT '附件URL JSON数组',
is_fixed TINYINT(1) DEFAULT 0 COMMENT '是否固定费用项(不可删)',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
del_flag CHAR(1) DEFAULT '0',
create_by BIGINT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_settlement (settlement_id)
) COMMENT '业务服务组费用';
-- 业务服务组-车辆租金
CREATE TABLE return_settlement_rent (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
settlement_id BIGINT UNSIGNED NOT NULL,
bill_start_date DATE COMMENT '账单开始日期',
vehicle_month_rent DECIMAL(18,2) COMMENT '车辆月租金',
received_rent DECIMAL(18,2) DEFAULT 0 COMMENT '本期已收租金',
actual_rent DECIMAL(18,2) DEFAULT 0 COMMENT '车辆实际租金',
should_refund_rent DECIMAL(18,2) DEFAULT 0 COMMENT '车辆应退租金',
del_flag CHAR(1) DEFAULT '0',
create_by BIGINT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_by BIGINT,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_settlement (settlement_id)
) COMMENT '车辆租金';
-- 能源采购组
CREATE TABLE return_settlement_energy (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
settlement_id BIGINT UNSIGNED NOT NULL,
delivery_hydrogen DECIMAL(10,2) COMMENT '交车氢量(MPa)',
return_hydrogen DECIMAL(10,2) COMMENT '还车氢量(MPa)',
hydrogen_unit_price DECIMAL(10,2) COMMENT '退还车氢气单价',
hydrogen_supplement DECIMAL(18,2) DEFAULT 0 COMMENT '氢量差补缴金额',
hydrogen_fee DECIMAL(18,2) DEFAULT 0 COMMENT '氢费补缴金额',
electric_fee DECIMAL(18,2) DEFAULT 0 COMMENT '电费补缴金额',
prepay_refund DECIMAL(18,2) DEFAULT 0 COMMENT '预付款退费金额',
user_balance DECIMAL(18,2) DEFAULT 0 COMMENT '项目预充值余额(快照)',
del_flag CHAR(1) DEFAULT '0',
create_by BIGINT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_by BIGINT,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_settlement (settlement_id)
) COMMENT '能源采购组费用';
-- 运维部费用明细
CREATE TABLE return_settlement_operation_fee (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
settlement_id BIGINT UNSIGNED NOT NULL,
seq INT COMMENT '序号',
fee_item VARCHAR(200) NOT NULL COMMENT '费用项',
amount DECIMAL(18,2) DEFAULT 0 COMMENT '金额',
worry_free_discount DECIMAL(18,2) DEFAULT 0 COMMENT '无忧包减免',
remark VARCHAR(500),
photos TEXT COMMENT '照片URL JSON数组',
attachments TEXT COMMENT '附件URL JSON数组',
is_fixed TINYINT(1) DEFAULT 0 COMMENT '是否固定费用项',
is_readonly TINYINT(1) DEFAULT 0 COMMENT '是否只读(送车/接车服务费)',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
del_flag CHAR(1) DEFAULT '0',
create_by BIGINT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_settlement (settlement_id)
) COMMENT '运维部费用';
-- 运维部-轮胎胎纹明细
CREATE TABLE return_settlement_tire_tread (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
settlement_id BIGINT UNSIGNED NOT NULL,
tire_name VARCHAR(100) COMMENT '轮胎名称(左前轮等)',
delivery_depth DECIMAL(6,2) COMMENT '交车胎纹深度(mm)',
return_depth DECIMAL(6,2) COMMENT '还车胎纹深度(mm)',
depth_diff DECIMAL(6,2) COMMENT '胎纹差(mm)',
unit_price DECIMAL(10,2) COMMENT '单价(元/mm)',
total_amount DECIMAL(18,2) DEFAULT 0 COMMENT '总金额',
del_flag CHAR(1) DEFAULT '0',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_settlement (settlement_id)
) COMMENT '轮胎胎纹明细';
-- 安全组-违章快照
CREATE TABLE return_settlement_violation (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
settlement_id BIGINT UNSIGNED NOT NULL,
source_violation_id BIGINT COMMENT '来源 traffic_violation.id',
violation_code VARCHAR(100) COMMENT '违章编码',
plate_number VARCHAR(50),
violation_behavior VARCHAR(500),
violation_time DATETIME,
penalty_amount DECIMAL(10,2) DEFAULT 0,
payment_status VARCHAR(20) COMMENT '缴费状态',
score INT DEFAULT 0 COMMENT '计分值',
handle_status VARCHAR(20) COMMENT '处理状态',
violation_customer VARCHAR(200),
violation_photo VARCHAR(500),
remark VARCHAR(500),
del_flag CHAR(1) DEFAULT '0',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_settlement (settlement_id)
) COMMENT '安全组违章快照';
-- 安全组-事故快照
CREATE TABLE return_settlement_accident (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
settlement_id BIGINT UNSIGNED NOT NULL,
source_accident_id BIGINT COMMENT '来源 accident_info.id',
accident_code VARCHAR(100),
plate_number VARCHAR(50),
accident_time DATETIME,
accident_place VARCHAR(200),
accident_type VARCHAR(50),
customer_name VARCHAR(200),
our_claim_amount DECIMAL(10,2),
their_claim_amount DECIMAL(10,2),
responsibility VARCHAR(50),
accident_status VARCHAR(50),
close_time DATE,
other_fee DECIMAL(10,2),
remark VARCHAR(500),
del_flag CHAR(1) DEFAULT '0',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_settlement (settlement_id)
) COMMENT '安全组事故快照';
```
### 1.3 新建角色
```sql
-- 能源采购组角色(系统中尚未有)
INSERT INTO `ry-cloud`.sys_role (role_id, role_name, role_key, role_sort, status, del_flag, create_by, create_time)
VALUES (2040000000000000001, '能源采购组', 'energy_group', 15, '0', '0', 1, NOW());
```
---
## 第二阶段:后端核心重构
### 2.1 文件结构(在 ln-asset-management 内)
```
modules/contract/
├── controller/
│ └── ReturnSettlementController.java ← 新建,替代 ReturnPaymentController
├── service/
│ ├── ReturnSettlementService.java ← 接口
│ └── impl/ReturnSettlementServiceImpl.java ← 核心实现
├── entity/settlement/
│ ├── po/
│ │ ├── ReturnSettlement.java
│ │ ├── ReturnSettlementDeptStatus.java
│ │ ├── ReturnSettlementBusinessFee.java
│ │ ├── ReturnSettlementRent.java
│ │ ├── ReturnSettlementEnergy.java
│ │ ├── ReturnSettlementOperationFee.java
│ │ ├── ReturnSettlementTireTread.java
│ │ ├── ReturnSettlementViolation.java
│ │ └── ReturnSettlementAccident.java
│ ├── req/ ← 各部门提交请求DTO
│ ├── vo/ ← 列表/详情/查看响应DTO
│ └── enums/
│ ├── SettlementDeptCode.java ← BUSINESS/ENERGY/OPERATION/SAFETY
│ ├── DeptSubmitStatus.java ← 待提交/已提交/已撤回
│ └── SettlementApprovalStatus.java ← 0/1/10/20/30/40
├── mapper/
│ └── (9个mapper对应9张表)
```
### 2.2 核心API设计
```
前缀: /asset/return-settlement
列表与查询:
POST /page ← 分页列表(筛选:合同/客户/项目/车牌/还车时间/审批状态)
GET /detail/{id} ← 详情(根据角色过滤可见区块)
GET /view/{id} ← 只读查看(同详情但全部只读)
创建(还车完成时自动触发):
POST /create-from-return/{returnTaskId} ← 从还车任务创建结算单,自动拉取关联数据
各部门提交/撤回(需角色鉴权):
POST /business/save ← 业务服务组保存
POST /business/submit ← 业务服务组提交
POST /business/revoke/{id} ← 业务服务组撤回
POST /energy/save ← 能源采购组保存
POST /energy/submit ← 能源采购组提交
POST /energy/revoke/{id} ← 能源采购组撤回
POST /operation/save ← 运维部保存
POST /operation/submit ← 运维部提交
POST /operation/revoke/{id} ← 运维部撤回
POST /safety/save ← 安全组保存
POST /safety/submit ← 安全组提交
POST /safety/revoke/{id} ← 安全组撤回
审批:
POST /submit-review/{id} ← 提交总审批校验4组已提交 + 15天倒计时
POST /revoke-review/{id} ← 撤回审批
POST /generate-bill/{id} ← 生成账单
```
### 2.3 核心业务逻辑
**create-from-return 自动拉取数据(关键):**
```
1. 从 return_vehicle_task 取:还车氢量、还车里程、接车服务费、还车时间、还车人
2. 从 delivery_vehicle 取:交车氢量、交车里程、送车服务费、月租金、保证金、交车时间
3. 从 vehicle_lease_contract_info 取:合同编号、项目名称、客户、业务部门/负责人
4. 从 vehicle_lease_order_detail 取:月租金(vehicle_rent)、保证金(deposit)、账单开始日
5. 从 vehicle_lease_order_service_item 取:推导保险标识
- 有"设备损坏金(包含易损件)"→ has_fragile_insurance=1
- 有"轮胎磨损费"→ has_tire_insurance=1
- (养护保需确认service_item名称)
6. 从 vehicle_check_item + delivery_vehicle_check_item 取:交车轮胎胎纹深度
7. 从 return_vehicle_check_item 取:还车轮胎胎纹深度
8. 从 traffic_violation 按 vehicle_id + 交车~还车时间范围 查:违章记录快照
9. 从 accident_info 按 vehicle_id + 交车~还车时间范围 查:事故记录快照
10. 从 ln_energy.energy_account 通过 Dubbo 查:客户能源账户余额
11. 判断 is_last_vehicle查同合同下其他 delivery_vehicle 是否都已有还车记录
12. 自动初始化4个 dept_status 记录BUSINESS/ENERGY/OPERATION/SAFETY状态=待提交)
13. 自动初始化固定费用行业务5项 + 运维10项
14. 自动计算轮胎磨损(胎纹差 * 单价)
15. 自动计算证件丢失费(对比交车/还车检查项中的行驶证、营运证等)
16. generated_at = NOW()15天倒计时起点
```
**角色鉴权逻辑:**
```java
// 根据当前用户角色判断可见/可操作的部门区块
public SettlementDeptCode resolveUserDept(Long userId) {
List<String> roleKeys = getUserRoleKeys(userId);
if (roleKeys.contains("业务服务组") || roleKeys.contains("业务服务主管")
|| roleKeys.contains("业务经理") || roleKeys.contains("业务负责人")
|| roleKeys.contains("业务总负责人"))
return BUSINESS;
if (roleKeys.contains("energy_group"))
return ENERGY;
if (roleKeys.contains("运维专员") || roleKeys.contains("运维主管")
|| roleKeys.contains("运维助理") || roleKeys.contains("运维总负责人"))
return OPERATION;
if (roleKeys.contains("安全"))
return SAFETY;
if (roleKeys.contains("财务") || roleKeys.contains("财务主管") || roleKeys.contains("财务总监"))
return null; // 财务可见全部,但不可编辑
if (roleKeys.contains("superadmin") || roleKeys.contains("总经理"))
return null; // 全部可见
return null;
}
```
**费用汇总计算(服务端计算,不依赖前端):**
```
businessTotal = SUM(business_fee.amount) + rent.should_refund_rent
energyTotal = hydrogen_supplement + hydrogen_fee + electric_fee - prepay_refund
operationTotal = SUM(operation_fee.amount)
pendingSettle = businessTotal + energyTotal + operationTotal
shouldRefund = max(0, deposit - pendingSettle)
shouldPay = max(0, pendingSettle - deposit)
```
---
## 第三阶段:前端对接
### 3.1 替换mock为真实API
修改文件:
- `apps/web-antd/src/api/financial/return-payment/index.ts` — 所有API函数指向新后端端点
- `apps/web-antd/src/views/financial/returnPayment/index.vue` — 列表页调真实API
- `apps/web-antd/src/views/financial/returnPayment/detail.vue` — 详情页调真实API
### 3.2 角色可见性控制
```typescript
// 根据当前用户角色控制UI区块
const userDeptCode = computed(() => {
// 从用户信息中获取角色,映射到部门
const roles = userStore.getRoles;
if (roles.includes('业务服务组') || roles.includes('业务服务主管') ...) return 'BUSINESS';
if (roles.includes('energy_group')) return 'ENERGY';
if (roles.includes('运维专员') || roles.includes('运维主管') ...) return 'OPERATION';
if (roles.includes('安全')) return 'SAFETY';
return 'ALL'; // 财务/管理员
});
// 业务服务组区块:仅业务角色可编辑,其他角色不可见或只读
const canEditBusiness = computed(() => userDeptCode.value === 'BUSINESS' || userDeptCode.value === 'ALL');
const canEditEnergy = computed(() => userDeptCode.value === 'ENERGY' || userDeptCode.value === 'ALL');
// ...
```
### 3.3 关键交互保持原型一致
- 保留15天倒计时后端校验 + 前端展示)
- 保留4组折叠/展开
- 保留Popover费用明细弹出
- 保留轮胎磨损hover弹窗
- 保留无忧包减免联动(根据保险标识启用/禁用)
---
## 第四阶段Dubbo接口跨服务数据
### 4.1 ln-energy 暴露接口
```java
// 在 ln-energy 中新建
public interface RemoteEnergySettlementService {
/** 查询客户/项目的能源账户余额 */
BigDecimal getAccountBalance(Long customerId);
/** 查询客户ETC未缴费用合计 */
BigDecimal getUnpaidEtcFee(Long customerId, String plateNumber,
LocalDate startDate, LocalDate endDate);
}
```
### 4.2 ln-asset-management 调用
在 ReturnSettlementServiceImpl 中通过 `@DubboReference` 注入调用。
---
## 实施顺序
| 步骤 | 内容 | 依赖 |
|------|------|------|
| S1 | 执行建表SQL + 新建能源采购组角色 | 无 |
| S2 | 后端Entity/Mapper/Service骨架 | S1 |
| S3 | create-from-return 自动数据拉取 | S2 |
| S4 | 4组 save/submit/revoke API | S2 |
| S5 | 列表/详情/查看 API + 角色鉴权 | S4 |
| S6 | 前端 mock→API 切换 + 角色可见性 | S5 |
| S7 | submit-review + 15天校验 | S4 |
| S8 | Dubbo 接口(能源余额/ETC费用 | S5 |
| S9 | 生成账单/导出 | S7 |
| S10 | 端到端测试 | S6-S9 |
---
## 验证计划
1. **建表验证**: 连接数据库确认9张表已创建
2. **数据拉取验证**: 用已有还车记录调 create-from-return确认自动填充的数据完整性
3. **角色隔离验证**: 分别用不同角色登录,确认只能看到/操作自己的费用区块
4. **费用计算验证**: 修改各部门费用后,确认汇总金额正确
5. **提交流程验证**: 4组依次提交→倒计时结束→提交审核→审批
6. **前端联调**: 列表筛选、详情展示、Popover、轮胎弹窗、15天倒计时
### 关键文件清单
**后端(修改/新建):**
- `ln-asset-management/src/main/java/com/ln/asset/modules/contract/controller/ReturnSettlementController.java`
- `ln-asset-management/src/main/java/com/ln/asset/modules/contract/service/ReturnSettlementService.java`
- `ln-asset-management/src/main/java/com/ln/asset/modules/contract/service/impl/ReturnSettlementServiceImpl.java`
- `ln-asset-management/src/main/java/com/ln/asset/modules/contract/entity/settlement/` (9个PO + req/vo/enums)
- `ln-asset-management/src/main/java/com/ln/asset/modules/contract/mapper/` (9个mapper)
- `ln-asset-management/src/main/resources/db/migration/` (建表SQL)
**前端(修改):**
- `ln-one-os-web/apps/web-antd/src/api/financial/return-payment/index.ts`
- `ln-one-os-web/apps/web-antd/src/views/financial/returnPayment/index.vue`
- `ln-one-os-web/apps/web-antd/src/views/financial/returnPayment/detail.vue`
- `ln-one-os-web/apps/web-antd/src/types/return-payment.ts`
**跨服务(新建):**
- `ln-energy/src/main/java/.../api/RemoteEnergySettlementService.java`