get_charts_logic.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  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. for _, tg := range totalGroupSum {
  136. totalGroup = types.ChartsUint{
  137. Count: tg.Value,
  138. Val: append(totalGroup.Val, tg.Value),
  139. }
  140. }
  141. for _, ct := range consumeTokenSum {
  142. addtimeLastTwoDigits := ct.Addtime % 100
  143. consumeToken = types.ChartsUint{
  144. Count: consumeToken.Count + ct.Value,
  145. Val: append(consumeToken.Val, ct.Value),
  146. Label: append(consumeToken.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
  147. }
  148. }
  149. for _, au := range activeUserSum {
  150. activeUser = types.ChartsUint{
  151. Count: au.Value,
  152. Val: append(activeUser.Val, au.Value),
  153. }
  154. }
  155. for _, nu := range newUserSum {
  156. addtimeLastTwoDigits := nu.Addtime % 100
  157. newUser = types.ChartsInt{
  158. Count: nu.Value,
  159. Val: append(newUser.Val, nu.Value),
  160. Label: append(newUser.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
  161. }
  162. }
  163. } else {
  164. // 从天表统计数据
  165. startAddTimeString := startTime.Format("20060102")
  166. startAddTime, err := strconv.ParseUint(startAddTimeString, 10, 64)
  167. if err != nil {
  168. fmt.Println("转换开始时间失败:", err)
  169. return nil, err
  170. }
  171. endAddTimeString := endTime.Format("20060102")
  172. endAddTime, err := strconv.ParseUint(endAddTimeString, 10, 64)
  173. if err != nil {
  174. fmt.Println("转换截止时间失败:", err)
  175. return nil, err
  176. }
  177. usageStatisticDay := l.svcCtx.DB.UsageStatisticDay.Query().
  178. Where(
  179. usagestatisticday.OrganizationID(organizationId),
  180. usagestatisticday.AddtimeGTE(startAddTime),
  181. usagestatisticday.AddtimeLTE(endAddTime),
  182. ).
  183. GroupBy(usagestatisticday.FieldAddtime)
  184. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldAiResponse), "value")).Scan(l.ctx, &aiResponseSum)
  185. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldSopRun), "value")).Scan(l.ctx, &sopRunSum)
  186. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldTotalFriend), "value")).Scan(l.ctx, &totalFriendSum)
  187. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldTotalGroup), "value")).Scan(l.ctx, &totalGroupSum)
  188. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldConsumeToken), "value")).Scan(l.ctx, &consumeTokenSum)
  189. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldActiveUser), "value")).Scan(l.ctx, &activeUserSum)
  190. _ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldNewUser), "value")).Scan(l.ctx, &newUserSum)
  191. for _, ar := range aiResponseSum {
  192. aiResponse = types.ChartsUint{
  193. Count: aiResponse.Count + ar.Value,
  194. Val: append(aiResponse.Val, ar.Value),
  195. }
  196. }
  197. for _, sr := range sopRunSum {
  198. sopRun = types.ChartsUint{
  199. Count: sopRun.Count + sr.Value,
  200. Val: append(sopRun.Val, sr.Value),
  201. }
  202. }
  203. for _, tf := range totalFriendSum {
  204. totalFriend = types.ChartsUint{
  205. Count: tf.Value,
  206. Val: append(totalFriend.Val, tf.Value),
  207. }
  208. }
  209. for _, tg := range totalGroupSum {
  210. totalGroup = types.ChartsUint{
  211. Count: tg.Value,
  212. Val: append(totalGroup.Val, tg.Value),
  213. }
  214. }
  215. for _, ct := range consumeTokenSum {
  216. addtimeLastTwoDigits := ct.Addtime % 100
  217. consumeToken = types.ChartsUint{
  218. Count: consumeToken.Count + ct.Value,
  219. Val: append(consumeToken.Val, ct.Value),
  220. Label: append(consumeToken.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
  221. }
  222. }
  223. for _, au := range activeUserSum {
  224. activeUser = types.ChartsUint{
  225. Count: au.Value,
  226. Val: append(activeUser.Val, au.Value),
  227. }
  228. }
  229. for _, nu := range newUserSum {
  230. addtimeLastTwoDigits := nu.Addtime % 100
  231. newUser = types.ChartsInt{
  232. Count: nu.Value,
  233. Val: append(newUser.Val, nu.Value),
  234. Label: append(newUser.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
  235. }
  236. }
  237. if isCurrentDay {
  238. // 从小时表统计当天数据
  239. startOfDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
  240. startOfDayAddTimeString := startOfDay.Format("2006010200")
  241. startOfDayAddTime, err := strconv.ParseUint(startOfDayAddTimeString, 10, 64)
  242. if err != nil {
  243. fmt.Println("转换开始时间失败:", err)
  244. return nil, err
  245. }
  246. usageStatisticHour, err := l.svcCtx.DB.UsageStatisticHour.Query().Where(
  247. usagestatistichour.OrganizationID(organizationId),
  248. usagestatistichour.AddtimeGTE(startOfDayAddTime),
  249. ).All(l.ctx)
  250. if err != nil {
  251. return nil, err
  252. }
  253. hourLen := len(usageStatisticHour)
  254. if hourLen > 0 {
  255. var aiResponseOfDay uint64
  256. var sopRunOfDay uint64
  257. var totalFriendOfDay uint64
  258. var totalGroupOfDay uint64
  259. var consumeTokenOfDay uint64
  260. var activeUserOfDay uint64
  261. var newUserOfDay int64
  262. for _, hourData := range usageStatisticHour {
  263. aiResponseOfDay += hourData.AiResponse
  264. sopRunOfDay += hourData.SopRun
  265. consumeTokenOfDay += hourData.ConsumeToken
  266. }
  267. totalFriendOfDay = usageStatisticHour[hourLen-1].TotalFriend
  268. totalGroupOfDay = usageStatisticHour[hourLen-1].TotalGroup
  269. activeUserOfDay = usageStatisticHour[hourLen-1].ActiveUser
  270. newUserOfDay = usageStatisticHour[hourLen-1].NewUser
  271. aiResponse = types.ChartsUint{
  272. Count: aiResponse.Count + aiResponseOfDay,
  273. Val: append(aiResponse.Val, aiResponseOfDay),
  274. }
  275. sopRun = types.ChartsUint{
  276. Count: sopRun.Count + sopRunOfDay,
  277. Val: append(sopRun.Val, sopRunOfDay),
  278. }
  279. totalFriend = types.ChartsUint{
  280. Count: totalFriendOfDay,
  281. Val: append(totalFriend.Val, totalFriendOfDay),
  282. }
  283. totalGroup = types.ChartsUint{
  284. Count: totalGroupOfDay,
  285. Val: append(totalGroup.Val, totalGroupOfDay),
  286. }
  287. consumeToken = types.ChartsUint{
  288. Count: consumeToken.Count + consumeTokenOfDay,
  289. Val: append(consumeToken.Val, consumeTokenOfDay),
  290. Label: append(consumeToken.Label, "今日"),
  291. }
  292. activeUser = types.ChartsUint{
  293. Count: activeUserOfDay,
  294. Val: append(activeUser.Val, activeUserOfDay),
  295. }
  296. newUser = types.ChartsInt{
  297. Count: newUserOfDay,
  298. Val: append(newUser.Val, newUserOfDay),
  299. Label: append(newUser.Label, "今日"),
  300. }
  301. }
  302. }
  303. }
  304. chartsData := types.ChartsData{
  305. AiResponse: &aiResponse,
  306. SopRun: &sopRun,
  307. TotalFriend: &totalFriend,
  308. TotalGroup: &totalGroup,
  309. AccountBalance: &accountBalance,
  310. ConsumeToken: &consumeToken,
  311. ActiveUser: &activeUser,
  312. NewUser: &newUser,
  313. }
  314. return &types.ChartsResp{BaseDataInfo: types.BaseDataInfo{Msg: errormsg.UpdateSuccess}, Data: &chartsData}, nil
  315. }