This commit is contained in:
@@ -262,6 +262,9 @@ func initWorkerRuntime(ctx context.Context, cfg *config.Config, appLogger *zap.L
|
|||||||
pollingDeviceStore,
|
pollingDeviceStore,
|
||||||
appLogger,
|
appLogger,
|
||||||
)
|
)
|
||||||
|
if stopResumeSvc, ok := workerResult.Services.StopResumeService.(*iot_card_svc.StopResumeService); ok {
|
||||||
|
stopResumeSvc.SetPollingCallback(lifecycleSvc)
|
||||||
|
}
|
||||||
|
|
||||||
return &workerRuntime{
|
return &workerRuntime{
|
||||||
redisAddr: redisAddr,
|
redisAddr: redisAddr,
|
||||||
|
|||||||
@@ -138,7 +138,8 @@ func initServices(s *stores, deps *Dependencies) *services {
|
|||||||
}
|
}
|
||||||
pollingConfigMgr.Start(context.Background())
|
pollingConfigMgr.Start(context.Background())
|
||||||
pollingQueueMgr := polling.NewPollingQueueManager(deps.Redis, constants.PollingShardCount, deps.Logger)
|
pollingQueueMgr := polling.NewPollingQueueManager(deps.Redis, constants.PollingShardCount, deps.Logger)
|
||||||
iotCard.SetPollingCallback(polling.NewPollingLifecycleService(pollingQueueMgr, pollingConfigMgr, s.IotCard, s.DeviceSimBinding, s.Device, deps.Logger))
|
pollingLifecycleSvc := polling.NewPollingLifecycleService(pollingQueueMgr, pollingConfigMgr, s.IotCard, s.DeviceSimBinding, s.Device, deps.Logger)
|
||||||
|
iotCard.SetPollingCallback(pollingLifecycleSvc)
|
||||||
// 注入流量扣减回调,使手动刷新资产时能触发套餐流量扣减
|
// 注入流量扣减回调,使手动刷新资产时能触发套餐流量扣减
|
||||||
usageService := packageSvc.NewUsageService(deps.DB, deps.Redis, s.PackageUsage, s.PackageUsageDailyRecord, s.DeviceSimBinding, deps.Logger)
|
usageService := packageSvc.NewUsageService(deps.DB, deps.Redis, s.PackageUsage, s.PackageUsageDailyRecord, s.DeviceSimBinding, deps.Logger)
|
||||||
iotCard.SetDataDeductor(usageService)
|
iotCard.SetDataDeductor(usageService)
|
||||||
@@ -167,6 +168,7 @@ func initServices(s *stores, deps *Dependencies) *services {
|
|||||||
deps.Logger,
|
deps.Logger,
|
||||||
assetAudit,
|
assetAudit,
|
||||||
)
|
)
|
||||||
|
stopResumeService.SetPollingCallback(pollingLifecycleSvc)
|
||||||
iotCard.SetRealnameActivator(packageActivation)
|
iotCard.SetRealnameActivator(packageActivation)
|
||||||
iotCard.SetStopResumeService(stopResumeService)
|
iotCard.SetStopResumeService(stopResumeService)
|
||||||
iotCard.SetDeviceSimBindingStore(s.DeviceSimBinding)
|
iotCard.SetDeviceSimBindingStore(s.DeviceSimBinding)
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ type StopResumeService struct {
|
|||||||
gatewayClient *gateway.Client
|
gatewayClient *gateway.Client
|
||||||
logger *zap.Logger
|
logger *zap.Logger
|
||||||
assetAuditService AssetAuditService
|
assetAuditService AssetAuditService
|
||||||
|
pollingCallback PollingCallback
|
||||||
|
|
||||||
maxRetries int
|
maxRetries int
|
||||||
retryInterval time.Duration
|
retryInterval time.Duration
|
||||||
@@ -66,6 +67,12 @@ func NewStopResumeService(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetPollingCallback 设置轮询生命周期回调。
|
||||||
|
// 停复机成功改变卡状态后,需要立即按新状态重排轮询队列,避免继续使用旧 score。
|
||||||
|
func (s *StopResumeService) SetPollingCallback(callback PollingCallback) {
|
||||||
|
s.pollingCallback = callback
|
||||||
|
}
|
||||||
|
|
||||||
// EvaluateAndAct 停复机统一入口
|
// EvaluateAndAct 停复机统一入口
|
||||||
// 根据卡的当前网络状态,自动判断并执行停机或复机操作
|
// 根据卡的当前网络状态,自动判断并执行停机或复机操作
|
||||||
// 设备/单卡维度通过 card.IsStandalone 推导(false 则为设备维度,停/复机覆盖设备下所有卡)
|
// 设备/单卡维度通过 card.IsStandalone 推导(false 则为设备维度,停/复机覆盖设备下所有卡)
|
||||||
@@ -476,7 +483,7 @@ func (s *StopResumeService) resumeSingleCard(ctx context.Context, cardID uint) e
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
s.invalidatePollingCache(ctx, card.ID)
|
s.reschedulePolling(ctx, card.ID)
|
||||||
|
|
||||||
s.logger.Info("卡已自动复机",
|
s.logger.Info("卡已自动复机",
|
||||||
zap.Uint("card_id", cardID),
|
zap.Uint("card_id", cardID),
|
||||||
@@ -583,7 +590,7 @@ func (s *StopResumeService) stopCardWithRetry(ctx context.Context, card *model.I
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
s.invalidatePollingCache(ctx, card.ID)
|
s.reschedulePolling(ctx, card.ID)
|
||||||
s.logCardAudit(ctx, assetAuditSvc.BuildLogParams{
|
s.logCardAudit(ctx, assetAuditSvc.BuildLogParams{
|
||||||
Operator: operator,
|
Operator: operator,
|
||||||
OperationType: operationType,
|
OperationType: operationType,
|
||||||
@@ -752,7 +759,7 @@ func (s *StopResumeService) StartMachineSeparatedCard(ctx context.Context, card
|
|||||||
return wrapErr
|
return wrapErr
|
||||||
}
|
}
|
||||||
|
|
||||||
s.invalidatePollingCache(ctx, card.ID)
|
s.reschedulePolling(ctx, card.ID)
|
||||||
s.logCardAudit(ctx, assetAuditSvc.BuildLogParams{
|
s.logCardAudit(ctx, assetAuditSvc.BuildLogParams{
|
||||||
OperationType: constants.AssetAuditOpCardManualStart,
|
OperationType: constants.AssetAuditOpCardManualStart,
|
||||||
OperationDesc: "机卡分离复机",
|
OperationDesc: "机卡分离复机",
|
||||||
@@ -971,7 +978,7 @@ func (s *StopResumeService) ManualStartCard(ctx context.Context, iccid string) e
|
|||||||
return wrapErr
|
return wrapErr
|
||||||
}
|
}
|
||||||
|
|
||||||
s.invalidatePollingCache(ctx, card.ID)
|
s.reschedulePolling(ctx, card.ID)
|
||||||
|
|
||||||
s.logCardAudit(ctx, assetAuditSvc.BuildLogParams{
|
s.logCardAudit(ctx, assetAuditSvc.BuildLogParams{
|
||||||
OperationType: constants.AssetAuditOpCardManualStart,
|
OperationType: constants.AssetAuditOpCardManualStart,
|
||||||
@@ -1002,3 +1009,13 @@ func (s *StopResumeService) invalidatePollingCache(ctx context.Context, cardID u
|
|||||||
s.logger.Warn("删除轮询卡缓存失败", zap.Uint("card_id", cardID))
|
s.logger.Warn("删除轮询卡缓存失败", zap.Uint("card_id", cardID))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reschedulePolling 按卡最新状态重排轮询队列。
|
||||||
|
// 未注入生命周期回调时退化为只清缓存,保持原有行为。
|
||||||
|
func (s *StopResumeService) reschedulePolling(ctx context.Context, cardID uint) {
|
||||||
|
if s.pollingCallback == nil {
|
||||||
|
s.invalidatePollingCache(ctx, cardID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.pollingCallback.OnCardStatusChanged(ctx, cardID)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user