142 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package logic
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"errors"
 | |
| 	"fusenapi/model/gmodel"
 | |
| 	"fusenapi/utils/auth"
 | |
| 	"fusenapi/utils/basic"
 | |
| 	"fusenapi/utils/format"
 | |
| 	"fusenapi/utils/image"
 | |
| 	"gorm.io/gorm"
 | |
| 	"strings"
 | |
| 
 | |
| 	"fusenapi/server/product/internal/svc"
 | |
| 	"fusenapi/server/product/internal/types"
 | |
| 
 | |
| 	"github.com/zeromicro/go-zero/core/logx"
 | |
| )
 | |
| 
 | |
| type OtherProductListLogic struct {
 | |
| 	logx.Logger
 | |
| 	ctx    context.Context
 | |
| 	svcCtx *svc.ServiceContext
 | |
| }
 | |
| 
 | |
| func NewOtherProductListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *OtherProductListLogic {
 | |
| 	return &OtherProductListLogic{
 | |
| 		Logger: logx.WithContext(ctx),
 | |
| 		ctx:    ctx,
 | |
| 		svcCtx: svcCtx,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (l *OtherProductListLogic) OtherProductList(req *types.OtherProductListReq, userinfo *auth.UserInfo) (resp *basic.Response) {
 | |
| 	if req.Num <= 0 || req.Num > 100 {
 | |
| 		req.Num = 4
 | |
| 	}
 | |
| 	if req.Size > 0 {
 | |
| 		req.Size = image.GetCurrentSize(req.Size)
 | |
| 	}
 | |
| 	//获取用户信息
 | |
| 	user, err := l.svcCtx.AllModels.FsUser.FindUserById(l.ctx, userinfo.UserId)
 | |
| 	if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
 | |
| 		logx.Error(err)
 | |
| 		return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get user info")
 | |
| 	}
 | |
| 	tagInfo, err := l.svcCtx.AllModels.FsTags.FindOne(l.ctx, req.Cid)
 | |
| 	if err != nil {
 | |
| 		if errors.Is(err, gorm.ErrRecordNotFound) {
 | |
| 			return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the tag info is not exists")
 | |
| 		}
 | |
| 		logx.Error(err)
 | |
| 		return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get tage info")
 | |
| 	}
 | |
| 	if *tagInfo.Status != 1 {
 | |
| 		return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "tage info is not available")
 | |
| 	}
 | |
| 	if tagInfo.RecommendProduct == nil || *tagInfo.RecommendProduct == "" {
 | |
| 		return resp.SetStatusWithMessage(basic.CodeOK, "success")
 | |
| 	}
 | |
| 	pids, err := format.StrSlicToInt64Slice(strings.Split(*tagInfo.RecommendProduct, ","))
 | |
| 	if err != nil {
 | |
| 		logx.Error(err)
 | |
| 		return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to parse recommend product")
 | |
| 	}
 | |
| 	list, err := l.getRandom(pids, int(req.Num))
 | |
| 	if err != nil {
 | |
| 		logx.Error(err)
 | |
| 		return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get random list")
 | |
| 	}
 | |
| 	if req.Size <= 0 {
 | |
| 		return resp.SetStatusWithMessage(basic.CodeOK, "success,", list)
 | |
| 	}
 | |
| 	//千人前面处理
 | |
| 	for _, v := range list {
 | |
| 		r := &image.ThousandFaceImageFormatReq{
 | |
| 			Size:           int(req.Size),
 | |
| 			IsThousandFace: 0,
 | |
| 			Cover:          v.Cover,
 | |
| 			CoverImg:       v.CoverImg,
 | |
| 			CoverDefault:   "",
 | |
| 			ProductId:      v.Id,
 | |
| 			UserId:         user.Id,
 | |
| 		}
 | |
| 		if user.Id > 0 {
 | |
| 			r.IsThousandFace = int(*user.IsThousandFace)
 | |
| 		}
 | |
| 		image.ThousandFaceImageFormat(r)
 | |
| 		v.Cover = r.Cover
 | |
| 		v.CoverImg = r.CoverImg
 | |
| 		v.CoverDefault = r.CoverDefault
 | |
| 	}
 | |
| 	return resp.SetStatusWithMessage(basic.CodeOK, "success,", list)
 | |
| }
 | |
| func (l *OtherProductListLogic) getRandom(productIds []int64, limit int) (result []types.OtherProductListRsp, err error) {
 | |
| 	if len(productIds) == 0 {
 | |
| 		return
 | |
| 	}
 | |
| 	//获取推荐产品信息
 | |
| 	recommendProductList, err := l.svcCtx.AllModels.FsProduct.GetRandomProductListInIds(l.ctx, productIds, limit)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	if len(recommendProductList) == 0 {
 | |
| 		return
 | |
| 	}
 | |
| 	mapProduct := make(map[int64]int)
 | |
| 	newProductIds := make([]int64, 0, len(recommendProductList))
 | |
| 	for k, v := range recommendProductList {
 | |
| 		newProductIds = append(newProductIds, v.Id)
 | |
| 		mapProduct[v.Id] = k
 | |
| 	}
 | |
| 	//查询最新的sku
 | |
| 	reqStatus := int64(1)
 | |
| 	productTemplateIds, err := l.svcCtx.AllModels.FsProductTemplateV2.GetProductTemplateListByParams(l.ctx, gmodel.GetProductTemplateListByParamsReq{
 | |
| 		ProductIds: newProductIds,
 | |
| 		GroupBy:    "product_id",
 | |
| 		OrderBy:    "id DESC,sort DESC",
 | |
| 		Fields:     "product_id,max(id) as id",
 | |
| 		Status:     &reqStatus,
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	for _, v := range productTemplateIds {
 | |
| 		productIndex, ok := mapProduct[*v.ProductId]
 | |
| 		if !ok {
 | |
| 			continue
 | |
| 		}
 | |
| 		productInfo := recommendProductList[productIndex]
 | |
| 		result = append(result, types.OtherProductListRsp{
 | |
| 			Title:    *productInfo.Title,
 | |
| 			Cover:    *productInfo.Cover,
 | |
| 			CoverImg: *productInfo.CoverImg,
 | |
| 			Sn:       *productInfo.Sn,
 | |
| 			Id:       *v.ProductId,
 | |
| 			SkuId:    v.Id,
 | |
| 		})
 | |
| 	}
 | |
| 	return result, nil
 | |
| }
 |