erp-java/docs/总控租户修复报告.md

304 lines
12 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.

# 总控与租户功能检查与修复报告
> 检查时间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 修复5API网关计数器
**新增文件:**
- `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.ymlNacos配置整合 |
---
## 五、后续建议
1. **notification-service** 需要实现真实的邮件发送(目前为模拟日志)
2. **Nacos配置** 需要在 Nacos 控制台确认 `TENANT_CONFIG``TENANT_FEATURE` 分组存在
3. **api-gateway** 路由配置 `gateway-routes.yaml` 需要在 Nacos 中创建
4. **feature_flags** 数据表需要创建SQL建表语句待补充
5. **审核工作流**建议增加:拒绝原因必填、审核日志记录、审核超时提醒