get_charts_logic.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. package dashboard
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/suyuan32/simple-admin-common/msg/errormsg"
  6. "math"
  7. "strconv"
  8. "time"
  9. "wechat-api/ent/custom_types"
  10. "wechat-api/ent/label"
  11. "wechat-api/ent/predicate"
  12. "wechat-api/ent/usagedetail"
  13. "wechat-api/ent/usagestatisticday"
  14. "wechat-api/ent/usagestatistichour"
  15. "wechat-api/internal/svc"
  16. "wechat-api/internal/types"
  17. "github.com/zeromicro/go-zero/core/logx"
  18. )
  19. type GetChartsLogic struct {
  20. logx.Logger
  21. ctx context.Context
  22. svcCtx *svc.ServiceContext
  23. }
  24. func NewGetChartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetChartsLogic {
  25. return &GetChartsLogic{
  26. Logger: logx.WithContext(ctx),
  27. ctx: ctx,
  28. svcCtx: svcCtx}
  29. }
  30. type SumUint struct {
  31. Addtime uint64 `json:"addtime"`
  32. Value uint64 `json:"value"`
  33. }
  34. type SumInt struct {
  35. Addtime uint64 `json:"addtime"`
  36. Value int64 `json:"value"`
  37. }
  38. func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp, err error) {
  39. // 获取组织id
  40. var organizationId uint64 = 0
  41. isAdmin := l.ctx.Value("isAdmin").(bool)
  42. if isAdmin {
  43. if req.OrganizationId != nil && *req.OrganizationId != 0 {
  44. organizationId = *req.OrganizationId
  45. }
  46. } else {
  47. organizationId = l.ctx.Value("organizationId").(uint64)
  48. }
  49. // 解析起始和截止时间
  50. layouts := []string{
  51. "2006-01", // 对应 "2024-01"
  52. "2006-01-02", // 对应 "2024-01-01"
  53. }
  54. var layoutsType int
  55. var startTime time.Time
  56. for i, layout := range layouts {
  57. startTime, err = time.Parse(layout, *req.StartDate)
  58. layoutsType = i
  59. if err == nil {
  60. break
  61. }
  62. }
  63. if err != nil {
  64. fmt.Println("解析开始时间失败:", err)
  65. return
  66. }
  67. var endTime time.Time
  68. for _, layout := range layouts {
  69. endTime, err = time.Parse(layout, *req.EndDate)
  70. if err == nil {
  71. break
  72. }
  73. }
  74. if err != nil {
  75. fmt.Println("解析结束时间失败:", err)
  76. return
  77. }
  78. // 判断截止日期是否包含当前日
  79. var isCurrentDay bool
  80. now := time.Now()
  81. if layoutsType == 0 {
  82. isCurrentDay = endTime.Year() == now.Year() && endTime.Month() == now.Month()
  83. } else {
  84. isCurrentDay = endTime.Year() == now.Year() && endTime.Month() == now.Month() && endTime.Day() == now.Day()
  85. }
  86. aiResponseTip := "AI角色 + SOP 执行次数"
  87. sopRunTip := "SOP 节点或阶段的触发次数"
  88. totalFriendTip := "截止至各统计时点的好友数量"
  89. totalGroupTip := "截止至各统计时点的群数量"
  90. activeUserTip := "统计周期内回复sop 或触发了AI角色的微信用户"
  91. newUserTip := "统计周期内好友的增减数量"
  92. // 定义变量
  93. aiResponse := types.ChartsUint{}
  94. aiResponse.Tip = &aiResponseTip
  95. sopRun := types.ChartsUint{}
  96. sopRun.Tip = &sopRunTip
  97. totalFriend := types.ChartsUint{}
  98. totalFriend.Tip = &totalFriendTip
  99. totalGroup := types.ChartsUint{}
  100. totalGroup.Tip = &totalGroupTip
  101. accountBalance := types.ChartsUint{}
  102. accountBalance.LabelText = "积分"
  103. consumeToken := types.ChartsUint{}
  104. consumeCoin := types.ChartsUint{}
  105. activeUser := types.ChartsUint{}
  106. activeUser.Tip = &activeUserTip
  107. newUser := types.ChartsInt{}
  108. newUser.Tip = &newUserTip
  109. var labelDists []custom_types.LabelDist
  110. if layoutsType == 1 && *req.StartDate == *req.EndDate {
  111. startAddTimeString := startTime.Format("2006010200")
  112. startAddTime, err := strconv.ParseUint(startAddTimeString, 10, 64)
  113. if err != nil {
  114. fmt.Println("转换开始时间失败:", err)
  115. return nil, err
  116. }
  117. nextDayMidnight := time.Date(startTime.Year(), startTime.Month(), startTime.Day()+1, 0, 0, 0, 0, startTime.Location())
  118. nextDayMidnightString := nextDayMidnight.Format("2006010200")
  119. nextDayAddTime, err := strconv.ParseUint(nextDayMidnightString, 10, 64)
  120. if err != nil {
  121. fmt.Println("转换次日0点时间失败:", err)
  122. return nil, err
  123. }
  124. var predicates []predicate.UsageStatisticHour
  125. if req.Wxid != nil {
  126. if organizationId != 0 {
  127. predicates = append(predicates, usagestatistichour.OrganizationID(organizationId))
  128. }
  129. predicates = append(predicates, usagestatistichour.BotID(*req.Wxid))
  130. } else {
  131. predicates = append(predicates, usagestatistichour.OrganizationID(organizationId))
  132. predicates = append(predicates, usagestatistichour.BotID(""))
  133. }
  134. predicates = append(predicates, usagestatistichour.AddtimeGTE(startAddTime))
  135. predicates = append(predicates, usagestatistichour.AddtimeLT(nextDayAddTime))
  136. usageStatisticHour, err := l.svcCtx.DB.UsageStatisticHour.Query().Where(predicates...).All(l.ctx)
  137. if err != nil {
  138. return nil, err
  139. }
  140. for _, hourData := range usageStatisticHour {
  141. addtimeLastTwoDigits := hourData.Addtime % 100
  142. aiResponse.Count += hourData.AiResponse
  143. aiResponse.Val = append(aiResponse.Val, hourData.AiResponse)
  144. aiResponse.Label = append(aiResponse.Label, fmt.Sprintf("%02d-%02d点", addtimeLastTwoDigits, addtimeLastTwoDigits+1))
  145. aiResponse.LabelText = "次"
  146. sopRun.Count += hourData.SopRun
  147. sopRun.Val = append(sopRun.Val, hourData.SopRun)
  148. sopRun.Label = append(sopRun.Label, fmt.Sprintf("%02d-%02d点", addtimeLastTwoDigits, addtimeLastTwoDigits+1))
  149. sopRun.LabelText = "次"
  150. totalFriend.Count = hourData.TotalFriend
  151. totalFriend.Val = append(totalFriend.Val, hourData.TotalFriend)
  152. totalFriend.Label = append(totalFriend.Label, fmt.Sprintf("%02d点", addtimeLastTwoDigits+1))
  153. totalFriend.LabelText = "个"
  154. totalGroup.Count = hourData.TotalGroup
  155. totalGroup.Val = append(totalGroup.Val, hourData.TotalGroup)
  156. totalGroup.Label = append(totalGroup.Label, fmt.Sprintf("%02d点", addtimeLastTwoDigits+1))
  157. totalGroup.LabelText = "个"
  158. consumeToken.Count += hourData.ConsumeToken
  159. consumeToken.Val = append(consumeToken.Val, hourData.ConsumeToken)
  160. consumeToken.Label = append(consumeToken.Label, fmt.Sprintf("%02d-%02d点", addtimeLastTwoDigits, addtimeLastTwoDigits+1))
  161. consumeToken.LabelText = "token"
  162. consumeCoin.Count += hourData.ConsumeCoin
  163. consumeCoin.Val = append(consumeCoin.Val, hourData.ConsumeCoin)
  164. consumeCoin.Label = append(consumeCoin.Label, fmt.Sprintf("%02d-%02d点", addtimeLastTwoDigits, addtimeLastTwoDigits+1))
  165. consumeCoin.LabelText = "coin"
  166. //activeUser.Count = hourData.ActiveUser
  167. activeUser.Val = append(activeUser.Val, hourData.ActiveUser)
  168. activeUser.Label = append(activeUser.Label, fmt.Sprintf("%02d-%02d点", addtimeLastTwoDigits, addtimeLastTwoDigits+1))
  169. activeUser.LabelText = "个"
  170. newUser.Count += hourData.NewUser
  171. newUser.Val = append(newUser.Val, hourData.NewUser)
  172. newUser.Label = append(newUser.Label, fmt.Sprintf("%02d-%02d点", addtimeLastTwoDigits, addtimeLastTwoDigits+1))
  173. newUser.LabelText = "个"
  174. }
  175. // 活跃好友:usage_detail 表 type = 1
  176. var usageDetailPredicates []predicate.UsageDetail
  177. if organizationId != 0 {
  178. usageDetailPredicates = append(usageDetailPredicates, usagedetail.OrganizationID(organizationId))
  179. }
  180. if req.Wxid != nil {
  181. usageDetailPredicates = append(usageDetailPredicates, usagedetail.BotID(*req.Wxid))
  182. }
  183. usageDetailPredicates = append(usageDetailPredicates, usagedetail.Type(1))
  184. usageDetailPredicates = append(usageDetailPredicates, usagedetail.CreatedAtGTE(startTime))
  185. usageDetailPredicates = append(usageDetailPredicates, usagedetail.CreatedAtLT(nextDayMidnight))
  186. activeUsers, _ := l.svcCtx.DB.UsageDetail.Query().Where(usageDetailPredicates...).GroupBy(usagedetail.FieldReceiverID).Strings(l.ctx)
  187. activeUser.Count = uint64(len(activeUsers))
  188. hourLen := len(usageStatisticHour)
  189. if hourLen > 0 {
  190. if usageStatisticHour[0].TotalFriend > 0 {
  191. totalFriendRate := float32((float64(usageStatisticHour[hourLen-1].TotalFriend) - float64(usageStatisticHour[0].TotalFriend)) / float64(usageStatisticHour[0].TotalFriend))
  192. totalFriendRateRound := float32(math.Round(float64(totalFriendRate) * 100))
  193. totalFriend.Rate = &totalFriendRateRound
  194. //totalFriend.Rate = &totalFriendRate
  195. }
  196. if usageStatisticHour[0].TotalGroup > 0 {
  197. totalGroupRate := float32((float64(usageStatisticHour[hourLen-1].TotalGroup) - float64(usageStatisticHour[0].TotalGroup)) / float64(usageStatisticHour[0].TotalGroup))
  198. totalGroupRateRound := float32(math.Round(float64(totalGroupRate) * 100))
  199. totalGroup.Rate = &totalGroupRateRound
  200. }
  201. //if usageStatisticHour[0].ActiveUser > 0 {
  202. // activeUserRate := float32((float64(usageStatisticHour[hourLen-1].ActiveUser) - float64(usageStatisticHour[0].ActiveUser)) / float64(usageStatisticHour[0].ActiveUser))
  203. // activeUserRateRound := float32(math.Round(float64(activeUserRate)*100))
  204. // activeUser.Rate = &activeUserRateRound
  205. //}
  206. if usageStatisticHour[0].NewUser > 0 {
  207. newUserRate := float32((float64(usageStatisticHour[hourLen-1].NewUser) - float64(usageStatisticHour[0].NewUser)) / float64(usageStatisticHour[0].NewUser))
  208. newUserRateRound := float32(math.Round(float64(newUserRate) * 100))
  209. newUser.Rate = &newUserRateRound
  210. }
  211. labelDists = usageStatisticHour[hourLen-1].LabelDist
  212. }
  213. } else {
  214. // 从天表统计数据
  215. startAddTimeString := startTime.Format("20060102")
  216. startAddTime, err := strconv.ParseUint(startAddTimeString, 10, 64)
  217. if err != nil {
  218. fmt.Println("转换开始时间失败:", err)
  219. return nil, err
  220. }
  221. endAddTimeString := endTime.Format("20060102")
  222. endAddTime, err := strconv.ParseUint(endAddTimeString, 10, 64)
  223. nextDayMidnight := time.Date(endTime.Year(), endTime.Month(), endTime.Day()+1, 0, 0, 0, 0, endTime.Location())
  224. if err != nil {
  225. fmt.Println("转换截止时间失败:", err)
  226. return nil, err
  227. }
  228. var predicatesDay []predicate.UsageStatisticDay
  229. if req.Wxid != nil {
  230. if organizationId != 0 {
  231. predicatesDay = append(predicatesDay, usagestatisticday.OrganizationID(organizationId))
  232. }
  233. predicatesDay = append(predicatesDay, usagestatisticday.BotID(*req.Wxid))
  234. } else {
  235. predicatesDay = append(predicatesDay, usagestatisticday.OrganizationID(organizationId))
  236. predicatesDay = append(predicatesDay, usagestatisticday.BotID(""))
  237. }
  238. predicatesDay = append(predicatesDay, usagestatisticday.AddtimeGTE(startAddTime))
  239. predicatesDay = append(predicatesDay, usagestatisticday.AddtimeLTE(endAddTime))
  240. usageStatisticDay, err := l.svcCtx.DB.UsageStatisticDay.Query().Where(predicatesDay...).All(l.ctx)
  241. if err != nil {
  242. return nil, err
  243. }
  244. for _, dayData := range usageStatisticDay {
  245. aiResponse.Count = aiResponse.Count + dayData.AiResponse
  246. aiResponse.Val = append(aiResponse.Val, dayData.AiResponse)
  247. aiResponse.Label = append(aiResponse.Label, fmt.Sprintf("%d", dayData.Addtime))
  248. aiResponse.LabelText = "次"
  249. sopRun.Count += dayData.SopRun
  250. sopRun.Val = append(sopRun.Val, dayData.SopRun)
  251. sopRun.Label = append(sopRun.Label, fmt.Sprintf("%d", dayData.Addtime))
  252. sopRun.LabelText = "次"
  253. totalFriend.Count = dayData.TotalFriend
  254. totalFriend.Val = append(totalFriend.Val, dayData.TotalFriend)
  255. totalFriend.Label = append(totalFriend.Label, fmt.Sprintf("%d", dayData.Addtime))
  256. totalFriend.LabelText = "个"
  257. totalGroup.Count = dayData.TotalGroup
  258. totalGroup.Val = append(totalGroup.Val, dayData.TotalGroup)
  259. totalGroup.Label = append(totalGroup.Label, fmt.Sprintf("%d", dayData.Addtime))
  260. totalGroup.LabelText = "个"
  261. consumeToken.Count += dayData.ConsumeToken
  262. consumeToken.Val = append(consumeToken.Val, dayData.ConsumeToken)
  263. consumeToken.Label = append(consumeToken.Label, fmt.Sprintf("%d", dayData.Addtime))
  264. consumeToken.LabelText = "token"
  265. consumeCoin.Count += dayData.ConsumeCoin
  266. consumeCoin.Val = append(consumeCoin.Val, dayData.ConsumeCoin)
  267. consumeCoin.Label = append(consumeCoin.Label, fmt.Sprintf("%d", dayData.Addtime))
  268. consumeCoin.LabelText = "coin"
  269. //activeUser.Count = dayData.ActiveUser
  270. activeUser.Val = append(activeUser.Val, dayData.ActiveUser)
  271. activeUser.Label = append(activeUser.Label, fmt.Sprintf("%d", dayData.Addtime))
  272. activeUser.LabelText = "个"
  273. newUser.Count += dayData.NewUser
  274. newUser.Val = append(newUser.Val, dayData.NewUser)
  275. newUser.Label = append(newUser.Label, fmt.Sprintf("%d", dayData.Addtime))
  276. newUser.LabelText = "个"
  277. }
  278. dayLen := len(usageStatisticDay)
  279. if dayLen > 0 {
  280. if usageStatisticDay[0].TotalFriend > 0 {
  281. totalFriendRate := float32((float64(usageStatisticDay[dayLen-1].TotalFriend) - float64(usageStatisticDay[0].TotalFriend)) / float64(usageStatisticDay[0].TotalFriend))
  282. totalFriendRateRound := float32(math.Round(float64(totalFriendRate) * 100))
  283. totalFriend.Rate = &totalFriendRateRound
  284. }
  285. if usageStatisticDay[0].TotalGroup > 0 {
  286. totalGroupRate := float32((float64(usageStatisticDay[dayLen-1].TotalGroup) - float64(usageStatisticDay[0].TotalGroup)) / float64(usageStatisticDay[0].TotalGroup))
  287. totalGroupRateRound := float32(math.Round(float64(totalGroupRate) * 100))
  288. totalGroup.Rate = &totalGroupRateRound
  289. }
  290. //if usageStatisticDay[0].ActiveUser > 0 {
  291. // activeUserRate := float32((float64(usageStatisticDay[dayLen-1].ActiveUser) - float64(usageStatisticDay[0].ActiveUser)) / float64(usageStatisticDay[0].ActiveUser))
  292. // activeUserRateRound := float32(math.Round(float64(activeUserRate)*100))
  293. // activeUser.Rate = &activeUserRateRound
  294. //}
  295. if usageStatisticDay[0].NewUser > 0 {
  296. newUserRate := float32((float64(usageStatisticDay[dayLen-1].NewUser) - float64(usageStatisticDay[0].NewUser)) / float64(usageStatisticDay[0].NewUser))
  297. newUserRateRound := float32(math.Round(float64(newUserRate) * 100))
  298. newUser.Rate = &newUserRateRound
  299. }
  300. labelDists = usageStatisticDay[dayLen-1].LabelDist
  301. }
  302. if isCurrentDay {
  303. // 从小时表统计当天数据
  304. startOfDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
  305. startOfDayAddTimeString := startOfDay.Format("2006010200")
  306. startOfDayAddTime, err := strconv.ParseUint(startOfDayAddTimeString, 10, 64)
  307. if err != nil {
  308. fmt.Println("转换开始时间失败:", err)
  309. return nil, err
  310. }
  311. var predicates []predicate.UsageStatisticHour
  312. if req.Wxid != nil {
  313. if organizationId != 0 {
  314. predicates = append(predicates, usagestatistichour.OrganizationID(organizationId))
  315. }
  316. predicates = append(predicates, usagestatistichour.BotID(*req.Wxid))
  317. } else {
  318. predicates = append(predicates, usagestatistichour.OrganizationID(organizationId))
  319. predicates = append(predicates, usagestatistichour.BotID(""))
  320. }
  321. predicates = append(predicates, usagestatistichour.AddtimeGTE(startOfDayAddTime))
  322. usageStatisticHour, err := l.svcCtx.DB.UsageStatisticHour.Query().Where(predicates...).All(l.ctx)
  323. if err != nil {
  324. return nil, err
  325. }
  326. hourLen := len(usageStatisticHour)
  327. if hourLen > 0 {
  328. var aiResponseOfDay uint64
  329. var sopRunOfDay uint64
  330. var totalFriendOfDay uint64
  331. var totalGroupOfDay uint64
  332. var consumeTokenOfDay uint64
  333. var consumeCoinOfDay uint64
  334. var activeUserOfDay uint64
  335. var newUserOfDay int64
  336. for _, hourData := range usageStatisticHour {
  337. aiResponseOfDay += hourData.AiResponse
  338. sopRunOfDay += hourData.SopRun
  339. consumeTokenOfDay += hourData.ConsumeToken
  340. consumeCoinOfDay += hourData.ConsumeCoin
  341. }
  342. totalFriendOfDay = usageStatisticHour[hourLen-1].TotalFriend
  343. totalGroupOfDay = usageStatisticHour[hourLen-1].TotalGroup
  344. activeUserOfDay = usageStatisticHour[hourLen-1].ActiveUser
  345. newUserOfDay = usageStatisticHour[hourLen-1].NewUser
  346. aiResponse.Count = aiResponse.Count + aiResponseOfDay
  347. aiResponse.Val = append(aiResponse.Val, aiResponseOfDay)
  348. aiResponse.Label = append(aiResponse.Label, "今日")
  349. aiResponse.LabelText = "次"
  350. sopRun.Count = sopRun.Count + sopRunOfDay
  351. sopRun.Val = append(sopRun.Val, sopRunOfDay)
  352. sopRun.Label = append(sopRun.Label, "今日")
  353. sopRun.LabelText = "次"
  354. totalFriend.Count = totalFriendOfDay
  355. totalFriend.Val = append(totalFriend.Val, totalFriendOfDay)
  356. totalFriend.Label = append(totalFriend.Label, "今日")
  357. tfLen := len(totalFriend.Val)
  358. if tfLen > 0 && totalFriend.Val[0] > 0 {
  359. totalFriendRate := float32((float64(totalFriend.Val[tfLen-1]) - float64(totalFriend.Val[0])) / float64(totalFriend.Val[0]))
  360. totalFriendRateRound := float32(math.Round(float64(totalFriendRate) * 100))
  361. totalFriend.Rate = &totalFriendRateRound
  362. }
  363. totalFriend.LabelText = "个"
  364. totalGroup.Count = totalGroupOfDay
  365. totalGroup.Val = append(totalGroup.Val, totalGroupOfDay)
  366. totalGroup.Label = append(totalGroup.Label, "今日")
  367. tgLen := len(totalGroup.Val)
  368. if tgLen > 0 && totalGroup.Val[0] > 0 {
  369. totalGroupRate := float32((float64(totalGroup.Val[tgLen-1]) - float64(totalGroup.Val[0])) / float64(totalGroup.Val[0]))
  370. totalGroupRateRound := float32(math.Round(float64(totalGroupRate) * 100))
  371. totalGroup.Rate = &totalGroupRateRound
  372. }
  373. totalGroup.LabelText = "个"
  374. consumeToken.Count = consumeToken.Count + consumeTokenOfDay
  375. consumeToken.Val = append(consumeToken.Val, consumeTokenOfDay)
  376. consumeToken.Label = append(consumeToken.Label, "今日")
  377. consumeToken.LabelText = "token"
  378. consumeCoin.Count = consumeCoin.Count + consumeTokenOfDay
  379. consumeToken.Val = append(consumeToken.Val, consumeTokenOfDay)
  380. consumeToken.Label = append(consumeToken.Label, "今日")
  381. consumeToken.LabelText = "token"
  382. //activeUser.Count = activeUserOfDay
  383. activeUser.Val = append(activeUser.Val, activeUserOfDay)
  384. activeUser.Label = append(activeUser.Label, "今日")
  385. //auLen := len(activeUser.Val)
  386. //if auLen > 0 && activeUser.Val[0] > 0 {
  387. // activeUserRate := float32((float64(activeUser.Val[auLen-1]) - float64(activeUser.Val[0])) / float64(activeUser.Val[0]))
  388. // activeUserRateRound := float32(math.Round(float64(activeUserRate)*100))
  389. // activeUser.Rate = &activeUserRateRound
  390. //}
  391. activeUser.LabelText = "个"
  392. newUser.Count = newUserOfDay
  393. newUser.Val = append(newUser.Val, newUserOfDay)
  394. newUser.Label = append(newUser.Label, "今日")
  395. nuLen := len(newUser.Val)
  396. if nuLen > 0 && newUser.Val[0] > 0 {
  397. newUserRate := float32((float64(newUser.Val[nuLen-1]) - float64(newUser.Val[0])) / float64(newUser.Val[0]))
  398. newUserRateRound := float32(math.Round(float64(newUserRate) * 100))
  399. newUser.Rate = &newUserRateRound
  400. }
  401. newUser.LabelText = "个"
  402. labelDists = usageStatisticHour[hourLen-1].LabelDist
  403. }
  404. }
  405. // 活跃好友:usage_detail 表 type = 1
  406. var usageDetailPredicates []predicate.UsageDetail
  407. if organizationId != 0 {
  408. usageDetailPredicates = append(usageDetailPredicates, usagedetail.OrganizationID(organizationId))
  409. }
  410. if req.Wxid != nil {
  411. usageDetailPredicates = append(usageDetailPredicates, usagedetail.BotID(*req.Wxid))
  412. }
  413. usageDetailPredicates = append(usageDetailPredicates, usagedetail.Type(1))
  414. usageDetailPredicates = append(usageDetailPredicates, usagedetail.CreatedAtGTE(startTime))
  415. usageDetailPredicates = append(usageDetailPredicates, usagedetail.CreatedAtLT(nextDayMidnight))
  416. activeUsers, _ := l.svcCtx.DB.UsageDetail.Query().Where(usageDetailPredicates...).GroupBy(usagedetail.FieldReceiverID).Strings(l.ctx)
  417. activeUser.Count = uint64(len(activeUsers))
  418. }
  419. var labelIds []uint64
  420. var labelsData []types.LabelsData
  421. labelSet := make(map[uint64]uint64)
  422. for _, labelDist := range labelDists {
  423. if labelDist.Count != 0 {
  424. labelIds = append(labelIds, labelDist.LabelID)
  425. labelSet[labelDist.LabelID] = labelDist.Count
  426. }
  427. }
  428. labelInfos, err := l.svcCtx.DB.Label.Query().Where(label.IDIn(labelIds...)).All(l.ctx)
  429. for _, labelInfo := range labelInfos {
  430. labelsData = append(labelsData, types.LabelsData{
  431. Value: labelSet[labelInfo.ID],
  432. Name: labelInfo.Name,
  433. })
  434. }
  435. chartsData := types.ChartsData{
  436. AiResponse: &aiResponse,
  437. SopRun: &sopRun,
  438. TotalFriend: &totalFriend,
  439. TotalGroup: &totalGroup,
  440. AccountBalance: &accountBalance,
  441. ConsumeToken: &consumeToken,
  442. ConsumeCoin: &consumeCoin,
  443. ActiveUser: &activeUser,
  444. NewUser: &newUser,
  445. LabelDist: labelsData,
  446. }
  447. return &types.ChartsResp{BaseDataInfo: types.BaseDataInfo{Msg: errormsg.UpdateSuccess}, Data: &chartsData}, nil
  448. }