Selaa lähdekoodia

add: 添加用户阅读记录功能

zqbao 9 kuukautta sitten
vanhempi
commit
59a59b4d86

+ 10 - 5
controllers/chart_permission.go

@@ -23,21 +23,26 @@ func (this *ChartPermissionController) List() {
 	}()
 	id, _ := this.GetInt("chartPermissonId", 0)
 
-	var items []*services.ChartPermission
+	var resp *services.ChartPermissionResp
 	var err error
 	if id == 0 {
-		items, err = services.GetChartPermissionList()
+		resp, err = services.GetChartPermissionList()
 	} else if id > 0 {
-		items, err = services.GetChartPermissionSecondList(id)
+		resp, err = services.GetChartPermissionSecondList(id)
 	}
-	if err != nil || items == nil {
+	if err != nil {
 		br.Msg = "权限列表获取失败"
 		br.ErrMsg = "权限列表获取失败,系统错误,Err:" + err.Error()
 		return
 	}
+	if resp.Ret != 200 {
+		br.Msg = resp.Msg
+		br.ErrMsg = resp.ErrMsg
+		return
+	}
 
 	br.Ret = 200
-	br.Data = items
+	br.Data = resp.Data
 	br.Msg = "列表获取成功"
 	br.Success = true
 }

+ 1 - 0
controllers/report.go

@@ -48,6 +48,7 @@ func (this *ReportController) Detail() {
 // @Title 研报列表
 // @Description 研报列表
 // @Param   ReportId   query   int  true       "报告id"
+// @Param   chartPermissionId   query   int  true       "品种ID"
 // @Success 200 {object} models.ReportDetailResp
 // @router /list [get]
 func (this *ReportController) List() {

+ 111 - 0
controllers/user.go

@@ -17,6 +17,10 @@ type UserController struct {
 	BaseCommonController
 }
 
+type UserAuthController struct {
+	BaseAuthController
+}
+
 // @Title 用户登录接口
 // @Description 用户登录
 // @Param	request	body models.LoginReq true "type json string"
@@ -264,3 +268,110 @@ func (this *UserController) GetVerifyCode() {
 	br.Success = true
 	br.Msg = "发送成功"
 }
+
+// @Title 新增报告浏览记录
+// @Description 新增报告浏览记录接口
+// @Param	request	body models.ReportRecordReq true "type json string"
+// @Success 200 新增成功
+// @router /addReportRecord [post]
+func (this *UserAuthController) AddReportRecord() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req request.ReportRecordReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ReportId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,报告id小于等于0"
+		return
+	}
+	items, err := models.GetChartPermissionChapterMappingByReportId(req.ReportId)
+	if err != nil {
+		br.Msg = "添加阅读记录失败"
+		br.ErrMsg = "获取研报品种错误,Err:" + err.Error()
+		return
+	}
+	chartPermissionList, err := services.GetChartPermissionAllList()
+	if err != nil {
+		br.Msg = "添加阅读记录失败"
+		br.ErrMsg = "获取研报品种列表失败,Err:" + err.Error()
+		return
+	}
+	chartMap := make(map[int]*services.ChartPermission)
+	for _, permission := range chartPermissionList.Data {
+		chartMap[permission.ChartPermissionId] = permission
+	}
+	curTime := time.Now()
+	insertIds := make([]int64, 0)
+	if len(req.RecordId) <= 0 {
+		// 如果不存在就新增一条记录
+		for _, item := range items {
+			curPermission := chartMap[item.ChartPermissionId]
+			userReadRecord := &models.UserReadRecord{
+				UserId:              user.UserId,
+				ReportId:            req.ReportId,
+				ReportTittle:        req.ReportTittle,
+				ChartPermissionId1:  chartMap[curPermission.ParentId].ChartPermissionId,
+				ChartPermissionId2:  curPermission.ChartPermissionId,
+				ChartPermissionName: curPermission.PermissionName,
+				ClassifyId1:         req.ClassifyIdFirst,
+				ClassifyName1:       req.ClassifyNameFirst,
+				ClassifyId2:         req.ClassifyIdSecond,
+				ClassifyName2:       req.ClassifyNameSecond,
+				AreaCode:            user.AreaCode,
+				Phone:               user.Phone,
+				Email:               user.Email,
+				RealName:            user.RealName,
+				CompanyName:         user.Company,
+				Timestamp:           int(curTime.Unix()),
+				CreateTime:          curTime,
+			}
+			insertId, _ := userReadRecord.Insert()
+			insertIds = append(insertIds, insertId)
+		}
+	} else {
+		// 如果存在就计算停留时间
+		recordIds := make([]string, 0)
+		for _, v := range req.RecordId {
+			recordIds = append(recordIds, strconv.Itoa(v))
+		}
+		userRecordList, err := models.GetUserReadRecordListByRcordIds(recordIds)
+		if err != nil {
+			br.Msg = "更新阅读记录失败"
+			br.ErrMsg = "更新阅读记录失败,Err:" + err.Error()
+			return
+		}
+		if len(userRecordList) == 0 {
+			br.Msg = "更新阅读记录不存在"
+			return
+		}
+		stayTime := curTime.Unix() - int64(userRecordList[0].Timestamp)
+		stayTimeStr := utils.SecondsToHMS(stayTime)
+		err = models.UpdateUserReadRecordByRecordIds(recordIds, int(curTime.Unix()), int(stayTime), stayTimeStr)
+		if err != nil {
+			br.Msg = "更新阅读记录失败"
+			br.ErrMsg = "更新阅读记录失败,Err:" + err.Error()
+			return
+		}
+	}
+	resp := new(response.UserReadRecordResp)
+	resp.RecordIds = insertIds
+
+	br.Msg = "添加阅读记录成功"
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+}

