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

12 KiB
Raw Permalink Blame History

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

检查时间2026-04-05
检查范围:tenant-service8083+ 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.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. 初始化套餐配置到 Redistenant: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推送内容

# 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_CONFIGTENANT_FEATURE 分组存在
  3. api-gateway 路由配置 gateway-routes.yaml 需要在 Nacos 中创建
  4. feature_flags 数据表需要创建SQL建表语句待补充
  5. 审核工作流建议增加:拒绝原因必填、审核日志记录、审核超时提醒