Browse Source

风险等级测试过滤报告

kobe6258 6 months ago
parent
commit
57f7e3022a

+ 51 - 6
common/component/es/es.go

@@ -32,11 +32,12 @@ type ESClient struct {
 type SearchType string
 
 const (
-	MatchAll            = "match_all"
-	Match               = "match"
-	Range               = "range"
-	MatchAllByCondition = "match_all_by_condition"
-	RangeByCondition    = "range_by_condition"
+	MatchAll                   = "match_all"
+	Match                      = "match"
+	Range                      = "range"
+	MatchAllByCondition        = "match_all_by_condition"
+	RangeByCondition           = "range_by_condition"
+	RangeByConditionWithDocIds = "range_by_condition_with_doc_ids"
 )
 
 func GetInstance() *ESClient {
@@ -161,6 +162,7 @@ type ESQueryRequest struct {
 	Sorts          []string
 	Type           SearchType
 	RangeColumn    string
+	DocIds         []string
 	Max            interface{}
 	Min            interface{}
 }
@@ -188,7 +190,10 @@ func (req *ESQueryRequest) ByCondition(column string, value string) *ESQueryRequ
 	req.ConditionValue = value
 	return req
 }
-
+func (req *ESQueryRequest) WithDocs(docIds []string) *ESQueryRequest {
+	req.DocIds = docIds
+	return req
+}
 func (req *ESQueryRequest) parseJsonQuery() (queryMap map[string]interface{}) {
 	switch req.Type {
 	case MatchAll:
@@ -295,6 +300,46 @@ func (req *ESQueryRequest) parseJsonQuery() (queryMap map[string]interface{}) {
 			},
 		}
 		return
+	case RangeByConditionWithDocIds:
+		queryMap = map[string]interface{}{
+			"query": map[string]interface{}{
+				"match": map[string]interface{}{
+					req.Column: req.Key,
+				},
+			},
+			"highlight": map[string]interface{}{
+				"fields": map[string]interface{}{
+					req.Column: map[string]interface{}{},
+				},
+				"pre_tags":  []string{"<span style='color:#0078E8'>"},
+				"post_tags": []string{"</span>"},
+			},
+			"post_filter": map[string]interface{}{
+				"bool": map[string]interface{}{
+					"must": []map[string]interface{}{
+						{
+							"range": map[string]interface{}{
+								req.RangeColumn: map[string]interface{}{
+									"gte": req.Min,
+									"lte": req.Max,
+								},
+							},
+						},
+						{
+							"term": map[string]interface{}{
+								req.Condition: req.ConditionValue,
+							},
+						},
+						{
+							"term": map[string]interface{}{
+								"_id": req.DocIds,
+							},
+						},
+					},
+				},
+			},
+		}
+		return
 	default:
 		queryMap = map[string]interface{}{}
 		return

+ 2 - 0
common/exception/exc_enums.go

@@ -89,6 +89,7 @@ const (
 	QueryReportPageFailed
 	SearchReportPageFailed
 	GetReportFailed
+	GetReportSearchRangeFailed
 	SearchKeyEmptyError
 )
 
@@ -158,6 +159,7 @@ var ErrorMap = map[int]string{
 	QueryReportPageFailed:        "分页查询报告列表失败",
 	SearchReportPageFailed:       "分页搜索报告列表失败",
 	GetReportFailed:              "获取研报详情失败",
+	GetReportSearchRangeFailed:   "设置报告搜索范围失败",
 	SearchKeyEmptyError:          "搜索关键字不能为空",
 	//媒体
 	MediaFoundFailed:          "查询媒体信息失败",

+ 94 - 10
controllers/report/report_controller.go

@@ -27,12 +27,32 @@ func (r *ReportController) Search(key string) {
 			r.FailedResult("分页搜索报告列表失败", result)
 			return
 		}
+		detailType := r.Data["detailType"].(string)
+		userInfo := r.Data["user"].(user.User)
 		pageRes := page.Page{
 			Current:  r.PageInfo.Current,
 			PageSize: r.PageInfo.PageSize,
 		}
+		//获取当前可以被搜索的报告原始ID
+		var orgIds map[string][]int
+		//先要限制查询的id范围
+		pageRes.Total, pageRes.LatestId, orgIds = report.RangeSearch(isLogin(detailType), userInfo.Id)
+		reportIds, err := report.GetReportByIdListByOrgIds(orgIds)
+		if err != nil {
+			logger.Error("获取报告原始ID列表失败:%v", err)
+			r.FailedResult("分页搜索报告列表失败", result)
+			return
+		}
+		if len(reportIds) == 0 {
+			reports := new(page.PageResult)
+			reports.Data = []reportService.ReportDTO{}
+			reports.Page = pageRes
+			logger.Info("没有可以查询的报告列表")
+			r.SuccessResult("分页搜索报告列表成功", reports, result)
+			return
+		}
 		if r.PageInfo.LatestId == 0 {
-			pageRes.Total, pageRes.LatestId = report.SearchMaxReportId(key)
+			//pageRes.Total, pageRes.LatestId = report.SearchMaxReportId(key)
 			r.PageInfo.LatestId = pageRes.LatestId
 			r.PageInfo.Total = pageRes.Total
 		} else {
@@ -42,7 +62,7 @@ func (r *ReportController) Search(key string) {
 		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
 		list := make([]reportService.ReportDTO, 0)
 		if pageRes.LatestId > 0 {
-			list, err = report.SearchReportList(key, r.PageInfo)
+			list, err = report.SearchReportList(key, reportIds, r.PageInfo)
 			if err != nil {
 				r.FailedResult("分页搜索报告列表失败", result)
 				return
@@ -101,6 +121,7 @@ func (r *ReportController) List(permissionIds string) {
 		if len(permissionIdList) == 0 && len(reportOrgIds) > 0 {
 			err = exception.New(exception.UnknownError)
 			r.FailedResult("查询报告列表失败", result)
+			return
 		}
 
 		list, err := report.GetReportPage(r.PageInfo, reportOrgIds, false, isLogin(detailType))
@@ -136,19 +157,43 @@ func (r *ReportController) HotRanked(permissionIds string, limit int) {
 			limit = 3
 		}
 		result = r.InitWrapData("获取本周最热报告列表失败")
+		detailType := r.Data["detailType"].(string)
+		userInfo := r.Data["user"].(user.User)
+		//
+		permissionIdsWithRisk, err := report.RangePermissionIds(isLogin(detailType), userInfo.Id)
+		if err != nil {
+			logger.Error("获取带有风险等级的品种列表错误:%v", err)
+			r.FailedResult("获取最热报告列表失败", result)
+			err = exception.New(exception.GetHotRandListFailed)
+			return
+		}
+		if len(permissionIdsWithRisk) == 0 {
+			r.SuccessResult("获取本周最热报告列表成功", []report.HotRankedReport{}, result)
+			return
+		}
 		list, err := report.GetRandedReportByWeeklyHot(limit)
 		//二级品种
 		permissionIdList, err := r.TransPermissionIds(permissionIds)
 		if err != nil {
 			logger.Error("品种列表解析错误:%v", err)
-			r.FailedResult("分页查询报告列表失败", result)
-			err = exception.New(exception.QueryReportPageFailed)
+			r.FailedResult("获取最热报告列表失败", result)
+			err = exception.New(exception.GetHotRandListFailed)
 			return
 		}
 		filterList := make([]report.HotRankedReport, 0)
 		if len(permissionIdList) > 0 {
+			//通过有权限的品种过滤查询品种
+			var filterPermissionIds []int
+			for _, permissionId := range permissionIdList {
+				for _, permissionIdWIthRisk := range permissionIdsWithRisk {
+					if permissionId == permissionIdWIthRisk {
+						filterPermissionIds = append(filterPermissionIds, permissionId)
+						break
+					}
+				}
+			}
 			for _, item := range list {
-				for _, permissionId := range permissionIdList {
+				for _, permissionId := range filterPermissionIds {
 					if _, ok := item.SecondPermissions[permissionId]; ok {
 						filterList = append(filterList, item)
 						break
@@ -156,7 +201,14 @@ func (r *ReportController) HotRanked(permissionIds string, limit int) {
 				}
 			}
 		} else {
-			filterList = list
+			for _, item := range list {
+				for _, permissionId := range permissionIdList {
+					if _, ok := item.SecondPermissions[permissionId]; ok {
+						filterList = append(filterList, item)
+						break
+					}
+				}
+			}
 		}
 		if err != nil {
 			r.FailedResult("获取本周最热报告列表成功", result)
@@ -177,6 +229,20 @@ func (r *ReportController) PublishRanked(permissionIds string, limit int, week b
 		if limit <= 0 {
 			limit = 3
 		}
+		detailType := r.Data["detailType"].(string)
+		userInfo := r.Data["user"].(user.User)
+		//
+		permissionIdsWithRisk, err := report.RangePermissionIds(isLogin(detailType), userInfo.Id)
+		if err != nil {
+			logger.Error("获取带有风险等级的品种列表错误:%v", err)
+			r.FailedResult("获取最新发布报告列表失败", result)
+			err = exception.New(exception.GetPublishedRandListFailed)
+			return
+		}
+		if len(permissionIdsWithRisk) == 0 {
+			r.SuccessResult("获取最新发布报告列表成功", []report.HotRankedReport{}, result)
+			return
+		}
 		//获取最新的报告列表
 		list, err := report.GetRandedReportByPublishTimeWeekly(limit, week)
 		if err != nil {
@@ -187,14 +253,25 @@ func (r *ReportController) PublishRanked(permissionIds string, limit int, week b
 		permissionIdList, err := r.TransPermissionIds(permissionIds)
 		if err != nil {
 			logger.Error("品种列表解析错误:%v", err)
-			r.FailedResult("分页查询报告列表失败", result)
-			err = exception.New(exception.QueryReportPageFailed)
+			r.FailedResult("获取最新发布报告列表失败", result)
+			err = exception.New(exception.GetPublishedRandListFailed)
 			return
 		}
+
 		filterList := make([]report.PublishRankedReport, 0)
 		if len(permissionIdList) > 0 {
+			//通过有权限的品种过滤查询品种
+			var filterPermissionIds []int
+			for _, permissionId := range permissionIdList {
+				for _, permissionIdWIthRisk := range permissionIdsWithRisk {
+					if permissionId == permissionIdWIthRisk {
+						filterPermissionIds = append(filterPermissionIds, permissionId)
+						break
+					}
+				}
+			}
 			for _, item := range list {
-				for _, permissionId := range permissionIdList {
+				for _, permissionId := range filterPermissionIds {
 					if _, ok := item.SecondPermissions[permissionId]; ok {
 						filterList = append(filterList, item)
 						break
@@ -202,7 +279,14 @@ func (r *ReportController) PublishRanked(permissionIds string, limit int, week b
 				}
 			}
 		} else {
-			filterList = list
+			for _, item := range list {
+				for _, permissionId := range permissionIdList {
+					if _, ok := item.SecondPermissions[permissionId]; ok {
+						filterList = append(filterList, item)
+						break
+					}
+				}
+			}
 		}
 		r.SuccessResult("获取最新发布报告列表成功", filterList, result)
 		return

+ 0 - 7
domian/report/eta_report_service.go

@@ -125,13 +125,6 @@ func convertToETAReportDTO(report eta.ETAReport) (dto ETAReportDTO) {
 		NeedSplice:       report.NeedSplice,
 		SmartReport:      report.ReportLayout == SmartReport,
 	}
-	//if dto.SmartReport {
-	//	dto.Content = ""
-	//}
-	//publishDate, err := time.Parse(time.DateTime, dto.PublishTime)
-	//if err == nil {
-	//	dto.PublishTime = publishDate.Format(time.DateOnly)
-	//}
 	return
 }
 func convertToReportChapterDTO(chapters []eta.ReportChapter) (dtoList []ReportChapterDTO) {

+ 14 - 2
domian/report/report_service.go

@@ -163,10 +163,14 @@ func SearchMaxReportId(key string) (total int64, reportId int64) {
 	return
 }
 
-func SearchReportList(key string, from int, size int, max int64) (reports []ReportDTO, err error) {
+func SearchReportList(key string, ids []int, from int, size int, max int64) (reports []ReportDTO, err error) {
 	//同步es
+	var docIds []string
+	for _, id := range ids {
+		docIds = append(docIds, strconv.Itoa(id))
+	}
 	sorts := append(sortField, "publishedTime:desc")
-	request := matchRange(key, from, size, max, sorts)
+	request := matchRangeByDocId(key, from, size, max, sorts, docIds)
 	re, err := elastic().Search(request)
 	if err != nil {
 		logger.Error("es搜索异常:%v", err)
@@ -717,6 +721,9 @@ func GetListByCondition[T any](column string, ids []T) (dtoList []ReportDTO, err
 	}
 	return
 }
+func GetReportByIdListByOrgIds(orgIds map[string][]int) (ids []int, err error) {
+	return reportDao.GetReportIdListByOrgIds(orgIds)
+}
 
 func GetTotalPageCountByPermissionIds(permissionIds []int) (total int64, latestId int64, ids map[string][]int) {
 	htOrgIds, err := GetHTReportIdsByPermissionIds(permissionIds)
@@ -823,3 +830,8 @@ func matchRange(key string, from int, to int, max int64, sorts []string) (reques
 	req := new(es.ESQueryRequest)
 	return req.CreateESQueryRequest(htConfig.GetReportIndex(), ESColumn, key, from, to, sorts, es.RangeByCondition).Range(0, max, ESRangeColumn).ByCondition("status", "PUBLISH")
 }
+
+func matchRangeByDocId(key string, from int, to int, max int64, sorts []string, docIds []string) (request *es.ESQueryRequest) {
+	req := new(es.ESQueryRequest)
+	return req.CreateESQueryRequest(htConfig.GetReportIndex(), ESColumn, key, from, to, sorts, es.RangeByConditionWithDocIds).Range(0, max, ESRangeColumn).ByCondition("status", "PUBLISH").WithDocs(docIds)
+}

+ 2 - 0
middleware/auth_middleware.go

@@ -45,6 +45,8 @@ var detailRoutes = []string{
 	"/report/list",
 	"/media/search",
 	"/report/search",
+	"/report/hotRankedList",
+	"/report/publishRankedList",
 }
 var publicRoutes = []string{
 	"/auth/areaCodes",

+ 29 - 0
models/report/report.go

@@ -189,6 +189,35 @@ func GetListByCondition[T any](column string, values []T) (reports []Report, err
 	}
 	return
 }
+
+func GetReportIdListByOrgIds(orgIds map[string][]int) (ids []int, err error) {
+	db := models.Main()
+	if len(orgIds["ETA"]) == 0 && len(orgIds["HT"]) == 0 {
+		return
+	}
+	if len(orgIds["ETA"]) == 0 {
+		err = db.Model(&Report{}).Select("id").Where("status = ?", StatusPublish).Where(" source='HT' and org_id in ?", orgIds["HT"]).Scan(&ids).Error
+		if err != nil {
+			logger.Error("获取报告ID列表失败:%v", err)
+			return
+		}
+		return
+	}
+	if len(orgIds["HT"]) == 0 {
+		err = db.Model(&Report{}).Select("id").Where("status = ?", StatusPublish).Where(" source='ETA' and org_id in ?", orgIds["ETA"]).Scan(&ids).Error
+		if err != nil {
+			logger.Error("获取报告ID列表失败:%v", err)
+			return
+		}
+		return
+	}
+	err = db.Model(&Report{}).Select("id").Where("status = ?", StatusPublish).Where(" source='ETA' and org_id in ?", orgIds["ETA"]).Or("source='HT' and org_id in ?", orgIds["HT"]).Scan(&ids).Error
+	if err != nil {
+		logger.Error("获取报告ID列表失败:%v", err)
+		return
+	}
+	return
+}
 func GetMaxIdByPermissionIds(orgIds map[string][]int) (total int64, maxId int64, err error) {
 	db := models.Main()
 	if len(orgIds["ETA"]) == 0 && len(orgIds["HT"]) == 0 {

+ 121 - 2
service/report/report_service.go

@@ -324,9 +324,9 @@ func parseRiskLevel(level string) (int, error) {
 	return number, nil
 }
 
-func SearchReportList(key string, pageInfo page.PageInfo) (reports []reportService.ReportDTO, err error) {
+func SearchReportList(key string, Ids []int, pageInfo page.PageInfo) (reports []reportService.ReportDTO, err error) {
 	offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
-	reports, err = reportService.SearchReportList(key, offset, pageInfo.PageSize, pageInfo.LatestId)
+	reports, err = reportService.SearchReportList(key, Ids, offset, pageInfo.PageSize, pageInfo.LatestId)
 	var wg sync.WaitGroup
 	wg.Add(len(reports))
 	for i := 0; i < len(reports); i++ {
@@ -351,9 +351,66 @@ func SearchReportList(key string, pageInfo page.PageInfo) (reports []reportServi
 }
 
 func SearchMaxReportId(key string) (total int64, id int64) {
+
 	return reportService.SearchMaxReportId(key)
 }
 
+func RangeSearch(isLogin bool, userId int) (total int64, latestId int64, orgIds map[string][]int) {
+	var err error
+	//登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
+	if isLogin {
+		userProfile, userErr := user.GetUserProfile(userId)
+		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
+		}
+		//获取产品风险等级
+		if userProfile.RiskLevel == user.RiskUnTest {
+			logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
+			return
+		}
+		if userProfile.RiskLevelStatus == user.RiskExpired {
+			logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
+			return
+		}
+		mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
+		if mappingErr != nil {
+			logger.Error("查询产品风险等级映射失败:%v", mappingErr)
+			return
+		}
+		var permissionList []permissionService.PermissionDTO
+		//获取所有设置风险等级的品种
+		permissionList, err = permissionService.GetPermissionListWithRisk()
+		permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
+		if len(permissionList) == 0 {
+			return
+		}
+		var filterPermissionIds []int
+		for _, permission := range permissionList {
+			filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
+		}
+		return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds)
+	} else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
+		var permissionList []permissionService.PermissionDTO
+		//获取所有设置风险等级的品种
+		permissionList, err = permissionService.GetPermissionListWithRisk()
+		if err != nil {
+			logger.Error("根据ID查询品种列表失败:%v", err)
+		}
+		var filterPermissionIds []int
+		for _, permission := range permissionList {
+			filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
+		}
+		//查询品种
+		return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds)
+	}
+}
+
 // GetReportPage 分页获取报告列表
 func GetReportPage(pageInfo page.PageInfo, orgIds map[string][]int, searchAll bool, isLogin bool) (list []reportService.ReportDTO, err error) {
 	list, err = reportService.GetReportPageByOrgIds(pageInfo, orgIds, searchAll)
@@ -417,6 +474,7 @@ func GetRandedReportByWeeklyHot(limit int) (reports []HotRankedReport, err error
 			ids = append(ids, hotReports[i].ReportId)
 		}
 		dtoList, err = reportService.GetListByCondition("id", ids)
+
 		if err != nil {
 			logger.Error("获取本周最热研报列表失败:%v", err)
 			err = exception.New(exception.GetHotRandListFailed)
@@ -584,3 +642,64 @@ func convertToRecordCountDTO(record RecordCount) (dto userService.RecordCountDTO
 		Additional: record.Additional,
 	}
 }
+
+func GetReportByIdListByOrgIds(orgIds map[string][]int) (ids []int, err error) {
+	ids, err = reportService.GetReportByIdListByOrgIds(orgIds)
+	if err != nil {
+		logger.Error("获取报告ID列表失败:%v", err)
+		err = exception.New(exception.GetReportSearchRangeFailed)
+	}
+	return
+}
+
+func RangePermissionIds(isLogin bool, userId int) (filterPermissionIds []int, err error) {
+	if isLogin {
+		userProfile, userErr := user.GetUserProfile(userId)
+		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
+		}
+		//获取产品风险等级
+		if userProfile.RiskLevel == user.RiskUnTest {
+			logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
+			return
+		}
+		if userProfile.RiskLevelStatus == user.RiskExpired {
+			logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
+			return
+		}
+		mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
+		if mappingErr != nil {
+			logger.Error("查询产品风险等级映射失败:%v", mappingErr)
+			return
+		}
+		var permissionList []permissionService.PermissionDTO
+		//获取所有设置风险等级的品种
+		permissionList, err = permissionService.GetPermissionListWithRisk()
+		permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
+		if len(permissionList) == 0 {
+			return
+		}
+		for _, permission := range permissionList {
+			filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
+		}
+		return
+	} else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
+		var permissionList []permissionService.PermissionDTO
+		//获取所有设置风险等级的品种
+		permissionList, err = permissionService.GetPermissionListWithRisk()
+		if err != nil {
+			logger.Error("根据ID查询品种列表失败:%v", err)
+		}
+		for _, permission := range permissionList {
+			filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
+		}
+		//查询品种
+		return
+	}
+}