fix: 修复停复机操作未同步轮询卡缓存导致卡无法实际停机的问题
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
多处修改 network_status 的代码只更新了 DB 而未失效轮询缓存(polling:card:{id}),
导致轮询系统持续读取旧缓存值,跳过 Gateway 停机调用。
修复方式:DB 更新后立即 Del 轮询缓存 key,下次轮询自动从 DB 重建。
涉及文件:
- StopResumeService: CheckAndStopCard/resumeSingleCard/ManualStopCard/ManualStartCard
- iot_card/Service: RefreshCardDataFromGateway(通过 OnCardStatusChanged 回调)
- device/Service: StopDevice/StartDevice
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user