From 8c0cd8e5746dcdd04df1558ee2bcfe6ab5d7b8ef Mon Sep 17 00:00:00 2001 From: chenlin Date: Tue, 2 Sep 2025 14:30:21 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=95=86=E5=9F=8E=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BC=98=E5=8C=96=EF=BC=9B=202=E3=80=81?= =?UTF-8?q?=E7=A7=9F=E8=B5=81=E8=AE=A2=E5=8D=95=E6=8E=92=E5=BA=8F=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=9B=203=E3=80=81=E6=96=B0=E5=A2=9E=E5=95=86?= =?UTF-8?q?=E5=9F=8E=E8=B4=AD=E7=89=A9=E8=BD=A6=E6=8E=A5=E5=8F=A3=EF=BC=88?= =?UTF-8?q?=E5=BE=85=E5=AE=8C=E5=96=84=EF=BC=89=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/mall.go | 16 +++++++++---- model/game_card.go | 2 +- model/mall.go | 53 +++++++++++++++++++++++++++++++++++++++++++- model/mall_cart.go | 12 ++++++++++ router/router_app.go | 18 ++++++++++----- 5 files changed, 89 insertions(+), 12 deletions(-) create mode 100644 model/mall_cart.go diff --git a/controller/mall.go b/controller/mall.go index 83d8230..6e26939 100644 --- a/controller/mall.go +++ b/controller/mall.go @@ -17,6 +17,14 @@ import ( "time" ) +// MallGoodsList 商品列表 +// @Summary 商品列表 +// @Tags 商城, V1.4.5 +// @Produce json +// @Accept json +// @Param request body model.GoodsListReq true "新建商品列表模型" +// @Success 200 {object} model.GoodsListResp +// @Router /api/v1/mall/goods/list [post] func MallGoodsList(c *gin.Context) { req := model.GoodsListReq{} if err := c.ShouldBindJSON(&req); err != nil { @@ -49,10 +57,10 @@ func MallGoodsList(c *gin.Context) { } } - ret := map[string]interface{}{ - "list": list, - "cur_page": req.PageIdx, - "total_page": total, + ret := model.GoodsListResp{ + List: list, + CurPage: req.PageIdx, + TotalPage: total, } RespOK(c, ret) diff --git a/model/game_card.go b/model/game_card.go index 522a25d..ff8dc0e 100644 --- a/model/game_card.go +++ b/model/game_card.go @@ -2052,7 +2052,7 @@ func NewGetGameCardList(sortType, page, pageSize int, gameTypeIds []uint64, stor } effectiveStoreListStr := fmt.Sprintf("(%s)", strings.Trim(strings.Join(strings.Fields(fmt.Sprint(effectiveStoreList)), ","), "[]")) - if homeCategoryInfo.AllFlag == 1 && homeCategoryInfo.OrderFlag != 1 { + if homeCategoryInfo.AllFlag == 1 { if storeId != 0 { var cardStocks []GameCardGoodsStock cardStockSql1 := fmt.Sprintf("SELECT a.* FROM game_card_goods_stock a LEFT JOIN game_card b ON a.game_card_id=b.id WHERE a.store_id=%d AND a.store_id IN %s AND a.rent_stock>0 ORDER BY b.id ASC;", storeId, effectiveStoreListStr) diff --git a/model/mall.go b/model/mall.go index e24a4c5..ab4072f 100644 --- a/model/mall.go +++ b/model/mall.go @@ -79,7 +79,7 @@ type Goods struct { VersionId uint64 `json:"version_id"` // 乐观锁 ShowDiscount int8 `json:"show_discount"` // GoodsAccountNum uint32 `json:"goods_account_num"` // 收款账户编号 - //Stock uint32 `json:"stock"` // 库存 + ErpStock uint32 `json:"erp_stock" gorm:"-"` // erp库存 GoodsCat *GoodsCat `json:"goods_cat" gorm:"-"` GoodsDiscount *GoodsDiscount `json:"goods_discount" gorm:"-"` @@ -203,6 +203,12 @@ type GoodsListReq struct { PageSize int `json:"page_size"` } +type GoodsListResp struct { + List []Goods `json:"list"` + CurPage int `json:"cur_page"` + TotalPage int `json:"total_page"` +} + func (m *GoodsListReq) GoodsList() ([]Goods, int, error) { page := m.PageIdx - 1 if page < 0 { @@ -248,6 +254,51 @@ func (m *GoodsListReq) GoodsList() ([]Goods, int, error) { return nil, 0, err } + // 处理ERP库存:批量查询 + erpIDs := make([]uint32, 0) + for _, g := range goodsList { + if g.ErpCommodityId != 0 { + erpIDs = append(erpIDs, g.ErpCommodityId) + } + } + + if len(erpIDs) > 0 { + type ErpStockData struct { + ErpCommodityId uint32 + Stock uint32 + } + var stocks []ErpStockData + db := DB.Table("erp_stock_commodity"). + Select("erp_commodity_id, SUM(count) AS stock"). + Where("state = ?", 1). + Group("erp_commodity_id") + + // 根据数量区分使用 = 或 IN + if len(erpIDs) == 1 { + db = db.Where("erp_commodity_id = ?", erpIDs[0]) + } else { + db = db.Where("erp_commodity_id IN ?", erpIDs) + } + + if err := db.Find(&stocks).Error; err != nil { + logger.Error("err:", err) + return nil, 0, err + } + + // 构建映射 + stockMap := make(map[uint32]uint32, len(stocks)) + for _, s := range stocks { + stockMap[s.ErpCommodityId] = s.Stock + } + + // 给商品赋值库存 + for i := range goodsList { + if goodsList[i].ErpCommodityId != 0 { + goodsList[i].ErpStock = stockMap[goodsList[i].ErpCommodityId] + } + } + } + return goodsList, totalPage, nil } diff --git a/model/mall_cart.go b/model/mall_cart.go new file mode 100644 index 0000000..01c4852 --- /dev/null +++ b/model/mall_cart.go @@ -0,0 +1,12 @@ +package model + +//go:generate goqueryset -in mall_cart.go +type MallCart struct { + Model + + Uid uint64 `json:"uid" gorm:"index"` + GameCardId uint64 `json:"game_card_id"` // 游戏卡id + Count uint32 `json:"count"` // 数量 + + GameCard GameCard `json:"game_card" gorm:"-"` +} diff --git a/router/router_app.go b/router/router_app.go index fcbda67..d8562d0 100644 --- a/router/router_app.go +++ b/router/router_app.go @@ -206,14 +206,21 @@ func ConfigAppRouter(r gin.IRouter) { mall.POST("order/refund_cancel", controller.MallOrderRefundCancel) // 订单-退货-取消 mall.POST("order/refund_send", controller.MallOrderRefundSend) // 订单-退货-填物流 } - shoppingCart := api.Group("shopping_cart") // 心愿单/购物车 - { + mallCart := api.Group("mall_cart") // 商城购物车 + { + mallCart.Use(auth.UserAccessAuth) + mallCart.POST("list", controller.ShoppingCartList) // 商城购物车列表 + mallCart.POST("add", controller.ShoppingCartAdd) // 添加商品 + mallCart.POST("del", controller.ShoppingCartDel) // 删除商品 + } + + shoppingCart := api.Group("shopping_cart") // 租卡心愿单/购物车 + { shoppingCart.Use(auth.UserAccessAuth) shoppingCart.POST("list", controller.ShoppingCartList) // 详情 - shoppingCart.POST("add", controller.ShoppingCartAdd) // - shoppingCart.POST("del", controller.ShoppingCartDel) // - + shoppingCart.POST("add", controller.ShoppingCartAdd) // 添加商品 + shoppingCart.POST("del", controller.ShoppingCartDel) // 删除商品 } shareCard := api.Group("share_card") { @@ -322,5 +329,4 @@ func ConfigAppRouter(r gin.IRouter) { lottery.POST("/today_draw_count", controller.GetTodayDrawCount) // 查询用户当天抽奖次数 lottery.POST("/prize_order/detail", controller.GetLotteryPrizeOrderDetail) // 查询抽奖订单详情 } - }