compute_statistic.go 21 KB

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