Browse Source

订阅中心

kobe6258 5 months ago
parent
commit
55eedf395a

+ 1 - 1
controllers/product/product_controller.go

@@ -151,7 +151,7 @@ func (p *ProductController) ProductSearch(key string, isSignal bool) {
 		}
 		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
 		productList, err = productService.ProductListBySort(isSignal, productSearchList, permissionWeightMap, userInfo.Id, p.PageInfo)
-		productPage.Data = productSearchList
+		productPage.Data = productList
 		productPage.Page = pageRes
 		p.SuccessResult("搜索产品信息成功", productPage, result)
 		return

+ 16 - 11
models/merchant/merchant_product.go

@@ -2,10 +2,12 @@ package merchant
 
 import (
 	"errors"
+	stringUtils "eta/eta_mini_ht_api/common/utils/string"
 	"eta/eta_mini_ht_api/models"
 	"fmt"
 	"github.com/shopspring/decimal"
 	"sort"
+	"strings"
 	"sync/atomic"
 	"time"
 )
@@ -141,8 +143,8 @@ func CountProductList(isSignal bool) (total, latestId int64, ids []int) {
 }
 
 type MerchantProductIdMap struct {
-	Type      string
-	ProductId string
+	Type     string
+	SourceId string
 }
 
 func GetProductByProductType() (productIds map[string]string, err error) {
@@ -152,27 +154,29 @@ func GetProductByProductType() (productIds map[string]string, err error) {
 	err = db.Raw(sql).Find(&productIdMap).Error
 	productIds = make(map[string]string, len(productIdMap))
 	for _, v := range productIdMap {
-		productIds[v.Type] = v.ProductId
+		productIds[v.Type] = v.SourceId
 	}
 	return
 }
 
-func generateSignalPdSql(idMap map[string][]int) (condition string, pars []interface{}) {
+func generateSignalPdSql(idMap map[string][]int) (condition string) {
 	for k, v := range idMap {
 		if condition == "" {
-			condition = "(" + fmt.Sprintf("(type =? and source_id in ?)")
+			condition = "(" + fmt.Sprintf("(type ='%s' and source_id in (%s))", k, strings.Join(stringUtils.IntToStringSlice(v), ","))
 		} else {
-			condition = condition + fmt.Sprintf(" or (type =? and source_id in ?)")
+			condition = condition + fmt.Sprintf(" or (type ='%s' and source_id in (%s))", k, strings.Join(stringUtils.IntToStringSlice(v), ","))
 		}
-		pars = append(pars, k, v)
 	}
 	condition = condition + ")"
+	if len(idMap) == 1 {
+		condition = condition[1 : len(condition)-1]
+	}
 	return
 }
 
 func LatestId() (latestId int64) {
 	db := models.Main()
-	_ = db.Select("max(id)").Where("deleted=?", false).Scan(&latestId).Error
+	_ = db.Model(&MerchantProduct{}).Select("max(id)").Where("deleted=?", false).Scan(&latestId).Error
 	return
 }
 
@@ -183,7 +187,7 @@ type ProductDTO struct {
 }
 
 func ProductListBySort(list []ProductDTO, id int64, offset int, size int) (productList []MerchantProduct, err error) {
-	var productMap map[string][]int
+	var productMap = make(map[string][]int, len(list))
 	sort.Slice(list, func(i, j int) bool {
 		return list[i].Score > list[j].Score
 	})
@@ -196,9 +200,10 @@ func ProductListBySort(list []ProductDTO, id int64, offset int, size int) (produ
 		ids = append(ids, v.SourceId)
 		productMap[v.SourceType] = ids
 	}
-	sql, pars := generateSignalPdSql(productMap)
+	sql := generateSignalPdSql(productMap)
 	db := models.Main()
-	err = db.Select(detailColumns).Where(fmt.Sprintf("id <= ? and deleted =? and  %s order by Field(id,?) desc limit ?,? ", sql), id, false, pars, idSort, offset, size).Find(&productList).Error
+	query := fmt.Sprintf("id <= ? and deleted =? and %s order by Field(id,?) desc limit ?,?", sql)
+	err = db.Select(detailColumns).Where(query, id, false, strings.Join(stringUtils.IntToStringSlice(idSort), ","), offset, size).Find(&productList).Error
 	return
 }
 

+ 21 - 19
service/product/product_service.go

@@ -12,6 +12,7 @@ import (
 	"eta/eta_mini_ht_api/models/config"
 	"eta/eta_mini_ht_api/models/image"
 	"eta/eta_mini_ht_api/models/media"
+	merchantDao "eta/eta_mini_ht_api/models/merchant"
 	configService "eta/eta_mini_ht_api/service/config"
 	mediaService "eta/eta_mini_ht_api/service/media"
 	"eta/eta_mini_ht_api/service/order"
@@ -308,18 +309,7 @@ func ProductList(productIds []int, templateUserId int, info page.PageInfo) (dtoL
 	for i := 0; i < len(dtoList); i++ {
 		go func(productDTO *ProductDTO) {
 			defer wg.Done()
-			list, subErr := user.GetUserSubscribe([]int{productDTO.Id}, templateUserId)
-			if subErr != nil {
-				logger.Error("获取用户订阅状态失败:%v", err)
-				productDTO.IsSubscribe = false
-			} else {
-				if len(list) == 0 {
-					logger.Error("用户未订阅单品,productId:%v", productDTO.Id)
-					productDTO.IsSubscribe = false
-				} else {
-					productDTO.IsSubscribe = true
-				}
-			}
+			productDTO.IsSubscribe = isSubscribeSignal(productDTO.Id, templateUserId)
 		}(&dtoList[i])
 	}
 	return
@@ -389,12 +379,6 @@ func SearchRelateProduct(key string, productIdMap map[string][]int) (list []repo
 		for _, mediaInfo := range medias {
 			list = append(list, convertMediaToSearchDTO(mediaInfo))
 		}
-		list = append(list, reportDomain.ProductSearchDTO{
-			HighLight:  "",
-			SourceId:   165,
-			SourceType: "audio",
-			Score:      12.31,
-		})
 	}()
 	wg.Wait()
 	sort.Slice(list, func(i, j int) bool {
@@ -436,17 +420,35 @@ func CountSearchPackageList(list []reportDomain.ProductSearchDTO) (total, latest
 	return
 }
 
-func ProductListBySort(isSignal bool, list []reportDomain.ProductSearchDTO, weightMap map[int]*atomic.Int32, id int, info page.PageInfo) (resultList []ProductDTO, err error) {
+func ProductListBySort(isSignal bool, list []reportDomain.ProductSearchDTO, weightMap map[int]*atomic.Int32, templateUserId int, info page.PageInfo) (resultList []ProductDTO, err error) {
 	var pdDTOS []merchantService.MerchantProductDTO
 	pdDTOS, err = merchantService.ProductListBySort(isSignal, list, weightMap, info)
 	var wg sync.WaitGroup
 	wg.Add(len(pdDTOS))
 	for _, pd := range pdDTOS {
 		go func(pd merchantService.MerchantProductDTO) {
+			defer wg.Done()
 			productDTO := convertToProductDTO(pd)
 			productDTO.RiskLevel, productDTO.SourceTile, productDTO.Abstract, productDTO.CoverUrl, productDTO.Src, productDTO.PermissionNames, _, err = GetProductRiskLevel(pd)
+			productDTO.IsSubscribe = isSubscribeSignal(pd.Id, templateUserId)
+			resultList = append(resultList, productDTO)
 		}(pd)
 	}
 	wg.Wait()
 	return
 }
+
+func isSubscribeSignal(productId int, templateUserId int) (isSubscribe bool) {
+	subscribeList, subErr := user.GetUserSubscribe([]int{productId}, templateUserId)
+	if subErr != nil {
+		logger.Error("获取用户订阅状态失败:%v", subErr)
+		return false
+	} else {
+		if len(subscribeList) == 0 {
+			logger.Error("用户未订阅单品,productId:%v", productId)
+			return false
+		} else {
+			return subscribeList[0].Status == merchantDao.SubscribeValid
+		}
+	}
+}