compute_statistic.go 22 KB

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