rdluck 4 سال پیش
والد
کامیت
5bd3c08dd8
4فایلهای تغییر یافته به همراه704 افزوده شده و 149 حذف شده
  1. 154 24
      controllers/bill.go
  2. 6 0
      models/annual_report.go
  3. 331 125
      models/bill.go
  4. 213 0
      services/annual_report.go

+ 154 - 24
controllers/bill.go

@@ -29,6 +29,8 @@ func (this *BillController) Detail() {
 		br.Ret = 408
 		return
 	}
+	startDate := "2020-01-01 00:00:00"
+	endDate := time.Now().Format(utils.FormatDate)
 	uid := user.UserId
 	var realName, togetherDay, createDate string
 
@@ -45,7 +47,7 @@ func (this *BillController) Detail() {
 		}
 		expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
 		togetherDay = expireDay
-		createDate = user.CreatedTime.Format(utils.FormatDate)
+		createDate = user.CreatedTime.Format("2006年01月02日")
 	} else {
 		sub := time.Now().Sub(user.LastUpdatedTime)
 		if sub < 0 {
@@ -53,54 +55,182 @@ func (this *BillController) Detail() {
 		}
 		expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
 		togetherDay = expireDay
-		createDate = user.LastUpdatedTime.Format(utils.FormatDate)
+		createDate = user.LastUpdatedTime.Format("2006年01月02日")
 	}
 
 	//uid = 41555
 
-	firstReadReportType, firstReadReportTitle, err := models.GetFirstReportInfo(uid)
-	if err != nil {
+	firstReadReportType, firstReadReportTitle, err := models.GetFirstReportInfo(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取数据失败"
 		br.ErrMsg = "获取数据失败GetFirstReportInfo,Err:" + err.Error()
 		return
 	}
-	listenCount, listenVideoPlaySeconds, err := models.GetListenInfo(uid)
-	if err != nil {
+	listenCount, listenVideoPlaySeconds, err := models.GetListenInfo(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取数据失败"
 		br.ErrMsg = "获取数据失败GetListenInfo,Err:" + err.Error()
 		return
 	}
-	maxReadReportCount, maxReadReportDate, err := models.GetMaxReadReportInfo(uid)
-	if err != nil {
+	maxReadReportCount, maxReadReportDate, err := models.GetMaxReadReportInfo(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取数据失败"
-		br.ErrMsg = "获取数据失败GetListenInfo,Err:" + err.Error()
+		br.ErrMsg = "获取数据失败GetMaxReadReportInfo,Err:" + err.Error()
+		return
+	}
+
+	latestTime, latestCreateTime, err := models.GetLatestReadReportInfo(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetLatestReadReportInfo,Err:" + err.Error()
+		return
+	}
+	var lastestCreateDate string
+	var VideoPlaySeconds float64
+	if !latestCreateTime.IsZero() {
+		lastestCreateDate = latestCreateTime.Format(utils.FormatDate)
+	}
+	if lastestCreateDate != "" {
+		rddpReadCount, rddpVideoPlaySeconds, err := models.GetRddpReadReportCountByDate(uid, lastestCreateDate)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取数据失败GetRddpReadReportCountByDate,Err:" + err.Error()
+			return
+		}
+		weekReadCount, err := models.GetWeekReadReportCountByDate(uid, lastestCreateDate)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取数据失败GetWeekReadReportCountByDate,Err:" + err.Error()
+			return
+		}
+		var weekVideoPlaySeconds float64
+		if rddpReadCount <= 0 {
+			weekVideoPlaySeconds = float64(utils.GetRandInt(3, 300)) / float64(10.00)
+		} else {
+			weekVideoPlaySeconds = float64(weekReadCount) * (rddpVideoPlaySeconds / float64(rddpReadCount))
+		}
+		VideoPlaySeconds = utils.FixFloat(rddpVideoPlaySeconds+weekVideoPlaySeconds, 2)
+	}
+
+	maxOpenReportClassify, maxOpenReportCount, err := models.GetOpenReadReportInfo(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetOpenReadReportInfo,Err:" + err.Error()
+		return
+	}
+
+	rddpTotalPlaySeconds, rddpTotal, err := models.GetRddpTotalReadDuration(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetRddpTotalReadDuration,Err:" + err.Error()
+		return
+	}
+
+	weekTotal, err := models.GetWeekTotalRead(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetRddpTotalReadDuration,Err:" + err.Error()
+		return
+	}
+	totalReadDuration := 0.00
+	if rddpTotal <= 0 {
+		totalReadDuration = rddpTotalPlaySeconds + float64(weekTotal)*(float64(utils.GetRandInt(3, 300))/float64(10.00))
+	} else {
+		totalReadDuration = rddpTotalPlaySeconds + (rddpTotalPlaySeconds/float64(rddpTotal))*float64(weekTotal)
+	}
+
+	dayType := `day`
+	dayTotal, err := models.GetWeekTotalReadByType(uid, dayType, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetWeekTotalReadByType,Err:" + err.Error() + ";report_type:" + dayType
+		return
+	}
+	weekType := `week`
+	weekReportReadTotal, err := models.GetWeekTotalReadByType(uid, weekType, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetWeekTotalReadByType,Err:" + err.Error() + ";report_type:" + weekType
+		return
+	}
+	twoWeekType := `two_week`
+	twoWeekTotal, err := models.GetWeekTotalReadByType(uid, twoWeekType, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetWeekTotalReadByType,Err:" + err.Error() + ";report_type:" + twoWeekType
+		return
+	}
+	monthType := `month`
+	monthTotal, err := models.GetWeekTotalReadByType(uid, dayType, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetWeekTotalReadByType,Err:" + err.Error() + ";report_type:" + monthType
+		return
+	}
+
+	rddpReadTotal, err := models.GetRddpTotalReadByType(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetRddpTotalReadByType,Err:" + err.Error() + ";report_type:" + monthType
 		return
 	}
 
-	/*
-	   LatestReadReportDate         string  `description:"阅读报告时间最晚的一天"`
-	   LatestReadReportTime         string  `description:"阅读报告时间最晚的一天,最晚的时间"`
-	   LatestReadReportDateDuration string  `description:"阅读报告时间最晚的一天,总共阅读报告的时长"`
-	   MaxOpenReportClassify        string  `description:"打开次数最多报告的栏目"`
-	   MaxOpenReportCount           string  `description:"打开次数最多报告的栏目下,用户阅读的报告数"`
-	   TotalReadDuration            float64 `description:"总阅读时长"`
-	   TotalReportDayCount          int     `description:"总阅读晨报数"`
-	   TotalReportWeekCount         int     `description:"总阅读周报数"`
-	   TotalReportMonthCount        int     `description:"总阅读月报数"`
-	   TotalReportTwoWeekCount      int     `description:"总阅读双周报数"`
-	   TotalReportRddpCount         int     `description:"总阅读点评数"`
-	   LearnDay                     int     `description:"连续学习天数"`
-	*/
+	var learnDay int
+	rddpLearnDay, err := models.GetRddpLearnDay(uid, startDate, endDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetRddpLearnDay,Err:" + err.Error() + ";report_type:" + monthType
+		return
+	}
 
+	weekLearnDay, err := models.GetWeekpLearnDay(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetWeekpLearnDay,Err:" + err.Error() + ";report_type:" + monthType
+		return
+	}
+	if rddpLearnDay >= weekLearnDay {
+		learnDay = rddpLearnDay
+	} else {
+		learnDay = weekLearnDay
+	}
+	if learnDay <= 0 {
+		learnDay = 1
+	}
 	resp.RealName = realName
 	resp.TogetherDay = togetherDay
 	resp.CreateDate = createDate
-	resp.FirstReadReportType = firstReadReportType
+	if firstReadReportType == "rddp" {
+		resp.FirstReadReportType = "日度点评"
+	} else if firstReadReportType == "day" {
+		resp.FirstReadReportType = "晨报"
+	} else if firstReadReportType == "week" {
+		resp.FirstReadReportType = "周报"
+	} else if firstReadReportType == "two_week" {
+		resp.FirstReadReportType = "双周报"
+	} else if firstReadReportType == "month" {
+		resp.FirstReadReportType = "月报"
+	} else {
+		resp.FirstReadReportType = "其他"
+	}
 	resp.FirstReadReportTitle = firstReadReportTitle
 	resp.ListenReportCount = listenCount
 	resp.ListenReportDuration = utils.FixFloat((listenVideoPlaySeconds / 60.00), 2)
 	resp.MaxReadReportCount = maxReadReportCount
 	resp.MaxReadReportDate = maxReadReportDate.Format(utils.FormatDate)
+	resp.LatestReadReportDate = lastestCreateDate
+	resp.LatestReadReportTime = latestTime.Format("15:04:05")
+	resp.LatestReadReportDateDuration = VideoPlaySeconds
+	resp.MaxOpenReportClassify = maxOpenReportClassify
+	resp.MaxOpenReportCount = maxOpenReportCount
+	resp.TotalReadDuration = totalReadDuration
+	resp.TotalReportDayCount = dayTotal
+	resp.TotalReportWeekCount = weekReportReadTotal
+	resp.TotalReportTwoWeekCount = twoWeekTotal
+	resp.TotalReportMonthCount = monthTotal
+	resp.TotalReportRddpCount = rddpReadTotal
+	resp.LearnDay = learnDay
+	resp.TotalReport = dayTotal + weekReportReadTotal + twoWeekTotal + monthTotal + rddpReadTotal
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 6 - 0
models/annual_report.go

@@ -0,0 +1,6 @@
+package models
+
+type AnnualReport struct {
+	CreateDate string
+	UserId     int
+}

+ 331 - 125
models/bill.go

@@ -15,19 +15,20 @@ type BillDetailResp struct {
 	ListenReportCount            int     `description:"收听报告次数"`
 	ListenReportDuration         float64 `description:"收听报告时长"`
 	MaxReadReportDate            string  `description:"阅读报告最多的一天"`
-	MaxReadReportCount           int  `description:"阅读报告最多的一天,报告数量"`
+	MaxReadReportCount           int     `description:"阅读报告最多的一天,报告数量"`
 	LatestReadReportDate         string  `description:"阅读报告时间最晚的一天"`
 	LatestReadReportTime         string  `description:"阅读报告时间最晚的一天,最晚的时间"`
-	LatestReadReportDateDuration string  `description:"阅读报告时间最晚的一天,总共阅读报告的时长"`
+	LatestReadReportDateDuration float64 `description:"阅读报告时间最晚的一天,总共阅读报告的时长"`
 	MaxOpenReportClassify        string  `description:"打开次数最多报告的栏目"`
-	MaxOpenReportCount           string  `description:"打开次数最多报告的栏目下,用户阅读的报告数"`
-	TotalReadDuration            string  `description:"总阅读时长"`
-	TotalReportDayCount          string  `description:"总阅读晨报数"`
-	TotalReportWeekCount         string  `description:"总阅读周报数"`
-	TotalReportMonthCount        string  `description:"总阅读月报数"`
-	TotalReportTwoWeekCount      string  `description:"总阅读双周报数"`
-	TotalReportRddpCount         string  `description:"总阅读点评数"`
-	LearnDay                     string  `description:"连续学习天数"`
+	MaxOpenReportCount           int     `description:"打开次数最多报告的栏目下,用户阅读的报告数"`
+	TotalReadDuration            float64 `description:"总阅读时长"`
+	TotalReportDayCount          int     `description:"总阅读晨报数"`
+	TotalReportWeekCount         int     `description:"总阅读周报数"`
+	TotalReportMonthCount        int     `description:"总阅读月报数"`
+	TotalReportTwoWeekCount      int     `description:"总阅读双周报数"`
+	TotalReportRddpCount         int     `description:"总阅读点评数"`
+	TotalReport                  int     `description:"总阅读报告数"`
+	LearnDay                     int     `description:"连续学习天数"`
 }
 
 type ReadReportType struct {
@@ -37,29 +38,29 @@ type ReadReportType struct {
 	Stage      int
 }
 
-func GetRddpMinReportType(uid int) (item *ReadReportType, err error) {
+func GetRddpMinReportType(uid int, startDate string) (item *ReadReportType, err error) {
 	o := orm.NewOrm()
 	o.Using("rddp")
 	sql := `SELECT 'rddp' AS report_type,MIN(a.create_time) AS create_time,b.title,b.stage FROM report_view_record AS a
 			INNER JOIN  report AS b ON a.report_id=b.id
-			WHERE a.user_id=? `
-	err = o.Raw(sql, uid).QueryRow(&item)
+			WHERE a.user_id=? AND a.create_time>=? `
+	err = o.Raw(sql, uid, startDate).QueryRow(&item)
 	return
 }
 
-func GetWeekMinReportType(uid int) (item *ReadReportType, err error) {
+func GetWeekMinReportType(uid int, startDate string) (item *ReadReportType, err error) {
 	o := orm.NewOrm()
 	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
 			INNER JOIN  research_report AS b ON a.research_report_id=b.research_report_id
-			WHERE a.user_id=? `
-	err = o.Raw(sql, uid).QueryRow(&item)
+			WHERE a.user_id=? AND a.created_time>=? `
+	err = o.Raw(sql, uid, startDate).QueryRow(&item)
 	return
 }
 
-func GetFirstReportInfo(uid int) (firstReadReportType, firstReadReportTitle string, err error) {
+func GetFirstReportInfo(uid int, startDate string) (firstReadReportType, firstReadReportTitle string, err error) {
 	rddpFlag := true
 	weekFlag := true
-	rddpMinReportItem, err := GetRddpMinReportType(uid)
+	rddpMinReportItem, err := GetRddpMinReportType(uid, startDate)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
 			rddpFlag = false
@@ -70,7 +71,7 @@ func GetFirstReportInfo(uid int) (firstReadReportType, firstReadReportTitle stri
 	if rddpMinReportItem == nil {
 		rddpFlag = false
 	}
-	weekMinReportItem, err := GetWeekMinReportType(uid)
+	weekMinReportItem, err := GetWeekMinReportType(uid, startDate)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
 			weekFlag = false
@@ -108,29 +109,29 @@ type Listen struct {
 	VideoPlaySeconds float64
 }
 
-func GetRddpListen(uid int) (item *Listen, err error) {
+func GetRddpListen(uid int, startDate string) (item *Listen, err error) {
 	o := orm.NewOrm()
 	o.Using("rddp")
-	sql := ` SELECT COUNT(1),SUM(b.video_play_seconds) FROM  report_audio_record AS a
+	sql := ` SELECT COUNT(1) AS count,SUM(b.video_play_seconds) AS video_play_seconds FROM  report_audio_record AS a
 			 INNER JOIN report AS b ON a.report_id=b.id
-			 WHERE user_id=? LIMIT 1`
-	err = o.Raw(sql, uid).QueryRow(&item)
+			 WHERE user_id=? AND a.create_time>=? LIMIT 1`
+	err = o.Raw(sql, uid, startDate).QueryRow(&item)
 	return
 }
 
-func GetWeekListen(uid int) (item *Listen, err error) {
+func GetWeekListen(uid int, startDate string) (item *Listen, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT COUNT(1) AS count,SUM(b.video_play_seconds) AS video_play_seconds FROM voice_record AS a
 			INNER JOIN teleconference AS b ON a.teleconference_id=b.teleconference_id
-			WHERE a.uid=? LIMIT 1`
-	err = o.Raw(sql, uid).QueryRow(&item)
+			WHERE a.uid=? AND a.create_time>=? LIMIT 1`
+	err = o.Raw(sql, uid, startDate).QueryRow(&item)
 	return
 }
 
-func GetListenInfo(uid int) (count int, videoPlaySeconds float64, err error) {
+func GetListenInfo(uid int, startDate string) (count int, videoPlaySeconds float64, err error) {
 	rddpFlag := true
 	weekFlag := true
-	rddpListenItem, err := GetRddpListen(uid)
+	rddpListenItem, err := GetRddpListen(uid, startDate)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
 			rddpFlag = false
@@ -141,7 +142,7 @@ func GetListenInfo(uid int) (count int, videoPlaySeconds float64, err error) {
 	if rddpListenItem == nil {
 		rddpFlag = false
 	}
-	weekListenItem, err := GetWeekListen(uid)
+	weekListenItem, err := GetWeekListen(uid, startDate)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
 			weekFlag = false
@@ -169,38 +170,112 @@ func GetListenInfo(uid int) (count int, videoPlaySeconds float64, err error) {
 	return
 }
 
+type LatestReadReport struct {
+	LatestTime time.Time
+	CreateTime time.Time
+}
+
+func GetRddpLatestReadReport(uid int, startDate string) (item *LatestReadReport, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := ` SELECT DATE_FORMAT(create_time,'%H:%i:%s') AS latest_time,create_time FROM report_view_record
+			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')
+			ORDER BY DATE_FORMAT(create_time,'%H:%i:%s')  DESC
+			LIMIT 1 `
+	err = o.Raw(sql, uid, startDate).QueryRow(&item)
+	return
+}
+
+func GetWeekLatestReadReportCount(uid int, startDate string) (item *LatestReadReport, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT DATE_FORMAT(created_time,'%H:%i:%s') AS latest_time,created_time FROM user_view_history 
+			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')
+			ORDER BY DATE_FORMAT(created_time,'%H:%i:%s')  DESC
+			LIMIT 1 `
+	err = o.Raw(sql, uid, startDate).QueryRow(&item)
+	return
+}
+
+func GetLatestReadReportInfo(uid int, startDate string) (latestTime, latestCreateTime time.Time, err error) {
+	rddpFlag := true
+	weekFlag := true
+	rddpReadReportItem, err := GetRddpLatestReadReport(uid, startDate)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			rddpFlag = false
+		} else {
+			return
+		}
+	}
+	if rddpReadReportItem == nil {
+		rddpFlag = false
+	}
+	weekReadReportItem, err := GetWeekLatestReadReportCount(uid, startDate)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			weekFlag = false
+		} else {
+			return
+		}
+	}
+	if weekReadReportItem == nil {
+		weekFlag = false
+	}
+
+	if rddpFlag && weekFlag {
+		if rddpReadReportItem.CreateTime.After(weekReadReportItem.CreateTime) {
+			latestTime = rddpReadReportItem.LatestTime
+			latestCreateTime = rddpReadReportItem.CreateTime
+		} else {
+			latestTime = weekReadReportItem.LatestTime
+			latestCreateTime = weekReadReportItem.CreateTime
+		}
+	} else {
+		if rddpFlag == false && weekFlag {
+			latestTime = weekReadReportItem.LatestTime
+			latestCreateTime = weekReadReportItem.CreateTime
+		}
+		if rddpFlag && weekFlag == false {
+			latestTime = rddpReadReportItem.LatestTime
+			latestCreateTime = rddpReadReportItem.CreateTime
+		}
+	}
+	return
+}
+
 type MaxReadReportCount struct {
 	Count      int
 	CreateDate time.Time
 }
 
