get_charts_logic.go 21 KB

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