Browse Source

Merge branch 'pc_v2'

rdluck 4 years ago
parent
commit
536208da0f
7 changed files with 812 additions and 280 deletions
  1. 189 30
      controllers/bill.go
  2. 5 2
      controllers/user.go
  3. 13 41
      controllers/wechat.go
  4. 34 0
      models/annual_report.go
  5. 334 125
      models/bill.go
  6. 24 82
      models/wx_user.go
  7. 213 0
      services/annual_report.go

+ 189 - 30
controllers/bill.go

@@ -14,9 +14,9 @@ type BillController struct {
 
 // @Title 年度账单接口
 // @Description 年度账单接口
-// @Success 200 {object} models.WxLoginResp
+// @Success 200 {object} models.BillDetailResp
 // @router /detail [get]
-func (this *WechatCommonController) Detail() {
+func (this *BillController) Detail() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -29,6 +29,8 @@ func (this *WechatCommonController) 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
 
@@ -41,66 +43,223 @@ func (this *WechatCommonController) Detail() {
 	if !user.CreatedTime.IsZero() {
 		sub := time.Now().Sub(user.CreatedTime)
 		if sub < 0 {
-			sub = 0
+			sub = 1
 		}
 		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 {
-			sub = 0
+			sub = 1
 		}
 		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
+	//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
 	}
-	/*
-	   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:"连续学习天数"`
-	*/
+	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
+	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.MaxReadReportDate = maxReadReportDate.Format("2006年01月02日")
+	if lastestCreateDate != "" {
+		resp.LatestReadReportDate = ""
+	} else {
+		lastestDate, _ := time.Parse("2006-01-02", lastestCreateDate)
+		resp.LatestReadReportDate = lastestDate.Format("2006年01月02日")
+	}
+	resp.LatestReadReportTime = latestTime
+	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
 }
+//
+//func init() {
+//	fmt.Println("start")
+//	uid:=12008
+//	startDate:=`2020-01-01 00:00:00`
+//	latestTime, latestCreateTime, err := models.GetLatestReadReportInfo(uid, startDate)
+//	fmt.Println(latestTime, latestCreateTime)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		return
+//	}
+//	var lastestCreateDate string
+//	if !latestCreateTime.IsZero() {
+//		fmt.Println("line 256")
+//		lastestCreateDate = latestCreateTime.Format(utils.FormatDate)
+//	}else{
+//		fmt.Println("line 259")
+//	}
+//
+//	fmt.Println(latestTime,lastestCreateDate)
+//
+//	fmt.Println("end")
+//}

+ 5 - 2
controllers/user.go

@@ -49,6 +49,9 @@ func (this *UserController) Detail() {
 		br.ErrMsg = "判断用户权限信息失败,Err:" + err.Error()
 		return
 	}
+	if item.Mobile == "" && item.Email == "" {
+		item.FirstLogin = 1
+	}
 	item.UserPermission = userPermission
 	br.Ret = 200
 	br.Success = true
@@ -290,7 +293,7 @@ func (this *UserController) Login() {
 	newUserId := 0
 	if req.LoginType == 1 {
 		//BindMobile(openId, mobile string, userId, loginType int) (err error) {
-		req.Mobile=strings.Trim(req.Mobile," ")
+		req.Mobile = strings.Trim(req.Mobile, " ")
 		newUserId, err = models.BindMobile(openId, req.Mobile, userId, req.LoginType)
 	} else if req.LoginType == 2 {
 		if req.Email == "" {
@@ -455,4 +458,4 @@ func (this *UserController) SmallLimit() {
 	br.Ret = 200
 	br.Success = true
 	br.Data = resp
-}
+}

+ 13 - 41
controllers/wechat.go

@@ -72,8 +72,8 @@ func (this *WechatCommonController) WechatLogin() {
 	utils.FileLog.Info("openId:%s", openId)
 	utils.FileLog.Info("unionid:%s", unionid)
 	//获取成功
-	if unionid != "" {
-		wxUser, err := models.GetWxUserItemByUnionid(unionid)
+	if openId != "" {
+		wxUser, err := models.GetWxUserItemByOpenId(openId)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取用户信息失败"
 			br.ErrMsg = "根据openid获取用户信息失败,Eerr:" + err.Error()
@@ -97,7 +97,7 @@ func (this *WechatCommonController) WechatLogin() {
 			user.RegisterPlatform = 1
 			user.RegisterTime = time.Now()
 			_, err = models.AddWxUser(user)
-			wxUser, err = models.GetWxUserItemByUnionid(unionid)
+			wxUser, err = models.GetWxUserItemByOpenId(openId)
 			if err != nil {
 				br.Msg = "获取用户信息失败"
 				br.ErrMsg = "unionid登录,获取微信用户信息失败,Err:" + err.Error()
@@ -109,43 +109,9 @@ func (this *WechatCommonController) WechatLogin() {
 			userId = wxUser.UserId
 		}
 	} else {
-		if openId != "" {
-			wxUser, err := models.GetWxUserItemByOpenId(openId)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取用户信息失败"
-				br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error()
-				return
-			}
-			if wxUser == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
-				user := new(models.WxUser)
-				user.OpenId = openId
-				user.CompanyId = 1
-				user.CreatedTime = time.Now()
-				user.UnionId = unionid
-				user.Unionid = unionid
-				user.NickName = wxUserInfo.Nickname
-				user.Sex = wxUserInfo.Sex
-				user.City = wxUserInfo.City
-				user.Province = wxUserInfo.Province
-				user.Country = wxUserInfo.Country
-				user.Headimgurl = wxUserInfo.Headimgurl
-				user.FirstLogin = 1
-				user.Enabled = 1
-				user.RegisterPlatform = 1
-				user.RegisterTime = time.Now()
-				_, err = models.AddWxUser(user)
-
-				wxUser, err = models.GetWxUserItemByOpenId(openId)
-				if err != nil {
-					br.Msg = "获取用户信息失败"
-					br.ErrMsg = "unionid登录,获取微信用户信息失败,Err:" + err.Error()
-					return
-				}
-				userId = wxUser.UserId
-			} else {
-				userId = wxUser.UserId
-			}
-		}
+		br.Msg = "获取用户信息失败"
+		br.ErrMsg = "获取openid失败,openid:" + item.Openid
+		return
 	}
 	permission, err := services.CheckUserPermission(userId)
 	if err != nil {
@@ -191,7 +157,13 @@ func (this *WechatCommonController) WechatLogin() {
 	if wxUserInfo != nil {
 		go models.ModifyWxUserInfo(wxUserInfo.Nickname, wxUserInfo.Headimgurl, wxUserInfo.City, wxUserInfo.Province, wxUserInfo.Country, wxUserInfo.Sex, userId)
 	}
-
+	//firstLogin==1,强制绑定手机号或者邮箱
+	{
+		newItem, _ := models.GetWxUserItemByUserId(userId)
+		if newItem.Mobile == "" && newItem.Email == "" {
+			firstLogin = 1
+		}
+	}
 	resp := new(models.WxLoginResp)
 	resp.UserId = userId
 	resp.Code = 0

+ 34 - 0
models/annual_report.go

@@ -0,0 +1,34 @@
+package models
+
+import "time"
+
+type AnnualReport struct {
+	AnnualReportDate             string    `description:"报告年度"`
+	UserId                       int       `description:"用户id"`
+	Mobile                       string    `description:"手机号"`
+	Email                        string    `description:"邮箱"`
+	CompanyId                    int       `description:"公司id"`
+	RealName                     string    `description:"用户实际名称"`
+	TogetherDay                  string    `description:"相伴天数"`
+	CreateDate                   string    `description:"创建时间"`
+	FirstReadReportType          string    `description:"首次阅读报告类型"`
+	FirstReadReportTitle         string    `description:"首次阅读报告标题"`
+	ListenReportCount            int       `description:"收听报告次数"`
+	ListenReportDuration         float64   `description:"收听报告时长"`
+	MaxReadReportDate            string    `description:"阅读报告最多的一天"`
+	MaxReadReportCount           int       `description:"阅读报告最多的一天,报告数量"`
+	LatestReadReportDate         string    `description:"阅读报告时间最晚的一天"`
+	LatestReadReportTime         string    `description:"阅读报告时间最晚的一天,最晚的时间"`
+	LatestReadReportDateDuration float64   `description:"阅读报告时间最晚的一天,总共阅读报告的时长"`
+	MaxOpenReportClassify        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:"连续学习天数"`
+	CreateTime                   time.Time `description:"创建时间"`
+}

+ 334 - 125
models/bill.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"fmt"
 	"hongze/hongze_api/utils"
 	"rdluck_tools/orm"
 	"time"
@@ -15,19 +16,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 +39,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 +72,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 +110,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 +143,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 +171,114 @@ func GetListenInfo(uid int) (count int, videoPlaySeconds float64, err error) {
 	return
 }
 
+type LatestReadReport struct {
+	LatestTime string
+	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 string, 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
+		}
+	}
+	fmt.Println("line 244")
+	fmt.Println(latestTime, latestCreateTime)
+	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 +289,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 +302,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 open_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 open_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
+}

+ 24 - 82
models/wx_user.go

@@ -203,7 +203,7 @@ type LoginResp struct {
 }
 
 func BindMobile(openId, mobile string, userId, loginType int) (wxUserId int, err error) {
-	mobile=strings.Trim(mobile," ")
+	mobile = strings.Trim(mobile, " ")
 	//loginType  登录方式:1:手机,2:邮箱
 	sql := ``
 	if loginType == 1 {
@@ -233,7 +233,7 @@ func BindMobile(openId, mobile string, userId, loginType int) (wxUserId int, err
 		wxUserId = userId
 	} else {
 		fmt.Println("line  223")
-		if user.OpenId == "" {
+		if openId != "" {
 			wxUserId = user.UserId
 			dsql := ` DELETE FROM wx_user WHERE open_id = ? `
 			_, err = o.Raw(dsql, openId).Exec()
@@ -306,98 +306,40 @@ func PcBindMobile(unionId, mobile string, userId, loginType int) (wxUserId int,
 				maxRegisterTime = userInfo.RegisterTime
 				utils.FileLog.Info("not after")
 			}
-			var realName string
-			if user.RealName != "" {
-				realName = user.RealName
-			} else {
-				realName = userInfo.RealName
-			}
 			utils.FileLog.Info("maxRegisterTime %s", maxRegisterTime.Format(utils.FormatDateTime))
 			wxUserId = user.UserId
-			dsql := ` DELETE FROM wx_user WHERE user_id = ? `
-			_, err = o.Raw(dsql, wxUserId).Exec()
+			dsql := ` DELETE FROM wx_user WHERE union_id = ? `
+			_, err = o.Raw(dsql, unionId).Exec()
 			if err != nil {
 				return wxUserId, err
 			}
-			msql := ``
-			if loginType == 1 {
-				msql = ` UPDATE wx_user SET mobile=?,bind_account = ?,created_time=NOW(),register_time=?,real_name=? `
-				if user.CompanyId > 0 {
-					msql += ` ,company_id = ? `
-				}
-				msql += ` WHERE union_id = ? `
-			} else {
-				msql = ` UPDATE wx_user SET email=?,bind_account = ?,created_time=NOW(),register_time=?,real_name=? `
-				if user.CompanyId > 0 {
-					msql += ` ,company_id = ? `
-				}
-				msql += `  WHERE union_id = ? `
-			}
-			if user.CompanyId > 0 {
-				_, err = o.Raw(msql, mobile, mobile, maxRegisterTime, realName, user.CompanyId, unionId).Exec()
-			} else {
-				_, err = o.Raw(msql, mobile, mobile, maxRegisterTime, realName, unionId).Exec()
-			}
-			wxUserId = userInfo.UserId
+			msql := ` UPDATE wx_user SET union_id=?,register_time=?,province=?,city=?,country=?,headimgurl=?,unionid=?,sex=?  WHERE user_id = ?  `
+			_, err = o.Raw(msql, unionId, maxRegisterTime, userInfo.Province, userInfo.City, userInfo.Country, userInfo.Headimgurl, unionId, userInfo.Sex, user.UserId).Exec()
+			wxUserId = user.UserId
 		} else {
-			sql = `SELECT * FROM wx_user WHERE union_id = ? `
+			sql = `SELECT * FROM wx_user WHERE user_id = ? `
 			userInfo := new(WxUser)
 			o := orm.NewOrm()
-			err = o.Raw(sql, unionId).QueryRow(&userInfo)
+			err = o.Raw(sql, userId).QueryRow(&userInfo)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				return
 			}
-			if userInfo.UserId != user.UserId {
-				isDelete := 0
-				if userInfo.CompanyId <= 1 {
-					dsql := ` DELETE FROM wx_user WHERE user_id = ? `
-					_, err = o.Raw(dsql, userInfo.UserId).Exec()
-					if err != nil {
-						return userInfo.UserId, err
-					}
-					isDelete = 1
-				}
-
-				if user.CompanyId <= 1 {
-					dsql := ` DELETE FROM wx_user WHERE user_id = ? `
-					_, err = o.Raw(dsql, user.UserId).Exec()
-					if err != nil {
-						return userInfo.UserId, err
-					}
-					isDelete = 2
-				}
-
-				if userInfo.CompanyId > 1 && user.CompanyId > 1 {
-					dsql := ` DELETE FROM wx_user WHERE user_id = ? `
-					_, err = o.Raw(dsql, user.UserId).Exec()
-					if err != nil {
-						return userInfo.UserId, err
-					}
-					isDelete = 2
-				}
-				if isDelete == 1 {
-					msql := ` UPDATE wx_user SET union_id = ?,unionid=?,bind_account = ?,created_time=NOW(),register_time=NOW()  `
-					if loginType == 1 {
-						msql += ` ,mobile = ? `
-					} else {
-						msql += ` ,email = ? `
-					}
-					msql += ` WHERE user_id = ? `
-					_, err = o.Raw(msql, user.Unionid, user.Unionid, mobile, mobile, user.UserId).Exec()
-					wxUserId = user.UserId
-				} else {
-					msql := ` UPDATE wx_user SET union_id = ?,unionid=?,bind_account = ?,created_time=NOW(),register_time=NOW()  `
-					if loginType == 1 {
-						msql += ` ,mobile = ? `
-					} else {
-						msql += ` ,email = ? `
-					}
-					msql += ` WHERE user_id = ? `
-					_, err = o.Raw(msql, unionId, unionId, mobile, mobile, userInfo.UserId).Exec()
-					wxUserId = userInfo.UserId
-				}
+			dsql := ` DELETE FROM wx_user WHERE user_id = ? `
+			_, err = o.Raw(dsql, userId).Exec()
+			if err != nil {
+				return user.UserId, err
+			}
+			if user.Mobile == "" && loginType == 1 {
+				msql := ` UPDATE wx_user SET mobile = ?,bind_account = ?  WHERE user_id = ?`
+				_, err = o.Raw(msql, mobile, mobile, user.UserId).Exec()
+				wxUserId = user.UserId
+			}
+			if user.Email == "" && loginType == 2 {
+				msql := ` UPDATE wx_user SET email = ?,bind_account = ?  WHERE user_id = ?`
+				_, err = o.Raw(msql, mobile, mobile, user.UserId).Exec()
+				wxUserId = user.UserId
 			}
-			utils.FileLog.Info("用户存在,bind:%s,%d", unionId, wxUserId)
+			utils.FileLog.Info("用户存在,bind:%s,%d,%s", unionId, wxUserId)
 			wxUserId = userId
 		}
 	}

+ 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
+	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
+}