+ 22 - 0
models/chart_permission_chapter_mapping.go

@@ -0,0 +1,22 @@
+package models
+
+import "github.com/beego/beego/v2/client/orm"
+
+type ChartPermissionChapterMappingItem struct {
+	Id                  int    `description:"id"`
+	ChartPermissionId   int    `description:"品种id"`
+	ChartPermissionName string `description:"品种名称"`
+	ReportChapterTypeId int    `description:"报告id"`
+	ResearchType        string `description:"id"`
+}
+
+func GetChartPermissionChapterMappingByReportId(reportId int) (items []*ChartPermissionChapterMappingItem, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT cpcm.*, cp.chart_permission_name 
+	FROM chart_permission_chapter_mapping AS cpcm
+	LEFT JOIN chart_permission AS cp
+	ON cpcm.chart_permission_id = cp.chart_permission_id
+	WHERE report_chapter_type_id=?`
+	_, err = o.Raw(sql, reportId).QueryRows(&items)
+	return
+}

+ 1 - 0
models/db.go

@@ -33,6 +33,7 @@ func init() {
 		new(User),
 		new(WxToken),
 		new(UserTemplateRecord),
+		new(UserReadRecord),
 	)
 
 }

+ 8 - 9
models/request/user.go

@@ -24,13 +24,12 @@ type VerifyCodeReq struct {
 	Email      string `description:"邮箱"`
 }
 
-type CheckEmailCodeReq struct {
-	Email   string `description:"邮箱"`
-	SmsCode string `description:"验证码"`
-}
-
-type CheckSmsCodeReq struct {
-	AreaCode string `description:"手机区号"`
-	Phone    string `description:"手机号"`
-	SmsCode  string `description:"验证码"`
+type ReportRecordReq struct {
+	RecordId           []int  `description:"记录Id"`
+	ReportId           int    `description:"报告Id"`
+	ReportTittle       string `description:"报告标题"`
+	ClassifyIdFirst    int    `description:"一级类别id"`
+	ClassifyNameFirst  string `description:"一级类别名称"`
+	ClassifyIdSecond   int    `description:"二级类别Id"`
+	ClassifyNameSecond string `description:"二级类别名称"`
 }

+ 4 - 0
models/response/user.go

@@ -11,3 +11,7 @@ type LoginResp struct {
 	EndDate       string `description:"到期日期"`
 	ProductName   string `description:"客户类型名称"`
 }
+
+type UserReadRecordResp struct {
+	RecordIds []int64
+}

+ 18 - 16
models/user.go

@@ -24,6 +24,7 @@ type User struct {
 	RegisterTime   time.Time `description:"用户首次登录小程序的时间"`
 	IsSubscribed   bool      `description:"是否关注公众号: 0表示没有关注,1表示关注"`
 	IsRegistered   bool      `description:"是否注册: 0表示没有注册,1表示注册"`
+	LastUpdateTime time.Time `description:"用户最近一次登录时间"`
 }
 
 func (u *User) Insert() (insertId int64, err error) {
@@ -33,22 +34,23 @@ func (u *User) Insert() (insertId int64, err error) {
 }
 
 type UserItem struct {
-	UserId       int       `description:"用户id"`
-	OpenId       string    `description:"open_id"`
-	UnionId      string    `description:"union_id"`
-	NickName     string    `description:"用户昵称"`
-	RealName     string    `description:"用户实际名称"`
-	Phone        string    `description:"手机号码"`
-	Componey     string    `description:"所属公司"`
-	AreaCode     string    `description:"区号"`
-	SellerId     int       `description:"销售id"`
-	Email        string    `description:"邮箱"`
-	Headimgurl   string    `description:"用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空"`
-	ValidEndTime time.Time `description:"服务截至时间"`
-	RegisterTime time.Time `description:"登录时间,用户首次登录小程序的时间"`
-	CreateTime   time.Time `description:"系统中新增用户的时间"`
-	ModifyTime   time.Time `description:"系统中用户信息更新的时间"`
-	IsRegistered bool      `description:"是否注册:1:已注册,0:未注册"`
+	UserId         int       `description:"用户id"`
+	OpenId         string    `description:"open_id"`
+	UnionId        string    `description:"union_id"`
+	NickName       string    `description:"用户昵称"`
+	RealName       string    `description:"用户实际名称"`
+	Phone          string    `description:"手机号码"`
+	Componey       string    `description:"所属公司"`
+	AreaCode       string    `description:"区号"`
+	SellerId       int       `description:"销售id"`
+	Email          string    `description:"邮箱"`
+	Headimgurl     string    `description:"用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空"`
+	ValidEndTime   time.Time `description:"服务截至时间"`
+	RegisterTime   time.Time `description:"登录时间,用户首次登录小程序的时间"`
+	CreateTime     time.Time `description:"系统中新增用户的时间"`
+	ModifyTime     time.Time `description:"系统中用户信息更新的时间"`
+	IsRegistered   bool      `description:"是否注册:1:已注册,0:未注册"`
+	LastUpdateTime time.Time `description:"用户最近一次登录时间"`
 }
 
 // 根据openid获取用户关系

+ 68 - 0
models/user_read_record.go

@@ -0,0 +1,68 @@
+package models
+
+import (
+	"strings"
+	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type UserReadRecord struct {
+	UserReadRecordId    int       `orm:"pk" description:"id"`
+	UserId              int       `description:"用户id"`
+	ReportId            int       `description:"报告id"`
+	ReportTittle        string    `description:"报告标题"`
+	ChartPermissionId1  int       `description:"一级品种id"`
+	ChartPermissionId2  int       `description:"二级品种id"`
+	ChartPermissionName string    `description:"二级品种名称"`
+	ClassifyId1         int       `description:"一级级分类id"`
+	ClassifyName1       string    `description:"一级分类名称"`
+	ClassifyId2         int       `description:"二级分类id"`
+	ClassifyName2       string    `description:"二级分类名称"`
+	AreaCode            string    `description:"手机区号"`
+	Phone               string    `description:"手机号"`
+	Email               string    `description:"邮箱"`
+	RealName            string    `description:"用户实际姓名"`
+	CompanyName         string    `description:"公司名称"`
+	Timestamp           int       `description:"阅读开始时间戳"`
+	EndTimestamp        int       `description:"阅读结束时间戳"`
+	CreateTime          time.Time `description:"创建时间"`
+	StayTime            string    `description:"停留时间"`
+	StayTimestamp       string    `description:"停留时间戳"`
+}
+
+func (u *UserReadRecord) Insert() (insertId int64, err error) {
+	o := orm.NewOrm()
+	insertId, err = o.Insert(u)
+	return
+}
+
+func (u *UserReadRecord) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(u, cols...)
+	return
+}
+
+func GetUserReadRecordListByRcordIds(recordIds []string) (items []*UserReadRecord, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM user_read_record WHERE 1=1  `
+	var stringIds string
+	if len(recordIds) > 0 {
+		sql += ` AND user_read_record_id in (?) `
+		stringIds = strings.Join(recordIds, ",")
+	}
+	_, err = o.Raw(sql, stringIds).QueryRows(&items)
+	return
+}
+
+func UpdateUserReadRecordByRecordIds(recordIds []string, endTimeStamp, stayTime int, stayTimeStr string) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE user_read_record SET end_timestamp=?, stay_timestamp=?, stay_time=? WHERE 1=1 `
+	var stringIds string
+	if len(recordIds) > 0 {
+		sql += ` AND user_read_record_id in (?) `
+		stringIds = strings.Join(recordIds, ",")
+	}
+	_, err = o.Raw(sql, endTimeStamp, stayTime, stayTimeStr, stringIds).Exec()
+	return
+}

+ 9 - 0
routers/commentsRouter.go

@@ -34,6 +34,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_api/controllers:UserAuthController"] = append(beego.GlobalControllerRouter["eta/eta_mini_api/controllers:UserAuthController"],
+        beego.ControllerComments{
+            Method: "AddReportRecord",
+            Router: `/addReportRecord`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_api/controllers:UserController"] = append(beego.GlobalControllerRouter["eta/eta_mini_api/controllers:UserController"],
         beego.ControllerComments{
             Method: "GetVerifyCode",

+ 1 - 0
routers/router.go

@@ -20,6 +20,7 @@ func init() {
 		beego.NSNamespace("/user",
 			beego.NSInclude(
 				&controllers.UserController{},
+				&controllers.UserAuthController{},
 			),
 		),
 		beego.NSNamespace("/wechat",

+ 47 - 2
services/chart_permission.go

@@ -36,7 +36,14 @@ type ChartPermission struct {
 	IsPublic              int       `description:"是否是公有权限1:公有权限,0私有权限" json:"is_public"`
 }
 
-func GetChartPermissionSecondList(chartPermissionId int) (resp []*ChartPermission, err error) {
+type ChartPermissionResp struct {
+	Ret    int
+	Data   []*ChartPermission
+	Msg    string
+	ErrMsg string
+}
+
+func GetChartPermissionSecondList(chartPermissionId int) (resp *ChartPermissionResp, err error) {
 	url := utils.ETA_MINI_BRIDGE_URL + "/chart_permission/second/list"
 	client := &http.Client{}
 	if url != "" {
@@ -77,7 +84,7 @@ func GetChartPermissionSecondList(chartPermissionId int) (resp []*ChartPermissio
 
 }
 
-func GetChartPermissionList() (resp []*ChartPermission, err error) {
+func GetChartPermissionList() (resp *ChartPermissionResp, err error) {
 	url := utils.ETA_MINI_BRIDGE_URL + "/chart_permission/list"
 	client := &http.Client{}
 	// 提交请求
@@ -114,3 +121,41 @@ func GetChartPermissionList() (resp []*ChartPermission, err error) {
 	return
 
 }
+
+func GetChartPermissionAllList() (resp *ChartPermissionResp, err error) {
+	url := utils.ETA_MINI_BRIDGE_URL + "/chart_permission/allList"
+	client := &http.Client{}
+	// 提交请求
+	req, err := http.NewRequest("GET", url, nil)
+	if err != nil {
+		return
+	}
+	nonce := utils.GetRandStringNoSpecialChar(16)
+	timestamp := time.Now().Format(utils.FormatDateTimeUnSpace)
+	signature := utils.GetSign(nonce, timestamp, utils.ETA_MINI_APPID, utils.ETA_MINI_APP_SECRET)
+	//增加header选项
+	req.Header.Add("Nonce", nonce)
+	req.Header.Add("Timestamp", timestamp)
+	req.Header.Add("Appid", utils.ETA_MINI_APPID)
+	req.Header.Add("Signature", signature)
+	req.Header.Set("Content-Type", "application/json")
+
+	response, err := client.Do(req)
+	if err != nil {
+		return
+	}
+	defer response.Body.Close()
+
+	body, err := io.ReadAll(response.Body)
+
+	if err != nil {
+		return
+	}
+	utils.FileLog.Info("result:" + string(body))
+	err = json.Unmarshal(body, &resp)
+	if err != nil {
+		return
+	}
+	return
+
+}

+ 19 - 0
utils/common.go

@@ -147,3 +147,22 @@ func StringsToJSON(str string) string {
 	}
 	return jsons
 }
+
+func SecondsToHMS(seconds int64) string {
+	duration := time.Duration(seconds) * time.Second
+	hours := int64(duration.Hours())
+	minutes := int64(duration.Minutes()) % 60
+	secs := int64(duration.Seconds()) % 60
+
+	var result string
+	if hours > 0 {
+		result += fmt.Sprintf("%d时", hours)
+	}
+	if minutes > 0 || (hours > 0 && secs > 0) {
+		result += fmt.Sprintf("%d分", minutes)
+	}
+	if secs > 0 || (hours == 0 && minutes == 0) {
+		result += fmt.Sprintf("%d秒", secs)
+	}
+	return result
+}