userAds.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package v1
  2. import (
  3. "designs/app/common/request"
  4. "designs/app/common/response"
  5. "designs/global"
  6. "designs/model"
  7. "designs/utils"
  8. "github.com/gin-gonic/gin"
  9. "math"
  10. "time"
  11. )
  12. // 用户广告数据总览
  13. func UserAdsOverview(c *gin.Context) {
  14. form := request.Check(c, &struct {
  15. Gid string `json:"gid" binding:"required"`
  16. Pf []string `form:"pf" binding:"required"`
  17. }{})
  18. //近七日广告总数
  19. //查询近七日活跃总数
  20. now := time.Now()
  21. sevenDayAgo := now.AddDate(0, 0, -7)
  22. thirtyDayAgo := now.AddDate(0, 0, -30)
  23. var adsCount7 int64
  24. err := global.App.DB.Table("user_see_ads").
  25. Where("gid", form.Gid).
  26. WhereIn("pf", form.Pf).
  27. Where("adsState", 2). //只统计看完的
  28. Where("createdAt", ">=", sevenDayAgo).
  29. Where("createdAt", "<=", now).
  30. Count(&adsCount7).Error
  31. if err != nil {
  32. response.Fail(c, 1001, err.Error())
  33. return
  34. }
  35. //近30天广告总数
  36. var adsCount30 int64
  37. err = global.App.DB.Table("user_see_ads").
  38. Where("gid", form.Gid).
  39. WhereIn("pf", form.Pf).
  40. Where("adsState", 2). //只统计看完的
  41. Where("createdAt", ">=", thirtyDayAgo).
  42. Where("createdAt", "<=", now).
  43. Count(&adsCount30).Error
  44. if err != nil {
  45. response.Fail(c, 1001, err.Error())
  46. return
  47. }
  48. //近七日活跃用户人均看广告数
  49. var activeUserCount7 int64
  50. err = global.App.DB.Table("user_login").
  51. Where("gid", form.Gid).
  52. WhereIn("pf", form.Pf).
  53. Where("loginTime", ">=", sevenDayAgo).
  54. Where("loginTime", "<=", now).
  55. Distinct("userId").
  56. Count(&activeUserCount7).Error
  57. if err != nil {
  58. response.Fail(c, 1001, err.Error())
  59. return
  60. }
  61. //用户人均看广告数
  62. var userTotal int64
  63. err = global.App.DB.Table("user").
  64. Where("gid", form.Gid).
  65. WhereIn("pf", form.Pf).Count(&userTotal).Error
  66. if err != nil {
  67. response.Fail(c, 1001, err.Error())
  68. return
  69. }
  70. var adsTotal int64
  71. err = global.App.DB.Table("user_see_ads").
  72. Where("gid", form.Gid).
  73. Where("adsState", 2). //只统计看完的
  74. WhereIn("pf", form.Pf).Count(&adsTotal).Error
  75. if err != nil {
  76. response.Fail(c, 1001, err.Error())
  77. return
  78. }
  79. var avgUserAds float64
  80. var avgUserAds7 float64
  81. if activeUserCount7 == 0 {
  82. avgUserAds7 = 0
  83. } else {
  84. avgUserAds7 = float64(adsCount7) / float64(activeUserCount7)
  85. }
  86. if userTotal == 0 {
  87. avgUserAds = 0
  88. } else {
  89. avgUserAds = float64(adsTotal) / float64(userTotal)
  90. }
  91. response.Success(c, gin.H{
  92. "data": map[string]interface{}{
  93. "adsCount7": adsCount7,
  94. "adsCount30": adsCount30,
  95. "avgUserAds": math.Round(avgUserAds*100) / 100,
  96. "avgUserAds7": math.Round(avgUserAds7*100) / 100,
  97. },
  98. })
  99. }
  100. // 每日看广告总数
  101. func UserAdsDaily(c *gin.Context) {
  102. form := request.Check(c, &struct {
  103. Gid string `json:"gid" binding:"required"`
  104. Pf []string `form:"pf" binding:""`
  105. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  106. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  107. }{})
  108. dates := utils.GetTimeDayDate(form.StartTime, form.EndTime)
  109. //response.Success(c, gin.H{
  110. // "dates": dates,
  111. //})
  112. //return
  113. form.EndTime = form.EndTime + " 23:59:59"
  114. //近七日广告总数
  115. var userAdsDaily []struct {
  116. Date string `json:"date" gorm:"not null;column:date;"`
  117. Count int64 `json:"count" gorm:"not null;column:count;"`
  118. }
  119. err := global.App.DB.Table("user_see_ads").
  120. Where("gid", form.Gid).
  121. WhereIn("pf", form.Pf).
  122. Where("adsState", 2). //只统计看完的
  123. Where("createdAt", ">=", form.StartTime).
  124. Where("createdAt", "<=", form.EndTime).
  125. Group("date").
  126. Select("count(*) as count", "date").
  127. Scan(&userAdsDaily).Error
  128. if err != nil {
  129. response.Fail(c, 1001, err.Error())
  130. return
  131. }
  132. res := make(map[string]interface{})
  133. for k := range dates {
  134. res[k] = 0
  135. }
  136. for _, v := range userAdsDaily {
  137. date := v.Date[0:4] + "-" + v.Date[4:6] + "-" + v.Date[6:]
  138. res[date] = v.Count
  139. }
  140. var count int64
  141. for _, v := range userAdsDaily {
  142. count = count + v.Count
  143. }
  144. response.Success(c, gin.H{
  145. "data": map[string]interface{}{
  146. "userAdsDaily": res,
  147. "count": count,
  148. "avg": count / int64(len(dates)),
  149. },
  150. })
  151. }
  152. // 广告详细数据()
  153. func UserAdsDetail(c *gin.Context) {
  154. form := request.Check(c, &struct {
  155. Gid string `json:"gid" binding:"required"`
  156. Pf []string `form:"pf" binding:""`
  157. StartTime string `form:"startTime" json:"startTime" binding:""`
  158. EndTime string `form:"endTime" json:"endTime" binding:""`
  159. AdsState []int `json:"adsState" binding:""`
  160. AdsType string `json:"adsType" binding:""`
  161. OpenId string `json:"openId" binding:""`
  162. Offset int `json:"offset" binding:""`
  163. Limit int `json:"limit" binding:""`
  164. Order string `json:"order" binding:""`
  165. }{})
  166. form.EndTime = form.EndTime + " 23:59:59"
  167. query := global.App.DB.Table("user_see_ads").
  168. LeftJoin("user", "user.userId = user_see_ads.userId and user.pf = user_see_ads.pf and user.gid = user_see_ads.gid")
  169. query = query.Where("user_see_ads.gid", form.Gid).WhereIn("user_see_ads.pf", form.Pf)
  170. if form.StartTime != "" && form.EndTime != "" {
  171. query = query.Where("user_see_ads.createdAt", ">=", form.StartTime).Where("user_see_ads.createdAt", "<=", form.EndTime)
  172. }
  173. if len(form.AdsState) > 0 {
  174. query = query.WhereIn("adsState", form.AdsState)
  175. }
  176. if form.OpenId != "" {
  177. query = query.Where("openId", form.OpenId)
  178. }
  179. if form.AdsType != "" {
  180. query = query.Where("adsType", form.AdsType)
  181. }
  182. var count int64
  183. err := query.Count(&count).Error
  184. if err != nil {
  185. response.Fail(c, 1001, err.Error())
  186. return
  187. }
  188. var resData []struct {
  189. model.UserSeeAds
  190. OpenId string `json:"openId" gorm:"not null;column:openId;"`
  191. }
  192. err = query.Select("user_see_ads.*", "user.openId").
  193. Offset(form.Offset).Limit(form.Limit).
  194. Order("user_see_ads.id desc").Scan(&resData).Error
  195. if err != nil {
  196. response.Fail(c, 1001, err.Error())
  197. return
  198. }
  199. response.Success(c, gin.H{
  200. "data": resData,
  201. "count": count,
  202. })
  203. }