simCardTaskSmartHub.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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.ExpirationTime = "" // SmartHub没有有效期
  54. simCardInfo.Month = time.Now().UTC().Format(time.DateOnly)[:7] // 统计月份 格式:yyyy-MM
  55. simCardInfo.AllDataUsage = info.CurrentCycleUsages.DataUsage // 月数据用量(KB)
  56. simCardInfo.UpdateTime = time.Now().UTC() // UTC时间
  57. simCardInfoList = append(simCardInfoList, simCardInfo)
  58. }
  59. return simCardInfoList
  60. }
  61. // 处理SimCard信息收集任务
  62. func (processor *SimCardProcessor) handleSimCardSmartHubSyncOnePageTask(ctx context.Context, task *asynq.Task) error {
  63. payloadStr := task.Payload()
  64. var payload SimCardSyncOnePagePayload
  65. err := json.Unmarshal(payloadStr, &payload)
  66. if err != nil {
  67. zap.L().Error("handleSimCardSmartHubSyncOnePageTask payload error.", zap.String("err", err.Error()), zap.String("payload", string(payloadStr)))
  68. return err
  69. }
  70. // 请求批量查询SmartHub批量数据信息
  71. // 获取指定页信息
  72. resp, err := repositories.QuerySmartHubBatchSimCardInfo(uint(payload.Page), uint(payload.Size))
  73. if err != nil {
  74. zap.L().Error("handleSimCardSmartHubSyncOnePageTask QuerySmartHubBatchSimCardInfo failed.", zap.String("err", err.Error()), zap.Uint64("page", payload.Page), zap.Uint64("size", payload.Size))
  75. return err
  76. }
  77. // 转换数据结构
  78. infoList := processor.smartHubInfoToSimCardInfo(resp.Data)
  79. uuidStr := uuid.NewString()
  80. processor.infoCacheMap[uuidStr] = infoList
  81. // 创建聚合组任务
  82. aggTask := asynq.NewTask(
  83. TaskTypeSimCardAggregation,
  84. []byte(uuidStr),
  85. asynq.Queue("default"),
  86. asynq.Unique(5*time.Minute),
  87. asynq.Group(GroupNameSimCardAggregation),
  88. )
  89. _, err = TaskClient.Enqueue(aggTask)
  90. if err != nil {
  91. zap.L().Error("TaskTypeSimCardAggregation Enqueue failed.", zap.String("err", err.Error()), zap.Uint64("size", payload.Size), zap.Uint64("page", payload.Page))
  92. return err
  93. }
  94. // 判断是否查完所有信息
  95. if payload.Page*payload.Size > resp.Total {
  96. return nil
  97. }
  98. // 创建下一个任务(查询下一页)
  99. payload.Page++
  100. taskPayloadStr, err := json.Marshal(payload)
  101. nextTask := asynq.NewTask(
  102. TaskTypeSimCardSmartHubSyncOnePage,
  103. taskPayloadStr,
  104. asynq.MaxRetry(5),
  105. asynq.Queue("default"),
  106. asynq.Timeout(time.Minute),
  107. asynq.Unique(5*time.Minute),
  108. asynq.Retention(7*24*time.Hour), // 成功后保留7天
  109. )
  110. _, err = TaskClient.Enqueue(nextTask)
  111. if err != nil {
  112. zap.L().Error("TaskTypeSimCardSyncOnePage Enqueue failed.", zap.String("err", err.Error()), zap.Uint64("size", payload.Size), zap.Uint64("page", payload.Page))
  113. return err
  114. }
  115. return nil
  116. }