kobe6258 8 月之前
父节点
当前提交
83be124a3f

+ 18 - 6
common/component/config/file_config.go

@@ -2,6 +2,8 @@ package config
 
 import (
 	"eta_mini_ht_api/common/contants"
+	"fmt"
+	"strings"
 	"sync"
 )
 
@@ -11,6 +13,7 @@ var (
 )
 
 type FileOpts struct {
+	Path       string
 	Notice     string
 	Disclaimer string
 	PublicKey  string
@@ -21,25 +24,34 @@ type FileConfig struct {
 }
 
 func (f *FileConfig) GetNotice() string {
-	return f.opts.Notice
+	if strings.HasSuffix(f.opts.Path, "/") {
+		return fmt.Sprint(f.opts.Path, f.opts.Notice)
+	}
+	return fmt.Sprint(f.opts.Path, "/", f.opts.Notice)
+}
+func (f *FileConfig) GetPath() string {
+	return f.opts.Path
 }
-
 func (f *FileConfig) GetPublicKey() string {
 	return f.opts.PublicKey
 }
 func (f *FileConfig) GetDisclaimer() string {
-	return f.opts.Disclaimer
+	if strings.HasSuffix(f.opts.Path, "/") {
+		return fmt.Sprint(f.opts.Path, f.opts.Disclaimer)
+	}
+	return fmt.Sprint(f.opts.Path, "/", f.opts.Disclaimer)
 }
 func (f *FileConfig) InitConfig() {
 	opts := FileOpts{
-		Notice:     f.GetString("url"),
-		Disclaimer: f.GetString("driver"),
+		Path:       f.GetString("path"),
+		Notice:     f.GetString("notice"),
+		Disclaimer: f.GetString("disclaimer"),
 		PublicKey:  f.GetString("publicKey"),
 	}
 	f.opts = opts
 }
 func NewFileConfig() Config {
-	if dbConfig == nil {
+	if fileConfig == nil {
 		fileOnce.Do(func() {
 			fileConfig = &FileConfig{
 				BaseConfig: BaseConfig{prefix: contants.FILE},

+ 100 - 31
common/component/es/es.go

@@ -7,9 +7,11 @@ import (
 	"eta_mini_ht_api/common/component/config"
 	logger "eta_mini_ht_api/common/component/log"
 	"eta_mini_ht_api/common/contants"
+	"fmt"
 	"github.com/elastic/go-elasticsearch/v7"
 	"github.com/elastic/go-elasticsearch/v7/esapi"
 	"io"
+	"strconv"
 	"strings"
 	"sync"
 )
@@ -117,6 +119,7 @@ func (es *ESClient) BulkInsert(indexName string, docs []ESBase) (err error) {
 
 type ESResponse struct {
 	Took     int        `json:"took"`
+	Count    int        `json:"count"`
 	TimedOut bool       `json:"timedOut"`
 	Hits     Hits       `json:"hits"`
 	_Shards  ShardsInfo `json:"_shards"`
@@ -192,18 +195,28 @@ func (req *ESQueryRequest) parseJsonQuery() (queryMap map[string]interface{}) {
 	case MatchAll:
 		queryMap = map[string]interface{}{
 			"query": map[string]interface{}{
-				"match_all": map[string]interface{}{},
+				"match": map[string]interface{}{
+					req.Column: req.Key,
+				},
 			},
 		}
 		return
 	case MatchAllByCondition:
 		queryMap = map[string]interface{}{
 			"query": map[string]interface{}{
-				"match_all": map[string]interface{}{},
-			},
-			"post_filter": map[string]interface{}{
-				"term": map[string]interface{}{
-					req.Condition: req.ConditionValue,
+				"bool": map[string]interface{}{
+					"must": []map[string]interface{}{
+						{
+							"match": map[string]interface{}{
+								req.Column: req.Key,
+							},
+						},
+						{
+							"term": map[string]interface{}{
+								req.Condition: req.ConditionValue,
+							},
+						},
+					},
 				},
 			},
 		}
@@ -263,15 +276,23 @@ func (req *ESQueryRequest) parseJsonQuery() (queryMap map[string]interface{}) {
 				"post_tags": []string{"</span>"},
 			},
 			"post_filter": map[string]interface{}{
-				"range": map[string]interface{}{
-					req.RangeColumn: map[string]interface{}{
-						"gte": req.Min,
-						"lte": req.Max,
+				"bool": map[string]interface{}{
+					"must": []map[string]interface{}{
+						{
+							"range": map[string]interface{}{
+								"mediaId": map[string]interface{}{
+									"gte": req.Min,
+									"lte": req.Max,
+								},
+							},
+						},
+						{
+							"term": map[string]interface{}{
+								"mediaType": "video",
+							},
+						},
 					},
 				},
-				"term": map[string]interface{}{
-					req.Condition: req.ConditionValue,
-				},
 			},
 		}
 		return
@@ -293,6 +314,32 @@ func (req *ESQueryRequest) parseJsonQuery() (queryMap map[string]interface{}) {
 // sort 	排序
 // */
 
+func (es *ESClient) Count(params *ESQueryRequest) (response ESResponse, err error) {
+	queryMap := params.parseJsonQuery()
+	jsonQuery, _ := json.Marshal(queryMap)
+	request := esapi.CountRequest{
+		Index: []string{params.IndexName},
+		Body:  strings.NewReader(string(jsonQuery)),
+	}
+	res, err := request.Do(context.Background(), esClient.esOp)
+	defer res.Body.Close()
+	if err != nil {
+		logger.Error("es查询失败: %s", err)
+	}
+	if res.IsError() {
+		var e map[string]interface{}
+		if err = json.NewDecoder(res.Body).Decode(&e); err != nil {
+			logger.Error("解析es应答失败: %v", err)
+		} else {
+			logger.Error("es请求失败: %s: %v\n", res.Status(), e)
+		}
+	}
+	body, err := io.ReadAll(res.Body)
+	if err != nil {
+		logger.Error("获取es应答失败: %v", err)
+	}
+	return parseESResponse(body)
+}
 func (es *ESClient) Search(params *ESQueryRequest) (response ESResponse, err error) {
 	queryMap := params.parseJsonQuery()
 	jsonQuery, _ := json.Marshal(queryMap)
@@ -341,24 +388,46 @@ func (es *ESClient) GetSource(hits Hits) []Hit {
 	return hits.Hits
 }
 
-//
-///*
-//*
-//添加es
-//indexName 索引名
-//id es的id
-//body es的值
-//*/
-//func EsAdd(indexName string, id string, body map[string]interface{}) bool {
-//	req := httplib.Post(esUrl + indexName + "/_doc/" + id)
-//	req.JSONBody(body)
-//	_, err := req.String()
-//	if err != nil {
-//		fmt.Println("elasticsearch is error ", err)
-//		return false
-//	}
-//	return true
-//}
+func (es *ESClient) GetCount(hits Hits) []Hit {
+	return hits.Hits
+}
+
+// /*
+// *
+// 添加es
+// indexName 索引名
+// id es的id
+// body es的值
+// */
+func (es *ESClient) Add(indexName string, id int, doc interface{}) bool {
+	jsonDoc, _ := json.Marshal(doc)
+	req := esapi.IndexRequest{
+		Index:      indexName,
+		DocumentID: strconv.Itoa(id),
+		Body:       strings.NewReader(string(jsonDoc)),
+		Refresh:    "true",
+	}
+	res, err := req.Do(context.Background(), es.es())
+	defer res.Body.Close()
+	if err != nil {
+		logger.Error("es查询失败: %s", err)
+	}
+	if res.IsError() {
+		var e map[string]interface{}
+		if err = json.NewDecoder(res.Body).Decode(&e); err != nil {
+			logger.Error("解析es应答失败: %v", err)
+		} else {
+			logger.Error("es请求失败: %s: %v\n", res.Status(), e)
+		}
+	}
+	body, err := io.ReadAll(res.Body)
+	if err != nil {
+		logger.Error("获取es应答失败: %v", err)
+	}
+	fmt.Printf("%s\n", string(body))
+	return true
+}
+
 //
 ///*
 //*

+ 8 - 0
common/utils/string/string_utils.go

@@ -26,3 +26,11 @@ func StringToIntSlice(strSlice []string) ([]int, error) {
 	}
 	return intSlice, nil
 }
+
+func IntToStringSlice(intSlice []int) []string {
+	var strSlice []string
+	for _, num := range intSlice {
+		strSlice = append(strSlice, strconv.Itoa(num))
+	}
+	return strSlice
+}

+ 16 - 0
controllers/list_contoller.go

@@ -3,6 +3,8 @@ package controllers
 import (
 	"eta_mini_ht_api/common/contants"
 	"eta_mini_ht_api/common/utils/page"
+	stringUtils "eta_mini_ht_api/common/utils/string"
+	"strings"
 )
 
 type ListController struct {
@@ -32,6 +34,20 @@ func (l *ListController) Prepare() {
 	}
 }
 
+func (l *ListController) TransPermissionIds(permissionIds string) (permissionIdList []int, err error) {
+	if strings.HasPrefix(permissionIds, ",") {
+		permissionIds = permissionIds[1:len(permissionIds)]
+	}
+	if strings.HasSuffix(permissionIds, ",") {
+		permissionIds = permissionIds[0 : len(permissionIds)-1]
+	}
+	if permissionIds == "" {
+		permissionIdList = []int{}
+	} else {
+		permissionIdList, err = stringUtils.StringToIntSlice(strings.Split(permissionIds, ","))
+	}
+	return
+}
 func (l *ListController) Finish() {
 	l.PageInfo.Reset()
 }

+ 23 - 8
controllers/media/media_controller.go

@@ -2,6 +2,7 @@ package media
 
 import (
 	"encoding/json"
+	logger "eta_mini_ht_api/common/component/log"
 	"eta_mini_ht_api/common/exception"
 	"eta_mini_ht_api/common/utils/page"
 	"eta_mini_ht_api/controllers"
@@ -30,17 +31,22 @@ func (m *MediaController) Search(mediaType string, key string) {
 			m.FailedResult("分页搜索报告列表失败", result)
 			return
 		}
+		if mediaType == "" || !checkMediaType(mediaType) {
+			err = exception.New(exception.MediaTypeError)
+			m.FailedResult("分页查询媒体列表失败", result)
+			return
+		}
 		pageRes := page.Page{
 			Current:  m.PageInfo.Current,
 			PageSize: m.PageInfo.PageSize,
 		}
 		if m.PageInfo.LatestId == 0 {
-			pageRes.LatestId = media.SearchMaxMediaId(mediaType)
+			pageRes.Total, pageRes.LatestId = media.SearchMaxMediaId(mediaType, key)
 			m.PageInfo.LatestId = pageRes.LatestId
 		} else {
 			pageRes.LatestId = m.PageInfo.LatestId
+			pageRes.Total = m.PageInfo.Total
 		}
-		pageRes.Total = pageRes.LatestId
 		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
 		list, err := media.SearchMediaList(mediaType, key, m.PageInfo)
 		if err != nil {
@@ -55,11 +61,11 @@ func (m *MediaController) Search(mediaType string, key string) {
 	})
 }
 
-// List 获取报告列表
-// @Description 获取报告列表
+// List 获取媒体列表
+// @Description 获取媒体列表
 // @Success 200 {object}
 // @router /list [get]
-func (m *MediaController) List(mediaType string) {
+func (m *MediaController) List(mediaType string, permissionIds string) {
 	controllers.Wrap(&m.BaseController, func() (result *controllers.WrapData, err error) {
 		result = m.InitWrapData("分页查询媒体列表失败")
 		if mediaType == "" || !checkMediaType(mediaType) {
@@ -67,19 +73,28 @@ func (m *MediaController) List(mediaType string) {
 			m.FailedResult("分页查询媒体列表失败", result)
 			return
 		}
+		permissionIdList, err := m.TransPermissionIds(permissionIds)
+		if err != nil {
+			logger.Error("品种列表解析错误:%v", err)
+			m.FailedResult("分页查询媒体列表失败", result)
+			err = exception.New(exception.QueryReportPageFailed)
+			return
+		}
 		pageRes := page.Page{
 			Current:  m.PageInfo.Current,
 			PageSize: m.PageInfo.PageSize,
 		}
+		var mediaIds []int
 		if m.PageInfo.LatestId == 0 {
-			pageRes.LatestId = media.GetTotalPageCount(mediaType)
+			pageRes.Total, pageRes.LatestId, mediaIds = media.GetTotalPageCountByPermissionIds(mediaType, permissionIdList)
 			m.PageInfo.LatestId = pageRes.LatestId
+			m.PageInfo.Total = pageRes.Total
 		} else {
 			pageRes.LatestId = m.PageInfo.LatestId
+			pageRes.Total = m.PageInfo.Total
 		}
-		pageRes.Total = pageRes.LatestId
 		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
-		list, err := media.GetMediaPage(mediaType, m.PageInfo)
+		list, err := media.GetMediaPageByIds(mediaType, m.PageInfo, mediaIds)
 		if err != nil {
 			m.FailedResult("分页查询媒体列表失败", result)
 			return

+ 3 - 20
controllers/report/report_controller.go

@@ -5,13 +5,11 @@ import (
 	logger "eta_mini_ht_api/common/component/log"
 	"eta_mini_ht_api/common/exception"
 	"eta_mini_ht_api/common/utils/page"
-	stringUtils "eta_mini_ht_api/common/utils/string"
 	"eta_mini_ht_api/controllers"
 	reportService "eta_mini_ht_api/domian/report"
 	"eta_mini_ht_api/service/report"
 	"eta_mini_ht_api/service/user"
 	"fmt"
-	"strings"
 )
 
 type ReportController struct {
@@ -35,8 +33,7 @@ func (r *ReportController) Search(key string) {
 			PageSize: r.PageInfo.PageSize,
 		}
 		if r.PageInfo.LatestId == 0 {
-			pageRes.LatestId = report.SearchMaxReportId()
-			pageRes.Total = pageRes.LatestId
+			pageRes.Total, pageRes.LatestId = report.SearchMaxReportId(key)
 			r.PageInfo.LatestId = pageRes.LatestId
 			r.PageInfo.Total = pageRes.Total
 		} else {
@@ -71,7 +68,7 @@ func (r *ReportController) List(permissionIds string) {
 			Current:  r.PageInfo.Current,
 			PageSize: r.PageInfo.PageSize,
 		}
-		permissionIdList, err := transPermissionIds(permissionIds)
+		permissionIdList, err := r.TransPermissionIds(permissionIds)
 		if err != nil {
 			logger.Error("品种列表解析错误:%v", err)
 			r.FailedResult("分页查询报告列表失败", result)
@@ -99,20 +96,6 @@ func (r *ReportController) List(permissionIds string) {
 		return
 	})
 }
-func transPermissionIds(permissionIds string) (permissionIdList []int, err error) {
-	if strings.HasPrefix(permissionIds, ",") {
-		permissionIds = permissionIds[1:len(permissionIds)]
-	}
-	if strings.HasSuffix(permissionIds, ",") {
-		permissionIds = permissionIds[0 : len(permissionIds)-1]
-	}
-	if permissionIds == "" {
-		permissionIdList = []int{}
-	} else {
-		permissionIdList, err = stringUtils.StringToIntSlice(strings.Split(permissionIds, ","))
-	}
-	return
-}
 
 // HotRanked @Title 获取本周最热的报告列表
 // @Description 获取本周最热的报告列表
@@ -125,7 +108,7 @@ func (r *ReportController) HotRanked(permissionIds string, limit int) {
 		}
 		result = r.InitWrapData("获取本周最热报告列表失败")
 		list, err := report.GetRandedReportByWeeklyHot(limit)
-		permissionIdList, err := transPermissionIds(permissionIds)
+		permissionIdList, err := r.TransPermissionIds(permissionIds)
 		if err != nil {
 			logger.Error("品种列表解析错误:%v", err)
 			r.FailedResult("分页查询报告列表失败", result)

+ 24 - 33
controllers/user/auth_controller.go

@@ -10,7 +10,6 @@ import (
 	"eta_mini_ht_api/controllers"
 	"eta_mini_ht_api/service/auth"
 	"os"
-	"path/filepath"
 	"strings"
 )
 
@@ -189,7 +188,6 @@ func (a *AuthController) WXAppid() {
 }
 
 type FileResp struct {
-	Name    string
 	Content string
 }
 
@@ -201,49 +199,42 @@ type FileResp struct {
 func (a *AuthController) Notice() {
 	controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
 		result = a.InitWrapData("获取注册须知失败")
-		rootDir, err := filepath.Abs(filepath.Dir(os.Args[0]))
-		if err != nil {
-			logger.Error("获取文件路径失败:%v", err)
-			err = exception.New(exception.GetNoticeFileError)
-			a.FailedResult("获取注册须知失败", result)
-			return
-		}
+		fileConfig := config.GetConfig(contants.FILE).(*config.FileConfig)
 		//publicKey := config.GetConfig(contants.FILE).(*config.FileConfig).GetPublicKey()
-		noticeFile := config.GetConfig(contants.FILE).(*config.FileConfig).GetNotice()
-		filePath := filepath.Join(rootDir, "conf", noticeFile)
-		content, err := readTextConfig(filePath)
+		noticeFile := fileConfig.GetNotice()
+		content, err := readTextConfig(noticeFile)
 		if err != nil {
 			err = exception.New(exception.GetNoticeFileError)
 			a.FailedResult("获取注册须知失败", result)
 		}
 		a.SuccessResult("获取注册须知成功", FileResp{
-			Name:    noticeFile,
 			Content: content,
 		}, result)
 		return
 	})
 }
 
-//// Disclaimer 获取免责声明
-//// @Summary 获取免责声明
-//// @Success 200 {object} controllers.BaseResponse
-//// @Description 获取免责声明
-//// @router /disclaimer [get]
-//func (a *AuthController) Disclaimer() {
-//	controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
-//		result = a.InitWrapData("获取免责声明失败")
-//		publicKey := config.GetConfig(contants.FILE).(*config.FileConfig).GetPublicKey()
-//		disclaimerFile = config.GetConfig(contants.FILE).(*config.FileConfig).GetDisclaimer()
-//		appid := config.GetConfig(contants.WECHAT).(*config.WechatConfig).GetAppid()
-//		if err != nil {
-//			a.FailedResult("获取免责声明失败", result)
-//		}
-//		a.SuccessResult("获取免责声明成功", WXAppidResp{
-//			AppId: appid,
-//		}, result)
-//		return
-//	})
-//}
+// Disclaimer 获取免责声明
+// @Summary 获取免责声明
+// @Success 200 {object} controllers.BaseResponse
+// @Description 获取免责声明
+// @router /disclaimer [get]
+func (a *AuthController) Disclaimer() {
+	controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
+		result = a.InitWrapData("获取免责声明失败")
+		fileConfig := config.GetConfig(contants.FILE).(*config.FileConfig)
+		//publicKey := config.GetConfig(contants.FILE).(*config.FileConfig).GetPublicKey()
+		disclaimerFile := fileConfig.GetDisclaimer()
+		content, err := readTextConfig(disclaimerFile)
+		if err != nil {
+			a.FailedResult("获取免责声明失败", result)
+		}
+		a.SuccessResult("获取免责声明成功", FileResp{
+			Content: content,
+		}, result)
+		return
+	})
+}
 
 // 读取纯文本文件
 func readTextConfig(filename string) (content string, err error) {

+ 64 - 35
domian/media/media_service.go

@@ -8,6 +8,8 @@ import (
 	reportService "eta_mini_ht_api/domian/report"
 	"eta_mini_ht_api/models"
 	mediaDao "eta_mini_ht_api/models/media"
+	"sort"
+	"time"
 )
 
 const (
@@ -15,9 +17,9 @@ const (
 	ASC  models.Order = "asc"
 
 	ESIndex         = "media_index"
-	ESColumn        = "media_name"
-	ESRangeColumn   = "media_id"
-	ConditionColumn = "media_type"
+	ESColumn        = "mediaName"
+	ESRangeColumn   = "mediaId"
+	ConditionColumn = "mediaType"
 )
 
 var (
@@ -36,80 +38,103 @@ type MediaDTO struct {
 	MediaName        string   `json:"mediaName"`
 	SourceType       string   `json:"sourceType"`
 	MediaPlaySeconds int      `json:"mediaPlaySeconds"`
-	PermissionIDs    string   `json:"permissionIDs"`
+	PublishedTime    string   `json:"publishedTime"`
+	PermissionIDs    string   `json:"permissionIds"`
 	PermissionNames  []string `json:"permissionNames,omitempty"`
 	Highlight        []string `json:"highlight,omitempty"`
 }
 
 func SearchMediaList(mediaType string, key string, from int, size int, max int64) (reports []MediaDTO, err error) {
 	//同步es
-	sorts := append(sortField, "media_id:desc")
+	sorts := append(sortField, "publishedTime:desc")
 	request := matchRangeByCondition(key, from, size, max, sorts, ConditionColumn, mediaType)
 	re, err := elastic().Search(request)
 	if err != nil {
-		logger.Error("es:%v", err)
+		logger.Error("es搜索失败:%v", err)
 	}
 	hits := elastic().GetSource(re.Hits)
 	for _, hit := range hits {
 		var content map[string][]string
 		err = json.Unmarshal(hit.Highlight, &content)
-		report := MediaDTO{}
-		report.Highlight = content[ESColumn]
-		err = json.Unmarshal(hit.Source, &report)
+		meida := MediaDTO{}
+		err = json.Unmarshal(hit.Source, &meida)
 		if err != nil {
-			logger.Error("解析研报数据失败:%v", err)
+			logger.Error("解析媒体数据失败:%v", err)
 			continue
 		}
-		reports = append(reports, report)
+		meida.Highlight = content[ESColumn]
+		meida.PublishedTime = meida.PublishedTime[:10]
+		reports = append(reports, meida)
 	}
 	return
 }
-func SearchMaxMediaId(mediaType string) (mediaId int64) {
-	sort := []string{"media_id:desc"}
-	request := matchAllByCondition(sort, ConditionColumn, mediaType)
+func SearchMaxMediaId(mediaType string, key string) (total int64, latestId int64) {
+	sort := []string{"mediaId:desc"}
+	request := matchAllByCondition(sort, key, ConditionColumn, mediaType)
 	//同步es
-	re, err := elastic().Search(request)
+	//re, err := elastic().Search(request)
+	re, err := elastic().Count(request)
 	if err != nil {
-		logger.Error("es:%v", err)
+		logger.Error("es搜索失败:%v", err)
 	}
-	hits := elastic().GetSource(re.Hits)
-	if len(hits) > 0 {
+	count := re.Count
+	total = int64(count)
+	if total > 0 {
+		request = matchByCondition(sort, key, ConditionColumn, mediaType, 0, count)
+		re, err = elastic().Search(request)
+		if err != nil {
+			logger.Error("es搜索异常:%v", err)
+		}
+		hits := elastic().GetSource(re.Hits)
 		data := hits[0].Source
 		media := MediaDTO{}
 		err = json.Unmarshal(data, &media)
 		if err != nil {
-			logger.Error("获取当前最大研报id失败:%v", err)
-			return 0
+			logger.Error("获取当前最大媒体id失败:%v", err)
+			return
 		}
-		return int64(media.MediaPlaySeconds)
+		total = int64(len(hits))
+		latestId = int64(media.MediaId)
+		return
 	}
-	return 0
+	return
 }
-func GetTotalPageCount(mediaType string) (count int64) {
+func GetMediaPermissionMappingByPermissionIds(mediaType string, permissionIds []int) (total int64, latestId int64, ids []int) {
+	ids, err := mediaDao.GetMediaPermissionMappingByPermissionId(mediaType, permissionIds)
+	if err != nil {
+		logger.Error("获取当前最大媒体id失败:%v", err)
+		return 0, 0, ids
+	}
+	sort.Slice(ids, func(i, j int) bool {
+		return ids[i] > ids[j]
+	})
+	return int64(len(ids)), int64(ids[0]), ids
+}
+func GetTotalPageCount(mediaType string) (count int64, latestId int64) {
 	return mediaDao.GetCountByMediaType(mediaType)
 }
-func GetMediaPage(mediaType string, pageInfo page.PageInfo) (list []MediaDTO, err error) {
+func GetMediaPageByIds(mediaType string, pageInfo page.PageInfo, mediaIds []int) (list []MediaDTO, err error) {
 	offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
-	reports, err := mediaDao.GetMediaPage(pageInfo.LatestId, pageInfo.PageSize, offset, mediaType)
-	if err == nil && reports != nil {
-		for _, report := range reports {
-			dto := convertMediaDTO(report)
+	medias, err := mediaDao.GetMediaPageByIds(pageInfo.LatestId, pageInfo.PageSize, offset, mediaType, mediaIds)
+	if err == nil && medias != nil {
+		for _, media := range medias {
+			dto := convertMediaDTO(media)
 			list = append(list, dto)
 		}
 	}
 	return
 }
-
-func convertMediaDTO(media mediaDao.Medias) MediaDTO {
+func convertMediaDTO(media mediaDao.Media) MediaDTO {
 	return MediaDTO{
-		MediaId:          media.ID,
+		MediaId:          media.Id,
 		AuthorName:       media.AuthorName,
-		MediaType:        media.MediaType,
+		MediaType:        string(media.MediaType),
 		Src:              media.Src,
 		MediaName:        media.MediaName,
 		SourceType:       media.SourceType,
 		MediaPlaySeconds: media.MediaPlaySeconds,
 		PermissionIDs:    media.PermissionIDs,
+		PublishedTime:    media.PublishedTime.Format(time.DateOnly),
 	}
 }
 
@@ -117,12 +142,16 @@ func GetPermissionsByIds(ids []int) (permissionDTOs []reportService.PermissionDT
 	return reportService.GetFirstPermissionsByIds(ids)
 }
 
-func matchAllByCondition(sorts []string, column string, value string) (request *es.ESQueryRequest) {
+func matchAllByCondition(sorts []string, key string, column string, value string) (request *es.ESQueryRequest) {
 	req := new(es.ESQueryRequest)
-	return req.CreateESQueryRequest(ESIndex, "", "", 0, 1, sorts, es.MatchAllByCondition).ByCondition(column, value)
+	return req.CreateESQueryRequest(ESIndex, ESColumn, key, 0, 1, sorts, es.MatchAllByCondition).ByCondition(column, value)
 }
 
+func matchByCondition(sorts []string, key string, column string, value string, from int, to int) (request *es.ESQueryRequest) {
+	req := new(es.ESQueryRequest)
+	return req.CreateESQueryRequest(ESIndex, ESColumn, key, from, to, sorts, es.MatchAllByCondition).ByCondition(column, value)
+}
 func matchRangeByCondition(key string, from int, to int, max int64, sorts []string, column string, value string) (request *es.ESQueryRequest) {
 	req := new(es.ESQueryRequest)
-	return req.CreateESQueryRequest(ESIndex, ESColumn, key, from, to, sorts, es.Range).Range(0, max, ESRangeColumn).ByCondition(column, value)
+	return req.CreateESQueryRequest(ESIndex, ESColumn, key, from, to, sorts, es.RangeByCondition).Range(0, max, ESRangeColumn).ByCondition(column, value)
 }

+ 24 - 13
domian/report/report_service.go

@@ -90,31 +90,38 @@ func GetGetReportById(reportId int) (ReportDTO ReportDTO, err error) {
 func GetTotalPageCount() (total int64) {
 	return reportDao.GetTotalPageCount()
 }
-func SearchMaxReportId() (reportId int64) {
+func SearchMaxReportId(key string) (total int64, reportId int64) {
 	sort := []string{"reportId:desc"}
-	request := matchAll(sort)
+	request := matchAll(sort, key)
 	//同步es
-	re, err := elastic().Search(request)
+	re, err := elastic().Count(request)
 	if err != nil {
-		logger.Error("es:%v", err)
+		logger.Error("es搜索异常:%v", err)
 	}
-	hits := elastic().GetSource(re.Hits)
-	if len(hits) > 0 {
+	count := re.Count
+	total = int64(count)
+	if total > 0 {
+		request = match(key, 0, count, sort)
+		re, err = elastic().Search(request)
+		if err != nil {
+			logger.Error("es搜索异常:%v", err)
+		}
+		hits := elastic().GetSource(re.Hits)
 		data := hits[0].Source
 		report := ReportDTO{}
 		err = json.Unmarshal(data, &report)
 		if err != nil {
 			logger.Error("获取当前最大研报id失败:%v", err)
-			return 0
+			return
 		}
-		return int64(report.ReportID)
+		reportId = int64(report.ReportID)
 	}
-	return 0
+	return
 }
 
 func SearchReportList(key string, from int, size int, max int64) (reports []ReportDTO, err error) {
 	//同步es
-	sorts := append(sortField, "reportId:desc")
+	sorts := append(sortField, "publishedTime:desc")
 	request := matchRange(key, from, size, max, sorts)
 	re, err := elastic().Search(request)
 	if err != nil {
@@ -136,6 +143,7 @@ func SearchReportList(key string, from int, size int, max int64) (reports []Repo
 		}
 		report.Highlight = content[ESColumn]
 		report.Title = report.Highlight[0]
+		report.PublishedTime = report.PublishedTime[:10]
 		reports = append(reports, report)
 	}
 	return
@@ -307,11 +315,14 @@ func convertReportDTO(report reportDao.Report) (reportDTO ReportDTO) {
 	return
 }
 
-func matchAll(sorts []string) (request *es.ESQueryRequest) {
+func matchAll(sorts []string, key string) (request *es.ESQueryRequest) {
 	req := new(es.ESQueryRequest)
-	return req.CreateESQueryRequest(ESIndex, "", "", 0, 1, sorts, es.MatchAll)
+	return req.CreateESQueryRequest(ESIndex, ESColumn, key, 0, 1, sorts, es.MatchAll)
+}
+func match(key string, from int, to int, sorts []string) (request *es.ESQueryRequest) {
+	req := new(es.ESQueryRequest)
+	return req.CreateESQueryRequest(ESIndex, ESColumn, key, from, to, sorts, es.Match)
 }
-
 func matchRange(key string, from int, to int, max int64, sorts []string) (request *es.ESQueryRequest) {
 	req := new(es.ESQueryRequest)
 	return req.CreateESQueryRequest(ESIndex, ESColumn, key, from, to, sorts, es.Range).Range(0, max, ESRangeColumn)

+ 1 - 1
models/eta/eta_permission.go

@@ -37,7 +37,7 @@ func GetFirstPermissionsByClassifyID(classifyID int) (chartPermissionList []Char
 	return
 }
 func GetFirstPermissionsByIds(ids []int) (chartPermissionList []ChartPermission, err error) {
-	sql := "select chart_permission_id, permission_name where chart_permission_id in (select parent_id from chart_permission WHERE chart_permission_id in ?)"
+	sql := "select chart_permission_id, permission_name from chart_permission where chart_permission_id in (select parent_id from chart_permission WHERE chart_permission_id in ?)"
 	err = doSql(sql, &chartPermissionList, ids)
 	return
 }

+ 1 - 1
models/eta/eta_report.go

@@ -11,7 +11,7 @@ const (
 	published    = 2
 	passed       = 6
 
-	limit                                  = 50
+	limit                                  = 500
 	TlbChartPermissionSearchKeyWordMapping = "chart_permission_search_key_word_mapping"
 )
 

+ 59 - 18
models/media/media.go

@@ -4,38 +4,55 @@ import (
 	"errors"
 	logger "eta_mini_ht_api/common/component/log"
 	"eta_mini_ht_api/models"
+	"gorm.io/gorm"
 	"time"
 )
 
 const (
-	CommonColumns = "id,media_type,src,media_name,source_type,media_play_seconds,permission_ids"
+	CommonColumns = "id,media_type,src,media_name,source_type,media_play_seconds,permission_ids,published_time"
 )
 
-type Medias struct {
-	ID                   int       `gorm:"primary_key;auto_increment;column:id"`
-	AuthorId             int       `gorm:"column:author_id"`
-	AuthorName           string    `gorm:"column:author_name"`
-	MediaType            string    `gorm:"type:enum('video','audio');column:media_type"`
-	Src                  string    `gorm:"type:varchar(255);column:src"`
-	MediaName            string    `gorm:"type:varchar(100);column:media_name"`
-	SourceType           string    `gorm:"type:varchar(255);column:source_type"`
-	MediaPlaySeconds     int       `gorm:"type:int(20);column:media_play_seconds"`
-	PermissionIDs        string    `gorm:"type:varchar(255);column:permission_ids"`
-	ReversePermissionIDS string    `gorm:"column:reverse_permission_ids"`
-	CreatedTime          time.Time `gorm:"type:timestamp;column:created_time"`
-	UpdatedTime          time.Time `gorm:"type:timestamp;column:updated_time"`
+type MediaType string
+
+const (
+	Video MediaType = "video"
+	Audio MediaType = "audio"
+)
+
+type Media struct {
+	Id               int       `gorm:"primary_key;auto_increment;column:id"`
+	AuthorID         int       `gorm:"column:author_id"`
+	AuthorName       string    `gorm:"column:author_name"`
+	MediaType        MediaType `gorm:"column:media_type"`
+	Src              string    `gorm:"column:src"`
+	MediaName        string    `gorm:"column:media_name"`
+	SourceType       string    `gorm:"column:source_type"`
+	MediaPlaySeconds int       `gorm:"column:media_play_seconds"`
+	PermissionIDs    string    `gorm:"column:permission_ids"`
+	PublishedTime    time.Time `gorm:"column:published_time"`
+	Deleted          int       `gorm:"column:deleted"`
+	CreatedTime      time.Time `gorm:"column:created_time"`
+	UpdatedTime      time.Time `gorm:"column:updated_time"`
 }
 
-func GetCountByMediaType(mediaType string) (count int64) {
+func (m *Media) BeforeCreate(_ *gorm.DB) (err error) {
+	m.PublishedTime = time.Now()
+	m.CreatedTime = time.Now()
+	return
+}
+func GetCountByMediaType(mediaType string) (count int64, latestId int64) {
 	db := models.Main()
-	err := db.Model(&Medias{}).Select("Max(id) count").Where("media_type = ?", mediaType).Scan(&count).Error
+	var ids []int
+	err := db.Model(&Media{}).Select("id").Where("media_type = ? and deleted = ?", mediaType, false).Order("id desc").Scan(&ids).Error
 	if err != nil {
-		return 0
+		return 0, 0
 	}
+	count = int64(len(ids))
+	latestId = int64(ids[0])
 	return
 }
 
-func GetMediaPage(latestId int64, limit int, offset int, mediaType string) (mediaList []Medias, err error) {
+func GetMediaPage(latestId int64, limit int, offset int, mediaType string) (mediaList []Media, err error) {
 	if latestId < 0 {
 		err = errors.New("非法的id参数")
 		logger.Error("非法的id参数:%d", latestId)
@@ -49,3 +66,27 @@ func GetMediaPage(latestId int64, limit int, offset int, mediaType string) (medi
 	err = db.Select(CommonColumns).Where("media_type= ? and id<= ?", mediaType, latestId).Order("created_time desc").Limit(limit).Offset(offset).Find(&mediaList).Error
 	return
 }
+func GetMediaPageByIds(latestId int64, limit int, offset int, mediaType string, mediasIds []int) (mediaList []Media, err error) {
+	if len(mediasIds) == 0 {
+		return GetMediaPage(latestId, limit, offset, mediaType)
+	}
+	if latestId < 0 {
+		err = errors.New("非法的id参数")
+		logger.Error("非法的id参数:%d", latestId)
+		return
+	}
+	if limit <= 0 {
+		err = errors.New("非法的limit参数")
+		logger.Error("非法的limit参数:%d", limit)
+	}
+	db := models.Main()
+	err = db.Select(CommonColumns).Where(" id<= ? and media_type= ? and id in ?", latestId, mediaType, mediasIds).Order("created_time desc").Limit(limit).Offset(offset).Find(&mediaList).Error
+	return
+}
+
+// 测试造数据
+func GetlIST() (media []Media) {
+	db := models.Main()
+	_ = db.Model(&Media{}).Where("deleted = ?", false).Find(&media).Error
+	return
+}

+ 23 - 0
models/media/media_permission_mapping.go

@@ -0,0 +1,23 @@
+package media
+
+import "eta_mini_ht_api/models"
+
+// MediaPermissionMapping 表示媒体权限映射
+type MediaPermissionMapping struct {
+	ID           int       `gorm:"primaryKey;autoIncrement;column:id"` // 主键
+	PermissionID int       `gorm:"column:permission_id;not null"`      // 权限 ID
+	MediaID      int       `gorm:"column:media_id;not null"`           // 媒体 ID
+	MediaType    MediaType `gorm:"column:media_type;not null"`         // 媒体类型
+}
+
+func GetMediaPermissionMappingByPermissionId(mediaType string, permissionIds []int) (mediaIds []int, err error) {
+	db := models.Main()
+	err = db.Model(&MediaPermissionMapping{}).Select("DISTINCT media_id").Where("media_type = ? and deleted =? and permission_id in ?", mediaType, false, permissionIds).Scan(&mediaIds).Error
+	return
+}
+
+func InsertMediaPermissionMapping(mediaType MediaPermissionMapping) {
+	db := models.Main()
+	_ = db.Create(&mediaType).Error
+	return
+}

+ 10 - 0
routers/commentsRouter.go

@@ -14,6 +14,7 @@ func init() {
             AllowHTTPMethods: []string{"get"},
             MethodParams: param.Make(
 				param.New("mediaType"),
+				param.New("permissionIds"),
 			),
             Filters: nil,
             Params: nil})
@@ -114,6 +115,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
+        beego.ControllerComments{
+            Method: "Disclaimer",
+            Router: `/disclaimer`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
         beego.ControllerComments{
             Method: "Login",

+ 19 - 7
service/media/media_service.go

@@ -10,24 +10,36 @@ import (
 	"sync"
 )
 
-func GetTotalPageCount(mediaType string) (count int64) {
+func GetTotalPageCount(mediaType string) (count int64, latestId int64) {
 	if mediaType == "" {
-		return 0
+		return
 	}
 	return mediaService.GetTotalPageCount(mediaType)
 }
-func SearchMaxMediaId(mediaType string) (id int64) {
-	return mediaService.SearchMaxMediaId(mediaType)
+
+func GetTotalPageCountByPermissionIds(mediaType string, permissionIds []int) (total int64, latestId int64, ids []int) {
+	if mediaType == "" {
+		return
+	}
+	if len(permissionIds) == 0 {
+		total, latestId = mediaService.GetTotalPageCount(mediaType)
+		ids = []int{}
+		return
+	}
+	return mediaService.GetMediaPermissionMappingByPermissionIds(mediaType, permissionIds)
+}
+func SearchMaxMediaId(mediaType string, key string) (total int64, latestId int64) {
+	return mediaService.SearchMaxMediaId(mediaType, key)
 }
-func GetMediaPage(mediaType string, pageInfo page.PageInfo) (list []mediaService.MediaDTO, err error) {
-	list, err = mediaService.GetMediaPage(mediaType, pageInfo)
+
+func GetMediaPageByIds(mediaType string, pageInfo page.PageInfo, mediaIds []int) (list []mediaService.MediaDTO, err error) {
+	list, err = mediaService.GetMediaPageByIds(mediaType, pageInfo, mediaIds)
 	//并发获取媒体的标签
 	var wg sync.WaitGroup
 	wg.Add(len(list))
 	for i := 0; i < len(list); i++ {
 		go func(media *mediaService.MediaDTO) {
 			defer wg.Done()
-
 			idStr := strings.Split(media.PermissionIDs, ",")
 			var ids []int
 			ids, err = stringUtils.StringToIntSlice(idStr)

+ 2 - 2
service/report/report_service.go

@@ -121,8 +121,8 @@ func SearchReportList(key string, pageInfo page.PageInfo) (reports []reportServi
 	return
 }
 
-func SearchMaxReportId() (id int64) {
-	return reportService.SearchMaxReportId()
+func SearchMaxReportId(key string) (total int64, id int64) {
+	return reportService.SearchMaxReportId(key)
 }
 
 // GetReportPage 分页获取报告列表

+ 75 - 0
task/eta/media/eta_media_task.go

@@ -0,0 +1,75 @@
+package report
+
+import (
+	"eta_mini_ht_api/common/component/es"
+	"eta_mini_ht_api/models/media"
+	"eta_mini_ht_api/task/base"
+	"strconv"
+	"strings"
+	"time"
+)
+
+var (
+	taskName base.TaskType = "ETAMediaDataTask"
+	cron                   = "0/10 * * * * *"
+)
+
+// Execute Task ETA取研报的数据
+func (re *MediaTask) Execute(taskDetail *base.TaskDetail) error {
+	lists := media.GetlIST()
+	for _, list := range lists {
+		ids := strings.Split(list.PermissionIDs, ",")
+		for _, item := range ids {
+			x, _ := strconv.Atoi(item)
+			aa := media.MediaPermissionMapping{
+				MediaID:      list.Id,
+				MediaType:    list.MediaType,
+				PermissionID: x,
+			}
+			media.InsertMediaPermissionMapping(aa)
+		}
+	}
+	es1 := convert(lists)
+	for _, item := range es1 {
+		es.GetInstance().Add("media_index", item.MediaId, item)
+	}
+	return nil
+}
+func convert(list []media.Media) []ESMedia {
+	var esMedia []ESMedia
+	for _, item := range list {
+		esMedia = append(esMedia, ESMedia{
+			MediaId:          item.Id,
+			AuthorId:         item.AuthorID,
+			AuthorName:       item.AuthorName,
+			MediaType:        string(item.MediaType),
+			Src:              item.Src,
+			MediaName:        item.MediaName,
+			SourceType:       item.SourceType,
+			MediaPlaySeconds: item.MediaPlaySeconds,
+			PermissionIDs:    item.PermissionIDs,
+			PublishedTime:    item.PublishedTime.Format(time.DateTime),
+		})
+	}
+	return esMedia
+}
+
+type ESMedia struct {
+	MediaId          int    `json:"mediaId"`
+	AuthorId         int    `json:"authorId"`
+	AuthorName       string `json:"authorName"`
+	MediaType        string `json:"mediaType"`
+	Src              string `json:"src"`
+	MediaName        string `json:"mediaName"`
+	SourceType       string `json:"sourceType"`
+	MediaPlaySeconds int    `json:"mediaPlaySeconds"`
+	PermissionIDs    string `json:"permissionIds"`
+	PublishedTime    string `json:"publishedTime"`
+}
+type MediaTask struct {
+}
+
+func init() {
+	reportTask := base.NewTask(taskName, cron, new(MediaTask), base.PROD)
+	base.RegisterTask(&reportTask)
+}

+ 1 - 1
task/eta/report/eta_report_task.go

@@ -11,7 +11,7 @@ import (
 
 var (
 	taskName base.TaskType = "ETAReportSyncTask"
-	cron                   = "0/10 * * * * *"
+	cron                   = "0/5 * * * * *"
 )
 
 // Execute Task ETA取研报的数据

+ 1 - 0
task/task_starter.go

@@ -3,6 +3,7 @@ package task
 import (
 	"eta_mini_ht_api/task/base"
 	_ "eta_mini_ht_api/task/eta/author"
+	_ "eta_mini_ht_api/task/eta/media"
 	_ "eta_mini_ht_api/task/eta/report"
 	_ "eta_mini_ht_api/task/sms"
 	"github.com/beego/beego/v2/server/web"