compute_statistic.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  1. package crontask
  2. import (
  3. "strconv"
  4. "strings"
  5. "time"
  6. "wechat-api/ent"
  7. "wechat-api/ent/contact"
  8. "wechat-api/ent/creditusage"
  9. "wechat-api/ent/custom_types"
  10. "wechat-api/ent/labelrelationship"
  11. "wechat-api/ent/messagerecords"
  12. "wechat-api/ent/usagedetail"
  13. "wechat-api/ent/usagestatisticday"
  14. "wechat-api/ent/usagestatistichour"
  15. "wechat-api/ent/wx"
  16. )
  17. func (l *CronTask) computeStatistic() {
  18. startTime := time.Now()
  19. // 获取所有机器人信息
  20. wxbots, err := l.svcCtx.DB.Wx.Query().Select(wx.FieldWxid, wx.FieldID, wx.FieldOrganizationID).All(l.ctx)
  21. if err != nil {
  22. l.Errorf("fetch wxids error:%v\n", err)
  23. return
  24. }
  25. wxbotsSet := make(map[uint64][]*ent.Wx)
  26. for _, bot := range wxbots {
  27. if !strings.HasPrefix(bot.Wxid, "temp-") {
  28. wxbotsSet[bot.OrganizationID] = append(wxbotsSet[bot.OrganizationID], bot)
  29. }
  30. }
  31. LabelsCountSet := make(map[uint64][]custom_types.LabelDist)
  32. /*
  33. 计算本小时的数据
  34. 1. 查询出上小时里所有 usagedetail 内容
  35. 2. 挨个遍历他的 bot_id ,再查询他的 bot_id 相关的参数
  36. 3. 遍历的时候可能有重复,所以要先检查是否生成了数据,如果有就忽略,没有再生成
  37. ----------------------------------------------------------------------------------------------------------
  38. */
  39. // 获取当前时间
  40. now := time.Now()
  41. // 获取本小时的第一分钟
  42. currentHour := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location())
  43. currentHourInt, _ := strconv.Atoi(currentHour.Format("2006010215"))
  44. // 上一个小时的起始时间
  45. lastHour := currentHour.Add(-time.Hour * 1)
  46. lastHourInt, _ := strconv.Atoi(lastHour.Format("2006010215"))
  47. lc := []custom_types.LabelDist{}
  48. var allHourAiResponseInt, allHourSopRunInt, allHourFriendCountInt, allHourGroupCountInt, allHourAccountBalanceInt, allHourConsumeTokenInt, allHourActiveUserInt, allHourNewUserInt int
  49. var allHourConsumeCoinInt int
  50. for orgID, wxinfos := range wxbotsSet {
  51. var orgAiResponseInt, orgSopRunInt, orgFriendCountInt, orgGroupCountInt, orgAccountBalanceInt, orgConsumeTokenInt, orgActiveUserInt, orgNewUserInt int
  52. var orgHourConsumeCoinInt int
  53. for _, wxinfo := range wxinfos {
  54. l.Logger.Infof("开始计算小时数据:%d\n", lastHourInt)
  55. // 先判断该账号是否已经统计了小时数据,如果已经统计了,就不需要再统计了
  56. var aiResponseInt, sopRunInt, friendCountInt, groupCountInt, accountBalanceInt, consumeTokenInt, activeUserInt, newUserInt int
  57. var consumeCoinInt int
  58. hourDataCount, _ := l.svcCtx.DB.UsageStatisticHour.Query().Where(
  59. usagestatistichour.Type(1),
  60. usagestatistichour.BotID(wxinfo.Wxid),
  61. usagestatistichour.Addtime(uint64(lastHourInt)),
  62. ).Count(l.ctx)
  63. if hourDataCount > 0 {
  64. continue
  65. }
  66. // AI回复包括:SOP次数+AI次数
  67. // SOP次数:content 非空,source_type = 3 或 4,sub_source_id = 0
  68. // AI次数:app = 1 或 3
  69. sopresp, _ := l.svcCtx.DB.MessageRecords.Query().Where(
  70. messagerecords.SubSourceID(0),
  71. messagerecords.SourceTypeIn(3, 4),
  72. messagerecords.BotWxid(wxinfo.Wxid),
  73. messagerecords.CreatedAtGTE(lastHour),
  74. messagerecords.CreatedAtLT(currentHour),
  75. ).Count(l.ctx)
  76. airesp, _ := l.svcCtx.DB.UsageDetail.Query().Where(
  77. usagedetail.AppIn(1, 3),
  78. usagedetail.BotID(wxinfo.Wxid),
  79. usagedetail.CreatedAtGTE(lastHour),
  80. usagedetail.CreatedAtLT(currentHour),
  81. ).Count(l.ctx)
  82. aiResponseInt = sopresp + airesp
  83. orgAiResponseInt += aiResponseInt
  84. allHourAiResponseInt += aiResponseInt
  85. // SOP执行次数:SOP阶段和节点的执行次数。
  86. sopRunInt, _ = l.svcCtx.DB.MessageRecords.Query().Where(
  87. messagerecords.BotWxid(wxinfo.Wxid),
  88. messagerecords.SubSourceIDEQ(0),
  89. messagerecords.SourceTypeIn(3, 4),
  90. messagerecords.BotWxid(wxinfo.Wxid),
  91. messagerecords.CreatedAtGTE(lastHour),
  92. messagerecords.CreatedAtLT(currentHour),
  93. ).Count(l.ctx)
  94. orgSopRunInt += sopRunInt
  95. allHourSopRunInt += sopRunInt
  96. // 好友总数:contact 表中 type=1
  97. friendCountInt, _ = l.svcCtx.DB.Contact.Query().Where(
  98. contact.Type(1),
  99. contact.WxWxid(wxinfo.Wxid),
  100. contact.Ctype(1),
  101. ).Count(l.ctx)
  102. orgFriendCountInt += friendCountInt
  103. allHourFriendCountInt += friendCountInt
  104. // 群总数:contact 表中 type=2
  105. groupCountInt, _ = l.svcCtx.DB.Contact.Query().Where(
  106. contact.Type(2),
  107. contact.WxWxid(wxinfo.Wxid),
  108. contact.Ctype(1),
  109. ).Count(l.ctx)
  110. orgGroupCountInt += groupCountInt
  111. allHourGroupCountInt += groupCountInt
  112. // 消耗Token数:usage_detail 表
  113. consumeTokenInt, _ = l.svcCtx.DB.UsageDetail.Query().Where(
  114. usagedetail.TypeEQ(1),
  115. usagedetail.BotID(wxinfo.Wxid),
  116. usagedetail.CreatedAtGTE(lastHour),
  117. usagedetail.CreatedAtLT(currentHour),
  118. ).Aggregate(ent.Sum("total_tokens")).Int(l.ctx)
  119. orgConsumeTokenInt += consumeTokenInt
  120. allHourConsumeTokenInt += consumeTokenInt
  121. // 计算积分消耗
  122. consumeCoinInt, _ = l.svcCtx.DB.CreditUsage.Query().Where(
  123. creditusage.UserID(wxinfo.Wxid),
  124. creditusage.OrganizationID(orgID),
  125. creditusage.Ntype(2),
  126. creditusage.CreatedAtGTE(lastHour),
  127. creditusage.CreatedAtLT(currentHour),
  128. ).Aggregate(ent.Sum("number")).Int(l.ctx)
  129. allHourConsumeCoinInt += consumeCoinInt
  130. orgHourConsumeCoinInt += consumeCoinInt
  131. // 账户余额
  132. accountBalanceInt = 0
  133. orgAccountBalanceInt = 0
  134. allHourAccountBalanceInt = 0
  135. // 活跃好友:usage_detail 表 type = 1
  136. activeUsers, _ := l.svcCtx.DB.UsageDetail.Query().Where(
  137. usagedetail.Type(1),
  138. usagedetail.BotID(wxinfo.Wxid),
  139. usagedetail.CreatedAtGTE(lastHour),
  140. usagedetail.CreatedAtLT(currentHour),
  141. ).GroupBy(usagedetail.FieldReceiverID).Strings(l.ctx)
  142. activeUserInt = len(activeUsers)
  143. orgActiveUserInt += activeUserInt
  144. allHourActiveUserInt += activeUserInt
  145. lastHourData, _ := l.svcCtx.DB.UsageStatisticHour.Query().Where(
  146. usagestatistichour.AddtimeEQ(uint64(lastHourInt)),
  147. usagestatistichour.Type(1),
  148. usagestatistichour.BotID(wxinfo.Wxid),
  149. ).First(l.ctx)
  150. if lastHourData == nil {
  151. newUserInt = 0
  152. } else {
  153. newUserInt = friendCountInt - int(lastHourData.TotalFriend)
  154. }
  155. orgNewUserInt += newUserInt
  156. allHourNewUserInt += newUserInt
  157. _, err := l.svcCtx.DB.UsageStatisticHour.Create().
  158. SetType(1).
  159. SetBotID(wxinfo.Wxid).
  160. SetOrganizationID(wxinfo.OrganizationID).
  161. SetAiResponse(uint64(aiResponseInt)).
  162. SetSopRun(uint64(sopRunInt)).
  163. SetTotalFriend(uint64(friendCountInt)).
  164. SetTotalGroup(uint64(groupCountInt)).
  165. SetAccountBalance(uint64(accountBalanceInt)).
  166. SetConsumeToken(uint64(consumeTokenInt)).
  167. SetConsumeCoin(uint64(consumeCoinInt)).
  168. SetActiveUser(uint64(activeUserInt)).
  169. SetNewUser(int64(newUserInt)).
  170. SetAddtime(uint64(lastHourInt)).
  171. SetLabelDist(lc).
  172. Save(l.ctx)
  173. l.Errorf("save hour data error:%v \n", err)
  174. }
  175. // 先判断该租户是否已经统计了小时数据,如果已经统计了,就不需要再统计了
  176. hourDataCount, _ := l.svcCtx.DB.UsageStatisticHour.Query().Where(
  177. usagestatistichour.Type(1),
  178. usagestatistichour.OrganizationID(orgID),
  179. usagestatistichour.BotID(""),
  180. usagestatistichour.Addtime(uint64(lastHourInt)),
  181. ).Count(l.ctx)
  182. if hourDataCount > 0 {
  183. continue
  184. }
  185. LabelsCount := []custom_types.LabelDist{}
  186. err := l.svcCtx.DB.LabelRelationship.Query().Where(
  187. labelrelationship.OrganizationIDEQ(orgID),
  188. ).GroupBy(labelrelationship.FieldLabelID).Aggregate(ent.Count()).Scan(l.ctx, &LabelsCount)
  189. l.Errorf("save hour data error:%v \n", err)
  190. LabelsCountSet[orgID] = LabelsCount
  191. _, err = l.svcCtx.DB.UsageStatisticHour.Create().
  192. SetType(1).
  193. SetOrganizationID(orgID).
  194. SetAiResponse(uint64(orgAiResponseInt)).
  195. SetSopRun(uint64(orgSopRunInt)).
  196. SetTotalFriend(uint64(orgFriendCountInt)).
  197. SetTotalGroup(uint64(orgGroupCountInt)).
  198. SetAccountBalance(uint64(orgAccountBalanceInt)).
  199. SetConsumeToken(uint64(orgConsumeTokenInt)).
  200. SetConsumeCoin(uint64(orgHourConsumeCoinInt)).
  201. SetActiveUser(uint64(orgActiveUserInt)).
  202. SetNewUser(int64(orgNewUserInt)).
  203. SetAddtime(uint64(lastHourInt)).
  204. SetNotNilLabelDist(LabelsCount).
  205. Save(l.ctx)
  206. l.Errorf("save hour data error:%v \n", err)
  207. }
  208. // 先判断该租户是否已经统计了小时数据,如果已经统计了,就不需要再统计了
  209. hourDataCount, _ := l.svcCtx.DB.UsageStatisticHour.Query().Where(
  210. usagestatistichour.Type(1),
  211. usagestatistichour.OrganizationID(0),
  212. usagestatistichour.BotID(""),
  213. usagestatistichour.Addtime(uint64(lastHourInt)),
  214. ).Count(l.ctx)
  215. if hourDataCount == 0 {
  216. _, err = l.svcCtx.DB.UsageStatisticHour.Create().
  217. SetType(1).
  218. SetOrganizationID(0).
  219. SetAiResponse(uint64(allHourAiResponseInt)).
  220. SetSopRun(uint64(allHourSopRunInt)).
  221. SetTotalFriend(uint64(allHourFriendCountInt)).
  222. SetTotalGroup(uint64(allHourGroupCountInt)).
  223. SetAccountBalance(uint64(allHourAccountBalanceInt)).
  224. SetConsumeToken(uint64(allHourConsumeTokenInt)).
  225. SetConsumeCoin(uint64(allHourConsumeCoinInt)).
  226. SetActiveUser(uint64(allHourActiveUserInt)).
  227. SetNewUser(int64(allHourNewUserInt)).
  228. SetAddtime(uint64(lastHourInt)).
  229. SetLabelDist(lc).
  230. Save(l.ctx)
  231. l.Errorf("save hour data error:%v \n", err)
  232. }
  233. /*
  234. 计算日数据
  235. ----------------------------------------------------------------------------------------------------------
  236. */
  237. //dayStr := time.Now().Format("20060102")
  238. //day, _ := strconv.Atoi(dayStr)
  239. // 获取昨天的第一小时
  240. yesterday := now.AddDate(0, 0, -1)
  241. yesterdayFirstHour := time.Date(yesterday.Year(), yesterday.Month(), yesterday.Day(), 0, 0, 0, 0, now.Location())
  242. yesterdayInt, _ := strconv.Atoi(yesterdayFirstHour.Format("20060102"))
  243. yesterdayFirstHourInt, _ := strconv.Atoi(yesterdayFirstHour.Format("2006010215"))
  244. // 获取昨天的最后一小时
  245. yesterdayLastHour := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  246. yesterdayLastHourInt, _ := strconv.Atoi(yesterdayLastHour.Format("2006010215"))
  247. var allDayAiResponseInt, allDaySopRunInt, allDayFriendCountInt, allDayGroupCountInt, allDayAccountBalanceInt, allDayConsumeTokenInt, allDayActiveUserInt uint64
  248. var allDayNewUserInt int64
  249. var allDayConsumeCoinInt uint64
  250. for orgID, wxinfos := range wxbotsSet {
  251. var orgAiResponseInt, orgSopRunInt, orgFriendCountInt, orgGroupCountInt, orgAccountBalanceInt, orgConsumeTokenInt, orgActiveUserInt uint64
  252. var orgNewUserInt int64
  253. var orgDayConsumeCoinInt uint64
  254. for _, wxinfo := range wxinfos {
  255. l.Logger.Infof("开始计算日数据:%d\n", yesterdayInt)
  256. hourDataBatch, _ := l.svcCtx.DB.UsageStatisticHour.Query().Where(
  257. usagestatistichour.Type(1),
  258. usagestatistichour.BotID(wxinfo.Wxid),
  259. usagestatistichour.AddtimeGTE(uint64(yesterdayFirstHourInt)),
  260. usagestatistichour.AddtimeLT(uint64(yesterdayLastHourInt)),
  261. ).All(l.ctx)
  262. if hourDataBatch == nil {
  263. continue
  264. }
  265. var aiResponse, sopRun, totalFriend, totalGroup, accountBalance, consumeToken, activeUser uint64
  266. var newUser int64
  267. var consumeCoin uint64
  268. for _, hourData := range hourDataBatch {
  269. aiResponse += hourData.AiResponse
  270. sopRun += hourData.SopRun
  271. totalFriend = hourData.TotalFriend
  272. totalGroup = hourData.TotalGroup
  273. accountBalance = hourData.AccountBalance
  274. consumeToken += hourData.ConsumeToken
  275. //activeUser += hourData.ActiveUser
  276. newUser += hourData.NewUser
  277. consumeCoin += hourData.ConsumeCoin
  278. }
  279. // 活跃好友:usage_detail 表 type = 1
  280. activeUsers, _ := l.svcCtx.DB.UsageDetail.Query().Where(
  281. usagedetail.Type(1),
  282. usagedetail.BotID(wxinfo.Wxid),
  283. usagedetail.CreatedAtGTE(yesterdayFirstHour),
  284. usagedetail.CreatedAtLT(yesterdayLastHour),
  285. ).GroupBy(usagedetail.FieldReceiverID).Strings(l.ctx)
  286. activeUser = uint64(len(activeUsers))
  287. orgAiResponseInt += aiResponse
  288. orgSopRunInt += sopRun
  289. orgFriendCountInt += totalFriend
  290. orgGroupCountInt += totalGroup
  291. orgAccountBalanceInt += accountBalance
  292. orgConsumeTokenInt += consumeToken
  293. orgActiveUserInt += activeUser
  294. orgNewUserInt += newUser
  295. orgDayConsumeCoinInt += consumeCoin
  296. allDayAiResponseInt += aiResponse
  297. allDaySopRunInt += sopRun
  298. allDayFriendCountInt += totalFriend
  299. allDayGroupCountInt += totalGroup
  300. allDayAccountBalanceInt += accountBalance
  301. allDayConsumeTokenInt += consumeToken
  302. allDayActiveUserInt += activeUser
  303. allDayNewUserInt += newUser
  304. allDayConsumeCoinInt += consumeCoin
  305. // 先判断该账号是否已经统计了日数据,如果已经统计了,就不需要再统计了
  306. dayDataCount, _ := l.svcCtx.DB.UsageStatisticDay.Query().Where(
  307. usagestatisticday.Type(1),
  308. usagestatisticday.BotID(wxinfo.Wxid),
  309. usagestatisticday.Addtime(uint64(yesterdayInt)),
  310. ).Count(l.ctx)
  311. // 如果添加过了就略过
  312. if dayDataCount == 0 && yesterdayLastHourInt <= currentHourInt {
  313. _, err := l.svcCtx.DB.UsageStatisticDay.Create().
  314. SetAddtime(uint64(yesterdayInt)).
  315. SetType(1).
  316. SetBotID(wxinfo.Wxid).
  317. SetOrganizationID(wxinfo.OrganizationID).
  318. SetAiResponse(aiResponse).
  319. SetSopRun(sopRun).
  320. SetTotalFriend(totalFriend).
  321. SetTotalGroup(totalGroup).
  322. SetAccountBalance(accountBalance).
  323. SetConsumeToken(consumeToken).
  324. SetConsumeCoin(consumeCoin).
  325. SetActiveUser(activeUser).
  326. SetNewUser(newUser).
  327. SetLabelDist(lc).
  328. Save(l.ctx)
  329. if err != nil {
  330. l.Errorf("create day data error:%v \n", err)
  331. continue
  332. }
  333. }
  334. }
  335. // 先判断该租户是否已经统计了日数据,如果已经统计了,就不需要再统计了
  336. dayDataCount, _ := l.svcCtx.DB.UsageStatisticDay.Query().Where(
  337. usagestatisticday.Type(1),
  338. usagestatisticday.OrganizationID(orgID),
  339. usagestatisticday.BotID(""),
  340. usagestatisticday.Addtime(uint64(yesterdayInt)),
  341. ).Count(l.ctx)
  342. // 如果添加过了就略过
  343. if dayDataCount == 0 && yesterdayLastHourInt <= currentHourInt {
  344. _, err := l.svcCtx.DB.UsageStatisticDay.Create().
  345. SetAddtime(uint64(yesterdayInt)).
  346. SetType(1).
  347. SetOrganizationID(orgID).
  348. SetAiResponse(orgAiResponseInt).
  349. SetSopRun(orgSopRunInt).
  350. SetTotalFriend(orgFriendCountInt).
  351. SetTotalGroup(orgGroupCountInt).
  352. SetAccountBalance(orgAccountBalanceInt).
  353. SetConsumeToken(orgConsumeTokenInt).
  354. SetConsumeCoin(orgDayConsumeCoinInt).
  355. SetActiveUser(orgActiveUserInt).
  356. SetNewUser(orgNewUserInt).
  357. SetNotNilLabelDist(LabelsCountSet[orgID]).
  358. Save(l.ctx)
  359. if err != nil {
  360. l.Errorf("create day data error:%v \n", err)
  361. continue
  362. }
  363. }
  364. }
  365. // 先判断该租户是否已经统计了日数据,如果已经统计了,就不需要再统计了
  366. dayDataCount, _ := l.svcCtx.DB.UsageStatisticDay.Query().Where(
  367. usagestatisticday.Type(1),
  368. usagestatisticday.OrganizationID(0),
  369. usagestatisticday.BotID(""),
  370. usagestatisticday.Addtime(uint64(yesterdayInt)),
  371. ).Count(l.ctx)
  372. // 如果添加过了就略过
  373. if dayDataCount == 0 && yesterdayLastHourInt <= currentHourInt {
  374. _, err = l.svcCtx.DB.UsageStatisticDay.Create().
  375. SetAddtime(uint64(yesterdayInt)).
  376. SetType(1).
  377. SetOrganizationID(0).
  378. SetAiResponse(allDayAiResponseInt).
  379. SetSopRun(allDaySopRunInt).
  380. SetTotalFriend(allDayFriendCountInt).
  381. SetTotalGroup(allDayGroupCountInt).
  382. SetAccountBalance(allDayAccountBalanceInt).
  383. SetConsumeToken(allDayConsumeTokenInt).
  384. SetConsumeCoin(allDayConsumeCoinInt).
  385. SetActiveUser(allDayActiveUserInt).
  386. SetNewUser(allDayNewUserInt).
  387. SetLabelDist(lc).
  388. Save(l.ctx)
  389. if err != nil {
  390. l.Errorf("create day data error:%v \n", err)
  391. }
  392. }
  393. /*
  394. 查看月表数据是否已经完成
  395. 1. 查询出上月里所有 usagedetail 内容
  396. 2. 挨个遍历他的 bot_id ,再查询他的 bot_id 相关的参数
  397. ----------------------------------------------------------------------------------------------------------
  398. */
  399. //monthStr := time.Now().Format("200601")
  400. //month, _ := strconv.Atoi(monthStr)
  401. //
  402. //var allMonthAiResponseInt, allMonthSopRunInt, allMonthFriendCountInt, allMonthGroupCountInt, allMonthAccountBalanceInt, allMonthConsumeTokenInt, allMonthActiveUserInt uint64
  403. //var allMonthNewUserInt int64
  404. //for orgID, wxinfos := range wxbotsSet {
  405. // var orgAiResponseInt, orgSopRunInt, orgFriendCountInt, orgGroupCountInt, orgAccountBalanceInt, orgConsumeTokenInt, orgActiveUserInt uint64
  406. // var orgNewUserInt int64
  407. // for _, wxinfo := range wxinfos {
  408. // l.Logger.Infof("开始计算月数据:%d\n", month)
  409. //
  410. // // 获取上月的第一天
  411. // monthFirstDay := time.Date(now.Year(), now.Month()-1, 1, 0, 0, 0, 0, now.Location())
  412. // monthFirstDayInt, _ := strconv.Atoi(monthFirstDay.Format("20060102"))
  413. //
  414. // // 获取上月的最后一天
  415. // monthLastDay := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
  416. // monthLastDayInt, _ := strconv.Atoi(monthLastDay.Format("20060102"))
  417. //
  418. // // 先判断该账号是否已经统计了月数据,如果已经统计了,就不需要再统计了
  419. // monthDataCount, _ := l.svcCtx.DB.UsageStatisticMonth.Query().Where(
  420. // usagestatisticmonth.Type(1),
  421. // usagestatisticmonth.BotID(wxinfo.Wxid),
  422. // usagestatisticmonth.Addtime(uint64(month)),
  423. // ).Count(l.ctx)
  424. //
  425. // // 如果添加过了就略过
  426. // if monthDataCount > 0 {
  427. // continue
  428. // }
  429. //
  430. // dayDataBatch, _ := l.svcCtx.DB.UsageStatisticDay.Query().Where(
  431. // usagestatisticday.Type(1),
  432. // usagestatisticday.BotID(wxinfo.Wxid),
  433. // usagestatisticday.AddtimeGTE(uint64(monthFirstDayInt)),
  434. // usagestatisticday.AddtimeLT(uint64(monthLastDayInt)),
  435. // ).All(l.ctx)
  436. //
  437. // var aiResponse, sopRun, totalFriend, totalGroup, accountBalance, consumeToken, activeUser uint64
  438. // var newUser int64
  439. // for _, dayData := range dayDataBatch {
  440. // aiResponse += dayData.AiResponse
  441. // sopRun += dayData.SopRun
  442. // totalFriend += dayData.TotalFriend
  443. // totalGroup += dayData.TotalGroup
  444. // accountBalance += dayData.AccountBalance
  445. // consumeToken += dayData.ConsumeToken
  446. // activeUser += dayData.ActiveUser
  447. // newUser += dayData.NewUser
  448. // }
  449. // orgAiResponseInt += aiResponse
  450. // orgSopRunInt += sopRun
  451. // orgFriendCountInt += totalFriend
  452. // orgGroupCountInt += totalGroup
  453. // orgAccountBalanceInt += accountBalance
  454. // orgConsumeTokenInt += consumeToken
  455. // orgActiveUserInt += activeUser
  456. // orgNewUserInt += newUser
  457. //
  458. // allMonthAiResponseInt += aiResponse
  459. // allMonthSopRunInt += sopRun
  460. // allMonthFriendCountInt += totalFriend
  461. // allMonthGroupCountInt += totalGroup
  462. // allMonthAccountBalanceInt += accountBalance
  463. // allMonthConsumeTokenInt += consumeToken
  464. // allMonthActiveUserInt += activeUser
  465. // allMonthNewUserInt += newUser
  466. //
  467. // _, err := l.svcCtx.DB.UsageStatisticMonth.Create().
  468. // SetAddtime(uint64(month)).
  469. // SetType(1).
  470. // SetBotID(wxinfo.Wxid).
  471. // SetOrganizationID(wxinfo.OrganizationID).
  472. // SetAiResponse(aiResponse).
  473. // SetSopRun(sopRun).
  474. // SetTotalFriend(totalFriend).
  475. // SetTotalGroup(totalGroup).
  476. // SetAccountBalance(accountBalance).
  477. // SetConsumeToken(consumeToken).
  478. // SetActiveUser(activeUser).
  479. // SetNewUser(newUser).
  480. // SetLabelDist(lc).
  481. // Save(l.ctx)
  482. // if err != nil {
  483. // l.Errorf("create month data error:%v \n", err)
  484. // continue
  485. // }
  486. // }
  487. // // 先判断该租户是否已经统计了月数据,如果已经统计了,就不需要再统计了
  488. // monthDataCount, _ := l.svcCtx.DB.UsageStatisticMonth.Query().Where(
  489. // usagestatisticmonth.Type(1),
  490. // usagestatisticmonth.OrganizationID(orgID),
  491. // usagestatisticmonth.BotIDIsNil(),
  492. // usagestatisticmonth.Addtime(uint64(month)),
  493. // ).Count(l.ctx)
  494. //
  495. // // 如果添加过了就略过
  496. // if monthDataCount > 0 {
  497. // continue
  498. // }
  499. //
  500. // _, err := l.svcCtx.DB.UsageStatisticMonth.Create().
  501. // SetAddtime(uint64(month)).
  502. // SetType(1).
  503. // SetOrganizationID(orgID).
  504. // SetAiResponse(orgAiResponseInt).
  505. // SetSopRun(orgSopRunInt).
  506. // SetTotalFriend(orgFriendCountInt).
  507. // SetTotalGroup(orgGroupCountInt).
  508. // SetAccountBalance(orgAccountBalanceInt).
  509. // SetConsumeToken(orgConsumeTokenInt).
  510. // SetActiveUser(orgActiveUserInt).
  511. // SetNewUser(orgNewUserInt).
  512. // SetNotNilLabelDist(LabelsCountSet[orgID]).
  513. // Save(l.ctx)
  514. // if err != nil {
  515. // l.Errorf("create month data error:%v \n", err)
  516. // continue
  517. // }
  518. //}
  519. //
  520. //_, err = l.svcCtx.DB.UsageStatisticMonth.Create().
  521. // SetAddtime(uint64(month)).
  522. // SetType(1).
  523. // SetOrganizationID(0).
  524. // SetAiResponse(allMonthAiResponseInt).
  525. // SetSopRun(allMonthSopRunInt).
  526. // SetTotalFriend(allMonthFriendCountInt).
  527. // SetTotalGroup(allMonthGroupCountInt).
  528. // SetAccountBalance(allMonthAccountBalanceInt).
  529. // SetConsumeToken(allMonthConsumeTokenInt).
  530. // SetActiveUser(allMonthActiveUserInt).
  531. // SetNewUser(allMonthNewUserInt).
  532. // SetNotNilLabelDist(lc).
  533. // Save(l.ctx)
  534. //if err != nil {
  535. // l.Errorf("create month data error:%v \n", err)
  536. //}
  537. finishTime := time.Now()
  538. l.Logger.Infof("This process cost %v", finishTime.Sub(startTime).String())
  539. return
  540. }