simCardTaskSmartHub.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package simCardQueue
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fwh-toolbox-server/domain"
  6. "fwh-toolbox-server/repositories"
  7. "time"
  8. "github.com/google/uuid"
  9. "github.com/hibiken/asynq"
  10. "go.uber.org/zap"
  11. )
  12. const (
  13. TaskTypeSimCardSmartHubSyncOnePage = "SimCard:SmartHub:SyncOnePage"
  14. SmartHubSimCardInfoPageSize = 50 // SmartHub平台每次查询页数
  15. )
  16. // 数据类型转换 SmartHubInfo -> SimCardInfo
  17. func (processor *SimCardProcessor) smartHubInfoToSimCardInfo(infoList []domain.SmartHubSimCardInfoItem) []domain.SimCardInfo {
  18. var simCardInfoList []domain.SimCardInfo
  19. for _, info := range infoList {
  20. var simCardInfo domain.SimCardInfo
  21. simCardInfo.GICCID = info.GICCID[:19] // 只取前19位不取检验码
  22. if len(info.DeviceInfo) == 0 {
  23. zap.L().Error("SmartHub SimCardInfo has no DeviceInfo", zap.String("GICCID", info.GICCID))
  24. } else {
  25. deviceInfo := info.DeviceInfo[0]
  26. simCardInfo.IMEI = deviceInfo.IMEI // 国际移动用户识别码
  27. simCardInfo.IMSI = deviceInfo.IMSI // 国际移动用户识别码
  28. simCardInfo.MSISDN = deviceInfo.MSISDN // 移动用户号码
  29. }
  30. switch info.Status {
  31. case domain.SmartHubSimStatusTestReady: // 可测试
  32. simCardInfo.Status = domain.SimStatusNotActivated
  33. break
  34. case domain.SmartHubSimStatusActivateReady: // 可激活
  35. simCardInfo.Status = domain.SimStatusNotActivated
  36. break
  37. case domain.SmartHubSimStatusActivated: // 已激活
  38. simCardInfo.Status = domain.SimStatusActivated
  39. break
  40. case domain.SmartHubSimStatusDeactivated: // 已停用
  41. simCardInfo.Status = domain.SimStatusDeactivated
  42. break
  43. case domain.SmartHubSimStatusInventory: // 库存
  44. simCardInfo.Status = domain.SimStatusNotActivated
  45. break
  46. case domain.SmartHubSimStatusRetired: // 失效
  47. simCardInfo.Status = domain.SimStatusRetired
  48. break
  49. default:
  50. simCardInfo.Status = domain.SimStatusUnknown
  51. break
  52. }
  53. simCardInfo.Platform = domain.SimPlatformSmartHub // 数据来源平台
  54. simCardInfo.ExpirationTime = "" // SmartHub没有有效期
  55. simCardInfo.Month = time.Now().UTC().Format(time.DateOnly)[:7] // 统计月份 格式:yyyy-MM
  56. simCardInfo.AllDataUsage = info.CurrentCycleUsages.DataUsage // 月数据用量(KB)
  57. simCardInfo.UpdateTime = time.Now().UTC() // UTC时间
  58. simCardInfoList = append(simCardInfoList, simCardInfo)
  59. }
  60. return simCardInfoList
  61. }
  62. // 处理SimCard信息收集任务
  63. func (processor *SimCardProcessor) handleSimCardSmartHubSyncOnePageTask(ctx context.Context, task *asynq.Task) error {
  64. payloadStr := task.Payload()
  65. var payload SimCardSyncOnePagePayload
  66. err := json.Unmarshal(payloadStr, &payload)
  67. if err != nil {
  68. zap.L().Error("handleSimCardSmartHubSyncOnePageTask payload error.", zap.String("err", err.Error()), zap.String("payload", string(payloadStr)))
  69. return err
  70. }
  71. if payload.Date == "" {
  72. payload.Date = time.Now().UTC().Format(time.DateOnly)
  73. }
  74. // 请求批量查询SmartHub批量数据信息
  75. // 获取指定页信息
  76. resp, err := repositories.QuerySmartHubBatchSimCardInfo(uint(payload.Page), uint(payload.Size))
  77. if err != nil {
  78. zap.L().Error("handleSimCardSmartHubSyncOnePageTask QuerySmartHubBatchSimCardInfo failed.", zap.String("err", err.Error()), zap.Uint64("page", payload.Page), zap.Uint64("size", payload.Size))
  79. return err
  80. }
  81. // 转换数据结构
  82. infoList := processor.smartHubInfoToSimCardInfo(resp.Data)
  83. uuidStr := uuid.NewString()
  84. processor.putBatches(uuidStr, []simCardPageBatch{{
  85. Date: payload.Date, Pages: []domain.SimCardRunPage{{Platform: domain.SimPlatformSmartHub, Page: payload.Page}}, Info: infoList,
  86. }})
  87. // 创建聚合组任务
  88. aggTask := asynq.NewTask(
  89. TaskTypeSimCardAggregation,
  90. []byte(uuidStr),
  91. asynq.Queue("default"),
  92. asynq.Unique(5*time.Minute),
  93. asynq.Group(GroupNameSimCardAggregation),
  94. )
  95. _, err = TaskClient.Enqueue(aggTask)
  96. if err != nil {
  97. zap.L().Error("TaskTypeSimCardAggregation Enqueue failed.", zap.String("err", err.Error()), zap.Uint64("size", payload.Size), zap.Uint64("page", payload.Page))
  98. return err
  99. }
  100. // 判断是否查完所有信息
  101. if payload.Page*payload.Size > resp.Total {
  102. if err := repositories.MarkSimCardLastPage(payload.Date, domain.SimPlatformSmartHub, payload.Page); err != nil {
  103. return err
  104. }
  105. return processor.enqueueSimCardReportIfComplete(payload.Date)
  106. }
  107. // 创建下一个任务(查询下一页)
  108. payload.Page++
  109. taskPayloadStr, err := json.Marshal(payload)
  110. nextTask := asynq.NewTask(
  111. TaskTypeSimCardSmartHubSyncOnePage,
  112. taskPayloadStr,
  113. asynq.MaxRetry(5),
  114. asynq.Queue("default"),
  115. asynq.Timeout(time.Minute),
  116. asynq.Unique(5*time.Minute),
  117. asynq.Retention(7*24*time.Hour), // 成功后保留7天
  118. )
  119. _, err = TaskClient.Enqueue(nextTask)
  120. if err != nil {
  121. zap.L().Error("TaskTypeSimCardSyncOnePage Enqueue failed.", zap.String("err", err.Error()), zap.Uint64("size", payload.Size), zap.Uint64("page", payload.Page))
  122. return err
  123. }
  124. return nil
  125. }