@@ -45,6 +45,7 @@ func (ma *memberAPI) serve() {
4545 mr .POST ("/cron" , ma .addOrEditCron )
4646 mr .GET ("/cron/:id/manual" , ma .manualTrigger )
4747 mr .POST ("/force-update" , ma .forceUpdate )
48+ mr .POST ("/traffic/refresh" , ma .refreshTrafficCache )
4849 mr .POST ("/batch-update-server-group" , ma .batchUpdateServerGroup )
4950 mr .POST ("/batch-delete-server" , ma .batchDeleteServer )
5051 mr .POST ("/notification" , ma .addOrEditNotification )
@@ -1164,3 +1165,60 @@ func onServerDelete(id uint64) {
11641165
11651166 singleton .DB .Unscoped ().Delete (& model.Transfer {}, "server_id = ?" , id )
11661167}
1168+
1169+ // refreshTrafficCache 强制刷新流量检测缓存
1170+ func (ma * memberAPI ) refreshTrafficCache (c * gin.Context ) {
1171+ user := c .MustGet (model .CtxKeyAuthorizedUser ).(* model.User )
1172+
1173+ // 清空所有流量检测缓存
1174+ singleton .AlertsLock .Lock ()
1175+ defer singleton .AlertsLock .Unlock ()
1176+
1177+ clearedCount := 0
1178+
1179+ // 重置所有流量监控规则的下次更新时间
1180+ for i := 0 ; i < len (singleton .Alerts ); i ++ {
1181+ // 检查是否包含流量规则
1182+ hasTrafficRule := false
1183+ for j := 0 ; j < len (singleton .Alerts [i ].Rules ); j ++ {
1184+ if singleton .Alerts [i ].Rules [j ].IsTransferDurationRule () {
1185+ hasTrafficRule = true
1186+ // 重置下次更新时间缓存,强制立即更新
1187+ if singleton .Alerts [i ].Rules [j ].NextTransferAt != nil {
1188+ for serverID := range singleton .Alerts [i ].Rules [j ].NextTransferAt {
1189+ singleton .Alerts [i ].Rules [j ].NextTransferAt [serverID ] = time .Now ()
1190+ clearedCount ++
1191+ }
1192+ }
1193+ // 清空上次状态缓存
1194+ if singleton .Alerts [i ].Rules [j ].LastCycleStatus != nil {
1195+ for serverID := range singleton .Alerts [i ].Rules [j ].LastCycleStatus {
1196+ singleton .Alerts [i ].Rules [j ].LastCycleStatus [serverID ] = nil
1197+ }
1198+ }
1199+ }
1200+ }
1201+
1202+ // 如果包含流量规则,也清理AlertsCycleTransferStatsStore
1203+ if hasTrafficRule && singleton .AlertsCycleTransferStatsStore [singleton .Alerts [i ].ID ] != nil {
1204+ for serverID := range singleton .AlertsCycleTransferStatsStore [singleton .Alerts [i ].ID ].NextUpdate {
1205+ singleton .AlertsCycleTransferStatsStore [singleton .Alerts [i ].ID ].NextUpdate [serverID ] = time .Now ()
1206+ }
1207+ }
1208+ }
1209+
1210+ // 同时清理流量管理器缓存
1211+ tm := singleton .GetTrafficManager ()
1212+ if err := tm .SaveToDatabase (); err != nil {
1213+ c .JSON (http .StatusInternalServerError , model.Response {
1214+ Code : http .StatusInternalServerError ,
1215+ Message : fmt .Sprintf ("保存流量数据到数据库失败: %v" , err ),
1216+ })
1217+ return
1218+ }
1219+
1220+ c .JSON (http .StatusOK , model.Response {
1221+ Code : http .StatusOK ,
1222+ Message : fmt .Sprintf ("流量缓存刷新成功,用户: %s,清理了 %d 个服务器的流量缓存" , user .Login , clearedCount ),
1223+ })
1224+ }
0 commit comments