userBehavior.go 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440
  1. package v1
  2. import (
  3. "bufio"
  4. "context"
  5. "designs/app/common/request"
  6. "designs/app/common/response"
  7. "designs/config"
  8. "designs/global"
  9. "designs/model"
  10. "designs/service"
  11. "designs/utils"
  12. "encoding/json"
  13. "fmt"
  14. "github.com/gin-gonic/gin"
  15. "go.mongodb.org/mongo-driver/v2/bson"
  16. "go.mongodb.org/mongo-driver/v2/mongo/options"
  17. "math"
  18. "math/big"
  19. "os"
  20. "path/filepath"
  21. "strconv"
  22. "strings"
  23. "time"
  24. )
  25. // 总览
  26. func Summary(c *gin.Context) {
  27. form := request.Check(c, &struct {
  28. Gid string `form:"gid" json:"gid" binding:"required"`
  29. Pf string `form:"pf" json:"pf" binding:"required"`
  30. }{})
  31. start := time.Now()
  32. //查询用户总数
  33. var userCount int64
  34. err := global.App.DB.Table("user").
  35. Where("gid", form.Gid).
  36. Where("pf", form.Pf).
  37. Count(&userCount).Error
  38. if err != nil {
  39. response.Fail(c, 1001, err.Error())
  40. return
  41. }
  42. fmt.Println(time.Since(start))
  43. //查询近七日活跃总数
  44. now := time.Now()
  45. sevenDayAgo := now.AddDate(0, 0, -7)
  46. thirtyDayAgo := now.AddDate(0, 0, -30)
  47. var activeUserCount7 int64
  48. err = global.App.DB.Table("user_login").
  49. Where("gid", form.Gid).
  50. Where("pf", form.Pf).
  51. Where("loginTime", ">=", sevenDayAgo).
  52. Where("loginTime", "<=", now).
  53. Distinct("userId").
  54. Count(&activeUserCount7).Error
  55. if err != nil {
  56. response.Fail(c, 1001, err.Error())
  57. return
  58. }
  59. fmt.Println(time.Since(start))
  60. var activeUserCount30 int64
  61. err = global.App.DB.Table("user_login").
  62. Where("gid", form.Gid).
  63. Where("pf", form.Pf).
  64. Where("loginTime", ">=", thirtyDayAgo).
  65. Where("loginTime", "<=", now).
  66. Distinct("userId").
  67. Count(&activeUserCount30).Error
  68. if err != nil {
  69. response.Fail(c, 1001, err.Error())
  70. return
  71. }
  72. fmt.Println(time.Since(start))
  73. //从redis中读取缓存
  74. var avgTimeString string
  75. avgTimeKey := fmt.Sprintf("%s|%s|avgTime", form.Gid, form.Pf)
  76. avgTimeString, _ = global.App.Redis.Get(context.Background(), avgTimeKey).Result()
  77. if avgTimeString == "" {
  78. //查询 近7日单设备日均使用时长
  79. res, err := service.UserOnlineSummary(form.Gid, form.Pf, "", sevenDayAgo.Format("2006-01-02 15:04:05"), now.Format("2006-01-02 15:04:05"))
  80. if err != nil {
  81. response.Fail(c, 1001, err.Error())
  82. return
  83. }
  84. var avgTime int
  85. for _, v := range res {
  86. avgTime = avgTime + int(v)
  87. }
  88. if avgTime != 0 {
  89. avgTime = int(math.Round(float64(avgTime / len(res))))
  90. avgTimeString = utils.TimeStampToMDS(avgTime)
  91. } else {
  92. avgTimeString = "00.00"
  93. }
  94. global.App.Redis.Set(context.Background(), avgTimeKey, avgTimeString, time.Second*3000)
  95. }
  96. response.Success(c, gin.H{
  97. "data": map[string]interface{}{
  98. "userCount": userCount,
  99. "activeUserCount7": activeUserCount7,
  100. "activeUserCount30": activeUserCount30,
  101. "activeUserCount7Time": avgTimeString,
  102. },
  103. })
  104. }
  105. // 时段分布
  106. func TimeDistributionData(c *gin.Context) {
  107. form := request.Check(c, &struct {
  108. Gid string `form:"gid" json:"gid" binding:"required"`
  109. Pf string `form:"pf" json:"pf" binding:"required"`
  110. Type int `form:"type" json:"type" binding:"required"`
  111. }{})
  112. var data interface{}
  113. if form.Type == 1 {
  114. //新增用户
  115. todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, err := service.GetRegisterTimeDistribution(form.Pf, form.Gid)
  116. if err != nil {
  117. response.Fail(c, 1001, err.Error())
  118. return
  119. }
  120. data = map[string]interface{}{
  121. "today": todayTimeDistribution,
  122. "yesterday": yesterdayTimeDistribution,
  123. "yesterdayCount": yesterdayCount,
  124. "yesterdayThisTimeCount": yesterdayThisTimeCount,
  125. "todayCount": todayCount,
  126. }
  127. } else if form.Type == 2 {
  128. //活跃设备
  129. todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, err := service.GetActiveTimeDistribution(form.Pf, form.Gid)
  130. if err != nil {
  131. response.Fail(c, 1001, err.Error())
  132. return
  133. }
  134. data = map[string]interface{}{
  135. "today": todayTimeDistribution,
  136. "yesterday": yesterdayTimeDistribution,
  137. "yesterdayCount": yesterdayCount,
  138. "yesterdayThisTimeCount": yesterdayThisTimeCount,
  139. "todayCount": todayCount,
  140. }
  141. } else if form.Type == 3 {
  142. //启动次数
  143. todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, err := service.GetActionDistribution(form.Pf, form.Gid)
  144. if err != nil {
  145. response.Fail(c, 1001, err.Error())
  146. return
  147. }
  148. data = map[string]interface{}{
  149. "today": todayTimeDistribution,
  150. "yesterday": yesterdayTimeDistribution,
  151. "yesterdayCount": yesterdayCount,
  152. "yesterdayThisTimeCount": yesterdayThisTimeCount,
  153. "todayCount": todayCount,
  154. }
  155. } else {
  156. response.Fail(c, 1003, "type错误")
  157. return
  158. }
  159. response.Success(c, gin.H{
  160. "data": data,
  161. })
  162. }
  163. // 30日趋势
  164. func MouthDistributionData(c *gin.Context) {
  165. form := request.Check(c, &struct {
  166. Gid string `form:"gid" json:"gid" binding:"required"`
  167. Pf string `form:"pf" json:"pf" binding:"required"`
  168. Type int `form:"type" json:"type" binding:"required"`
  169. }{})
  170. now := time.Now()
  171. EndTime := now.AddDate(0, 0, 1).Format("2006-01-02")
  172. StartTime := now.AddDate(0, 0, -29).Format("2006-01-02")
  173. data := make(map[string]interface{})
  174. if form.Type == 1 {
  175. //查询新增设备趋势图
  176. TimeDistribution, count, avg, err := service.GetRegisterDayDistribution(form.Pf, form.Gid, StartTime, EndTime)
  177. if err != nil {
  178. response.Fail(c, 1001, err.Error())
  179. return
  180. }
  181. data["timeDistribution"] = TimeDistribution
  182. data["count"] = count
  183. data["avg"] = avg
  184. } else if form.Type == 2 {
  185. //查询活跃用户趋势图
  186. TimeDistribution, count, avg, err := service.GetActiveDayDistribution(form.Pf, form.Gid, StartTime, EndTime)
  187. if err != nil {
  188. response.Fail(c, 1001, err.Error())
  189. return
  190. }
  191. data["timeDistribution"] = TimeDistribution
  192. data["count"] = count
  193. data["avg"] = avg
  194. } else if form.Type == 3 {
  195. //查询启动次数
  196. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, StartTime, EndTime)
  197. if err != nil {
  198. response.Fail(c, 1001, err.Error())
  199. return
  200. }
  201. data["timeDistribution"] = TimeDistribution
  202. data["count"] = count
  203. data["avg"] = avg
  204. } else if form.Type == 4 {
  205. //查询单用户使用时长
  206. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, StartTime, EndTime)
  207. if err != nil {
  208. response.Fail(c, 1001, err.Error())
  209. return
  210. }
  211. data["timeDistribution"] = TimeDistribution
  212. data["count"] = count
  213. data["avg"] = avg
  214. } else if form.Type == 5 {
  215. //查询用户留存率
  216. //todo
  217. } else {
  218. response.Fail(c, 1003, "type错误")
  219. return
  220. }
  221. response.Success(c, gin.H{
  222. "data": data,
  223. })
  224. }
  225. // 用户趋势 总览
  226. func UserTrendsOverview(c *gin.Context) {
  227. form := request.Check(c, &struct {
  228. Gid string `form:"gid" json:"gid" binding:"required"`
  229. Pf string `form:"pf" json:"pf" binding:"required"`
  230. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  231. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  232. }{})
  233. start := time.Now()
  234. //查询用户新增
  235. var registerCount int64
  236. err := global.App.DB.Table("user").
  237. Where("gid", form.Gid).
  238. Where("pf", form.Pf).
  239. Where("createdAt", ">=", form.StartTime).
  240. Where("createdAt", "<=", form.EndTime).
  241. Count(&registerCount).Error
  242. if err != nil {
  243. response.Fail(c, 1001, err.Error())
  244. return
  245. }
  246. fmt.Println(time.Since(start))
  247. //查询活跃设备
  248. var activeCount int64
  249. //sql := "SELECT COUNT(DISTINCT(`userId`)) FROM `user_online` USE INDEX(date) WHERE gid = ? AND pf = ? AND date >= ? AND date <= ?"
  250. //err = global.App.DB.Raw(sql, form.Gid, form.Pf, strings.Replace(form.StartTime, "-", "", 5), strings.Replace(form.EndTime, "-", "", 5)).Count(&activeCount).Error
  251. UserLoginBydDay := utils.GetTimeDayDate(form.StartTime, form.EndTime) //用户分别是在哪天注册的
  252. var activeLog [][]int
  253. //逐天读取每天活跃的用户数据
  254. for k := range UserLoginBydDay {
  255. activeLog = append(activeLog, service.GetLocalActiveLog(form.Gid, form.Pf, k))
  256. }
  257. activeLogCount := utils.UnionOfSubArrays(activeLog)
  258. activeCount = int64(len(activeLogCount))
  259. //查询启动次数
  260. var loginCount int64
  261. err = global.App.DB.Table("user_login").
  262. Where("gid", form.Gid).
  263. Where("pf", form.Pf).
  264. Where("loginTime", ">=", form.StartTime).
  265. Where("loginTime", "<=", form.EndTime).
  266. Count(&loginCount).Error
  267. if err != nil {
  268. response.Fail(c, 1001, err.Error())
  269. return
  270. }
  271. fmt.Println(time.Since(start))
  272. //查询平均启动时长
  273. //查询活跃用户月趋势图
  274. _, _, activeTime, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  275. if err != nil {
  276. response.Fail(c, 1001, err.Error())
  277. return
  278. }
  279. //查询 DAU/MAU
  280. //todo 查询方式需要更新
  281. dauMau := 0.3
  282. response.Success(c, gin.H{
  283. "data": map[string]interface{}{
  284. "registerCount": registerCount,
  285. "activeCount": activeCount,
  286. "loginCount": loginCount,
  287. "activeTime": activeTime,
  288. "dauMau": dauMau,
  289. },
  290. })
  291. }
  292. // 数据趋势
  293. func DataTrades(c *gin.Context) {
  294. form := request.Check(c, &struct {
  295. Gid string `form:"gid" json:"gid" binding:"required"`
  296. Pf string `form:"pf" json:"pf" binding:"required"`
  297. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  298. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  299. Type int `form:"type" json:"type" binding:"required"`
  300. }{})
  301. data := make(map[string]interface{})
  302. form.EndTime = form.EndTime + " 23:59:59"
  303. if form.Type == 1 {
  304. //查询新增设备趋势图
  305. TimeDistribution, count, avg, err := service.GetRegisterDayDistribution(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 == 2 {
  314. //查询活跃用户趋势图
  315. TimeDistribution, count, avg, err := service.GetActiveDayDistribution(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 == 3 {
  324. //查询活跃用户周趋势图
  325. TimeDistribution, count, avg, err := service.GetActiveWeekDistribution(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 == 4 {
  334. //查询活跃用户月趋势图
  335. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, 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 if form.Type == 5 {
  344. //查询启动次数
  345. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  346. if err != nil {
  347. response.Fail(c, 1001, err.Error())
  348. return
  349. }
  350. data["imeDistribution"] = TimeDistribution
  351. data["count"] = count
  352. data["avg"] = avg
  353. } else if form.Type == 6 {
  354. //查询平均启动时间
  355. TimeDistribution, count, avg, err := service.UserOnlineSummaryByDay(form.Gid, form.Pf, form.StartTime, form.EndTime)
  356. if err != nil {
  357. response.Fail(c, 1001, err.Error())
  358. return
  359. }
  360. data["imeDistribution"] = TimeDistribution
  361. data["count"] = count
  362. data["avg"] = avg
  363. } else {
  364. response.Fail(c, 1003, "type 错误")
  365. return
  366. }
  367. response.Success(c, gin.H{
  368. "data": data,
  369. })
  370. }
  371. // 数据趋势的整合
  372. func DataTradesDetail(c *gin.Context) {
  373. form := request.Check(c, &struct {
  374. Gid string `form:"gid" json:"gid" binding:"required"`
  375. Pf string `form:"pf" json:"pf" binding:"required"`
  376. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  377. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  378. }{})
  379. form.EndTime = form.EndTime + " 23:59:59"
  380. type dayData struct {
  381. NewUser int `json:"newUser"`
  382. ActiveUser int `json:"activeUser"`
  383. ActiveUserWeek int `json:"activeUserWeek"`
  384. ActiveUserMouth int `json:"activeUserMouth"`
  385. ActiveStart int `json:"activeStart"`
  386. AvgTime int `json:"avgTime"`
  387. }
  388. var data = make(map[string]dayData)
  389. start := time.Now()
  390. //查询新增设备趋势图
  391. NewUser, _, _, err := service.GetRegisterDayDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  392. if err != nil {
  393. response.Fail(c, 1001, err.Error())
  394. return
  395. }
  396. fmt.Println(time.Since(start))
  397. //查询活跃用户趋势图
  398. ActiveUser, _, _, err := service.GetActiveDayDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  399. if err != nil {
  400. response.Fail(c, 1001, err.Error())
  401. return
  402. }
  403. fmt.Println(time.Since(start))
  404. //查询活跃用户周趋势图
  405. ActiveUserWeek, _, _, err := service.GetActiveWeekDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  406. if err != nil {
  407. response.Fail(c, 1001, err.Error())
  408. return
  409. }
  410. fmt.Println(time.Since(start))
  411. //查询活跃用户月趋势图
  412. ActiveUserMouth, _, _, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  413. if err != nil {
  414. response.Fail(c, 1001, err.Error())
  415. return
  416. }
  417. fmt.Println(time.Since(start))
  418. //查询启动次数
  419. ActiveStart, _, _, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  420. if err != nil {
  421. response.Fail(c, 1001, err.Error())
  422. return
  423. }
  424. fmt.Println(time.Since(start))
  425. //查询平均启动时间
  426. AvgTime, _, _, err := service.UserOnlineSummaryByDay(form.Gid, form.Pf, form.StartTime, form.EndTime)
  427. if err != nil {
  428. response.Fail(c, 1001, err.Error())
  429. return
  430. }
  431. for k := range AvgTime {
  432. data[k] = dayData{
  433. NewUser: NewUser[k],
  434. ActiveUser: ActiveUser[k],
  435. ActiveUserWeek: ActiveUserWeek[k],
  436. ActiveUserMouth: ActiveUserMouth[k],
  437. ActiveStart: ActiveStart[k],
  438. AvgTime: AvgTime[k],
  439. }
  440. }
  441. response.Success(c, gin.H{
  442. "data": data,
  443. })
  444. }
  445. func OnlineToFile(c *gin.Context) {
  446. service.OnlineToFile()
  447. //now := time.Now()
  448. //for i := 1; i <= 60; i++ {
  449. // lastDay := now.AddDate(0, 0, -i).Format("20060102")
  450. // crons.AdsDataSummary(lastDay)
  451. //}
  452. response.Success(c, gin.H{})
  453. }
  454. func RemainDataBydDay(c *gin.Context) {
  455. form := request.Check(c, &struct {
  456. Gid string `form:"gid" json:"gid" binding:"required"`
  457. Pf string `form:"pf" json:"pf" binding:"required"`
  458. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  459. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  460. Type int `form:"type" json:"type" binding:"required"`
  461. }{})
  462. //data, err := service.RemainDataBydDay(form.Type, form.Pf, form.Gid, form.StartTime, form.EndTime)
  463. //if err != nil {
  464. // response.Fail(c, 1001, err.Error())
  465. // return
  466. //}
  467. data, err := service.RemainDataBydDayNew(form.Type, form.Pf, form.Gid, form.StartTime, form.EndTime)
  468. if err != nil {
  469. response.Fail(c, 1001, err.Error())
  470. return
  471. }
  472. response.Success(c, gin.H{
  473. "data": data,
  474. })
  475. }
  476. type AdData struct {
  477. Pid string `json:"pid"`
  478. Aid string `json:"aid"`
  479. Cid string `json:"cid"`
  480. ReportUrl string `json:"reportUrl"`
  481. Reported bool `json:"reported"`
  482. Duration int64 `json:"duration"`
  483. AdReqCount uint8 `json:"adReqCount"`
  484. AdEposedcount uint8 `json:"adEposedcount"`
  485. CreateTime int `json:"createTime"`
  486. }
  487. type UserBehavior struct {
  488. Id string `bson:"_id,omitempty"`
  489. Gid string `bson:"gid" json:"gid"`
  490. Pf string `bson:"pf" json:"pf"`
  491. OpenId string `bson:"openId" json:"openId"`
  492. RelatedAid int64 `bson:"relatedAid" json:"relatedAid"` //目前关联的aid
  493. TotalDuration int `bson:"totalDuration" json:"totalDuration"`
  494. TotalAdReqCount int `bson:"totalAdReqCount" json:"totalAdReqCount"`
  495. TotalAdEposedCount int `bson:"totalAdEposedCount" json:"totalAdEposedCount"`
  496. CreateDate string `bson:"createDate" json:"createDate"`
  497. CreateTime int `json:"createTime" bson:"createTime"`
  498. StartNum int `bson:"startNum" json:"startNum"`
  499. ActiveStatus bool `bson:"activeStatus" json:"activeStatus"` //激活状态
  500. ConversionStatus bool `bson:"conversionStatus" json:"conversionStatus"` //转化状态
  501. RemainData map[string]string `json:"remainData" bson:"remainData"` //留存数据
  502. }
  503. type AdRelated struct {
  504. Id string `bson:"_id" json:"_id"`
  505. UserId string `bson:"userId" json:"userId"`
  506. Aid int64 `json:"aid" bson:"aid"` //广告的推广计划id,即广告ID,广告平台配置落地页参数
  507. Cid string `json:"cid" bson:"cid"` //openid的用户点击aid广告进入游戏时的唯一标识,广告平台提供
  508. Pid int64 `json:"pid" bson:"pid"` //广告的项目id(仅巨量引擎存在,腾讯广告时不存在该值),广告平台配置落地页参数
  509. CreateTime int64 `bson:"create_time" json:"createTime"` //当前计划的创建时间
  510. StartNum int `bson:"startNum" json:"startNum"` //启动次数
  511. Revenue float32 `bson:"revenue" json:"revenue"` //当日预估收益
  512. Duration int64 `bson:"duration" json:"duration"` //当日在线时长
  513. ReqCount int `bson:"req_count" json:"req_count"` //当日的激励视频广告请求次数
  514. ExpCount int `bson:"exp_count" json:"exp_count"` //当日的激励视频广告曝光次数
  515. }
  516. type BehaviorFilter struct {
  517. Gt int `json:"gt"`
  518. Gte int `json:"gte"`
  519. Lte int `json:"lte"`
  520. Lt int `json:"lt"`
  521. Ne int `json:"ne"`
  522. //$gt 大于
  523. //$gte:大于或等于
  524. //$lt:小于
  525. //$lte:小于或等于
  526. //$ne:不等于
  527. }
  528. func BehaviorList(c *gin.Context) {
  529. form := request.Check(c, &struct {
  530. Gid string `form:"gid" json:"gid" binding:"required"`
  531. Pf string `form:"pf" json:"pf" binding:"required"`
  532. OpenId string `form:"openId" json:"openId" binding:""`
  533. Offset int `form:"offset" json:"offset" binding:""`
  534. Limit int `form:"limit" json:"limit" binding:""`
  535. ActiveStatus string `form:"activeStatus" json:"activeStatus" binding:""` //all true false
  536. ConversionStatus string `form:"conversionStatus" json:"conversionStatus" binding:""` //all true false
  537. AdFromCount interface{} `form:"adFromCount" json:"adFromCount" binding:""`
  538. TotalDuration interface{} `form:"totalDuration" json:"totalDuration" binding:""`
  539. TotalAdReqCount interface{} `form:"totalAdReqCount" json:"totalAdReqCount" binding:""`
  540. TotalAdEposedCount interface{} `form:"totalAdEposedCount" json:"totalAdEposedCount" binding:""`
  541. CreateTime interface{} `form:"createTime" json:"createTime" binding:""`
  542. StartNum interface{} `form:"startNum" json:"startNum" binding:""`
  543. }{})
  544. collection := global.App.MongoDB.Database("chunhao").Collection("userBehavior")
  545. ctx := context.Background()
  546. filter := bson.M{"gid": form.Gid}
  547. if form.Pf != "" {
  548. filter["pf"] = form.Pf
  549. }
  550. if form.OpenId != "" {
  551. filter["openId"] = bson.M{"$regex": form.OpenId}
  552. }
  553. if form.ActiveStatus == "true" {
  554. filter["activeStatus"] = true
  555. } else if form.ActiveStatus == "false" {
  556. filter["activeStatus"] = false
  557. }
  558. if form.ActiveStatus == "true" {
  559. filter["activeStatus"] = true
  560. } else if form.ActiveStatus == "false" {
  561. filter["activeStatus"] = false
  562. }
  563. if form.AdFromCount != nil {
  564. fmt.Println(form.AdFromCount)
  565. marsh, _ := json.Marshal(form.AdFromCount)
  566. var adFromCount BehaviorFilter
  567. json.Unmarshal(marsh, &adFromCount)
  568. filters := bson.M{}
  569. if adFromCount.Gt != 0 {
  570. filters["$gt"] = adFromCount.Gt
  571. }
  572. if adFromCount.Gte != 0 {
  573. filters["$gte"] = adFromCount.Gte
  574. }
  575. if adFromCount.Lte != 0 {
  576. filters["$lte"] = adFromCount.Lte
  577. }
  578. if adFromCount.Lt != 0 {
  579. filters["$lt"] = adFromCount.Lt
  580. }
  581. if adFromCount.Ne != 0 {
  582. filters["$ne"] = adFromCount.Ne
  583. }
  584. if len(filters) > 0 {
  585. filter["adFromCount"] = filters
  586. }
  587. }
  588. if form.TotalAdReqCount != nil {
  589. marsh, _ := json.Marshal(form.TotalAdReqCount)
  590. var totalAdReqCount BehaviorFilter
  591. json.Unmarshal(marsh, &totalAdReqCount)
  592. filters := bson.M{}
  593. if totalAdReqCount.Gt != 0 {
  594. filters["$gt"] = totalAdReqCount.Gt
  595. }
  596. if totalAdReqCount.Gte != 0 {
  597. filters["$gte"] = totalAdReqCount.Gte
  598. }
  599. if totalAdReqCount.Lte != 0 {
  600. filters["$lte"] = totalAdReqCount.Lte
  601. }
  602. if totalAdReqCount.Lt != 0 {
  603. filters["$lt"] = totalAdReqCount.Lt
  604. }
  605. if totalAdReqCount.Ne != 0 {
  606. filters["$ne"] = totalAdReqCount.Ne
  607. }
  608. if len(filters) > 0 {
  609. filter["totalAdReqCount"] = filters
  610. }
  611. }
  612. if form.TotalAdEposedCount != nil {
  613. marsh, _ := json.Marshal(form.TotalAdEposedCount)
  614. var totalAdEposedCount BehaviorFilter
  615. json.Unmarshal(marsh, &totalAdEposedCount)
  616. filters := bson.M{}
  617. if totalAdEposedCount.Gt != 0 {
  618. filters["$gt"] = totalAdEposedCount.Gt
  619. }
  620. if totalAdEposedCount.Gte != 0 {
  621. filters["$gte"] = totalAdEposedCount.Gte
  622. }
  623. if totalAdEposedCount.Lte != 0 {
  624. filters["$lte"] = totalAdEposedCount.Lte
  625. }
  626. if totalAdEposedCount.Lt != 0 {
  627. filters["$lt"] = totalAdEposedCount.Lt
  628. }
  629. if totalAdEposedCount.Ne != 0 {
  630. filters["$ne"] = totalAdEposedCount.Ne
  631. }
  632. if len(filters) > 0 {
  633. filter["totalAdEposedCount"] = filters
  634. }
  635. }
  636. if form.CreateTime != nil {
  637. marsh, _ := json.Marshal(form.CreateTime)
  638. var totalAdEposedCount BehaviorFilter
  639. json.Unmarshal(marsh, &totalAdEposedCount)
  640. filters := bson.M{}
  641. if totalAdEposedCount.Gt != 0 {
  642. filters["$gt"] = totalAdEposedCount.Gt
  643. }
  644. if totalAdEposedCount.Gte != 0 {
  645. filters["$gte"] = totalAdEposedCount.Gte
  646. }
  647. if totalAdEposedCount.Lte != 0 {
  648. filters["$lte"] = totalAdEposedCount.Lte
  649. }
  650. if totalAdEposedCount.Lt != 0 {
  651. filters["$lt"] = totalAdEposedCount.Lt
  652. }
  653. if totalAdEposedCount.Ne != 0 {
  654. filters["$ne"] = totalAdEposedCount.Ne
  655. }
  656. if len(filters) > 0 {
  657. filter["createTime"] = filters
  658. }
  659. }
  660. if form.StartNum != nil {
  661. marsh, _ := json.Marshal(form.StartNum)
  662. var totalAdEposedCount BehaviorFilter
  663. json.Unmarshal(marsh, &totalAdEposedCount)
  664. filters := bson.M{}
  665. if totalAdEposedCount.Gt != 0 {
  666. filters["$gt"] = totalAdEposedCount.Gt
  667. }
  668. if totalAdEposedCount.Gte != 0 {
  669. filters["$gte"] = totalAdEposedCount.Gte
  670. }
  671. if totalAdEposedCount.Lte != 0 {
  672. filters["$lte"] = totalAdEposedCount.Lte
  673. }
  674. if totalAdEposedCount.Lt != 0 {
  675. filters["$lt"] = totalAdEposedCount.Lt
  676. }
  677. if totalAdEposedCount.Ne != 0 {
  678. filters["$ne"] = totalAdEposedCount.Ne
  679. }
  680. if len(filters) > 0 {
  681. filter["startNum"] = filters
  682. }
  683. }
  684. if form.TotalDuration != nil {
  685. marsh, _ := json.Marshal(form.TotalDuration)
  686. var totalAdEposedCount BehaviorFilter
  687. json.Unmarshal(marsh, &totalAdEposedCount)
  688. filters := bson.M{}
  689. if totalAdEposedCount.Gt != 0 {
  690. filters["$gt"] = totalAdEposedCount.Gt
  691. }
  692. if totalAdEposedCount.Gte != 0 {
  693. filters["$gte"] = totalAdEposedCount.Gte
  694. }
  695. if totalAdEposedCount.Lte != 0 {
  696. filters["$lte"] = totalAdEposedCount.Lte
  697. }
  698. if totalAdEposedCount.Lt != 0 {
  699. filters["$lt"] = totalAdEposedCount.Lt
  700. }
  701. if totalAdEposedCount.Ne != 0 {
  702. filters["$ne"] = totalAdEposedCount.Ne
  703. }
  704. if len(filters) > 0 {
  705. filter["totalDuration"] = filters
  706. }
  707. }
  708. option := options.Find()
  709. option.SetLimit(int64(form.Limit))
  710. option.SetSkip(int64(form.Offset))
  711. cur, err := collection.Find(ctx, filter, option)
  712. if err != nil {
  713. response.Fail(c, 1001, err.Error())
  714. return
  715. }
  716. count, err := collection.CountDocuments(ctx, filter)
  717. if err != nil {
  718. response.Fail(c, 1001, err.Error())
  719. return
  720. }
  721. var data []UserBehavior
  722. err = cur.All(ctx, &data)
  723. if err != nil {
  724. response.Fail(c, 1001, err.Error())
  725. return
  726. }
  727. response.Success(c, gin.H{
  728. "data": data,
  729. "count": count,
  730. })
  731. }
  732. func AdRelatedList(c *gin.Context) {
  733. form := request.Check(c, &struct {
  734. Gid string `form:"gid" json:"gid" binding:"required"`
  735. Pf string `form:"pf" json:"pf" binding:"required"`
  736. OpenId string `form:"search" json:"search" binding:""`
  737. Offset int `form:"offset" json:"offset" binding:""`
  738. Limit int `form:"limit" json:"limit" binding:""`
  739. Pid string `form:"pid" json:"pid" binding:""`
  740. Aid string `form:"aid" json:"aid" binding:""`
  741. Cid string `form:"cid" json:"cid" binding:""`
  742. CreateTime interface{} `form:"createTime" json:"createTime" binding:""`
  743. StartNum interface{} `form:"startNum" json:"startNum" binding:""`
  744. Duration interface{} `form:"duration" json:"duration" binding:""`
  745. ReqCount interface{} `form:"reqCount" json:"reqCount" binding:""`
  746. ExpCount interface{} `form:"expCount" json:"expCount" binding:""`
  747. }{})
  748. query := global.App.DB.Table("user").
  749. LeftJoin("user_behavior", "user.id = user_behavior.id").
  750. Where("gid", form.Gid).Where("pf", form.Pf)
  751. if form.OpenId != "" {
  752. query = query.Where("open_id", form.OpenId)
  753. }
  754. if form.Pid != "" {
  755. query = query.Where("pid", form.Pid)
  756. }
  757. if form.CreateTime != nil {
  758. query = BuildBehaviorQuery(query, form.CreateTime, "createdAt")
  759. }
  760. if form.StartNum != nil {
  761. query = BuildBehaviorQuery(query, form.CreateTime, "startNum")
  762. }
  763. if form.Duration != nil {
  764. query = BuildBehaviorQuery(query, form.CreateTime, "duration")
  765. }
  766. if form.ReqCount != nil {
  767. query = BuildBehaviorQuery(query, form.CreateTime, "adCount")
  768. }
  769. if form.ExpCount != nil {
  770. query = BuildBehaviorQuery(query, form.CreateTime, "adExpCount")
  771. }
  772. var count int64
  773. err := query.Count(&count).Error
  774. if err != nil {
  775. response.Fail(c, 1001, err.Error())
  776. return
  777. }
  778. var res []struct {
  779. ID int `json:"id" gorm:"not null;"`
  780. Pf string `json:"pf" gorm:"not null;"`
  781. Gid string `json:"gid" gorm:"not null;"`
  782. UserId int `json:"userId" gorm:"not null;column:userId;"`
  783. OpenId string `json:"openId" gorm:"not null;column:openId;"`
  784. CreatedAt time.Time `json:"createdAt" gorm:"column:createdAt;"`
  785. Duration int `json:"duration" gorm:"not null;"`
  786. StartNum int `json:"startNum" gorm:"not null;column:startNum;"`
  787. AdCount int `json:"adCount" gorm:"not null;column:adCount;"`
  788. AdExpCount int `json:"adExpCount" gorm:"not null;column:adExpCount;"`
  789. }
  790. err = query.Offset(form.Offset).Limit(form.Limit).Scan(&res).Error
  791. if err != nil {
  792. response.Fail(c, 1002, err.Error())
  793. return
  794. }
  795. response.Success(c, gin.H{
  796. "data": res,
  797. "count": count,
  798. })
  799. }
  800. func BuildBehaviorQuery(query *utils.WtDB, filters interface{}, field string) *utils.WtDB {
  801. marsh, _ := json.Marshal(filters)
  802. var filter BehaviorFilter
  803. json.Unmarshal(marsh, &filter)
  804. if filter.Gt > 0 {
  805. query = query.Where(field, ">", filter.Gt)
  806. }
  807. if filter.Gte > 0 {
  808. query = query.Where(field, ">=", filter.Gte)
  809. }
  810. if filter.Lt > 0 {
  811. query = query.Where(field, "<", filter.Lt)
  812. }
  813. if filter.Lte > 0 {
  814. query = query.Where(field, "<=", filter.Lte)
  815. }
  816. if filter.Ne > 0 {
  817. query = query.Where(field, "!=", filter.Ne)
  818. }
  819. return query
  820. }
  821. // ConversionCondition 转化条件
  822. type ConversionCondition struct {
  823. Id string `bson:"_id" json:"id"`
  824. Gid string `bson:"gid" json:"gid"`
  825. Pid *big.Int `bson:"pid" json:"pid"`
  826. Aid *big.Int `bson:"aid" json:"aid"`
  827. Type string `bson:"type" json:"type"`
  828. StartNum int `bson:"start_num" json:"start_num"` //启动次数
  829. EstimatedRevenue float32 `bson:"revenue" json:"revenue"` //当日预估收益
  830. Duration int64 `bson:"duration" json:"duration"` //当日在线时长
  831. ReqRewardedAd int `bson:"req_count" json:"req_count"` //当日的激励视频广告请求次数
  832. ExpRewardedAd int `bson:"exp_count" json:"exp_count"` //当日的激励视频广告曝光次数
  833. }
  834. func SetGameCondition(c *gin.Context) {
  835. form := request.Check(c, &struct {
  836. Gid string `form:"gid" json:"gid" binding:"required"`
  837. Pid string `form:"pid" json:"pid" binding:""`
  838. Aid string `form:"aid" json:"aid" binding:""`
  839. Type string `form:"type" json:"type" binding:"required"`
  840. StartNum int `form:"start_num" json:"start_num" binding:""`
  841. EstimatedRevenue float32 `form:"revenue" json:"revenue" binding:""`
  842. Duration int64 `form:"duration" json:"duration" binding:""`
  843. ReqRewardedAd int `form:"req_count" json:"req_count" binding:""`
  844. ExpRewardedAd int `form:"exp_count" json:"exp_count" binding:""`
  845. }{})
  846. id := fmt.Sprintf("%s|%s|%s|%s", form.Gid, form.Pid, form.Aid, form.Type)
  847. PidInt := new(big.Int)
  848. PidInt.SetString(form.Pid, 10)
  849. AidInt := new(big.Int)
  850. AidInt.SetString(form.Aid, 10)
  851. collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
  852. filter := bson.M{"_id": id}
  853. var conversionCondition ConversionCondition
  854. err := collection.FindOne(context.TODO(), filter).Decode(&conversionCondition)
  855. //if err != nil {
  856. // response.Fail(c, 1002, err.Error())
  857. // return
  858. //}
  859. if conversionCondition.Id != "" {
  860. //存在,更新
  861. update := bson.M{
  862. "$set": struct {
  863. StartNum int `bson:"start_num"` //启动次数
  864. EstimatedRevenue float32 `bson:"revenue"` //当日预估收益
  865. Duration int64 `bson:"duration"` //当日在线时长
  866. ReqRewardedAd int `bson:"req_count"` //当日的激励视频广告请求次数
  867. ExpRewardedAd int `bson:"exp_count"` //当日的激励视频广告曝光次数
  868. }{
  869. StartNum: form.StartNum,
  870. EstimatedRevenue: form.EstimatedRevenue,
  871. Duration: form.Duration,
  872. ReqRewardedAd: form.ReqRewardedAd,
  873. ExpRewardedAd: form.ExpRewardedAd,
  874. },
  875. }
  876. _, err = collection.UpdateOne(context.TODO(), filter, update)
  877. if err != nil {
  878. response.Fail(c, 1003, err.Error())
  879. return
  880. }
  881. } else {
  882. //不存在,新增
  883. insert := ConversionCondition{
  884. Id: id,
  885. Pid: PidInt,
  886. Aid: AidInt,
  887. Gid: form.Gid,
  888. Type: form.Type,
  889. StartNum: form.StartNum,
  890. EstimatedRevenue: form.EstimatedRevenue,
  891. Duration: form.Duration,
  892. ReqRewardedAd: form.ReqRewardedAd,
  893. ExpRewardedAd: form.ExpRewardedAd,
  894. }
  895. _, err = collection.InsertOne(context.TODO(), insert)
  896. if err != nil {
  897. response.Fail(c, 1001, err.Error())
  898. return
  899. }
  900. }
  901. response.Success(c, gin.H{})
  902. }
  903. func GameConditionList(c *gin.Context) {
  904. form := request.Check(c, &struct {
  905. Gid string `form:"gid" json:"gid" binding:"required"`
  906. Pid string `form:"pid" json:"pid" binding:""`
  907. Aid string `form:"aid" json:"aid" binding:""`
  908. Type string `form:"type" json:"type" binding:""`
  909. Offset int `form:"offset" json:"offset" binding:""`
  910. Limit int `form:"limit" json:"limit" binding:"required"`
  911. }{})
  912. collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
  913. filter := bson.M{"gid": form.Gid, "type": form.Type}
  914. if form.Type != "" {
  915. filter["type"] = form.Type
  916. }
  917. if form.Pid != "" {
  918. filter["pid"] = form.Pid
  919. }
  920. if form.Aid != "" {
  921. filter["aid"] = form.Aid
  922. }
  923. ctx := context.Background()
  924. option := options.Find()
  925. option.SetLimit(int64(form.Limit))
  926. option.SetSkip(int64(form.Offset))
  927. cur, err := collection.Find(ctx, filter, option)
  928. if err != nil {
  929. response.Fail(c, 1001, err.Error())
  930. return
  931. }
  932. count, err := collection.CountDocuments(ctx, filter)
  933. if err != nil {
  934. response.Fail(c, 1001, err.Error())
  935. return
  936. }
  937. var data []ConversionCondition
  938. err = cur.All(ctx, &data)
  939. if err != nil {
  940. response.Fail(c, 1001, err.Error())
  941. return
  942. }
  943. response.Success(c, gin.H{
  944. "data": data,
  945. "count": count,
  946. })
  947. }
  948. func BehaviorListCake(c *gin.Context) {
  949. form := request.Check(c, &struct {
  950. Gid string `form:"gid" json:"gid" binding:"required"`
  951. Pf string `form:"pf" json:"pf" binding:"required"`
  952. ActiveStatus string `form:"activeStatus" json:"activeStatus" binding:""` //all true false
  953. ConversionStatus string `form:"conversionStatus" json:"conversionStatus" binding:""` //all true false
  954. TotalDuration string `form:"totalDuration" json:"totalDuration" binding:""`
  955. TotalAdReqCount string `form:"totalAdReqCount" json:"totalAdReqCount" binding:""`
  956. TotalAdEposedCount string `form:"totalAdEposedCount" json:"totalAdEposedCount" binding:""`
  957. CreateTime string `json:"createTime" bson:"createTime"`
  958. //AdFromCount string `form:"adFromCount" json:"adFromCount" binding:""`
  959. //StartNum string `form:"startNum" json:"startNum" binding:""`
  960. }{})
  961. collection := global.App.MongoDB.Database("chunhao").Collection("userBehavior")
  962. ctx := context.Background()
  963. filter := bson.M{"gid": form.Gid}
  964. if form.Pf != "" {
  965. filter["pf"] = form.Pf
  966. }
  967. if form.ActiveStatus == "true" {
  968. filter["activeStatus"] = true
  969. } else if form.ActiveStatus == "false" {
  970. filter["activeStatus"] = false
  971. }
  972. if form.ActiveStatus == "true" {
  973. filter["activeStatus"] = true
  974. } else if form.ActiveStatus == "false" {
  975. filter["activeStatus"] = false
  976. }
  977. if form.CreateTime != "" {
  978. createTime := strings.Split(strings.Replace(form.CreateTime, ",", ",", -1), ",")
  979. filters := bson.M{}
  980. filters["$gt"], _ = strconv.Atoi(createTime[0])
  981. filters["$lte"], _ = strconv.Atoi(createTime[1])
  982. filter["createTime"] = filters
  983. }
  984. type resData struct {
  985. Count int `json:"count"`
  986. Name string `json:"name"`
  987. }
  988. filterListTotalDuration := make(map[string]bson.M)
  989. filterList := make(map[string]bson.M)
  990. var data []resData
  991. if form.TotalDuration != "" {
  992. totalDuration := strings.Split(strings.Replace(form.TotalDuration, ",", ",", -1), ",")
  993. for k, _ := range totalDuration {
  994. var gt, lte int
  995. if k == 0 {
  996. gt = 0
  997. lte, _ = strconv.Atoi(totalDuration[k])
  998. } else {
  999. gt, _ = strconv.Atoi(totalDuration[k-1])
  1000. lte, _ = strconv.Atoi(totalDuration[k])
  1001. }
  1002. filters := bson.M{}
  1003. filters["$gt"] = gt
  1004. filters["$lte"] = lte
  1005. filter1 := utils.DeepCopyMap(filter)
  1006. filter1["totalDuration"] = filters
  1007. name := "在线时长:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
  1008. filterListTotalDuration[name] = filter1
  1009. }
  1010. filters := bson.M{}
  1011. filters["$gt"], _ = strconv.Atoi(totalDuration[len(totalDuration)-1])
  1012. filter["totalDuration"] = filters
  1013. name := "在线时长:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
  1014. filterListTotalDuration[name] = filter
  1015. }
  1016. if form.TotalAdReqCount != "" && form.TotalAdEposedCount == "" {
  1017. totalDuration := strings.Split(strings.Replace(form.TotalAdReqCount, ",", ",", -1), ",")
  1018. for k, _ := range totalDuration {
  1019. var gt, lte int
  1020. if k == 0 {
  1021. gt = 0
  1022. lte, _ = strconv.Atoi(totalDuration[k])
  1023. } else {
  1024. gt, _ = strconv.Atoi(totalDuration[k-1])
  1025. lte, _ = strconv.Atoi(totalDuration[k])
  1026. }
  1027. filters := bson.M{}
  1028. filters["$gt"] = gt
  1029. filters["$lte"] = lte
  1030. if len(filterListTotalDuration) != 0 {
  1031. for nameD, filterD := range filterListTotalDuration {
  1032. filterE := utils.DeepCopyMap(filterD)
  1033. filterE["totalAdReqCount"] = filters
  1034. name := nameD + "&&" + "广告观看次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
  1035. filterList[name] = filterE
  1036. }
  1037. } else {
  1038. filter1 := utils.DeepCopyMap(filter)
  1039. filter1["totalAdReqCount"] = filters
  1040. name := "广告观看次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
  1041. filterList[name] = filter1
  1042. }
  1043. }
  1044. filters := bson.M{}
  1045. filters["$gt"], _ = strconv.Atoi(totalDuration[len(totalDuration)-1])
  1046. filter["totalAdReqCount"] = filters
  1047. if len(filterListTotalDuration) != 0 {
  1048. for nameD, filterD := range filterListTotalDuration {
  1049. filterD["totalAdReqCount"] = filters
  1050. name := nameD + "&&" + "广告观看次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
  1051. filterList[name] = filterD
  1052. }
  1053. } else {
  1054. filter1 := utils.DeepCopyMap(filter)
  1055. filter["totalAdReqCount"] = filters
  1056. name := "广告观看次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
  1057. filterList[name] = filter1
  1058. }
  1059. //count, err := collection.CountDocuments(ctx, filter)
  1060. //if err != nil {
  1061. // response.Fail(c, 1001, err.Error())
  1062. // return
  1063. //}
  1064. //data = append(data, resData{
  1065. // Count: int(count),
  1066. // Name: totalDuration[len(totalDuration)-1] + "-" + "∞",
  1067. //})
  1068. }
  1069. if form.TotalAdEposedCount != "" && form.TotalAdReqCount == "" {
  1070. totalDuration := strings.Split(strings.Replace(form.TotalAdEposedCount, ",", ",", -1), ",")
  1071. for k, _ := range totalDuration {
  1072. var gt, lte int
  1073. if k == 0 {
  1074. gt = 0
  1075. lte, _ = strconv.Atoi(totalDuration[k])
  1076. } else {
  1077. gt, _ = strconv.Atoi(totalDuration[k-1])
  1078. lte, _ = strconv.Atoi(totalDuration[k])
  1079. }
  1080. filters := bson.M{}
  1081. filters["$gt"] = gt
  1082. filters["$lte"] = lte
  1083. if len(filterListTotalDuration) != 0 {
  1084. for nameD, filterD := range filterListTotalDuration {
  1085. filterE := utils.DeepCopyMap(filterD)
  1086. filterE["TotalAdEposedCount"] = filters
  1087. name := nameD + "&&" + "广告看完次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
  1088. filterList[name] = filterE
  1089. }
  1090. } else {
  1091. filter1 := utils.DeepCopyMap(filter)
  1092. filter1["TotalAdEposedCount"] = filters
  1093. name := "广告看完次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
  1094. filterList[name] = filter1
  1095. }
  1096. }
  1097. filters := bson.M{}
  1098. filters["$gt"], _ = strconv.Atoi(totalDuration[len(totalDuration)-1])
  1099. filter["TotalAdEposedCount"] = filters
  1100. if len(filterListTotalDuration) != 0 {
  1101. for nameD, filterD := range filterListTotalDuration {
  1102. filterD["TotalAdEposedCount"] = filters
  1103. name := nameD + "&&" + "广告看完次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
  1104. filterList[name] = filterD
  1105. }
  1106. } else {
  1107. filter1 := utils.DeepCopyMap(filter)
  1108. filter["TotalAdEposedCount"] = filters
  1109. name := "广告看完次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
  1110. filterList[name] = filter1
  1111. }
  1112. //count, err := collection.CountDocuments(ctx, filter)
  1113. //if err != nil {
  1114. // response.Fail(c, 1001, err.Error())
  1115. // return
  1116. //}
  1117. //data = append(data, resData{
  1118. // Count: int(count),
  1119. // Name: totalDuration[len(totalDuration)-1] + "-" + "∞",
  1120. //})
  1121. }
  1122. if form.TotalAdEposedCount != "" && form.TotalAdReqCount != "" {
  1123. response.Fail(c, 1002, "筛选条件无效")
  1124. return
  1125. }
  1126. if len(filterList) == 0 {
  1127. filterList = filterListTotalDuration
  1128. }
  1129. for k, filterC := range filterList {
  1130. count, _ := collection.CountDocuments(ctx, filterC)
  1131. data = append(data, resData{
  1132. Name: k,
  1133. Count: int(count),
  1134. })
  1135. }
  1136. response.Success(c, gin.H{
  1137. "data": data,
  1138. })
  1139. }
  1140. func SplitOnlineData(c *gin.Context) {
  1141. //只保留最近30天的数据
  1142. now := time.Now()
  1143. for i := 0; i <= 29; i++ {
  1144. date := now.AddDate(0, 0, -i).Format("2006-01-02")
  1145. date1 := now.AddDate(0, 0, -i).Format("20060102")
  1146. var dir string
  1147. if config.Get("app.local") == "local" {
  1148. //url = "mongodb://localhost:27017"
  1149. dir = "storage"
  1150. } else {
  1151. dir = "/www/wwwroot/chunhao_receive/storage"
  1152. }
  1153. //读取对应的文件夹
  1154. dirPath := filepath.Join(dir, date)
  1155. dateDir, _ := os.ReadDir(dirPath)
  1156. fmt.Println(dateDir, date)
  1157. for _, v := range dateDir {
  1158. var onlineData []model.UserOnlineSplit
  1159. fileName := v.Name()
  1160. fileNameSplit := strings.Split(fileName, "_")
  1161. if len(fileNameSplit) < 2 {
  1162. continue
  1163. }
  1164. last := fileNameSplit[len(fileNameSplit)-1]
  1165. pf := last[:len(last)-4]
  1166. gid := strings.TrimRight(fileName, "_"+last)
  1167. fmt.Println("fileName:", fileName)
  1168. fmt.Println("gid:", gid)
  1169. fmt.Println("last:", last)
  1170. //err1 := DropTable(gid, date1)
  1171. //fmt.Println(err1)
  1172. //continue
  1173. filePath := filepath.Join(dirPath, fileName)
  1174. file, _ := os.Open(filePath)
  1175. // 创建 Scanner 对象
  1176. scanner := bufio.NewScanner(file)
  1177. // 逐行读取文件内容
  1178. lineNumber := 1
  1179. for scanner.Scan() {
  1180. line := scanner.Text() // 获取当前行内容
  1181. lineNumber++
  1182. lineData := strings.Split(line, ",")
  1183. userId, _ := strconv.Atoi(lineData[0])
  1184. types, _ := strconv.Atoi(lineData[1])
  1185. loc, _ := time.LoadLocation("Asia/Shanghai")
  1186. LogTime, _ := time.ParseInLocation("2006-01-02 15:04:05", lineData[2], loc)
  1187. //fmt.Println(LogTime, lineData[2])
  1188. onlineData = append(onlineData, model.UserOnlineSplit{
  1189. Pf: pf,
  1190. UserId: userId,
  1191. Type: types,
  1192. LogTime: LogTime,
  1193. })
  1194. }
  1195. file.Close() // 确保函数结束时关闭文件
  1196. //数据存入mysql
  1197. err := InsertOnlineSpilt(gid, date1, onlineData)
  1198. if err != nil {
  1199. fmt.Println("插入数据库错误", err)
  1200. }
  1201. }
  1202. fmt.Println(date, "数据归档数据库完成,耗时:", time.Since(now))
  1203. }
  1204. }
  1205. func InsertOnlineSpilt(gid string, date string, online []model.UserOnlineSplit) error {
  1206. //先根据date ,gid ,判定存哪个表
  1207. tableName := "user_online" + "_" + date + "_" + gid
  1208. err := global.App.DB.Exec(`
  1209. CREATE TABLE IF NOT EXISTS ` + tableName + ` (
  1210. id int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  1211. pf varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '登录路径',
  1212. userId int NOT NULL COMMENT '用户ID',
  1213. type tinyint NOT NULL COMMENT '1:在线 2.下线',
  1214. logTime timestamp NULL DEFAULT NULL COMMENT '时间',
  1215. PRIMARY KEY (id) USING BTREE,
  1216. KEY pf (pf)
  1217. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
  1218. `).Error
  1219. if err != nil {
  1220. fmt.Println("创建数据库失败", tableName, err.Error())
  1221. return err
  1222. }
  1223. err = global.App.DB.Table(tableName).CreateInBatches(&online, 1000).Error
  1224. if err != nil {
  1225. return err
  1226. }
  1227. return nil
  1228. }
  1229. func DropTable(gid string, date string) error {
  1230. //先根据date ,gid ,判定存哪个表
  1231. tableName := "user_online" + "_" + date + "_" + gid
  1232. sql := "DROP TABLE IF EXISTS " + tableName
  1233. err := global.App.DB.Exec(sql).Error
  1234. if err != nil {
  1235. fmt.Println("创建数据库失败", tableName, err.Error())
  1236. return err
  1237. }
  1238. return nil
  1239. }