userBehavior.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. package v1
  2. import (
  3. "context"
  4. "designs/app/common/request"
  5. "designs/app/common/response"
  6. "designs/global"
  7. "designs/service"
  8. "designs/utils"
  9. "encoding/json"
  10. "fmt"
  11. "github.com/gin-gonic/gin"
  12. "go.mongodb.org/mongo-driver/v2/bson"
  13. "go.mongodb.org/mongo-driver/v2/mongo/options"
  14. "math"
  15. "strconv"
  16. "time"
  17. )
  18. // 总览
  19. func Summary(c *gin.Context) {
  20. form := request.Check(c, &struct {
  21. Gid string `form:"gid" json:"gid" binding:"required"`
  22. Pf string `form:"pf" json:"pf" binding:"required"`
  23. }{})
  24. //查询用户总数
  25. var userCount int64
  26. err := global.App.DB.Table("user").
  27. Where("gid", form.Gid).
  28. Where("pf", form.Pf).
  29. Count(&userCount).Error
  30. if err != nil {
  31. response.Fail(c, 1001, err.Error())
  32. return
  33. }
  34. //查询近七日活跃总数
  35. now := time.Now()
  36. sevenDayAgo := now.AddDate(0, 0, -7)
  37. thirtyDayAgo := now.AddDate(0, 0, -30)
  38. var activeUserCount7 int64
  39. err = global.App.DB.Table("user_login").
  40. Where("gid", form.Gid).
  41. Where("pf", form.Pf).
  42. Where("loginTime", ">=", sevenDayAgo).
  43. Where("loginTime", "<=", now).
  44. Distinct("userId").
  45. Count(&activeUserCount7).Error
  46. if err != nil {
  47. response.Fail(c, 1001, err.Error())
  48. return
  49. }
  50. var activeUserCount30 int64
  51. err = global.App.DB.Table("user_login").
  52. Where("gid", form.Gid).
  53. Where("pf", form.Pf).
  54. Where("loginTime", ">=", thirtyDayAgo).
  55. Where("loginTime", "<=", now).
  56. Distinct("userId").
  57. Count(&activeUserCount30).Error
  58. if err != nil {
  59. response.Fail(c, 1001, err.Error())
  60. return
  61. }
  62. //查询 近7日单设备日均使用时长
  63. res, err := service.UserOnlineSummary(form.Gid, form.Pf, "", sevenDayAgo.Format("2006-01-02 15:04:05"), now.Format("2006-01-02 15:04:05"))
  64. if err != nil {
  65. response.Fail(c, 1001, err.Error())
  66. return
  67. }
  68. var avgTime int
  69. for _, v := range res {
  70. avgTime = avgTime + int(v)
  71. }
  72. var avgTimeString string
  73. if avgTime != 0 {
  74. avgTime = int(math.Round(float64(avgTime / len(res))))
  75. avgTimeString = utils.TimeStampToMDS(avgTime)
  76. } else {
  77. avgTimeString = "00.00"
  78. }
  79. response.Success(c, gin.H{
  80. "data": map[string]interface{}{
  81. "userCount": userCount,
  82. "activeUserCount7": activeUserCount7,
  83. "activeUserCount30": activeUserCount30,
  84. "activeUserCount7Time": avgTimeString,
  85. },
  86. })
  87. }
  88. // 时段分布
  89. func TimeDistributionData(c *gin.Context) {
  90. form := request.Check(c, &struct {
  91. Gid string `form:"gid" json:"gid" binding:"required"`
  92. Pf string `form:"pf" json:"pf" binding:"required"`
  93. Type int `form:"type" json:"type" binding:"required"`
  94. }{})
  95. var data interface{}
  96. if form.Type == 1 {
  97. //新增用户
  98. todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, err := service.GetRegisterTimeDistribution(form.Pf, form.Gid)
  99. if err != nil {
  100. response.Fail(c, 1001, err.Error())
  101. return
  102. }
  103. data = map[string]interface{}{
  104. "today": todayTimeDistribution,
  105. "yesterday": yesterdayTimeDistribution,
  106. "yesterdayCount": yesterdayCount,
  107. "yesterdayThisTimeCount": yesterdayThisTimeCount,
  108. "todayCount": todayCount,
  109. }
  110. } else if form.Type == 2 {
  111. //活跃设备
  112. todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, err := service.GetActiveTimeDistribution(form.Pf, form.Gid)
  113. if err != nil {
  114. response.Fail(c, 1001, err.Error())
  115. return
  116. }
  117. data = map[string]interface{}{
  118. "today": todayTimeDistribution,
  119. "yesterday": yesterdayTimeDistribution,
  120. "yesterdayCount": yesterdayCount,
  121. "yesterdayThisTimeCount": yesterdayThisTimeCount,
  122. "todayCount": todayCount,
  123. }
  124. } else if form.Type == 3 {
  125. //启动次数
  126. todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, err := service.GetActionDistribution(form.Pf, form.Gid)
  127. if err != nil {
  128. response.Fail(c, 1001, err.Error())
  129. return
  130. }
  131. data = map[string]interface{}{
  132. "today": todayTimeDistribution,
  133. "yesterday": yesterdayTimeDistribution,
  134. "yesterdayCount": yesterdayCount,
  135. "yesterdayThisTimeCount": yesterdayThisTimeCount,
  136. "todayCount": todayCount,
  137. }
  138. } else {
  139. response.Fail(c, 1003, "type错误")
  140. return
  141. }
  142. response.Success(c, gin.H{
  143. "data": data,
  144. })
  145. }
  146. // 30日趋势
  147. func MouthDistributionData(c *gin.Context) {
  148. form := request.Check(c, &struct {
  149. Gid string `form:"gid" json:"gid" binding:"required"`
  150. Pf string `form:"pf" json:"pf" binding:"required"`
  151. Type int `form:"type" json:"type" binding:"required"`
  152. }{})
  153. now := time.Now()
  154. EndTime := now.AddDate(0, 0, 1).Format("2006-01-02")
  155. StartTime := now.AddDate(0, 0, -29).Format("2006-01-02")
  156. data := make(map[string]interface{})
  157. if form.Type == 1 {
  158. //查询新增设备趋势图
  159. TimeDistribution, count, avg, err := service.GetRegisterDayDistribution(form.Pf, form.Gid, StartTime, EndTime)
  160. if err != nil {
  161. response.Fail(c, 1001, err.Error())
  162. return
  163. }
  164. data["timeDistribution"] = TimeDistribution
  165. data["count"] = count
  166. data["avg"] = avg
  167. } else if form.Type == 2 {
  168. //查询活跃用户趋势图
  169. TimeDistribution, count, avg, err := service.GetActiveDayDistribution(form.Pf, form.Gid, StartTime, EndTime)
  170. if err != nil {
  171. response.Fail(c, 1001, err.Error())
  172. return
  173. }
  174. data["timeDistribution"] = TimeDistribution
  175. data["count"] = count
  176. data["avg"] = avg
  177. } else if form.Type == 3 {
  178. //查询启动次数
  179. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, StartTime, EndTime)
  180. if err != nil {
  181. response.Fail(c, 1001, err.Error())
  182. return
  183. }
  184. data["timeDistribution"] = TimeDistribution
  185. data["count"] = count
  186. data["avg"] = avg
  187. } else if form.Type == 4 {
  188. //查询单用户使用时长
  189. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, StartTime, EndTime)
  190. if err != nil {
  191. response.Fail(c, 1001, err.Error())
  192. return
  193. }
  194. data["timeDistribution"] = TimeDistribution
  195. data["count"] = count
  196. data["avg"] = avg
  197. } else if form.Type == 5 {
  198. //查询用户留存率
  199. //todo
  200. } else {
  201. response.Fail(c, 1003, "type错误")
  202. return
  203. }
  204. response.Success(c, gin.H{
  205. "data": data,
  206. })
  207. }
  208. // 用户趋势 总览
  209. func UserTrendsOverview(c *gin.Context) {
  210. form := request.Check(c, &struct {
  211. Gid string `form:"gid" json:"gid" binding:"required"`
  212. Pf string `form:"pf" json:"pf" binding:"required"`
  213. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  214. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  215. }{})
  216. //查询用户新增
  217. var registerCount int64
  218. err := global.App.DB.Table("user").
  219. Where("gid", form.Gid).
  220. Where("pf", form.Pf).
  221. Where("createdAt", ">=", form.StartTime).
  222. Where("createdAt", "<=", form.EndTime).
  223. Count(&registerCount).Error
  224. if err != nil {
  225. response.Fail(c, 1001, err.Error())
  226. return
  227. }
  228. //查询活跃设备
  229. var activeCount int64
  230. err = global.App.DB.Table("user_online").
  231. Where("gid", form.Gid).
  232. Where("pf", form.Pf).
  233. Where("logTime", ">=", form.StartTime).
  234. Where("logTime", "<=", form.EndTime).
  235. Distinct("userId").Count(&activeCount).Error
  236. if err != nil {
  237. response.Fail(c, 1001, err.Error())
  238. return
  239. }
  240. //查询启动次数
  241. var loginCount int64
  242. err = global.App.DB.Table("user_login").
  243. Where("gid", form.Gid).
  244. Where("pf", form.Pf).
  245. Where("loginTime", ">=", form.StartTime).
  246. Where("loginTime", "<=", form.EndTime).
  247. Count(&loginCount).Error
  248. if err != nil {
  249. response.Fail(c, 1001, err.Error())
  250. return
  251. }
  252. //查询平均启动时长
  253. //查询活跃用户月趋势图
  254. _, _, activeTime, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  255. if err != nil {
  256. response.Fail(c, 1001, err.Error())
  257. return
  258. }
  259. //查询 DAU/MAU
  260. //todo 查询方式需要更新
  261. dauMau := 0.3
  262. response.Success(c, gin.H{
  263. "data": map[string]interface{}{
  264. "registerCount": registerCount,
  265. "activeCount": activeCount,
  266. "loginCount": loginCount,
  267. "activeTime": activeTime,
  268. "dauMau": dauMau,
  269. },
  270. })
  271. }
  272. // 数据趋势
  273. func DataTrades(c *gin.Context) {
  274. form := request.Check(c, &struct {
  275. Gid string `form:"gid" json:"gid" binding:"required"`
  276. Pf string `form:"pf" json:"pf" binding:"required"`
  277. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  278. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  279. Type int `form:"type" json:"type" binding:"required"`
  280. }{})
  281. data := make(map[string]interface{})
  282. form.EndTime = form.EndTime + " 23:59:59"
  283. if form.Type == 1 {
  284. //查询新增设备趋势图
  285. TimeDistribution, count, avg, err := service.GetRegisterDayDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  286. if err != nil {
  287. response.Fail(c, 1001, err.Error())
  288. return
  289. }
  290. data["imeDistribution"] = TimeDistribution
  291. data["count"] = count
  292. data["avg"] = avg
  293. } else if form.Type == 2 {
  294. //查询活跃用户趋势图
  295. TimeDistribution, count, avg, err := service.GetActiveDayDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  296. if err != nil {
  297. response.Fail(c, 1001, err.Error())
  298. return
  299. }
  300. data["imeDistribution"] = TimeDistribution
  301. data["count"] = count
  302. data["avg"] = avg
  303. } else if form.Type == 3 {
  304. //查询活跃用户周趋势图
  305. TimeDistribution, count, avg, err := service.GetActiveWeekDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  306. if err != nil {
  307. response.Fail(c, 1001, err.Error())
  308. return
  309. }
  310. data["imeDistribution"] = TimeDistribution
  311. data["count"] = count
  312. data["avg"] = avg
  313. } else if form.Type == 4 {
  314. //查询活跃用户月趋势图
  315. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  316. if err != nil {
  317. response.Fail(c, 1001, err.Error())
  318. return
  319. }
  320. data["imeDistribution"] = TimeDistribution
  321. data["count"] = count
  322. data["avg"] = avg
  323. } else if form.Type == 5 {
  324. //查询启动次数
  325. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  326. if err != nil {
  327. response.Fail(c, 1001, err.Error())
  328. return
  329. }
  330. data["imeDistribution"] = TimeDistribution
  331. data["count"] = count
  332. data["avg"] = avg
  333. } else if form.Type == 6 {
  334. //查询平均启动时间
  335. TimeDistribution, count, avg, err := service.UserOnlineSummaryByDay(form.Gid, form.Pf, form.StartTime, form.EndTime)
  336. if err != nil {
  337. response.Fail(c, 1001, err.Error())
  338. return
  339. }
  340. data["imeDistribution"] = TimeDistribution
  341. data["count"] = count
  342. data["avg"] = avg
  343. } else {
  344. response.Fail(c, 1003, "type 错误")
  345. return
  346. }
  347. response.Success(c, gin.H{
  348. "data": data,
  349. })
  350. }
  351. // 数据趋势的整合
  352. func DataTradesDetail(c *gin.Context) {
  353. form := request.Check(c, &struct {
  354. Gid string `form:"gid" json:"gid" binding:"required"`
  355. Pf string `form:"pf" json:"pf" binding:"required"`
  356. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  357. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  358. }{})
  359. form.EndTime = form.EndTime + " 23:59:59"
  360. type dayData struct {
  361. NewUser int `json:"newUser"`
  362. ActiveUser int `json:"activeUser"`
  363. ActiveUserWeek int `json:"activeUserWeek"`
  364. ActiveUserMouth int `json:"activeUserMouth"`
  365. ActiveStart int `json:"activeStart"`
  366. AvgTime int `json:"avgTime"`
  367. }
  368. var data = make(map[string]dayData)
  369. //查询新增设备趋势图
  370. NewUser, _, _, err := service.GetRegisterDayDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  371. if err != nil {
  372. response.Fail(c, 1001, err.Error())
  373. return
  374. }
  375. //查询活跃用户趋势图
  376. ActiveUser, _, _, err := service.GetActiveDayDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  377. if err != nil {
  378. response.Fail(c, 1001, err.Error())
  379. return
  380. }
  381. //查询活跃用户周趋势图
  382. ActiveUserWeek, _, _, err := service.GetActiveWeekDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  383. if err != nil {
  384. response.Fail(c, 1001, err.Error())
  385. return
  386. }
  387. //查询活跃用户月趋势图
  388. ActiveUserMouth, _, _, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  389. if err != nil {
  390. response.Fail(c, 1001, err.Error())
  391. return
  392. }
  393. //查询启动次数
  394. ActiveStart, _, _, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  395. if err != nil {
  396. response.Fail(c, 1001, err.Error())
  397. return
  398. }
  399. //查询平均启动时间
  400. AvgTime, _, _, err := service.UserOnlineSummaryByDay(form.Gid, form.Pf, form.StartTime, form.EndTime)
  401. if err != nil {
  402. response.Fail(c, 1001, err.Error())
  403. return
  404. }
  405. for k := range AvgTime {
  406. data[k] = dayData{
  407. NewUser: NewUser[k],
  408. ActiveUser: ActiveUser[k],
  409. ActiveUserWeek: ActiveUserWeek[k],
  410. ActiveUserMouth: ActiveUserMouth[k],
  411. ActiveStart: ActiveStart[k],
  412. AvgTime: AvgTime[k],
  413. }
  414. }
  415. response.Success(c, gin.H{
  416. "data": data,
  417. })
  418. }
  419. func RemainDataBydDay(c *gin.Context) {
  420. form := request.Check(c, &struct {
  421. Gid string `form:"gid" json:"gid" binding:"required"`
  422. Pf string `form:"pf" json:"pf" binding:"required"`
  423. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  424. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  425. Type int `form:"type" json:"type" binding:"required"`
  426. }{})
  427. data, err := service.RemainDataBydDay(form.Type, form.Pf, form.Gid, form.StartTime, form.EndTime)
  428. if err != nil {
  429. response.Fail(c, 1001, err.Error())
  430. return
  431. }
  432. response.Success(c, gin.H{
  433. "data": data,
  434. })
  435. }
  436. type AdData struct {
  437. Pid string `json:"pid"`
  438. Aid string `json:"aid"`
  439. Cid string `json:"cid"`
  440. ReportUrl string `json:"reportUrl"`
  441. Reported bool `json:"reported"`
  442. Duration int64 `json:"duration"`
  443. AdReqCount uint8 `json:"adReqCount"`
  444. AdEposedcount uint8 `json:"adEposedcount"`
  445. CreateTime int `json:"createTime"`
  446. }
  447. type UserBehavior struct {
  448. Id string `bson:"_id,omitempty"`
  449. Gid string `bson:"gid"`
  450. Pf string `bson:"pf"`
  451. OpenId string `bson:"openId"`
  452. AdData interface{} `bson:"adData"`
  453. AdFromCount int `bson:"adFromCount"`
  454. TotalDuration int `bson:"totalDuration"`
  455. TotalAdReqCount int `bson:"totalAdReqCount"`
  456. TotalAdEposedCount int `bson:"totalAdEposedCount"`
  457. }
  458. type BehaviorFilter struct {
  459. Gt int `json:"gt"`
  460. Gte int `json:"gte"`
  461. Lte int `json:"lte"`
  462. Lt int `json:"lt"`
  463. Ne int `json:"ne"`
  464. //$gt 大于
  465. //$gte:大于或等于
  466. //$lt:小于
  467. //$lte:小于或等于
  468. //$ne:不等于
  469. }
  470. func BehaviorList(c *gin.Context) {
  471. form := request.Check(c, &struct {
  472. Gid string `form:"gid" json:"gid" binding:"required"`
  473. Pf string `form:"pf" json:"pf" binding:"required"`
  474. OpenId string `form:"search" json:"search" binding:""`
  475. Offset int `form:"offset" json:"offset" binding:""`
  476. Limit int `form:"limit" json:"limit" binding:""`
  477. Reported string `form:"reported" json:"reported" binding:""` //all true false
  478. Pid string `form:"pid" json:"pid" binding:""`
  479. Aid string `form:"aid" json:"aid" binding:""`
  480. Cid string `form:"cid" json:"cid" binding:""`
  481. Duration interface{} `form:"duration" json:"duration" binding:""`
  482. AdReqCount interface{} `form:"adReqCount" json:"adReqCount" binding:""`
  483. AdEposedcount interface{} `form:"adEposedcount" json:"adEposedcount" binding:""`
  484. AdFromCount interface{} `form:"adFromCount" json:"adFromCount" binding:""`
  485. TotalDuration interface{} `form:"totalDuration" json:"totalDuration" binding:""`
  486. TotalAdReqCount interface{} `form:"totalAdReqCount" json:"totalAdReqCount" binding:""`
  487. TotalAdEposedCount interface{} `form:"totalAdEposedCount" json:"totalAdEposedCount" binding:""`
  488. }{})
  489. collection := global.App.MongoDB.Database("chunhao").Collection("userBehavior")
  490. ctx := context.Background()
  491. filter := bson.M{"gid": form.Gid, "pf": form.Pf}
  492. if form.OpenId != "" {
  493. filter["openId"] = bson.M{"$regex": form.OpenId}
  494. }
  495. if form.Pid != "" {
  496. filter["adData.pid"] = form.Pid
  497. }
  498. if form.Aid != "" {
  499. filter["adData.aid"] = form.Aid
  500. }
  501. if form.Cid != "" {
  502. filter["adData.cid"] = form.Cid
  503. }
  504. if form.AdFromCount != nil {
  505. fmt.Println(form.AdFromCount)
  506. marsh, _ := json.Marshal(form.AdFromCount)
  507. var adFromCount BehaviorFilter
  508. json.Unmarshal(marsh, &adFromCount)
  509. filters := bson.M{}
  510. if adFromCount.Gt != 0 {
  511. filters["$gt"] = adFromCount.Gt
  512. }
  513. if adFromCount.Gte != 0 {
  514. filters["$gte"] = adFromCount.Gte
  515. }
  516. if adFromCount.Lte != 0 {
  517. filters["$lte"] = adFromCount.Lte
  518. }
  519. if adFromCount.Lt != 0 {
  520. filters["$lt"] = adFromCount.Lt
  521. }
  522. if adFromCount.Lt != 0 {
  523. filters["$ne"] = adFromCount.Ne
  524. }
  525. if len(filters) > 0 {
  526. filter["adFromCount"] = filters
  527. }
  528. }
  529. if form.TotalDuration != nil {
  530. marsh, _ := json.Marshal(form.TotalDuration)
  531. var totalDuration BehaviorFilter
  532. json.Unmarshal(marsh, &totalDuration)
  533. filters := bson.M{}
  534. if totalDuration.Gt != 0 {
  535. filters["$gt"] = totalDuration.Gt
  536. }
  537. if totalDuration.Gte != 0 {
  538. filters["$gte"] = totalDuration.Gte
  539. }
  540. if totalDuration.Lte != 0 {
  541. filters["$lte"] = totalDuration.Lte
  542. }
  543. if totalDuration.Lt != 0 {
  544. filters["$lt"] = totalDuration.Lt
  545. }
  546. if totalDuration.Lt != 0 {
  547. filters["$ne"] = totalDuration.Ne
  548. }
  549. if len(filters) > 0 {
  550. filter["TotalDuration"] = filters
  551. }
  552. }
  553. if form.TotalAdReqCount != nil {
  554. marsh, _ := json.Marshal(form.TotalAdReqCount)
  555. var totalAdReqCount BehaviorFilter
  556. json.Unmarshal(marsh, &totalAdReqCount)
  557. filters := bson.M{}
  558. if totalAdReqCount.Gt != 0 {
  559. filters["$gt"] = totalAdReqCount.Gt
  560. }
  561. if totalAdReqCount.Gte != 0 {
  562. filters["$gte"] = totalAdReqCount.Gte
  563. }
  564. if totalAdReqCount.Lte != 0 {
  565. filters["$lte"] = totalAdReqCount.Lte
  566. }
  567. if totalAdReqCount.Lt != 0 {
  568. filters["$lt"] = totalAdReqCount.Lt
  569. }
  570. if totalAdReqCount.Lt != 0 {
  571. filters["$ne"] = totalAdReqCount.Ne
  572. }
  573. if len(filters) > 0 {
  574. filter["totalAdReqCount"] = filters
  575. }
  576. }
  577. if form.TotalAdEposedCount != nil {
  578. marsh, _ := json.Marshal(form.TotalAdEposedCount)
  579. var totalAdEposedCount BehaviorFilter
  580. json.Unmarshal(marsh, &totalAdEposedCount)
  581. filters := bson.M{}
  582. if totalAdEposedCount.Gt != 0 {
  583. filters["$gt"] = totalAdEposedCount.Gt
  584. }
  585. if totalAdEposedCount.Gte != 0 {
  586. filters["$gte"] = totalAdEposedCount.Gte
  587. }
  588. if totalAdEposedCount.Lte != 0 {
  589. filters["$lte"] = totalAdEposedCount.Lte
  590. }
  591. if totalAdEposedCount.Lt != 0 {
  592. filters["$lt"] = totalAdEposedCount.Lt
  593. }
  594. if totalAdEposedCount.Lt != 0 {
  595. filters["$ne"] = totalAdEposedCount.Ne
  596. }
  597. if len(filters) > 0 {
  598. filter["totalAdEposedCount"] = filters
  599. }
  600. }
  601. if form.Duration != nil {
  602. marsh, _ := json.Marshal(form.Duration)
  603. var duration BehaviorFilter
  604. json.Unmarshal(marsh, &duration)
  605. filters := bson.M{}
  606. if duration.Gt != 0 {
  607. filters["$gt"] = duration.Gt
  608. }
  609. if duration.Gte != 0 {
  610. filters["$gte"] = duration.Gte
  611. }
  612. if duration.Lte != 0 {
  613. filters["$lte"] = duration.Lte
  614. }
  615. if duration.Lt != 0 {
  616. filters["$lt"] = duration.Lt
  617. }
  618. if duration.Lt != 0 {
  619. filters["$ne"] = duration.Ne
  620. }
  621. if len(filters) > 0 {
  622. filter["adData.duration"] = filters
  623. }
  624. }
  625. if form.AdReqCount != nil {
  626. marsh, _ := json.Marshal(form.AdReqCount)
  627. var adReqCount BehaviorFilter
  628. json.Unmarshal(marsh, &adReqCount)
  629. filters := bson.M{}
  630. if adReqCount.Gt != 0 {
  631. filters["$gt"] = adReqCount.Gt
  632. }
  633. if adReqCount.Gte != 0 {
  634. filters["$gte"] = adReqCount.Gte
  635. }
  636. if adReqCount.Lte != 0 {
  637. filters["$lte"] = adReqCount.Lte
  638. }
  639. if adReqCount.Lt != 0 {
  640. filters["$lt"] = adReqCount.Lt
  641. }
  642. if adReqCount.Lt != 0 {
  643. filters["$ne"] = adReqCount.Ne
  644. }
  645. if len(filters) > 0 {
  646. filter["adData.adReqCount"] = filters
  647. }
  648. }
  649. if form.AdEposedcount != nil {
  650. marsh, _ := json.Marshal(form.AdEposedcount)
  651. var adEposedcount BehaviorFilter
  652. json.Unmarshal(marsh, &adEposedcount)
  653. filters := bson.M{}
  654. if adEposedcount.Gt != 0 {
  655. filters["$gt"] = adEposedcount.Gt
  656. }
  657. if adEposedcount.Gte != 0 {
  658. filters["$gte"] = adEposedcount.Gte
  659. }
  660. if adEposedcount.Lte != 0 {
  661. filters["$lte"] = adEposedcount.Lte
  662. }
  663. if adEposedcount.Lt != 0 {
  664. filters["$lt"] = adEposedcount.Lt
  665. }
  666. if adEposedcount.Lt != 0 {
  667. filters["$ne"] = adEposedcount.Ne
  668. }
  669. if len(filters) > 0 {
  670. filter["adData.adEposedcount"] = filters
  671. }
  672. }
  673. option := options.Find()
  674. option.SetLimit(int64(form.Limit))
  675. option.SetSkip(int64(form.Offset))
  676. cur, err := collection.Find(ctx, filter, option)
  677. if err != nil {
  678. response.Fail(c, 1001, err.Error())
  679. return
  680. }
  681. count, err := collection.CountDocuments(ctx, filter)
  682. if err != nil {
  683. response.Fail(c, 1001, err.Error())
  684. return
  685. }
  686. var data []UserBehavior
  687. err = cur.All(ctx, &data)
  688. if err != nil {
  689. response.Fail(c, 1001, err.Error())
  690. return
  691. }
  692. response.Success(c, gin.H{
  693. "data": data,
  694. "count": count,
  695. })
  696. }
  697. // ConversionCondition 转化条件
  698. type ConversionCondition struct {
  699. Id string `bson:"_id" json:"id"`
  700. Gid string `bson:"gid" json:"gid"`
  701. Pid int64 `bson:"pid" json:"pid"`
  702. Aid int64 `bson:"aid" json:"aid"`
  703. Type string `bson:"type" json:"type"`
  704. StartNum int `bson:"start_num" json:"start_num"` //启动次数
  705. EstimatedRevenue float32 `bson:"revenue" json:"revenue"` //当日预估收益
  706. Duration int64 `bson:"duration" json:"duration"` //当日在线时长
  707. ReqRewardedAd int `bson:"req_count" json:"req_count"` //当日的激励视频广告请求次数
  708. ExpRewardedAd int `bson:"exp_count" json:"exp_count"` //当日的激励视频广告曝光次数
  709. }
  710. func SetGameCondition(c *gin.Context) {
  711. form := request.Check(c, &struct {
  712. Gid string `form:"gid" json:"gid" binding:"required"`
  713. Pid int64 `form:"pid" json:"pid" binding:""`
  714. Aid int64 `form:"aid" json:"aid" binding:"required"`
  715. Type string `form:"type" json:"type" binding:"required"`
  716. StartNum int `form:"start_num" json:"start_num" binding:""`
  717. EstimatedRevenue float32 `form:"revenue" json:"revenue" binding:""`
  718. Duration int64 `form:"duration" json:"duration" binding:""`
  719. ReqRewardedAd int `form:"req_count" json:"req_count" binding:""`
  720. ExpRewardedAd int `form:"exp_count" json:"exp_count" binding:""`
  721. }{})
  722. id := fmt.Sprintf("%s|%s|%s|%s", form.Gid, strconv.Itoa(int(form.Pid)), strconv.Itoa(int(form.Aid)), form.Type)
  723. collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
  724. filter := bson.M{"_id": id}
  725. var conversionCondition ConversionCondition
  726. err := collection.FindOne(context.TODO(), filter).Decode(&conversionCondition)
  727. //if err != nil {
  728. // response.Fail(c, 1002, err.Error())
  729. // return
  730. //}
  731. if conversionCondition.Id != "" {
  732. //存在,更新
  733. update := bson.M{
  734. "$set": struct {
  735. StartNum int `bson:"start_num"` //启动次数
  736. EstimatedRevenue float32 `bson:"revenue"` //当日预估收益
  737. Duration int64 `bson:"duration"` //当日在线时长
  738. ReqRewardedAd int `bson:"req_count"` //当日的激励视频广告请求次数
  739. ExpRewardedAd int `bson:"exp_count"` //当日的激励视频广告曝光次数
  740. }{
  741. StartNum: form.StartNum,
  742. EstimatedRevenue: form.EstimatedRevenue,
  743. Duration: form.Duration,
  744. ReqRewardedAd: form.ReqRewardedAd,
  745. ExpRewardedAd: form.ExpRewardedAd,
  746. },
  747. }
  748. _, err = collection.UpdateOne(context.TODO(), filter, update)
  749. if err != nil {
  750. response.Fail(c, 1003, err.Error())
  751. return
  752. }
  753. } else {
  754. //不存在,新增
  755. insert := ConversionCondition{
  756. Id: id,
  757. Pid: form.Pid,
  758. Aid: form.Aid,
  759. Gid: form.Gid,
  760. Type: form.Type,
  761. StartNum: form.StartNum,
  762. EstimatedRevenue: form.EstimatedRevenue,
  763. Duration: form.Duration,
  764. ReqRewardedAd: form.ReqRewardedAd,
  765. ExpRewardedAd: form.ExpRewardedAd,
  766. }
  767. _, err = collection.InsertOne(context.TODO(), insert)
  768. if err != nil {
  769. response.Fail(c, 1001, err.Error())
  770. return
  771. }
  772. }
  773. response.Success(c, gin.H{})
  774. }
  775. func GameConditionList(c *gin.Context) {
  776. form := request.Check(c, &struct {
  777. Gid string `form:"gid" json:"gid" binding:"required"`
  778. Pid int64 `form:"pid" json:"pid" binding:""`
  779. Aid int64 `form:"aid" json:"aid" binding:""`
  780. Type string `form:"type" json:"type" binding:""`
  781. Offset int `form:"offset" json:"offset" binding:""`
  782. Limit int `form:"limit" json:"limit" binding:"required"`
  783. }{})
  784. collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
  785. filter := bson.M{"gid": form.Gid, "type": form.Type}
  786. if form.Type != "" {
  787. filter["type"] = form.Type
  788. }
  789. if form.Pid != 0 {
  790. filter["pid"] = form.Pid
  791. }
  792. if form.Aid != 0 {
  793. filter["aid"] = form.Aid
  794. }
  795. ctx := context.Background()
  796. option := options.Find()
  797. option.SetLimit(int64(form.Limit))
  798. option.SetSkip(int64(form.Offset))
  799. cur, err := collection.Find(ctx, filter, option)
  800. if err != nil {
  801. response.Fail(c, 1001, err.Error())
  802. return
  803. }
  804. count, err := collection.CountDocuments(ctx, filter)
  805. if err != nil {
  806. response.Fail(c, 1001, err.Error())
  807. return
  808. }
  809. var data []ConversionCondition
  810. err = cur.All(ctx, &data)
  811. if err != nil {
  812. response.Fail(c, 1001, err.Error())
  813. return
  814. }
  815. response.Success(c, gin.H{
  816. "data": data,
  817. "count": count,
  818. })
  819. }