-func GetRddpMaxReadReportCount(uid int) (item *MaxReadReportCount, err error) {
+func GetRddpMaxReadReportCount(uid int, startDate string) (item *MaxReadReportCount, err error) {
 	o := orm.NewOrm()
 	o.Using("rddp")
 	sql := ` SELECT DATE(create_time)AS create_date,COUNT(1) AS count FROM report_view_record AS a
 				WHERE a.user_id=?
+                AND create_time>=?
 				GROUP BY DATE(create_time)
-				ORDER BY num DESC
+				ORDER BY count DESC
 				LIMIT 1 `
-	err = o.Raw(sql, uid).QueryRow(&item)
+	err = o.Raw(sql, uid, startDate).QueryRow(&item)
 	return
 }
 
-func GetWeekMaxReadReportCount(uid int) (item *MaxReadReportCount, err error) {
+func GetWeekMaxReadReportCount(uid int, startDate string) (item *MaxReadReportCount, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT DATE(a.created_time)AS create_date,COUNT(1) AS count  FROM user_view_history AS a
-			WHERE a.user_id=?
+			WHERE a.user_id=? AND created_time>=?
 			GROUP BY DATE(created_time)
-			ORDER BY num DESC
+			ORDER BY count DESC
 			LIMIT 1 `
-	err = o.Raw(sql, uid).QueryRow(&item)
+	err = o.Raw(sql, uid, startDate).QueryRow(&item)
 	return
 }
 
-func GetMaxReadReportInfo(uid int) (count int, createDate time.Time, err error) {
+func GetMaxReadReportInfo(uid int, startDate string) (count int, createDate time.Time, err error) {
 	rddpFlag := true
 	weekFlag := true
-	rddpReadReportItem, err := GetRddpMaxReadReportCount(uid)
+	rddpReadReportItem, err := GetRddpMaxReadReportCount(uid, startDate)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
 			rddpFlag = false
@@ -211,7 +286,7 @@ func GetMaxReadReportInfo(uid int) (count int, createDate time.Time, err error)
 	if rddpReadReportItem == nil {
 		rddpFlag = false
 	}
-	weekReadReportItem, err := GetWeekMaxReadReportCount(uid)
+	weekReadReportItem, err := GetWeekMaxReadReportCount(uid, startDate)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
 			weekFlag = false
@@ -224,99 +299,230 @@ func GetMaxReadReportInfo(uid int) (count int, createDate time.Time, err error)
 	}
 
 	if rddpFlag && weekFlag {
-		if rddpReadReportItem.Count>weekReadReportItem.Count {
-			count=rddpReadReportItem.Count
-			createDate=rddpReadReportItem.CreateDate
-		}else{
-			count=weekReadReportItem.Count
-			createDate=weekReadReportItem.CreateDate
+		if rddpReadReportItem.Count > weekReadReportItem.Count {
+			count = rddpReadReportItem.Count
+			createDate = rddpReadReportItem.CreateDate
+		} else {
+			count = weekReadReportItem.Count
+			createDate = weekReadReportItem.CreateDate
 		}
 	} else {
 		if rddpFlag == false && weekFlag {
-			count=weekReadReportItem.Count
-			createDate=weekReadReportItem.CreateDate
+			count = weekReadReportItem.Count
+			createDate = weekReadReportItem.CreateDate
 		}
 		if rddpFlag && weekFlag == false {
-			count=rddpReadReportItem.Count
-			createDate=rddpReadReportItem.CreateDate
+			count = rddpReadReportItem.Count
+			createDate = rddpReadReportItem.CreateDate
 		}
 	}
 	return
 }
 
-//
-//
-//type MaxReadReportCount struct {
-//	Count      int
-//	CreateDate time.Time
-//}
-//
-//func GetRddpMaxReadReportCount(uid int) (item *MaxReadReportCount, err error) {
-//	o := orm.NewOrm()
-//	o.Using("rddp")
-//	sql := ` SELECT DATE(create_time)AS create_date,COUNT(1) AS count FROM report_view_record AS a
-//				WHERE a.user_id=?
-//				GROUP BY DATE(create_time)
-//				ORDER BY num DESC
-//				LIMIT 1 `
-//	err = o.Raw(sql, uid).QueryRow(&item)
-//	return
-//}
-//
-//func GetWeekMaxReadReportCount(uid int) (item *MaxReadReportCount, err error) {
-//	o := orm.NewOrm()
-//	sql := ` SELECT DATE(a.created_time)AS create_date,COUNT(1) AS count  FROM user_view_history AS a
-//			WHERE a.user_id=?
-//			GROUP BY DATE(created_time)
-//			ORDER BY num DESC
-//			LIMIT 1 `
-//	err = o.Raw(sql, uid).QueryRow(&item)
-//	return
-//}
-//
-//func GetMaxReadReportInfo(uid int) (count int, createDate time.Time, err error) {
-//	rddpFlag := true
-//	weekFlag := true
-//	rddpReadReportItem, err := GetRddpMaxReadReportCount(uid)
-//	if err != nil {
-//		if err.Error() == utils.ErrNoRow() {
-//			rddpFlag = false
-//		} else {
-//			return
-//		}
-//	}
-//	if rddpReadReportItem == nil {
-//		rddpFlag = false
-//	}
-//	weekReadReportItem, err := GetWeekMaxReadReportCount(uid)
-//	if err != nil {
-//		if err.Error() == utils.ErrNoRow() {
-//			weekFlag = false
-//		} else {
-//			return
-//		}
-//	}
-//	if weekReadReportItem == nil {
-//		weekFlag = false
-//	}
-//
-//	if rddpFlag && weekFlag {
-//		if rddpReadReportItem.Count>weekReadReportItem.Count {
-//			count=rddpReadReportItem.Count
-//			createDate=rddpReadReportItem.CreateDate
-//		}else{
-//			count=weekReadReportItem.Count
-//			createDate=weekReadReportItem.CreateDate
-//		}
-//	} else {
-//		if rddpFlag == false && weekFlag {
-//			count=weekReadReportItem.Count
-//			createDate=weekReadReportItem.CreateDate
-//		}
-//		if rddpFlag && weekFlag == false {
-//			count=rddpReadReportItem.Count
-//			createDate=rddpReadReportItem.CreateDate
-//		}
-//	}
-//	return
-//}
+func GetRddpReadReportCountByDate(uid int, readDate string) (count int, video_play_seconds float64, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := `  SELECT COUNT(1) AS count,SUM(b.video_play_seconds) AS video_play_seconds FROM  report_view_record AS a
+			LEFT JOIN report AS b ON a.report_id=b.id
+			 WHERE a.user_id=? AND DATE(a.create_time)=? LIMIT 1`
+	err = o.Raw(sql, uid, readDate).QueryRow(&count, &video_play_seconds)
+	return
+}
+
+func GetWeekReadReportCountByDate(uid int, readDate string) (count int, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT COUNT(1) AS count FROM user_view_history  AS a
+			WHERE a.user_id=? AND DATE(a.created_time)=?
+			LIMIT 1 `
+	err = o.Raw(sql, uid, readDate).QueryRow(&count)
+	return
+}
+
+type MaxOpenReport struct {
+	OpenReportCount int
+	ClassifyName    string
+}
+
+func GetRddpOpenReadReport(uid int, startDate string) (item *MaxOpenReport, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := ` SELECT COUNT(b.classify_id_second) AS report_count,b.classify_name_second AS classify_name 
+            FROM report_view_record AS a
+			INNER JOIN report AS b ON a.report_id=b.id
+			WHERE a.user_id=? AND a.create_time>=?
+			GROUP BY b.classify_id_second
+			ORDER BY COUNT(b.classify_id_second) DESC
+			LIMIT 1 `
+	err = o.Raw(sql, uid, startDate).QueryRow(&item)
+	return
+}
+
+func GetWeekOpenReadReportCount(uid int, startDate string) (item *MaxOpenReport, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT COUNT(b.research_report_name) AS report_count,b.research_report_name AS classify_name 
+            FROM user_view_history AS a 
+			LEFT JOIN research_report AS b ON a.research_report_id=b.research_report_id
+			WHERE user_id=? AND a.created_time=?
+			GROUP BY b.research_report_name
+			ORDER BY COUNT(b.research_report_name) DESC
+			LIMIT 1  `
+	err = o.Raw(sql, uid, startDate).QueryRow(&item)
+	return
+}
+
+func GetOpenReadReportInfo(uid int, startDate string) (maxOpenReportClassify string, maxOpenReportCount int, err error) {
+	rddpFlag := true
+	weekFlag := true
+	rddpReadReportItem, err := GetRddpOpenReadReport(uid, startDate)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			rddpFlag = false
+		} else {
+			return
+		}
+	}
+	if rddpReadReportItem == nil {
+		rddpFlag = false
+	}
+	weekReadReportItem, err := GetWeekOpenReadReportCount(uid, startDate)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			weekFlag = false
+		} else {
+			return
+		}
+	}
+	if weekReadReportItem == nil {
+		weekFlag = false
+	}
+
+	if rddpFlag && weekFlag {
+		if rddpReadReportItem.OpenReportCount > weekReadReportItem.OpenReportCount {
+			maxOpenReportCount = rddpReadReportItem.OpenReportCount
+			maxOpenReportClassify = rddpReadReportItem.ClassifyName
+		} else {
+			maxOpenReportCount = weekReadReportItem.OpenReportCount
+			maxOpenReportClassify = weekReadReportItem.ClassifyName
+		}
+	} else {
+		if rddpFlag == false && weekFlag {
+			maxOpenReportCount = weekReadReportItem.OpenReportCount
+			maxOpenReportClassify = weekReadReportItem.ClassifyName
+		}
+		if rddpFlag && weekFlag == false {
+			maxOpenReportCount = rddpReadReportItem.OpenReportCount
+			maxOpenReportClassify = rddpReadReportItem.ClassifyName
+		}
+	}
+	return
+}
+
+func GetRddpTotalReadDuration(uid int, startDate string) (video_play_seconds float64, total int, err error) {
+	sql := `SELECT SUM(b.video_play_seconds) AS video_play_seconds ,COUNT(1) AS total FROM  report_view_record AS a
+          INNER JOIN report AS b ON a.report_id=b.id
+          WHERE a.user_id=? AND  a.create_time=? `
+	o := orm.NewOrm()
+	o.Using("rddp")
+	err = o.Raw(sql, uid, startDate).QueryRow(&video_play_seconds, &total)
+	return
+}
+
+func GetWeekTotalRead(uid int, startDate string) (report_count int, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT SUM(1) AS report_count
+			FROM user_view_history AS a 
+			INNER JOIN research_report AS b ON a.research_report_id=b.research_report_id
+			WHERE a.user_id=? AND a.created_time>=? `
+	err = o.Raw(sql, uid, startDate).QueryRow(&report_count)
+	return
+}
+
+func GetWeekTotalReadByType(uid int, reportType string, startDate string) (report_count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT count(DISTINCT a.research_report_id) AS report_count
+            FROM user_view_history AS a 
+			INNER JOIN research_report AS b ON a.research_report_id=b.research_report_id
+			WHERE a.user_id=? AND a.created_time>=?  AND b.type=?`
+	err = o.Raw(sql, uid, startDate, reportType).QueryRow(&report_count)
+	return
+}
+
+func GetRddpLearnDay(uid int, startDate, endDate string) (learn_day int, err error) {
+	//, MIN(login_day) start_date,MAX(login_day) end_date
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := ` SELECT MAX(days) AS learn_day
+  FROM (SELECT user_id,
+               @cont_day :=
+               (CASE
+                 WHEN (@last_uid = user_id AND DATEDIFF(login_dt, @last_dt)=1) THEN
+                  (@cont_day + 1)
+                 WHEN (@last_uid = user_id AND DATEDIFF(login_dt, @last_dt)<1) THEN
+                  (@cont_day + 0)
+                 ELSE
+                  1
+               END) AS days,
+               (@cont_ix := (@cont_ix + IF(@cont_day = 1, 1, 0))) AS cont_ix,
+               @last_uid := user_id,
+               @last_dt := login_dt login_day
+          FROM (SELECT user_id, DATE(create_time) AS login_dt
+                  FROM  report_view_record
+                  WHERE 
+                  user_id=?
+                  AND create_time>=?
+                 ORDER BY user_id, create_time) AS t,
+               (SELECT @last_uid := '',
+                       @last_dt  := '',
+                       @cont_ix  := 0,
+                       @cont_day := 0) AS t1) AS t2
+ GROUP BY user_id, cont_ix
+ ORDER BY MAX(days) DESC
+ LIMIT 1 `
+	err = o.Raw(sql, uid, startDate).QueryRow(&learn_day)
+	return
+}
+
+func GetWeekpLearnDay(uid int, startDate string) (learn_day int, err error) {
+	//MIN(login_day) start_date,MAX(login_day) end_date
+	o := orm.NewOrm()
+	sql := ` SELECT MAX(days) lianxu_days
+			  FROM (SELECT user_id,
+						   @cont_day :=
+						   (CASE
+							 WHEN (@last_uid = user_id AND DATEDIFF(login_dt, @last_dt)=1) THEN
+							  (@cont_day + 1)
+							 WHEN (@last_uid = user_id AND DATEDIFF(login_dt, @last_dt)<1) THEN
+							  (@cont_day + 0)
+							 ELSE
+							  1
+						   END) AS days,
+						   (@cont_ix := (@cont_ix + IF(@cont_day = 1, 1, 0))) AS cont_ix,
+						   @last_uid := user_id,
+						   @last_dt := login_dt login_day
+					  FROM (SELECT user_id, DATE(created_time) AS login_dt
+							  FROM user_view_history
+							  WHERE 
+							  user_id=?
+							  AND created_time>=?
+							 ORDER BY user_id, created_time) AS t,
+						   (SELECT @last_uid := '',
+								   @last_dt  := '',
+								   @cont_ix  := 0,
+								   @cont_day := 0) AS t1) AS t2
+			 GROUP BY user_id, cont_ix
+			 ORDER BY MAX(days) DESC
+			 LIMIT 1 `
+	err = o.Raw(sql, uid, startDate).QueryRow(&learn_day)
+	return
+}
+
+func GetRddpTotalReadByType(uid int, startDate string) (report_count int, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := `SELECT count(DISTINCT a.report_id) AS report_count
+            FROM report_view_record AS a 
+			INNER JOIN report AS b ON a.report_id=b.id
+			WHERE a.user_id=? AND a.create_time>=? `
+	err = o.Raw(sql, uid, startDate).QueryRow(&report_count)
+	return
+}

