304 lines
12 KiB
Markdown
304 lines
12 KiB
Markdown
# 总控与租户功能检查与修复报告
|
||
|
||
> 检查时间: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. **审核工作流**建议增加:拒绝原因必填、审核日志记录、审核超时提醒
|