bill.go 17 KB

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