get_charts_logic.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  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"
  9. "wechat-api/ent/usagestatisticday"
  10. "wechat-api/ent/usagestatistichour"
  11. "wechat-api/internal/svc"
  12. "wechat-api/internal/types"
  13. "github.com/zeromicro/go-zero/core/logx"
  14. )
  15. type GetChartsLogic struct {
  16. logx.Logger
  17. ctx context.Context
  18. svcCtx *svc.ServiceContext
  19. }
  20. func NewGetChartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetChartsLogic {
  21. return &GetChartsLogic{
  22. Logger: logx.WithContext(ctx),
  23. ctx: ctx,
  24. svcCtx: svcCtx}
  25. }
  26. type SumUint struct {
  27. Addtime uint64 `json:"addtime"`
  28. Value uint64 `json:"value"`
  29. }
  30. type SumInt struct {
  31. Addtime uint64 `json:"addtime"`
  32. Value int64 `json:"value"`
  33. }
  34. func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp, err error) {
  35. // 获取组织id
  36. var organizationId uint64 = 0
  37. isAdmin := l.ctx.Value("isAdmin").(bool)
  38. if isAdmin && req.OrganizationId != nil && *req.OrganizationId != 0 {
  39. organizationId = *req.OrganizationId
  40. } else {
  41. organizationId = l.ctx.Value("organizationId").(uint64)
  42. }
  43. // 解析起始和截止时间
  44. layouts := []string{
  45. "2006-01", // 对应 "2024-01"
  46. "2006-01-02", // 对应 "2024-01-01"
  47. }
  48. var layoutsType int
  49. var startTime time.Time
  50. for i, layout := range layouts {
  51. startTime, err = time.Parse(layout, *req.StartDate)
  52. layoutsType = i
  53. if err == nil {
  54. break
  55. }
  56. }
  57. l.Infof("----------------layoutsType--------------: %d", layoutsType)
  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. var aiResponse types.ChartsUint
  83. var sopRun types.ChartsUint
  84. var totalFriend types.ChartsUint
  85. var totalGroup types.ChartsUint
  86. var accountBalance types.ChartsUint
  87. var consumeToken types.ChartsUint
  88. var activeUser types.ChartsUint
  89. var newUser types.ChartsInt
  90. var aiResponseSum []SumUint
  91. var sopRunSum []SumUint
  92. var totalFriendSum []SumUint
  93. var totalGroupSum []SumUint
  94. var consumeTokenSum []SumUint
  95. var activeUserSum []SumUint
  96. var newUserSum []SumInt
  97. if isCurrentDay && layoutsType == 1 && req.StartDate == req.EndDate {
  98. // 返回当日每小时的数据
  99. startOfDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
  100. startAddTimeString := startOfDay.Format("2006010200")
  101. startAddTime, err := strconv.ParseUint(startAddTimeString, 10, 64)
  102. if err != nil {
  103. fmt.Println("转换开始时间失败:", err)
  104. return nil, err
  105. }
  106. usageStatisticHour := l.svcCtx.DB.UsageStatisticHour.Query().Where(
  107. usagestatistichour.OrganizationID(organizationId),
  108. usagestatistichour.AddtimeGTE(startAddTime),
  109. ).GroupBy(usagestatistichour.FieldAddtime)
  110. _ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldAiResponse), "value")).Scan(l.ctx, &aiResponseSum)
  111. _ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldSopRun), "value")).Scan(l.ctx, &sopRunSum)
  112. _ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldTotalFriend), "value")).Scan(l.ctx, &totalFriendSum)
  113. _ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldTotalGroup), "value")).Scan(l.ctx, &totalGroupSum)
  114. _ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldConsumeToken), "value")).Scan(l.ctx, &consumeTokenSum)
  115. _ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldActiveUser), "value")).Scan(l.ctx, &activeUserSum)
  116. _ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldNewUser), "value")).Scan(l.ctx, &newUserSum)
  117. for _, ar := range aiResponseSum {
  118. aiResponse = types.ChartsUint{
  119. Count: aiResponse.Count + ar.Value,
  120. Val: append(aiResponse.Val, ar.Value),
  121. }
  122. }
  123. for _, sr := range sopRunSum {
  124. sopRun = types.ChartsUint{
  125. Count: sopRun.Count + sr.Value,
  126. Val: append(sopRun.Val, sr.Value),
  127. }
  128. }
  129. for _, tf := range totalFriendSum {
  130. totalFriend = types.ChartsUint{
  131. Count: tf.Value,
  132. Val: append(totalFriend.Val, tf.Value),
  133. }
  134. }
  135. totalFriendLen := len(totalFriendSum)
  136. if totalFriendLen > 0 && totalFriendSum[0].Value > 0 {
  137. totalFriend.Rate = float32((totalFriendSum[totalFriendLen-1].Value - totalFriendSum[0].Value) / totalFriendSum[0].Value)
  138. }
  139. for _, tg := range totalGroupSum {
  140. totalGroup = types.ChartsUint{
  141. Count: tg.Value,
  142. Val: append(totalGroup.Val, tg.Value),
  143. }
  144. }
  145. totalGroupLen := len(totalGroupSum)
  146. if totalGroupLen > 0 && totalGroupSum[0].Value > 0 {
  147. totalGroup.Rate = float32((totalGroupSum[totalGroupLen-1].Value - totalGroupSum[0].Value) / totalGroupSum[0].Value)
  148. }
  149. for _, ct := range consumeTokenSum {
  150. addtimeLastTwoDigits := ct.Addtime % 100
  151. consumeToken = types.ChartsUint{
  152. Count: consumeToken.Count + ct.Value,
  153. Val: append(consumeToken.Val, ct.Value),
  154. Label: append(consumeToken.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
  155. }
  156. }
  157. for _, au := range activeUserSum {
  158. activeUser = types.ChartsUint{
  159. Count: au.Value,
  160. Val: append(activeUser.Val, au.Value),
  161. }
  162. }
  163. activeUserLen := len(activeUserSum)
  164. if activeUserLen > 0 && activeUserSum[0].Value > 0 {
  165. activeUser.Rate = float32((activeUserSum[activeUserLen-1].Value - activeUserSum[0].Value) / activeUserSum[0].Value)
  166. }
  167. for _, nu := range newUserSum {
  168. addtimeLastTwoDigits := nu.Addtime % 100
  169. newUser = types.ChartsInt{
  170. Count: nu.Value,
  171. Val: append(newUser.Val, nu.Value),
  172. Label: append(newUser.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
  173. }
  174. }
  175. newUserLen := len(newUserSum)
  176. if newUserLen > 0 && newUserSum[0].Value > 0 {
  177. newUser.Rate = float32((newUserSum[newUserLen-1].Value - newUserSum[0].Value) / newUserSum[0].Value)
  178. }
  179. } else {
  180. // 从天表统计数据
  181. startAddTimeString := startTime.Format("20060102")
  182. startAddTime, err := strconv.ParseUint(startAddTimeString, 10, 64)
  183. if err != nil {
  184. fmt.Println("转换开始时间失败:", err)
  185. return nil, err
  186. }
  187. endAddTimeString := endTime.Format("20060102")
  188. endAddTime, err := strconv.ParseUint(endAddTimeString, 10, 64)
  189. if err != nil {
  190. fmt.Println("转换截止时间失败:", err)
  191. return nil, err
  192. }
  193. usageStatisticDay := l.svcCtx.DB.UsageStatisticDay.Query().
  194. Where(
  195. usagestatisticday.OrganizationID(organizationId),
  196. usagestatisticday.AddtimeGTE(startAddTime),
  197. usagestatisticday.AddtimeLTE(endAddTime),
  198. ).
  199. GroupBy(usagestatisticday.FieldAddtime)
  200. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldAiResponse), "value")).Scan(l.ctx, &aiResponseSum)
  201. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldSopRun), "value")).Scan(l.ctx, &sopRunSum)
  202. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldTotalFriend), "value")).Scan(l.ctx, &totalFriendSum)
  203. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldTotalGroup), "value")).Scan(l.ctx, &totalGroupSum)
  204. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldConsumeToken), "value")).Scan(l.ctx, &consumeTokenSum)
  205. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldActiveUser), "value")).Scan(l.ctx, &activeUserSum)
  206. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldNewUser), "value")).Scan(l.ctx, &newUserSum)
  207. for _, ar := range aiResponseSum {
  208. aiResponse = types.ChartsUint{
  209. Count: aiResponse.Count + ar.Value,
  210. Val: append(aiResponse.Val, ar.Value),
  211. }
  212. }
  213. for _, sr := range sopRunSum {
  214. sopRun = types.ChartsUint{
  215. Count: sopRun.Count + sr.Value,
  216. Val: append(sopRun.Val, sr.Value),
  217. }
  218. }
  219. for _, tf := range totalFriendSum {
  220. totalFriend = types.ChartsUint{
  221. Count: tf.Value,
  222. Val: append(totalFriend.Val, tf.Value),
  223. }
  224. }
  225. totalFriendLen := len(totalFriendSum)
  226. if totalFriendLen > 0 && totalFriendSum[0].Value > 0 {
  227. totalFriend.Rate = float32((totalFriendSum[totalFriendLen-1].Value - totalFriendSum[0].Value) / totalFriendSum[0].Value)
  228. }
  229. for _, tg := range totalGroupSum {
  230. totalGroup = types.ChartsUint{
  231. Count: tg.Value,
  232. Val: append(totalGroup.Val, tg.Value),
  233. }
  234. }
  235. totalGroupLen := len(totalGroupSum)
  236. if totalGroupLen > 0 && totalGroupSum[0].Value > 0 {
  237. totalGroup.Rate = float32((totalGroupSum[totalGroupLen-1].Value - totalGroupSum[0].Value) / totalGroupSum[0].Value)
  238. }
  239. for _, ct := range consumeTokenSum {
  240. addtimeLastTwoDigits := ct.Addtime % 100
  241. consumeToken = types.ChartsUint{
  242. Count: consumeToken.Count + ct.Value,
  243. Val: append(consumeToken.Val, ct.Value),
  244. Label: append(consumeToken.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
  245. }
  246. }
  247. for _, au := range activeUserSum {
  248. activeUser = types.ChartsUint{
  249. Count: au.Value,
  250. Val: append(activeUser.Val, au.Value),
  251. }
  252. }
  253. activeUserLen := len(activeUserSum)
  254. if activeUserLen > 0 && activeUserSum[0].Value > 0 {
  255. activeUser.Rate = float32((activeUserSum[activeUserLen-1].Value - activeUserSum[0].Value) / activeUserSum[0].Value)
  256. }
  257. for _, nu := range newUserSum {
  258. addtimeLastTwoDigits := nu.Addtime % 100
  259. newUser = types.ChartsInt{
  260. Count: nu.Value,
  261. Val: append(newUser.Val, nu.Value),
  262. Label: append(newUser.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
  263. }
  264. }
  265. newUserLen := len(newUserSum)
  266. if newUserLen > 0 && newUserSum[0].Value > 0 {
  267. newUser.Rate = float32((newUserSum[newUserLen-1].Value - newUserSum[0].Value) / newUserSum[0].Value)
  268. }
  269. if isCurrentDay {
  270. // 从小时表统计当天数据
  271. startOfDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
  272. startOfDayAddTimeString := startOfDay.Format("2006010200")
  273. startOfDayAddTime, err := strconv.ParseUint(startOfDayAddTimeString, 10, 64)
  274. if err != nil {
  275. fmt.Println("转换开始时间失败:", err)
  276. return nil, err
  277. }
  278. usageStatisticHour, err := l.svcCtx.DB.UsageStatisticHour.Query().Where(
  279. usagestatistichour.OrganizationID(organizationId),
  280. usagestatistichour.AddtimeGTE(startOfDayAddTime),
  281. ).All(l.ctx)
  282. if err != nil {
  283. return nil, err
  284. }
  285. hourLen := len(usageStatisticHour)
  286. if hourLen > 0 {
  287. var aiResponseOfDay uint64
  288. var sopRunOfDay uint64
  289. var totalFriendOfDay uint64
  290. var totalGroupOfDay uint64
  291. var consumeTokenOfDay uint64
  292. var activeUserOfDay uint64
  293. var newUserOfDay int64
  294. for _, hourData := range usageStatisticHour {
  295. aiResponseOfDay += hourData.AiResponse
  296. sopRunOfDay += hourData.SopRun
  297. consumeTokenOfDay += hourData.ConsumeToken
  298. }
  299. totalFriendOfDay = usageStatisticHour[hourLen-1].TotalFriend
  300. totalGroupOfDay = usageStatisticHour[hourLen-1].TotalGroup
  301. activeUserOfDay = usageStatisticHour[hourLen-1].ActiveUser
  302. newUserOfDay = usageStatisticHour[hourLen-1].NewUser
  303. aiResponse = types.ChartsUint{
  304. Count: aiResponse.Count + aiResponseOfDay,
  305. Val: append(aiResponse.Val, aiResponseOfDay),
  306. }
  307. sopRun = types.ChartsUint{
  308. Count: sopRun.Count + sopRunOfDay,
  309. Val: append(sopRun.Val, sopRunOfDay),
  310. }
  311. totalFriend = types.ChartsUint{
  312. Count: totalFriendOfDay,
  313. Val: append(totalFriend.Val, totalFriendOfDay),
  314. }
  315. tfLen := len(totalFriend.Val)
  316. if tfLen > 0 && totalFriend.Val[0] > 0 {
  317. totalFriend.Rate = float32((totalFriend.Val[tfLen-1] - totalFriend.Val[0]) / totalFriend.Val[0])
  318. }
  319. totalGroup = types.ChartsUint{
  320. Count: totalGroupOfDay,
  321. Val: append(totalGroup.Val, totalGroupOfDay),
  322. }
  323. tgLen := len(totalGroup.Val)
  324. if tgLen > 0 && totalGroup.Val[0] > 0 {
  325. totalGroup.Rate = float32((totalGroup.Val[tgLen-1] - totalGroup.Val[0]) / totalGroup.Val[0])
  326. }
  327. consumeToken = types.ChartsUint{
  328. Count: consumeToken.Count + consumeTokenOfDay,
  329. Val: append(consumeToken.Val, consumeTokenOfDay),
  330. Label: append(consumeToken.Label, "今日"),
  331. }
  332. activeUser = types.ChartsUint{
  333. Count: activeUserOfDay,
  334. Val: append(activeUser.Val, activeUserOfDay),
  335. }
  336. auLen := len(activeUser.Val)
  337. if auLen > 0 && activeUser.Val[0] > 0 {
  338. activeUser.Rate = float32((activeUser.Val[auLen-1] - activeUser.Val[0]) / activeUser.Val[0])
  339. }
  340. newUser = types.ChartsInt{
  341. Count: newUserOfDay,
  342. Val: append(newUser.Val, newUserOfDay),
  343. Label: append(newUser.Label, "今日"),
  344. }
  345. nuLen := len(newUser.Val)
  346. if nuLen > 0 && newUser.Val[0] > 0 {
  347. newUser.Rate = float32((newUser.Val[nuLen-1] - newUser.Val[0]) / newUser.Val[0])
  348. }
  349. }
  350. }
  351. }
  352. chartsData := types.ChartsData{
  353. AiResponse: &aiResponse,
  354. SopRun: &sopRun,
  355. TotalFriend: &totalFriend,
  356. TotalGroup: &totalGroup,
  357. AccountBalance: &accountBalance,
  358. ConsumeToken: &consumeToken,
  359. ActiveUser: &activeUser,
  360. NewUser: &newUser,
  361. }
  362. return &types.ChartsResp{BaseDataInfo: types.BaseDataInfo{Msg: errormsg.UpdateSuccess}, Data: &chartsData}, nil
  363. }