Browse Source

修复产品风险等级

kobe6258 4 months ago
parent
commit
8d28a344d5

+ 3 - 1
common/exception/exc_enums.go

@@ -142,6 +142,7 @@ const (
 const (
 	ProductErrorCode int = iota + 100000
 	ProductOffSale
+	ProductTypeError
 )
 const (
 	PaymentErrCode int = iota + 110000
@@ -247,7 +248,8 @@ var ErrorMap = map[int]string{
 	IllegalOrderStatus:   "非法的订单状态",
 	OrderPayTimeoutError: "订单支付超时",
 	//product
-	ProductOffSale: "商品已下架",
+	ProductOffSale:   "商品已下架",
+	ProductTypeError: "非法的产品类型",
 	//支付
 	CreatePaymentOrderFailed: "创建支付订单失败",
 	PaymentProcessingError:   "支付订单处理中",

+ 11 - 0
controllers/list_contoller.go

@@ -15,6 +15,11 @@ type ListController struct {
 const (
 	video = "video"
 	audio = "audio"
+
+	productVideo   = "video"
+	productAudio   = "audio"
+	productReport  = "report"
+	productPackage = "package"
 )
 
 func (l *ListController) Prepare() {
@@ -60,6 +65,12 @@ func (l *ListController) CheckMediaType(mediaType string) bool {
 	}
 	return false
 }
+func (l *ListController) CheckProductType(productType string) bool {
+	if productType == productReport || productType == productPackage || productType == productVideo || productType == productAudio {
+		return true
+	}
+	return false
+}
 
 //func (l *ListController) Finish() {
 //	l.PageInfo.Reset()

+ 37 - 4
controllers/order/subscribe_controller.go

@@ -1,11 +1,13 @@
 package order
 
 import (
+	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"
-	"eta/eta_mini_ht_api/domian/merchant"
 	"eta/eta_mini_ht_api/service/facade"
 	"eta/eta_mini_ht_api/service/order"
+	"eta/eta_mini_ht_api/service/product"
 	"eta/eta_mini_ht_api/service/user"
 	"golang.org/x/time/rate"
 	"net/http"
@@ -183,10 +185,41 @@ func (sc *SubscribeController) SubscribeProduct() {
 // @router /subscribeList [get]
 func (sc *SubscribeController) SubscribeList(productType string) {
 	controllers.Wrap(&sc.BaseController, func() (result *controllers.WrapData, err error) {
-		result = sc.InitWrapData("查询订阅列表失败")
+		result = sc.InitWrapData("分页查询订阅列表失败")
 		userInfo := sc.Data["user"].(user.User)
-		list, err := merchant.SubscribeList(userInfo.Id, productType)
-		sc.SuccessResult("查询订阅列表成功", list, result)
+		result = sc.InitWrapData("分页查询订阅列表失败")
+		if productType == "" || !sc.CheckProductType(productType) {
+			err = exception.New(exception.ProductTypeError)
+			sc.FailedResult("分页查询订阅列表失败", result)
+			return
+		}
+		pageRes := page.Page{
+			Current:  sc.PageInfo.Current,
+			PageSize: sc.PageInfo.PageSize,
+		}
+		pageRes.Total, pageRes.LatestId = product.GetTotalPageCountByProductType(productType, userInfo.Id)
+		if err != nil {
+			logger.Error("分页查询订阅列表失败:%v", err)
+			sc.FailedResult("分页查询订阅列表失败", result)
+			return
+		}
+		if sc.PageInfo.LatestId == 0 {
+			sc.PageInfo.LatestId = pageRes.LatestId
+			sc.PageInfo.Total = pageRes.Total
+		} else {
+			pageRes.LatestId = sc.PageInfo.LatestId
+			pageRes.Total = sc.PageInfo.Total
+		}
+		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
+		list, err := product.SubscribeList(userInfo.Id, productType, sc.PageInfo)
+		if err != nil {
+			sc.FailedResult("分页查询订阅列表失败", result)
+			return
+		}
+		mediaList := new(page.PageResult)
+		mediaList.Data = list
+		mediaList.Page = pageRes
+		sc.SuccessResult("分页查询订阅列表成功", mediaList, result)
 		return
 	})
 }

+ 1 - 1
controllers/web_hook/htfutures_trade_controller.go

@@ -96,7 +96,7 @@ func (h *HTFuturesTradeController) InformRefundResult() {
 		//	h.FailedResult("解析请求体失败", result)
 		//	return
 		//}
-		result = h.InitWrapData("支付结果应答成功")
+		result = h.InitWrapData("退款结果应答成功")
 		h.SuccessResult("success", nil, result)
 		return
 	})

+ 30 - 0
domian/config/permission_service.go

@@ -127,3 +127,33 @@ func SyncPermissionClassifyMapping(list []PermissionClassifyMappingDTO) error {
 	}
 	return permissionDao.BatchInsertOrUpdateMapping(permissionMappingList)
 }
+
+func GetPermissionByName(name string) (dto PermissionDTO, err error) {
+	permission, err := permissionDao.GetPermissionByName(name)
+	if err != nil {
+		return
+	}
+	dto = convertPermissionToDTO(permission)
+	return
+}
+
+func convertPermissionToDTO(permission permissionDao.Permission) PermissionDTO {
+	return PermissionDTO{
+		PermissionId:   permission.PermissionId,
+		PermissionName: permission.Name,
+		ParentId:       permission.ParentId,
+		RiskLevel:      permission.RiskLevel,
+		Sort:           permission.Sort,
+	}
+}
+
+func GetSecondPermissionsByClassifyId(id int) (dtoList []PermissionDTO, err error) {
+	permissionList, err := permissionDao.GetSecondPermissionsByClassifyID(id)
+	if err != nil {
+		return
+	}
+	for _, permission := range permissionList {
+		dtoList = append(dtoList, convertPermissionToDTO(permission))
+	}
+	return
+}

+ 3 - 1
domian/merchant/merchant_product.go

@@ -30,6 +30,7 @@ type MerchantProductDTO struct {
 	IsPermanent bool
 	ValidDays   int
 	SaleStatus  string
+	SourceId    int
 }
 
 func GetMerchantProductById(id int) (productDTO MerchantProductDTO, err error) {
@@ -52,11 +53,12 @@ func convertToDTO(product merchantDao.MerchantProduct) MerchantProductDTO {
 		Description: product.Description,
 		ProductTile: product.Title,
 		Price:       product.Price,
-		RiskLevel:   product.RiskLevel,
+		RiskLevel:   "",
 		Type:        string(product.Type),
 		TypeCN:      typeTransfer[product.Type],
 		IsPermanent: product.IsPermanent,
 		ValidDays:   product.ValidDays,
+		SourceId:    product.SourceID,
 	}
 }
 

+ 36 - 7
domian/merchant/user_access_service.go

@@ -1,15 +1,31 @@
 package merchant
 
 import (
+	"eta/eta_mini_ht_api/common/utils/page"
 	"eta/eta_mini_ht_api/models/merchant"
 	"time"
 )
 
+type UserAccessDTO struct {
+	ID             int
+	TemplateUserId int
+	ProductID      int
+	ProductType    string
+}
+
+func convertToUserAccessDTO(userSubscriptionAccessList merchant.UserSubscriptionAccessList) UserAccessDTO {
+	return UserAccessDTO{
+		ID:             userSubscriptionAccessList.ID,
+		TemplateUserId: userSubscriptionAccessList.TemplateUserId,
+		ProductID:      userSubscriptionAccessList.ProductID,
+		ProductType:    userSubscriptionAccessList.ProductType,
+	}
+}
 func OpenProduct(templateUserId int, productOrderNo string, product MerchantProductDTO) error {
 	userAccess := merchant.UserSubscriptionAccessList{
 		TemplateUserId: templateUserId,
 		ProductID:      product.Id,
-		ProductName:    product.ProductTile,
+		ProductName:    product.Title,
 		ProductType:    product.Type,
 		BeginDate:      time.Now(),
 		Status:         merchant.SubscribeValid,
@@ -18,21 +34,34 @@ func OpenProduct(templateUserId int, productOrderNo string, product MerchantProd
 	if !product.IsPermanent {
 		userAccess.EndDate = time.Now().Add(time.Duration(product.ValidDays) * 24 * time.Hour)
 	}
-	return merchant.CloseUserAccess(userAccess)
+	return merchant.InsertOrUpdateUserSubscribe(userAccess)
 }
 
 func CloseProduct(templateUserId int, productOrderNo string, product MerchantProductDTO) error {
 	userAccess := merchant.UserSubscriptionAccessList{
 		TemplateUserId: templateUserId,
 		ProductID:      product.Id,
-		ProductName:    product.ProductTile,
+		ProductName:    product.Title,
 		ProductType:    product.Type,
 		Status:         merchant.SubscribeClose,
 		ProductOrderNo: productOrderNo,
 	}
-	return merchant.InsertOrUpdateUserSubscribe(userAccess)
+	return merchant.CloseUserAccess(userAccess)
+}
+
+func SubscribeList(templateUserId int, productType string, pageInfo page.PageInfo) (list []UserAccessDTO, err error) {
+	offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
+	var subscribeList []merchant.UserSubscriptionAccessList
+	subscribeList, err = merchant.SubscribeList(templateUserId, productType, pageInfo.LatestId, offset, pageInfo.PageSize)
+	if err != nil {
+		return
+	}
+	for _, userSubscriptionAccessList := range subscribeList {
+		list = append(list, convertToUserAccessDTO(userSubscriptionAccessList))
+	}
+	return
 }
 
-//func SubscribeList(templateUserId int, productType string) (list[], err error) {
-//	return merchant.SubscribeList(templateUserId, productType)
-//}
+func GetTotalPageCountByProductType(productType string, id int) (int64, int64) {
+	return merchant.GetTotalPageCountByProductType(productType, id)
+}

+ 20 - 20
domian/report/ht_report_service.go

@@ -61,27 +61,27 @@ func GetHTReportIdsByPermissionIdsWithRiskLevel(permissionIds []int, riskLevel s
 			orgIds = append(orgIds, report.OrgID)
 		}
 	}
-	riskNum, err := parseRiskLevel(riskLevel)
-	if err != nil {
-		logger.Error("解析风险等级失败:%v", err)
-		return
-	}
+	//riskNum, err := parseRiskLevel(riskLevel)
+	//if err != nil {
+	//	logger.Error("解析风险等级失败:%v", err)
+	//	return
+	//}
 	//再把符合风险等级的产品报告加入
-	//productList, err = productDao.GetProductListBySourceIds(ids, productDao.Report)
-	for _, report := range reports {
-		for _, product := range productList {
-			if product.SourceID == report.ID {
-				pdRiskNum, pdErr := parseRiskLevel(product.RiskLevel)
-				if pdErr != nil {
-					logger.Error("解析产品风险等级失败:%v,产品id:%v", pdErr, product.ID)
-					continue
-				}
-				if pdRiskNum <= riskNum {
-					orgIds = append(orgIds, report.OrgID)
-				}
-			}
-		}
-	}
+	////productList, err = productDao.GetProductListBySourceIds(ids, productDao.Report)
+	//for _, report := range reports {
+	//	for _, product := range productList {
+	//		if product.SourceID == report.ID {
+	//			pdRiskNum, pdErr := parseRiskLevel(product.RiskLevel)
+	//			if pdErr != nil {
+	//				logger.Error("解析产品风险等级失败:%v,产品id:%v", pdErr, product.ID)
+	//				continue
+	//			}
+	//			if pdRiskNum <= riskNum {
+	//				orgIds = append(orgIds, report.OrgID)
+	//			}
+	//		}
+	//	}
+	//}
 	return
 }
 func GetHtReport(id int) (pdf string, err error) {

+ 5 - 1
domian/report/report_service.go

@@ -67,6 +67,8 @@ type ReportDTO struct {
 	Abstract         string          `json:"abstract"`
 	PublishedTime    string          `json:"publishedTime"`
 	RiskLevel        string          `json:"riskLevel"`
+	PlateName        string          `json:"-"`
+	ClassifyId       int             `json:"-"`
 	SecondPermission map[int]string  `json:"-"`
 	Permissions      map[int]string  `json:"-"`
 	PermissionNames  interface{}     `json:"permissionNames"`
@@ -91,7 +93,7 @@ type Anthor struct {
 	HeadImgUrl string `json:"headImgUrl"`
 }
 
-func GetGetReportById(reportId int) (ReportDTO ReportDTO, err error) {
+func GetReportById(reportId int) (ReportDTO ReportDTO, err error) {
 	report, err := reportDao.GetReportById(reportId)
 	if err != nil {
 		return
@@ -920,6 +922,8 @@ func convertReportDTO(report reportDao.Report, fullTime bool) (reportDTO ReportD
 		CoverSrc:      report.CoverSrc,
 		Abstract:      report.Abstract,
 		PublishedTime: report.PublishedTime,
+		PlateName:     report.PlateName,
+		ClassifyId:    report.ClassifyId,
 	}
 	publishDate, err := time.Parse(time.DateTime, reportDTO.PublishedTime)
 	if err == nil && !fullTime {

+ 10 - 4
go.mod

@@ -28,10 +28,13 @@ require (
 	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/kr/text v0.2.0 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
 	github.com/prometheus/client_golang v1.19.0 // indirect
 	github.com/prometheus/client_model v0.5.0 // indirect
 	github.com/prometheus/common v0.48.0 // indirect
 	github.com/prometheus/procfs v0.12.0 // indirect
+	github.com/richardlehane/mscfb v1.0.4 // indirect
+	github.com/richardlehane/msoleps v1.0.4 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/shopspring/decimal v1.4.0 // indirect
 	github.com/sirupsen/logrus v1.9.0 // indirect
@@ -39,10 +42,13 @@ require (
 	github.com/tidwall/gjson v1.14.1 // indirect
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
-	golang.org/x/crypto v0.24.0 // indirect
-	golang.org/x/net v0.23.0 // indirect
-	golang.org/x/sys v0.21.0 // indirect
-	golang.org/x/text v0.16.0 // indirect
+	github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect
+	github.com/xuri/excelize/v2 v2.9.0 // indirect
+	github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect
+	golang.org/x/crypto v0.28.0 // indirect
+	golang.org/x/net v0.30.0 // indirect
+	golang.org/x/sys v0.26.0 // indirect
+	golang.org/x/text v0.19.0 // indirect
 	golang.org/x/time v0.7.0 // indirect
 	google.golang.org/protobuf v1.34.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect

+ 21 - 0
go.sum

@@ -75,6 +75,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
 github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
@@ -100,6 +102,11 @@ github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSz
 github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
 github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
 github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
+github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
+github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
+github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
+github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00=
+github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
 github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
@@ -127,6 +134,12 @@ github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
 github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
 github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
 github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY=
+github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
+github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQE=
+github.com/xuri/excelize/v2 v2.9.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE=
+github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A=
+github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 h1:5mLPGnFdSsevFRFc9q3yYbBkB6tsm4aCwwQV/j1JQAQ=
 github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
@@ -136,6 +149,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
 golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
+golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
+golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -146,6 +161,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
 golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
+golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -167,12 +184,16 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
 golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
+golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
 golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
+golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
+golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
 golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

+ 7 - 0
models/config/permission.go

@@ -103,3 +103,10 @@ func GetFirstPermissionsByClassifyID(classifyId int) (permissionList []Permissio
 	err = db.Model(&Permission{}).Select("permission_id, name,parent_id").Where("permission_id  in ( select DISTINCT ps.parent_id from permission_classify_mapping pcm left JOIN permissions ps on ps.permission_id =pcm.permission_id where pcm.classify_id=? order by ps.parent_id)", classifyId).Find(&permissionList).Error
 	return
 }
+
+func PermissionsByPermissionId(permissionId int) (permission Permission, err error) {
+	db := models.Main()
+	//sql := "select chart_permission_id, permission_name,parent_id from chart_permission WHERE chart_permission_id in( select DISTINCT cp.parent_id from chart_permission_search_key_word_mapping cpskwp left JOIN chart_permission cp on cp.chart_permission_id =cpskwp.chart_permission_id where cpskwp.classify_id=? order by cp.parent_id)"
+	err = db.Model(&Permission{}).Select(Columns).Where("permission_id  =? ", permissionId).First(&permission).Error
+	return
+}

+ 0 - 7
models/media/media.go

@@ -133,10 +133,3 @@ func GetMediaById(mediaType string, mediaId int) (media Media, err error) {
 	err = db.Select(DetailColumns).Where("id =? and media_type=? and deleted =?", mediaId, mediaType, false).First(&media).Error
 	return
 }
-
-// 测试造数据
-func GetlIST() (media []Media) {
-	db := models.Main()
-	_ = db.Model(&Media{}).Where("deleted = ?", false).Find(&media).Error
-	return
-}

+ 6 - 0
models/media/media_permission_mapping.go

@@ -17,3 +17,9 @@ func GetMediaPermissionMappingByPermissionId(mediaType string, permissionIds []i
 	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 GetMediaPermissionMappingByMedia(mediaType string, mediaId int) (permissionIds []int, err error) {
+	db := models.Main()
+	err = db.Model(&MediaPermissionMapping{}).Select("DISTINCT permission_id").Where(" deleted =? and media_id = ?  and media_type = ?", false, mediaId, mediaType).Scan(&permissionIds).Error
+	return
+}

+ 1 - 1
models/merchant/merchant_product.go

@@ -11,7 +11,7 @@ type SaleStatus string
 type MerchantProductType string
 
 const (
-	detailColumns  = "id,title,price,is_permanent,valid_days,type,risk_level,sale_status"
+	detailColumns  = "id,title,price,is_permanent,valid_days,type,risk_level,sale_status,cover_src,description,source_id"
 	sourceIdColumn = "id,risk_level,source_id"
 )
 const (

+ 22 - 4
models/merchant/user_subscription_access_list.go

@@ -1,6 +1,7 @@
 package merchant
 
 import (
+	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/models"
 	"gorm.io/gorm"
 	"gorm.io/gorm/clause"
@@ -78,7 +79,7 @@ func InsertOrUpdateUserSubscribe(access UserSubscriptionAccessList) (err error)
 	db := models.Main()
 	OnConflictFunc := clause.OnConflict{
 		Columns:   []clause.Column{{Name: "template_user_id"}, {Name: "product_id"}},
-		DoUpdates: clause.AssignmentColumns([]string{"status", "begin_date", "end_date", "product_name", "updated_time"}),
+		DoUpdates: clause.AssignmentColumns([]string{"status", "begin_date", "end_date", "product_name"}),
 	}
 	// 执行批量插入或更新操作
 	err = db.Clauses(OnConflictFunc).Create(&access).Error
@@ -92,6 +93,23 @@ func CloseUserAccess(access UserSubscriptionAccessList) (err error) {
 	return
 }
 
-//func SubscribeList(id int, productType string) (interface{}, error) {
-//
-//}
+func SubscribeList(templateUserId int, productType string, latestId int64, offset int, pageSize int) (list []UserSubscriptionAccessList, err error) {
+	db := models.Main()
+	err = db.Model(&UserSubscriptionAccessList{}).Where("id<=? and template_user_id=? AND product_type=? and status=?", latestId, templateUserId, productType, SubscribeValid).Order("begin_date desc").Offset(offset).Limit(pageSize).Find(&list).Error
+	return
+}
+
+func GetTotalPageCountByProductType(productType string, templateUserId int) (count int64, latestId int64) {
+	db := models.Main()
+	err := db.Model(&UserSubscriptionAccessList{}).Select("count(*)").Where("template_user_id=? AND product_type=? and status=?", templateUserId, productType, SubscribeValid).Scan(&count).Error
+	if err != nil {
+		logger.Error("查询用户订阅总数失败:%s", err)
+		return 0, 0
+	}
+	err = db.Model(&UserSubscriptionAccessList{}).Select("max(id)").Where("template_user_id=? AND product_type=? and status=?", templateUserId, productType, SubscribeValid).Scan(&latestId).Error
+	if err != nil {
+		logger.Error("查询用户订阅最新id失败:%s", err)
+		return 0, 0
+	}
+	return
+}

+ 1 - 1
models/report/report.go

@@ -25,7 +25,7 @@ const (
 	StatusUnPublish ReportStatus = "UNPUBLISH"
 
 	MaxBatchNum   = 1000
-	CommonColumns = "id,org_id,author,abstract,title,source,cover_src,published_time,status,plate_name"
+	CommonColumns = "id,org_id,author,abstract,title,source,cover_src,published_time,status,plate_name,classify_id"
 	taskColumns   = "id,author,published_time,status,plate_name"
 )
 

+ 47 - 0
service/config/config.go

@@ -0,0 +1,47 @@
+package config
+
+import (
+	logger "eta/eta_mini_ht_api/common/component/log"
+	permissionService "eta/eta_mini_ht_api/domian/config"
+	"fmt"
+	"strconv"
+	"strings"
+)
+
+func GetHighestRiskLevel(permissions []permissionService.PermissionDTO) (riskLevelNum int) {
+	for _, permission := range permissions {
+		pRiskNum, err := ParseRiskLevel(permission.RiskLevel)
+		if err != nil {
+			logger.Error("解析风险等级失败:%v", err)
+			continue
+		}
+		if riskLevelNum == 0 {
+			riskLevelNum = pRiskNum
+		} else {
+			if riskLevelNum < pRiskNum {
+				riskLevelNum = pRiskNum
+			}
+		}
+	}
+	return
+}
+
+func ParseRiskLevel(level string) (int, error) {
+	parts := strings.Split(level, "R")
+	if len(parts) < 2 {
+		return 0, fmt.Errorf("无效的风险等级: %s", level)
+	}
+	numberStr := parts[1]
+	number, err := strconv.Atoi(numberStr)
+	if err != nil {
+		return 0, fmt.Errorf("无法将风险等级转换为数字: %s", err)
+	}
+	return number, nil
+}
+func GetPermissionByName(name string) (dto permissionService.PermissionDTO, err error) {
+	return permissionService.GetPermissionByName(name)
+}
+
+func GetSecondPermissionsByClassifyId(id int) (dtoList []permissionService.PermissionDTO, err error) {
+	return permissionService.GetSecondPermissionsByClassifyId(id)
+}

+ 3 - 3
service/facade/ht_account_service.go

@@ -44,7 +44,7 @@ func CheckUserRiskLevel(templateUserId int, productId int, officialUser userServ
 		err = exception.New(exception.IllegalTemplateUserId)
 		return
 	}
-	product, err := product.GetProductInfoById(productId)
+	productInfo, err := product.GetProductInfoById(productId)
 	if err != nil {
 		logger.Error("获取产品信息失败:%v", err)
 		code = 200
@@ -81,7 +81,7 @@ func CheckUserRiskLevel(templateUserId int, productId int, officialUser userServ
 			err = exception.New(exception.QueryRiskMappingError)
 			return
 		}
-		return compareRisk(mapping.ProductRiskLevel, product.RiskLevel)
+		return compareRisk(mapping.ProductRiskLevel, productInfo.RiskLevel)
 	}
 	var mapping permissionService.CustomerProductRiskMappingDTO
 	var mappingErr error
@@ -97,7 +97,7 @@ func CheckUserRiskLevel(templateUserId int, productId int, officialUser userServ
 		err = exception.NewWithException(exception.QueryRiskMappingError, err.Error())
 		return
 	}
-	return compareRisk(mapping.ProductRiskLevel, product.RiskLevel)
+	return compareRisk(mapping.ProductRiskLevel, productInfo.RiskLevel)
 }
 func parseRiskLevel(level string) (int, error) {
 	parts := strings.Split(level, "R")

+ 19 - 58
service/media/media_service.go

@@ -13,6 +13,7 @@ import (
 	userService "eta/eta_mini_ht_api/domian/user"
 	mediaDao "eta/eta_mini_ht_api/models/media"
 	productDao "eta/eta_mini_ht_api/models/merchant"
+	"eta/eta_mini_ht_api/service/config"
 	"eta/eta_mini_ht_api/service/report"
 	"eta/eta_mini_ht_api/service/user"
 	"fmt"
@@ -60,18 +61,6 @@ func CountMedia(count RecordCount) (traceId string, err error) {
 	dto := convertToMediaCountDTO(count)
 	return userService.CountMedia(dto, meida.MediaType)
 }
-func GetTotalPageCount(mediaType string) (count int64, latestId int64) {
-	if mediaType == "" {
-		return
-	}
-	return mediaService.GetTotalPageCount(mediaType)
-}
-func GetTotalPageCountByAnalystId(mediaType string, analystId int) (total int64, latestId int64) {
-	if mediaType == "" {
-		return
-	}
-	return mediaService.GetTotalPageCountByAnalystId(mediaType, analystId)
-}
 
 func RangeSearchByAnalyst(mediaType string, analystId int, userId int) (total int64, latestId int64, ids []int, mappingRiskLevel string) {
 	var err error
@@ -132,26 +121,15 @@ func GetTotalPageCountByPermissionIds(mediaType string, permissionIds []int, isL
 	}
 	return getCount(mediaType, permissionIds, isLogin, userId)
 }
-func parseRiskLevel(level string) (int, error) {
-	parts := strings.Split(level, "R")
-	if len(parts) < 2 {
-		return 0, fmt.Errorf("无效的风险等级: %s", level)
-	}
-	numberStr := parts[1]
-	number, err := strconv.Atoi(numberStr)
-	if err != nil {
-		return 0, fmt.Errorf("无法将风险等级转换为数字: %s", err)
-	}
-	return number, nil
-}
+
 func filterPermissionsByRisk(permissionList []permissionService.PermissionDTO, riskLevel string) (resultList []permissionService.PermissionDTO) {
-	riskLevelNum, err := parseRiskLevel(riskLevel)
+	riskLevelNum, err := config.ParseRiskLevel(riskLevel)
 	if err != nil {
 		logger.Error("风险等级解析失败:%v", err)
 		return
 	}
 	for _, permission := range permissionList {
-		pRiskNum, riskErr := parseRiskLevel(permission.RiskLevel)
+		pRiskNum, riskErr := config.ParseRiskLevel(permission.RiskLevel)
 		if riskErr != nil {
 			logger.Error("解析品种风险等级失败 permission:%d,risk:%v", permission.PermissionId, permission.RiskLevel)
 			continue
@@ -244,7 +222,7 @@ func matchRiskLevel(userId int, media mediaService.MediaDTO) (riskLevelMatch str
 		return
 	}
 	//能够查看最高等级
-	matchNum, err := parseRiskLevel(level.ProductRiskLevel)
+	matchNum, err := config.ParseRiskLevel(level.ProductRiskLevel)
 	if err != nil {
 		logger.Error("解析风险等级失败:%v", err)
 		return
@@ -255,7 +233,7 @@ func matchRiskLevel(userId int, media mediaService.MediaDTO) (riskLevelMatch str
 		return
 	}
 	//能够查看需要的最小等级
-	num := getHighestRiskLevel(permissionDTOs)
+	num := config.GetHighestRiskLevel(permissionDTOs)
 	productRiskLevel = fmt.Sprintf("R%d", num)
 	if num > matchNum {
 		riskLevelMatch = RiskLevelUnMatch
@@ -266,26 +244,9 @@ func matchRiskLevel(userId int, media mediaService.MediaDTO) (riskLevelMatch str
 	}
 }
 
-func getHighestRiskLevel(permissions []permissionService.PermissionDTO) (riskLevelNum int) {
-	for _, permission := range permissions {
-		pRiskNum, err := parseRiskLevel(permission.RiskLevel)
-		if err != nil {
-			logger.Error("解析风险等级失败:%v", err)
-			continue
-		}
-		if riskLevelNum == 0 {
-			riskLevelNum = pRiskNum
-		} else {
-			if riskLevelNum < pRiskNum {
-				riskLevelNum = pRiskNum
-			}
-		}
-	}
-	return
-}
 func getLowestRiskLevel(permissions []permissionService.PermissionDTO) (riskLevelNum int) {
 	for _, permission := range permissions {
-		pRiskNum, err := parseRiskLevel(permission.RiskLevel)
+		pRiskNum, err := config.ParseRiskLevel(permission.RiskLevel)
 		if err != nil {
 			logger.Error("解析风险等级失败:%v", err)
 			continue
@@ -336,7 +297,7 @@ func GetMediaPageByAnalystId(mediaType string, pageInfo page.PageInfo, analystId
 			if permissionErr != nil {
 				logger.Error("获取媒体品种信息失败:%v,无法设置媒体风险等级", err)
 			}
-			riskNum := getHighestRiskLevel(permissions)
+			riskNum := config.GetHighestRiskLevel(permissions)
 			media.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
 			media.Login = true
 			var productType productDao.MerchantProductType
@@ -371,17 +332,17 @@ func GetMediaPageByAnalystId(mediaType string, pageInfo page.PageInfo, analystId
 				media.IsSubscribe = subscribe.Status == productDao.SubscribeValid
 			}
 			media.RiskLevelStatus = RiskLevelMatch
-			pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
+			pdRiskNum, parseErr := config.ParseRiskLevel(product.RiskLevel)
 			if parseErr != nil {
 				media.RiskLevelStatus = RiskLevelUnMatch
 				return
 			}
-			rpRiskNum, parseErr := parseRiskLevel(media.RiskLevel)
+			rpRiskNum, parseErr := config.ParseRiskLevel(media.RiskLevel)
 			if parseErr != nil {
 				media.RiskLevelStatus = RiskLevelUnMatch
 				return
 			}
-			mappingRiskNum, parseErr := parseRiskLevel(mappingRiskLevel)
+			mappingRiskNum, parseErr := config.ParseRiskLevel(mappingRiskLevel)
 			if parseErr != nil {
 				media.RiskLevelStatus = RiskLevelUnMatch
 				return
@@ -430,7 +391,7 @@ func GetMediaPageByIds(mediaType string, pageInfo page.PageInfo, mediaIds []int,
 			if permissionErr != nil {
 				logger.Error("获取媒体品种信息失败:%v,无法设置媒体风险等级", err)
 			}
-			riskNum := getHighestRiskLevel(permissions)
+			riskNum := config.GetHighestRiskLevel(permissions)
 			media.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
 			if !isLogin {
 				media.Src = ""
@@ -472,20 +433,20 @@ func GetMediaPageByIds(mediaType string, pageInfo page.PageInfo, mediaIds []int,
 				}
 			}
 			media.RiskLevelStatus = RiskLevelMatch
-			mappingRiskNum, parseErr := parseRiskLevel(mappingRiskLevel)
+			mappingRiskNum, parseErr := config.ParseRiskLevel(mappingRiskLevel)
 			if parseErr != nil {
 				media.RiskLevelStatus = RiskLevelUnMatch
 				return
 			}
 			var rpRiskNum int
-			rpRiskNum, parseErr = parseRiskLevel(media.RiskLevel)
+			rpRiskNum, parseErr = config.ParseRiskLevel(media.RiskLevel)
 			if parseErr != nil {
 				media.RiskLevelStatus = RiskLevelUnMatch
 				return
 			}
 			if !isFree {
 				var pdRiskNum int
-				pdRiskNum, parseErr = parseRiskLevel(product.RiskLevel)
+				pdRiskNum, parseErr = config.ParseRiskLevel(product.RiskLevel)
 				if parseErr != nil {
 					media.RiskLevelStatus = RiskLevelUnMatch
 					return
@@ -548,7 +509,7 @@ func SearchMediaList(mediaType string, key string, mediaIds []int, pageInfo page
 			if permissionErr != nil {
 				logger.Error("获取媒体品种信息失败:%v,无法设置媒体风险等级", err)
 			}
-			riskNum := getHighestRiskLevel(permissions)
+			riskNum := config.GetHighestRiskLevel(permissions)
 			media.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
 			if !isLogin {
 				media.Src = ""
@@ -589,17 +550,17 @@ func SearchMediaList(mediaType string, key string, mediaIds []int, pageInfo page
 			}
 
 			media.RiskLevelStatus = RiskLevelMatch
-			pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
+			pdRiskNum, parseErr := config.ParseRiskLevel(product.RiskLevel)
 			if parseErr != nil {
 				media.RiskLevelStatus = RiskLevelUnMatch
 				return
 			}
-			rpRiskNum, parseErr := parseRiskLevel(media.RiskLevel)
+			rpRiskNum, parseErr := config.ParseRiskLevel(media.RiskLevel)
 			if parseErr != nil {
 				media.RiskLevelStatus = RiskLevelUnMatch
 				return
 			}
-			mappingRiskNum, parseErr := parseRiskLevel(mappingRiskLevel)
+			mappingRiskNum, parseErr := config.ParseRiskLevel(mappingRiskLevel)
 			if parseErr != nil {
 				media.RiskLevelStatus = RiskLevelUnMatch
 				return

+ 59 - 0
service/product/product_service.go

@@ -3,8 +3,14 @@ package product
 import (
 	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/common/exception"
+	permissionService "eta/eta_mini_ht_api/domian/config"
 	merchantService "eta/eta_mini_ht_api/domian/merchant"
+	reportService "eta/eta_mini_ht_api/domian/report"
+	"eta/eta_mini_ht_api/models/config"
+	"eta/eta_mini_ht_api/models/media"
+	configService "eta/eta_mini_ht_api/service/config"
 	"eta/eta_mini_ht_api/service/order"
+	"fmt"
 	"github.com/shopspring/decimal"
 	"time"
 )
@@ -20,6 +26,55 @@ type ProductDTO struct {
 	EndDate     string
 }
 
+func GetProductRiskLevel(product merchantService.MerchantProductDTO) (riskLevel string, err error) {
+	switch product.Type {
+	case "package":
+		permissionRisk, permissionErr := config.PermissionsByPermissionId(product.SourceId)
+		if permissionErr != nil {
+			logger.Error("获取权限信息失败[permissionId:%d]", product.SourceId)
+		} else {
+			riskLevel = permissionRisk.RiskLevel
+		}
+	case "audio", "video":
+		permissionIds, mediaErr := media.GetMediaPermissionMappingByMedia(product.Type, product.SourceId)
+		if mediaErr != nil {
+			logger.Error("获取媒体权限失败[mediaType:%s,mediaId:%d]", product.Type, product.SourceId)
+		} else {
+			permissions, permissionErr := permissionService.GetPermissionListByIds(permissionIds)
+			if permissionErr != nil {
+				logger.Error("获取权限信息失败[permissionIds:%v]", permissionIds)
+			}
+			riskNum := configService.GetHighestRiskLevel(permissions)
+			riskLevel = fmt.Sprintf("R%d", riskNum)
+		}
+	case "report":
+		report, reportErr := reportService.GetReportById(product.SourceId)
+		if reportErr != nil {
+			logger.Error("获取研报信息失败[reportId:%d]", product.SourceId)
+		} else {
+			switch report.Source {
+			case reportService.SourceHT:
+				permission, permissionErr := configService.GetPermissionByName(report.PlateName)
+				if permissionErr != nil {
+					logger.Error("获取板块权限失败[plateName:%s]", report.PlateName)
+				} else {
+					riskLevel = permission.RiskLevel
+				}
+			case reportService.SourceETA:
+				permissions, permissionErr := configService.GetSecondPermissionsByClassifyId(report.ClassifyId)
+				if permissionErr != nil {
+					logger.Error("获取板块权限失败[plateName:%s]", report.PlateName)
+				} else {
+					riskNum := configService.GetHighestRiskLevel(permissions)
+					riskLevel = fmt.Sprintf("R%d", riskNum)
+				}
+			}
+		}
+	default:
+		logger.Warn("不支持的产品类型[%s]", product.Type)
+	}
+	return
+}
 func GetProductInfoById(productId int) (product ProductDTO, err error) {
 	merchantProduct, err := merchantService.GetMerchantProductById(productId)
 	if err != nil {
@@ -27,6 +82,10 @@ func GetProductInfoById(productId int) (product ProductDTO, err error) {
 		return
 	}
 	product = convertToProductDTO(merchantProduct)
+	product.RiskLevel, err = GetProductRiskLevel(merchantProduct)
+	if err != nil {
+		logger.Error("获取风险等级失败[productId:%d]", productId)
+	}
 	return
 }
 func convertToProductDTO(product merchantService.MerchantProductDTO) (productDTO ProductDTO) {

+ 47 - 0
service/product/subscribe_servcie.go

@@ -0,0 +1,47 @@
+package product
+
+import (
+	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/common/utils/page"
+	"eta/eta_mini_ht_api/domian/merchant"
+	"sync"
+)
+
+type SubscribeDTO struct {
+	Title     string
+	Abstract  string
+	RiskLevel string
+	CoverSrc  string
+}
+
+func SubscribeList(templateUserId int, productType string, pageInfo page.PageInfo) (list []SubscribeDTO, err error) {
+	var subscribeList []merchant.UserAccessDTO
+	subscribeList, err = merchant.SubscribeList(templateUserId, productType, pageInfo)
+	var wg sync.WaitGroup
+	wg.Add(len(subscribeList))
+	for _, Subscribe := range subscribeList {
+		go func(Subscribe merchant.UserAccessDTO) {
+			defer wg.Done()
+			product, _ := merchant.GetMerchantProductById(Subscribe.ProductID)
+			subscribe := convertToSubscribeDTO(product)
+			subscribe.RiskLevel, err = GetProductRiskLevel(product)
+			if err != nil {
+				logger.Error("获取风险等级失败[productId:%d]", product.Id)
+			}
+			list = append(list, subscribe)
+		}(Subscribe)
+	}
+	wg.Wait()
+	return
+}
+
+func convertToSubscribeDTO(product merchant.MerchantProductDTO) SubscribeDTO {
+	return SubscribeDTO{
+		Title:    product.Title,
+		Abstract: product.Description,
+		CoverSrc: product.CoverSrc,
+	}
+}
+func GetTotalPageCountByProductType(productType string, templateUserId int) (int64, int64) {
+	return merchant.GetTotalPageCountByProductType(productType, templateUserId)
+}

+ 20 - 64
service/report/report_service.go

@@ -13,6 +13,7 @@ import (
 	reportService "eta/eta_mini_ht_api/domian/report"
 	userService "eta/eta_mini_ht_api/domian/user"
 	productDao "eta/eta_mini_ht_api/models/merchant"
+	"eta/eta_mini_ht_api/service/config"
 	user "eta/eta_mini_ht_api/service/user"
 	"fmt"
 	"gorm.io/gorm"
@@ -130,7 +131,7 @@ func matchRiskLevel(userId int, report reportService.ReportDTO) (riskLevelMatch
 		return
 	}
 	//能够查看最高等级
-	matchNum, err := parseRiskLevel(level.ProductRiskLevel)
+	matchNum, err := config.ParseRiskLevel(level.ProductRiskLevel)
 	if err != nil {
 		logger.Error("解析风险等级失败:%v", err)
 		return
@@ -142,7 +143,7 @@ func matchRiskLevel(userId int, report reportService.ReportDTO) (riskLevelMatch
 	}
 	//能够查看需要的最小等级
 	//num := getLowestRiskLevel(permissionDTOs)
-	num := getHighestRiskLevel(permissionDTOs)
+	num := config.GetHighestRiskLevel(permissionDTOs)
 	riskLevel = fmt.Sprintf("R%d", num)
 	if num > matchNum {
 		riskLevelMatch = RiskLevelUnMatch
@@ -152,42 +153,9 @@ func matchRiskLevel(userId int, report reportService.ReportDTO) (riskLevelMatch
 		return
 	}
 }
-func getHighestRiskLevel(permissions []permissionService.PermissionDTO) (riskLevelNum int) {
-	for _, permission := range permissions {
-		pRiskNum, err := parseRiskLevel(permission.RiskLevel)
-		if err != nil {
-			logger.Error("解析风险等级失败:%v", err)
-			continue
-		}
-		if riskLevelNum == 0 {
-			riskLevelNum = pRiskNum
-		} else {
-			if riskLevelNum < pRiskNum {
-				riskLevelNum = pRiskNum
-			}
-		}
-	}
-	return
-}
-func getLowestRiskLevel(permissions []permissionService.PermissionDTO) (riskLevelNum int) {
-	for _, permission := range permissions {
-		pRiskNum, err := parseRiskLevel(permission.RiskLevel)
-		if err != nil {
-			logger.Error("解析风险等级失败:%v", err)
-			continue
-		}
-		if riskLevelNum == 0 {
-			riskLevelNum = pRiskNum
-		} else {
-			if riskLevelNum > pRiskNum {
-				riskLevelNum = pRiskNum
-			}
-		}
-	}
-	return
-}
+
 func GetReportById(reportId int, login bool, userId int) (report reportService.ReportDTO, err error) {
-	report, err = reportService.GetGetReportById(reportId)
+	report, err = reportService.GetReportById(reportId)
 	if err != nil {
 		logger.Error("获取研报失败:%v", err)
 		err = exception.New(exception.GetReportFailed)
@@ -267,13 +235,13 @@ func GetTotalPageCountByPermissionIds(permissionIds []int, isLogin bool, userId
 }
 func filterPermissionsByRisk(permissionList []permissionService.PermissionDTO, riskLevel string) (resultList []permissionService.PermissionDTO) {
 	if riskLevel != "" {
-		riskLevelNum, err := parseRiskLevel(riskLevel)
+		riskLevelNum, err := config.ParseRiskLevel(riskLevel)
 		if err != nil {
 			logger.Error("风险等级解析失败:%v", err)
 			return
 		}
 		for _, permission := range permissionList {
-			pRiskNum, riskErr := parseRiskLevel(permission.RiskLevel)
+			pRiskNum, riskErr := config.ParseRiskLevel(permission.RiskLevel)
 			if riskErr != nil {
 				logger.Error("解析品种风险等级失败 permission:%d,risk:%v", permission.PermissionId, permission.RiskLevel)
 				continue
@@ -289,18 +257,6 @@ func filterPermissionsByRisk(permissionList []permissionService.PermissionDTO, r
 }
 
 // ParseRiskLevel 解析风险等级字符串,并返回数字部分
-func parseRiskLevel(level string) (int, error) {
-	parts := strings.Split(level, "R")
-	if len(parts) < 2 {
-		return 0, fmt.Errorf("无效的风险等级: %s", level)
-	}
-	numberStr := parts[1]
-	number, err := strconv.Atoi(numberStr)
-	if err != nil {
-		return 0, fmt.Errorf("无法将风险等级转换为数字: %s", err)
-	}
-	return number, nil
-}
 
 func SearchReportList(key string, Ids []int, pageInfo page.PageInfo, isLogin bool, userId int) (list []reportService.ReportDTO, err error) {
 	offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
@@ -339,7 +295,7 @@ func dealReportInfo(list []reportService.ReportDTO, isLogin bool, userId int) (r
 			if len(permissions) == 0 {
 				return
 			}
-			riskNum := getHighestRiskLevel(permissions)
+			riskNum := config.GetHighestRiskLevel(permissions)
 			report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
 			var src string
 			src, err = mediaService.GetImageSrc(report.CoverSrc)
@@ -372,11 +328,11 @@ func dealReportInfo(list []reportService.ReportDTO, isLogin bool, userId int) (r
 						report.IsSubscribe = subscribe.Status == productDao.SubscribeValid
 					}
 				}
-				pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
+				pdRiskNum, parseErr := config.ParseRiskLevel(product.RiskLevel)
 				if parseErr != nil {
 					return
 				}
-				rpRiskNum, parseErr := parseRiskLevel(report.RiskLevel)
+				rpRiskNum, parseErr := config.ParseRiskLevel(report.RiskLevel)
 				if parseErr != nil {
 					return
 				}
@@ -457,12 +413,12 @@ func GetRandedReportByWeeklyHot(limit int, isLogin bool, userId int, pdRiskLevel
 					}
 					filterList = append(filterList, report)
 				} else {
-					pdRiskNum, paresErr := parseRiskLevel(product.RiskLevel)
+					pdRiskNum, paresErr := config.ParseRiskLevel(product.RiskLevel)
 					if paresErr != nil {
 						logger.Error("解析风险等级失败:%v", err)
 						continue
 					}
-					reRiskNum, paresErr := parseRiskLevel(pdRiskLevel)
+					reRiskNum, paresErr := config.ParseRiskLevel(pdRiskLevel)
 					if paresErr != nil {
 						logger.Error("解析风险等级失败:%v", err)
 						continue
@@ -523,12 +479,12 @@ func GetRandedReportByWeeklyHot(limit int, isLogin bool, userId int, pdRiskLevel
 				if len(permissions) == 0 {
 					riskNum = 0
 				} else {
-					riskNum = getHighestRiskLevel(permissions)
+					riskNum = config.GetHighestRiskLevel(permissions)
 				}
 				if report.RiskLevel == "" {
 					report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
 				} else {
-					reRiskNum, paresErr := parseRiskLevel(report.RiskLevel)
+					reRiskNum, paresErr := config.ParseRiskLevel(report.RiskLevel)
 					if paresErr != nil {
 						logger.Error("解析风险等级失败:%v", err)
 						report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
@@ -548,7 +504,7 @@ func GetRandedReportByWeeklyHot(limit int, isLogin bool, userId int, pdRiskLevel
 		wg.Wait()
 		reports = make([]HotRankedReport, len(ids))
 		for i := 0; i < len(filterList); i++ {
-			risk, parseErr := parseRiskLevel(filterList[i].RiskLevel)
+			risk, parseErr := config.ParseRiskLevel(filterList[i].RiskLevel)
 			if parseErr != nil || risk == 0 {
 				continue
 			}
@@ -591,12 +547,12 @@ func GetRandedReportByPublishTimeWeekly(limit int, week bool, isLogin bool, user
 				}
 				filterList = append(filterList, report)
 			} else {
-				pdRiskNum, paresErr := parseRiskLevel(product.RiskLevel)
+				pdRiskNum, paresErr := config.ParseRiskLevel(product.RiskLevel)
 				if paresErr != nil {
 					logger.Error("解析风险等级失败:%v", err)
 					continue
 				}
-				reRiskNum, paresErr := parseRiskLevel(pdRiskLevel)
+				reRiskNum, paresErr := config.ParseRiskLevel(pdRiskLevel)
 				if paresErr != nil {
 					logger.Error("解析风险等级失败:%v", err)
 					continue
@@ -658,12 +614,12 @@ func GetRandedReportByPublishTimeWeekly(limit int, week bool, isLogin bool, user
 			if len(permissions) == 0 {
 				riskNum = 0
 			} else {
-				riskNum = getHighestRiskLevel(permissions)
+				riskNum = config.GetHighestRiskLevel(permissions)
 			}
 			if report.RiskLevel == "" {
 				report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
 			} else {
-				reRiskNum, paresErr := parseRiskLevel(report.RiskLevel)
+				reRiskNum, paresErr := config.ParseRiskLevel(report.RiskLevel)
 				if paresErr != nil {
 					logger.Error("解析风险等级失败:%v", err)
 					report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
@@ -739,7 +695,7 @@ func convertToHotRankedReport(dto reportService.ReportDTO) (report HotRankedRepo
 func convertToPublishRankedReportList(dtoList []reportService.ReportDTO) (reports []PublishRankedReport) {
 	reports = []PublishRankedReport{}
 	for _, dto := range dtoList {
-		risk, err := parseRiskLevel(dto.RiskLevel)
+		risk, err := config.ParseRiskLevel(dto.RiskLevel)
 		if err != nil || risk == 0 {
 			continue
 		}