广告平台(媒体使用)
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

240 рядки
9.2 KiB

  1. package svc
  2. import (
  3. "applet/app/e"
  4. "applet/app/md"
  5. "applet/app/utils"
  6. db "code.fnuoos.com/zhimeng/model.git/src"
  7. "fmt"
  8. "github.com/gin-gonic/gin"
  9. "strings"
  10. "time"
  11. )
  12. func IndexTotal(c *gin.Context) {
  13. //昨天
  14. yesterday := utils.GetTimeRange("yesterday")
  15. yesterdayTotal := commTotal(c, time.Unix(yesterday["start"], 0).Format("2006-01-02"), time.Unix(yesterday["end"]-3600, 0).Format("2006-01-02"))
  16. //前天
  17. beforeYesterDayTotal := commTotal(c, time.Unix(yesterday["start"]-86400, 0).Format("2006-01-02"), time.Unix(yesterday["start"]-3600, 0).Format("2006-01-02"))
  18. //7天
  19. withinSevenDays := utils.GetTimeRange("new_within_seven_days")
  20. withinSevenDaysTotal := commTotal(c, time.Unix(withinSevenDays["start"], 0).Format("2006-01-02"), time.Unix(withinSevenDays["end"]-3600, 0).Format("2006-01-02"))
  21. //7天前的 7天
  22. beforeWithinSevenDaysTotal := commTotal(c, time.Unix(withinSevenDays["start"]-3600-7*86400, 0).Format("2006-01-02"), time.Unix(withinSevenDays["start"]-3600, 0).Format("2006-01-02"))
  23. //本月
  24. currentMonth := utils.GetTimeRange("current_month")
  25. currentMonthTotal := commTotal(c, time.Unix(currentMonth["start"], 0).Format("2006-01-02"), time.Unix(currentMonth["end"]-3600, 0).Format("2006-01-02"))
  26. //上月
  27. lastMonth := utils.GetTimeRange("last_month")
  28. lastMonthTotal := commTotal(c, time.Unix(lastMonth["start"], 0).Format("2006-01-02"), time.Unix(lastMonth["end"]-3600, 0).Format("2006-01-02"))
  29. //上上月
  30. beforeLastMonth := time.Unix(lastMonth["start"]-86400, 0)
  31. beforeLastMonthStr := time.Date(beforeLastMonth.Year(), beforeLastMonth.Month(), 1, 0, 0, 0, 0, beforeLastMonth.Location())
  32. beforeLastMonthTotal := commTotal(c, beforeLastMonthStr.Format("2006-01-02"), time.Unix(lastMonth["start"]-3600, 0).Format("2006-01-02"))
  33. res := []md.IndexAppListDataList{
  34. {Name: "昨日收益", Type: "yesterday", Bili: commBili(c, beforeYesterDayTotal, yesterdayTotal, "media_revenue"), Value: utils.Float64ToStr(utils.StrToFloat64(yesterdayTotal[0]["media_revenue"]) / 100)},
  35. {Name: "七日收益", Type: "within_seven_days", Bili: commBili(c, beforeWithinSevenDaysTotal, withinSevenDaysTotal, "media_revenue"), Value: utils.Float64ToStr(utils.StrToFloat64(withinSevenDaysTotal[0]["media_revenue"]) / 100)},
  36. {Name: "本月收益", Type: "current_month", Bili: commBili(c, lastMonthTotal, currentMonthTotal, "media_revenue"), Value: utils.Float64ToStr(utils.StrToFloat64(currentMonthTotal[0]["media_revenue"]) / 100)},
  37. {Name: "上月收益", Type: "last_month", Bili: commBili(c, beforeLastMonthTotal, lastMonthTotal, "media_revenue"), Value: utils.Float64ToStr(utils.StrToFloat64(lastMonthTotal[0]["media_revenue"]) / 100)},
  38. }
  39. e.OutSuc(c, res, nil)
  40. return
  41. }
  42. func commBili(c *gin.Context, before, after []map[string]string, types string) string {
  43. bili := "-%"
  44. if utils.StrToFloat64(before[0][types]) > 0 {
  45. tmpDiff := utils.StrToFloat64(after[0][types]) - utils.StrToFloat64(before[0][types])
  46. types1 := "+"
  47. if tmpDiff < 0 {
  48. types1 = ""
  49. }
  50. bili = types1 + utils.Float64ToStr(tmpDiff/utils.StrToFloat64(before[0][types])*100) + "%"
  51. }
  52. return bili
  53. }
  54. func IndexAppList(c *gin.Context, req md.IndexAppListReq) md.IndexAppListRes {
  55. appId := make([]string, 0)
  56. data := commTotalByApp(c, req, appId)
  57. for _, v := range data {
  58. appId = append(appId, v["app_id"])
  59. }
  60. start := utils.TimeStdParseUnix(req.StartDate + " 00:00:00")
  61. day := (utils.TimeStdParseUnix(req.EndDate+" 00:00:00") - start) / 86400
  62. req.EndDate = time.Unix(start-1, 0).Format("2006-01-02")
  63. req.StartDate = time.Unix(start-1-day*86400, 0).Format("2006-01-02")
  64. dataLast := commTotalByApp(c, req, appId)
  65. dataLastMap := make(map[string][]map[string]string)
  66. for _, v := range dataLast {
  67. dataLastMap[v["app_id"]] = make([]map[string]string, 0)
  68. dataLastMap[v["app_id"]] = append(dataLastMap[v["app_id"]], v)
  69. }
  70. list := make([]md.IndexAppListData, 0)
  71. for _, v := range data {
  72. _, ok := dataLastMap[v["app_id"]]
  73. if ok == false {
  74. dataLastMap[v["app_id"]] = []map[string]string{
  75. {"media_revenue": "0", "ecpm": "0", "exposure_count": "0", "click_count": "0", "click_rate": "0"},
  76. }
  77. }
  78. tmpList := []map[string]string{
  79. v,
  80. }
  81. dataList := []md.IndexAppListDataList{
  82. {Name: "广告预估收益", Type: "media_revenue", Bili: commBili(c, dataLastMap[v["app_id"]], tmpList, "media_revenue"), Value: utils.Float64ToStr(utils.StrToFloat64(v["media_revenue"]) / 100)},
  83. {Name: "ECPM", Type: "ecpm", Bili: commBili(c, dataLastMap[v["app_id"]], tmpList, "ecpm"), Value: utils.Float64ToStr(utils.StrToFloat64(v["ecpm"]) / 100 / utils.StrToFloat64(v["count"]))},
  84. {Name: "曝光量", Type: "exposure_count", Bili: commBili(c, dataLastMap[v["app_id"]], tmpList, "exposure_count"), Value: v["exposure_count"]},
  85. {Name: "点击量", Type: "click_count", Bili: commBili(c, dataLastMap[v["app_id"]], tmpList, "click_count"), Value: v["click_count"]},
  86. {Name: "点击率", Type: "click_rate", Bili: commBili(c, dataLastMap[v["app_id"]], tmpList, "click_rate"), Value: utils.GetPrec(v["click_rate"], "2") + "%"},
  87. }
  88. applet := GetAppletInfo(c, v["app_id"])
  89. tmp := md.IndexAppListData{
  90. Name: applet["name"],
  91. Logo: applet["logo"],
  92. List: dataList,
  93. TableList: []string{},
  94. }
  95. list = append(list, tmp)
  96. }
  97. res := md.IndexAppListRes{
  98. List: list,
  99. Sort: []md.SelectData{
  100. {Name: "按收益最高", Value: "media_revenue desc"},
  101. {Name: "按ECPM最高", Value: "ecpm desc"},
  102. {Name: "按曝光量最高", Value: "exposure_count desc"},
  103. },
  104. }
  105. return res
  106. }
  107. func commTotal(c *gin.Context, startDate, endDate string) []map[string]string {
  108. sql := `
  109. SELECT
  110. SUM(exposure_count) as exposure_count,
  111. SUM(click_count) as click_count,
  112. SUM(click_rate) as click_rate,
  113. SUM(ecpm) as ecpm,
  114. SUM(media_revenue) as media_revenue
  115. FROM generate_wx_ad_data
  116. where %s
  117. `
  118. user := GetUser(c)
  119. where := "is_generate_report=1 and uuid=" + c.GetString("mid") + " and medium_id=" + utils.IntToStr(user.MediumId)
  120. if startDate != "" {
  121. where += " and date>='" + startDate + "'"
  122. }
  123. if endDate != "" {
  124. where += " and date<='" + endDate + "'"
  125. }
  126. sql = fmt.Sprintf(sql, where)
  127. nativeString, _ := db.QueryNativeString(db.Db, sql)
  128. if len(nativeString) == 0 {
  129. nativeString = []map[string]string{
  130. {
  131. "media_revenue": "0",
  132. },
  133. }
  134. }
  135. return nativeString
  136. }
  137. func commTotalByApp(c *gin.Context, req md.IndexAppListReq, appId []string) []map[string]string {
  138. sql := `
  139. SELECT
  140. COUNT(*) as count,
  141. app_id as app_id,
  142. SUM(exposure_count) as exposure_count,
  143. SUM(click_count) as click_count,
  144. SUM(click_count)/SUM(exposure_count)*100 as click_rate,
  145. SUM(ecpm) as ecpm,
  146. SUM(media_revenue) as media_revenue
  147. FROM generate_wx_ad_data
  148. where %s group by app_id order by %s,id asc limit 10
  149. `
  150. user := GetUser(c)
  151. where := "is_generate_report=1 and uuid=" + c.GetString("mid") + " and medium_id=" + utils.IntToStr(user.MediumId)
  152. if req.StartDate != "" {
  153. where += " and date>='" + req.StartDate + "'"
  154. }
  155. if req.EndDate != "" {
  156. where += " and date<='" + req.EndDate + "'"
  157. }
  158. if len(appId) > 0 {
  159. where += " and app_id in(" + strings.Join(appId, ",") + ")"
  160. }
  161. if req.Sort == "" {
  162. req.Sort = "media_revenue desc"
  163. }
  164. sql = fmt.Sprintf(sql, where, req.Sort)
  165. nativeString, _ := db.QueryNativeString(db.Db, sql)
  166. return nativeString
  167. }
  168. func BeforeSevenPoint(c *gin.Context, req md.IndexAppListTableReq) map[string][]string {
  169. start := utils.TimeStdParseUnix(req.StartDate + " 00:00:00")
  170. day := (utils.TimeStdParseUnix(req.EndDate+" 00:00:00")-start)/86400 + 1
  171. first := start - day*86400*6
  172. dayAll := (utils.TimeStdParseUnix(req.EndDate+" 00:00:00")-first)/86400 + 1
  173. firstTime := time.Unix(first, 0).Format("2006-01-02")
  174. appData := make(map[string][]string)
  175. for _, v := range req.AppId {
  176. appData[v] = make([]string, dayAll/day+1, dayAll/day+1)
  177. }
  178. dateList := make(map[int]string)
  179. j := 1
  180. for i := 0; i < int(dayAll); i++ {
  181. if i >= (j-1)*int(day) && i < j*int(day) {
  182. dateList[j-1] += "," + time.Unix(first+int64(i)*86400, 0).Format("2006-01-02")
  183. continue
  184. }
  185. j++
  186. dateList[j-1] += "," + time.Unix(first+int64(i)*86400, 0).Format("2006-01-02")
  187. }
  188. if len(req.AppId) > 0 {
  189. date := commTotalByDate(c, firstTime, req.EndDate, req.AppId)
  190. for _, v := range date {
  191. for k1, v1 := range dateList {
  192. if strings.Contains(v1, v["date"]) {
  193. appData[v["app_id"]][k1] = utils.Float64ToStr(utils.StrToFloat64(appData[v["app_id"]][k1]) + utils.StrToFloat64(v["media_revenue"])/100)
  194. }
  195. }
  196. }
  197. }
  198. for k, v := range appData {
  199. for k1, v1 := range v {
  200. if v1 == "" {
  201. appData[k][k1] = "0"
  202. }
  203. }
  204. }
  205. return appData
  206. }
  207. func commTotalByDate(c *gin.Context, startDate, endDate string, appId []string) []map[string]string {
  208. sql := `
  209. SELECT
  210. app_id as app_id,
  211. date as date,
  212. SUM(exposure_count) as exposure_count,
  213. SUM(click_count) as click_count,
  214. SUM(click_count)/SUM(exposure_count)*100 as click_rate,
  215. SUM(ecpm) as ecpm,
  216. SUM(media_revenue) as media_revenue
  217. FROM generate_wx_ad_data
  218. where %s group by date,app_id
  219. `
  220. where := "uuid=" + c.GetString("mid")
  221. if startDate != "" {
  222. where += " and date>='" + startDate + "'"
  223. }
  224. if endDate != "" {
  225. where += " and date<='" + endDate + "'"
  226. }
  227. if len(appId) > 0 {
  228. where += " and app_id in('" + strings.Join(appId, ",") + "')"
  229. }
  230. sql = fmt.Sprintf(sql, where)
  231. nativeString, err := db.QueryNativeString(db.Db, sql)
  232. fmt.Println(err)
  233. return nativeString
  234. }