bill.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. package models
  2. import (
  3. "fmt"
  4. "hongze/hongze_api/utils"
  5. "rdluck_tools/orm"
  6. "time"
  7. )
  8. type BillDetailResp struct {
  9. RealName string `description:"用户实际名称"`
  10. TogetherDay string `description:"相伴天数"`
  11. CreateDate string `description:"创建时间"`
  12. FirstReadReportType string `description:"首次阅读报告类型"`
  13. FirstReadReportTitle string `description:"首次阅读报告标题"`
  14. ListenReportCount int `description:"收听报告次数"`
  15. ListenReportDuration float64 `description:"收听报告时长"`
  16. MaxReadReportDate string `description:"阅读报告最多的一天"`
  17. MaxReadReportCount int `description:"阅读报告最多的一天,报告数量"`
  18. LatestReadReportDate string `description:"阅读报告时间最晚的一天"`
  19. LatestReadReportTime string `description:"阅读报告时间最晚的一天,最晚的时间"`
  20. LatestReadReportDateDuration float64 `description:"阅读报告时间最晚的一天,总共阅读报告的时长"`
  21. MaxOpenReportClassify string `description:"打开次数最多报告的栏目"`
  22. MaxOpenReportCount int `description:"打开次数最多报告的栏目下,用户阅读的报告数"`
  23. TotalReadDuration float64 `description:"总阅读时长"`
  24. TotalReportDayCount int `description:"总阅读晨报数"`
  25. TotalReportWeekCount int `description:"总阅读周报数"`
  26. TotalReportMonthCount int `description:"总阅读月报数"`
  27. TotalReportTwoWeekCount int `description:"总阅读双周报数"`
  28. TotalReportRddpCount int `description:"总阅读点评数"`
  29. TotalReport int `description:"总阅读报告数"`
  30. LearnDay int `description:"连续学习天数"`
  31. }
  32. type ReadReportType struct {
  33. ReportType string
  34. CreateTime time.Time
  35. Title string
  36. Stage int
  37. }
  38. func GetRddpMinReportType(uid int, startDate string) (item *ReadReportType, err error) {
  39. o := orm.NewOrm()
  40. o.Using("rddp")
  41. sql := `SELECT 'rddp' AS report_type,MIN(a.create_time) AS create_time,b.title,b.stage FROM report_view_record AS a
  42. INNER JOIN report AS b ON a.report_id=b.id
  43. WHERE a.user_id=? AND a.create_time>=? `
  44. err = o.Raw(sql, uid, startDate).QueryRow(&item)
  45. return
  46. }
  47. func GetWeekMinReportType(uid int, startDate string) (item *ReadReportType, err error) {
  48. o := orm.NewOrm()
  49. sql := `SELECT b.type AS report_type,MIN(a.created_time) AS create_time,b.research_report_name AS title,b.periods AS stage FROM user_view_history AS a
  50. INNER JOIN research_report AS b ON a.research_report_id=b.research_report_id
  51. WHERE a.user_id=? AND a.created_time>=? `
  52. err = o.Raw(sql, uid, startDate).QueryRow(&item)
  53. return
  54. }
  55. func GetFirstReportInfo(uid int, startDate string) (firstReadReportType, firstReadReportTitle string, err error) {
  56. rddpFlag := true
  57. weekFlag := true
  58. rddpMinReportItem, err := GetRddpMinReportType(uid, startDate)
  59. if err != nil {
  60. if err.Error() == utils.ErrNoRow() {
  61. rddpFlag = false
  62. } else {
  63. return
  64. }
  65. }
  66. if rddpMinReportItem == nil {
  67. rddpFlag = false
  68. }
  69. weekMinReportItem, err := GetWeekMinReportType(uid, startDate)
  70. if err != nil {
  71. if err.Error() == utils.ErrNoRow() {
  72. weekFlag = false
  73. } else {
  74. return
  75. }
  76. }
  77. if weekMinReportItem == nil {
  78. weekFlag = false
  79. }
  80. if rddpFlag && weekFlag {
  81. if rddpMinReportItem.CreateTime.After(weekMinReportItem.CreateTime) {
  82. firstReadReportType = rddpMinReportItem.ReportType
  83. firstReadReportTitle = rddpMinReportItem.Title
  84. } else {
  85. firstReadReportType = weekMinReportItem.ReportType
  86. firstReadReportTitle = weekMinReportItem.Title
  87. }
  88. } else {
  89. if rddpFlag == false && weekFlag {
  90. firstReadReportType = weekMinReportItem.ReportType
  91. firstReadReportTitle = weekMinReportItem.Title
  92. }
  93. if rddpFlag && weekFlag == false {
  94. firstReadReportType = rddpMinReportItem.ReportType
  95. firstReadReportTitle = rddpMinReportItem.Title
  96. }
  97. }
  98. return
  99. }
  100. type Listen struct {
  101. Count int
  102. VideoPlaySeconds float64
  103. }
  104. func GetRddpListen(uid int, startDate string) (item *Listen, err error) {
  105. o := orm.NewOrm()
  106. o.Using("rddp")
  107. sql := ` SELECT COUNT(1) AS count,SUM(b.video_play_seconds) AS video_play_seconds FROM report_audio_record AS a
  108. INNER JOIN report AS b ON a.report_id=b.id
  109. WHERE user_id=? AND a.create_time>=? LIMIT 1`
  110. err = o.Raw(sql, uid, startDate).QueryRow(&item)
  111. return
  112. }
  113. func GetWeekListen(uid int, startDate string) (item *Listen, err error) {
  114. o := orm.NewOrm()
  115. sql := `SELECT COUNT(1) AS count,SUM(b.video_play_seconds) AS video_play_seconds FROM voice_record AS a
  116. INNER JOIN teleconference AS b ON a.teleconference_id=b.teleconference_id
  117. WHERE a.uid=? AND a.create_time>=? LIMIT 1`
  118. err = o.Raw(sql, uid, startDate).QueryRow(&item)
  119. return
  120. }
  121. func GetListenInfo(uid int, startDate string) (count int, videoPlaySeconds float64, err error) {
  122. rddpFlag := true
  123. weekFlag := true
  124. rddpListenItem, err := GetRddpListen(uid, startDate)
  125. if err != nil {
  126. if err.Error() == utils.ErrNoRow() {
  127. rddpFlag = false
  128. } else {
  129. return
  130. }
  131. }
  132. if rddpListenItem == nil {
  133. rddpFlag = false
  134. }
  135. weekListenItem, err := GetWeekListen(uid, startDate)
  136. if err != nil {
  137. if err.Error() == utils.ErrNoRow() {
  138. weekFlag = false
  139. } else {
  140. return
  141. }
  142. }
  143. if weekListenItem == nil {
  144. weekFlag = false
  145. }
  146. if rddpFlag && weekFlag {
  147. count = rddpListenItem.Count + weekListenItem.Count
  148. videoPlaySeconds = rddpListenItem.VideoPlaySeconds + weekListenItem.VideoPlaySeconds
  149. } else {
  150. if rddpFlag == false && weekFlag {
  151. count = weekListenItem.Count
  152. videoPlaySeconds = weekListenItem.VideoPlaySeconds
  153. }
  154. if rddpFlag && weekFlag == false {
  155. count = rddpListenItem.Count
  156. videoPlaySeconds = rddpListenItem.VideoPlaySeconds
  157. }
  158. }
  159. return
  160. }
  161. type LatestReadReport struct {
  162. LatestTime string
  163. CreateTime time.Time
  164. }
  165. func GetRddpLatestReadReport(uid int, startDate string) (item *LatestReadReport, err error) {
  166. o := orm.NewOrm()
  167. o.Using("rddp")
  168. sql := ` SELECT DATE_FORMAT(create_time,'%H:%i:%s') AS latest_time,create_time FROM report_view_record
  169. WHERE user_id=? AND create_time>=? AND (DATE_FORMAT(create_time,'%H:%i:%s')<='06:00:00' OR DATE_FORMAT(create_time,'%H:%i:%s')>'06:00:00')
  170. ORDER BY DATE_FORMAT(create_time,'%H:%i:%s') DESC
  171. LIMIT 1 `
  172. err = o.Raw(sql, uid, startDate).QueryRow(&item)
  173. return
  174. }
  175. func GetWeekLatestReadReportCount(uid int, startDate string) (item *LatestReadReport, err error) {
  176. o := orm.NewOrm()
  177. sql := ` SELECT DATE_FORMAT(created_time,'%H:%i:%s') AS latest_time,created_time FROM user_view_history
  178. WHERE user_id=? AND created_time>=? AND (DATE_FORMAT(created_time,'%H:%i:%s')<='06:00:00' OR DATE_FORMAT(created_time,'%H:%i:%s')>'06:00:00')
  179. ORDER BY DATE_FORMAT(created_time,'%H:%i:%s') DESC
  180. LIMIT 1 `
  181. err = o.Raw(sql, uid, startDate).QueryRow(&item)
  182. return
  183. }
  184. func GetLatestReadReportInfo(uid int, startDate string) (latestTime string, latestCreateTime time.Time, err error) {
  185. rddpFlag := true
  186. weekFlag := true
  187. rddpReadReportItem, err := GetRddpLatestReadReport(uid, startDate)
  188. if err != nil {
  189. if err.Error() == utils.ErrNoRow() {
  190. rddpFlag = false
  191. } else {
  192. return
  193. }
  194. }
  195. if rddpReadReportItem == nil {
  196. rddpFlag = false
  197. }
  198. weekReadReportItem, err := GetWeekLatestReadReportCount(uid, startDate)
  199. if err != nil {
  200. if err.Error() == utils.ErrNoRow() {
  201. weekFlag = false
  202. } else {
  203. return
  204. }
  205. }
  206. if weekReadReportItem == nil {
  207. weekFlag = false
  208. }
  209. if rddpFlag && weekFlag {
  210. if rddpReadReportItem.CreateTime.After(weekReadReportItem.CreateTime) {
  211. latestTime = rddpReadReportItem.LatestTime
  212. latestCreateTime = rddpReadReportItem.CreateTime
  213. } else {
  214. latestTime = weekReadReportItem.LatestTime
  215. latestCreateTime = weekReadReportItem.CreateTime
  216. }
  217. } else {
  218. if rddpFlag == false && weekFlag {
  219. latestTime = weekReadReportItem.LatestTime
  220. latestCreateTime = weekReadReportItem.CreateTime
  221. }
  222. if rddpFlag && weekFlag == false {
  223. latestTime = rddpReadReportItem.LatestTime
  224. latestCreateTime = rddpReadReportItem.CreateTime
  225. }
  226. }
  227. fmt.Println("line 244")
  228. fmt.Println(latestTime, latestCreateTime)
  229. return
  230. }
  231. type MaxReadReportCount struct {
  232. Count int
  233. CreateDate time.Time
  234. }
  235. func GetRddpMaxReadReportCount(uid int, startDate string) (item *MaxReadReportCount, err error) {
  236. o := orm.NewOrm()
  237. o.Using("rddp")
  238. sql := ` SELECT DATE(create_time)AS create_date,COUNT(1) AS count FROM report_view_record AS a
  239. WHERE a.user_id=?
  240. AND create_time>=?
  241. GROUP BY DATE(create_time)
  242. ORDER BY count DESC
  243. LIMIT 1 `
  244. err = o.Raw(sql, uid, startDate).QueryRow(&item)
  245. return
  246. }
  247. func GetWeekMaxReadReportCount(uid int, startDate string) (item *MaxReadReportCount, err error) {
  248. o := orm.NewOrm()
  249. sql := ` SELECT DATE(a.created_time)AS create_date,COUNT(1) AS count FROM user_view_history AS a
  250. WHERE a.user_id=? AND created_time>=?
  251. GROUP BY DATE(created_time)
  252. ORDER BY count DESC
  253. LIMIT 1 `
  254. err = o.Raw(sql, uid, startDate).QueryRow(&item)
  255. return
  256. }
  257. func GetMaxReadReportInfo(uid int, startDate string) (count int, createDate time.Time, err error) {
  258. rddpFlag := true
  259. weekFlag := true
  260. rddpReadReportItem, err := GetRddpMaxReadReportCount(uid, startDate)
  261. if err != nil {
  262. if err.Error() == utils.ErrNoRow() {
  263. rddpFlag = false
  264. } else {
  265. return
  266. }
  267. }
  268. if rddpReadReportItem == nil {
  269. rddpFlag = false
  270. }
  271. weekReadReportItem, err := GetWeekMaxReadReportCount(uid, startDate)
  272. if err != nil {
  273. if err.Error() == utils.ErrNoRow() {
  274. weekFlag = false
  275. } else {
  276. return
  277. }
  278. }
  279. if weekReadReportItem == nil {
  280. weekFlag = false
  281. }
  282. if rddpFlag && weekFlag {
  283. if rddpReadReportItem.Count > weekReadReportItem.Count {
  284. count = rddpReadReportItem.Count
  285. createDate = rddpReadReportItem.CreateDate
  286. } else {
  287. count = weekReadReportItem.Count
  288. createDate = weekReadReportItem.CreateDate
  289. }
  290. } else {
  291. if rddpFlag == false && weekFlag {
  292. count = weekReadReportItem.Count
  293. createDate = weekReadReportItem.CreateDate
  294. }
  295. if rddpFlag && weekFlag == false {
  296. count = rddpReadReportItem.Count
  297. createDate = rddpReadReportItem.CreateDate
  298. }
  299. }
  300. return
  301. }
  302. func GetRddpReadReportCountByDate(uid int, readDate string) (count int, video_play_seconds float64, err error) {
  303. o := orm.NewOrm()
  304. o.Using("rddp")
  305. sql := ` SELECT COUNT(1) AS count,SUM(b.video_play_seconds) AS video_play_seconds FROM report_view_record AS a
  306. LEFT JOIN report AS b ON a.report_id=b.id
  307. WHERE a.user_id=? AND DATE(a.create_time)=? LIMIT 1`
  308. err = o.Raw(sql, uid, readDate).QueryRow(&count, &video_play_seconds)
  309. return
  310. }
  311. func GetWeekReadReportCountByDate(uid int, readDate string) (count int, err error) {
  312. o := orm.NewOrm()
  313. sql := ` SELECT COUNT(1) AS count FROM user_view_history AS a
  314. WHERE a.user_id=? AND DATE(a.created_time)=?
  315. LIMIT 1 `
  316. err = o.Raw(sql, uid, readDate).QueryRow(&count)
  317. return
  318. }
  319. type MaxOpenReport struct {
  320. OpenReportCount int
  321. ClassifyName string
  322. }
  323. func GetRddpOpenReadReport(uid int, startDate string) (item *MaxOpenReport, err error) {
  324. o := orm.NewOrm()
  325. o.Using("rddp")
  326. sql := ` SELECT COUNT(b.classify_id_second) AS open_report_count,b.classify_name_second AS classify_name
  327. FROM report_view_record AS a
  328. INNER JOIN report AS b ON a.report_id=b.id
  329. WHERE a.user_id=? AND a.create_time>=?
  330. GROUP BY b.classify_id_second
  331. ORDER BY COUNT(b.classify_id_second) DESC
  332. LIMIT 1 `
  333. err = o.Raw(sql, uid, startDate).QueryRow(&item)
  334. return
  335. }
  336. func GetWeekOpenReadReportCount(uid int, startDate string) (item *MaxOpenReport, err error) {
  337. o := orm.NewOrm()
  338. sql := ` SELECT COUNT(b.research_report_name) AS open_report_count,b.research_report_name AS classify_name
  339. FROM user_view_history AS a
  340. LEFT JOIN research_report AS b ON a.research_report_id=b.research_report_id
  341. WHERE user_id=? AND a.created_time=?
  342. GROUP BY b.research_report_name
  343. ORDER BY COUNT(b.research_report_name) DESC
  344. LIMIT 1 `
  345. err = o.Raw(sql, uid, startDate).QueryRow(&item)
  346. return
  347. }
  348. func GetOpenReadReportInfo(uid int, startDate string) (maxOpenReportClassify string, maxOpenReportCount int, err error) {
  349. rddpFlag := true
  350. weekFlag := true
  351. rddpReadReportItem, err := GetRddpOpenReadReport(uid, startDate)
  352. if err != nil {
  353. if err.Error() == utils.ErrNoRow() {
  354. rddpFlag = false
  355. } else {
  356. return
  357. }
  358. }
  359. if rddpReadReportItem == nil {
  360. rddpFlag = false
  361. }
  362. weekReadReportItem, err := GetWeekOpenReadReportCount(uid, startDate)
  363. if err != nil {
  364. if err.Error() == utils.ErrNoRow() {
  365. weekFlag = false
  366. } else {
  367. return
  368. }
  369. }
  370. if weekReadReportItem == nil {
  371. weekFlag = false
  372. }
  373. if rddpFlag && weekFlag {
  374. if rddpReadReportItem.OpenReportCount > weekReadReportItem.OpenReportCount {
  375. maxOpenReportCount = rddpReadReportItem.OpenReportCount
  376. maxOpenReportClassify = rddpReadReportItem.ClassifyName
  377. } else {
  378. maxOpenReportCount = weekReadReportItem.OpenReportCount
  379. maxOpenReportClassify = weekReadReportItem.ClassifyName
  380. }
  381. } else {
  382. if rddpFlag == false && weekFlag {
  383. maxOpenReportCount = weekReadReportItem.OpenReportCount
  384. maxOpenReportClassify = weekReadReportItem.ClassifyName
  385. }
  386. if rddpFlag && weekFlag == false {
  387. maxOpenReportCount = rddpReadReportItem.OpenReportCount
  388. maxOpenReportClassify = rddpReadReportItem.ClassifyName
  389. }
  390. }
  391. return
  392. }
  393. func GetRddpTotalReadDuration(uid int, startDate string) (video_play_seconds float64, total int, err error) {
  394. sql := `SELECT SUM(b.video_play_seconds) AS video_play_seconds ,COUNT(1) AS total FROM report_view_record AS a
  395. INNER JOIN report AS b ON a.report_id=b.id
  396. WHERE a.user_id=? AND a.create_time=? `
  397. o := orm.NewOrm()
  398. o.Using("rddp")
  399. err = o.Raw(sql, uid, startDate).QueryRow(&video_play_seconds, &total)
  400. return
  401. }
  402. func GetWeekTotalRead(uid int, startDate string) (report_count int, err error) {
  403. o := orm.NewOrm()
  404. sql := ` SELECT SUM(1) AS report_count
  405. FROM user_view_history AS a
  406. INNER JOIN research_report AS b ON a.research_report_id=b.research_report_id
  407. WHERE a.user_id=? AND a.created_time>=? `
  408. err = o.Raw(sql, uid, startDate).QueryRow(&report_count)
  409. return
  410. }
  411. func GetWeekTotalReadByType(uid int, reportType string, startDate string) (report_count int, err error) {
  412. o := orm.NewOrm()
  413. sql := `SELECT count(DISTINCT a.research_report_id) AS report_count
  414. FROM user_view_history AS a
  415. INNER JOIN research_report AS b ON a.research_report_id=b.research_report_id
  416. WHERE a.user_id=? AND a.created_time>=? AND b.type=?`
  417. err = o.Raw(sql, uid, startDate, reportType).QueryRow(&report_count)
  418. return
  419. }
  420. func GetRddpLearnDay(uid int, startDate, endDate string) (learn_day int, err error) {
  421. //, MIN(login_day) start_date,MAX(login_day) end_date
  422. o := orm.NewOrm()
  423. o.Using("rddp")
  424. sql := ` SELECT MAX(days) AS learn_day
  425. FROM (SELECT user_id,
  426. @cont_day :=
  427. (CASE
  428. WHEN (@last_uid = user_id AND DATEDIFF(login_dt, @last_dt)=1) THEN
  429. (@cont_day + 1)
  430. WHEN (@last_uid = user_id AND DATEDIFF(login_dt, @last_dt)<1) THEN
  431. (@cont_day + 0)
  432. ELSE
  433. 1
  434. END) AS days,
  435. (@cont_ix := (@cont_ix + IF(@cont_day = 1, 1, 0))) AS cont_ix,
  436. @last_uid := user_id,
  437. @last_dt := login_dt login_day
  438. FROM (SELECT user_id, DATE(create_time) AS login_dt
  439. FROM report_view_record
  440. WHERE
  441. user_id=?
  442. AND create_time>=?
  443. ORDER BY user_id, create_time) AS t,
  444. (SELECT @last_uid := '',
  445. @last_dt := '',
  446. @cont_ix := 0,
  447. @cont_day := 0) AS t1) AS t2
  448. GROUP BY user_id, cont_ix
  449. ORDER BY MAX(days) DESC
  450. LIMIT 1 `
  451. err = o.Raw(sql, uid, startDate).QueryRow(&learn_day)
  452. return
  453. }
  454. func GetWeekpLearnDay(uid int, startDate string) (learn_day int, err error) {
  455. //MIN(login_day) start_date,MAX(login_day) end_date
  456. o := orm.NewOrm()
  457. sql := ` SELECT MAX(days) lianxu_days
  458. FROM (SELECT user_id,
  459. @cont_day :=
  460. (CASE
  461. WHEN (@last_uid = user_id AND DATEDIFF(login_dt, @last_dt)=1) THEN
  462. (@cont_day + 1)
  463. WHEN (@last_uid = user_id AND DATEDIFF(login_dt, @last_dt)<1) THEN
  464. (@cont_day + 0)
  465. ELSE
  466. 1
  467. END) AS days,
  468. (@cont_ix := (@cont_ix + IF(@cont_day = 1, 1, 0))) AS cont_ix,
  469. @last_uid := user_id,
  470. @last_dt := login_dt login_day
  471. FROM (SELECT user_id, DATE(created_time) AS login_dt
  472. FROM user_view_history
  473. WHERE
  474. user_id=?
  475. AND created_time>=?
  476. ORDER BY user_id, created_time) AS t,
  477. (SELECT @last_uid := '',
  478. @last_dt := '',
  479. @cont_ix := 0,
  480. @cont_day := 0) AS t1) AS t2
  481. GROUP BY user_id, cont_ix
  482. ORDER BY MAX(days) DESC
  483. LIMIT 1 `
  484. err = o.Raw(sql, uid, startDate).QueryRow(&learn_day)
  485. return
  486. }
  487. func GetRddpTotalReadByType(uid int, startDate string) (report_count int, err error) {
  488. o := orm.NewOrm()
  489. o.Using("rddp")
  490. sql := `SELECT count(DISTINCT a.report_id) AS report_count
  491. FROM report_view_record AS a
  492. INNER JOIN report AS b ON a.report_id=b.id
  493. WHERE a.user_id=? AND a.create_time>=? `
  494. err = o.Raw(sql, uid, startDate).QueryRow(&report_count)
  495. return
  496. }