2023-06-01 07:32:28 +00:00
|
|
|
package logic
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2023-06-02 11:24:58 +00:00
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"fusenapi/constants"
|
2023-06-01 10:34:41 +00:00
|
|
|
"fusenapi/model"
|
2023-06-01 07:32:28 +00:00
|
|
|
"fusenapi/product/internal/svc"
|
|
|
|
"fusenapi/product/internal/types"
|
2023-06-02 04:12:51 +00:00
|
|
|
"fusenapi/utils/auth"
|
2023-06-02 11:24:58 +00:00
|
|
|
"fusenapi/utils/format"
|
2023-06-01 10:52:15 +00:00
|
|
|
"fusenapi/utils/image"
|
2023-06-02 11:24:58 +00:00
|
|
|
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
|
|
|
"sort"
|
|
|
|
"strings"
|
|
|
|
"time"
|
2023-06-01 07:32:28 +00:00
|
|
|
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
|
|
)
|
|
|
|
|
|
|
|
type GetProductListLogic struct {
|
|
|
|
logx.Logger
|
|
|
|
ctx context.Context
|
|
|
|
svcCtx *svc.ServiceContext
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewGetProductListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetProductListLogic {
|
|
|
|
return &GetProductListLogic{
|
|
|
|
Logger: logx.WithContext(ctx),
|
|
|
|
ctx: ctx,
|
|
|
|
svcCtx: svcCtx,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 获取产品列表
|
2023-06-02 04:12:51 +00:00
|
|
|
func (l *GetProductListLogic) GetProductList(req *types.GetProductListReq, loginInfo auth.UserInfo) (resp *types.Response, err error) {
|
|
|
|
//校验前台登录情况
|
|
|
|
if loginInfo.UserId == 0 {
|
2023-06-02 04:29:13 +00:00
|
|
|
return &types.Response{Code: 402, Message: "please sign in"}, nil
|
2023-06-02 04:12:51 +00:00
|
|
|
}
|
2023-06-02 11:24:58 +00:00
|
|
|
//如果是demo
|
|
|
|
if req.IsDemo == 1 {
|
|
|
|
var demo types.GetProductListRsp
|
|
|
|
if err = json.Unmarshal([]byte(l.DemoProductList()), &demo); err != nil {
|
|
|
|
logx.Error(err)
|
|
|
|
return &types.Response{Code: 510, Message: "demo data format err"}, nil
|
|
|
|
}
|
|
|
|
return &types.Response{Code: 200, Message: "success", Data: demo}, nil
|
|
|
|
}
|
|
|
|
if req.Page <= 0 {
|
|
|
|
req.Page = 1
|
|
|
|
}
|
2023-06-01 07:32:28 +00:00
|
|
|
//获取合适尺寸
|
|
|
|
if req.Size > 0 {
|
|
|
|
req.Size = image.GetCurrentSize(req.Size)
|
|
|
|
}
|
2023-06-02 11:24:58 +00:00
|
|
|
//查询用户信息
|
2023-06-01 10:34:41 +00:00
|
|
|
userModel := model.NewFsUserModel(l.svcCtx.MysqlConn)
|
2023-06-02 04:12:51 +00:00
|
|
|
userInfo, err := userModel.FindOne(l.ctx, loginInfo.UserId)
|
2023-06-02 11:24:58 +00:00
|
|
|
if err != nil && !errors.Is(err, sqlx.ErrNotFound) {
|
|
|
|
logx.Error(err)
|
|
|
|
return &types.Response{Code: 510, Message: "get user info err"}, nil
|
|
|
|
}
|
|
|
|
if userInfo == nil {
|
|
|
|
return &types.Response{Code: 402, Message: "user not exists"}, nil
|
|
|
|
}
|
|
|
|
//查询符合的产品列表
|
|
|
|
productModel := model.NewFsProductModel(l.svcCtx.MysqlConn)
|
|
|
|
productList, err := productModel.GetProductListByConditions(l.ctx, int(req.Cid), 0, 1, "sort-desc")
|
2023-06-01 10:34:41 +00:00
|
|
|
if err != nil {
|
2023-06-02 11:24:58 +00:00
|
|
|
logx.Error(err)
|
|
|
|
return &types.Response{Code: 510, Message: "failed to get product list"}, nil
|
2023-06-01 10:34:41 +00:00
|
|
|
}
|
2023-06-02 11:24:58 +00:00
|
|
|
fmt.Println(len(productList))
|
|
|
|
productLen := len(productList)
|
|
|
|
if productLen == 0 {
|
|
|
|
return &types.Response{Code: 200, Message: "success"}, nil
|
|
|
|
}
|
|
|
|
//提取产品ids
|
|
|
|
productIds := make([]string, 0, productLen)
|
|
|
|
for _, v := range productList {
|
|
|
|
productIds = append(productIds, fmt.Sprintf("%d", v.Id))
|
|
|
|
}
|
|
|
|
productPriceModel := model.NewFsProductPriceModel(l.svcCtx.MysqlConn)
|
|
|
|
productPriceList, err := productPriceModel.GetPriceList(l.ctx, productIds)
|
|
|
|
if err != nil {
|
|
|
|
logx.Error(err)
|
|
|
|
return &types.Response{Code: 510, Message: "failed to get product min price list"}, nil
|
|
|
|
}
|
|
|
|
//存储产品最小价格
|
|
|
|
mapProductMinPrice := make(map[int64]int64)
|
|
|
|
for _, v := range productPriceList {
|
2023-06-05 02:18:31 +00:00
|
|
|
priceStrSlic := strings.Split(v.Price, ",")
|
|
|
|
priceSlice, err := format.StrSlicToIntSlice(priceStrSlic)
|
2023-06-02 11:24:58 +00:00
|
|
|
if err != nil {
|
|
|
|
logx.Error(err)
|
2023-06-05 02:18:31 +00:00
|
|
|
return &types.Response{Code: 510, Message: err.Error()}, nil
|
2023-06-02 11:24:58 +00:00
|
|
|
}
|
2023-06-05 02:18:31 +00:00
|
|
|
if len(priceSlice) == 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
sort.Ints(priceSlice)
|
|
|
|
mapProductMinPrice[v.ProductId] = int64(priceSlice[0])
|
2023-06-01 10:34:41 +00:00
|
|
|
}
|
2023-06-02 11:24:58 +00:00
|
|
|
//获取模板
|
|
|
|
productTemplateModel := model.NewFsProductTemplateV2Model(l.svcCtx.MysqlConn)
|
|
|
|
productTemplatesV2, err := productTemplateModel.FindAllByCondition(l.ctx, productIds, 0, 1)
|
|
|
|
if err != nil {
|
|
|
|
logx.Error(err)
|
|
|
|
return &types.Response{Code: 510, Message: "get product template_v2 err"}, nil
|
|
|
|
}
|
|
|
|
mapProductTemplate := make(map[int64]struct{})
|
|
|
|
for _, v := range productTemplatesV2 {
|
|
|
|
mapProductTemplate[v.ProductId] = struct{}{}
|
|
|
|
}
|
|
|
|
//获取分类
|
|
|
|
tagsModel := model.NewFsTagsModel(l.svcCtx.MysqlConn)
|
|
|
|
tagInfo, err := tagsModel.FindOne(l.ctx, req.Cid)
|
|
|
|
if err != nil && !errors.Is(err, sqlx.ErrNotFound) {
|
|
|
|
logx.Error(err)
|
|
|
|
return &types.Response{Code: 510, Message: "get classification err "}, nil
|
|
|
|
}
|
|
|
|
if tagInfo == nil {
|
|
|
|
return &types.Response{Code: 510, Message: "classification not exists "}, nil
|
|
|
|
}
|
|
|
|
//拼接返回
|
|
|
|
itemList := make([]types.Items, 0, productLen)
|
|
|
|
for _, v := range productList {
|
|
|
|
minPrice, ok := mapProductMinPrice[v.Id]
|
|
|
|
//无最小价格则不显示
|
|
|
|
if !ok {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
_, ok = mapProductTemplate[v.Id]
|
|
|
|
//没有模板也不显示
|
|
|
|
if !ok {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
item := types.Items{
|
|
|
|
Id: v.Id,
|
|
|
|
Sn: v.Sn,
|
|
|
|
Title: v.Title,
|
|
|
|
Cover: v.Cover,
|
|
|
|
Intro: v.Intro.String,
|
|
|
|
CoverImg: v.CoverImg,
|
|
|
|
IsEnv: 1,
|
|
|
|
IsMicro: 1,
|
|
|
|
SizeNum: 1,
|
|
|
|
MiniPrice: format.FentoDollar(minPrice),
|
|
|
|
}
|
|
|
|
if req.Size > 0 {
|
|
|
|
coverSlice := strings.Split(v.Cover, ".")
|
|
|
|
coverImgSlice := strings.Split(v.CoverImg, ".")
|
|
|
|
if req.Size >= 200 {
|
|
|
|
item.Cover = fmt.Sprintf("%s_%d.%s", coverSlice[0], req.Size, coverSlice[1])
|
|
|
|
item.CoverImg = fmt.Sprintf("%s_%d.%s", coverImgSlice[0], req.Size, coverImgSlice[1])
|
|
|
|
}
|
|
|
|
//千人千面处理
|
|
|
|
if userInfo.IsThousandFace == 1 {
|
|
|
|
v.Cover = ""
|
|
|
|
item.CoverDefault = item.CoverImg
|
|
|
|
if req.Size >= 200 {
|
|
|
|
item.CoverImg = fmt.Sprintf("%s/test/%d/%d_%d.png?%d", constants.DOMAIN_RENDER_IMG_NAME, userInfo.Id, userInfo.Id, v.Id, time.Now().Unix())
|
|
|
|
item.CoverDefault = fmt.Sprintf("%s_%d.%s", coverImgSlice[0], req.Size, coverImgSlice[1])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
itemList = append(itemList, item)
|
|
|
|
}
|
|
|
|
return &types.Response{
|
|
|
|
Code: 200,
|
|
|
|
Message: "success",
|
|
|
|
Data: types.GetProductListRsp{
|
|
|
|
Ob: types.Ob{
|
|
|
|
Items: itemList,
|
|
|
|
},
|
|
|
|
TypeName: tagInfo.Title,
|
|
|
|
Description: tagInfo.Description,
|
|
|
|
}}, nil
|
2023-06-01 07:32:28 +00:00
|
|
|
return
|
|
|
|
}
|
2023-06-02 11:24:58 +00:00
|
|
|
|
|
|
|
// 样本产品列表
|
|
|
|
func (l *GetProductListLogic) DemoProductList() string {
|
|
|
|
return `{
|
|
|
|
"ob": {
|
|
|
|
"items": [
|
|
|
|
{
|
|
|
|
"id": 25,
|
|
|
|
"sn": "P1ELZGHU",
|
|
|
|
"title": "Packing box",
|
|
|
|
"cover": "/icon/icon_25_800.png",
|
|
|
|
"intro": "打包盒卡纸",
|
|
|
|
"cover_img": "/uploads/ognhdc6q_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 5,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 28,
|
|
|
|
"sn": "P9KVYAUS",
|
|
|
|
"title": "Pizza box",
|
|
|
|
"cover": "/icon/9dmom0g7_800.png",
|
|
|
|
"intro": "披萨盒 瓦楞纸",
|
|
|
|
"cover_img": "/uploads/9xf1olkl_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 1,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 30,
|
|
|
|
"sn": "PZWDSROX",
|
|
|
|
"title": "Paper bag with handle",
|
|
|
|
"cover": "/icon/iz44vraw_800.png",
|
|
|
|
"intro": "有提手纸袋牛皮纸",
|
|
|
|
"cover_img": "/uploads/rpwntxcq_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 4,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 20,
|
|
|
|
"sn": "PNACHNUK",
|
|
|
|
"title": "Four cups of milk tea cup",
|
|
|
|
"cover": "/icon/plz43wpo_800.png",
|
|
|
|
"intro": "卡纸",
|
|
|
|
"cover_img": "/uploads/9tqgsjqi_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 2,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 19,
|
|
|
|
"sn": "PHHVEXRW",
|
|
|
|
"title": "Milk tea cup holder double cup",
|
|
|
|
"cover": "/icon/ipohmmcj_800.png",
|
|
|
|
"intro": "奶茶杯托奶茶杯托两杯袋",
|
|
|
|
"cover_img": "/uploads/57ogzeq5_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 5,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 11,
|
|
|
|
"sn": "P7N4D0MK",
|
|
|
|
"title": "Cup double layer",
|
|
|
|
"cover": "/icon/nrmzz4du_800.png",
|
|
|
|
"intro": "牛皮纸双层",
|
|
|
|
"cover_img": "/uploads/oqjm5own_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 5,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 33,
|
|
|
|
"sn": "P0NFP19Y",
|
|
|
|
"title": "High paper bowl",
|
|
|
|
"cover": "/icon/cla4k6om_800.png",
|
|
|
|
"intro": "牛皮纸",
|
|
|
|
"cover_img": "/uploads/dt1qjkzg_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 4,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 32,
|
|
|
|
"sn": "PDZ3HIUL",
|
|
|
|
"title": "Flat paper bowl",
|
|
|
|
"cover": "/icon/jy14adqz_800.png",
|
|
|
|
"intro": "牛皮纸",
|
|
|
|
"cover_img": "/uploads/bzwbxduc_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 3,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 31,
|
|
|
|
"sn": "PEVSMU7I",
|
|
|
|
"title": "Paper bag without handle",
|
|
|
|
"cover": "/icon/osdsegor_800.png",
|
|
|
|
"intro": "牛皮纸",
|
|
|
|
"cover_img": "/uploads/ouvayny7_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 2,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 29,
|
|
|
|
"sn": "P58ZZOTI",
|
|
|
|
"title": "plastic bag",
|
|
|
|
"cover": "/icon/dvsvddks_800.png",
|
|
|
|
"intro": "塑料袋",
|
|
|
|
"cover_img": "/uploads/qvvuzkzx_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 1,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 24,
|
|
|
|
"sn": "PG7XIXII",
|
|
|
|
"title": "Hamburger box",
|
|
|
|
"cover": "/icon/icon_24_800.png",
|
|
|
|
"intro": "汉堡盒 卡纸",
|
|
|
|
"cover_img": "/uploads/fm1itgge_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 4,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 23,
|
|
|
|
"sn": "PIJ2OVUE",
|
|
|
|
"title": "Milk tea ring portable double cup",
|
|
|
|
"cover": "/icon/nxb6hjln_800.png",
|
|
|
|
"intro": "卡纸",
|
|
|
|
"cover_img": "/uploads/52fash1n_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 4,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 21,
|
|
|
|
"sn": "PMHXGUL6",
|
|
|
|
"title": "Milk tea ring portable single cup",
|
|
|
|
"cover": "/icon/qoaf5mtp_800.png",
|
|
|
|
"intro": "卡纸",
|
|
|
|
"cover_img": "/uploads/epvkzvyf_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 5,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 18,
|
|
|
|
"sn": "PFCM8KNF",
|
|
|
|
"title": "Tableware set chopsticks",
|
|
|
|
"cover": "/icon/tcspod4b_800.png",
|
|
|
|
"intro": "餐具套装筷子厚牛皮纸包装",
|
|
|
|
"cover_img": "/uploads/5jgrgzvh_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 3,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 17,
|
|
|
|
"sn": "PQKIQMIK",
|
|
|
|
"title": "Tableware set four piece set",
|
|
|
|
"cover": "/icon/mdo0vu1u_800.png",
|
|
|
|
"intro": "牛皮纸包装",
|
|
|
|
"cover_img": "/uploads/szsekvbw_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 4,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 16,
|
|
|
|
"sn": "PBFOIOFH",
|
|
|
|
"title": "Tableware set four piece set",
|
|
|
|
"cover": "/icon/dzrf59cp_800.png",
|
|
|
|
"intro": "餐具套装",
|
|
|
|
"cover_img": "/uploads/svfoebf1_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 1,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 15,
|
|
|
|
"sn": "P02V10AB",
|
|
|
|
"title": " Hot drink cup holder",
|
|
|
|
"cover": "/icon/icon_15_800.png",
|
|
|
|
"intro": "杯托、瓦楞纸",
|
|
|
|
"cover_img": "/uploads/4qbdid7i_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 5,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 13,
|
|
|
|
"sn": "PER6WLAV",
|
|
|
|
"title": " Cup pet",
|
|
|
|
"cover": "/icon/icon_13_800.png",
|
|
|
|
"intro": "pet",
|
|
|
|
"cover_img": "/uploads/kfxehwjd_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 1,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 12,
|
|
|
|
"sn": "PGFWRMAU",
|
|
|
|
"title": " Cup PP",
|
|
|
|
"cover": "/icon/icon_12_800.png",
|
|
|
|
"intro": "pp",
|
|
|
|
"cover_img": "/uploads/azp8uwhz_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 2,
|
|
|
|
"miniPrice": 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 10,
|
|
|
|
"sn": "P4ZXDVHS",
|
|
|
|
"title": "Cup monolayer",
|
|
|
|
"cover": "/icon/icon_10_800.png",
|
|
|
|
"intro": "牛皮纸单层",
|
|
|
|
"cover_img": "/uploads/onuzax6l_800.png",
|
|
|
|
"isEnv": 1,
|
|
|
|
"isMicro": 1,
|
|
|
|
"sizeNum": 1,
|
|
|
|
"miniPrice": 2
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"_links": {
|
|
|
|
"self": {
|
|
|
|
"href": "https://fusenapi.kayue.cn:8010/product/list?cid=13&size=620&page=1&is_demo=1"
|
|
|
|
},
|
|
|
|
"first": {
|
|
|
|
"href": "https://fusenapi.kayue.cn:8010/product/list?cid=13&size=620&page=1&is_demo=1"
|
|
|
|
},
|
|
|
|
"last": {
|
|
|
|
"href": "https://fusenapi.kayue.cn:8010/product/list?cid=13&size=620&page=2&is_demo=1"
|
|
|
|
},
|
|
|
|
"next": {
|
|
|
|
"href": "https://fusenapi.kayue.cn:8010/product/list?cid=13&size=620&page=2&is_demo=1"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"_meta": {
|
|
|
|
"totalCount": 21,
|
|
|
|
"pageCount": 2,
|
|
|
|
"currentPage": 1,
|
|
|
|
"perPage": 20
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"typeName": "Boxes",
|
|
|
|
"description": ""
|
|
|
|
}`
|
|
|
|
}
|