get_charts_logic.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. package dashboard
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/suyuan32/simple-admin-common/msg/errormsg"
  6. "strconv"
  7. "time"
  8. "wechat-api/ent/custom_types"
  9. "wechat-api/ent/label"
  10. "wechat-api/ent/usagestatisticday"
  11. "wechat-api/ent/usagestatistichour"
  12. "wechat-api/internal/svc"
  13. "wechat-api/internal/types"
  14. "github.com/zeromicro/go-zero/core/logx"
  15. )
  16. type GetChartsLogic struct {
  17. logx.Logger
  18. ctx context.Context
  19. svcCtx *svc.ServiceContext
  20. }
  21. func NewGetChartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetChartsLogic {
  22. return &GetChartsLogic{
  23. Logger: logx.WithContext(ctx),
  24. ctx: ctx,
  25. svcCtx: svcCtx}
  26. }
  27. type SumUint struct {
  28. Addtime uint64 `json:"addtime"`
  29. Value uint64 `json:"value"`
  30. }
  31. type SumInt struct {
  32. Addtime uint64 `json:"addtime"`
  33. Value int64 `json:"value"`
  34. }
  35. func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp, err error) {
  36. // 获取组织id
  37. var organizationId uint64 = 0
  38. isAdmin := l.ctx.Value("isAdmin").(bool)
  39. if isAdmin && req.OrganizationId != nil && *req.OrganizationId != 0 {
  40. organizationId = *req.OrganizationId
  41. } else {
  42. organizationId = l.ctx.Value("organizationId").(uint64)
  43. }
  44. // 解析起始和截止时间
  45. layouts := []string{
  46. "2006-01", // 对应 "2024-01"
  47. "2006-01-02", // 对应 "2024-01-01"
  48. }
  49. var layoutsType int
  50. var startTime time.Time
  51. for i, layout := range layouts {
  52. startTime, err = time.Parse(layout, *req.StartDate)
  53. layoutsType = i
  54. if err == nil {
  55. break
  56. }
  57. }
  58. if err != nil {
  59. fmt.Println("解析开始时间失败:", err)
  60. return
  61. }
  62. var endTime time.Time
  63. for _, layout := range layouts {
  64. endTime, err = time.Parse(layout, *req.EndDate)
  65. if err == nil {
  66. break
  67. }
  68. }
  69. if err != nil {
  70. fmt.Println("解析结束时间失败:", err)
  71. return
  72. }
  73. // 判断截止日期是否包含当前日
  74. var isCurrentDay bool
  75. now := time.Now()
  76. if layoutsType == 0 {
  77. isCurrentDay = endTime.Year() == now.Year() && endTime.Month() == now.Month()
  78. } else {
  79. isCurrentDay = endTime.Year() == now.Year() && endTime.Month() == now.Month() && endTime.Day() == now.Day()
  80. }
  81. // 定义变量
  82. aiResponse := types.ChartsUint{}
  83. sopRun := types.ChartsUint{}
  84. totalFriend := types.ChartsUint{}
  85. totalGroup := types.ChartsUint{}
  86. accountBalance := types.ChartsUint{}
  87. consumeToken := types.ChartsUint{}
  88. activeUser := types.ChartsUint{}
  89. newUser := types.ChartsInt{}
  90. var labelDists []custom_types.LabelDist
  91. if isCurrentDay && layoutsType == 1 && req.StartDate == req.EndDate {
  92. // 返回当日每小时的数据
  93. startOfDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
  94. startAddTimeString := startOfDay.Format("2006010200")
  95. startAddTime, err := strconv.ParseUint(startAddTimeString, 10, 64)
  96. if err != nil {
  97. fmt.Println("转换开始时间失败:", err)
  98. return nil, err
  99. }
  100. usageStatisticHour, err := l.svcCtx.DB.UsageStatisticHour.Query().Where(
  101. usagestatistichour.OrganizationID(organizationId),
  102. usagestatistichour.BotIDIsNil(),
  103. usagestatistichour.AddtimeGTE(startAddTime),
  104. ).All(l.ctx)
  105. if err != nil {
  106. return nil, err
  107. }
  108. for _, hourData := range usageStatisticHour {
  109. addtimeLastTwoDigits := hourData.Addtime % 100
  110. aiResponse.Count = aiResponse.Count + hourData.AiResponse
  111. aiResponse.Val = append(aiResponse.Val, hourData.AiResponse)
  112. sopRun.Count = sopRun.Count + hourData.SopRun
  113. sopRun.Val = append(sopRun.Val, hourData.SopRun)
  114. totalFriend.Count = hourData.TotalFriend
  115. totalFriend.Val = append(totalFriend.Val, hourData.TotalFriend)
  116. totalGroup.Count = hourData.TotalGroup
  117. totalGroup.Val = append(totalGroup.Val, hourData.TotalGroup)
  118. consumeToken.Count = consumeToken.Count + hourData.ConsumeToken
  119. consumeToken.Val = append(consumeToken.Val, hourData.ConsumeToken)
  120. consumeToken.Label = append(consumeToken.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits))
  121. activeUser.Count = hourData.ActiveUser
  122. activeUser.Val = append(activeUser.Val, hourData.ActiveUser)
  123. newUser.Count = hourData.NewUser
  124. newUser.Val = append(newUser.Val, hourData.NewUser)
  125. newUser.Label = append(newUser.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits))
  126. }
  127. hourLen := len(usageStatisticHour)
  128. if hourLen > 0 {
  129. if usageStatisticHour[0].TotalFriend > 0 {
  130. totalFriend.Rate = float32((usageStatisticHour[hourLen-1].TotalFriend - usageStatisticHour[0].TotalFriend) / usageStatisticHour[0].TotalFriend)
  131. }
  132. if usageStatisticHour[0].TotalGroup > 0 {
  133. totalGroup.Rate = float32((usageStatisticHour[hourLen-1].TotalGroup - usageStatisticHour[0].TotalGroup) / usageStatisticHour[0].TotalGroup)
  134. }
  135. if usageStatisticHour[0].ActiveUser > 0 {
  136. activeUser.Rate = float32((usageStatisticHour[hourLen-1].ActiveUser - usageStatisticHour[0].ActiveUser) / usageStatisticHour[0].ActiveUser)
  137. }
  138. if usageStatisticHour[0].NewUser > 0 {
  139. newUser.Rate = float32((usageStatisticHour[hourLen-1].NewUser - usageStatisticHour[0].NewUser) / usageStatisticHour[0].NewUser)
  140. }
  141. labelDists = usageStatisticHour[hourLen-1].LabelDist
  142. }
  143. } else {
  144. // 从天表统计数据
  145. startAddTimeString := startTime.Format("20060102")
  146. startAddTime, err := strconv.ParseUint(startAddTimeString, 10, 64)
  147. if err != nil {
  148. fmt.Println("转换开始时间失败:", err)
  149. return nil, err
  150. }
  151. endAddTimeString := endTime.Format("20060102")
  152. endAddTime, err := strconv.ParseUint(endAddTimeString, 10, 64)
  153. if err != nil {
  154. fmt.Println("转换截止时间失败:", err)
  155. return nil, err
  156. }
  157. usageStatisticDay, err := l.svcCtx.DB.UsageStatisticDay.Query().
  158. Where(
  159. usagestatisticday.OrganizationID(organizationId),
  160. usagestatisticday.BotIDIsNil(),
  161. usagestatisticday.AddtimeGTE(startAddTime),
  162. usagestatisticday.AddtimeLTE(endAddTime),
  163. ).All(l.ctx)
  164. if err != nil {
  165. return nil, err
  166. }
  167. for _, dayData := range usageStatisticDay {
  168. aiResponse.Count = aiResponse.Count + dayData.AiResponse
  169. aiResponse.Val = append(aiResponse.Val, dayData.AiResponse)
  170. sopRun.Count = sopRun.Count + dayData.SopRun
  171. sopRun.Val = append(sopRun.Val, dayData.SopRun)
  172. totalFriend.Count = dayData.TotalFriend
  173. totalFriend.Val = append(totalFriend.Val, dayData.TotalFriend)
  174. totalGroup.Count = dayData.TotalGroup
  175. totalGroup.Val = append(totalGroup.Val, dayData.TotalGroup)
  176. consumeToken.Count = consumeToken.Count + dayData.ConsumeToken
  177. consumeToken.Val = append(consumeToken.Val, dayData.ConsumeToken)
  178. consumeToken.Label = append(consumeToken.Label, fmt.Sprintf("%d", dayData.Addtime))
  179. activeUser.Count = dayData.ActiveUser
  180. activeUser.Val = append(activeUser.Val, dayData.ActiveUser)
  181. newUser.Count = dayData.NewUser
  182. newUser.Val = append(newUser.Val, dayData.NewUser)
  183. newUser.Label = append(newUser.Label, fmt.Sprintf("%d", dayData.Addtime))
  184. }
  185. dayLen := len(usageStatisticDay)
  186. if dayLen > 0 {
  187. if usageStatisticDay[0].TotalFriend > 0 {
  188. totalFriend.Rate = float32((usageStatisticDay[dayLen-1].TotalFriend - usageStatisticDay[0].TotalFriend) / usageStatisticDay[0].TotalFriend)
  189. }
  190. if usageStatisticDay[0].TotalGroup > 0 {
  191. totalGroup.Rate = float32((usageStatisticDay[dayLen-1].TotalGroup - usageStatisticDay[0].TotalGroup) / usageStatisticDay[0].TotalGroup)
  192. }
  193. if usageStatisticDay[0].ActiveUser > 0 {
  194. activeUser.Rate = float32((usageStatisticDay[dayLen-1].ActiveUser - usageStatisticDay[0].ActiveUser) / usageStatisticDay[0].ActiveUser)
  195. }
  196. if usageStatisticDay[0].NewUser > 0 {
  197. newUser.Rate = float32((usageStatisticDay[dayLen-1].NewUser - usageStatisticDay[0].NewUser) / usageStatisticDay[0].NewUser)
  198. }
  199. labelDists = usageStatisticDay[dayLen-1].LabelDist
  200. }
  201. if isCurrentDay {
  202. // 从小时表统计当天数据
  203. startOfDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
  204. startOfDayAddTimeString := startOfDay.Format("2006010200")
  205. startOfDayAddTime, err := strconv.ParseUint(startOfDayAddTimeString, 10, 64)
  206. if err != nil {
  207. fmt.Println("转换开始时间失败:", err)
  208. return nil, err
  209. }
  210. usageStatisticHour, err := l.svcCtx.DB.UsageStatisticHour.Query().Where(
  211. usagestatistichour.OrganizationID(organizationId),
  212. usagestatistichour.BotIDIsNil(),
  213. usagestatistichour.AddtimeGTE(startOfDayAddTime),
  214. ).All(l.ctx)
  215. if err != nil {
  216. return nil, err
  217. }
  218. hourLen := len(usageStatisticHour)
  219. if hourLen > 0 {
  220. var aiResponseOfDay uint64
  221. var sopRunOfDay uint64
  222. var totalFriendOfDay uint64
  223. var totalGroupOfDay uint64
  224. var consumeTokenOfDay uint64
  225. var activeUserOfDay uint64
  226. var newUserOfDay int64
  227. for _, hourData := range usageStatisticHour {
  228. aiResponseOfDay += hourData.AiResponse
  229. sopRunOfDay += hourData.SopRun
  230. consumeTokenOfDay += hourData.ConsumeToken
  231. }
  232. totalFriendOfDay = usageStatisticHour[hourLen-1].TotalFriend
  233. totalGroupOfDay = usageStatisticHour[hourLen-1].TotalGroup
  234. activeUserOfDay = usageStatisticHour[hourLen-1].ActiveUser
  235. newUserOfDay = usageStatisticHour[hourLen-1].NewUser
  236. aiResponse.Count = aiResponse.Count + aiResponseOfDay
  237. aiResponse.Val = append(aiResponse.Val, aiResponseOfDay)
  238. sopRun.Count = sopRun.Count + sopRunOfDay
  239. sopRun.Val = append(sopRun.Val, sopRunOfDay)
  240. totalFriend.Count = totalFriendOfDay
  241. totalFriend.Val = append(totalFriend.Val, totalFriendOfDay)
  242. tfLen := len(totalFriend.Val)
  243. if tfLen > 0 && totalFriend.Val[0] > 0 {
  244. totalFriend.Rate = float32((totalFriend.Val[tfLen-1] - totalFriend.Val[0]) / totalFriend.Val[0])
  245. }
  246. totalGroup.Count = totalGroupOfDay
  247. totalGroup.Val = append(totalGroup.Val, totalGroupOfDay)
  248. tgLen := len(totalGroup.Val)
  249. if tgLen > 0 && totalGroup.Val[0] > 0 {
  250. totalGroup.Rate = float32((totalGroup.Val[tgLen-1] - totalGroup.Val[0]) / totalGroup.Val[0])
  251. }
  252. consumeToken.Count = consumeToken.Count + consumeTokenOfDay
  253. consumeToken.Val = append(consumeToken.Val, consumeTokenOfDay)
  254. consumeToken.Label = append(consumeToken.Label, "今日")
  255. activeUser.Count = activeUserOfDay
  256. activeUser.Val = append(activeUser.Val, activeUserOfDay)
  257. auLen := len(activeUser.Val)
  258. if auLen > 0 && activeUser.Val[0] > 0 {
  259. activeUser.Rate = float32((activeUser.Val[auLen-1] - activeUser.Val[0]) / activeUser.Val[0])
  260. }
  261. newUser.Count = newUserOfDay
  262. newUser.Val = append(newUser.Val, newUserOfDay)
  263. newUser.Label = append(newUser.Label, "今日")
  264. nuLen := len(newUser.Val)
  265. if nuLen > 0 && newUser.Val[0] > 0 {
  266. newUser.Rate = float32((newUser.Val[nuLen-1] - newUser.Val[0]) / newUser.Val[0])
  267. }
  268. labelDists = usageStatisticHour[hourLen-1].LabelDist
  269. }
  270. }
  271. }
  272. var labelIds []uint64
  273. var labelsData []types.LabelsData
  274. labelSet := make(map[uint64]uint64)
  275. for _, labelDist := range labelDists {
  276. if labelDist.Count != 0 {
  277. labelIds = append(labelIds, labelDist.LabelID)
  278. labelSet[labelDist.LabelID] = labelDist.Count
  279. }
  280. }
  281. labelInfos, err := l.svcCtx.DB.Label.Query().Where(label.IDIn(labelIds...)).All(l.ctx)
  282. for _, labelInfo := range labelInfos {
  283. labelsData = append(labelsData, types.LabelsData{
  284. Value: labelSet[labelInfo.ID],
  285. Name: labelInfo.Name,
  286. })
  287. }
  288. chartsData := types.ChartsData{
  289. AiResponse: &aiResponse,
  290. SopRun: &sopRun,
  291. TotalFriend: &totalFriend,
  292. TotalGroup: &totalGroup,
  293. AccountBalance: &accountBalance,
  294. ConsumeToken: &consumeToken,
  295. ActiveUser: &activeUser,
  296. NewUser: &newUser,
  297. LabelDist: labelsData,
  298. }
  299. return &types.ChartsResp{BaseDataInfo: types.BaseDataInfo{Msg: errormsg.UpdateSuccess}, Data: &chartsData}, nil
  300. }