compute_historical_credit.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package crontask
  2. import (
  3. "time"
  4. "wechat-api/ent"
  5. "wechat-api/ent/creditbalance"
  6. "wechat-api/ent/creditusage"
  7. "wechat-api/ent/usagedetail"
  8. "wechat-api/ent/usagetotal"
  9. )
  10. func (l *CronTask) computeHistoricalCredit() {
  11. // 获取所有当时的组织和机器人对应关系
  12. orgBots := []OrgBot{}
  13. err := l.svcCtx.DB.UsageDetail.Query().
  14. GroupBy(usagedetail.FieldOrganizationID, usagedetail.FieldBotID).
  15. Aggregate().
  16. Scan(l.ctx, &orgBots)
  17. if err != nil {
  18. l.Errorf("group usage_detail error: %v", err)
  19. return
  20. }
  21. // 遍历获得每个组织有过哪些机器人
  22. wxbotsSet := make(map[uint64][]string)
  23. for _, ob := range orgBots {
  24. wxbotsSet[ob.OrganizationID] = append(wxbotsSet[ob.OrganizationID], ob.BotID)
  25. }
  26. /*
  27. 计算本小时的数据
  28. 1. 查询出上小时里所有 usagedetail 内容
  29. 2. 挨个遍历他的 bot_id ,再查询他的 bot_id 相关的参数
  30. 3. 遍历的时候可能有重复,所以要先检查是否生成了数据,如果有就忽略,没有再生成
  31. ----------------------------------------------------------------------------------------------------------
  32. */
  33. // 获取当前时间
  34. //now := time.Now()
  35. //start := time.Date(2025, 4, 30, 16, 0, 0, 0, time.Local)
  36. //end := time.Date(2025, 5, 11, 16, 0, 0, 0, time.Local)
  37. start := time.Date(2024, 11, 24, 0, 0, 0, 0, time.Local)
  38. end := time.Date(2025, 5, 14, 0, 0, 0, 0, time.Local)
  39. //start := time.Date(2025, 3, 18, 0, 0, 0, 0, time.Local)
  40. //end := time.Date(2025, 3, 19, 23, 0, 0, 0, time.Local)
  41. balanceOrgSet := make(map[uint64]float64)
  42. balanceBotSet := make(map[string]float64)
  43. for orgID, wxinfos := range wxbotsSet {
  44. // 遍历每个组织
  45. if _, ok := balanceOrgSet[orgID]; !ok {
  46. balanceOrgSet[orgID] = 0
  47. }
  48. for _, wxinfo := range wxinfos {
  49. // 遍历每个组织中曾经有过的机器人
  50. // 建立机器人积分消耗字典,用于累计积分
  51. if _, ok := balanceBotSet[wxinfo]; !ok {
  52. balanceBotSet[wxinfo] = 0
  53. }
  54. l.Logger.Infof("开始计算小时数据:%d\n", start)
  55. // 计算积分消耗
  56. usageDetails, _ := l.svcCtx.DB.UsageDetail.Query().Where(
  57. usagedetail.BotID(wxinfo),
  58. usagedetail.OrganizationIDEQ(orgID),
  59. usagedetail.CreatedAtGTE(start),
  60. usagedetail.CreatedAtLT(end),
  61. ).Order(ent.Desc(usagedetail.FieldCreatedAt)).All(l.ctx)
  62. for _, usageDetail := range usageDetails {
  63. balanceBotSet[wxinfo] += usageDetail.Credits
  64. // 更改积分明细表
  65. hourDataCount, _ := l.svcCtx.DB.CreditUsage.Query().Where(
  66. creditusage.TableEQ("usage_detail"),
  67. creditusage.NidEQ(usageDetail.ID),
  68. ).Count(l.ctx)
  69. if hourDataCount == 0 {
  70. balanceOrgSet[orgID] += usageDetail.Credits
  71. _, err = l.svcCtx.DB.CreditUsage.Create().
  72. SetNumber(usageDetail.Credits).
  73. SetNtype(1).
  74. SetTable("usage_detail").
  75. SetOrganizationID(orgID).
  76. SetNid(usageDetail.ID).
  77. Save(l.ctx)
  78. if err != nil {
  79. l.Errorf("save hour data error:%v \n", err)
  80. }
  81. }
  82. }
  83. }
  84. }
  85. for orgID, balance := range balanceOrgSet {
  86. creditBalance, _ := l.svcCtx.DB.CreditBalance.Query().Where(
  87. creditbalance.OrganizationIDEQ(orgID),
  88. ).First(l.ctx)
  89. if creditBalance == nil {
  90. b := 0 - balance
  91. _, err = l.svcCtx.DB.CreditBalance.Create().
  92. SetBalance(b).
  93. SetOrganizationID(orgID).
  94. Save(l.ctx)
  95. l.Errorf("save hour data error:%v \n", err)
  96. } else {
  97. b := creditBalance.Balance - balance
  98. _, err = l.svcCtx.DB.CreditBalance.Update().
  99. Where(creditbalance.OrganizationIDEQ(orgID)).
  100. SetBalance(b).
  101. Save(l.ctx)
  102. l.Errorf("save hour data error:%v \n", err)
  103. }
  104. }
  105. for botID, balance := range balanceBotSet {
  106. _, err = l.svcCtx.DB.UsageTotal.Update().
  107. Where(usagetotal.BotIDEQ(botID)).
  108. SetCredits(balance).
  109. Save(l.ctx)
  110. l.Errorf("save hour data error:%v \n", err)
  111. }
  112. return
  113. }