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