refactor(channel-monitor): event-driven scheduler + sidebar cleanup

后端 - ChannelMonitorRunner 重写为事件驱动调度
- 删除 5 秒轮询架构(每次 ListEnabled + listDueForCheck 全表扫描),
  改为每个 enabled monitor 一个独立 goroutine + ticker(按各自 IntervalSeconds)
- 新增 MonitorScheduler 接口,service 通过 setter 注入避免依赖环
- ChannelMonitorService.Create/Update/Delete 直接回调 scheduler.Schedule/Unschedule
- runner.Start 一次性加载所有 enabled monitor 建立任务表
- 新建/启用立即触发首次检测,禁用/删除即时撤销 ticker
- 保留 inFlight 去重 + pond 池并发上限 + 全局开关每次 fire 实时校验
- 删除 listDueForCheck / monitorTickerInterval / monitorListDueTimeout

前端 - 可用渠道改为用户级菜单
- 从 adminNavItems 移除 /available-channels(admin 主菜单不再重复出现)
- buildSelfNavItems 始终包含可用渠道入口,普通用户主菜单和
  管理员"我的账户"区都能看到
This commit is contained in:
erio
2026-04-22 19:17:08 +08:00
parent e1193212b5
commit c2f9ad7a21
4 changed files with 184 additions and 86 deletions

View File

@@ -503,10 +503,12 @@ func ProvideChannelMonitorService(
}
// ProvideChannelMonitorRunner 创建并启动渠道监控调度器。
// Runner.Stop 由 cleanup function 调用。
// settingService 用于 runner 每个 tick 读取功能开关
// 通过 SetScheduler 注入回 service 后再 Start确保启动时加载所有 enabled monitor
// 后续 CRUD 也能即时同步任务表。Runner.Stop 由 cleanup function 调用
// settingService 用于 runner 每次 fire 读取功能开关。
func ProvideChannelMonitorRunner(svc *ChannelMonitorService, settingService *SettingService) *ChannelMonitorRunner {
r := NewChannelMonitorRunner(svc, settingService)
svc.SetScheduler(r)
r.Start()
return r
}