compute_historical_credit.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package crontask
  2. import (
  3. "fmt"
  4. "github.com/zeromicro/go-zero/core/logx"
  5. "strconv"
  6. "time"
  7. "wechat-api/ent"
  8. "wechat-api/ent/creditbalance"
  9. "wechat-api/ent/creditusage"
  10. "wechat-api/ent/usagedetail"
  11. )
  12. func (l *CronTask) computeHistoricalCredit() {
  13. // 获取所有机器人信息
  14. //wxbots, err := l.svcCtx.DB.Wx.Query().Select(wx.FieldWxid, wx.FieldID, wx.FieldOrganizationID).All(l.ctx)
  15. //if err != nil {
  16. // l.Errorf("fetch wxids error:%v\n", err)
  17. // return
  18. //}
  19. //
  20. //wxbotsSet := make(map[uint64][]*ent.Wx)
  21. //for _, bot := range wxbots {
  22. // if !strings.HasPrefix(bot.Wxid, "temp-") {
  23. // wxbotsSet[bot.OrganizationID] = append(wxbotsSet[bot.OrganizationID], bot)
  24. // }
  25. //}
  26. orgBots := []OrgBot{}
  27. err := l.svcCtx.DB.UsageDetail.Query().
  28. GroupBy(usagedetail.FieldOrganizationID, usagedetail.FieldBotID).
  29. Aggregate().
  30. Scan(l.ctx, &orgBots)
  31. if err != nil {
  32. l.Errorf("group usage_detail error: %v", err)
  33. return
  34. }
  35. wxbotsSet := make(map[uint64][]string)
  36. for _, ob := range orgBots {
  37. wxbotsSet[ob.OrganizationID] = append(wxbotsSet[ob.OrganizationID], ob.BotID)
  38. }
  39. logx.Info("wxbotsSet: ", wxbotsSet)
  40. /*
  41. 计算本小时的数据
  42. 1. 查询出上小时里所有 usagedetail 内容
  43. 2. 挨个遍历他的 bot_id ,再查询他的 bot_id 相关的参数
  44. 3. 遍历的时候可能有重复,所以要先检查是否生成了数据,如果有就忽略,没有再生成
  45. ----------------------------------------------------------------------------------------------------------
  46. */
  47. // 获取当前时间
  48. //now := time.Now()
  49. //start := time.Date(2024, 12, 25, 0, 0, 0, 0, time.Local)
  50. start := time.Date(2025, 4, 1, 0, 0, 0, 0, time.Local)
  51. end := time.Date(2025, 4, 24, 23, 0, 0, 0, time.Local)
  52. //start := time.Date(2025, 3, 18, 0, 0, 0, 0, time.Local)
  53. //end := time.Date(2025, 3, 19, 23, 0, 0, 0, time.Local)
  54. balanceSet := make(map[uint64]float64)
  55. for now := end; !now.Before(start); now = now.Add(-time.Hour) {
  56. fmt.Println(now.Format("2006-01-02 15:00:00"))
  57. // 获取本小时的第一分钟
  58. currentHour := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location())
  59. //currentHourInt, _ := strconv.Atoi(currentHour.Format("2006010215"))
  60. // 上一个小时的起始时间
  61. lastHour := currentHour.Add(-time.Hour * 1)
  62. lastHourInt, _ := strconv.Atoi(lastHour.Format("2006010215"))
  63. var allHourConsumeCoinFloat float64
  64. for orgID, wxinfos := range wxbotsSet {
  65. var orgHourConsumeCoinFloat float64
  66. for _, wxinfo := range wxinfos {
  67. l.Logger.Infof("开始计算小时数据:%d\n", lastHourInt)
  68. // 先判断该账号是否已经统计了小时数据,如果已经统计了,就不需要再统计了
  69. var consumeCoinFloat float64
  70. // 计算积分消耗
  71. usageDetails, _ := l.svcCtx.DB.UsageDetail.Query().Where(
  72. usagedetail.BotID(wxinfo),
  73. usagedetail.CreatedAtGTE(lastHour),
  74. usagedetail.CreatedAtLT(currentHour),
  75. ).Order(ent.Desc(usagedetail.FieldCreatedAt)).All(l.ctx)
  76. allHourConsumeCoinFloat += consumeCoinFloat
  77. orgHourConsumeCoinFloat += consumeCoinFloat
  78. for _, usageDetail := range usageDetails {
  79. // 更改积分明细表
  80. hourDataCount, _ := l.svcCtx.DB.CreditUsage.Query().Where(
  81. creditusage.TableEQ("usage_detail"),
  82. creditusage.NidEQ(usageDetail.ID),
  83. ).Count(l.ctx)
  84. if hourDataCount == 0 {
  85. balanceSet[orgID] += usageDetail.Credits
  86. _, err = l.svcCtx.DB.CreditUsage.Create().
  87. SetNotNilNumber(&usageDetail.Credits).
  88. SetNtype(1).
  89. SetTable("usage_detail").
  90. SetOrganizationID(orgID).
  91. SetNid(usageDetail.ID).
  92. Save(l.ctx)
  93. l.Errorf("save hour data error:%v \n", err)
  94. }
  95. }
  96. }
  97. }
  98. }
  99. for orgID, balance := range balanceSet {
  100. hourDataCount, _ := l.svcCtx.DB.CreditBalance.Query().Where(
  101. creditbalance.OrganizationIDEQ(orgID),
  102. ).Count(l.ctx)
  103. if hourDataCount == 0 {
  104. _, err = l.svcCtx.DB.CreditBalance.Create().
  105. SetBalance(balance).
  106. SetOrganizationID(orgID).
  107. Save(l.ctx)
  108. l.Errorf("save hour data error:%v \n", err)
  109. } else {
  110. _, err = l.svcCtx.DB.CreditBalance.Update().
  111. Where(creditbalance.OrganizationIDEQ(orgID)).
  112. SetBalance(balance).
  113. Save(l.ctx)
  114. l.Errorf("save hour data error:%v \n", err)
  115. }
  116. }
  117. return
  118. }