userAds.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. // 用户广告数据总览
  15. func UserAdsOverview(c *gin.Context) {
  16. form := request.Check(c, &struct {
  17. Gid string `json:"gid" binding:"required"`
  18. Pf []string `form:"pf" binding:"required"`
  19. }{})
  20. //近七日广告总数
  21. //查询近七日活跃总数
  22. now := time.Now()
  23. sevenDayAgo := now.AddDate(0, 0, -7)
  24. thirtyDayAgo := now.AddDate(0, 0, -30)
  25. var adsCount7 int64
  26. err := global.App.DB.Table("user_see_ads").
  27. Where("gid", form.Gid).
  28. WhereIn("pf", form.Pf).
  29. Where("adsState", 2). //只统计看完的
  30. Where("createdAt", ">=", sevenDayAgo).
  31. Where("createdAt", "<=", now).
  32. Count(&adsCount7).Error
  33. if err != nil {
  34. response.Fail(c, 1001, err.Error())
  35. return
  36. }
  37. //近30天广告总数
  38. var adsCount30 int64
  39. err = global.App.DB.Table("user_see_ads").
  40. Where("gid", form.Gid).
  41. WhereIn("pf", form.Pf).
  42. Where("adsState", 2). //只统计看完的
  43. Where("createdAt", ">=", thirtyDayAgo).
  44. Where("createdAt", "<=", now).
  45. Count(&adsCount30).Error
  46. if err != nil {
  47. response.Fail(c, 1001, err.Error())
  48. return
  49. }
  50. //近七日活跃用户人均看广告数
  51. var activeUserCount7 int64
  52. err = global.App.DB.Table("user_login").
  53. Where("gid", form.Gid).
  54. WhereIn("pf", form.Pf).
  55. Where("loginTime", ">=", sevenDayAgo).
  56. Where("loginTime", "<=", now).
  57. Distinct("userId").
  58. Count(&activeUserCount7).Error
  59. if err != nil {
  60. response.Fail(c, 1001, err.Error())
  61. return
  62. }
  63. //用户人均看广告数
  64. var userTotal int64
  65. err = global.App.DB.Table("user").
  66. Where("gid", form.Gid).
  67. WhereIn("pf", form.Pf).Count(&userTotal).Error
  68. if err != nil {
  69. response.Fail(c, 1001, err.Error())
  70. return
  71. }
  72. var adsTotal int64
  73. err = global.App.DB.Table("user_see_ads").
  74. Where("gid", form.Gid).
  75. Where("adsState", 2). //只统计看完的
  76. WhereIn("pf", form.Pf).Count(&adsTotal).Error
  77. if err != nil {
  78. response.Fail(c, 1001, err.Error())
  79. return
  80. }
  81. var avgUserAds float64
  82. var avgUserAds7 float64
  83. if activeUserCount7 == 0 {
  84. avgUserAds7 = 0
  85. } else {
  86. avgUserAds7 = float64(adsCount7) / float64(activeUserCount7)
  87. }
  88. if userTotal == 0 {
  89. avgUserAds = 0
  90. } else {
  91. avgUserAds = float64(adsTotal) / float64(userTotal)
  92. }
  93. response.Success(c, gin.H{
  94. "data": map[string]interface{}{
  95. "adsCount7": adsCount7,
  96. "adsCount30": adsCount30,
  97. "avgUserAds": math.Round(avgUserAds*100) / 100,
  98. "avgUserAds7": math.Round(avgUserAds7*100) / 100,
  99. },
  100. })
  101. }
  102. // 每日看广告总数
  103. func UserAdsDaily(c *gin.Context) {
  104. form := request.Check(c, &struct {
  105. Gid string `json:"gid" binding:"required"`
  106. Pf []string `form:"pf" binding:""`
  107. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  108. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  109. }{})
  110. dates := utils.GetTimeDayDate(form.StartTime, form.EndTime)
  111. //response.Success(c, gin.H{
  112. // "dates": dates,
  113. //})
  114. //return
  115. form.EndTime = form.EndTime + " 23:59:59"
  116. //近七日广告总数
  117. var userAdsDaily []struct {
  118. Date string `json:"date" gorm:"not null;column:date;"`
  119. Count int64 `json:"count" gorm:"not null;column:count;"`
  120. }
  121. err := global.App.DB.Table("user_see_ads").
  122. Where("gid", form.Gid).
  123. WhereIn("pf", form.Pf).
  124. Where("adsState", 2). //只统计看完的
  125. Where("createdAt", ">=", form.StartTime).
  126. Where("createdAt", "<=", form.EndTime).
  127. Group("date").
  128. Select("count(*) as count", "date").
  129. Scan(&userAdsDaily).Error
  130. if err != nil {
  131. response.Fail(c, 1001, err.Error())
  132. return
  133. }
  134. res := make(map[string]interface{})
  135. for k := range dates {
  136. res[k] = 0
  137. }
  138. for _, v := range userAdsDaily {
  139. date := v.Date[0:4] + "-" + v.Date[4:6] + "-" + v.Date[6:]
  140. res[date] = v.Count
  141. }
  142. var count int64
  143. for _, v := range userAdsDaily {
  144. count = count + v.Count
  145. }
  146. response.Success(c, gin.H{
  147. "data": map[string]interface{}{
  148. "userAdsDaily": res,
  149. "count": count,
  150. "avg": count / int64(len(dates)),
  151. },
  152. })
  153. }
  154. // 广告详细数据()
  155. func UserAdsDetail(c *gin.Context) {
  156. form := request.Check(c, &struct {
  157. Gid string `json:"gid" binding:"required"`
  158. Pf []string `form:"pf" binding:""`
  159. StartTime string `form:"startTime" json:"startTime" binding:""`
  160. EndTime string `form:"endTime" json:"endTime" binding:""`
  161. AdsState []int `json:"adsState" binding:""`
  162. AdsType string `json:"adsType" binding:""`
  163. OpenId string `json:"openId" binding:""`
  164. Offset int `json:"offset" binding:""`
  165. Limit int `json:"limit" binding:""`
  166. Order string `json:"order" binding:""`
  167. }{})
  168. form.EndTime = form.EndTime + " 23:59:59"
  169. query := global.App.DB.Table("user_see_ads").
  170. LeftJoin("user", "user.userId = user_see_ads.userId and user.pf = user_see_ads.pf and user.gid = user_see_ads.gid")
  171. query = query.Where("user_see_ads.gid", form.Gid).WhereIn("user_see_ads.pf", form.Pf)
  172. if form.StartTime != "" && form.EndTime != "" {
  173. query = query.Where("user_see_ads.createdAt", ">=", form.StartTime).Where("user_see_ads.createdAt", "<=", form.EndTime)
  174. }
  175. if len(form.AdsState) > 0 {
  176. query = query.WhereIn("adsState", form.AdsState)
  177. }
  178. if form.OpenId != "" {
  179. query = query.Where("openId", form.OpenId)
  180. }
  181. if form.AdsType != "" {
  182. query = query.Where("adsType", form.AdsType)
  183. }
  184. var count int64
  185. err := query.Count(&count).Error
  186. if err != nil {
  187. response.Fail(c, 1001, err.Error())
  188. return
  189. }
  190. var resData []struct {
  191. model.UserSeeAds
  192. OpenId string `json:"openId" gorm:"not null;column:openId;"`
  193. }
  194. err = query.Select("user_see_ads.*", "user.openId").
  195. Offset(form.Offset).Limit(form.Limit).
  196. Order("user_see_ads.id desc").Scan(&resData).Error
  197. if err != nil {
  198. response.Fail(c, 1001, err.Error())
  199. return
  200. }
  201. response.Success(c, gin.H{
  202. "data": resData,
  203. "count": count,
  204. })
  205. }
  206. // 广告详细数据 --- 饼状图
  207. func UserAdsCake(c *gin.Context) {
  208. form := request.Check(c, &struct {
  209. Gid string `json:"gid" binding:"required"`
  210. Pf []string `form:"pf" binding:""`
  211. StartTime string `form:"startTime" json:"startTime" binding:""`
  212. EndTime string `form:"endTime" json:"endTime" binding:""`
  213. CreateTime string `form:"createTime" json:"createTime" binding:""`
  214. AdsState []int `json:"adsState" binding:""`
  215. AdsType string `json:"adsType" binding:""`
  216. }{})
  217. form.EndTime = form.EndTime + " 23:59:59"
  218. query := global.App.DB.Table("user_see_ads").Where("gid", form.Gid).Group("adsScene")
  219. if len(form.Pf) > 0 {
  220. query = query.WhereIn("pf", form.Pf)
  221. }
  222. if form.CreateTime != "" {
  223. createTime := strings.Split(form.CreateTime, ",")
  224. startTime, _ := strconv.Atoi(createTime[0])
  225. endTime, _ := strconv.Atoi(createTime[1])
  226. t := time.Unix(int64(startTime)/1000, 0)
  227. s := time.Unix(int64(endTime)/1000, 0)
  228. query = query.Where("user_see_ads.createdAt", ">=", t).Where("user_see_ads.createdAt", "<=", s)
  229. }
  230. if form.StartTime != "" && form.EndTime != "" {
  231. query = query.Where("user_see_ads.createdAt", ">=", form.StartTime).Where("user_see_ads.createdAt", "<=", form.EndTime)
  232. }
  233. if len(form.AdsState) > 0 {
  234. query = query.WhereIn("adsState", form.AdsState)
  235. }
  236. if form.AdsType != "" {
  237. query = query.Where("adsType", form.AdsType)
  238. }
  239. var data []struct {
  240. Count int64 `json:"count" gorm:"column:count;"`
  241. Name string `json:"name" gorm:"not null;column:name;"`
  242. SumType1 int `json:"sumType1" gorm:"not null;column:sumType1;"`
  243. SumType2 int `json:"sumType2" gorm:"not null;column:sumType2;"`
  244. SumType0 int `json:"sumType0" gorm:"not null;column:sumType0;"`
  245. }
  246. err := query.Select(
  247. "adsScene as name",
  248. "adsState",
  249. "count(*) as count",
  250. "SUM(adsState = 1) AS sumType1",
  251. "SUM(adsState = 2) AS sumType2",
  252. "SUM(adsState = 0) AS sumType0",
  253. ).Scan(&data).Error
  254. if err != nil {
  255. response.Fail(c, 1001, err.Error())
  256. return
  257. }
  258. response.Success(c, gin.H{
  259. "data": data,
  260. })
  261. }