diff --git a/internal/service/device/service.go b/internal/service/device/service.go index 48ba070..35728e9 100644 --- a/internal/service/device/service.go +++ b/internal/service/device/service.go @@ -872,6 +872,7 @@ func (s *Service) StopDevice(ctx context.Context, deviceID uint) (*dto.DeviceSus continue } + s.invalidatePollingCardCache(card.ID) successCount++ } @@ -973,6 +974,7 @@ func (s *Service) StartDevice(ctx context.Context, deviceID uint) error { continue } + s.invalidatePollingCardCache(card.ID) successCount++ } @@ -989,3 +991,10 @@ func (s *Service) StartDevice(ctx context.Context, deviceID uint) error { return nil } + +func (s *Service) invalidatePollingCardCache(cardID uint) { + if s.redis == nil { + return + } + _ = s.redis.Del(context.Background(), constants.RedisPollingCardInfoKey(cardID)).Err() +} diff --git a/internal/service/iot_card/service.go b/internal/service/iot_card/service.go index ebb66fd..a01bf14 100644 --- a/internal/service/iot_card/service.go +++ b/internal/service/iot_card/service.go @@ -876,6 +876,11 @@ func (s *Service) RefreshCardDataFromGateway(ctx context.Context, iccid string) } } + // 失效轮询缓存,确保轮询系统读到最新的 network_status/real_name_status/流量 + if s.pollingCallback != nil { + s.pollingCallback.OnCardStatusChanged(ctx, card.ID) + } + s.logger.Info("刷新卡数据成功", zap.String("iccid", iccid), zap.Uint("card_id", card.ID), diff --git a/internal/service/iot_card/stop_resume_service.go b/internal/service/iot_card/stop_resume_service.go index 0405171..58b1100 100644 --- a/internal/service/iot_card/stop_resume_service.go +++ b/internal/service/iot_card/stop_resume_service.go @@ -98,6 +98,9 @@ func (s *StopResumeService) CheckAndStopCard(ctx context.Context, cardID uint) e return err } + // 失效轮询缓存,确保下次轮询从 DB 读取最新状态 + s.invalidatePollingCache(cardID) + s.logger.Info("卡因流量耗尽已停机", zap.Uint("card_id", cardID), zap.String("iccid", card.ICCID)) @@ -183,6 +186,8 @@ func (s *StopResumeService) resumeSingleCard(ctx context.Context, cardID uint) e return nil } + s.invalidatePollingCache(cardID) + s.logger.Info("卡已自动复机", zap.Uint("card_id", cardID), zap.String("iccid", card.ICCID)) @@ -345,6 +350,9 @@ func (s *StopResumeService) ManualStopCard(ctx context.Context, iccid string) er }).Error; err != nil { return errors.Wrap(errors.CodeDatabaseError, err, "更新卡状态失败") } + + s.invalidatePollingCache(card.ID) + return nil } @@ -384,5 +392,19 @@ func (s *StopResumeService) ManualStartCard(ctx context.Context, iccid string) e }).Error; err != nil { return errors.Wrap(errors.CodeDatabaseError, err, "更新卡状态失败") } + + s.invalidatePollingCache(card.ID) + return nil } + +// invalidatePollingCache 删除轮询卡缓存,下次轮询自动从 DB 重建 +func (s *StopResumeService) invalidatePollingCache(cardID uint) { + if s.redis == nil { + return + } + key := constants.RedisPollingCardInfoKey(cardID) + if err := s.redis.Del(context.Background(), key).Err(); err != nil { + s.logger.Warn("删除轮询卡缓存失败", zap.Uint("card_id", cardID), zap.Error(err)) + } +}