compute_statistic.go 21 KB

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