# ERP后端骨架问题清单

> 生成时间: 2026-04-05
> 扫描路径: `/root/.openclaw/workspace/erp-java-backend/services/`
> 扫描范围: 所有 main 目录下的 Java 文件

---

## 📋 问题总览

| 类型 | 问题数 | 已修复数 |
|------|--------|---------|
| 空 catch 块 | 1 | 1 |
| TODO Stub 方法（已修复） | 3 | 3 |
| TODO Stub 方法（需人工跟进） | 3 | 0 |
| 缺失服务（Feign Client 无服务端） | 1 | 1 |
| Feign Client 端点不匹配 | 5 | 0 |
| 假 RPC 调用（mock 数据） | 0 | - |
| **合计** | **13** | **5** |

---

## 🔴 类型一：空 catch 块

### 1.1 ScheduledTaskService.java — 空异常捕获

**文件**: `scheduled-task-service/src/main/java/com/erp/task/service/ScheduledTaskService.java`
**行号**: ~178
**问题代码**:
```java
try {
    status = TaskStatus.valueOf(request.getStatus());
} catch (Exception ignored) {
}
```

**风险**: 静默忽略无效的状态值，用户输入脏数据无法感知

**修复状态**: ✅ 已修复
```java
} catch (Exception e) {
    log.warn("解析任务状态失败: status={}, error={}", request.getStatus(), e.getMessage());
}
```

---

## 🟠 类型二：TODO Stub 方法（已自动修复）

### 2.1 OrderSettlementServiceImpl — 结算周期查询 Stub

**文件**: `order-service/src/main/java/com/erp/order/settlement/service/impl/OrderSettlementServiceImpl.java`

| 方法 | 行号 | 原代码 | 修复状态 |
|------|------|--------|---------|
| `getSettlementPeriodById` | 244 | `return periodRepository.selectById(id); // TODO` → `return null;` | ✅ 已修复 |
| `getCurrentOpenPeriod` | 250 | `return periodRepository.findByTypeAndStatus(...); // TODO` → `return null;` | ✅ 已修复 |
| `getReportById` | 423 | `return reportRepository.selectById(id); // TODO` → `return null;` | ✅ 已修复 |
| `createSettlementPeriod` | 238 | `// periodRepository.insert(period); // TODO` | ✅ 已修复 |
| `generateReport` | 419 | `// reportRepository.insert(report); // TODO` | ✅ 已修复 |

**修复操作**:
1. 新建 `SettlementPeriodRepository.java` (含 `findByTypeAndStatus`, `findLatestOpenPeriod`)
2. 新建 `SettlementReportRepository.java`
3. 注入两个新 Repository，替换所有 `return null;` Stub

---

## 🟡 类型三：TODO Stub 方法（需人工跟进）

### 3.1 TenantOrderServiceImpl — 租户订单明细

**文件**: `tenant-service/src/main/java/com/erp/tenant/service/order/impl/OrderServiceImpl.java`
**行号**: 47
**问题代码**:
```java
public OrderDetailResponse getOrderDetail(Long tenantId, Long orderId) {
    Order order = orderRepository.findById(orderId, tenantId);
    if (order == null) {
        return null;  // ⚠️ 方法未完成
    }
    // ⚠️ 后续还有未完成的 DTO 转换逻辑
}
```
**说明**: `OrderDTO` 构建逻辑后续不完整，缺少 items 的完整映射。

**建议**: 补充 `OrderDTO` 的完整字段映射，增加异常情况处理。

---

### 3.2 OrderSettlementServiceImpl — closeSettlementPeriod

**文件**: `order-service/src/main/java/com/erp/order/settlement/service/impl/OrderSettlementServiceImpl.java`
**行号**: 257-261
**问题代码**:
```java
public boolean closeSettlementPeriod(Long periodId) {
    // SettlementPeriod period = getSettlementPeriodById(periodId);
    // period.setPeriodStatus(SettlementPeriod.STATUS_CLOSED);
    // periodRepository.updateById(period);
    log.info("关闭结算周期: {}", periodId);
    return true;  // ⚠️ 虚假成功
}
```
**说明**: 方法永远返回 `true`，但实际没有执行任何数据库更新。

