package logic import ( "context" "encoding/json" "errors" "fmt" "fusenapi/constants" "fusenapi/model" "fusenapi/product/internal/svc" "fusenapi/product/internal/types" "fusenapi/utils/auth" "fusenapi/utils/format" "fusenapi/utils/image" "github.com/zeromicro/go-zero/core/stores/sqlc" "sort" "strings" "time" "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, } } // 获取产品列表 func (l *GetProductListLogic) GetProductList(req *types.GetProductListReq, loginInfo auth.UserInfo) (resp *types.Response) { //校验前台登录情况 if loginInfo.UserId == 0 { return &types.Response{Code: 402, Message: "please sign in"} } //如果是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"} } return &types.Response{Code: 200, Message: "success", Data: demo} } if req.Page <= 0 { req.Page = 1 } //获取合适尺寸 if req.Size > 0 { req.Size = image.GetCurrentSize(req.Size) } //查询用户信息 userModel := model.NewFsUserModel(l.svcCtx.MysqlConn) userInfo, err := userModel.FindOne(l.ctx, loginInfo.UserId) if err != nil && !errors.Is(err, sqlc.ErrNotFound) { logx.Error(err) return &types.Response{Code: 510, Message: "get user info err"} } if userInfo == nil { return &types.Response{Code: 402, Message: "user not exists"} } //查询符合的产品列表 productModel := model.NewFsProductModel(l.svcCtx.MysqlConn) productList, err := productModel.GetProductListByConditions(l.ctx, int(req.Cid), 0, 1, "sort-desc") if err != nil { logx.Error(err) return &types.Response{Code: 510, Message: "failed to get product list"} } fmt.Println(len(productList)) productLen := len(productList) if productLen == 0 { return &types.Response{Code: 200, Message: "success"} } //提取产品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"} } //存储产品最小价格 mapProductMinPrice := make(map[int64]int64) for _, v := range productPriceList { priceStrSlic := strings.Split(v.Price, ",") priceSlice, err := format.StrSlicToIntSlice(priceStrSlic) if err != nil { logx.Error(err) return &types.Response{Code: 510, Message: err.Error()} } if len(priceSlice) == 0 { continue } sort.Ints(priceSlice) mapProductMinPrice[v.ProductId] = int64(priceSlice[0]) } //获取模板 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"} } 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, sqlc.ErrNotFound) { logx.Error(err) return &types.Response{Code: 510, Message: "get classification err "} } if tagInfo == nil { return &types.Response{Code: 510, Message: "classification not exists "} } //获取产品尺寸数量 productSizeModel := model.NewFsProductSizeModel(l.svcCtx.MysqlConn) productSizeCount, err := productSizeModel.CountByStatus(l.ctx, 1) if err != nil { logx.Error(err) return &types.Response{Code: 510, Message: "get product size count err "} } //拼接返回 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: v.IsProtection, IsMicro: v.IsMicrowave, SizeNum: uint32(productSizeCount), MiniPrice: format.CentoDollar(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, }} return } // 样本产品列表 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": "" }` }