# 总控与租户功能检查与修复报告

> 检查时间：2026-04-05  
> 检查范围：`tenant-service`（8083）+ `admin-service`（不存在，已合并到 tenant-service）

---

## 一、检查结果总览

| 检查项 | 状态 | 说明 |
|--------|------|------|
| 1. 租户注册接口创建记录并发送通知 | ❌ 未完成 | 创建租户后无任何通知发送 |
| 2. 总控审核接口更新状态并初始化套餐 | ❌ 不存在 | 只有管理接口，无审核工作流 |
| 3. 套餐变更接口推送到Nacos | ❌ 未完成 | 套餐修改仅写数据库，未推送Nacos |
| 4. 功能开关接口动态刷新 | ❌ 未完成 | 无功能开关服务，仅有系统配置 |
| 5. API调用量监控记录 | ❌ 未完成 | api-gateway为空目录，无计数器 |

---

## 二、详细检查

### 2.1 租户注册接口 - 通知缺失

**文件：** `tenant-service/src/main/java/com/erp/tenant/service/impl/TenantServiceImpl.java`

**问题：** `createTenant()` 方法仅执行数据库写入，无任何通知逻辑。

```java
// 当前实现（只有数据库写入）
tenantRepository.insert(tenant);
log.info("创建租户成功: id={}, code={}", tenant.getId(), tenant.getCode());
return TenantDetailResponse.fromEntity(tenant, null);
// 无通知发送
```

**修复：** 注入 `NotificationFeignClient`，创建后发送：
- 系统通知（Redis队列）
- 邮件通知（管理员邮箱）
- 钉钉通知（管理员群）

---

### 2.2 总控审核接口 - 不存在

**现状：** `TenantAdminController` 只有以下接口：

| 接口 | 功能 |
|------|------|
| `GET /api/admin/tenants` | 租户列表 |
| `POST /api/admin/tenants` | 创建租户 |
| `PUT /api/admin/tenants/{id}` | 更新租户 |
| `POST /api/admin/tenants/{id}/toggle-status` | 切换状态 |
| `POST /api/admin/tenants/{id}/suspend` | 暂停租户 |
| `POST /api/admin/tenants/{id}/activate` | 恢复租户 |

**缺失：** 无审核工作流接口（approve/reject）。

**Tenant实体状态常量：**
```java
STATUS_ACTIVE = 1        // 正常
STATUS_INACTIVE = 0     // 禁用
STATUS_SUSPENDED = -1   // 暂停
// 缺失 STATUS_PENDING_REVIEW = 2  ← 已补充
```

---

### 2.3 套餐变更接口 - 未推送Nacos

**文件：** `tenant-service/src/main/java/com/erp/tenant/service/impl/TenantServiceImpl.java`

**问题：** `updatePackage()` 和 `togglePackageStatus()` 只修改数据库，无Nacos推送。

```java
// 当前实现
packageRepository.updateById(pkg);
log.info("更新套餐成功: id={}", id);
return PackageResponse.fromEntity(pkg);
// 无Nacos推送
```

---

### 2.4 功能开关接口 - 不存在

**现状：** 只有 `SystemConfigService`（普通配置，Redis缓存），无功能开关动态刷新机制。

**缺失：**
- FeatureFlag 实体
- FeatureFlagService（动态刷新）
- FeatureFlagController

---

### 2.5 API调用量监控 - 网关为空

**现状：** `services/api-gateway/` 目录仅有 `README.md`，无任何Java代码。

**缺失：** 无请求计数器、无统计接口。

---

## 三、修复实施

### 3.1 修复1：租户注册发送通知

**新增文件：**
- `notification-service/src/main/java/com/erp/notification/NotificationServiceApplication.java`
- `notification-service/src/main/java/com/erp/notification/service/NotificationService.java`
- `notification-service/src/main/java/com/erp/notification/service/impl/NotificationServiceImpl.java`
- `notification-service/src/main/java/com/erp/notification/controller/NotificationController.java`
- `notification-service/src/main/java/com/erp/notification/dto/NotificationRequest.java`
- `notification-service/src/main/java/com/erp/notification/client/NotificationClient.java`
- `notification-service/src/main/resources/application.yml`
- `tenant-service/src/main/java/com/erp/tenant/feign/NotificationFeignClient.java`

**修改文件：**
- `TenantServiceApplication.java` - 添加 `@EnableFeignClients`
- `TenantServiceImpl.java` - `createTenant()` 方法末尾添加通知发送