**建议**: 取消注释代码，或在 `SettlementPeriodRepository` 中增加 `updateStatus` 方法。

---

### 3.3 OrderSettlementServiceImpl — confirmReport

**文件**: `order-service/src/main/java/com/erp/order/settlement/service/impl/OrderSettlementServiceImpl.java`
**行号**: 436-442
**问题代码**:
```java
public boolean confirmReport(Long reportId) {
    // SettlementReport report = getReportById(reportId);
    // report.setReportStatus(SettlementReport.STATUS_CONFIRMED);
    // report.setConfirmedAt(LocalDateTime.now());
    // reportRepository.updateById(report);
    log.info("确认结算报表: {}", reportId);
    return true;  // ⚠️ 虚假成功
}
```
**说明**: 同上，永远返回成功但实际无操作。

**建议**: 取消注释或补充实际更新逻辑。

---

## 🔴 类型四：Feign Client — 缺失服务端实现

### 4.1 PlatformSyncClient — platform-sync-service 不存在

**Feign Client 文件**: `order-service/src/main/java/com/erp/order/client/PlatformSyncClient.java`
**服务名**: `platform-sync-service`
**问题**: `services/` 目录下不存在 `platform-sync-service` 目录

**已调用端点**:
| 方法 | 端点 | 用途 |
|------|------|------|
| `syncOrderToPlatform` | `POST /api/platform/sync/order` | 同步订单到平台 |
| `pullOrdersFromPlatform` | `GET /api/platform/pull/orders` | 从平台拉取订单 |

**修复状态**: ✅ 已创建 stub 服务 `platform-sync-service`
- `PlatformSyncServiceApplication.java` — 启动类
- `PlatformSyncController.java` — REST 控制器（实现 `/api/platform/sync/order` 和 `/api/platform/pull/orders`）
- `PlatformSyncService.java` + `PlatformSyncServiceImpl.java` — 业务接口和实现
- `PlatformSyncRequest.java` / `PullOrdersResponse.java` — 请求响应 DTO
- `ApiResponse.java` — 统一响应格式
- `application.yml` — 配置文件

**⚠️ 注意**: `PlatformSyncServiceImpl` 中的 `syncOrderToPlatform` 和 `pullOrdersFromPlatform` 仍为 TODO 实现，需接入各平台（淘宝/京东/拼多多）真实 API。

---

## 🟡 类型五：Feign Client 端点不匹配（需人工确认）

### 5.1 ProductClient — product-service 端点缺失

**Feign Client 文件**: `supplier-service/src/main/java/com/erp/supplier/client/ProductClient.java`
**服务名**: `product-service`

| Feign 调用 | 期望端点 | 服务端实际存在？ |
|------------|----------|----------------|
| `GET /api/products/{id}` | 查询商品 | ⚠️ 需确认 `ProductController` 存在 |
| `GET /api/products/{id}/exists` | 检查商品是否存在 | ⚠️ 需确认 |

**建议**: 检查 `product-service` 是否实现对应端点，如未实现需补充。

---

### 5.2 StockClient — stock-service 端点不匹配

**Feign Client 文件**: `order-service/src/main/java/com/erp/order/client/StockClient.java`
**服务名**: `stock-service`（但实际对应 `inventory-service`）

| Feign 调用 | 期望端点 | inventory-service 实际端点 |
|------------|----------|--------------------------|
| `POST /api/stock/deduct` | 扣减库存 | ❌ 不存在（`/adjust`, `/inbound`, `/outbound`）|
| `POST /api/stock/unlock` | 解锁库存 | ❌ 不存在 |
| `POST /api/stock/lock` | 锁定库存 | ❌ 不存在 |

