kobe6258 3 mēneši atpakaļ
vecāks
revīzija
ef2c34e867

+ 2 - 0
common/exception/exc_enums.go

@@ -88,6 +88,7 @@ const (
 	GetOrderListFailed
 	GetOrderDetailFailed
 	CloseOrderFailed
+	GetBookMarkListFailed
 )
 
 // WechatErrCode 微信
@@ -234,6 +235,7 @@ var ErrorMap = map[int]string{
 	GetOrderListFailed:                 "获取产品订单列表失败",
 	GetOrderDetailFailed:               "获取订单详情失败",
 	CloseOrderFailed:                   "关闭订单失败",
+	GetBookMarkListFailed:              "获取收藏列表失败",
 	//微信
 	WeChatServerError:    "微信服务器发生错误",
 	WechatUserInfoFailed: "获取微信用户信息失败",

+ 296 - 30
controllers/user/bookmark_controller.go

@@ -1,17 +1,25 @@
 package user
 
 import (
+	"errors"
 	"eta/eta_mini_ht_api/common/component/cache"
+	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/common/exception"
+	"eta/eta_mini_ht_api/common/utils/page"
 	"eta/eta_mini_ht_api/controllers"
+	permissionService "eta/eta_mini_ht_api/domian/config"
+	reportDomian "eta/eta_mini_ht_api/domian/report"
 	chartService "eta/eta_mini_ht_api/service/media"
+	"eta/eta_mini_ht_api/service/report"
 	"eta/eta_mini_ht_api/service/user"
 	userService "eta/eta_mini_ht_api/service/user"
+	"gorm.io/gorm"
+	"sync"
 )
 
 // BookMarkController Operations about bookmark
 type BookMarkController struct {
-	controllers.BaseController
+	controllers.ListController
 	redis *cache.RedisCache
 }
 
@@ -20,8 +28,9 @@ const (
 	Report = "report"
 )
 
-func (u *BookMarkController) Prepare() {
-	u.redis = cache.GetInstance()
+func (bk *BookMarkController) Prepare() {
+	bk.ListController.Prepare()
+	bk.redis = cache.GetInstance()
 }
 
 type BookMarkReq struct {
@@ -38,27 +47,27 @@ type BookMarkReq struct {
 // @Description 收藏
 // @Success 200 {object} controllers.BaseResponse
 // @router /bookMark [post]
-func (u *BookMarkController) BookMark() {
-	controllers.Wrap(&u.BaseController, func() (result *controllers.WrapData, err error) {
-		result = u.InitWrapData("收藏失败")
+func (bk *BookMarkController) BookMark() {
+	controllers.Wrap(&bk.BaseController, func() (result *controllers.WrapData, err error) {
+		result = bk.InitWrapData("收藏失败")
 		bookMark := new(BookMarkReq)
-		u.GetPostParams(bookMark)
+		bk.GetPostParams(bookMark)
 		var userInfo user.User
-		userInfo = u.Data["user"].(user.User)
+		userInfo = bk.Data["user"].(user.User)
 		if bookMark.SourceType == "" {
-			u.FailedResult("收藏失败", result)
+			bk.FailedResult("收藏失败", result)
 			err = exception.New(exception.IllegalSourceType)
 			return
 		}
 		if bookMark.SourceId == 0 {
-			u.FailedResult("收藏失败", result)
+			bk.FailedResult("收藏失败", result)
 			err = exception.New(exception.IllegalSourceId)
 			return
 		}
 		err = userService.BookMark(userInfo.Id, bookMark.SourceId, bookMark.SourceType)
 		if err != nil {
 			err = exception.NewWithException(exception.FeedBackError, err.Error())
-			u.FailedResult("收藏失败", result)
+			bk.FailedResult("收藏失败", result)
 			return
 		}
 		//将图表加入es
@@ -70,7 +79,7 @@ func (u *BookMarkController) BookMark() {
 				UniqueCode:  bookMark.UniqueCode,
 			})
 		}
-		u.SuccessResult("收藏成功", nil, result)
+		bk.SuccessResult("收藏成功", nil, result)
 		return
 	})
 }
@@ -80,30 +89,30 @@ func (u *BookMarkController) BookMark() {
 // @Description 取消收藏
 // @Success 200 {object} controllers.BaseResponse
 // @router /unBookMark [post]
-func (u *BookMarkController) UnBookMark() {
-	controllers.Wrap(&u.BaseController, func() (result *controllers.WrapData, err error) {
-		result = u.InitWrapData("取消收藏失败")
+func (bk *BookMarkController) UnBookMark() {
+	controllers.Wrap(&bk.BaseController, func() (result *controllers.WrapData, err error) {
+		result = bk.InitWrapData("取消收藏失败")
 		bookMark := new(BookMarkReq)
-		u.GetPostParams(bookMark)
+		bk.GetPostParams(bookMark)
 		var userInfo user.User
-		userInfo = u.Data["user"].(user.User)
+		userInfo = bk.Data["user"].(user.User)
 		if bookMark.SourceType == "" {
-			u.FailedResult("取消收藏失败", result)
+			bk.FailedResult("取消收藏失败", result)
 			err = exception.New(exception.IllegalSourceType)
 			return
 		}
 		if bookMark.SourceId == 0 {
-			u.FailedResult("取消收藏失败", result)
+			bk.FailedResult("取消收藏失败", result)
 			err = exception.New(exception.IllegalSourceId)
 			return
 		}
 		err = userService.UnBookMark(userInfo.Id, bookMark.SourceId, bookMark.SourceType)
 		if err != nil {
 			err = exception.NewWithException(exception.FeedBackError, err.Error())
-			u.FailedResult("取消收藏失败", result)
+			bk.FailedResult("取消收藏失败", result)
 			return
 		}
-		u.SuccessResult("收藏成功", nil, result)
+		bk.SuccessResult("收藏成功", nil, result)
 		return
 	})
 }
@@ -117,32 +126,289 @@ type CheckBookMarkResp struct {
 // @Description 取消收藏
 // @Success 200 {object} controllers.BaseResponse
 // @router /checkBookMark [post]
-func (u *BookMarkController) CheckBookMark() {
-	controllers.Wrap(&u.BaseController, func() (result *controllers.WrapData, err error) {
-		result = u.InitWrapData("取消收藏失败")
+func (bk *BookMarkController) CheckBookMark() {
+	controllers.Wrap(&bk.BaseController, func() (result *controllers.WrapData, err error) {
+		result = bk.InitWrapData("取消收藏失败")
 		bookMark := new(BookMarkReq)
-		u.GetPostParams(bookMark)
+		bk.GetPostParams(bookMark)
 		var userInfo user.User
-		userInfo = u.Data["user"].(user.User)
+		userInfo = bk.Data["user"].(user.User)
 		if bookMark.SourceType == "" {
-			u.FailedResult("获取是否收藏失败", result)
+			bk.FailedResult("获取是否收藏失败", result)
 			err = exception.New(exception.IllegalSourceType)
 			return
 		}
 		if bookMark.SourceId == 0 {
-			u.FailedResult("获取是否收藏失败", result)
+			bk.FailedResult("获取是否收藏失败", result)
 			err = exception.New(exception.IllegalSourceId)
 			return
 		}
 		isBookMarked, err := userService.CheckBookMarkStatus(userInfo.Id, bookMark.SourceId, bookMark.SourceType)
 		if err != nil {
 			err = exception.NewWithException(exception.FeedBackError, err.Error())
-			u.FailedResult("获取是否收藏失败", result)
+			bk.FailedResult("获取是否收藏失败", result)
 			return
 		}
-		u.SuccessResult("获取是否收藏成功", &CheckBookMarkResp{
+		bk.SuccessResult("获取是否收藏成功", &CheckBookMarkResp{
 			IsBookMarked: isBookMarked,
 		}, result)
 		return
 	})
 }
+
+// BookMarkSearch 搜索收藏列表
+// @Description 搜索报告列表
+// @Success 200 {object}
+// @router /bookMarkSearch [get]
+func (bk *BookMarkController) BookMarkSearch(key string) {
+	controllers.Wrap(&bk.BaseController, func() (result *controllers.WrapData, err error) {
+		result = bk.InitWrapData("分页搜索报告列表失败")
+		if key == "" {
+			err = exception.New(exception.SearchKeyEmptyError)
+			bk.FailedResult("分页搜索报告列表失败", result)
+			return
+		}
+		userInfo := bk.Data["user"].(user.User)
+		pageRes := page.Page{
+			Current:  bk.PageInfo.Current,
+			PageSize: bk.PageInfo.PageSize,
+		}
+		//获取当前可以被搜索的报告原始ID
+		//先要限制查询的id范围
+		var reportIds []int
+		var mappingRiskLevel string
+		var userRiskStatus string
+		pageRes.Total, pageRes.LatestId, reportIds, _, mappingRiskLevel, userRiskStatus, err = report.RangeSearch(key, true, userInfo.Id)
+		if err != nil {
+			logger.Error("获取报告原始ID列表失败:%v", err)
+			bk.FailedResult("分页搜索报告列表失败", result)
+			return
+		}
+		if len(reportIds) == 0 {
+			reports := new(page.PageResult)
+			reports.Data = []reportDomian.ReportDTO{}
+			reports.Page = pageRes
+			logger.Info("没有可以查询的报告列表")
+			bk.SuccessResult("分页搜索报告列表成功", reports, result)
+			return
+		}
+
+		if bk.PageInfo.LatestId == 0 {
+			//pageRes.Total, pageRes.LatestId = report.SearchMaxReportId(key)
+			bk.PageInfo.LatestId = pageRes.LatestId
+			bk.PageInfo.Total = pageRes.Total
+		} else {
+			pageRes.LatestId = bk.PageInfo.LatestId
+			pageRes.Total = bk.PageInfo.Total
+		}
+		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
+		list := make([]reportDomian.ReportDTO, 0)
+		if pageRes.LatestId > 0 {
+			list, err = report.SearchReportList(key, reportIds, bk.PageInfo, true, userInfo.Id, mappingRiskLevel, userRiskStatus)
+			if err != nil {
+				bk.FailedResult("分页搜索报告列表失败", result)
+				return
+			}
+		}
+		reports := new(page.PageResult)
+		reports.Data = list
+		reports.Page = pageRes
+		bk.SuccessResult("分页搜索报告列表成功", reports, result)
+		return
+	})
+}
+
+type BookMarkListReq struct {
+	SourceType string `json:"source_type"`
+}
+
+type BookMarkChart struct {
+	ChartName   string `json:"chartName"`
+	ChartImage  string `json:"chartImage"`
+	UniqueCode  string `json:"uniqueCode"`
+	ChartInfoId int    `json:"chartInfoId"`
+}
+type BookMarkReport struct {
+	ChartName   string `json:"chartName"`
+	ChartImage  string `json:"chartImage"`
+	UniqueCode  string `json:"uniqueCode"`
+	ChartInfoId int    `json:"chartInfoId"`
+}
+
+// BookMarkList 获取收藏列表
+// @Description 获取收藏列表
+// @Success 200 {object}
+// @router /bookMarkList [get]
+func (bk *BookMarkController) BookMarkList(sourceType string) {
+	controllers.Wrap(&bk.BaseController, func() (result *controllers.WrapData, err error) {
+		result = bk.InitWrapData("分页查询收藏列表失败")
+		pageRes := page.Page{
+			Current:  bk.PageInfo.Current,
+			PageSize: bk.PageInfo.PageSize,
+		}
+		if sourceType == "" || (sourceType != Report && sourceType != Chart) {
+			err = exception.New(exception.IllegalSourceType)
+			bk.FailedResult("分页查询收藏列表失败", result)
+			return
+		}
+		userInfo := bk.Data["user"].(user.User)
+		var sourceIds []int
+		pageRes.Total, sourceIds, err = user.GetTotalBookMarkPageBySourceType(userInfo.Id, sourceType)
+		//隐藏品种信息未设置风险等级的报告
+		if sourceType == Report {
+			pageRes.Total, sourceIds, err = report.FilterReportIds(sourceIds)
+		}
+		if pageRes.Total == 0 {
+			bookMarks := new(page.PageResult)
+			bookMarks.Data = []interface{}{}
+			bookMarks.Page = pageRes
+			bk.SuccessResult("分页查询收藏列表成功", bookMarks, result)
+			return
+		}
+		pageRes.Total = bk.PageInfo.Total
+		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
+		switch sourceType {
+		case Report:
+			var list []BookMarkReport
+			list, err = getReportList(bk.PageInfo, userInfo.Id, sourceIds)
+			if err != nil {
+				err = exception.NewWithException(exception.GetBookMarkListFailed, err.Error())
+				bk.FailedResult("分页查询收藏列表失败", result)
+				return
+			}
+			bookMarks := new(page.PageResult)
+			bookMarks.Data = list
+			bookMarks.Page = pageRes
+			bk.SuccessResult("分页查询收藏列表成功", bookMarks, result)
+			return
+		case Chart:
+			var list []BookMarkChart
+			list, err = getChartList(bk.PageInfo, userInfo.Id)
+			if err != nil {
+				err = exception.NewWithException(exception.GetBookMarkListFailed, err.Error())
+				bk.FailedResult("分页查询收藏列表失败", result)
+				return
+			}
+			bookMarks := new(page.PageResult)
+			bookMarks.Data = list
+			bookMarks.Page = pageRes
+			bk.SuccessResult("分页查询收藏列表成功", bookMarks, result)
+			return
+		default:
+			err = exception.New(exception.IllegalSourceType)
+			bk.FailedResult("分页查询收藏列表失败", result)
+			return
+		}
+	})
+}
+
+func getReportList(info page.PageInfo, templateUserId int, sourceIds []int) (list []BookMarkReport, err error) {
+	sourceIds, err = userService.GetBookMarkPageRangeBySourceType(templateUserId, info, Report, sourceIds)
+	if err != nil {
+		return
+	}
+	userProfile, userErr := user.GetUserProfile(templateUserId)
+	if userErr != nil {
+		if errors.Is(userErr, gorm.ErrRecordNotFound) {
+			err = exception.New(exception.TemplateUserNotFound)
+		} else {
+			err = exception.New(exception.TemplateUserFoundFailed)
+		}
+		logger.Error("获取临时客户信息失败:%v", err)
+		return
+	}
+	var mappingRiskLevel, userRiskStatus string
+	userRiskStatus = userProfile.RiskLevelStatus
+	if userProfile.RiskLevel != "" {
+		var mapping permissionService.CustomerProductRiskMappingDTO
+		mapping, err = permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
+		if err != nil {
+			logger.Error("查询产品风险等级映射失败:%v", err)
+			return
+		}
+		mappingRiskLevel = mapping.ProductRiskLevel
+	}
+	reports, err := report.GetReportListById(templateUserId, sourceIds, mappingRiskLevel, userRiskStatus)
+	if err != nil {
+		return nil, err
+	}
+	// 创建一个切片来存储结果,长度与 sourceIds 相同
+	list = make([]BookMarkReport, len(sourceIds))
+	// 使用 WaitGroup 来等待所有 goroutine 完成
+	var wg sync.WaitGroup
+	wg.Add(len(sourceIds))
+	// 使用 Mutex 来保护对 list 的写操作
+	var mu sync.Mutex
+	// 并发获取数据
+	for index, sourceId := range sourceIds {
+		go func(index int, id int) {
+			defer wg.Done()
+			var data chartService.ChartInfo
+			data, err = chartService.GetChartById(id)
+			reportInfo := convertToBookMarkChart(data)
+			if err != nil {
+				logger.Error("获取数据失败: %v", err)
+			}
+			// 使用 Mutex 保护对 list 的写操作
+			mu.Lock()
+			list[index] = reportInfo
+			mu.Unlock()
+		}(index, sourceId)
+
+	}
+	// 等待所有 goroutine 完成
+	wg.Wait()
+	return
+}
+
+func getChartList(info page.PageInfo, templateUserId int) (list []BookMarkChart, err error) {
+	sourceIds, err := userService.GetBookMarkPageBySourceType(templateUserId, info, Chart)
+	if err != nil {
+		return
+	}
+	// 创建一个切片来存储结果,长度与 sourceIds 相同
+	list = make([]BookMarkChart, len(sourceIds))
+	// 使用 WaitGroup 来等待所有 goroutine 完成
+	var wg sync.WaitGroup
+	wg.Add(len(sourceIds))
+	// 使用 Mutex 来保护对 list 的写操作
+	var mu sync.Mutex
+	// 并发获取数据
+	for index, sourceId := range sourceIds {
+		go func(index int, id int) {
+			defer wg.Done()
+			var data chartService.ChartInfo
+			data, err = chartService.GetChartById(id)
+			chartInfo := convertToBookMarkChart(data)
+			if err != nil {
+				logger.Error("获取数据失败: %v", err)
+			}
+			// 使用 Mutex 保护对 list 的写操作
+			mu.Lock()
+			list[index] = chartInfo
+			mu.Unlock()
+		}(index, sourceId)
+
+	}
+	// 等待所有 goroutine 完成
+	wg.Wait()
+	return
+}
+
+func convertToBookMarkChart(chart chartService.ChartInfo) BookMarkChart {
+	return BookMarkChart{
+		ChartName:   chart.ChartName,
+		ChartImage:  chart.ChartImage,
+		UniqueCode:  chart.UniqueCode,
+		ChartInfoId: chart.ChartInfoId,
+	}
+}
+
+func convertToBookMarkReport(chart chartService.ChartInfo) BookMarkReport {
+	return BookMarkReport{
+		ChartName:   chart.ChartName,
+		ChartImage:  chart.ChartImage,
+		UniqueCode:  chart.UniqueCode,
+		ChartInfoId: chart.ChartInfoId,
+	}
+}

+ 14 - 0
domian/media/chart_service.go

@@ -69,3 +69,17 @@ func UpdateChartImage(image string, id int) bool {
 	chartInfo.ChartImage = image
 	return elastic().Update(htConfig.GetChartIndex(), chartInfo.ChartInfoId, chartInfo)
 }
+
+func GetChartById(id int) (chartInfo EsChartInfo, err error) {
+	doc, err := elastic().Get(htConfig.GetChartIndex(), id)
+	if err != nil {
+		logger.Error("es获取图表数据失败:%v", err)
+		return
+	}
+	err = json.Unmarshal(doc.Source, &chartInfo)
+	if err != nil {
+		logger.Error("序列化json数据失败,获取图表数据失败:%v", err)
+		return
+	}
+	return
+}

+ 8 - 0
domian/report/report_service.go

@@ -1150,3 +1150,11 @@ type ProductSearchDTO struct {
 func CountPermissionWeight(ids []int) (list []configDao.PermissionWeight, err error) {
 	return reportDao.CountPermissionWeight(ids)
 }
+
+func FilterReportIds(sourceIds []int) (total int64, reportIds []int, err error) {
+	return reportDao.FilterReportIds(sourceIds)
+}
+
+func GetReportListById(reportIds []int) ([]ReportDTO, error) {
+	return reportDao.GetReportListById(reportIds)
+}

+ 33 - 0
domian/user/bookmark_service.go

@@ -3,6 +3,7 @@ package user
 import (
 	"errors"
 	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/common/utils/page"
 	userDao "eta/eta_mini_ht_api/models/user"
 	"gorm.io/gorm"
 )
@@ -53,3 +54,35 @@ func CheckBookMarkStatus(templateUserId int, sourceId int, sourceType string) (s
 	status = string(bookmark.Status)
 	return
 }
+
+func GetTotalBookMarkPageBySourceType(userId int, sourceType string) (total int64, sourceIds []int, err error) {
+	sourceTypeItem := sourceTransMap[sourceType]
+	if sourceTypeItem == "" {
+		logger.Error("非法的资源类型")
+		err = errors.New("非法的资源类型")
+		return
+	}
+	return userDao.GetTotalBookMarkPageBySourceType(userId, sourceTypeItem)
+}
+
+func GetBookMarkPageBySourceType(templateUserId int, sourceType string, info page.PageInfo) (sourceIds []int, err error) {
+	sourceTypeItem := sourceTransMap[sourceType]
+	if sourceTypeItem == "" {
+		logger.Error("非法的资源类型")
+		err = errors.New("非法的资源类型")
+		return
+	}
+	offset := page.StartIndex(info.Current, info.PageSize)
+	return userDao.GetBookMarkPageBySourceType(templateUserId, sourceTypeItem, offset, info.PageSize)
+}
+
+func GetBookMarkPageRangeBySourceType(templateUserId int, sourceType string, info page.PageInfo, sourceIds []int) (filterSourceIds []int, err error) {
+	sourceTypeItem := sourceTransMap[sourceType]
+	if sourceTypeItem == "" {
+		logger.Error("非法的资源类型")
+		err = errors.New("非法的资源类型")
+		return
+	}
+	offset := page.StartIndex(info.Current, info.PageSize)
+	return userDao.GetBookMarkPageRangeBySourceType(templateUserId, sourceTypeItem, offset, info.PageSize, sourceIds)
+}

+ 5 - 0
middleware/auth_middleware.go

@@ -70,6 +70,11 @@ var privateRoutes = []string{
 	"/user/followingAnalystList",
 	"/user/readMessages",
 	"/user/readMessage",
+	"/user/bookMark",
+	"/user/unBookMark",
+	"/user/checkBookMark",
+	"/user/bookMarkList",
+	"/user/bookMarkSearch",
 	"/user/feedback",
 	"/webhook/*",
 	"/user/checkFollowStatus",

+ 31 - 0
models/report/report.go

@@ -5,6 +5,7 @@ import (
 	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/common/utils/date"
 	silce_utils "eta/eta_mini_ht_api/common/utils/silce"
+	"eta/eta_mini_ht_api/domian/report"
 	"eta/eta_mini_ht_api/models"
 	permissionDao "eta/eta_mini_ht_api/models/config"
 	"fmt"
@@ -417,3 +418,33 @@ func GetHiddenReportIds(classifyIds []int, plateNames []string) (reportIds []int
 	err = exc.Scan(&reportIds).Error
 	return
 }
+
+func FilterReportIds(ids []int) (total int64, reportIds []int, err error) {
+	db := models.Main()
+	subQuery := `
+		select a.classify_id 
+		from (
+			select classify_id, GROUP_CONCAT(permissions.risk_level SEPARATOR ',') as risks 
+			from permission_classify_mapping 
+			left join permissions on permissions.permission_id = permission_classify_mapping.permission_id 
+			group by classify_id
+		) a  
+		where a.risks = ''
+	`
+	err = db.Select("id").
+		Where("id in ?", ids).
+		Where("classify_id not in (?)", gorm.Expr(subQuery)).
+		Scan(&reportIds).Error
+	if err != nil {
+		logger.Error("查询过滤后的报告失败: %v", err)
+	}
+	total = int64(len(reportIds))
+	return
+}
+
+func GetReportListById(ids []int) (reports []report.ReportDTO, err error) {
+	db := models.Main()
+	err = db.Select(CommonColumns).
+		Where("id in ?", ids).Find(&reports).Error
+	return
+}

+ 22 - 1
models/user/user_bookmark.go

@@ -22,6 +22,7 @@ type UserBookmark struct {
 	SourceID    int        `gorm:"column:source_id;type:int(11);not null;comment:资源Id"`
 	SourceType  SourceType `gorm:"column:source_type;type:enum('report','chart');not null;comment:资源类型:report-研报 chart-图表"`
 	Status      Status     `gorm:"column:status;type:enum('marked','unmark');not null;comment:是否收藏 :marked-收藏 ,unmark-取消收藏"`
+	MarkedTime  time.Time  `gorm:"column:marked_time;type:datetime;comment:收藏时间"`
 	CreatedTime time.Time  `gorm:"column:created_time;type:datetime;comment:创建时间"`
 	UpdatedTime time.Time  `gorm:"column:updated_time;type:datetime;default:null;onUpdate:CURRENT_TIMESTAMP;comment:更新时间"`
 }
@@ -34,12 +35,13 @@ func BookMark(templateUserId int, sourceId int, sourceType SourceType) (err erro
 	db := models.Main()
 	OnConflictFunc := clause.OnConflict{
 		Columns:   []clause.Column{{Name: "source_id"}, {Name: "source_type"}},
-		DoUpdates: clause.AssignmentColumns([]string{"status"}),
+		DoUpdates: clause.AssignmentColumns([]string{"status", "marked_time"}),
 	}
 	err = db.Clauses(OnConflictFunc).Create(&UserBookmark{
 		UserID:      templateUserId,
 		SourceID:    sourceId,
 		SourceType:  sourceType,
+		MarkedTime:  time.Now(),
 		Status:      Marked,
 		CreatedTime: time.Now(),
 	}).Error
@@ -57,3 +59,22 @@ func CheckBookMarkStatus(templateUserId int, sourceId int, sourceType SourceType
 	err = db.Model(&UserBookmark{}).Select("*").Where("user_id = ? AND source_id = ? AND source_type = ?", templateUserId, sourceId, sourceType).First(&bookmark).Error
 	return
 }
+
+func GetTotalBookMarkPageBySourceType(templateUserId int, sourceType SourceType) (total int64, sourceIds []int, err error) {
+	db := models.Main()
+	err = db.Model(&UserBookmark{}).Select("source_id").Where("user_id = ?  AND source_type = ? and status =?", templateUserId, sourceType, Marked).Order("marked_time DESC").Scan(&sourceIds).Error
+	total = int64(len(sourceIds))
+	return
+}
+
+func GetBookMarkPageBySourceType(templateUserId int, sourceType SourceType, offset int, limit int) (sourceIds []int, err error) {
+	db := models.Main()
+	err = db.Model(&UserBookmark{}).Select("source_id").Where("user_id = ?  AND source_type = ? and status =?", templateUserId, sourceType, Marked).Order("marked_time DESC").Offset(offset).Limit(limit).Scan(&sourceIds).Error
+	return
+}
+
+func GetBookMarkPageRangeBySourceType(templateUserId int, sourceType SourceType, offset int, limit int, sourceIds []int) (filterSourceIds []int, err error) {
+	db := models.Main()
+	err = db.Model(&UserBookmark{}).Select("source_id").Where("user_id = ?  AND source_type = ? and source_id in ? and status =? ", templateUserId, sourceType, sourceIds, Marked).Order("marked_time DESC").Offset(offset).Limit(limit).Scan(&sourceIds).Error
+	return
+}

+ 22 - 0
routers/commentsRouter.go

@@ -431,6 +431,28 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:BookMarkController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:BookMarkController"],
+        beego.ControllerComments{
+            Method: "BookMarkList",
+            Router: `/bookMarkList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(
+				param.New("sourceType"),
+			),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:BookMarkController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:BookMarkController"],
+        beego.ControllerComments{
+            Method: "BookMarkSearch",
+            Router: `/bookMarkSearch`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(
+				param.New("key"),
+			),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:BookMarkController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:BookMarkController"],
         beego.ControllerComments{
             Method: "CheckBookMark",

+ 17 - 0
service/media/chart_service.go

@@ -27,3 +27,20 @@ func AddChartToEs(chartInfo ChartInfo) {
 func UpdateChartImage(image string, id int) bool {
 	return chartService.UpdateChartImage(image, id)
 }
+
+func GetChartById(chartInfoId int) (info ChartInfo, err error) {
+	chart, err := chartService.GetChartById(chartInfoId)
+	if err != nil {
+		return
+	}
+	info = convertChartInfo(chart)
+	return
+}
+func convertChartInfo(chart chartService.EsChartInfo) ChartInfo {
+	return ChartInfo{
+		ChartInfoId: chart.ChartInfoId,
+		ChartName:   chart.ChartName,
+		ChartImage:  chart.ChartImage,
+		UniqueCode:  chart.UniqueCode,
+	}
+}

+ 14 - 0
service/report/report_service.go

@@ -418,6 +418,16 @@ func GetReportPage(pageInfo page.PageInfo, orgIds map[string][]int, discardIds [
 	}
 	return
 }
+
+func GetReportListById(userId int, reportIds []int, mappingRiskLevel, userRiskStatus string) (reports []reportService.ReportDTO, err error) {
+	var list []reportService.ReportDTO
+	list, err = reportService.GetReportListById(reportIds)
+	reports, err = dealReportInfo(list, true, userId, mappingRiskLevel, userRiskStatus)
+	if err != nil {
+		err = exception.New(exception.QueryReportPageFailed)
+	}
+	return
+}
 func GetReportPageByAnalyst(pageInfo page.PageInfo, analyst string, reportIds []int, templateUserId int, mappingRiskLevel, userRiskStatus string) (list []reportService.ReportDTO, err error) {
 	list, err = reportService.GetReportPageByAnalyst(pageInfo, analyst, reportIds)
 	list, err = dealReportInfo(list, true, templateUserId, mappingRiskLevel, userRiskStatus)
@@ -700,3 +710,7 @@ func CountPermissionWeight(ids []int) (permissionMap map[int]int) {
 	}
 	return
 }
+
+func FilterReportIds(reportIds []int) (total int64, filterReportIds []int, err error) {
+	return reportService.FilterReportIds(reportIds)
+}

+ 13 - 0
service/user/user_service.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/common/exception"
+	"eta/eta_mini_ht_api/common/utils/page"
 	permissionService "eta/eta_mini_ht_api/domian/config"
 	analystService "eta/eta_mini_ht_api/domian/financial_analyst"
 	userService "eta/eta_mini_ht_api/domian/user"
@@ -504,3 +505,15 @@ func CheckBookMarkStatus(templateUserId int, sourceId int, sourceType string) (i
 	isBookMarked = status == string(userDao.Marked)
 	return
 }
+
+func GetTotalBookMarkPageBySourceType(userId int, sourceType string) (total int64, sourceIds []int, err error) {
+	return userService.GetTotalBookMarkPageBySourceType(userId, sourceType)
+}
+
+func GetBookMarkPageBySourceType(userId int, pageInfo page.PageInfo, sourceType string) (sourceIds []int, err error) {
+	return userService.GetBookMarkPageBySourceType(userId, sourceType, pageInfo)
+}
+
+func GetBookMarkPageRangeBySourceType(userId int, pageInfo page.PageInfo, sourceType string, sourceIds []int) (filterSourceIds []int, err error) {
+	return userService.GetBookMarkPageRangeBySourceType(userId, sourceType, pageInfo, sourceIds)
+}