12 KiB
12 KiB
总控与租户功能检查与修复报告
检查时间: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() 方法仅执行数据库写入,无任何通知逻辑。
// 当前实现(只有数据库写入)
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实体状态常量:
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推送。
// 当前实现
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.javanotification-service/src/main/java/com/erp/notification/service/NotificationService.javanotification-service/src/main/java/com/erp/notification/service/impl/NotificationServiceImpl.javanotification-service/src/main/java/com/erp/notification/controller/NotificationController.javanotification-service/src/main/java/com/erp/notification/dto/NotificationRequest.javanotification-service/src/main/java/com/erp/notification/client/NotificationClient.javanotification-service/src/main/resources/application.ymltenant-service/src/main/java/com/erp/tenant/feign/NotificationFeignClient.java
修改文件:
TenantServiceApplication.java- 添加@EnableFeignClientsTenantServiceImpl.java-createTenant()方法末尾添加通知发送
通知类型:
- 系统通知 → Redis队列
notifications:tenant:{tenantId} - 邮件通知 → 管理员邮箱(可配置)
- 钉钉通知 → 管理员群(可配置)
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 |
审核拒绝 |
审核通过操作:
- 将租户状态更新为
STATUS_ACTIVE - 初始化套餐配置到 Redis(
tenant:package:{id}:info/features/limits) - 推送套餐配置到 Nacos
- 发送审核通过通知(邮件 + 系统通知)
审核拒绝操作:
- 将租户状态更新为
STATUS_INACTIVE - 发送审核拒绝通知(含拒绝原因)
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推送内容:
# 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.javatenant-service/src/main/java/com/erp/tenant/repository/feature/FeatureFlagRepository.javatenant-service/src/main/java/com/erp/tenant/service/feature/FeatureFlagService.javatenant-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 |
刷新所有缓存 |
动态刷新机制:
toggleFeatureFlag()修改状态后- 调用
refreshFeatureCache()清除Redis缓存 - 调用
pushFeatureToNacos()推送到Nacos - 各微服务监听Nacos变化,动态更新本地配置
3.5 修复5:API网关计数器
新增文件:
api-gateway/pom.xmlapi-gateway/src/main/java/com/erp/gateway/ApiGatewayApplication.javaapi-gateway/src/main/java/com/erp/gateway/filter/ApiCounterFilter.javaapi-gateway/src/main/java/com/erp/gateway/controller/GatewayStatsController.javaapi-gateway/src/main/resources/application.yml
计数器功能(ApiCounterFilter):
- 全局计数器:按分钟/小时/天粒度统计总调用量
- 租户维度:每个租户的调用量和错误数
- 端点维度:每个API路径的调用量和错误数
- 请求日志:保留最近1000条完整请求记录(含路径、方法、租户、状态码、响应时间)
- 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配置整合) |
五、后续建议
- notification-service 需要实现真实的邮件发送(目前为模拟日志)
- Nacos配置 需要在 Nacos 控制台确认
TENANT_CONFIG和TENANT_FEATURE分组存在 - api-gateway 路由配置
gateway-routes.yaml需要在 Nacos 中创建 - feature_flags 数据表需要创建(SQL建表语句待补充)
- 审核工作流建议增加:拒绝原因必填、审核日志记录、审核超时提醒