Przeglądaj źródła

增加线上路演模块

xiexiaoyuan 2 lat temu
rodzic
commit
92e69719d1

+ 74 - 18
controller/english_report/english_report.go

@@ -9,6 +9,7 @@ import (
 	"hongze/hongze_yb_en_api/models/base"
 	"hongze/hongze_yb_en_api/models/english_classify"
 	"hongze/hongze_yb_en_api/models/english_report"
+	"hongze/hongze_yb_en_api/models/english_video"
 	elasticService "hongze/hongze_yb_en_api/services/elastic"
 	english_report_service "hongze/hongze_yb_en_api/services/english_report"
 	"hongze/hongze_yb_en_api/utils"
@@ -39,7 +40,7 @@ func (er *EnglishReportController) List(c *gin.Context) {
 	var pars []interface{}
 	var total int64
 	var tmpList []*english_report.Report
-	var list []*english_report.ReportListItem
+	list := make([]*english_report.ReportListItem, 0)
 
 	if req.ClassifyIdFirst >0 {
 		condition += " and classify_id_first = ?"
@@ -90,13 +91,24 @@ func (er *EnglishReportController) List(c *gin.Context) {
 }
 
 func (er *EnglishReportController) Classify(c *gin.Context) {
+	req := new(english_classify.ClassifyReq)
+	err := c.BindQuery(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
 	item := new(english_classify.Classify)
-	parentList, err := item.GetParent()
+	parentList, err := item.GetParent(req.ClassifyType)
 	if err != nil {
 		resp.FailMsg("获取失败", "获取失败,Err:"+err.Error(), c)
 		return
 	}
-	childList, err := item.GetChild()
+	childList, err := item.GetChild(req.ClassifyType)
 	if err != nil {
 		resp.FailMsg("获取失败", "获取失败,Err:"+err.Error(), c)
 		return
@@ -110,6 +122,7 @@ func (er *EnglishReportController) Classify(c *gin.Context) {
 			ParentId:      v.ParentId,
 			ClassifyLabel: v.ClassifyLabel,
 			ShowType:      v.ShowType,
+			ClassifyType:  v.ClassifyType,
 			IsShow:        v.IsShow,
 			CreateTime:    utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
 			ModifyTime:    utils.TimeTransferString(utils.FormatDateTime, v.ModifyTime),
@@ -125,6 +138,7 @@ func (er *EnglishReportController) Classify(c *gin.Context) {
 			ParentId:      v.ParentId,
 			ClassifyLabel: v.ClassifyLabel,
 			ShowType:      v.ShowType,
+			ClassifyType:  v.ClassifyType,
 			IsShow:        v.IsShow,
 			CreateTime:    utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
 			ModifyTime:    utils.TimeTransferString(utils.FormatDateTime, v.ModifyTime),
@@ -168,12 +182,12 @@ func (er *EnglishReportController) FilterByEs(c *gin.Context) {
 		resp.FailMsg("报告搜索失败", "报告搜索失败,Err:" + err.Error(), c)
 		return
 	}
+	var tempList []*english_report.ElasticEnglishReportDetail
 	if searchResp.Hits != nil {
 		for _, v := range searchResp.Hits.Hits {
-			temp := new(english_report.SearchEnglishReportItem)
 			itemJson, tmpErr := v.Source.MarshalJSON()
 			if tmpErr != nil {
-				resp.FailMsg("报告搜索失败 解析出错", "报告搜索失败,Err:" + tmpErr.Error(), c)
+				resp.FailMsg("报告搜索失败 解析出错", "报告搜索失败,Err:"+tmpErr.Error(), c)
 				return
 			}
 			reportItem := new(english_report.ElasticEnglishReportDetail)
@@ -182,26 +196,68 @@ func (er *EnglishReportController) FilterByEs(c *gin.Context) {
 				resp.FailMsg("报告搜索失败 解析出错", "报告搜索失败,Err:" + tmpErr.Error(), c)
 				return
 			}
-			temp.Id = reportItem.ReportId
-			temp.ClassifyIdFirst = reportItem.ClassifyIdFirst
-			temp.ClassifyNameFirst = reportItem.ClassifyNameFirst
-			temp.ClassifyIdSecond = reportItem.ClassifyIdSecond
-			temp.ClassifyNameSecond = reportItem.ClassifyNameSecond
+			if reportItem.ReportId > 0 {
+				if len(v.Highlight["Title"]) > 0 {
+					reportItem.Title = v.Highlight["Title"][0]
+				}
+				if len(v.Highlight["BodyContent"]) > 0 {
+					reportItem.ContentSub = v.Highlight["BodyContent"][0]
+				}
+
+				reportItem.ContentSub = "<div style=\"-webkit-line-clamp: 3;-webkit-box-orient: vertical;display: -webkit-box;overflow: hidden;text-overflow: ellipsis;\">" + reportItem.ContentSub + "</div>"
+
+			}
+			tempList = append(tempList, reportItem)
+		}
+	}
+	videoIds := make([]uint, 0)
+	videoMap := make(map[uint]*english_video.EnglishVideo)
+	videoItem := new(english_video.EnglishVideo)
+	if len(tempList)> 0 {
+		for _, reportItem := range tempList {
+			if reportItem.VideoId > 0 {
+				videoIds = append(videoIds, reportItem.VideoId)
+			}
+		}
+	}
+	if len(videoIds) > 0 {
+		videoList, e := videoItem.GetVideosByIds(videoIds)
+		if e != nil {
+			resp.FailMsg("查询线上路演列表出错", "查询线上路演列表出错,Err:" + e.Error(), c)
+			return
+		}
+		for _, v := range videoList {
+			videoMap[v.Id] = v
+		}
+	}
+	if len(tempList)> 0 {
+		for _, reportItem := range tempList {
+			temp := new(english_report.SearchEnglishReportItem)
 			temp.Title = reportItem.Title
 			temp.Author = reportItem.Author
 			temp.CreateTime = reportItem.CreateTime
-			// 默认应该从数据库中查询
 			temp.ContentSub = reportItem.ContentSub
 			temp.PublishTime = reportItem.PublishTime
 			temp.ReportCode = reportItem.ReportCode
-			if len(v.Highlight["Title"]) > 0 {
-				temp.Title = v.Highlight["Title"][0]
-			}
-			if len(v.Highlight["BodyContent"]) > 0 {
-				temp.ContentSub = v.Highlight["BodyContent"][0]
+			if reportItem.ReportId > 0 {
+				temp.Id = reportItem.ReportId
+				temp.ClassifyIdFirst = reportItem.ClassifyIdFirst
+				temp.ClassifyNameFirst = reportItem.ClassifyNameFirst
+				temp.ClassifyIdSecond = reportItem.ClassifyIdSecond
+				temp.ClassifyNameSecond = reportItem.ClassifyNameSecond
+			}else if reportItem.VideoId > 0 {
+				if videoTemp, ok := videoMap[reportItem.VideoId]; ok {
+					temp.ReportType = 1
+					temp.Id = videoTemp.Id
+					temp.ClassifyIdFirst = videoTemp.ClassifyIdFirst
+					temp.ClassifyNameFirst = videoTemp.ClassifyNameFirst
+					temp.ClassifyIdSecond = videoTemp.ClassifyIdSecond
+					temp.ClassifyNameSecond = videoTemp.ClassifyNameSecond
+					temp.VideoUrl = videoTemp.VideoUrl
+					temp.VideoCoverUrl = videoTemp.VideoCoverUrl
+					temp.VideoSeconds = videoTemp.VideoSeconds
+				}
 			}
-
-			temp.ContentSub = "<div style=\"-webkit-line-clamp: 3;-webkit-box-orient: vertical;display: -webkit-box;overflow: hidden;text-overflow: ellipsis;\">" + temp.ContentSub + "</div>"
 			reportList = append(reportList, temp)
 		}
 	}

+ 141 - 0
controller/english_report/english_video.go

@@ -0,0 +1,141 @@
+package english_report
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+	"hongze/hongze_yb_en_api/controller/resp"
+	"hongze/hongze_yb_en_api/global"
+	"hongze/hongze_yb_en_api/models/base"
+	"hongze/hongze_yb_en_api/models/english_report"
+	"hongze/hongze_yb_en_api/models/english_video"
+	english_report_service "hongze/hongze_yb_en_api/services/english_report"
+	"hongze/hongze_yb_en_api/utils"
+	"strconv"
+)
+
+type EnglishVideoController struct {}
+
+func (er *EnglishVideoController) List(c *gin.Context) {
+	req := new(english_report.ReportListReq)
+	err := c.BindQuery(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	page := new(base.Page)
+	page.SetPageSize(req.PageSize)
+	page.SetCurrent(req.Current)
+	item := new(english_video.EnglishVideo)
+
+	condition := " state=2"
+	var pars []interface{}
+	var total int64
+	var tmpList []*english_video.EnglishVideo
+	list := make([]*english_video.VideoListItem, 0)
+
+	if req.ClassifyIdFirst >0 {
+		condition += " and classify_id_first = ?"
+		pars = append(pars, req.ClassifyIdFirst)
+	}
+	if req.ClassifyIdSecond >0 {
+		condition += " and classify_id_second = ?"
+		pars = append(pars, req.ClassifyIdSecond)
+	}
+	page.AddOrderItem(base.OrderItem{Column: "publish_time", Asc: false})
+	page.AddOrderItem(base.OrderItem{Column: "id", Asc: false})
+	total, tmpList, err = item.SelectPage(page, condition, pars)
+	if err != nil {
+		resp.FailMsg("获取失败", "获取失败,Err:"+err.Error(), c)
+		return
+	}
+	if len(tmpList) > 0 {
+		for _, v := range tmpList {
+			tmp := &english_video.VideoListItem{
+				Id:                 v.Id,
+				ClassifyIdFirst:    v.ClassifyIdFirst,
+				ClassifyNameFirst:  v.ClassifyNameFirst,
+				ClassifyIdSecond:   v.ClassifyIdSecond,
+				ClassifyNameSecond: v.ClassifyNameSecond,
+				Title:              v.Title,
+				Abstract:           v.Abstract,
+				Author:             v.Author,
+				PublishTime:        utils.TimeTransferString(utils.FormatDateTime, v.PublishTime),
+				VideoUrl:           v.VideoUrl,
+				VideoCoverUrl:      v.VideoCoverUrl,
+				VideoSeconds:       v.VideoSeconds,
+				VideoCode:          v.VideoCode,
+				ShareUrl:           "https://share.hzinsights.com/reportEn?code=" + v.VideoCode,
+				CreateTime:         utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
+				ModifyTime:         utils.TimeTransferString(utils.FormatDateTime, v.ModifyTime),
+			}
+			list = append(list, tmp)
+		}
+	}
+	page.SetTotal(total)
+	baseData := new(base.BaseData)
+	baseData.SetPage(page)
+	baseData.SetList(list)
+	resp.OkData("获取成功", baseData, c)
+}
+
+func (er *EnglishVideoController) Detail(c *gin.Context) {
+	req := new(english_video.VideoDetailReq)
+	err := c.BindQuery(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+
+	videoItem := new(english_video.EnglishVideo)
+	videoItem, err = videoItem.GetEnglishVideoByCode(req.VideoCode)
+	if err != nil {
+		resp.FailMsg("该报告已删除", "报告查询失败,Err:" + err.Error(), c)
+		return
+	}
+	err = videoItem.UpdatePvByVideoCode(req.VideoCode)
+	if err != nil {
+		resp.FailMsg("更新失败", "更新失败,Err:" + err.Error(), c)
+		return
+	}
+
+	shareEmailId := req.ShareEmail
+	if shareEmailId == 0 {
+		shareEmailIdStr := c.GetString("shareEmailId")
+		shareEmailId, _ = strconv.Atoi(shareEmailIdStr)
+	}
+	// 记录邮箱
+	if shareEmailId > 0 {
+		go english_report_service.DealVideoEmail(videoItem, req.VideoCode, shareEmailId)
+	}
+	videoDetail := &english_video.VideoDetail{
+		Id:                 videoItem.Id,
+		ClassifyIdFirst:    videoItem.ClassifyIdFirst,
+		ClassifyNameFirst:  videoItem.ClassifyNameFirst,
+		ClassifyIdSecond:   videoItem.ClassifyIdSecond,
+		ClassifyNameSecond: videoItem.ClassifyNameSecond,
+		Title:              videoItem.Title,
+		Abstract:           videoItem.Abstract,
+		Author:             videoItem.Author,
+		Overview:           videoItem.Overview,
+		PublishTime:        utils.TimeTransferString(utils.FormatDateTime, videoItem.PublishTime),
+		VideoUrl:           videoItem.VideoUrl,
+		VideoCoverUrl:      videoItem.VideoCoverUrl,
+		VideoSeconds:       videoItem.VideoSeconds,
+		VideoCode:          videoItem.VideoCode,
+		CreateTime:         utils.TimeTransferString(utils.FormatDateTime, videoItem.CreateTime),
+		ModifyTime:         utils.TimeTransferString(utils.FormatDateTime, videoItem.ModifyTime),
+	}
+	baseData := new(english_video.VideoDetailResp)
+	baseData.Video = videoDetail
+	resp.OkData("查询成功", baseData, c)
+}

+ 21 - 15
models/english_classify/classify.go

@@ -6,13 +6,14 @@ import (
 )
 
 type Classify struct {
-	Id            int       `gorm:"primaryKey;column:id" json:"id"`
-	ClassifyName  string    `gorm:"column:classify_name" json:"classify_name"` //分类名称
-	Sort          int8      `gorm:"column:sort" json:"sort"`                   //排序
-	ParentId      int       `gorm:"column:parent_id" json:"parent_id"`         //父级分类id
-	ClassifyLabel string    `gorm:"column:classify_label" json:"classify_label"`
-	ShowType      uint8     `gorm:"column:show_type" json:"show_type"` //展示类型:1-列表 2-专栏
-	IsShow        int8      `gorm:"column:is_show" json:"is_show"`     //是否展示报告:1,展示该分类下的报告,0隐藏分类下的报告
+	Id            int    `gorm:"primaryKey;column:id" json:"id"`
+	ClassifyName  string `gorm:"column:classify_name" json:"classify_name"` //分类名称
+	Sort          int8   `gorm:"column:sort" json:"sort"`                   //排序
+	ParentId      int    `gorm:"column:parent_id" json:"parent_id"`         //父级分类id
+	ClassifyLabel string `gorm:"column:classify_label" json:"classify_label"`
+	ShowType      uint8  `gorm:"column:show_type" json:"show_type"`         //展示类型:1-列表 2-专栏
+	ClassifyType  uint8  `gorm:"column:classify_type" json:"classify_type"` //分类类型:0英文报告,1英文线上路演
+	IsShow        int8   `gorm:"column:is_show" json:"is_show"`             //是否展示报告:1,展示该分类下的报告,0隐藏分类下的报告
 	base.TimeBase
 }
 // TableName get sql table name.获取数据库表名
@@ -27,6 +28,7 @@ type ClassifyItem struct {
 	ParentId      int    `json:"parent_id"`     //父级分类id
 	ClassifyLabel string `json:"classify_label"`
 	ShowType      uint8  `json:"show_type"`   //展示类型:1-列表 2-专栏
+	ClassifyType  uint8  `json:"classify_type"` //分类类型:0英文报告,1英文线上路演
 	IsShow        int8   `json:"is_show"`     //是否展示报告:1,展示该分类下的报告,0隐藏分类下的报告
 	CreateTime    string `json:"create_time"` //创建时间
 	ModifyTime    string `json:"modify_time"` //最后更新时间
@@ -38,21 +40,25 @@ type ClassifyListItem struct {
 	Sort          int8            `json:"sort"`          //排序
 	ParentId      int             `json:"parent_id"`     //父级分类id
 	ClassifyLabel string          `json:"classify_label"`
-	ShowType      uint8           `json:"show_type"`   //展示类型:1-列表 2-专栏
-	IsShow        int8            `json:"is_show"`     //是否展示报告:1,展示该分类下的报告,0隐藏分类下的报告
-	CreateTime    string          `json:"create_time"` //创建时间
-	ModifyTime    string          `json:"modify_time"` //最后更新时间
+	ShowType      uint8           `json:"show_type"`     //展示类型:1-列表 2-专栏
+	IsShow        int8            `json:"is_show"`       //是否展示报告:1,展示该分类下的报告,0隐藏分类下的报告
+	ClassifyType  uint8           `json:"classify_type"` //分类类型:0英文报告,1英文线上路演
+	CreateTime    string          `json:"create_time"`   //创建时间
+	ModifyTime    string          `json:"modify_time"`   //最后更新时间
 	Child         []*ClassifyItem `json:"child"`
 }
 
+type ClassifyReq struct {
+	ClassifyType  int `json:"classify_type" form:"classify_type,default=0"`
+}
 // GetParent 获取一级分类列表
-func (c *Classify) GetParent() (list []*Classify, err error) {
-	err = global.DEFAULT_MYSQL.Model(c).Where("parent_id=0").Order("sort ASC,create_time ASC").Scan(&list).Error
+func (c *Classify) GetParent(classifyType int) (list []*Classify, err error) {
+	err = global.DEFAULT_MYSQL.Model(c).Where("parent_id=0 and classify_type=?", classifyType).Order("sort ASC,create_time ASC").Scan(&list).Error
 	return
 }
 
 // GetChild 获取二级分类列表
-func (c *Classify) GetChild() (list []*Classify, err error) {
-	err = global.DEFAULT_MYSQL.Model(c).Where("parent_id>0").Order("sort ASC,create_time ASC").Scan(&list).Error
+func (c *Classify) GetChild(classifyType int) (list []*Classify, err error) {
+	err = global.DEFAULT_MYSQL.Model(c).Where("parent_id>0 and classify_type=?", classifyType).Order("sort ASC,create_time ASC").Scan(&list).Error
 	return
 }

+ 9 - 1
models/english_report/report.go

@@ -41,6 +41,8 @@ func (r *Report) TableName() string {
 	return "english_report"
 }
 
+
+
 type ReportListReq struct {
 	ClassifyIdFirst  int `json:"classify_id_first" form:"classify_id_first"`
 	ClassifyIdSecond int `json:"classify_id_second" form:"classify_id_second"`
@@ -109,7 +111,7 @@ type ReportDetailResp struct {
 }
 
 type SearchEnglishReportItem struct {
-	Id                 uint    `json:"id"`
+	Id                 uint   `json:"id"`
 	ClassifyIdFirst    int    `json:"classify_id_first"`    //一级分类id
 	ClassifyNameFirst  string `json:"classify_name_first"`  //一级分类名称
 	ClassifyIdSecond   int    `json:"classify_id_second"`   //二级分类id
@@ -120,10 +122,16 @@ type SearchEnglishReportItem struct {
 	ReportCode         string `json:"report_code"`          //报告唯一编码
 	CreateTime         string `json:"create_time"`          //创建时间
 	ContentSub         string `json:"content_sub"`          //内容前两个章节"`
+	VideoUrl           string `json:"video_url"`            //视频文件URL
+	VideoCoverUrl      string `json:"video_cover_url"`      //视频文件封面地址
+	VideoSeconds       string `json:"video_seconds"`        //视频时长
+	ReportType         int    `json:"report_type"`          //类型:0英文研报,1英文线上路演
 }
 
 type ElasticEnglishReportDetail struct {
+	Id                 string
 	ReportId           uint
+	VideoId            uint
 	ClassifyIdFirst    int
 	ClassifyNameFirst  string
 	ClassifyIdSecond   int

+ 1 - 0
models/english_report_email/email_pv.go

@@ -10,6 +10,7 @@ type EmailPv struct {
 	Id         uint      `gorm:"primaryKey;column:id" json:"id"`
 	ReportId   uint      `gorm:"column:report_id" json:"report_id"`     //报告ID
 	EmailId    uint      `gorm:"column:email_id" json:"email_id"`       //邮箱ID
+	ReportType uint      `gorm:"column:report_type" json:"report_type"` //分类类型:0英文报告,1英文线上路演
 	CreateTime time.Time `gorm:"column:create_time" json:"create_time"` //访问时间
 }
 

+ 150 - 0
models/english_video/english_video.go

@@ -0,0 +1,150 @@
+package english_video
+
+import (
+	"hongze/hongze_yb_en_api/global"
+	"hongze/hongze_yb_en_api/models/base"
+	"time"
+)
+
+type EnglishVideo struct {
+	Id                 uint      `gorm:"primaryKey;column:id" json:"id"`
+	ClassifyIdFirst    int       `gorm:"column:classify_id_first" json:"classify_id_first"`       //一级分类id
+	ClassifyNameFirst  string    `gorm:"column:classify_name_first" json:"classify_name_first"`   //一级分类名称
+	ClassifyIdSecond   int       `gorm:"column:classify_id_second" json:"classify_id_second"`     //二级分类id
+	ClassifyNameSecond string    `gorm:"column:classify_name_second" json:"classify_name_second"` //二级分类名称
+	Title              string    `gorm:"column:title" json:"title"`                               //标题
+	Abstract           string    `gorm:"column:abstract" json:"abstract"`                         //摘要
+	Author             string    `gorm:"column:author" json:"author"`                             //作者
+	State              int8      `gorm:"column:state" json:"state"`                               //1:未发布,2:已发布
+	PublishTime        time.Time `gorm:"column:publish_time" json:"publish_time"`                 //发布时间
+	Overview           string    `gorm:"column:overview" json:"overview"`                         //概述
+	VideoUrl           string    `gorm:"column:video_url" json:"video_url"`                       //视频文件URL
+	VideoCoverUrl      string    `gorm:"column:video_cover_url" json:"video_cover_url"`           //视频文件封面地址
+	VideoSeconds       string    `gorm:"column:video_seconds" json:"video_seconds"`               //视频时长
+	VideoCode          string    `gorm:"column:video_code" json:"video_code"`                     //唯一编码
+	Pv                 int       `gorm:"column:pv" json:"pv"`
+	ShareUrl           string    `gorm:"column:share_url" json:"share_url"`     //分享url
+	PvEmail            uint      `gorm:"column:pv_email" json:"pv_email"`       //分享邮箱的PV
+	EmailState         uint8     `gorm:"column:email_state" json:"email_state"` //是否已群发邮件:0-否; 1-是
+	base.TimeBase
+}
+
+
+// TableName get sql table name.获取数据库表名
+func (r *EnglishVideo) TableName() string {
+	return "english_video"
+}
+
+type VideoListReq struct {
+	ClassifyIdFirst  int `json:"classify_id_first" form:"classify_id_first"`
+	ClassifyIdSecond int `json:"classify_id_second" form:"classify_id_second"`
+	base.PageReq
+}
+
+type VideoListItem struct {
+	Id                 uint   `json:"id"`
+	ClassifyIdFirst    int    `json:"classify_id_first"`    //一级分类id
+	ClassifyNameFirst  string `json:"classify_name_first"`  //一级分类名称
+	ClassifyIdSecond   int    `json:"classify_id_second"`   //二级分类id
+	ClassifyNameSecond string `json:"classify_name_second"` //二级分类名称
+	Title              string `json:"title"`                //标题
+	Abstract           string `json:"abstract"`             //摘要
+	Author             string `json:"author"`               //作者
+	PublishTime        string `json:"publish_time"`         //发布时间
+	VideoUrl           string `json:"video_url"`            //视频文件URL
+	VideoCoverUrl      string `json:"video_cover_url"`      //视频文件封面地址
+	VideoSeconds       string `json:"video_seconds"`        //视频时长
+	VideoCode          string `json:"video_code"`           //唯一编码
+	ShareUrl           string `json:"share_url"`            //分享url
+	CreateTime         string `json:"create_time"`          //创建时间
+	ModifyTime         string `json:"modify_time"`          //最后更新时间
+}
+
+type VideoSearchReq struct {
+	KeyWord  string `json:"key_word" form:"key_word"`
+	base.PageReq
+}
+
+type VideoDetailReq struct {
+	VideoCode  string `json:"video_code" form:"video_code" binding:"required"` //唯一编码
+	ShareEmail int    `json:"share_email" form:"share_email"`                  //推送的邮箱ID
+}
+
+type VideoDetail struct {
+	Id                 uint   `json:"id"`
+	ClassifyIdFirst    int    `json:"classify_id_first"`    //一级分类id
+	ClassifyNameFirst  string `json:"classify_name_first"`  //一级分类名称
+	ClassifyIdSecond   int    `json:"classify_id_second"`   //二级分类id
+	ClassifyNameSecond string `json:"classify_name_second"` //二级分类名称
+	Title              string `json:"title"`                //标题
+	Abstract           string `json:"abstract"`             //摘要
+	Author             string `json:"author"`               //作者
+	PublishTime        string `json:"publish_time"`         //发布时间
+	VideoUrl           string `json:"video_url"`            //视频文件URL
+	VideoCoverUrl      string `json:"video_cover_url"`      //视频文件封面地址
+	VideoSeconds       string `json:"video_seconds"`        //视频时长
+	VideoCode          string `json:"video_code"`           //唯一编码
+	CreateTime         string `json:"create_time"`          //创建时间
+	ModifyTime         string `json:"modify_time"`          //最后更新时间
+	Overview           string `json:"overview"`             //概述
+}
+
+type VideoDetailResp struct {
+	Video *VideoDetail `json:"Video"`
+}
+
+type SearchEnglishVideoItem struct {
+	Id                 uint    `json:"id"`
+	ClassifyIdFirst    int    `json:"classify_id_first"`    //一级分类id
+	ClassifyNameFirst  string `json:"classify_name_first"`  //一级分类名称
+	ClassifyIdSecond   int    `json:"classify_id_second"`   //二级分类id
+	ClassifyNameSecond string `json:"classify_name_second"` //二级分类名称
+	Title              string `json:"title"`                //标题
+	Author             string `json:"author"`               //作者
+	PublishTime        string `json:"publish_time"`         //发布时间
+	VideoCode         string `json:"video_code"`          //唯一编码
+	CreateTime         string `json:"create_time"`          //创建时间
+	ContentSub         string `json:"content_sub"`          //内容前两个章节"`
+}
+
+func (r *EnglishVideo) SelectPage(page base.IPage, condition string, pars []interface{}) (count int64, results []*EnglishVideo, err error) {
+	results = make([]*EnglishVideo, 0)
+	query := global.DEFAULT_MYSQL.Model(r).
+		Select("*").
+		Where(condition, pars...)
+	query.Count(&count)
+	if len(page.GetOrderItemsString()) > 0 {
+		query = query.Order(page.GetOrderItemsString())
+	}
+	err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
+	return
+}
+
+func (r *EnglishVideo) GetEnglishVideoByCode(videoCode string) (item *EnglishVideo, err error) {
+	err = global.MYSQL["rddp"].Model(r).Where("video_code= ?", videoCode).First(&item).Error
+	return
+}
+
+// 修改
+func (r *EnglishVideo) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(r).Select(updateCols).Updates(r).Error
+	return
+}
+
+func (r *EnglishVideo) UpdatePvEmailByVideoCode(videoCode string) (err error) {
+	sql := `UPDATE english_video SET pv_email = pv_email+1 WHERE video_code = ?  `
+	err = global.DEFAULT_MYSQL.Exec(sql, videoCode).Error
+	return
+}
+
+func (r *EnglishVideo) UpdatePvByVideoCode(videoCode string) (err error) {
+	sql := `UPDATE english_video SET pv = pv+1 WHERE video_code = ?  `
+	err = global.DEFAULT_MYSQL.Exec(sql, videoCode).Error
+	return
+}
+
+// GetVideosByIds 通过IDs获取集合
+func (r *EnglishVideo) GetVideosByIds(ids []uint) (list []*EnglishVideo, err error) {
+	err = global.DEFAULT_MYSQL.Model(r).Where("id IN (?)", ids).Scan(&list).Error
+	return
+}

+ 3 - 0
routers/english_report.go

@@ -9,9 +9,12 @@ import (
 func InitReport(baseGroup *gin.RouterGroup) {
 	//登录
 	controller := new(english_report.EnglishReportController)
+	vController := new(english_report.EnglishVideoController)
 	group := baseGroup.Group("english_report/").Use(middleware.ShareEmailHandler())
 	group.GET("list", controller.List)
+	group.GET("video/list", vController.List)
 	group.GET("classify", controller.Classify)
 	group.GET("filter_by_es", controller.FilterByEs)
 	group.GET("detail", controller.Detail)
+	group.GET("video/detail", vController.Detail)
 }

+ 56 - 0
services/english_report/video.go

@@ -0,0 +1,56 @@
+package english_report
+
+import (
+	"hongze/hongze_yb_en_api/models/english_company"
+	"hongze/hongze_yb_en_api/models/english_report_email"
+	"hongze/hongze_yb_en_api/models/english_video"
+	"hongze/hongze_yb_en_api/services/alarm_msg"
+	"hongze/hongze_yb_en_api/utils"
+	"time"
+)
+
+func DealVideoEmail(reportItem *english_video.EnglishVideo, reportCode string, shareEmailId int) (err error, errMsg string)  {
+	defer func() {
+		if err != nil {
+			alarm_msg.SendAlarmMsg(utils.APPNAME+"更新英文报告邮箱PV失败, ErrMsg: "+errMsg, 2)
+		}
+	}()
+	emailItem := new(english_report_email.Email)
+	userEmail, err := emailItem.GetById(shareEmailId)
+	if err != nil && err != utils.ErrNoRow {
+		errMsg = "获取客户邮箱信息失败, Err:" + err.Error()
+		return
+	}
+	if userEmail == nil {
+		return
+	}
+	// 更新报告邮箱pv(冗余)
+	if err = reportItem.UpdatePvEmailByVideoCode(reportCode); err != nil {
+		errMsg = "更新报告邮箱PV失败, Err:" + err.Error()
+		return
+	}
+	// 记录邮箱PV
+	pv := &english_report_email.EmailPv{
+		ReportId:   reportItem.Id,
+		EmailId:    userEmail.Id,
+		ReportType: 1,
+		CreateTime: time.Now().Local(),
+	}
+	if err = pv.Add(); err != nil {
+		errMsg = "新增邮箱PV失败, Err: " + err.Error()
+		return
+	}
+	// 更新阅读量
+	if err = emailItem.UpdateViewTotalById(userEmail.Id); err != nil {
+		errMsg = "更新英文联系人阅读量失败, Err: " + err.Error()
+		return
+	}
+	if userEmail.CompanyId > 0 {
+		companyItem := new(english_company.Company)
+		if err = companyItem.UpdateViewTotalByCompanyId(userEmail.CompanyId); err != nil {
+			errMsg = "更新英文客户阅读量, Err: " + err.Error()
+			return
+		}
+	}
+	return
+}