get_charts_logic.go 20 KB

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