+ 213 - 0
services/annual_report.go

@@ -0,0 +1,213 @@
+package services
+
+import (
+	"fmt"
+	"hongze/hongze_api/models"
+	"hongze/hongze_api/utils"
+	"time"
+)
+
+func CreateAnnualReport() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+
+	}()
+	startDate := "2020-01-01 00:00:00"
+	endDate := time.Now().Format(utils.FormatDate)
+	uid := 123
+	user,err:=models.GetWxUserItemByUserId(uid)
+	if err!=nil {
+
+	}
+	var realName, togetherDay, createDate string
+
+	resp := new(models.BillDetailResp)
+	if user.RealName == "" {
+		realName = user.NickName
+	} else {
+		realName = user.RealName
+	}
+	if !user.CreatedTime.IsZero() {
+		sub := time.Now().Sub(user.CreatedTime)
+		if sub < 0 {
+			sub = 0
+		}
+		expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
+		togetherDay = expireDay
+		createDate = user.CreatedTime.Format(utils.FormatDate)
+	} else {
+		sub := time.Now().Sub(user.LastUpdatedTime)
+		if sub < 0 {
+			sub = 0
+		}
+		expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
+		togetherDay = expireDay
+		createDate = user.LastUpdatedTime.Format(utils.FormatDate)
+	}
+
+	//uid = 41555
+
+	firstReadReportType, firstReadReportTitle, err := models.GetFirstReportInfo(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetFirstReportInfo,Err:" + err.Error()
+		return
+	}
+	listenCount, listenVideoPlaySeconds, err := models.GetListenInfo(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetListenInfo,Err:" + err.Error()
+		return
+	}
+	maxReadReportCount, maxReadReportDate, err := models.GetMaxReadReportInfo(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetMaxReadReportInfo,Err:" + err.Error()
+		return
+	}
+
+	latestTime, latestCreateTime, err := models.GetLatestReadReportInfo(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetLatestReadReportInfo,Err:" + err.Error()
+		return
+	}
+	var lastestCreateDate string
+	var VideoPlaySeconds float64
+	if !latestCreateTime.IsZero() {
+		lastestCreateDate = latestCreateTime.Format(utils.FormatDate)
+	}
+	if lastestCreateDate != "" {
+		rddpReadCount, rddpVideoPlaySeconds, err := models.GetRddpReadReportCountByDate(uid, lastestCreateDate)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取数据失败GetRddpReadReportCountByDate,Err:" + err.Error()
+			return
+		}
+		weekReadCount, err := models.GetWeekReadReportCountByDate(uid, lastestCreateDate)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取数据失败GetWeekReadReportCountByDate,Err:" + err.Error()
+			return
+		}
+		var weekVideoPlaySeconds float64
+		if rddpReadCount <= 0 {
+			weekVideoPlaySeconds = float64(utils.GetRandInt(3, 300)) / float64(10.00)
+		} else {
+			weekVideoPlaySeconds = float64(weekReadCount) * (rddpVideoPlaySeconds / float64(rddpReadCount))
+		}
+		VideoPlaySeconds = utils.FixFloat(rddpVideoPlaySeconds+weekVideoPlaySeconds, 2)
+	}
+
+	maxOpenReportClassify, maxOpenReportCount, err := models.GetOpenReadReportInfo(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetOpenReadReportInfo,Err:" + err.Error()
+		return
+	}
+
+	rddpTotalPlaySeconds, rddpTotal, err := models.GetRddpTotalReadDuration(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetRddpTotalReadDuration,Err:" + err.Error()
+		return
+	}
+
+	weekTotal, err := models.GetWeekTotalRead(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetRddpTotalReadDuration,Err:" + err.Error()
+		return
+	}
+	totalReadDuration := 0.00
+	if rddpTotal <= 0 {
+		totalReadDuration = rddpTotalPlaySeconds + float64(weekTotal)*(float64(utils.GetRandInt(3, 300))/float64(10.00))
+	} else {
+		totalReadDuration = rddpTotalPlaySeconds + (rddpTotalPlaySeconds/float64(rddpTotal))*float64(weekTotal)
+	}
+
+	dayType := `day`
+	dayTotal, err := models.GetWeekTotalReadByType(uid, dayType, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetWeekTotalReadByType,Err:" + err.Error() + ";report_type:" + dayType
+		return
+	}
+	weekType := `week`
+	weekReportReadTotal, err := models.GetWeekTotalReadByType(uid, weekType, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetWeekTotalReadByType,Err:" + err.Error() + ";report_type:" + weekType
+		return
+	}
+	twoWeekType := `two_week`
+	twoWeekTotal, err := models.GetWeekTotalReadByType(uid, twoWeekType, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetWeekTotalReadByType,Err:" + err.Error() + ";report_type:" + twoWeekType
+		return
+	}
+	monthType := `month`
+	monthTotal, err := models.GetWeekTotalReadByType(uid, dayType, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetWeekTotalReadByType,Err:" + err.Error() + ";report_type:" + monthType
+		return
+	}
+
+	rddpReadTotal, err := models.GetRddpTotalReadByType(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetRddpTotalReadByType,Err:" + err.Error() + ";report_type:" + monthType
+		return
+	}
+
+	var learnDay int
+	rddpLearnDay, err := models.GetRddpLearnDay(uid, startDate, endDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetRddpLearnDay,Err:" + err.Error() + ";report_type:" + monthType
+		return
+	}
+
+	weekLearnDay, err := models.GetWeekpLearnDay(uid, startDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败GetWeekpLearnDay,Err:" + err.Error() + ";report_type:" + monthType
+		return
+	}
+	if rddpLearnDay >= weekLearnDay {
+		learnDay = rddpLearnDay
+	} else {
+		learnDay = weekLearnDay
+	}
+	if learnDay <= 0 {
+		learnDay = 1
+	}
+	resp.RealName = realName
+	resp.TogetherDay = togetherDay
+	resp.CreateDate = createDate
+	resp.FirstReadReportType = firstReadReportType
+	resp.FirstReadReportTitle = firstReadReportTitle
+	resp.ListenReportCount = listenCount
+	resp.ListenReportDuration = utils.FixFloat((listenVideoPlaySeconds / 60.00), 2)
+	resp.MaxReadReportCount = maxReadReportCount
+	resp.MaxReadReportDate = maxReadReportDate.Format(utils.FormatDate)
+	resp.LatestReadReportDate = lastestCreateDate
+	resp.LatestReadReportTime = latestTime.Format("15:04:05")
+	resp.LatestReadReportDateDuration = VideoPlaySeconds
+	resp.MaxOpenReportClassify = maxOpenReportClassify
+	resp.MaxOpenReportCount = maxOpenReportCount
+	resp.TotalReadDuration = totalReadDuration
+	resp.TotalReportDayCount = dayTotal
+	resp.TotalReportWeekCount = weekReportReadTotal
+	resp.TotalReportTwoWeekCount = twoWeekTotal
+	resp.TotalReportMonthCount = monthTotal
+	resp.TotalReportRddpCount = rddpReadTotal
+	resp.LearnDay = learnDay
+	resp.TotalReport = dayTotal + weekReportReadTotal + twoWeekTotal + monthTotal + rddpReadTotal
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}