userBehavior.go 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430
  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. ActiveStart, _, _, err := service.GetActiveMouthDistribution(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. AvgTime, _, _, err := service.UserOnlineSummaryByDay(form.Gid, form.Pf, form.StartTime, form.EndTime)
  413. if err != nil {
  414. response.Fail(c, 1001, err.Error())
  415. return
  416. }
  417. for k := range AvgTime {
  418. data[k] = dayData{
  419. NewUser: NewUser[k],
  420. ActiveUser: ActiveUser[k],
  421. ActiveStart: ActiveStart[k],
  422. AvgTime: AvgTime[k],
  423. }
  424. }
  425. response.Success(c, gin.H{
  426. "data": data,
  427. })
  428. }
  429. func OnlineToFile(c *gin.Context) {
  430. service.OnlineToFile()
  431. //now := time.Now()
  432. //for i := 1; i <= 60; i++ {
  433. // lastDay := now.AddDate(0, 0, -i).Format("20060102")
  434. // crons.AdsDataSummary(lastDay)
  435. //}
  436. response.Success(c, gin.H{})
  437. }
  438. func RemainDataBydDay(c *gin.Context) {
  439. form := request.Check(c, &struct {
  440. Gid string `form:"gid" json:"gid" binding:"required"`
  441. Pf string `form:"pf" json:"pf" binding:"required"`
  442. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  443. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  444. Type int `form:"type" json:"type" binding:"required"`
  445. }{})
  446. //data, err := service.RemainDataBydDay(form.Type, form.Pf, form.Gid, form.StartTime, form.EndTime)
  447. //if err != nil {
  448. // response.Fail(c, 1001, err.Error())
  449. // return
  450. //}
  451. data, err := service.RemainDataBydDayNew(form.Type, form.Pf, form.Gid, form.StartTime, form.EndTime)
  452. if err != nil {
  453. response.Fail(c, 1001, err.Error())
  454. return
  455. }
  456. response.Success(c, gin.H{
  457. "data": data,
  458. })
  459. }
  460. type AdData struct {
  461. Pid string `json:"pid"`
  462. Aid string `json:"aid"`
  463. Cid string `json:"cid"`
  464. ReportUrl string `json:"reportUrl"`
  465. Reported bool `json:"reported"`
  466. Duration int64 `json:"duration"`
  467. AdReqCount uint8 `json:"adReqCount"`
  468. AdEposedcount uint8 `json:"adEposedcount"`
  469. CreateTime int `json:"createTime"`
  470. }
  471. type UserBehavior struct {
  472. Id string `bson:"_id,omitempty"`
  473. Gid string `bson:"gid" json:"gid"`
  474. Pf string `bson:"pf" json:"pf"`
  475. OpenId string `bson:"openId" json:"openId"`
  476. RelatedAid int64 `bson:"relatedAid" json:"relatedAid"` //目前关联的aid
  477. TotalDuration int `bson:"totalDuration" json:"totalDuration"`
  478. TotalAdReqCount int `bson:"totalAdReqCount" json:"totalAdReqCount"`
  479. TotalAdEposedCount int `bson:"totalAdEposedCount" json:"totalAdEposedCount"`
  480. CreateDate string `bson:"createDate" json:"createDate"`
  481. CreateTime int `json:"createTime" bson:"createTime"`
  482. StartNum int `bson:"startNum" json:"startNum"`
  483. ActiveStatus bool `bson:"activeStatus" json:"activeStatus"` //激活状态
  484. ConversionStatus bool `bson:"conversionStatus" json:"conversionStatus"` //转化状态
  485. RemainData map[string]string `json:"remainData" bson:"remainData"` //留存数据
  486. }
  487. type AdRelated struct {
  488. Id string `bson:"_id" json:"_id"`
  489. UserId string `bson:"userId" json:"userId"`
  490. Aid int64 `json:"aid" bson:"aid"` //广告的推广计划id,即广告ID,广告平台配置落地页参数
  491. Cid string `json:"cid" bson:"cid"` //openid的用户点击aid广告进入游戏时的唯一标识,广告平台提供
  492. Pid int64 `json:"pid" bson:"pid"` //广告的项目id(仅巨量引擎存在,腾讯广告时不存在该值),广告平台配置落地页参数
  493. CreateTime int64 `bson:"create_time" json:"createTime"` //当前计划的创建时间
  494. StartNum int `bson:"startNum" json:"startNum"` //启动次数
  495. Revenue float32 `bson:"revenue" json:"revenue"` //当日预估收益
  496. Duration int64 `bson:"duration" json:"duration"` //当日在线时长
  497. ReqCount int `bson:"req_count" json:"req_count"` //当日的激励视频广告请求次数
  498. ExpCount int `bson:"exp_count" json:"exp_count"` //当日的激励视频广告曝光次数
  499. }
  500. type BehaviorFilter struct {
  501. Gt int `json:"gt"`
  502. Gte int `json:"gte"`
  503. Lte int `json:"lte"`
  504. Lt int `json:"lt"`
  505. Ne int `json:"ne"`
  506. //$gt 大于
  507. //$gte:大于或等于
  508. //$lt:小于
  509. //$lte:小于或等于
  510. //$ne:不等于
  511. }
  512. func BehaviorList(c *gin.Context) {
  513. form := request.Check(c, &struct {
  514. Gid string `form:"gid" json:"gid" binding:"required"`
  515. Pf string `form:"pf" json:"pf" binding:"required"`
  516. OpenId string `form:"openId" json:"openId" binding:""`
  517. Offset int `form:"offset" json:"offset" binding:""`
  518. Limit int `form:"limit" json:"limit" binding:""`
  519. ActiveStatus string `form:"activeStatus" json:"activeStatus" binding:""` //all true false
  520. ConversionStatus string `form:"conversionStatus" json:"conversionStatus" binding:""` //all true false
  521. AdFromCount interface{} `form:"adFromCount" json:"adFromCount" binding:""`
  522. TotalDuration interface{} `form:"totalDuration" json:"totalDuration" binding:""`
  523. TotalAdReqCount interface{} `form:"totalAdReqCount" json:"totalAdReqCount" binding:""`
  524. TotalAdEposedCount interface{} `form:"totalAdEposedCount" json:"totalAdEposedCount" binding:""`
  525. CreateTime interface{} `form:"createTime" json:"createTime" binding:""`
  526. StartNum interface{} `form:"startNum" json:"startNum" binding:""`
  527. }{})
  528. collection := global.App.MongoDB.Database("chunhao").Collection("userBehavior")
  529. ctx := context.Background()
  530. filter := bson.M{"gid": form.Gid}
  531. if form.Pf != "" {
  532. filter["pf"] = form.Pf
  533. }
  534. if form.OpenId != "" {
  535. filter["openId"] = bson.M{"$regex": form.OpenId}
  536. }
  537. if form.ActiveStatus == "true" {
  538. filter["activeStatus"] = true
  539. } else if form.ActiveStatus == "false" {
  540. filter["activeStatus"] = false
  541. }
  542. if form.ActiveStatus == "true" {
  543. filter["activeStatus"] = true
  544. } else if form.ActiveStatus == "false" {
  545. filter["activeStatus"] = false
  546. }
  547. if form.AdFromCount != nil {
  548. fmt.Println(form.AdFromCount)
  549. marsh, _ := json.Marshal(form.AdFromCount)
  550. var adFromCount BehaviorFilter
  551. json.Unmarshal(marsh, &adFromCount)
  552. filters := bson.M{}
  553. if adFromCount.Gt != 0 {
  554. filters["$gt"] = adFromCount.Gt
  555. }
  556. if adFromCount.Gte != 0 {
  557. filters["$gte"] = adFromCount.Gte
  558. }
  559. if adFromCount.Lte != 0 {
  560. filters["$lte"] = adFromCount.Lte
  561. }
  562. if adFromCount.Lt != 0 {
  563. filters["$lt"] = adFromCount.Lt
  564. }
  565. if adFromCount.Ne != 0 {
  566. filters["$ne"] = adFromCount.Ne
  567. }
  568. if len(filters) > 0 {
  569. filter["adFromCount"] = filters
  570. }
  571. }
  572. if form.TotalAdReqCount != nil {
  573. marsh, _ := json.Marshal(form.TotalAdReqCount)
  574. var totalAdReqCount BehaviorFilter
  575. json.Unmarshal(marsh, &totalAdReqCount)
  576. filters := bson.M{}
  577. if totalAdReqCount.Gt != 0 {
  578. filters["$gt"] = totalAdReqCount.Gt
  579. }
  580. if totalAdReqCount.Gte != 0 {
  581. filters["$gte"] = totalAdReqCount.Gte
  582. }
  583. if totalAdReqCount.Lte != 0 {
  584. filters["$lte"] = totalAdReqCount.Lte
  585. }
  586. if totalAdReqCount.Lt != 0 {
  587. filters["$lt"] = totalAdReqCount.Lt
  588. }
  589. if totalAdReqCount.Ne != 0 {
  590. filters["$ne"] = totalAdReqCount.Ne
  591. }
  592. if len(filters) > 0 {
  593. filter["totalAdReqCount"] = filters
  594. }
  595. }
  596. if form.TotalAdEposedCount != nil {
  597. marsh, _ := json.Marshal(form.TotalAdEposedCount)
  598. var totalAdEposedCount BehaviorFilter
  599. json.Unmarshal(marsh, &totalAdEposedCount)
  600. filters := bson.M{}
  601. if totalAdEposedCount.Gt != 0 {
  602. filters["$gt"] = totalAdEposedCount.Gt
  603. }
  604. if totalAdEposedCount.Gte != 0 {
  605. filters["$gte"] = totalAdEposedCount.Gte
  606. }
  607. if totalAdEposedCount.Lte != 0 {
  608. filters["$lte"] = totalAdEposedCount.Lte
  609. }
  610. if totalAdEposedCount.Lt != 0 {
  611. filters["$lt"] = totalAdEposedCount.Lt
  612. }
  613. if totalAdEposedCount.Ne != 0 {
  614. filters["$ne"] = totalAdEposedCount.Ne
  615. }
  616. if len(filters) > 0 {
  617. filter["totalAdEposedCount"] = filters
  618. }
  619. }
  620. if form.CreateTime != nil {
  621. marsh, _ := json.Marshal(form.CreateTime)
  622. var totalAdEposedCount BehaviorFilter
  623. json.Unmarshal(marsh, &totalAdEposedCount)
  624. filters := bson.M{}
  625. if totalAdEposedCount.Gt != 0 {
  626. filters["$gt"] = totalAdEposedCount.Gt
  627. }
  628. if totalAdEposedCount.Gte != 0 {
  629. filters["$gte"] = totalAdEposedCount.Gte
  630. }
  631. if totalAdEposedCount.Lte != 0 {
  632. filters["$lte"] = totalAdEposedCount.Lte
  633. }
  634. if totalAdEposedCount.Lt != 0 {
  635. filters["$lt"] = totalAdEposedCount.Lt
  636. }
  637. if totalAdEposedCount.Ne != 0 {
  638. filters["$ne"] = totalAdEposedCount.Ne
  639. }
  640. if len(filters) > 0 {
  641. filter["createTime"] = filters
  642. }
  643. }
  644. if form.StartNum != nil {
  645. marsh, _ := json.Marshal(form.StartNum)
  646. var totalAdEposedCount BehaviorFilter
  647. json.Unmarshal(marsh, &totalAdEposedCount)
  648. filters := bson.M{}
  649. if totalAdEposedCount.Gt != 0 {
  650. filters["$gt"] = totalAdEposedCount.Gt
  651. }
  652. if totalAdEposedCount.Gte != 0 {
  653. filters["$gte"] = totalAdEposedCount.Gte
  654. }
  655. if totalAdEposedCount.Lte != 0 {
  656. filters["$lte"] = totalAdEposedCount.Lte
  657. }
  658. if totalAdEposedCount.Lt != 0 {
  659. filters["$lt"] = totalAdEposedCount.Lt
  660. }
  661. if totalAdEposedCount.Ne != 0 {
  662. filters["$ne"] = totalAdEposedCount.Ne
  663. }
  664. if len(filters) > 0 {
  665. filter["startNum"] = filters
  666. }
  667. }
  668. if form.TotalDuration != nil {
  669. marsh, _ := json.Marshal(form.TotalDuration)
  670. var totalAdEposedCount BehaviorFilter
  671. json.Unmarshal(marsh, &totalAdEposedCount)
  672. filters := bson.M{}
  673. if totalAdEposedCount.Gt != 0 {
  674. filters["$gt"] = totalAdEposedCount.Gt
  675. }
  676. if totalAdEposedCount.Gte != 0 {
  677. filters["$gte"] = totalAdEposedCount.Gte
  678. }
  679. if totalAdEposedCount.Lte != 0 {
  680. filters["$lte"] = totalAdEposedCount.Lte
  681. }
  682. if totalAdEposedCount.Lt != 0 {
  683. filters["$lt"] = totalAdEposedCount.Lt
  684. }
  685. if totalAdEposedCount.Ne != 0 {
  686. filters["$ne"] = totalAdEposedCount.Ne
  687. }
  688. if len(filters) > 0 {
  689. filter["totalDuration"] = filters
  690. }
  691. }
  692. option := options.Find()
  693. option.SetLimit(int64(form.Limit))
  694. option.SetSkip(int64(form.Offset))
  695. cur, err := collection.Find(ctx, filter, option)
  696. if err != nil {
  697. response.Fail(c, 1001, err.Error())
  698. return
  699. }
  700. count, err := collection.CountDocuments(ctx, filter)
  701. if err != nil {
  702. response.Fail(c, 1001, err.Error())
  703. return
  704. }
  705. var data []UserBehavior
  706. err = cur.All(ctx, &data)
  707. if err != nil {
  708. response.Fail(c, 1001, err.Error())
  709. return
  710. }
  711. response.Success(c, gin.H{
  712. "data": data,
  713. "count": count,
  714. })
  715. }
  716. func AdRelatedList(c *gin.Context) {
  717. form := request.Check(c, &struct {
  718. Gid string `form:"gid" json:"gid" binding:"required"`
  719. Pf string `form:"pf" json:"pf" binding:"required"`
  720. OpenId string `form:"search" json:"search" binding:""`
  721. Offset int `form:"offset" json:"offset" binding:""`
  722. Limit int `form:"limit" json:"limit" binding:""`
  723. Pid string `form:"pid" json:"pid" binding:""`
  724. Aid string `form:"aid" json:"aid" binding:""`
  725. Cid string `form:"cid" json:"cid" binding:""`
  726. CreateTime interface{} `form:"createTime" json:"createTime" binding:""`
  727. StartNum interface{} `form:"startNum" json:"startNum" binding:""`
  728. Duration interface{} `form:"duration" json:"duration" binding:""`
  729. ReqCount interface{} `form:"reqCount" json:"reqCount" binding:""`
  730. ExpCount interface{} `form:"expCount" json:"expCount" binding:""`
  731. }{})
  732. query := global.App.DB.Table("user").
  733. Order("user.id desc").
  734. LeftJoin("user_behavior", "user.id = user_behavior.id").
  735. Where("gid", form.Gid).Where("pf", form.Pf)
  736. if form.OpenId != "" {
  737. query = query.Where("open_id", form.OpenId)
  738. }
  739. if form.Pid != "" {
  740. query = query.Where("pid", form.Pid)
  741. }
  742. if form.Aid != "" {
  743. query = query.Where("pid", form.Aid)
  744. }
  745. if form.CreateTime != nil {
  746. query = BuildBehaviorQuery(query, form.CreateTime, "createdAt")
  747. }
  748. if form.StartNum != nil {
  749. query = BuildBehaviorQuery(query, form.StartNum, "startNum")
  750. }
  751. if form.Duration != nil {
  752. query = BuildBehaviorQuery(query, form.Duration, "duration")
  753. }
  754. if form.ReqCount != nil {
  755. query = BuildBehaviorQuery(query, form.ReqCount, "adCount")
  756. }
  757. if form.ExpCount != nil {
  758. query = BuildBehaviorQuery(query, form.ExpCount, "adExpCount")
  759. }
  760. var count int64
  761. err := query.Count(&count).Error
  762. if err != nil {
  763. response.Fail(c, 1001, err.Error())
  764. return
  765. }
  766. var res []struct {
  767. ID int `json:"id" gorm:"not null;"`
  768. Pf string `json:"pf" gorm:"not null;"`
  769. Gid string `json:"gid" gorm:"not null;"`
  770. Aid string `json:"aid" gorm:"not null;" column:"aid;"`
  771. Pid string `json:"pid" gorm:"not null;" column:"pid;"`
  772. Cid string `json:"cid" gorm:"not null;" column:"cid;"`
  773. UserId int `json:"userId" gorm:"not null;column:userId;"`
  774. OpenId string `json:"openId" gorm:"not null;column:openId;"`
  775. CreatedAt model.XTime `json:"createdAt" gorm:"column:createdAt;"`
  776. Duration int `json:"duration" gorm:"not null;"`
  777. StartNum int `json:"startNum" gorm:"not null;column:startNum;"`
  778. AdCount int `json:"adCount" gorm:"not null;column:adCount;"`
  779. AdExpCount int `json:"adExpCount" gorm:"not null;column:adExpCount;"`
  780. }
  781. err = query.Offset(form.Offset).Limit(form.Limit).Scan(&res).Error
  782. if err != nil {
  783. response.Fail(c, 1002, err.Error())
  784. return
  785. }
  786. response.Success(c, gin.H{
  787. "data": res,
  788. "count": count,
  789. })
  790. }
  791. func BuildBehaviorQuery(query *utils.WtDB, filters interface{}, field string) *utils.WtDB {
  792. marsh, _ := json.Marshal(filters)
  793. var filter BehaviorFilter
  794. json.Unmarshal(marsh, &filter)
  795. if filter.Gt > 0 {
  796. query = query.Where(field, ">", filter.Gt)
  797. }
  798. if filter.Gte > 0 {
  799. query = query.Where(field, ">=", filter.Gte)
  800. }
  801. if filter.Lt > 0 {
  802. query = query.Where(field, "<", filter.Lt)
  803. }
  804. if filter.Lte > 0 {
  805. query = query.Where(field, "<=", filter.Lte)
  806. }
  807. if filter.Ne > 0 {
  808. query = query.Where(field, "!=", filter.Ne)
  809. }
  810. return query
  811. }
  812. // ConversionCondition 转化条件
  813. type ConversionCondition struct {
  814. Id string `bson:"_id" json:"id"`
  815. Gid string `bson:"gid" json:"gid"`
  816. Pid *big.Int `bson:"pid" json:"pid"`
  817. Aid *big.Int `bson:"aid" json:"aid"`
  818. Type string `bson:"type" json:"type"`
  819. StartNum int `bson:"start_num" json:"start_num"` //启动次数
  820. EstimatedRevenue float32 `bson:"revenue" json:"revenue"` //当日预估收益
  821. Duration int64 `bson:"duration" json:"duration"` //当日在线时长
  822. ReqRewardedAd int `bson:"req_count" json:"req_count"` //当日的激励视频广告请求次数
  823. ExpRewardedAd int `bson:"exp_count" json:"exp_count"` //当日的激励视频广告曝光次数
  824. }
  825. func SetGameCondition(c *gin.Context) {
  826. form := request.Check(c, &struct {
  827. Gid string `form:"gid" json:"gid" binding:"required"`
  828. Pid string `form:"pid" json:"pid" binding:""`
  829. Aid string `form:"aid" json:"aid" binding:""`
  830. Type string `form:"type" json:"type" binding:"required"`
  831. StartNum int `form:"start_num" json:"start_num" binding:""`
  832. EstimatedRevenue float32 `form:"revenue" json:"revenue" binding:""`
  833. Duration int64 `form:"duration" json:"duration" binding:""`
  834. ReqRewardedAd int `form:"req_count" json:"req_count" binding:""`
  835. ExpRewardedAd int `form:"exp_count" json:"exp_count" binding:""`
  836. }{})
  837. id := fmt.Sprintf("%s|%s|%s|%s", form.Gid, form.Pid, form.Aid, form.Type)
  838. PidInt := new(big.Int)
  839. PidInt.SetString(form.Pid, 10)
  840. AidInt := new(big.Int)
  841. AidInt.SetString(form.Aid, 10)
  842. collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
  843. filter := bson.M{"_id": id}
  844. var conversionCondition ConversionCondition
  845. err := collection.FindOne(context.TODO(), filter).Decode(&conversionCondition)
  846. //if err != nil {
  847. // response.Fail(c, 1002, err.Error())
  848. // return
  849. //}
  850. if conversionCondition.Id != "" {
  851. //存在,更新
  852. update := bson.M{
  853. "$set": struct {
  854. StartNum int `bson:"start_num"` //启动次数
  855. EstimatedRevenue float32 `bson:"revenue"` //当日预估收益
  856. Duration int64 `bson:"duration"` //当日在线时长
  857. ReqRewardedAd int `bson:"req_count"` //当日的激励视频广告请求次数
  858. ExpRewardedAd int `bson:"exp_count"` //当日的激励视频广告曝光次数
  859. }{
  860. StartNum: form.StartNum,
  861. EstimatedRevenue: form.EstimatedRevenue,
  862. Duration: form.Duration,
  863. ReqRewardedAd: form.ReqRewardedAd,
  864. ExpRewardedAd: form.ExpRewardedAd,
  865. },
  866. }
  867. _, err = collection.UpdateOne(context.TODO(), filter, update)
  868. if err != nil {
  869. response.Fail(c, 1003, err.Error())
  870. return
  871. }
  872. } else {
  873. //不存在,新增
  874. insert := ConversionCondition{
  875. Id: id,
  876. Pid: PidInt,
  877. Aid: AidInt,
  878. Gid: form.Gid,
  879. Type: form.Type,
  880. StartNum: form.StartNum,
  881. EstimatedRevenue: form.EstimatedRevenue,
  882. Duration: form.Duration,
  883. ReqRewardedAd: form.ReqRewardedAd,
  884. ExpRewardedAd: form.ExpRewardedAd,
  885. }
  886. _, err = collection.InsertOne(context.TODO(), insert)
  887. if err != nil {
  888. response.Fail(c, 1001, err.Error())
  889. return
  890. }
  891. }
  892. response.Success(c, gin.H{})
  893. }
  894. func GameConditionList(c *gin.Context) {
  895. form := request.Check(c, &struct {
  896. Gid string `form:"gid" json:"gid" binding:"required"`
  897. Pid string `form:"pid" json:"pid" binding:""`
  898. Aid string `form:"aid" json:"aid" binding:""`
  899. Type string `form:"type" json:"type" binding:""`
  900. Offset int `form:"offset" json:"offset" binding:""`
  901. Limit int `form:"limit" json:"limit" binding:"required"`
  902. }{})
  903. collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
  904. filter := bson.M{"gid": form.Gid, "type": form.Type}
  905. if form.Type != "" {
  906. filter["type"] = form.Type
  907. }
  908. if form.Pid != "" {
  909. filter["pid"] = form.Pid
  910. }
  911. if form.Aid != "" {
  912. filter["aid"] = form.Aid
  913. }
  914. ctx := context.Background()
  915. option := options.Find()
  916. option.SetLimit(int64(form.Limit))
  917. option.SetSkip(int64(form.Offset))
  918. cur, err := collection.Find(ctx, filter, option)
  919. if err != nil {
  920. response.Fail(c, 1001, err.Error())
  921. return
  922. }
  923. count, err := collection.CountDocuments(ctx, filter)
  924. if err != nil {
  925. response.Fail(c, 1001, err.Error())
  926. return
  927. }
  928. var data []ConversionCondition
  929. err = cur.All(ctx, &data)
  930. if err != nil {
  931. response.Fail(c, 1001, err.Error())
  932. return
  933. }
  934. response.Success(c, gin.H{
  935. "data": data,
  936. "count": count,
  937. })
  938. }
  939. func BehaviorListCake(c *gin.Context) {
  940. form := request.Check(c, &struct {
  941. Gid string `form:"gid" json:"gid" binding:"required"`
  942. Pf string `form:"pf" json:"pf" binding:"required"`
  943. ActiveStatus string `form:"activeStatus" json:"activeStatus" binding:""` //all true false
  944. ConversionStatus string `form:"conversionStatus" json:"conversionStatus" binding:""` //all true false
  945. TotalDuration string `form:"totalDuration" json:"totalDuration" binding:""`
  946. TotalAdReqCount string `form:"totalAdReqCount" json:"totalAdReqCount" binding:""`
  947. TotalAdEposedCount string `form:"totalAdEposedCount" json:"totalAdEposedCount" binding:""`
  948. CreateTime string `json:"createTime" bson:"createTime"`
  949. //AdFromCount string `form:"adFromCount" json:"adFromCount" binding:""`
  950. //StartNum string `form:"startNum" json:"startNum" binding:""`
  951. }{})
  952. collection := global.App.MongoDB.Database("chunhao").Collection("userBehavior")
  953. ctx := context.Background()
  954. filter := bson.M{"gid": form.Gid}
  955. if form.Pf != "" {
  956. filter["pf"] = form.Pf
  957. }
  958. if form.ActiveStatus == "true" {
  959. filter["activeStatus"] = true
  960. } else if form.ActiveStatus == "false" {
  961. filter["activeStatus"] = false
  962. }
  963. if form.ActiveStatus == "true" {
  964. filter["activeStatus"] = true
  965. } else if form.ActiveStatus == "false" {
  966. filter["activeStatus"] = false
  967. }
  968. if form.CreateTime != "" {
  969. createTime := strings.Split(strings.Replace(form.CreateTime, ",", ",", -1), ",")
  970. filters := bson.M{}
  971. filters["$gt"], _ = strconv.Atoi(createTime[0])
  972. filters["$lte"], _ = strconv.Atoi(createTime[1])
  973. filter["createTime"] = filters
  974. }
  975. type resData struct {
  976. Count int `json:"count"`
  977. Name string `json:"name"`
  978. }
  979. filterListTotalDuration := make(map[string]bson.M)
  980. filterList := make(map[string]bson.M)
  981. var data []resData
  982. if form.TotalDuration != "" {
  983. totalDuration := strings.Split(strings.Replace(form.TotalDuration, ",", ",", -1), ",")
  984. for k, _ := range totalDuration {
  985. var gt, lte int
  986. if k == 0 {
  987. gt = 0
  988. lte, _ = strconv.Atoi(totalDuration[k])
  989. } else {
  990. gt, _ = strconv.Atoi(totalDuration[k-1])
  991. lte, _ = strconv.Atoi(totalDuration[k])
  992. }
  993. filters := bson.M{}
  994. filters["$gt"] = gt
  995. filters["$lte"] = lte
  996. filter1 := utils.DeepCopyMap(filter)
  997. filter1["totalDuration"] = filters
  998. name := "在线时长:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
  999. filterListTotalDuration[name] = filter1
  1000. }
  1001. filters := bson.M{}
  1002. filters["$gt"], _ = strconv.Atoi(totalDuration[len(totalDuration)-1])
  1003. filter["totalDuration"] = filters
  1004. name := "在线时长:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
  1005. filterListTotalDuration[name] = filter
  1006. }
  1007. if form.TotalAdReqCount != "" && form.TotalAdEposedCount == "" {
  1008. totalDuration := strings.Split(strings.Replace(form.TotalAdReqCount, ",", ",", -1), ",")
  1009. for k, _ := range totalDuration {
  1010. var gt, lte int
  1011. if k == 0 {
  1012. gt = 0
  1013. lte, _ = strconv.Atoi(totalDuration[k])
  1014. } else {
  1015. gt, _ = strconv.Atoi(totalDuration[k-1])
  1016. lte, _ = strconv.Atoi(totalDuration[k])
  1017. }
  1018. filters := bson.M{}
  1019. filters["$gt"] = gt
  1020. filters["$lte"] = lte
  1021. if len(filterListTotalDuration) != 0 {
  1022. for nameD, filterD := range filterListTotalDuration {
  1023. filterE := utils.DeepCopyMap(filterD)
  1024. filterE["totalAdReqCount"] = filters
  1025. name := nameD + "&&" + "广告观看次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
  1026. filterList[name] = filterE
  1027. }
  1028. } else {
  1029. filter1 := utils.DeepCopyMap(filter)
  1030. filter1["totalAdReqCount"] = filters
  1031. name := "广告观看次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
  1032. filterList[name] = filter1
  1033. }
  1034. }
  1035. filters := bson.M{}
  1036. filters["$gt"], _ = strconv.Atoi(totalDuration[len(totalDuration)-1])
  1037. filter["totalAdReqCount"] = filters
  1038. if len(filterListTotalDuration) != 0 {
  1039. for nameD, filterD := range filterListTotalDuration {
  1040. filterD["totalAdReqCount"] = filters
  1041. name := nameD + "&&" + "广告观看次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
  1042. filterList[name] = filterD
  1043. }
  1044. } else {
  1045. filter1 := utils.DeepCopyMap(filter)
  1046. filter["totalAdReqCount"] = filters
  1047. name := "广告观看次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
  1048. filterList[name] = filter1
  1049. }
  1050. //count, err := collection.CountDocuments(ctx, filter)
  1051. //if err != nil {
  1052. // response.Fail(c, 1001, err.Error())
  1053. // return
  1054. //}
  1055. //data = append(data, resData{
  1056. // Count: int(count),
  1057. // Name: totalDuration[len(totalDuration)-1] + "-" + "∞",
  1058. //})
  1059. }
  1060. if form.TotalAdEposedCount != "" && form.TotalAdReqCount == "" {
  1061. totalDuration := strings.Split(strings.Replace(form.TotalAdEposedCount, ",", ",", -1), ",")
  1062. for k, _ := range totalDuration {
  1063. var gt, lte int
  1064. if k == 0 {
  1065. gt = 0
  1066. lte, _ = strconv.Atoi(totalDuration[k])
  1067. } else {
  1068. gt, _ = strconv.Atoi(totalDuration[k-1])
  1069. lte, _ = strconv.Atoi(totalDuration[k])
  1070. }
  1071. filters := bson.M{}
  1072. filters["$gt"] = gt
  1073. filters["$lte"] = lte
  1074. if len(filterListTotalDuration) != 0 {
  1075. for nameD, filterD := range filterListTotalDuration {
  1076. filterE := utils.DeepCopyMap(filterD)
  1077. filterE["TotalAdEposedCount"] = filters
  1078. name := nameD + "&&" + "广告看完次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
  1079. filterList[name] = filterE
  1080. }
  1081. } else {
  1082. filter1 := utils.DeepCopyMap(filter)
  1083. filter1["TotalAdEposedCount"] = filters
  1084. name := "广告看完次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
  1085. filterList[name] = filter1
  1086. }
  1087. }
  1088. filters := bson.M{}
  1089. filters["$gt"], _ = strconv.Atoi(totalDuration[len(totalDuration)-1])
  1090. filter["TotalAdEposedCount"] = filters
  1091. if len(filterListTotalDuration) != 0 {
  1092. for nameD, filterD := range filterListTotalDuration {
  1093. filterD["TotalAdEposedCount"] = filters
  1094. name := nameD + "&&" + "广告看完次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
  1095. filterList[name] = filterD
  1096. }
  1097. } else {
  1098. filter1 := utils.DeepCopyMap(filter)
  1099. filter["TotalAdEposedCount"] = filters
  1100. name := "广告看完次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
  1101. filterList[name] = filter1
  1102. }
  1103. //count, err := collection.CountDocuments(ctx, filter)
  1104. //if err != nil {
  1105. // response.Fail(c, 1001, err.Error())
  1106. // return
  1107. //}
  1108. //data = append(data, resData{
  1109. // Count: int(count),
  1110. // Name: totalDuration[len(totalDuration)-1] + "-" + "∞",
  1111. //})
  1112. }
  1113. if form.TotalAdEposedCount != "" && form.TotalAdReqCount != "" {
  1114. response.Fail(c, 1002, "筛选条件无效")
  1115. return
  1116. }
  1117. if len(filterList) == 0 {
  1118. filterList = filterListTotalDuration
  1119. }
  1120. for k, filterC := range filterList {
  1121. count, _ := collection.CountDocuments(ctx, filterC)
  1122. data = append(data, resData{
  1123. Name: k,
  1124. Count: int(count),
  1125. })
  1126. }
  1127. response.Success(c, gin.H{
  1128. "data": data,
  1129. })
  1130. }
  1131. func SplitOnlineData(c *gin.Context) {
  1132. //只保留最近30天的数据
  1133. now := time.Now()
  1134. for i := 0; i <= 29; i++ {
  1135. date := now.AddDate(0, 0, -i).Format("2006-01-02")
  1136. date1 := now.AddDate(0, 0, -i).Format("20060102")
  1137. var dir string
  1138. if config.Get("app.local") == "local" {
  1139. //url = "mongodb://localhost:27017"
  1140. dir = "storage"
  1141. } else {
  1142. dir = "/www/wwwroot/chunhao_receive/storage"
  1143. }
  1144. //读取对应的文件夹
  1145. dirPath := filepath.Join(dir, date)
  1146. dateDir, _ := os.ReadDir(dirPath)
  1147. fmt.Println(dateDir, date)
  1148. for _, v := range dateDir {
  1149. var onlineData []model.UserOnlineSplit
  1150. fileName := v.Name()
  1151. fileNameSplit := strings.Split(fileName, "_")
  1152. if len(fileNameSplit) < 2 {
  1153. continue
  1154. }
  1155. last := fileNameSplit[len(fileNameSplit)-1]
  1156. pf := last[:len(last)-4]
  1157. gid := strings.TrimRight(fileName, "_"+last)
  1158. fmt.Println("fileName:", fileName)
  1159. fmt.Println("gid:", gid)
  1160. fmt.Println("last:", last)
  1161. //err1 := DropTable(gid, date1)
  1162. //fmt.Println(err1)
  1163. //continue
  1164. filePath := filepath.Join(dirPath, fileName)
  1165. file, _ := os.Open(filePath)
  1166. // 创建 Scanner 对象
  1167. scanner := bufio.NewScanner(file)
  1168. // 逐行读取文件内容
  1169. lineNumber := 1
  1170. for scanner.Scan() {
  1171. line := scanner.Text() // 获取当前行内容
  1172. lineNumber++
  1173. lineData := strings.Split(line, ",")
  1174. userId, _ := strconv.Atoi(lineData[0])
  1175. types, _ := strconv.Atoi(lineData[1])
  1176. loc, _ := time.LoadLocation("Asia/Shanghai")
  1177. LogTime, _ := time.ParseInLocation("2006-01-02 15:04:05", lineData[2], loc)
  1178. //fmt.Println(LogTime, lineData[2])
  1179. onlineData = append(onlineData, model.UserOnlineSplit{
  1180. Pf: pf,
  1181. UserId: userId,
  1182. Type: types,
  1183. LogTime: LogTime,
  1184. })
  1185. }
  1186. file.Close() // 确保函数结束时关闭文件
  1187. //数据存入mysql
  1188. err := InsertOnlineSpilt(gid, date1, onlineData)
  1189. if err != nil {
  1190. fmt.Println("插入数据库错误", err)
  1191. }
  1192. }
  1193. fmt.Println(date, "数据归档数据库完成,耗时:", time.Since(now))
  1194. }
  1195. }
  1196. func InsertOnlineSpilt(gid string, date string, online []model.UserOnlineSplit) error {
  1197. //先根据date ,gid ,判定存哪个表
  1198. tableName := "user_online" + "_" + date + "_" + gid
  1199. err := global.App.DB.Exec(`
  1200. CREATE TABLE IF NOT EXISTS ` + tableName + ` (
  1201. id int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  1202. pf varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '登录路径',
  1203. userId int NOT NULL COMMENT '用户ID',
  1204. type tinyint NOT NULL COMMENT '1:在线 2.下线',
  1205. logTime timestamp NULL DEFAULT NULL COMMENT '时间',
  1206. PRIMARY KEY (id) USING BTREE,
  1207. KEY pf (pf)
  1208. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
  1209. `).Error
  1210. if err != nil {
  1211. fmt.Println("创建数据库失败", tableName, err.Error())
  1212. return err
  1213. }
  1214. err = global.App.DB.Table(tableName).CreateInBatches(&online, 1000).Error
  1215. if err != nil {
  1216. return err
  1217. }
  1218. return nil
  1219. }
  1220. func DropTable(gid string, date string) error {
  1221. //先根据date ,gid ,判定存哪个表
  1222. tableName := "user_online" + "_" + date + "_" + gid
  1223. sql := "DROP TABLE IF EXISTS " + tableName
  1224. err := global.App.DB.Exec(sql).Error
  1225. if err != nil {
  1226. fmt.Println("创建数据库失败", tableName, err.Error())
  1227. return err
  1228. }
  1229. return nil
  1230. }