**说明**: `inventory-service` 有 `StockController`，但提供的端点是 `/adjust`, `/inbound`, `/outbound`，与 Feign Client 期望的 `/deduct`, `/unlock`, `/lock` 不匹配。

**建议**: 要么在 `inventory-service` 中新增对应端点，要么修改 Feign Client 指向现有端点。

---

### 5.3 InventoryClient — inventory-service 端点不匹配

**Feign Client 文件**: `aftersale-service/src/main/java/com/erp/aftersale/client/InventoryClient.java`

| Feign 调用 | 期望端点 | inventory-service 实际端点 |
|------------|----------|--------------------------|
| `POST /api/inventory/return-in` | 退货入库 | ⚠️ 需确认 |
| `POST /api/inventory/exchange-out` | 换货出库 | ⚠️ 需确认 |
| `GET /api/inventory/sku/{skuId}` | 查询SKU库存 | ⚠️ 需确认 |
| `POST /api/inventory/release-lock` | 批量扣减库存 | ⚠️ 需确认 |

**建议**: 逐一检查 `inventory-service` 是否有对应端点。

---

## 🟢 类型六：合法 null 返回（无需修复）

以下方法的 `return null` 是合理的防御性编程，无需修改：

| 文件 | 方法 | 说明 |
|------|------|------|
| `AfterSaleServiceImpl.toImagesJson` | `return null;` | images 为空时合理返回 null |
| `AuditLogServiceImpl.toJson` | `return null;` | map 为 null 时合理返回 null |
| `CustomerRelationshipServiceImpl.getParentByCustomerId` | `return null;` | 未查到时返回 null |
| `DashboardServiceImpl.calculateRate` | `return null;` | 分母 ≤ 0 时返回 null |
| `FinanceServiceImpl.parseDate` | `return null;` | 日期格式无效时返回 null |
| `LogisticsService.getWaybillStatus` | `return null;` | 运单不存在时返回 null |
| `AbstractCarrierAdapter.parseTime` | `return null;` | 时间格式无效时返回 null |
| `ReportExportServiceImpl.getExportById` | `return null;` | 记录不存在时返回 null |
| `ReportExportServiceImpl.getDownloadUrl` | `return null;` | 导出未完成时返回 null |
| `TenantOrderServiceImpl.getOrderDetail` | `return null;` | 订单不存在时返回 null |

---

## 📁 新建文件清单

| 文件 | 说明 |
|------|------|
| `order-service/.../repository/SettlementPeriodRepository.java` | 结算周期数据访问层 |
| `order-service/.../repository/SettlementReportRepository.java` | 结算报表数据访问层 |
| `platform-sync-service/pom.xml` | Maven 配置文件 |
| `platform-sync-service/.../PlatformSyncServiceApplication.java` | Spring Boot 启动类 |
| `platform-sync-service/.../PlatformSyncController.java` | REST API 控制器 |
| `platform-sync-service/.../PlatformSyncService.java` | 业务接口 |
| `platform-sync-service/.../PlatformSyncServiceImpl.java` | 业务实现 |
| `platform-sync-service/.../dto/ApiResponse.java` | 统一响应 DTO |
| `platform-sync-service/.../dto/PlatformSyncRequest.java` | 请求 DTO |
| `platform-sync-service/.../dto/PullOrdersResponse.java` | 响应 DTO |
| `platform-sync-service/.../resources/application.yml` | 配置文件 |

---

## ⚠️ 后续需人工跟进事项

1. **product-service 端点**: 确认 `ProductClient` 的 `/api/products/{id}` 和 `/api/products/{id}/exists` 是否已实现
2. **inventory-service 端点**: 确认 `StockClient` 和 `InventoryClient` 的端点是否匹配
3. **TenantOrderServiceImpl.getOrderDetail**: 补充完整的 `OrderDTO` 字段映射
4. **OrderSettlementServiceImpl.closeSettlementPeriod / confirmReport**: 取消注释或补充实际逻辑
5. **platform-sync-service**: 对接各平台（淘宝/京东/拼多多）真实 API 替换 TODO stub