**通知类型：**
1. **系统通知** → Redis队列 `notifications:tenant:{tenantId}`
2. **邮件通知** → 管理员邮箱（可配置）
3. **钉钉通知** → 管理员群（可配置）

---

### 3.2 修复2：新增总控审核接口

**新增文件：**
- `tenant-service/src/main/java/com/erp/tenant/service/nacos/NacosConfigService.java`

**修改文件：**
- `TenantAdminController.java` - 新增审核接口
- `TenantService.java` - 新增方法声明
- `TenantServiceImpl.java` - 实现审核逻辑
- `Tenant.java` - 新增 `STATUS_PENDING_REVIEW = 2`

**新增审核接口：**

| 方法 | 路径 | 功能 |
|------|------|------|
| GET | `/api/admin/tenants/pending-review` | 获取待审核列表 |
| POST | `/api/admin/tenants/{id}/approve` | 审核通过 |
| POST | `/api/admin/tenants/{id}/reject` | 审核拒绝 |

**审核通过操作：**
1. 将租户状态更新为 `STATUS_ACTIVE`
2. 初始化套餐配置到 Redis（`tenant:package:{id}:info/features/limits`）
3. 推送套餐配置到 Nacos
4. 发送审核通过通知（邮件 + 系统通知）

**审核拒绝操作：**
1. 将租户状态更新为 `STATUS_INACTIVE`
2. 发送审核拒绝通知（含拒绝原因）

---

### 3.3 修复3：套餐变更推送到Nacos

**新增文件：**
- `tenant-service/src/main/java/com/erp/tenant/service/nacos/NacosConfigService.java`

**修改文件：**
- `TenantServiceImpl.java` - `updatePackage()` 和 `togglePackageStatus()` 调用 `pushPackageChangeToNacos()`
- `TenantAdminController.java` - 新增 `POST /api/admin/packages/{id}/push-nacos` 手动推送接口

**Nacos推送内容：**
```yaml
# tenant-service推送的套餐配置（data-id格式: tenant-{tenantId}-package-{packageId}）
package:
  id: 1
  code: "basic"
  name: "基础版"
  type: month
  status: 1
  price: 299.00
  period_days: 30
  trial_days: 7
  features: '{"order":true,"stock":true,"report":false}'
  limits: '{"users":10,"storage":5}'
  updated_at: 2026-04-05T10:00:00
```

**Nacos推送方法：**
- `publishTenantPackageConfig(Long tenantId, Long packageId, String configJson)`
- `publishFeatureFlag(Long tenantId, String featureKey, boolean enabled)`

---

### 3.4 修复4：功能开关动态刷新

**新增文件：**
- `tenant-service/src/main/java/com/erp/tenant/entity/feature/FeatureFlag.java`
- `tenant-service/src/main/java/com/erp/tenant/repository/feature/FeatureFlagRepository.java`
- `tenant-service/src/main/java/com/erp/tenant/service/feature/FeatureFlagService.java`
- `tenant-service/src/main/java/com/erp/tenant/controller/feature/FeatureFlagController.java`

**功能开关接口：**

| 方法 | 路径 | 功能 |
|------|------|------|
| GET | `/api/admin/features` | 分页查询功能开关 |
| GET | `/api/admin/features/tenant/{tenantId}` | 获取租户功能开关Map |
| GET | `/api/admin/features/tenant/{tenantId}/check/{featureKey}` | 检查功能是否启用 |
| POST | `/api/admin/features` | 创建功能开关 |
| PUT | `/api/admin/features/{id}` | 更新功能开关 |
| POST | `/api/admin/features/{id}/toggle` | 切换状态（动态刷新） |
| DELETE | `/api/admin/features/{id}` | 删除功能开关 |
| POST | `/api/admin/features/refresh-cache` | 刷新所有缓存 |

**动态刷新机制：**
1. `toggleFeatureFlag()` 修改状态后
2. 调用 `refreshFeatureCache()` 清除Redis缓存
3. 调用 `pushFeatureToNacos()` 推送到Nacos
4. 各微服务监听Nacos变化，动态更新本地配置

---

### 3.5 修复5：API网关计数器

**新增文件：**
- `api-gateway/pom.xml`
- `api-gateway/src/main/java/com/erp/gateway/ApiGatewayApplication.java`
- `api-gateway/src/main/java/com/erp/gateway/filter/ApiCounterFilter.java`
- `api-gateway/src/main/java/com/erp/gateway/controller/GatewayStatsController.java`
- `api-gateway/src/main/resources/application.yml`

