diff --git a/server/shopping-cart/internal/handler/calculatecartpricehandler.go b/server/shopping-cart/internal/handler/calculatecartpricehandler.go new file mode 100644 index 00000000..4f56e7d9 --- /dev/null +++ b/server/shopping-cart/internal/handler/calculatecartpricehandler.go @@ -0,0 +1,35 @@ +package handler + +import ( + "net/http" + "reflect" + + "fusenapi/utils/basic" + + "fusenapi/server/shopping-cart/internal/logic" + "fusenapi/server/shopping-cart/internal/svc" + "fusenapi/server/shopping-cart/internal/types" +) + +func CalculateCartPriceHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.CalculateCartPriceReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewCalculateCartPriceLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.CalculateCartPrice(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/shopping-cart/internal/logic/calculatecartpricelogic.go b/server/shopping-cart/internal/logic/calculatecartpricelogic.go new file mode 100644 index 00000000..0c35521d --- /dev/null +++ b/server/shopping-cart/internal/logic/calculatecartpricelogic.go @@ -0,0 +1,86 @@ +package logic + +import ( + "context" + "fmt" + "fusenapi/model/gmodel" + "fusenapi/utils/auth" + "fusenapi/utils/basic" + + "fusenapi/server/shopping-cart/internal/svc" + "fusenapi/server/shopping-cart/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type CalculateCartPriceLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewCalculateCartPriceLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CalculateCartPriceLogic { + return &CalculateCartPriceLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *CalculateCartPriceLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *CalculateCartPriceLogic) CalculateCartPrice(req *types.CalculateCartPriceReq, userinfo *auth.UserInfo) (resp *basic.Response) { + if !userinfo.IsUser() { + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in") + } + if len(req.CalculateList) == 0 { + return resp.SetStatusWithMessage(basic.CodeOK, "success", types.CalculateCartPriceRsp{CalculateResultList: []types.CalculateResultItem{}}) + } + cartIds := make([]int64, 0, len(req.CalculateList)) + for _, v := range req.CalculateList { + cartIds = append(cartIds, v.CartId) + } + //获取购物车列表 + carts, _, err := l.svcCtx.AllModels.FsShoppingCart.GetAllCartsByParam(l.ctx, gmodel.GetAllCartsByParamReq{ + Ids: cartIds, + Fields: "id,size_id,product_id", + UserId: userinfo.UserId, + Page: 1, + Limit: len(cartIds), + }) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get cart list") + } + sizeIds := make([]int64, 0, len(carts)) + productIds := make([]int64, 0, len(carts)) + fittingIds := make([]int64, 0, len(carts)) + for _, v := range carts { + sizeIds = append(sizeIds, *v.SizeId) + productIds = append(productIds, *v.ProductId) + if *v.FittingId > 0 { + fittingIds = append(fittingIds, *v.FittingId) + } + } + //根据sizeid获取价格列表 + priceList, err := l.svcCtx.AllModels.FsProductPrice.GetPriceListByProductIdsSizeIds(l.ctx, productIds, sizeIds) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get price list") + } + mapPrice := make(map[string]int) + for k, v := range priceList { + mapPrice[fmt.Sprintf("%d_%d", *v.ProductId, *v.SizeId)] = k + } + //获取配件列表 + // todo 下周写 + /*fittingList, err := l.svcCtx.AllModels.FsProductModel3d.GetAllByIdsTag()*/ + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *CalculateCartPriceLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// }