userBehavior.go 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297
  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("openId", form.OpenId)
  738. }
  739. if form.Pid != "" {
  740. query = query.Where("pid", form.Pid)
  741. }
  742. if form.Aid != "" {
  743. query = query.Where("aid", form.Aid)
  744. }
  745. if form.CreateTime != nil {
  746. //时间戳转化为YMD
  747. query = BuildBehaviorQuery(query, form.CreateTime, "UNIX_TIMESTAMP(createdAt)")
  748. }
  749. if form.StartNum != nil {
  750. query = BuildBehaviorQuery(query, form.StartNum, "startNum")
  751. }
  752. if form.Duration != nil {
  753. query = BuildBehaviorQuery(query, form.Duration, "duration")
  754. }
  755. if form.ReqCount != nil {
  756. query = BuildBehaviorQuery(query, form.ReqCount, "adCount")
  757. }
  758. if form.ExpCount != nil {
  759. query = BuildBehaviorQuery(query, form.ExpCount, "adExpCount")
  760. }
  761. var count int64
  762. err := query.Count(&count).Error
  763. if err != nil {
  764. response.Fail(c, 1001, err.Error())
  765. return
  766. }
  767. var res []struct {
  768. ID int `json:"id" gorm:"not null;"`
  769. Pf string `json:"pf" gorm:"not null;"`
  770. Gid string `json:"gid" gorm:"not null;"`
  771. Aid string `json:"aid" gorm:"not null;" column:"aid;"`
  772. Pid string `json:"pid" gorm:"not null;" column:"pid;"`
  773. Cid string `json:"cid" gorm:"not null;" column:"cid;"`
  774. UserId int `json:"userId" gorm:"not null;column:userId;"`
  775. OpenId string `json:"openId" gorm:"not null;column:openId;"`
  776. CreatedAt model.XTime `json:"createdAt" gorm:"column:createdAt;"`
  777. Duration int `json:"duration" gorm:"not null;"`
  778. StartNum int `json:"startNum" gorm:"not null;column:startNum;"`
  779. AdCount int `json:"adCount" gorm:"not null;column:adCount;"`
  780. AdExpCount int `json:"adExpCount" gorm:"not null;column:adExpCount;"`
  781. }
  782. err = query.Offset(form.Offset).Limit(form.Limit).Scan(&res).Error
  783. if err != nil {
  784. response.Fail(c, 1002, err.Error())
  785. return
  786. }
  787. response.Success(c, gin.H{
  788. "data": res,
  789. "count": count,
  790. })
  791. }
  792. func BuildBehaviorQuery(query *utils.WtDB, filters interface{}, field string) *utils.WtDB {
  793. marsh, _ := json.Marshal(filters)
  794. var filter BehaviorFilter
  795. json.Unmarshal(marsh, &filter)
  796. if filter.Gt > 0 {
  797. query = query.Where(field, ">", filter.Gt)
  798. }
  799. if filter.Gte > 0 {
  800. query = query.Where(field, ">=", filter.Gte)
  801. }
  802. if filter.Lt > 0 {
  803. query = query.Where(field, "<", filter.Lt)
  804. }
  805. if filter.Lte > 0 {
  806. query = query.Where(field, "<=", filter.Lte)
  807. }
  808. if filter.Ne > 0 {
  809. query = query.Where(field, "!=", filter.Ne)
  810. }
  811. return query
  812. }
  813. // ConversionCondition 转化条件
  814. type ConversionCondition struct {
  815. Id string `bson:"_id" json:"id"`
  816. Gid string `bson:"gid" json:"gid"`
  817. Pid *big.Int `bson:"pid" json:"pid"`
  818. Aid *big.Int `bson:"aid" json:"aid"`
  819. Type string `bson:"type" json:"type"`
  820. StartNum int `bson:"start_num" json:"start_num"` //启动次数
  821. EstimatedRevenue float32 `bson:"revenue" json:"revenue"` //当日预估收益
  822. Duration int64 `bson:"duration" json:"duration"` //当日在线时长
  823. ReqRewardedAd int `bson:"req_count" json:"req_count"` //当日的激励视频广告请求次数
  824. ExpRewardedAd int `bson:"exp_count" json:"exp_count"` //当日的激励视频广告曝光次数
  825. }
  826. func SetGameCondition(c *gin.Context) {
  827. form := request.Check(c, &struct {
  828. Gid string `form:"gid" json:"gid" binding:"required"`
  829. Pid string `form:"pid" json:"pid" binding:""`
  830. Aid string `form:"aid" json:"aid" binding:""`
  831. Type string `form:"type" json:"type" binding:"required"`
  832. StartNum int `form:"start_num" json:"start_num" binding:""`
  833. EstimatedRevenue float32 `form:"revenue" json:"revenue" binding:""`
  834. Duration int64 `form:"duration" json:"duration" binding:""`
  835. ReqRewardedAd int `form:"req_count" json:"req_count" binding:""`
  836. ExpRewardedAd int `form:"exp_count" json:"exp_count" binding:""`
  837. }{})
  838. id := fmt.Sprintf("%s|%s|%s|%s", form.Gid, form.Pid, form.Aid, form.Type)
  839. PidInt := new(big.Int)
  840. PidInt.SetString(form.Pid, 10)
  841. AidInt := new(big.Int)
  842. AidInt.SetString(form.Aid, 10)
  843. collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
  844. filter := bson.M{"_id": id}
  845. var conversionCondition ConversionCondition
  846. err := collection.FindOne(context.TODO(), filter).Decode(&conversionCondition)
  847. //if err != nil {
  848. // response.Fail(c, 1002, err.Error())
  849. // return
  850. //}
  851. if conversionCondition.Id != "" {
  852. //存在,更新
  853. update := bson.M{
  854. "$set": struct {
  855. StartNum int `bson:"start_num"` //启动次数
  856. EstimatedRevenue float32 `bson:"revenue"` //当日预估收益
  857. Duration int64 `bson:"duration"` //当日在线时长
  858. ReqRewardedAd int `bson:"req_count"` //当日的激励视频广告请求次数
  859. ExpRewardedAd int `bson:"exp_count"` //当日的激励视频广告曝光次数
  860. }{
  861. StartNum: form.StartNum,
  862. EstimatedRevenue: form.EstimatedRevenue,
  863. Duration: form.Duration,
  864. ReqRewardedAd: form.ReqRewardedAd,
  865. ExpRewardedAd: form.ExpRewardedAd,
  866. },
  867. }
  868. _, err = collection.UpdateOne(context.TODO(), filter, update)
  869. if err != nil {
  870. response.Fail(c, 1003, err.Error())
  871. return
  872. }
  873. } else {
  874. //不存在,新增
  875. insert := ConversionCondition{
  876. Id: id,
  877. Pid: PidInt,
  878. Aid: AidInt,
  879. Gid: form.Gid,
  880. Type: form.Type,
  881. StartNum: form.StartNum,
  882. EstimatedRevenue: form.EstimatedRevenue,
  883. Duration: form.Duration,
  884. ReqRewardedAd: form.ReqRewardedAd,
  885. ExpRewardedAd: form.ExpRewardedAd,
  886. }
  887. _, err = collection.InsertOne(context.TODO(), insert)
  888. if err != nil {
  889. response.Fail(c, 1001, err.Error())
  890. return
  891. }
  892. }
  893. response.Success(c, gin.H{})
  894. }
  895. func GameConditionList(c *gin.Context) {
  896. form := request.Check(c, &struct {
  897. Gid string `form:"gid" json:"gid" binding:"required"`
  898. Pid string `form:"pid" json:"pid" binding:""`
  899. Aid string `form:"aid" json:"aid" binding:""`
  900. Type string `form:"type" json:"type" binding:""`
  901. Offset int `form:"offset" json:"offset" binding:""`
  902. Limit int `form:"limit" json:"limit" binding:"required"`
  903. }{})
  904. collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
  905. filter := bson.M{"gid": form.Gid, "type": form.Type}
  906. if form.Type != "" {
  907. filter["type"] = form.Type
  908. }
  909. if form.Pid != "" {
  910. filter["pid"] = form.Pid
  911. }
  912. if form.Aid != "" {
  913. filter["aid"] = form.Aid
  914. }
  915. ctx := context.Background()
  916. option := options.Find()
  917. option.SetLimit(int64(form.Limit))
  918. option.SetSkip(int64(form.Offset))
  919. cur, err := collection.Find(ctx, filter, option)
  920. if err != nil {
  921. response.Fail(c, 1001, err.Error())
  922. return
  923. }
  924. count, err := collection.CountDocuments(ctx, filter)
  925. if err != nil {
  926. response.Fail(c, 1001, err.Error())
  927. return
  928. }
  929. var data []ConversionCondition
  930. err = cur.All(ctx, &data)
  931. if err != nil {
  932. response.Fail(c, 1001, err.Error())
  933. return
  934. }
  935. response.Success(c, gin.H{
  936. "data": data,
  937. "count": count,
  938. })
  939. }
  940. func BehaviorListCake(c *gin.Context) {
  941. form := request.Check(c, &struct {
  942. Gid string `form:"gid" json:"gid" binding:"required"`
  943. Pf string `form:"pf" json:"pf" binding:"required"`
  944. TotalDuration string `form:"totalDuration" json:"totalDuration" binding:""`
  945. TotalAdReqCount string `form:"totalAdReqCount" json:"totalAdReqCount" binding:""`
  946. TotalAdEposedCount string `form:"totalAdEposedCount" json:"totalAdEposedCount" binding:""`
  947. CreateTime string `form:"createTime" json:"createTime"`
  948. }{})
  949. //根据过滤条件分组统计
  950. if form.TotalDuration != "" {
  951. group := BehaviorCakeQuery(form.Gid, form.Pf, form.CreateTime, form.TotalDuration, "duration", "用户时长")
  952. response.Success(c, gin.H{
  953. "data": group,
  954. })
  955. return
  956. }
  957. if form.TotalAdReqCount != "" {
  958. group := BehaviorCakeQuery(form.Gid, form.Pf, form.CreateTime, form.TotalAdReqCount, "adCount", "广告次数")
  959. response.Success(c, gin.H{
  960. "data": group,
  961. })
  962. return
  963. }
  964. if form.TotalAdEposedCount != "" {
  965. group := BehaviorCakeQuery(form.Gid, form.Pf, form.CreateTime, form.TotalAdEposedCount, "adExpCount", "广告完播次数")
  966. response.Success(c, gin.H{
  967. "data": group,
  968. })
  969. return
  970. }
  971. response.Success(c, gin.H{})
  972. }
  973. type cakeRes struct {
  974. Name string `json:"name"`
  975. Count int64 `json:"count"`
  976. }
  977. func BehaviorCakeQuery(gid, pf, createTime, filter, filterRow, filterName string) []cakeRes {
  978. var group []cakeRes
  979. totalDuration := CakeFilter(filter)
  980. for k, v := range totalDuration {
  981. var count int64
  982. if k == 0 {
  983. query := SetCakeQuery(gid, pf, createTime)
  984. query.Where(filterRow, "<=", v).Count(&count)
  985. group = append(group, cakeRes{
  986. Name: fmt.Sprintf("%s<=%v", filterName, v),
  987. Count: count,
  988. })
  989. }
  990. if k == len(totalDuration)-1 {
  991. query := SetCakeQuery(gid, pf, createTime)
  992. query.Where(filterRow, ">=", v).Count(&count)
  993. group = append(group, cakeRes{
  994. Name: fmt.Sprintf("%s>=%v", filterName, v),
  995. Count: count,
  996. })
  997. }
  998. if k-1 >= 0 {
  999. query := SetCakeQuery(gid, pf, createTime)
  1000. query.Where(filterRow, ">=", totalDuration[k-1]).Where(filterRow, "<", totalDuration[k]).Count(&count)
  1001. group = append(group, cakeRes{
  1002. Name: fmt.Sprintf("%s>=%v,且<%v", filterName, totalDuration[k-1], v),
  1003. Count: count,
  1004. })
  1005. }
  1006. }
  1007. return group
  1008. }
  1009. func SetCakeQuery(Gid, Pf, CreateTime string) *utils.WtDB {
  1010. query := global.App.DB.Table("user").
  1011. LeftJoin("user_behavior", "user.id = user_behavior.id").Where("gid", Gid).Where("pf", Pf)
  1012. if CreateTime != "" {
  1013. timeSlice := strings.Split(CreateTime, ",")
  1014. start, _ := strconv.Atoi(timeSlice[0])
  1015. end, _ := strconv.Atoi(timeSlice[1])
  1016. startTime := time.Unix(int64(start), 0)
  1017. endTime := time.Unix(int64(end), 0)
  1018. query = query.WhereRaw("createdAt >= ?", startTime).WhereRaw("createdAt <= ?", endTime)
  1019. }
  1020. return query
  1021. }
  1022. func CakeFilter(filter string) []int {
  1023. totalDuration := strings.Split(strings.Replace(filter, ",", ",", -1), ",")
  1024. var result []int
  1025. for _, v := range totalDuration {
  1026. ints, _ := strconv.Atoi(v)
  1027. result = append(result, ints)
  1028. }
  1029. return result
  1030. }
  1031. func SplitOnlineData(c *gin.Context) {
  1032. //只保留最近30天的数据
  1033. now := time.Now()
  1034. for i := 0; i <= 29; i++ {
  1035. date := now.AddDate(0, 0, -i).Format("2006-01-02")
  1036. date1 := now.AddDate(0, 0, -i).Format("20060102")
  1037. var dir string
  1038. if config.Get("app.local") == "local" {
  1039. //url = "mongodb://localhost:27017"
  1040. dir = "storage"
  1041. } else {
  1042. dir = "/www/wwwroot/chunhao_receive/storage"
  1043. }
  1044. //读取对应的文件夹
  1045. dirPath := filepath.Join(dir, date)
  1046. dateDir, _ := os.ReadDir(dirPath)
  1047. fmt.Println(dateDir, date)
  1048. for _, v := range dateDir {
  1049. var onlineData []model.UserOnlineSplit
  1050. fileName := v.Name()
  1051. fileNameSplit := strings.Split(fileName, "_")
  1052. if len(fileNameSplit) < 2 {
  1053. continue
  1054. }
  1055. last := fileNameSplit[len(fileNameSplit)-1]
  1056. pf := last[:len(last)-4]
  1057. gid := strings.TrimRight(fileName, "_"+last)
  1058. fmt.Println("fileName:", fileName)
  1059. fmt.Println("gid:", gid)
  1060. fmt.Println("last:", last)
  1061. //err1 := DropTable(gid, date1)
  1062. //fmt.Println(err1)
  1063. //continue
  1064. filePath := filepath.Join(dirPath, fileName)
  1065. file, _ := os.Open(filePath)
  1066. // 创建 Scanner 对象
  1067. scanner := bufio.NewScanner(file)
  1068. // 逐行读取文件内容
  1069. lineNumber := 1
  1070. for scanner.Scan() {
  1071. line := scanner.Text() // 获取当前行内容
  1072. lineNumber++
  1073. lineData := strings.Split(line, ",")
  1074. userId, _ := strconv.Atoi(lineData[0])
  1075. types, _ := strconv.Atoi(lineData[1])
  1076. loc, _ := time.LoadLocation("Asia/Shanghai")
  1077. LogTime, _ := time.ParseInLocation("2006-01-02 15:04:05", lineData[2], loc)
  1078. //fmt.Println(LogTime, lineData[2])
  1079. onlineData = append(onlineData, model.UserOnlineSplit{
  1080. Pf: pf,
  1081. UserId: userId,
  1082. Type: types,
  1083. LogTime: LogTime,
  1084. })
  1085. }
  1086. file.Close() // 确保函数结束时关闭文件
  1087. //数据存入mysql
  1088. err := InsertOnlineSpilt(gid, date1, onlineData)
  1089. if err != nil {
  1090. fmt.Println("插入数据库错误", err)
  1091. }
  1092. }
  1093. fmt.Println(date, "数据归档数据库完成,耗时:", time.Since(now))
  1094. }
  1095. }
  1096. func InsertOnlineSpilt(gid string, date string, online []model.UserOnlineSplit) error {
  1097. //先根据date ,gid ,判定存哪个表
  1098. tableName := "user_online" + "_" + date + "_" + gid
  1099. err := global.App.DB.Exec(`
  1100. CREATE TABLE IF NOT EXISTS ` + tableName + ` (
  1101. id int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  1102. pf varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '登录路径',
  1103. userId int NOT NULL COMMENT '用户ID',
  1104. type tinyint NOT NULL COMMENT '1:在线 2.下线',
  1105. logTime timestamp NULL DEFAULT NULL COMMENT '时间',
  1106. PRIMARY KEY (id) USING BTREE,
  1107. KEY pf (pf)
  1108. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
  1109. `).Error
  1110. if err != nil {
  1111. fmt.Println("创建数据库失败", tableName, err.Error())
  1112. return err
  1113. }
  1114. err = global.App.DB.Table(tableName).CreateInBatches(&online, 1000).Error
  1115. if err != nil {
  1116. return err
  1117. }
  1118. return nil
  1119. }
  1120. func DropTable(gid string, date string) error {
  1121. //先根据date ,gid ,判定存哪个表
  1122. tableName := "user_online" + "_" + date + "_" + gid
  1123. sql := "DROP TABLE IF EXISTS " + tableName
  1124. err := global.App.DB.Exec(sql).Error
  1125. if err != nil {
  1126. fmt.Println("创建数据库失败", tableName, err.Error())
  1127. return err
  1128. }
  1129. return nil
  1130. }