**计数器功能（`ApiCounterFilter`）：**
1. **全局计数器**：按分钟/小时/天粒度统计总调用量
2. **租户维度**：每个租户的调用量和错误数
3. **端点维度**：每个API路径的调用量和错误数
4. **请求日志**：保留最近1000条完整请求记录（含路径、方法、租户、状态码、响应时间）
5. **P95/P99计算**：记录每个端点的响应时间分布

**Redis存储结构：**
```
gateway:api:minute:2026-04-05-10-30   → ZSET (total: 1523)
gateway:api:hour:2026-04-05-10        → ZSET (total: 15234)
gateway:api:day:2026-04-05            → ZSET (total: 152340)
gateway:api:tenant:123:2026-04-05      → ZSET (count: 500, errors: 3)
gateway:api:endpoint:/api/orders:2026-04-05 → ZSET (count: 1000, errors: 5)
gateway:api:requests:2026-04-05       → LIST (最近1000条JSON日志)
gateway:api:duration:/api/orders:2026-04-05 → LIST (时间戳:响应时间)
```

**统计接口（GatewayStatsController）：**

| 方法 | 路径 | 功能 |
|------|------|------|
| GET | `/api/gateway/stats/daily` | 每日调用统计 |
| GET | `/api/gateway/stats/tenants` | 租户调用排行 |
| GET | `/api/gateway/stats/endpoints` | 端点调用排行 |
| GET | `/api/gateway/stats/realtime` | 实时统计（当前小时） |
| GET | `/api/gateway/stats/logs` | 最近请求日志 |

---

## 四、修改文件清单

### 新增文件（16个）

| 文件 | 说明 |
|------|------|
| `notification-service/.../NotificationServiceApplication.java` | 通知服务启动类 |
| `notification-service/.../NotificationService.java` | 通知服务接口 |
| `notification-service/.../NotificationServiceImpl.java` | 通知服务实现（钉钉/邮件/短信/系统通知） |
| `notification-service/.../NotificationController.java` | 通知REST接口 |
| `notification-service/.../NotificationRequest.java` | 通知请求DTO |
| `notification-service/.../NotificationClient.java` | Feign客户端 |
| `notification-service/.../application.yml` | 通知服务配置 |
| `tenant-service/.../NotificationFeignClient.java` | 租户服务调用通知服务的Feign客户端 |
| `tenant-service/.../NacosConfigService.java` | Nacos配置推送服务 |
| `tenant-service/.../feature/FeatureFlag.java` | 功能开关实体 |
| `tenant-service/.../feature/FeatureFlagRepository.java` | 功能开关数据访问 |
| `tenant-service/.../FeatureFlagService.java` | 功能开关服务（含动态刷新） |
| `tenant-service/.../FeatureFlagController.java` | 功能开关REST接口 |
| `api-gateway/pom.xml` | API网关Maven配置 |
| `api-gateway/.../ApiGatewayApplication.java` | API网关启动类 |
| `api-gateway/.../ApiCounterFilter.java` | API调用量计数器过滤器 |
| `api-gateway/.../GatewayStatsController.java` | 网关统计接口 |
| `api-gateway/.../application.yml` | API网关配置 |

### 修改文件（6个）

| 文件 | 修改内容 |
|------|----------|
| `TenantServiceApplication.java` | 添加 `@EnableFeignClients` |
| `TenantServiceImpl.java` | 添加通知发送、Nacos推送、审核接口实现 |
| `TenantAdminController.java` | 新增审核接口、手动推送Nacos接口 |
| `TenantService.java` | 新增 approveTenant/rejectTenant/pushPackageToNacos 方法声明 |
| `Tenant.java` | 新增 `STATUS_PENDING_REVIEW = 2` 状态常量 |
| `notification-service/src/main/resources/bootstrap.yml` | 重命名为 application.yml（Nacos配置整合） |

---

## 五、后续建议

1. **notification-service** 需要实现真实的邮件发送（目前为模拟日志）
2. **Nacos配置** 需要在 Nacos 控制台确认 `TENANT_CONFIG` 和 `TENANT_FEATURE` 分组存在
3. **api-gateway** 路由配置 `gateway-routes.yaml` 需要在 Nacos 中创建
4. **feature_flags** 数据表需要创建（SQL建表语句待补充）
5. **审核工作流**建议增加：拒绝原因必填、审核日志记录、审核超时提醒
