userBehavior.go 26 KB

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