compute_statistic.go 21 KB

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