From 9e4703bd1f8504bf2971d8576107809be913dabc Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Wed, 13 Sep 2023 16:44:23 +0800 Subject: [PATCH 01/26] fix --- model/gmodel/fs_shopping_cart_gen.go | 2 +- server_api/shopping-cart.api | 48 ++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 server_api/shopping-cart.api diff --git a/model/gmodel/fs_shopping_cart_gen.go b/model/gmodel/fs_shopping_cart_gen.go index 47c69f94..e58ae44b 100644 --- a/model/gmodel/fs_shopping_cart_gen.go +++ b/model/gmodel/fs_shopping_cart_gen.go @@ -14,7 +14,7 @@ type FsShoppingCart struct { PriceId *int64 `gorm:"default:0;" json:"price_id"` // 价格id SizeId *int64 `gorm:"default:0;" json:"size_id"` // 尺寸id MaterialId *int64 `gorm:"default:0;" json:"material_id"` // 材质id - FittingIds *string `gorm:"default:'';" json:"fitting_ids"` // 配件id集合 + FittingId *int64 `gorm:"default:0;" json:"fitting_id"` // 配件id PurchaseQuantity *int64 `gorm:"default:0;" json:"purchase_quantity"` // 购买数量 UnitPrice *int64 `gorm:"default:0;" json:"unit_price"` // 当时加入购物车的单价,不作为支付计算,支付计算需要实时价格(厘)换算美元除以1000 TotalPrice *int64 `gorm:"default:0;" json:"total_price"` // 当时加入购物车单价x数量的总价,不作为支付计算,支付计算需要实时价格 diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api new file mode 100644 index 00000000..ed7b9e1f --- /dev/null +++ b/server_api/shopping-cart.api @@ -0,0 +1,48 @@ +syntax = "v1" + +info ( + title: "shopping-cart"// TODO: add title + desc: "购物车服务"// TODO: add description + author: "" + email: "" +) + +import "basic.api" +service shopping-cart { + //加入购物车 + @handler AddToCartHandler + post /api/shopping-cart/add_to_cart(AddToCartReq) returns (response); + //删除购物车 + @handler DeleteCartHandler + post /api/shopping-cart/delete_cart(DeleteCartReq) returns (response); + //修改购物车购买数量 + @handler ModifyCartPurchaseQuantityHandler + post /api/shopping-cart/modify_cart_purchase_quantity(ModifyCartPurchaseQuantityReq) returns (response); + //获取购物车列表 + @handler GetCartsHandler + get /api/shopping-cart/get_carts(GetCartsReq) returns (response); +} +//加入购物车 +type AddToCartReq{ + ProductId int64 `json:"product_id"`//产品id + TemplateId int64 `json:"template_id"` //模板id + SizeId int64 `json:"size_id"` //尺寸id + FittingId int64 `json:"fitting_id"` //配件id + PurchaseQuantity int64 `json:"purchase_quantity"` //购买数量 + Logo string `json:"logo"` //logo地址 + CombineImage string `json:"combine_image"` //合图地址 + RenderImage string `json:"render_image"` //渲染结果图 +} +//删除购物车 +type DeleteCartReq{ + Id int64 `json:"id"`//购物车id +} +//修改购物车购买数量 +type ModifyCartPurchaseQuantityReq{ + Id int64 `json:"id"` //购物车id + Quantity int64 `json:"quantity"` //数量 +} +//获取购物车列表 +type GetCartsReq{ + Page int `form:"page"` //当前页 +} From 417228ce053f72fdfe19157107390688c46b4305 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Wed, 13 Sep 2023 17:20:39 +0800 Subject: [PATCH 02/26] fix --- server_api/shopping-cart.api | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index ed7b9e1f..829ec1a6 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -46,3 +46,35 @@ type ModifyCartPurchaseQuantityReq{ type GetCartsReq{ Page int `form:"page"` //当前页 } +type GetCartsRsp { + Meta Meta `json:"meta"` //分页信息 + CartList []CartItem `json:"cart_list"` +} +type CartItem{ + ProductId int64 `json:"product_id"`//产品id + SizeInfo SizeInfo `json:"size_info"`//尺寸信息 + FittingInfo FittingInfo `json:"fitting_info"` //配件信息 + ItemPrice string `json:"item_price"` //单价 + TotalPrice string `json:"totalPrice"`//单价X数量=总价 + DiyInformation DiyInformation `json:"diy_information"` //diy信息 + StepNum []int64 `json:"step_num"` //阶梯数量 +} +type SizeInfo{ + SizeId int64 `json:"size_id"` //尺寸id + Capacity string `json:"capacity"`//尺寸名称 + Title SizeTitle `json:"title"` +} +type FittingInfo{ + FittingId int64 `json:"fitting_id"`//配件id + FittingName string `json:"fitting_name"` //配件名称 +} +type SizeTitle{ + Cm string `json:"cm"` + Inch string `json:"inch"` +} +type DiyInformation{ + Phone string `json:"phone"` + Address string `json:"address"` + Website string `json:"website"` + Qrcode string `json:"qrcode"` +} \ No newline at end of file From a8b85fad0287ec8f2c590c5d17a94e9e5f15aaa4 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Wed, 13 Sep 2023 17:27:16 +0800 Subject: [PATCH 03/26] fix --- server/product/etc/product.yaml | 2 +- server_api/shopping-cart.api | 67 +++++++++++++++++---------------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/server/product/etc/product.yaml b/server/product/etc/product.yaml index c43bfa02..938f3aca 100644 --- a/server/product/etc/product.yaml +++ b/server/product/etc/product.yaml @@ -1,5 +1,5 @@ Name: product -Host: localhost +Host: 0.0.0.0 Port: 9908 ReplicaId: 55 Timeout: 15000 #服务超时时间 diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index 829ec1a6..9731e835 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -22,59 +22,60 @@ service shopping-cart { @handler GetCartsHandler get /api/shopping-cart/get_carts(GetCartsReq) returns (response); } + //加入购物车 -type AddToCartReq{ - ProductId int64 `json:"product_id"`//产品id - TemplateId int64 `json:"template_id"` //模板id - SizeId int64 `json:"size_id"` //尺寸id - FittingId int64 `json:"fitting_id"` //配件id - PurchaseQuantity int64 `json:"purchase_quantity"` //购买数量 - Logo string `json:"logo"` //logo地址 - CombineImage string `json:"combine_image"` //合图地址 - RenderImage string `json:"render_image"` //渲染结果图 +type AddToCartReq { + ProductId int64 `json:"product_id"` //产品id + TemplateId int64 `json:"template_id"` //模板id + SizeId int64 `json:"size_id"` //尺寸id + FittingId int64 `json:"fitting_id"` //配件id + PurchaseQuantity int64 `json:"purchase_quantity"` //购买数量 + Logo string `json:"logo"` //logo地址 + CombineImage string `json:"combine_image"` //合图地址 + RenderImage string `json:"render_image"` //渲染结果图 } //删除购物车 -type DeleteCartReq{ - Id int64 `json:"id"`//购物车id +type DeleteCartReq { + Id int64 `json:"id"` //购物车id } //修改购物车购买数量 -type ModifyCartPurchaseQuantityReq{ - Id int64 `json:"id"` //购物车id +type ModifyCartPurchaseQuantityReq { + Id int64 `json:"id"` //购物车id Quantity int64 `json:"quantity"` //数量 } //获取购物车列表 -type GetCartsReq{ +type GetCartsReq { Page int `form:"page"` //当前页 } type GetCartsRsp { - Meta Meta `json:"meta"` //分页信息 - CartList []CartItem `json:"cart_list"` + Meta Meta `json:"meta"` //分页信息 + CartList []CartItem `json:"cart_list"` } -type CartItem{ - ProductId int64 `json:"product_id"`//产品id - SizeInfo SizeInfo `json:"size_info"`//尺寸信息 - FittingInfo FittingInfo `json:"fitting_info"` //配件信息 - ItemPrice string `json:"item_price"` //单价 - TotalPrice string `json:"totalPrice"`//单价X数量=总价 +type CartItem { + ProductId int64 `json:"product_id"` //产品id + SizeInfo SizeInfo `json:"size_info"` //尺寸信息 + FittingInfo FittingInfo `json:"fitting_info"` //配件信息 + ItemPrice string `json:"item_price"` //单价 + TotalPrice string `json:"totalPrice"` //单价X数量=总价 DiyInformation DiyInformation `json:"diy_information"` //diy信息 - StepNum []int64 `json:"step_num"` //阶梯数量 + StepNum []int64 `json:"step_num"` //阶梯数量 } -type SizeInfo{ - SizeId int64 `json:"size_id"` //尺寸id - Capacity string `json:"capacity"`//尺寸名称 +type SizeInfo { + SizeId int64 `json:"size_id"` //尺寸id + Capacity string `json:"capacity"` //尺寸名称 Title SizeTitle `json:"title"` } -type FittingInfo{ - FittingId int64 `json:"fitting_id"`//配件id +type FittingInfo { + FittingId int64 `json:"fitting_id"` //配件id FittingName string `json:"fitting_name"` //配件名称 } -type SizeTitle{ - Cm string `json:"cm"` +type SizeTitle { + Cm string `json:"cm"` Inch string `json:"inch"` } -type DiyInformation{ - Phone string `json:"phone"` +type DiyInformation { + Phone string `json:"phone"` Address string `json:"address"` Website string `json:"website"` - Qrcode string `json:"qrcode"` + Qrcode string `json:"qrcode"` } \ No newline at end of file From b8edd41e69e4b2b9b6aa525698e27bb447c8ef05 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Wed, 13 Sep 2023 17:33:58 +0800 Subject: [PATCH 04/26] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=B4=AD=E7=89=A9?= =?UTF-8?q?=E8=BD=A6=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/shopping-cart/etc/shopping-cart.yaml | 12 ++ .../shopping-cart/internal/config/config.go | 13 ++ .../internal/handler/addtocarthandler.go | 35 +++++ .../internal/handler/deletecarthandler.go | 35 +++++ .../internal/handler/getcartshandler.go | 35 +++++ .../modifycartpurchasequantityhandler.go | 35 +++++ .../shopping-cart/internal/handler/routes.go | 37 +++++ .../internal/logic/addtocartlogic.go | 43 ++++++ .../internal/logic/deletecartlogic.go | 43 ++++++ .../internal/logic/getcartslogic.go | 43 ++++++ .../logic/modifycartpurchasequantitylogic.go | 43 ++++++ .../internal/svc/servicecontext.go | 26 ++++ server/shopping-cart/internal/types/types.go | 137 ++++++++++++++++++ server/shopping-cart/shopping-cart.go | 36 +++++ 14 files changed, 573 insertions(+) create mode 100644 server/shopping-cart/etc/shopping-cart.yaml create mode 100644 server/shopping-cart/internal/config/config.go create mode 100644 server/shopping-cart/internal/handler/addtocarthandler.go create mode 100644 server/shopping-cart/internal/handler/deletecarthandler.go create mode 100644 server/shopping-cart/internal/handler/getcartshandler.go create mode 100644 server/shopping-cart/internal/handler/modifycartpurchasequantityhandler.go create mode 100644 server/shopping-cart/internal/handler/routes.go create mode 100644 server/shopping-cart/internal/logic/addtocartlogic.go create mode 100644 server/shopping-cart/internal/logic/deletecartlogic.go create mode 100644 server/shopping-cart/internal/logic/getcartslogic.go create mode 100644 server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go create mode 100644 server/shopping-cart/internal/svc/servicecontext.go create mode 100644 server/shopping-cart/internal/types/types.go create mode 100644 server/shopping-cart/shopping-cart.go diff --git a/server/shopping-cart/etc/shopping-cart.yaml b/server/shopping-cart/etc/shopping-cart.yaml new file mode 100644 index 00000000..2b0db3dd --- /dev/null +++ b/server/shopping-cart/etc/shopping-cart.yaml @@ -0,0 +1,12 @@ +Name: shopping-cart +Host: 0.0.0.0 +Port: 9918 +Timeout: 15000 #服务超时时间(毫秒) +SourceMysql: fsreaderwriter:XErSYmLELKMnf3Dh@tcp(fusen.cdmigcvz3rle.us-east-2.rds.amazonaws.com:3306)/fusen +SourceRabbitMq: amqp://rabbit001:rabbit001129@110.41.19.98:5672 +Log: + Stat: false +Auth: + AccessSecret: fusen2023 + AccessExpire: 2592000 + RefreshAfter: 1592000 diff --git a/server/shopping-cart/internal/config/config.go b/server/shopping-cart/internal/config/config.go new file mode 100644 index 00000000..57f6dab8 --- /dev/null +++ b/server/shopping-cart/internal/config/config.go @@ -0,0 +1,13 @@ +package config + +import ( + "fusenapi/server/shopping-cart/internal/types" + "github.com/zeromicro/go-zero/rest" +) + +type Config struct { + rest.RestConf + SourceMysql string + Auth types.Auth + SourceRabbitMq string +} diff --git a/server/shopping-cart/internal/handler/addtocarthandler.go b/server/shopping-cart/internal/handler/addtocarthandler.go new file mode 100644 index 00000000..6fe5e246 --- /dev/null +++ b/server/shopping-cart/internal/handler/addtocarthandler.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 AddToCartHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.AddToCartReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewAddToCartLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.AddToCart(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/shopping-cart/internal/handler/deletecarthandler.go b/server/shopping-cart/internal/handler/deletecarthandler.go new file mode 100644 index 00000000..fa7c4fd0 --- /dev/null +++ b/server/shopping-cart/internal/handler/deletecarthandler.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 DeleteCartHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.DeleteCartReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewDeleteCartLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.DeleteCart(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/shopping-cart/internal/handler/getcartshandler.go b/server/shopping-cart/internal/handler/getcartshandler.go new file mode 100644 index 00000000..8d0a4a0a --- /dev/null +++ b/server/shopping-cart/internal/handler/getcartshandler.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 GetCartsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.GetCartsReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewGetCartsLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.GetCarts(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/shopping-cart/internal/handler/modifycartpurchasequantityhandler.go b/server/shopping-cart/internal/handler/modifycartpurchasequantityhandler.go new file mode 100644 index 00000000..b04427bf --- /dev/null +++ b/server/shopping-cart/internal/handler/modifycartpurchasequantityhandler.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 ModifyCartPurchaseQuantityHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.ModifyCartPurchaseQuantityReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewModifyCartPurchaseQuantityLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.ModifyCartPurchaseQuantity(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/shopping-cart/internal/handler/routes.go b/server/shopping-cart/internal/handler/routes.go new file mode 100644 index 00000000..08ade841 --- /dev/null +++ b/server/shopping-cart/internal/handler/routes.go @@ -0,0 +1,37 @@ +// Code generated by goctl. DO NOT EDIT. +package handler + +import ( + "net/http" + + "fusenapi/server/shopping-cart/internal/svc" + + "github.com/zeromicro/go-zero/rest" +) + +func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { + server.AddRoutes( + []rest.Route{ + { + Method: http.MethodPost, + Path: "/api/shopping-cart/add_to_cart", + Handler: AddToCartHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/api/shopping-cart/delete_cart", + Handler: DeleteCartHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/api/shopping-cart/modify_cart_purchase_quantity", + Handler: ModifyCartPurchaseQuantityHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/api/shopping-cart/get_carts", + Handler: GetCartsHandler(serverCtx), + }, + }, + ) +} diff --git a/server/shopping-cart/internal/logic/addtocartlogic.go b/server/shopping-cart/internal/logic/addtocartlogic.go new file mode 100644 index 00000000..e360240d --- /dev/null +++ b/server/shopping-cart/internal/logic/addtocartlogic.go @@ -0,0 +1,43 @@ +package logic + +import ( + "fusenapi/utils/auth" + "fusenapi/utils/basic" + + "context" + + "fusenapi/server/shopping-cart/internal/svc" + "fusenapi/server/shopping-cart/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type AddToCartLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAddToCartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AddToCartLogic { + return &AddToCartLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *AddToCartLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserInfo) (resp *basic.Response) { + // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) + // userinfo 传入值时, 一定不为null + + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *AddToCartLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/shopping-cart/internal/logic/deletecartlogic.go b/server/shopping-cart/internal/logic/deletecartlogic.go new file mode 100644 index 00000000..865a811f --- /dev/null +++ b/server/shopping-cart/internal/logic/deletecartlogic.go @@ -0,0 +1,43 @@ +package logic + +import ( + "fusenapi/utils/auth" + "fusenapi/utils/basic" + + "context" + + "fusenapi/server/shopping-cart/internal/svc" + "fusenapi/server/shopping-cart/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type DeleteCartLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewDeleteCartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteCartLogic { + return &DeleteCartLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *DeleteCartLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *DeleteCartLogic) DeleteCart(req *types.DeleteCartReq, userinfo *auth.UserInfo) (resp *basic.Response) { + // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) + // userinfo 传入值时, 一定不为null + + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *DeleteCartLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go new file mode 100644 index 00000000..097f91b7 --- /dev/null +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -0,0 +1,43 @@ +package logic + +import ( + "fusenapi/utils/auth" + "fusenapi/utils/basic" + + "context" + + "fusenapi/server/shopping-cart/internal/svc" + "fusenapi/server/shopping-cart/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetCartsLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetCartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCartsLogic { + return &GetCartsLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *GetCartsLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo) (resp *basic.Response) { + // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) + // userinfo 传入值时, 一定不为null + + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *GetCartsLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go b/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go new file mode 100644 index 00000000..9da2b886 --- /dev/null +++ b/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go @@ -0,0 +1,43 @@ +package logic + +import ( + "fusenapi/utils/auth" + "fusenapi/utils/basic" + + "context" + + "fusenapi/server/shopping-cart/internal/svc" + "fusenapi/server/shopping-cart/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ModifyCartPurchaseQuantityLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewModifyCartPurchaseQuantityLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ModifyCartPurchaseQuantityLogic { + return &ModifyCartPurchaseQuantityLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *ModifyCartPurchaseQuantityLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *ModifyCartPurchaseQuantityLogic) ModifyCartPurchaseQuantity(req *types.ModifyCartPurchaseQuantityReq, userinfo *auth.UserInfo) (resp *basic.Response) { + // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) + // userinfo 传入值时, 一定不为null + + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *ModifyCartPurchaseQuantityLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/shopping-cart/internal/svc/servicecontext.go b/server/shopping-cart/internal/svc/servicecontext.go new file mode 100644 index 00000000..2b0f1a9a --- /dev/null +++ b/server/shopping-cart/internal/svc/servicecontext.go @@ -0,0 +1,26 @@ +package svc + +import ( + "fusenapi/initalize" + "fusenapi/model/gmodel" + "fusenapi/server/shopping-cart/internal/config" + "gorm.io/gorm" +) + +type ServiceContext struct { + Config config.Config + MysqlConn *gorm.DB + AllModels *gmodel.AllModelsGen + RabbitMq *initalize.RabbitMqHandle +} + +func NewServiceContext(c config.Config) *ServiceContext { + conn := initalize.InitMysql(c.SourceMysql) + + return &ServiceContext{ + Config: c, + MysqlConn: conn, + AllModels: gmodel.NewAllModels(initalize.InitMysql(c.SourceMysql)), + RabbitMq: initalize.InitRabbitMq(c.SourceRabbitMq, nil), + } +} diff --git a/server/shopping-cart/internal/types/types.go b/server/shopping-cart/internal/types/types.go new file mode 100644 index 00000000..4dbebdbb --- /dev/null +++ b/server/shopping-cart/internal/types/types.go @@ -0,0 +1,137 @@ +// Code generated by goctl. DO NOT EDIT. +package types + +import ( + "fusenapi/utils/basic" +) + +type AddToCartReq struct { + ProductId int64 `json:"product_id"` //产品id + TemplateId int64 `json:"template_id"` //模板id + SizeId int64 `json:"size_id"` //尺寸id + FittingId int64 `json:"fitting_id"` //配件id + PurchaseQuantity int64 `json:"purchase_quantity"` //购买数量 + Logo string `json:"logo"` //logo地址 + CombineImage string `json:"combine_image"` //合图地址 + RenderImage string `json:"render_image"` //渲染结果图 +} + +type DeleteCartReq struct { + Id int64 `json:"id"` //购物车id +} + +type ModifyCartPurchaseQuantityReq struct { + Id int64 `json:"id"` //购物车id + Quantity int64 `json:"quantity"` //数量 +} + +type GetCartsReq struct { + Page int `form:"page"` //当前页 +} + +type GetCartsRsp struct { + Meta Meta `json:"meta"` //分页信息 + CartList []CartItem `json:"cart_list"` +} + +type CartItem struct { + ProductId int64 `json:"product_id"` //产品id + SizeInfo SizeInfo `json:"size_info"` //尺寸信息 + FittingInfo FittingInfo `json:"fitting_info"` //配件信息 + ItemPrice string `json:"item_price"` //单价 + TotalPrice string `json:"totalPrice"` //单价X数量=总价 + DiyInformation DiyInformation `json:"diy_information"` //diy信息 + StepNum []int64 `json:"step_num"` //阶梯数量 +} + +type SizeInfo struct { + SizeId int64 `json:"size_id"` //尺寸id + Capacity string `json:"capacity"` //尺寸名称 + Title SizeTitle `json:"title"` +} + +type FittingInfo struct { + FittingId int64 `json:"fitting_id"` //配件id + FittingName string `json:"fitting_name"` //配件名称 +} + +type SizeTitle struct { + Cm string `json:"cm"` + Inch string `json:"inch"` +} + +type DiyInformation struct { + Phone string `json:"phone"` + Address string `json:"address"` + Website string `json:"website"` + Qrcode string `json:"qrcode"` +} + +type Request struct { +} + +type Response struct { + Code int `json:"code"` + Message string `json:"msg"` + Data interface{} `json:"data"` +} + +type Auth struct { + AccessSecret string `json:"accessSecret"` + AccessExpire int64 `json:"accessExpire"` + RefreshAfter int64 `json:"refreshAfter"` +} + +type File struct { + Filename string `fsfile:"filename"` + Header map[string][]string `fsfile:"header"` + Size int64 `fsfile:"size"` + Data []byte `fsfile:"data"` +} + +type Meta struct { + TotalCount int64 `json:"totalCount"` + PageCount int64 `json:"pageCount"` + CurrentPage int `json:"currentPage"` + PerPage int `json:"perPage"` +} + +// Set 设置Response的Code和Message值 +func (resp *Response) Set(Code int, Message string) *Response { + return &Response{ + Code: Code, + Message: Message, + } +} + +// Set 设置整个Response +func (resp *Response) SetWithData(Code int, Message string, Data interface{}) *Response { + return &Response{ + Code: Code, + Message: Message, + Data: Data, + } +} + +// SetStatus 设置默认StatusResponse(内部自定义) 默认msg, 可以带data, data只使用一个参数 +func (resp *Response) SetStatus(sr *basic.StatusResponse, data ...interface{}) *Response { + newResp := &Response{ + Code: sr.Code, + } + if len(data) == 1 { + newResp.Data = data[0] + } + return newResp +} + +// SetStatusWithMessage 设置默认StatusResponse(内部自定义) 非默认msg, 可以带data, data只使用一个参数 +func (resp *Response) SetStatusWithMessage(sr *basic.StatusResponse, msg string, data ...interface{}) *Response { + newResp := &Response{ + Code: sr.Code, + Message: msg, + } + if len(data) == 1 { + newResp.Data = data[0] + } + return newResp +} diff --git a/server/shopping-cart/shopping-cart.go b/server/shopping-cart/shopping-cart.go new file mode 100644 index 00000000..f7a8cb3f --- /dev/null +++ b/server/shopping-cart/shopping-cart.go @@ -0,0 +1,36 @@ +package main + +import ( + "flag" + "fmt" + "net/http" + "time" + + "fusenapi/utils/auth" + + "fusenapi/server/shopping-cart/internal/config" + "fusenapi/server/shopping-cart/internal/handler" + "fusenapi/server/shopping-cart/internal/svc" + + "github.com/zeromicro/go-zero/core/conf" + "github.com/zeromicro/go-zero/rest" +) + +var configFile = flag.String("f", "etc/shopping-cart.yaml", "the config file") + +func main() { + flag.Parse() + + var c config.Config + conf.MustLoad(*configFile, &c) + c.Timeout = int64(time.Second * 15) + server := rest.MustNewServer(c.RestConf, rest.WithCustomCors(auth.FsCors, func(w http.ResponseWriter) { + })) + defer server.Stop() + + ctx := svc.NewServiceContext(c) + handler.RegisterHandlers(server, ctx) + + fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port) + server.Start() +} From f56946fce9254a7a7a9c2efe12aeba99095835f9 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Wed, 13 Sep 2023 18:37:50 +0800 Subject: [PATCH 05/26] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=B4=AD=E7=89=A9=E8=BD=A6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/gmodel/fs_shopping_cart_gen.go | 1 + .../internal/logic/addtocartlogic.go | 79 ++++++++++++++++++- 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/model/gmodel/fs_shopping_cart_gen.go b/model/gmodel/fs_shopping_cart_gen.go index e58ae44b..0cdf795f 100644 --- a/model/gmodel/fs_shopping_cart_gen.go +++ b/model/gmodel/fs_shopping_cart_gen.go @@ -8,6 +8,7 @@ import ( // fs_shopping_cart 新版购物车表 type FsShoppingCart struct { Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // id + UserId *int64 `gorm:"default:0;" json:"user_id"` // 用户id ProductId *int64 `gorm:"default:0;" json:"product_id"` // 产品id TemplateId *int64 `gorm:"default:0;" json:"template_id"` // 模板id ModelId *int64 `gorm:"default:0;" json:"model_id"` // 模型id diff --git a/server/shopping-cart/internal/logic/addtocartlogic.go b/server/shopping-cart/internal/logic/addtocartlogic.go index e360240d..858ad0d6 100644 --- a/server/shopping-cart/internal/logic/addtocartlogic.go +++ b/server/shopping-cart/internal/logic/addtocartlogic.go @@ -1,8 +1,10 @@ package logic import ( + "errors" "fusenapi/utils/auth" "fusenapi/utils/basic" + "gorm.io/gorm" "context" @@ -31,12 +33,83 @@ func NewAddToCartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AddToCa // } func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserInfo) (resp *basic.Response) { - // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) - // userinfo 传入值时, 一定不为null - + if !userinfo.IsUser() { + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in before add to shopping cart") + } + //校验参数 + if err := l.AddToCartParamVerify(req); err != nil { + return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, err.Error()) + } + //获取产品信息 + productInfo, err := l.svcCtx.AllModels.FsProduct.FindOne(l.ctx, req.ProductId) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the product is not exists") + } + logx.Error("获取产品信息错误:", err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get product info") + } + //获取模板信息 + templateInfo, err := l.svcCtx.AllModels.FsProductTemplateV2.FindOne(l.ctx, req.TemplateId) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the template is not exists") + } + logx.Error("获取模板信息错误:", err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get template info") + } + if *templateInfo.IsDel == 1 { + return resp.SetStatusWithMessage(basic.CodeServiceErr, "the template is deleted") + } + if *templateInfo.Status != 1 { + return resp.SetStatusWithMessage(basic.CodeServiceErr, "the template`s status is unNormal") + } + //获取模型信息 + modelInfo, err := l.svcCtx.AllModels.FsProductModel3d.FindOne(l.ctx, *templateInfo.ModelId) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the template`s model is not exists") + } + logx.Error("获取模型信息错误:", err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get template`s model info") + } + //模型里面的size_id是否跟传入的size_id匹配 + if req.SizeId != *modelInfo.SizeId { + return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "param size_id is not match model`s size_id") + } + //获取尺寸信息 + sizeInfo, err := l.svcCtx.AllModels.FsProductSize.FindOne(l.ctx, req.SizeId) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "the size is not exists") + } + logx.Error("获取尺寸信息错误:", err) + return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "failed to get size info") + } + //状态 + if *sizeInfo.Status != 1 { + return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "size info status is not normal") + } return resp.SetStatus(basic.CodeOK) } +// 参数校验 +func (l *AddToCartLogic) AddToCartParamVerify(req *types.AddToCartReq) error { + if req.ProductId <= 0 { + return errors.New("invalid param:product_id") + } + if req.SizeId <= 0 { + return errors.New("invalid param:size_id") + } + if req.TemplateId <= 0 { + return errors.New("invalid param:template_id") + } + if req.PurchaseQuantity <= 0 { + return errors.New("invalid param:purchase_quantity") + } + return nil +} + // 处理逻辑后 w,r 如:重定向, resp 必须重新处理 // func (l *AddToCartLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { // // httpx.OkJsonCtx(r.Context(), w, resp) From 13d5219e53728b35b2c80b2bb8c46386d4405a9f Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Thu, 14 Sep 2023 14:11:22 +0800 Subject: [PATCH 06/26] fix --- constants/min_purchase_box.go | 6 + model/gmodel/fs_shopping_cart_gen.go | 9 +- model/gmodel/fs_shopping_cart_logic.go | 48 +++++- .../internal/logic/addtocartlogic.go | 143 +++++++++++++----- server/shopping-cart/internal/types/types.go | 25 ++- server_api/shopping-cart.api | 24 ++- utils/shopping_cart/shopping_cart_snapshot.go | 33 ++++ 7 files changed, 228 insertions(+), 60 deletions(-) create mode 100644 constants/min_purchase_box.go create mode 100644 utils/shopping_cart/shopping_cart_snapshot.go diff --git a/constants/min_purchase_box.go b/constants/min_purchase_box.go new file mode 100644 index 00000000..9b26d20c --- /dev/null +++ b/constants/min_purchase_box.go @@ -0,0 +1,6 @@ +package constants + +type Purchase int64 + +// 最低购买箱数 +const MIN_PURCHASE_QUANTITY Purchase = 3 diff --git a/model/gmodel/fs_shopping_cart_gen.go b/model/gmodel/fs_shopping_cart_gen.go index 0cdf795f..2997ec11 100644 --- a/model/gmodel/fs_shopping_cart_gen.go +++ b/model/gmodel/fs_shopping_cart_gen.go @@ -12,22 +12,15 @@ type FsShoppingCart struct { ProductId *int64 `gorm:"default:0;" json:"product_id"` // 产品id TemplateId *int64 `gorm:"default:0;" json:"template_id"` // 模板id ModelId *int64 `gorm:"default:0;" json:"model_id"` // 模型id - PriceId *int64 `gorm:"default:0;" json:"price_id"` // 价格id SizeId *int64 `gorm:"default:0;" json:"size_id"` // 尺寸id - MaterialId *int64 `gorm:"default:0;" json:"material_id"` // 材质id FittingId *int64 `gorm:"default:0;" json:"fitting_id"` // 配件id PurchaseQuantity *int64 `gorm:"default:0;" json:"purchase_quantity"` // 购买数量 - UnitPrice *int64 `gorm:"default:0;" json:"unit_price"` // 当时加入购物车的单价,不作为支付计算,支付计算需要实时价格(厘)换算美元除以1000 - TotalPrice *int64 `gorm:"default:0;" json:"total_price"` // 当时加入购物车单价x数量的总价,不作为支付计算,支付计算需要实时价格 - Logo *string `gorm:"default:'';" json:"logo"` // - CombineImage *string `gorm:"default:'';" json:"combine_image"` // - RenderImage *string `gorm:"default:'';" json:"render_image"` // Snapshot *string `gorm:"default:'';" json:"snapshot"` // IsHighlyCustomized *int64 `gorm:"default:0;" json:"is_highly_customized"` // 是否高度定制 0非 1是(针对客人高度定制只能后台增加如购物车) Status *int64 `gorm:"default:0;" json:"status"` // 0未下单 1已下单 IsEffective *int64 `gorm:"default:1;" json:"is_effective"` // 是否有效 0非 1是(针对对购物车下单,此前数据表更失效) - IsDeleted *int64 `gorm:"default:0;" json:"is_deleted"` // 0正常 1删除 Ctime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ctime"` // + Utime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"utime"` // } type FsShoppingCartModel struct { db *gorm.DB diff --git a/model/gmodel/fs_shopping_cart_logic.go b/model/gmodel/fs_shopping_cart_logic.go index e68225aa..684078ce 100644 --- a/model/gmodel/fs_shopping_cart_logic.go +++ b/model/gmodel/fs_shopping_cart_logic.go @@ -1,2 +1,48 @@ package gmodel -// TODO: 使用model的属性做你想做的 \ No newline at end of file + +import "context" + +// 获取用户购物车数量 +func (s *FsShoppingCartModel) CountUserCart(ctx context.Context, userId int64) (total int64, err error) { + err = s.db.WithContext(ctx).Where("user_id = ?", userId).Limit(1).Count(&total).Error + return total, err +} + +// 获取单个 +func (s *FsShoppingCartModel) FindOne(ctx context.Context, id int64, fields ...string) (resp *FsShoppingCart, err error) { + db := s.db.WithContext(ctx).Where("id = ?", id) + if len(fields) > 0 { + db = db.Select(fields[0]) + } + err = db.Take(&resp).Error + return resp, err +} + +// 获取多个 +func (s *FsShoppingCartModel) GetAllByIds(ctx context.Context, ids []int64, sort string, fields ...string) (resp []FsShoppingCart, err error) { + if len(ids) == 0 { + return + } + db := s.db.WithContext(ctx).Where("id in (?)", ids) + if len(fields) > 0 { + db = db.Select(fields[0]) + } + if sort != "" { + db = db.Order(sort) + } + err = db.Find(&resp).Error + return resp, err +} + +// 获取用户所有的购物车 +func (s *FsShoppingCartModel) GetUserAllCarts(ctx context.Context, userId int64, sort string, fields ...string) (resp []FsShoppingCart, err error) { + db := s.db.WithContext(ctx).Where("user_id = ?", userId) + if len(fields) > 0 { + db = db.Select(fields[0]) + } + if sort != "" { + db = db.Order(sort) + } + err = db.Find(&resp).Error + return resp, err +} diff --git a/server/shopping-cart/internal/logic/addtocartlogic.go b/server/shopping-cart/internal/logic/addtocartlogic.go index 858ad0d6..f6cca17b 100644 --- a/server/shopping-cart/internal/logic/addtocartlogic.go +++ b/server/shopping-cart/internal/logic/addtocartlogic.go @@ -1,12 +1,16 @@ package logic import ( + "context" "errors" + "fmt" + "fusenapi/constants" + "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" + "fusenapi/utils/shopping_cart" "gorm.io/gorm" - - "context" + "math" "fusenapi/server/shopping-cart/internal/svc" "fusenapi/server/shopping-cart/internal/types" @@ -40,8 +44,17 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI if err := l.AddToCartParamVerify(req); err != nil { return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, err.Error()) } - //获取产品信息 - productInfo, err := l.svcCtx.AllModels.FsProduct.FindOne(l.ctx, req.ProductId) + //查询该用户购物车数量 + cartCount, err := l.svcCtx.AllModels.FsShoppingCart.CountUserCart(l.ctx, userinfo.UserId) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get the count of your shopping cart") + } + if cartCount >= 100 { + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "sorry,the count of your carts can`t greater than 100") + } + //获取产品是否存在 + _, err = l.svcCtx.AllModels.FsProduct.FindOne(l.ctx, req.ProductId, "id") if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the product is not exists") @@ -49,23 +62,66 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI logx.Error("获取产品信息错误:", err) return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get product info") } - //获取模板信息 - templateInfo, err := l.svcCtx.AllModels.FsProductTemplateV2.FindOne(l.ctx, req.TemplateId) + var ( + templateJson string //模板表的记录中的json设计信息 + templateTag string //模板表的模板标签 + fittingJson string //配件的json设计信息 + ) + //有模板 + if req.TemplateId > 0 { + templateInfo, err := l.svcCtx.AllModels.FsProductTemplateV2.FindOne(l.ctx, req.TemplateId) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the template is not exists") + } + logx.Error("获取模板信息错误:", err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get template info") + } + if *templateInfo.IsDel == 1 { + return resp.SetStatusWithMessage(basic.CodeServiceErr, "the template is deleted") + } + if *templateInfo.Status != 1 { + return resp.SetStatusWithMessage(basic.CodeServiceErr, "the template`s status is unNormal") + } + if templateInfo.TemplateInfo == nil || *templateInfo.TemplateInfo == "" { + return resp.SetStatusWithMessage(basic.CodeServiceErr, "the template`s design info is empty") + } + templateJson = *templateInfo.TemplateInfo + templateTag = *templateInfo.TemplateTag + } + //有配件 + if req.FittingId > 0 { + fittingInfo, err := l.svcCtx.AllModels.FsProductModel3d.FindOne(l.ctx, req.FittingId) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the fitting is not exists") + } + logx.Error("获取配件信息错误:", err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get fitting info") + } + if *fittingInfo.Status != 1 { + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "the fitting`s status is unNormal") + } + if fittingInfo.ModelInfo == nil || *fittingInfo.ModelInfo == "" { + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "the fitting`s design info is empty") + } + fittingJson = *fittingInfo.ModelInfo + } + //获取尺寸信息 + sizeInfo, err := l.svcCtx.AllModels.FsProductSize.FindOne(l.ctx, req.SizeId) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the template is not exists") + return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the size is not exists") } - logx.Error("获取模板信息错误:", err) - return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get template info") + logx.Error("获取尺寸信息错误:", err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get size info") } - if *templateInfo.IsDel == 1 { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "the template is deleted") - } - if *templateInfo.Status != 1 { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "the template`s status is unNormal") + //状态 + if *sizeInfo.Status != 1 { + return resp.SetStatusWithMessage(basic.CodeServiceErr, "size info status is not normal") } //获取模型信息 - modelInfo, err := l.svcCtx.AllModels.FsProductModel3d.FindOne(l.ctx, *templateInfo.ModelId) + modelInfo, err := l.svcCtx.AllModels.FsProductModel3d.GetOneBySizeIdTag(l.ctx, sizeInfo.Id, constants.TAG_MODEL) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the template`s model is not exists") @@ -73,39 +129,56 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI logx.Error("获取模型信息错误:", err) return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get template`s model info") } - //模型里面的size_id是否跟传入的size_id匹配 - if req.SizeId != *modelInfo.SizeId { - return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "param size_id is not match model`s size_id") + if *modelInfo.Status != 1 { + return resp.SetStatusWithMessage(basic.CodeServiceErr, "the model` status is unNormal") } - //获取尺寸信息 - sizeInfo, err := l.svcCtx.AllModels.FsProductSize.FindOne(l.ctx, req.SizeId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "the size is not exists") - } - logx.Error("获取尺寸信息错误:", err) - return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "failed to get size info") + //如果模型是配件则返回 + if *modelInfo.Tag != 1 { + return resp.SetStatusWithMessage(basic.CodeServiceErr, "the model your post is not a model but fitting") } - //状态 - if *sizeInfo.Status != 1 { - return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "size info status is not normal") + if modelInfo.ModelInfo == nil || *modelInfo.ModelInfo == "" { + return resp.SetStatusWithMessage(basic.CodeServiceErr, "the model`s design info is empty") } + //快照数据 + snapshot := shopping_cart.CartSnapshot{ + Logo: req.Logo, + CombineImage: req.CombineImage, + RenderImage: req.RenderImage, + TemplateInfo: shopping_cart.TemplateInfo{ + TemplateJson: templateJson, + TemplateTag: templateTag, + }, + ModelInfo: shopping_cart.ModelInfo{ + ModelJson: *modelInfo.ModelInfo, + }, + FittingInfo: shopping_cart.FittingInfo{ + FittingJson: fittingJson, + }, + SizeInfo: shopping_cart.SizeInfo{ + Title: *sizeInfo.Title, + }, + UserDiyInformation: shopping_cart.UserDiyInformation{ + Phone: req.DiyInfo.Phone, + Address: req.DiyInfo.Address, + Website: req.DiyInfo.Website, + Qrcode: req.DiyInfo.Qrcode, + Slogan: req.DiyInfo.Slogan, + }, + } + //根据 return resp.SetStatus(basic.CodeOK) } // 参数校验 func (l *AddToCartLogic) AddToCartParamVerify(req *types.AddToCartReq) error { if req.ProductId <= 0 { - return errors.New("invalid param:product_id") + return errors.New("product_id is required") } if req.SizeId <= 0 { - return errors.New("invalid param:size_id") - } - if req.TemplateId <= 0 { - return errors.New("invalid param:template_id") + return errors.New("product size is required") } if req.PurchaseQuantity <= 0 { - return errors.New("invalid param:purchase_quantity") + return errors.New("purchase quantity can not less than 0 or equal 0") } return nil } diff --git a/server/shopping-cart/internal/types/types.go b/server/shopping-cart/internal/types/types.go index 4dbebdbb..5d474939 100644 --- a/server/shopping-cart/internal/types/types.go +++ b/server/shopping-cart/internal/types/types.go @@ -6,14 +6,23 @@ import ( ) type AddToCartReq struct { - ProductId int64 `json:"product_id"` //产品id - TemplateId int64 `json:"template_id"` //模板id - SizeId int64 `json:"size_id"` //尺寸id - FittingId int64 `json:"fitting_id"` //配件id - PurchaseQuantity int64 `json:"purchase_quantity"` //购买数量 - Logo string `json:"logo"` //logo地址 - CombineImage string `json:"combine_image"` //合图地址 - RenderImage string `json:"render_image"` //渲染结果图 + ProductId int64 `json:"product_id"` //产品id + TemplateId int64 `json:"template_id,optional"` //模板id(不可定制的不传) + SizeId int64 `json:"size_id"` //尺寸id + FittingId int64 `json:"fitting_id,optional"` //配件id(没有可以不传) + PurchaseQuantity int64 `json:"purchase_quantity"` //购买数量 + Logo string `json:"logo,optional"` //logo地址(没有可以不传) + CombineImage string `json:"combine_image,optional"` //合图地址 (没有可以不传) + RenderImage string `json:"render_image,optional"` //渲染结果图 (没有可以不传) + DiyInfo DiyInfo `json:"diy_info,optional"` //用户diy数据(可选) +} + +type DiyInfo struct { + Phone string `json:"phone,optional"` //电话(可选) + Address string `json:"address,optional"` //地址 (可选) + Website string `json:"website,optional"` //网站 (可选) + Qrcode string `json:"qrcode,optional"` //二维码 (可选) + Slogan string `json:"slogan,optional"` //slogan (可选) } type DeleteCartReq struct { diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index 9731e835..5d50db8f 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -25,14 +25,22 @@ service shopping-cart { //加入购物车 type AddToCartReq { - ProductId int64 `json:"product_id"` //产品id - TemplateId int64 `json:"template_id"` //模板id - SizeId int64 `json:"size_id"` //尺寸id - FittingId int64 `json:"fitting_id"` //配件id - PurchaseQuantity int64 `json:"purchase_quantity"` //购买数量 - Logo string `json:"logo"` //logo地址 - CombineImage string `json:"combine_image"` //合图地址 - RenderImage string `json:"render_image"` //渲染结果图 + ProductId int64 `json:"product_id"` //产品id + TemplateId int64 `json:"template_id,optional"` //模板id(不可定制的不传) + SizeId int64 `json:"size_id"` //尺寸id + FittingId int64 `json:"fitting_id,optional"` //配件id(没有可以不传) + PurchaseQuantity int64 `json:"purchase_quantity"` //购买数量 + Logo string `json:"logo,optional"` //logo地址(没有可以不传) + CombineImage string `json:"combine_image,optional"` //合图地址 (没有可以不传) + RenderImage string `json:"render_image,optional"` //渲染结果图 (没有可以不传) + DiyInfo DiyInfo `json:"diy_info,optional"` //用户diy数据(可选) +} +type DiyInfo { + Phone string `json:"phone,optional"` //电话(可选) + Address string `json:"address,optional"` //地址 (可选) + Website string `json:"website,optional"` //网站 (可选) + Qrcode string `json:"qrcode,optional"` //二维码 (可选) + Slogan string `json:"slogan,optional"` //slogan (可选) } //删除购物车 type DeleteCartReq { diff --git a/utils/shopping_cart/shopping_cart_snapshot.go b/utils/shopping_cart/shopping_cart_snapshot.go new file mode 100644 index 00000000..66d23aa4 --- /dev/null +++ b/utils/shopping_cart/shopping_cart_snapshot.go @@ -0,0 +1,33 @@ +package shopping_cart + +// 购物车快照数据结构 +type CartSnapshot struct { + Logo string `json:"logo"` //logo地址 + CombineImage string `json:"combine_image"` //刀版图地址 + RenderImage string `json:"render_image"` //渲染结果图 + TemplateInfo TemplateInfo `json:"template_info"` //模板数据 + ModelInfo ModelInfo `json:"model_info"` //模型的数据 + FittingInfo FittingInfo `json:"fitting_info"` //配件信息 + SizeInfo SizeInfo `json:"size_info"` //尺寸基本信息 + UserDiyInformation UserDiyInformation `json:"user_diy_information"` //用户diy数据 +} +type ModelInfo struct { + ModelJson string `json:"model_json"` //模型json数据 +} +type FittingInfo struct { + FittingJson string `json:"fitting_json"` +} +type TemplateInfo struct { + TemplateJson string `json:"template_json"` //模板json数据 + TemplateTag string `json:"template_tag"` //模板标签 +} +type SizeInfo struct { + Title string `json:"title"` +} +type UserDiyInformation struct { + Phone string `json:"phone"` + Address string `json:"address"` + Website string `json:"website"` + Qrcode string `json:"qrcode"` + Slogan string `json:"slogan"` +} From b71141807b7bbbc172d5b23414eab6d54cb12b7f Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Thu, 14 Sep 2023 15:20:37 +0800 Subject: [PATCH 07/26] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=B4=AD=E7=89=A9=E8=BD=A6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/gmodel/fs_shopping_cart_logic.go | 17 ++++++---- .../internal/logic/addtocartlogic.go | 31 ++++++++++++++----- utils/shopping_cart/shopping_cart_snapshot.go | 18 +++++------ 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/model/gmodel/fs_shopping_cart_logic.go b/model/gmodel/fs_shopping_cart_logic.go index 684078ce..c26ede81 100644 --- a/model/gmodel/fs_shopping_cart_logic.go +++ b/model/gmodel/fs_shopping_cart_logic.go @@ -2,12 +2,6 @@ package gmodel import "context" -// 获取用户购物车数量 -func (s *FsShoppingCartModel) CountUserCart(ctx context.Context, userId int64) (total int64, err error) { - err = s.db.WithContext(ctx).Where("user_id = ?", userId).Limit(1).Count(&total).Error - return total, err -} - // 获取单个 func (s *FsShoppingCartModel) FindOne(ctx context.Context, id int64, fields ...string) (resp *FsShoppingCart, err error) { db := s.db.WithContext(ctx).Where("id = ?", id) @@ -18,6 +12,17 @@ func (s *FsShoppingCartModel) FindOne(ctx context.Context, id int64, fields ...s return resp, err } +// 创建 +func (s *FsShoppingCartModel) Create(ctx context.Context, data *FsShoppingCart) error { + return s.db.WithContext(ctx).Create(&data).Error +} + +// 获取用户购物车数量 +func (s *FsShoppingCartModel) CountUserCart(ctx context.Context, userId int64) (total int64, err error) { + err = s.db.WithContext(ctx).Where("user_id = ?", userId).Limit(1).Count(&total).Error + return total, err +} + // 获取多个 func (s *FsShoppingCartModel) GetAllByIds(ctx context.Context, ids []int64, sort string, fields ...string) (resp []FsShoppingCart, err error) { if len(ids) == 0 { diff --git a/server/shopping-cart/internal/logic/addtocartlogic.go b/server/shopping-cart/internal/logic/addtocartlogic.go index f6cca17b..d939aaac 100644 --- a/server/shopping-cart/internal/logic/addtocartlogic.go +++ b/server/shopping-cart/internal/logic/addtocartlogic.go @@ -2,18 +2,17 @@ package logic import ( "context" + "encoding/json" "errors" - "fmt" "fusenapi/constants" "fusenapi/model/gmodel" + "fusenapi/server/shopping-cart/internal/svc" + "fusenapi/server/shopping-cart/internal/types" "fusenapi/utils/auth" "fusenapi/utils/basic" "fusenapi/utils/shopping_cart" "gorm.io/gorm" - "math" - - "fusenapi/server/shopping-cart/internal/svc" - "fusenapi/server/shopping-cart/internal/types" + "time" "github.com/zeromicro/go-zero/core/logx" ) @@ -165,8 +164,26 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI Slogan: req.DiyInfo.Slogan, }, } - //根据 - return resp.SetStatus(basic.CodeOK) + snapshotJsonBytes, _ := json.Marshal(snapshot) + snapshotJsonStr := string(snapshotJsonBytes) + now := time.Now().UTC() + err = l.svcCtx.AllModels.FsShoppingCart.Create(l.ctx, &gmodel.FsShoppingCart{ + UserId: &userinfo.UserId, + ProductId: &req.ProductId, + TemplateId: &req.TemplateId, + ModelId: &modelInfo.Id, + SizeId: &req.SizeId, + FittingId: &req.FittingId, + PurchaseQuantity: &req.PurchaseQuantity, + Snapshot: &snapshotJsonStr, + Ctime: &now, + Utime: &now, + }) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "system err:failed to add to cart ") + } + return resp.SetStatus(basic.CodeOK, "success") } // 参数校验 diff --git a/utils/shopping_cart/shopping_cart_snapshot.go b/utils/shopping_cart/shopping_cart_snapshot.go index 66d23aa4..30705c06 100644 --- a/utils/shopping_cart/shopping_cart_snapshot.go +++ b/utils/shopping_cart/shopping_cart_snapshot.go @@ -12,22 +12,22 @@ type CartSnapshot struct { UserDiyInformation UserDiyInformation `json:"user_diy_information"` //用户diy数据 } type ModelInfo struct { - ModelJson string `json:"model_json"` //模型json数据 + ModelJson string `json:"model_json"` //模型设计json数据 } type FittingInfo struct { - FittingJson string `json:"fitting_json"` + FittingJson string `json:"fitting_json"` //配件设计json数据 } type TemplateInfo struct { - TemplateJson string `json:"template_json"` //模板json数据 + TemplateJson string `json:"template_json"` //模板设计json数据 TemplateTag string `json:"template_tag"` //模板标签 } type SizeInfo struct { - Title string `json:"title"` + Title string `json:"title"` //尺寸信息 } type UserDiyInformation struct { - Phone string `json:"phone"` - Address string `json:"address"` - Website string `json:"website"` - Qrcode string `json:"qrcode"` - Slogan string `json:"slogan"` + Phone string `json:"phone"` //电话 + Address string `json:"address"` //地址 + Website string `json:"website"` //网站 + Qrcode string `json:"qrcode"` //二维码 + Slogan string `json:"slogan"` //slogan } From 0bb11f975d319a885b88d8493a53dd7fc7dc8b54 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Thu, 14 Sep 2023 15:46:37 +0800 Subject: [PATCH 08/26] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=B4=AD=E7=89=A9=E8=BD=A6=E8=B4=AD=E4=B9=B0=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/gmodel/fs_shopping_cart_gen.go | 2 -- model/gmodel/fs_shopping_cart_logic.go | 15 ++++++++ model/gmodel/var_gen.go | 2 ++ .../internal/logic/addtocartlogic.go | 2 +- .../logic/modifycartpurchasequantitylogic.go | 34 ++++++++++++++++--- server/shopping-cart/internal/types/types.go | 4 +-- server_api/shopping-cart.api | 4 +-- 7 files changed, 52 insertions(+), 11 deletions(-) diff --git a/model/gmodel/fs_shopping_cart_gen.go b/model/gmodel/fs_shopping_cart_gen.go index 2997ec11..04996ad2 100644 --- a/model/gmodel/fs_shopping_cart_gen.go +++ b/model/gmodel/fs_shopping_cart_gen.go @@ -17,8 +17,6 @@ type FsShoppingCart struct { PurchaseQuantity *int64 `gorm:"default:0;" json:"purchase_quantity"` // 购买数量 Snapshot *string `gorm:"default:'';" json:"snapshot"` // IsHighlyCustomized *int64 `gorm:"default:0;" json:"is_highly_customized"` // 是否高度定制 0非 1是(针对客人高度定制只能后台增加如购物车) - Status *int64 `gorm:"default:0;" json:"status"` // 0未下单 1已下单 - IsEffective *int64 `gorm:"default:1;" json:"is_effective"` // 是否有效 0非 1是(针对对购物车下单,此前数据表更失效) Ctime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ctime"` // Utime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"utime"` // } diff --git a/model/gmodel/fs_shopping_cart_logic.go b/model/gmodel/fs_shopping_cart_logic.go index c26ede81..d9c3894c 100644 --- a/model/gmodel/fs_shopping_cart_logic.go +++ b/model/gmodel/fs_shopping_cart_logic.go @@ -12,11 +12,26 @@ func (s *FsShoppingCartModel) FindOne(ctx context.Context, id int64, fields ...s return resp, err } +// 获取用户购物车指定item +func (s *FsShoppingCartModel) FineOneUserCart(ctx context.Context, id, userId int64, fields ...string) (resp *FsShoppingCart, err error) { + db := s.db.WithContext(ctx).Where("user_id = ? and id = ?", userId, id) + if len(fields) > 0 { + db = db.Select(fields[0]) + } + err = db.Take(&resp).Error + return resp, err +} + // 创建 func (s *FsShoppingCartModel) Create(ctx context.Context, data *FsShoppingCart) error { return s.db.WithContext(ctx).Create(&data).Error } +// 更新 +func (s *FsShoppingCartModel) Update(ctx context.Context, id, userId int64, data *FsShoppingCart) error { + return s.db.WithContext(ctx).Where("user_id = ? and id = ?", userId, id).Updates(&data).Error +} + // 获取用户购物车数量 func (s *FsShoppingCartModel) CountUserCart(ctx context.Context, userId int64) (total int64, err error) { err = s.db.WithContext(ctx).Where("user_id = ?", userId).Limit(1).Count(&total).Error diff --git a/model/gmodel/var_gen.go b/model/gmodel/var_gen.go index 1d92c033..b22d8ad4 100644 --- a/model/gmodel/var_gen.go +++ b/model/gmodel/var_gen.go @@ -60,6 +60,7 @@ type AllModelsGen struct { FsOrderDetail *FsOrderDetailModel // fs_order_detail 订单详细表 FsOrderDetailTemplate *FsOrderDetailTemplateModel // fs_order_detail_template 订单模板详细表 FsOrderRemark *FsOrderRemarkModel // fs_order_remark 订单备注表 + FsOrdersTrade *FsOrdersTradeModel // fs_orders_trade 订单交易记录表 FsPay *FsPayModel // fs_pay 支付记录 FsPayEvent *FsPayEventModel // fs_pay_event 支付回调事件日志 FsProduct *FsProductModel // fs_product 产品表 @@ -167,6 +168,7 @@ func NewAllModels(gdb *gorm.DB) *AllModelsGen { FsOrderDetail: NewFsOrderDetailModel(gdb), FsOrderDetailTemplate: NewFsOrderDetailTemplateModel(gdb), FsOrderRemark: NewFsOrderRemarkModel(gdb), + FsOrdersTrade: NewFsOrdersTradeModel(gdb), FsPay: NewFsPayModel(gdb), FsPayEvent: NewFsPayEventModel(gdb), FsProduct: NewFsProductModel(gdb), diff --git a/server/shopping-cart/internal/logic/addtocartlogic.go b/server/shopping-cart/internal/logic/addtocartlogic.go index d939aaac..f9ef46f3 100644 --- a/server/shopping-cart/internal/logic/addtocartlogic.go +++ b/server/shopping-cart/internal/logic/addtocartlogic.go @@ -37,7 +37,7 @@ func NewAddToCartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AddToCa func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserInfo) (resp *basic.Response) { if !userinfo.IsUser() { - return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in before add to shopping cart") + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in") } //校验参数 if err := l.AddToCartParamVerify(req); err != nil { diff --git a/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go b/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go index 9da2b886..b78dd2e8 100644 --- a/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go +++ b/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go @@ -1,8 +1,11 @@ package logic import ( + "errors" + "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" + "gorm.io/gorm" "context" @@ -31,10 +34,33 @@ func NewModifyCartPurchaseQuantityLogic(ctx context.Context, svcCtx *svc.Service // } func (l *ModifyCartPurchaseQuantityLogic) ModifyCartPurchaseQuantity(req *types.ModifyCartPurchaseQuantityReq, userinfo *auth.UserInfo) (resp *basic.Response) { - // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) - // userinfo 传入值时, 一定不为null - - return resp.SetStatus(basic.CodeOK) + if !userinfo.IsUser() { + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in") + } + if req.Id <= 0 { + return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "cart id is required") + } + if req.PurchaseQuantity <= 0 { + return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "purchase quantity can not less than 0 or equal to 0") + } + //查询购物车 + _, err := l.svcCtx.AllModels.FsShoppingCart.FineOneUserCart(l.ctx, req.Id, userinfo.UserId, "id") + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the shopping cart is not exists") + } + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "system err:failed to get shopping cart info ") + } + //修改数量 + err = l.svcCtx.AllModels.FsShoppingCart.Update(l.ctx, req.Id, userinfo.UserId, &gmodel.FsShoppingCart{ + PurchaseQuantity: &req.PurchaseQuantity, + }) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "system err:failed to modify cart purchase quantity") + } + return resp.SetStatus(basic.CodeOK, "success") } // 处理逻辑后 w,r 如:重定向, resp 必须重新处理 diff --git a/server/shopping-cart/internal/types/types.go b/server/shopping-cart/internal/types/types.go index 5d474939..aa61eb09 100644 --- a/server/shopping-cart/internal/types/types.go +++ b/server/shopping-cart/internal/types/types.go @@ -30,8 +30,8 @@ type DeleteCartReq struct { } type ModifyCartPurchaseQuantityReq struct { - Id int64 `json:"id"` //购物车id - Quantity int64 `json:"quantity"` //数量 + Id int64 `json:"id"` //购物车id + PurchaseQuantity int64 `json:"purchase_quantity"` //数量 } type GetCartsReq struct { diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index 5d50db8f..3824f27f 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -48,8 +48,8 @@ type DeleteCartReq { } //修改购物车购买数量 type ModifyCartPurchaseQuantityReq { - Id int64 `json:"id"` //购物车id - Quantity int64 `json:"quantity"` //数量 + Id int64 `json:"id"` //购物车id + PurchaseQuantity int64 `json:"purchase_quantity"` //数量 } //获取购物车列表 type GetCartsReq { From 9c178b2add662c1c9110ee2ca47d0853f1780e06 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Thu, 14 Sep 2023 18:33:29 +0800 Subject: [PATCH 09/26] fix --- model/gmodel/fs_shopping_cart_logic.go | 40 +++- .../internal/logic/addtocartlogic.go | 13 +- .../internal/logic/getcartslogic.go | 182 +++++++++++++++++- server/shopping-cart/internal/types/types.go | 10 +- server_api/basic.api | 8 +- server_api/shopping-cart.api | 2 +- utils/shopping_cart/shopping_cart_snapshot.go | 8 +- 7 files changed, 236 insertions(+), 27 deletions(-) diff --git a/model/gmodel/fs_shopping_cart_logic.go b/model/gmodel/fs_shopping_cart_logic.go index d9c3894c..1f508ac9 100644 --- a/model/gmodel/fs_shopping_cart_logic.go +++ b/model/gmodel/fs_shopping_cart_logic.go @@ -55,14 +55,34 @@ func (s *FsShoppingCartModel) GetAllByIds(ctx context.Context, ids []int64, sort } // 获取用户所有的购物车 -func (s *FsShoppingCartModel) GetUserAllCarts(ctx context.Context, userId int64, sort string, fields ...string) (resp []FsShoppingCart, err error) { - db := s.db.WithContext(ctx).Where("user_id = ?", userId) - if len(fields) > 0 { - db = db.Select(fields[0]) - } - if sort != "" { - db = db.Order(sort) - } - err = db.Find(&resp).Error - return resp, err +type GetAllCartsByParamReq struct { + Ids []int64 //id集合 + UserId int64 //用户id + Fields string //筛选的字段 + Sort string //排序 + Page int //当前页 + Limit int //每页数量 +} + +func (s *FsShoppingCartModel) GetAllCartsByParam(ctx context.Context, req GetAllCartsByParamReq) (resp []FsShoppingCart, total int64, err error) { + db := s.db.WithContext(ctx) + if req.UserId > 0 { + db = db.Where("user_id = ?", req.UserId) + } + if len(req.Ids) > 0 { + db = db.Where("id in (?)", req.Ids) + } + if req.Fields != "" { + db = db.Select(req.Fields) + } + if req.Sort != "" { + db = db.Order(req.Sort) + } + //查询数量 + if err = db.Limit(1).Count(&total).Error; err != nil { + return nil, 0, err + } + offset := (req.Page - 1) * req.Limit + err = db.Offset(offset).Limit(req.Limit).Find(&resp).Error + return resp, total, err } diff --git a/server/shopping-cart/internal/logic/addtocartlogic.go b/server/shopping-cart/internal/logic/addtocartlogic.go index f9ef46f3..6194aea9 100644 --- a/server/shopping-cart/internal/logic/addtocartlogic.go +++ b/server/shopping-cart/internal/logic/addtocartlogic.go @@ -53,7 +53,7 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "sorry,the count of your carts can`t greater than 100") } //获取产品是否存在 - _, err = l.svcCtx.AllModels.FsProduct.FindOne(l.ctx, req.ProductId, "id") + productInfo, err := l.svcCtx.AllModels.FsProduct.FindOne(l.ctx, req.ProductId) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the product is not exists") @@ -138,6 +138,11 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI if modelInfo.ModelInfo == nil || *modelInfo.ModelInfo == "" { return resp.SetStatusWithMessage(basic.CodeServiceErr, "the model`s design info is empty") } + var sizeTitleInfo shopping_cart.SizeInfo + if err = json.Unmarshal([]byte(*sizeInfo.Title), &sizeTitleInfo); err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeJsonErr, "failed to parse size info`s title ") + } //快照数据 snapshot := shopping_cart.CartSnapshot{ Logo: req.Logo, @@ -153,8 +158,10 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI FittingInfo: shopping_cart.FittingInfo{ FittingJson: fittingJson, }, - SizeInfo: shopping_cart.SizeInfo{ - Title: *sizeInfo.Title, + SizeInfo: sizeTitleInfo, + ProductInfo: shopping_cart.ProductInfo{ + ProductName: *productInfo.Title, + ProductSn: *productInfo.Sn, }, UserDiyInformation: shopping_cart.UserDiyInformation{ Phone: req.DiyInfo.Phone, diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index 097f91b7..a289d151 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -1,8 +1,15 @@ package logic import ( + "encoding/json" + "fusenapi/constants" + "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" + "fusenapi/utils/hash" + "fusenapi/utils/shopping_cart" + "math" + "strings" "context" @@ -31,12 +38,181 @@ func NewGetCartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCarts // } func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo) (resp *basic.Response) { - // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) - // userinfo 传入值时, 一定不为null - + if req.CurrentPage <= 0 { + req.CurrentPage = constants.DEFAULT_PAGE + } + limit := 10 + //获取用户购物车列表 + carts, total, err := l.svcCtx.AllModels.FsShoppingCart.GetAllCartsByParam(l.ctx, gmodel.GetAllCartsByParamReq{ + UserId: userinfo.UserId, + Fields: "", + Sort: "id DESC", + Page: req.CurrentPage, + Limit: limit, + }) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "system err:failed to get your shopping carts") + } + if len(carts) == 0 { + return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetCartsRsp{ + Meta: types.Meta{ + TotalCount: total, + PageCount: int64(math.Ceil(float64(total) / float64(limit))), + CurrentPage: req.CurrentPage, + PerPage: limit, + }, + CartList: nil, + }) + } + lenCarts := len(carts) + templateIds := make([]int64, 0, lenCarts) + modelIds := make([]int64, 0, lenCarts) //模型 + 配件 + sizeIds := make([]int64, 0, lenCarts) + for index := range carts { + templateIds = append(templateIds, *carts[index].TemplateId) + modelIds = append(modelIds, *carts[index].ModelId, *carts[index].FittingId) + sizeIds = append(sizeIds, *carts[index].SizeId) + } + //获取尺寸列表 + sizeList, err := l.svcCtx.AllModels.FsProductSize.GetAllByIds(l.ctx, sizeIds, "") + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get size list") + } + mapSize := make(map[int64]gmodel.FsProductSize) + for _, v := range sizeList { + mapSize[v.Id] = v + } + //获取模型和配件信息 + modelList, err := l.svcCtx.AllModels.FsProductModel3d.GetAllByIds(l.ctx, modelIds, "") + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get model list") + } + mapModel := make(map[int64]gmodel.FsProductModel3d) + for _, v := range modelList { + mapModel[v.Id] = v + } + //获取模板列表 + templateList, err := l.svcCtx.AllModels.FsProductTemplateV2.FindAllByIds(l.ctx, templateIds) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get template list") + } + mapTemplate := make(map[int64]gmodel.FsProductTemplateV2) + for _, v := range templateList { + mapTemplate[v.Id] = v + } + //定义map收集变更信息 + mapCartChange := make(map[int64]string) + //校验购物车数据是否变更 + err = VerifyShoppingCartSnapshotDataChange(VerifyShoppingCartSnapshotDataChangeReq{ + Carts: carts, + MapSize: mapSize, + MapModel: mapModel, + MapTemplate: mapTemplate, + MapCartChange: mapCartChange, + }) + if err != nil { + logx.Error("VerifyShoppingCartSnapshotDataChange err:", err.Error()) + return resp.SetStatusWithMessage(basic.CodeServiceErr, "system err:failed to check shopping cart change data") + } + //for index return resp.SetStatus(basic.CodeOK) } +// 校验购物车快照数据跟目前是否一致 +type VerifyShoppingCartSnapshotDataChangeReq struct { + Carts []gmodel.FsShoppingCart + MapSize map[int64]gmodel.FsProductSize + MapModel map[int64]gmodel.FsProductModel3d //模型跟配件都在 + MapTemplate map[int64]gmodel.FsProductTemplateV2 + MapCartChange map[int64]string +} +type VerifyShoppingCartSnapshotDataChangeRsp struct { + CartId int64 //有改变的列表下标 + Descrption string //变更描述信息 +} + +func VerifyShoppingCartSnapshotDataChange(req VerifyShoppingCartSnapshotDataChangeReq) error { + for _, cartInfo := range req.Carts { + var snapShotParseInfo shopping_cart.CartSnapshot + if err := json.Unmarshal([]byte(*cartInfo.Snapshot), &snapShotParseInfo); err != nil { + return err + } + //快照中模板设计json数据哈希值 + snapshotTemplateJsonHash := hash.JsonHashKey(snapShotParseInfo.TemplateInfo.TemplateJson) + //快照中模型设计json数据哈希值 + snapshotModelJsonHash := hash.JsonHashKey(snapShotParseInfo.ModelInfo.ModelJson) + //快照中配件设计json数据哈希值 + snapshotFittingJsonHash := hash.JsonHashKey(snapShotParseInfo.FittingInfo.FittingJson) + descrptionBuilder := strings.Builder{} + //有模板验证模板相关 + if *cartInfo.TemplateId > 0 { + if curTemplateInfo, ok := req.MapTemplate[*cartInfo.TemplateId]; !ok { + descrptionBuilder.WriteString("

the template is lose

") + } else { + //当前模板设计json数据哈希值 + curTemplateJsonHash := hash.JsonHashKey(*curTemplateInfo.TemplateInfo) + //模板设计信息改变了 + if snapshotTemplateJsonHash != curTemplateJsonHash { + descrptionBuilder.WriteString("

the template design info has changed

") + } + //模板标签改变了 + if snapShotParseInfo.TemplateInfo.TemplateTag != *curTemplateInfo.TemplateTag { + descrptionBuilder.WriteString("

the template`s template tag has changed

") + } + } + } + //有模型验证模型相关 + if *cartInfo.ModelId > 0 { + if curModelInfo, ok := req.MapModel[*cartInfo.ModelId]; !ok { //不存在 + descrptionBuilder.WriteString("

the model is lose

") + } else { + //当前模型设计json数据哈希值 + curModelJsonHash := hash.JsonHashKey(*curModelInfo.ModelInfo) + if snapshotModelJsonHash != curModelJsonHash { + descrptionBuilder.WriteString("

the model design info has changed

") + } + } + } + //有配件验证配件相关 + if *cartInfo.FittingId > 0 { + if curFittingInfo, ok := req.MapModel[*cartInfo.FittingId]; !ok { //不存在 + descrptionBuilder.WriteString("

the fitting is lose

") + } else { + //当前配件设计json数据哈希值 + curFittingJsonHash := hash.JsonHashKey(*curFittingInfo.ModelInfo) + if snapshotFittingJsonHash != curFittingJsonHash { + descrptionBuilder.WriteString("

the fitting design info has changed

") + } + } + } + //验证尺寸相关 + if *cartInfo.SizeId > 0 { + curSize, ok := req.MapSize[*cartInfo.SizeId] + if !ok { + descrptionBuilder.WriteString("

the size is lose

") + } else { + var curSizeTitle shopping_cart.SizeInfo + if err := json.Unmarshal([]byte(*curSize.Title), &curSizeTitle); err != nil { + return err + } + if snapShotParseInfo.SizeInfo.Inch != curSizeTitle.Inch || snapShotParseInfo.SizeInfo.Cm != curSizeTitle.Cm { + descrptionBuilder.WriteString("

the size design info has changed

") + } + } + } + //收集错误 + descrption := descrptionBuilder.String() + if descrption != "" { + req.MapCartChange[cartInfo.Id] = descrption + } + } + return nil +} + // 处理逻辑后 w,r 如:重定向, resp 必须重新处理 // func (l *GetCartsLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { // // httpx.OkJsonCtx(r.Context(), w, resp) diff --git a/server/shopping-cart/internal/types/types.go b/server/shopping-cart/internal/types/types.go index aa61eb09..fc3f605c 100644 --- a/server/shopping-cart/internal/types/types.go +++ b/server/shopping-cart/internal/types/types.go @@ -35,7 +35,7 @@ type ModifyCartPurchaseQuantityReq struct { } type GetCartsReq struct { - Page int `form:"page"` //当前页 + CurrentPage int `form:"current_page"` //当前页 } type GetCartsRsp struct { @@ -99,10 +99,10 @@ type File struct { } type Meta struct { - TotalCount int64 `json:"totalCount"` - PageCount int64 `json:"pageCount"` - CurrentPage int `json:"currentPage"` - PerPage int `json:"perPage"` + TotalCount int64 `json:"total_count"` + PageCount int64 `json:"page_count"` + CurrentPage int `json:"current_page"` + PerPage int `json:"per_page"` } // Set 设置Response的Code和Message值 diff --git a/server_api/basic.api b/server_api/basic.api index 7125abc4..be14515d 100644 --- a/server_api/basic.api +++ b/server_api/basic.api @@ -36,8 +36,8 @@ type File { // 统一分页 type Meta struct { - TotalCount int64 `json:"totalCount"` - PageCount int64 `json:"pageCount"` - CurrentPage int `json:"currentPage"` - PerPage int `json:"perPage"` + TotalCount int64 `json:"total_count"` + PageCount int64 `json:"page_count"` + CurrentPage int `json:"current_page"` + PerPage int `json:"per_page"` } \ No newline at end of file diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index 3824f27f..3f1f19c5 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -53,7 +53,7 @@ type ModifyCartPurchaseQuantityReq { } //获取购物车列表 type GetCartsReq { - Page int `form:"page"` //当前页 + CurrentPage int `form:"current_page"` //当前页 } type GetCartsRsp { Meta Meta `json:"meta"` //分页信息 diff --git a/utils/shopping_cart/shopping_cart_snapshot.go b/utils/shopping_cart/shopping_cart_snapshot.go index 30705c06..b0ab5797 100644 --- a/utils/shopping_cart/shopping_cart_snapshot.go +++ b/utils/shopping_cart/shopping_cart_snapshot.go @@ -9,8 +9,13 @@ type CartSnapshot struct { ModelInfo ModelInfo `json:"model_info"` //模型的数据 FittingInfo FittingInfo `json:"fitting_info"` //配件信息 SizeInfo SizeInfo `json:"size_info"` //尺寸基本信息 + ProductInfo ProductInfo `json:"product_info"` //产品基本信息(只记录不要使用) UserDiyInformation UserDiyInformation `json:"user_diy_information"` //用户diy数据 } +type ProductInfo struct { + ProductName string `json:"product_name"` + ProductSn string `json:"product_sn"` +} type ModelInfo struct { ModelJson string `json:"model_json"` //模型设计json数据 } @@ -22,7 +27,8 @@ type TemplateInfo struct { TemplateTag string `json:"template_tag"` //模板标签 } type SizeInfo struct { - Title string `json:"title"` //尺寸信息 + Inch string `json:"inch"` + Cm string `json:"cm"` } type UserDiyInformation struct { Phone string `json:"phone"` //电话 From 440dd1cefca6960ffd0beb0817642fa350843f57 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Thu, 14 Sep 2023 18:40:37 +0800 Subject: [PATCH 10/26] fix --- server/shopping-cart/internal/logic/getcartslogic.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index a289d151..f28304c1 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -118,7 +118,10 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo logx.Error("VerifyShoppingCartSnapshotDataChange err:", err.Error()) return resp.SetStatusWithMessage(basic.CodeServiceErr, "system err:failed to check shopping cart change data") } - //for index + /*list := make([]types.CartItem, 0, lenCarts) + for index := range carts { + + }*/ return resp.SetStatus(basic.CodeOK) } From 6606173050420d1ec0f97f2608571dfc20536f22 Mon Sep 17 00:00:00 2001 From: momo <1012651275@qq.com> Date: Thu, 14 Sep 2023 18:43:10 +0800 Subject: [PATCH 11/26] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9Eapi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fs_cloud_deliver_every_tmp_old_gen.go | 23 + .../fs_cloud_deliver_every_tmp_old_logic.go | 2 + model/gmodel/fs_cloud_deliver_tmp_old_gen.go | 28 + .../gmodel/fs_cloud_deliver_tmp_old_logic.go | 2 + model/gmodel/fs_cloud_old_gen.go | 20 + model/gmodel/fs_cloud_old_logic.go | 2 + .../gmodel/fs_cloud_pick_up_detail_old_gen.go | 23 + .../fs_cloud_pick_up_detail_old_logic.go | 2 + model/gmodel/fs_cloud_pick_up_old_gen.go | 28 + model/gmodel/fs_cloud_pick_up_old_logic.go | 2 + .../gmodel/fs_cloud_receive_every_old_gen.go | 22 + .../fs_cloud_receive_every_old_logic.go | 2 + model/gmodel/fs_cloud_receive_old_gen.go | 26 + model/gmodel/fs_cloud_receive_old_logic.go | 2 + model/gmodel/fs_cloud_render_log_old_gen.go | 26 + model/gmodel/fs_cloud_render_log_old_logic.go | 2 + .../fs_cloud_user_apply_back_old_gen.go | 25 + .../fs_cloud_user_apply_back_old_logic.go | 2 + model/gmodel/fs_order_affiliate_old_gen.go | 27 + model/gmodel/fs_order_affiliate_old_logic.go | 2 + model/gmodel/fs_order_detail_old_gen.go | 41 ++ model/gmodel/fs_order_detail_old_logic.go | 2 + .../fs_order_detail_template_old_gen.go | 28 + .../fs_order_detail_template_old_logic.go | 2 + model/gmodel/fs_order_gen.go | 47 +- model/gmodel/fs_order_old_gen.go | 54 ++ model/gmodel/fs_order_old_logic.go | 2 + model/gmodel/fs_order_remark_old_gen.go | 22 + model/gmodel/fs_order_remark_old_logic.go | 2 + model/gmodel/fs_order_trade_event_gen.go | 25 + model/gmodel/fs_order_trade_event_logic.go | 2 + model/gmodel/fs_order_trade_gen.go | 36 ++ model/gmodel/fs_order_trade_logic.go | 2 + model/gmodel/fs_shopping_cart_gen.go | 2 - model/gmodel/var_gen.go | 62 +- .../internal/logic/usercontactservicelogic.go | 61 +- .../internal/logic/useroderdeletelogic.go | 184 +++--- .../internal/logic/userordercancellogic.go | 170 +++--- .../internal/logic/userorderdeletelogic.go | 58 +- .../internal/logic/userorderlistlogic.go | 474 +++++++-------- .../internal/logic/orderpaymentintentlogic.go | 250 ++++---- .../pay/internal/logic/stripewebhooklogic.go | 566 +++++++++--------- .../logic/getlastproductdesignlogic.go | 113 ++-- .../internal/logic/getpricebypidlogic.go | 3 +- .../internal/logic/getproductinfologic.go | 117 ++-- .../logic/getrendersettingbypidlogic.go | 50 +- server_api/basic.api | 183 +++++- server_api/orders.api | 217 +++++++ 48 files changed, 1929 insertions(+), 1114 deletions(-) create mode 100644 model/gmodel/fs_cloud_deliver_every_tmp_old_gen.go create mode 100644 model/gmodel/fs_cloud_deliver_every_tmp_old_logic.go create mode 100644 model/gmodel/fs_cloud_deliver_tmp_old_gen.go create mode 100644 model/gmodel/fs_cloud_deliver_tmp_old_logic.go create mode 100644 model/gmodel/fs_cloud_old_gen.go create mode 100644 model/gmodel/fs_cloud_old_logic.go create mode 100644 model/gmodel/fs_cloud_pick_up_detail_old_gen.go create mode 100644 model/gmodel/fs_cloud_pick_up_detail_old_logic.go create mode 100644 model/gmodel/fs_cloud_pick_up_old_gen.go create mode 100644 model/gmodel/fs_cloud_pick_up_old_logic.go create mode 100644 model/gmodel/fs_cloud_receive_every_old_gen.go create mode 100644 model/gmodel/fs_cloud_receive_every_old_logic.go create mode 100644 model/gmodel/fs_cloud_receive_old_gen.go create mode 100644 model/gmodel/fs_cloud_receive_old_logic.go create mode 100644 model/gmodel/fs_cloud_render_log_old_gen.go create mode 100644 model/gmodel/fs_cloud_render_log_old_logic.go create mode 100644 model/gmodel/fs_cloud_user_apply_back_old_gen.go create mode 100644 model/gmodel/fs_cloud_user_apply_back_old_logic.go create mode 100644 model/gmodel/fs_order_affiliate_old_gen.go create mode 100644 model/gmodel/fs_order_affiliate_old_logic.go create mode 100644 model/gmodel/fs_order_detail_old_gen.go create mode 100644 model/gmodel/fs_order_detail_old_logic.go create mode 100644 model/gmodel/fs_order_detail_template_old_gen.go create mode 100644 model/gmodel/fs_order_detail_template_old_logic.go create mode 100644 model/gmodel/fs_order_old_gen.go create mode 100644 model/gmodel/fs_order_old_logic.go create mode 100644 model/gmodel/fs_order_remark_old_gen.go create mode 100644 model/gmodel/fs_order_remark_old_logic.go create mode 100644 model/gmodel/fs_order_trade_event_gen.go create mode 100644 model/gmodel/fs_order_trade_event_logic.go create mode 100644 model/gmodel/fs_order_trade_gen.go create mode 100644 model/gmodel/fs_order_trade_logic.go create mode 100644 server_api/orders.api diff --git a/model/gmodel/fs_cloud_deliver_every_tmp_old_gen.go b/model/gmodel/fs_cloud_deliver_every_tmp_old_gen.go new file mode 100644 index 00000000..3fd8ba80 --- /dev/null +++ b/model/gmodel/fs_cloud_deliver_every_tmp_old_gen.go @@ -0,0 +1,23 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_cloud_deliver_every_tmp_old +type FsCloudDeliverEveryTmpOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // + AdminId *int64 `gorm:"default:0;" json:"admin_id"` // 管理员 + CloudId *int64 `gorm:"default:0;" json:"cloud_id"` // 云仓ID 暂且只有一个默认为 1 + OrderDetailTemplateSn *string `gorm:"default:'';" json:"order_detail_template_sn"` // + Num *int64 `gorm:"default:0;" json:"num"` // 发货数量 + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 +} +type FsCloudDeliverEveryTmpOldModel struct { + db *gorm.DB + name string +} + +func NewFsCloudDeliverEveryTmpOldModel(db *gorm.DB) *FsCloudDeliverEveryTmpOldModel { + return &FsCloudDeliverEveryTmpOldModel{db: db, name: "fs_cloud_deliver_every_tmp_old"} +} diff --git a/model/gmodel/fs_cloud_deliver_every_tmp_old_logic.go b/model/gmodel/fs_cloud_deliver_every_tmp_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_cloud_deliver_every_tmp_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_cloud_deliver_tmp_old_gen.go b/model/gmodel/fs_cloud_deliver_tmp_old_gen.go new file mode 100644 index 00000000..a7711947 --- /dev/null +++ b/model/gmodel/fs_cloud_deliver_tmp_old_gen.go @@ -0,0 +1,28 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_cloud_deliver_tmp_old +type FsCloudDeliverTmpOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // id + CloudId *int64 `gorm:"default:0;" json:"cloud_id"` // 云仓id + UserId *int64 `gorm:"default:0;" json:"user_id"` // 用户id + AdminId *int64 `gorm:"default:0;" json:"admin_id"` // 操作员id + DeliveryType *int64 `gorm:"default:1;" json:"delivery_type"` // 发货公司 之后配置,默认1 + Fee *int64 `gorm:"default:0;" json:"fee"` // 价格 + AddressId *int64 `gorm:"default:0;" json:"address_id"` // 地址 + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 创建时间 + IsDeliver *int64 `gorm:"default:0;" json:"is_deliver"` // 0未发货,1已发货 + IsEnd *int64 `gorm:"default:0;" json:"is_end"` // 0未完成,1已完成 + DeliverId *int64 `gorm:"default:0;" json:"deliver_id"` // 发货总表id +} +type FsCloudDeliverTmpOldModel struct { + db *gorm.DB + name string +} + +func NewFsCloudDeliverTmpOldModel(db *gorm.DB) *FsCloudDeliverTmpOldModel { + return &FsCloudDeliverTmpOldModel{db: db, name: "fs_cloud_deliver_tmp_old"} +} diff --git a/model/gmodel/fs_cloud_deliver_tmp_old_logic.go b/model/gmodel/fs_cloud_deliver_tmp_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_cloud_deliver_tmp_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_cloud_old_gen.go b/model/gmodel/fs_cloud_old_gen.go new file mode 100644 index 00000000..8048d159 --- /dev/null +++ b/model/gmodel/fs_cloud_old_gen.go @@ -0,0 +1,20 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_cloud_old 云仓表 +type FsCloudOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // id + Address *string `gorm:"default:'';" json:"address"` // 云仓地址 + Title *string `gorm:"default:'';" json:"title"` // 云仓名称 +} +type FsCloudOldModel struct { + db *gorm.DB + name string +} + +func NewFsCloudOldModel(db *gorm.DB) *FsCloudOldModel { + return &FsCloudOldModel{db: db, name: "fs_cloud_old"} +} diff --git a/model/gmodel/fs_cloud_old_logic.go b/model/gmodel/fs_cloud_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_cloud_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_cloud_pick_up_detail_old_gen.go b/model/gmodel/fs_cloud_pick_up_detail_old_gen.go new file mode 100644 index 00000000..c891ce19 --- /dev/null +++ b/model/gmodel/fs_cloud_pick_up_detail_old_gen.go @@ -0,0 +1,23 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_cloud_pick_up_detail_old 云仓提货单-详情 +type FsCloudPickUpDetailOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // Id + PickId *int64 `gorm:"index;default:0;" json:"pick_id"` // 提货单id + StockId *int64 `gorm:"default:0;" json:"stock_id"` // 用户云仓记录id + Num *int64 `gorm:"default:0;" json:"num"` // 提取数量 + Boxes *int64 `gorm:"default:0;" json:"boxes"` // 提取箱数 + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 +} +type FsCloudPickUpDetailOldModel struct { + db *gorm.DB + name string +} + +func NewFsCloudPickUpDetailOldModel(db *gorm.DB) *FsCloudPickUpDetailOldModel { + return &FsCloudPickUpDetailOldModel{db: db, name: "fs_cloud_pick_up_detail_old"} +} diff --git a/model/gmodel/fs_cloud_pick_up_detail_old_logic.go b/model/gmodel/fs_cloud_pick_up_detail_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_cloud_pick_up_detail_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_cloud_pick_up_old_gen.go b/model/gmodel/fs_cloud_pick_up_old_gen.go new file mode 100644 index 00000000..68f2b758 --- /dev/null +++ b/model/gmodel/fs_cloud_pick_up_old_gen.go @@ -0,0 +1,28 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_cloud_pick_up_old 云仓提货单 +type FsCloudPickUpOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // Id + UserId *int64 `gorm:"index;default:0;" json:"user_id"` // 用户id + TrackNum *string `gorm:"default:'';" json:"track_num"` // 运输号 + AddressId *int64 `gorm:"default:0;" json:"address_id"` // 地址id + AddressInfo *string `gorm:"default:'';" json:"address_info"` // 地址信息 json + Status *int64 `gorm:"default:0;" json:"status"` // 运输状态 1 draw 2shipping 3ups 4arrival + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 + ShippingTime *int64 `gorm:"default:0;" json:"shipping_time"` // 发货时间 + UpsTime *int64 `gorm:"default:0;" json:"ups_time"` // 提货时间 + ArrivalTime *int64 `gorm:"default:0;" json:"arrival_time"` // 到达时间 + UpsSn *string `gorm:"default:'';" json:"ups_sn"` // 运输单号 +} +type FsCloudPickUpOldModel struct { + db *gorm.DB + name string +} + +func NewFsCloudPickUpOldModel(db *gorm.DB) *FsCloudPickUpOldModel { + return &FsCloudPickUpOldModel{db: db, name: "fs_cloud_pick_up_old"} +} diff --git a/model/gmodel/fs_cloud_pick_up_old_logic.go b/model/gmodel/fs_cloud_pick_up_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_cloud_pick_up_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_cloud_receive_every_old_gen.go b/model/gmodel/fs_cloud_receive_every_old_gen.go new file mode 100644 index 00000000..436f9037 --- /dev/null +++ b/model/gmodel/fs_cloud_receive_every_old_gen.go @@ -0,0 +1,22 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_cloud_receive_every_old +type FsCloudReceiveEveryOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // + DeliveryId *int64 `gorm:"index;default:0;" json:"delivery_id"` // 云仓收货单id + OrderDetailTemplateSn *string `gorm:"index;default:'';" json:"order_detail_template_sn"` // + Num *int64 `gorm:"default:0;" json:"num"` // 收到的数量 + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 +} +type FsCloudReceiveEveryOldModel struct { + db *gorm.DB + name string +} + +func NewFsCloudReceiveEveryOldModel(db *gorm.DB) *FsCloudReceiveEveryOldModel { + return &FsCloudReceiveEveryOldModel{db: db, name: "fs_cloud_receive_every_old"} +} diff --git a/model/gmodel/fs_cloud_receive_every_old_logic.go b/model/gmodel/fs_cloud_receive_every_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_cloud_receive_every_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_cloud_receive_old_gen.go b/model/gmodel/fs_cloud_receive_old_gen.go new file mode 100644 index 00000000..224d29f6 --- /dev/null +++ b/model/gmodel/fs_cloud_receive_old_gen.go @@ -0,0 +1,26 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_cloud_receive_old 云仓接收工厂总单 +type FsCloudReceiveOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // + CloudId *int64 `gorm:"index;default:0;" json:"cloud_id"` // 入库云仓id + AdminId *int64 `gorm:"index;default:0;" json:"admin_id"` // 操作员id + UserId *int64 `gorm:"index;default:0;" json:"user_id"` // 用户id + OrderId *int64 `gorm:"index;default:0;" json:"order_id"` // 入库云仓的订单 + Fee *int64 `gorm:"default:0;" json:"fee"` // 运费 + Delivery *string `gorm:"default:'';" json:"delivery"` // + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 创建时间 + Status *int64 `gorm:"default:0;" json:"status"` // 0未收到 1收到 +} +type FsCloudReceiveOldModel struct { + db *gorm.DB + name string +} + +func NewFsCloudReceiveOldModel(db *gorm.DB) *FsCloudReceiveOldModel { + return &FsCloudReceiveOldModel{db: db, name: "fs_cloud_receive_old"} +} diff --git a/model/gmodel/fs_cloud_receive_old_logic.go b/model/gmodel/fs_cloud_receive_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_cloud_receive_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_cloud_render_log_old_gen.go b/model/gmodel/fs_cloud_render_log_old_gen.go new file mode 100644 index 00000000..3abb9c33 --- /dev/null +++ b/model/gmodel/fs_cloud_render_log_old_gen.go @@ -0,0 +1,26 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_cloud_render_log_old 云渲染日志表 +type FsCloudRenderLogOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // ID + UserId *int64 `gorm:"default:0;" json:"user_id"` // 用户id + PostData *string `gorm:"default:'';" json:"post_data"` // + PostUrl *string `gorm:"default:'';" json:"post_url"` // + Title *string `gorm:"index;default:'';" json:"title"` // + Time *int64 `gorm:"default:0;" json:"time"` // 所用时间 + Result *string `gorm:"default:'';" json:"result"` // + Tag *string `gorm:"index;default:'';" json:"tag"` // 标识 + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 +} +type FsCloudRenderLogOldModel struct { + db *gorm.DB + name string +} + +func NewFsCloudRenderLogOldModel(db *gorm.DB) *FsCloudRenderLogOldModel { + return &FsCloudRenderLogOldModel{db: db, name: "fs_cloud_render_log_old"} +} diff --git a/model/gmodel/fs_cloud_render_log_old_logic.go b/model/gmodel/fs_cloud_render_log_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_cloud_render_log_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_cloud_user_apply_back_old_gen.go b/model/gmodel/fs_cloud_user_apply_back_old_gen.go new file mode 100644 index 00000000..9c7f2dd7 --- /dev/null +++ b/model/gmodel/fs_cloud_user_apply_back_old_gen.go @@ -0,0 +1,25 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_cloud_user_apply_back_old 该表废弃 +type FsCloudUserApplyBackOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // + UserHash *string `gorm:"default:'';" json:"user_hash"` // + OrderDetailTemplateId *int64 `gorm:"default:0;" json:"order_detail_template_id"` // 详情modelID + Num *int64 `gorm:"default:0;" json:"num"` // 发货数量 + AddressTo *string `gorm:"default:'';" json:"address_to"` // 收获地址 + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 + StorageFee *int64 `gorm:"default:0;" json:"storage_fee"` // 存储费用 + Status *int64 `gorm:"default:0;" json:"status"` // 状态位 是否已发货 是否处理 是否删除 是否推送 +} +type FsCloudUserApplyBackOldModel struct { + db *gorm.DB + name string +} + +func NewFsCloudUserApplyBackOldModel(db *gorm.DB) *FsCloudUserApplyBackOldModel { + return &FsCloudUserApplyBackOldModel{db: db, name: "fs_cloud_user_apply_back_old"} +} diff --git a/model/gmodel/fs_cloud_user_apply_back_old_logic.go b/model/gmodel/fs_cloud_user_apply_back_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_cloud_user_apply_back_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_order_affiliate_old_gen.go b/model/gmodel/fs_order_affiliate_old_gen.go new file mode 100644 index 00000000..4149fe3f --- /dev/null +++ b/model/gmodel/fs_order_affiliate_old_gen.go @@ -0,0 +1,27 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_order_affiliate_old 订单附属表-流程控制时间等 +type FsOrderAffiliateOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // id + OrderId *int64 `gorm:"unique_key;default:0;" json:"order_id"` // 订单id + SureTime *int64 `gorm:"default:0;" json:"sure_time"` // 确认时间 + ProductTime *int64 `gorm:"default:0;" json:"product_time"` // 生产时间 + ProductEndtime *int64 `gorm:"default:0;" json:"product_endtime"` // 生成完成时间 + DeliverTime *int64 `gorm:"default:0;" json:"deliver_time"` // 发货时间 + UpsDeliverTime *int64 `gorm:"default:0;" json:"ups_deliver_time"` // ups发货时间 + UpsTime *int64 `gorm:"default:0;" json:"ups_time"` // UPS提货时间 + ArrivalTime *int64 `gorm:"default:0;" json:"arrival_time"` // 到达云仓的时间 + RecevieTime *int64 `gorm:"default:0;" json:"recevie_time"` // 云仓收货时间 +} +type FsOrderAffiliateOldModel struct { + db *gorm.DB + name string +} + +func NewFsOrderAffiliateOldModel(db *gorm.DB) *FsOrderAffiliateOldModel { + return &FsOrderAffiliateOldModel{db: db, name: "fs_order_affiliate_old"} +} diff --git a/model/gmodel/fs_order_affiliate_old_logic.go b/model/gmodel/fs_order_affiliate_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_order_affiliate_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_order_detail_old_gen.go b/model/gmodel/fs_order_detail_old_gen.go new file mode 100644 index 00000000..afc7c20f --- /dev/null +++ b/model/gmodel/fs_order_detail_old_gen.go @@ -0,0 +1,41 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_order_detail_old 订单详细表 +type FsOrderDetailOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // + Sn *string `gorm:"unique_key;default:'';" json:"sn"` // 唯一编码 + OrderId *int64 `gorm:"index;default:0;" json:"order_id"` // 订单ID + UserId *int64 `gorm:"default:0;" json:"user_id"` // 用户ID + FactoryId *int64 `gorm:"default:0;" json:"factory_id"` // 工厂ID + OrderDetailTemplateId *int64 `gorm:"default:0;" json:"order_detail_template_id"` // 详情templateID + ProductId *int64 `gorm:"default:0;" json:"product_id"` // 产品ID + BuyNum *int64 `gorm:"default:0;" json:"buy_num"` // 购买数量 + PushNum *int64 `gorm:"default:0;" json:"push_num"` // 已发数量 + Amount *int64 `gorm:"default:0;" json:"amount"` // 单价 + Cover *string `gorm:"default:'';" json:"cover"` // 截图 + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 + Status *int64 `gorm:"default:0;" json:"status"` // 状态位 是否推送到厂家 是否生产完成 是否发货完成 + OptionalId *int64 `gorm:"default:0;" json:"optional_id"` // 选项ID + OptionalTitle *string `gorm:"default:'';" json:"optional_title"` // 选项名称 + OptionPrice *int64 `gorm:"default:0;" json:"option_price"` // 配件价格 + IsTofactory *int64 `gorm:"default:0;" json:"is_tofactory"` // 是否推送到工厂 + IsProduct *int64 `gorm:"default:0;" json:"is_product"` // 是否生产中 + IsProductCompletion *int64 `gorm:"default:0;" json:"is_product_completion"` // 是否生产完成 + IsCloud *int64 `gorm:"default:0;" json:"is_cloud"` // 是否是云仓订单 + IsTocloud *int64 `gorm:"default:0;" json:"is_tocloud"` // 是否已发云仓(云仓单要发货到云仓,直接发到用户的不需要发到云仓) + IsDeliver *int64 `gorm:"default:0;" json:"is_deliver"` // 是否已发货 + IsEnd *int64 `gorm:"default:0;" json:"is_end"` // 是否完成订单(签收) + CartId *int64 `gorm:"index;default:0;" json:"cart_id"` // 购物车编号 +} +type FsOrderDetailOldModel struct { + db *gorm.DB + name string +} + +func NewFsOrderDetailOldModel(db *gorm.DB) *FsOrderDetailOldModel { + return &FsOrderDetailOldModel{db: db, name: "fs_order_detail_old"} +} diff --git a/model/gmodel/fs_order_detail_old_logic.go b/model/gmodel/fs_order_detail_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_order_detail_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_order_detail_template_old_gen.go b/model/gmodel/fs_order_detail_template_old_gen.go new file mode 100644 index 00000000..36f74646 --- /dev/null +++ b/model/gmodel/fs_order_detail_template_old_gen.go @@ -0,0 +1,28 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_order_detail_template_old 订单模板详细表 +type FsOrderDetailTemplateOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // + Sn *string `gorm:"unique_key;default:'';" json:"sn"` // 唯一编码 + ProductId *int64 `gorm:"index;default:0;" json:"product_id"` // 产品ID + ModelId *int64 `gorm:"default:0;" json:"model_id"` // 模型ID + TemplateId *int64 `gorm:"index;default:0;" json:"template_id"` // 模板ID + MaterialId *int64 `gorm:"index;default:0;" json:"material_id"` // 材质id + SizeId *int64 `gorm:"index;default:0;" json:"size_id"` // 尺寸id + EachBoxNum *int64 `gorm:"default:0;" json:"each_box_num"` // 每一箱的个数 + EachBoxWeight *float64 `gorm:"default:0.00;" json:"each_box_weight"` // 每一箱的重量 单位KG + DesignId *int64 `gorm:"index;default:0;" json:"design_id"` // 设计ID + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 +} +type FsOrderDetailTemplateOldModel struct { + db *gorm.DB + name string +} + +func NewFsOrderDetailTemplateOldModel(db *gorm.DB) *FsOrderDetailTemplateOldModel { + return &FsOrderDetailTemplateOldModel{db: db, name: "fs_order_detail_template_old"} +} diff --git a/model/gmodel/fs_order_detail_template_old_logic.go b/model/gmodel/fs_order_detail_template_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_order_detail_template_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_order_gen.go b/model/gmodel/fs_order_gen.go index ab34b331..66bdd701 100644 --- a/model/gmodel/fs_order_gen.go +++ b/model/gmodel/fs_order_gen.go @@ -5,44 +5,17 @@ import ( "time" ) -// fs_order +// fs_order 订单表 type FsOrder struct { - Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // - Sn *string `gorm:"unique_key;default:'';" json:"sn"` // 订单编号 FS211224OL2XDKNP - UserId *int64 `gorm:"index;default:0;" json:"user_id"` // 用户ID - SellerUserId *int64 `gorm:"default:0;" json:"seller_user_id"` // 销售员ID 0:自主下单 - TotalAmount *int64 `gorm:"default:0;" json:"total_amount"` // 总价 - PayedAmount *int64 `gorm:"default:0;" json:"payed_amount"` // 已支付金额 - PayMethod *int64 `gorm:"default:0;" json:"pay_method"` // 支付方式 1paypal 2strip - Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 - Utime *int64 `gorm:"default:0;" json:"utime"` // 更新时间 - Ptime *int64 `gorm:"default:0;" json:"ptime"` // 最后一次 支付时间(可能多次支付) - AddressId *int64 `gorm:"index;default:0;" json:"address_id"` // 地址ID或者云仓ID - DeliveryMethod *int64 `gorm:"default:0;" json:"delivery_method"` // 配送方式 1:直接发货到收获地址 2:云仓 - CustomerMark *string `gorm:"default:'';" json:"customer_mark"` // 客户备注 - Mark *string `gorm:"default:'';" json:"mark"` // 后台订单备注 - AddressInfo *string `gorm:"default:'';" json:"address_info"` // 详细地址信息JSON - IsSup *int64 `gorm:"default:0;" json:"is_sup"` // 0不是补货 1是补货 - Status *int64 `gorm:"default:0;" json:"status"` // 状态位(0:未支付,1:部分支付,2:支付完成,3:部分生产,4:部分生产完成,5:全部生产,6:全部生产完成,7:部分发货,8:发货完成,9:完成订单,10:取消订单,11:退款中,12:退款完成,13:订单已删除,14:订单已关闭) - IsPartPay *int64 `gorm:"default:0;" json:"is_part_pay"` // 是否部分支付(0:否,1:是) - IsPayCompleted *int64 `gorm:"default:0;" json:"is_pay_completed"` // 是否支付完成(0:否,1:是) - IsPartProduct *int64 `gorm:"default:0;" json:"is_part_product"` // 是否部分生产(0:否,1:是) - IsPartProductCompleted *int64 `gorm:"default:0;" json:"is_part_product_completed"` // 是否部分生产完成(0:否,1:是) - IsAllProduct *int64 `gorm:"default:0;" json:"is_all_product"` // 是否全部生产(0:否,1:是) - IsAllProductCompleted *int64 `gorm:"default:0;" json:"is_all_product_completed"` // 是否全部生产完成(0:否,1:是) - IsPartDelivery *int64 `gorm:"default:0;" json:"is_part_delivery"` // 是否部分发货(0:否,1:是) - IsDeliveryCompleted *int64 `gorm:"default:0;" json:"is_delivery_completed"` // 是否发货完成(0:否,1:是) - IsComplated *int64 `gorm:"default:0;" json:"is_complated"` // 是否完成订单(0:否,1:是) - IsCancel *int64 `gorm:"default:0;" json:"is_cancel"` // 是否取消订单(0:否,1:是) - IsRefunding *int64 `gorm:"default:0;" json:"is_refunding"` // 是否退款中(0:否,1:是) - IsRefunded *int64 `gorm:"default:0;" json:"is_refunded"` // 是否退款完成(0:否,1:是) - IsDeleted *int64 `gorm:"default:0;" json:"is_deleted"` // 是否删除(0:否,1:是) - RefundReasonId *int64 `gorm:"default:0;" json:"refund_reason_id"` // 取消订单原因ID - RefundReason *string `gorm:"default:'';" json:"refund_reason"` // 取消订单原因 - TsTime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ts_time"` // - IsSure *int64 `gorm:"default:0;" json:"is_sure"` // 是否确认订单 1确认0未确认 - DeliverSn *string `gorm:"default:'';" json:"deliver_sn"` // 发货单号 - EmailTime *int64 `gorm:"default:0;" json:"email_time"` // 邮件发送时间 + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // 订单ID + UserId *int64 `gorm:"index;default:0;" json:"user_id"` // 用户ID + DeliveryMethod *int64 `gorm:"index;default:0;" json:"delivery_method"` // 物流类型 + OrderNo *string `gorm:"index;default:'';" json:"order_no"` // + OrderSource *string `gorm:"default:'';" json:"order_source"` // + Status *int64 `gorm:"index;default:0;" json:"status"` // 订单状态 + Metadata *[]byte `gorm:"default:'';" json:"metadata"` // + Ctime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ctime"` // + Utime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"utime"` // } type FsOrderModel struct { db *gorm.DB diff --git a/model/gmodel/fs_order_old_gen.go b/model/gmodel/fs_order_old_gen.go new file mode 100644 index 00000000..20e573ec --- /dev/null +++ b/model/gmodel/fs_order_old_gen.go @@ -0,0 +1,54 @@ +package gmodel + +import ( + "gorm.io/gorm" + "time" +) + +// fs_order_old +type FsOrderOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // + Sn *string `gorm:"unique_key;default:'';" json:"sn"` // 订单编号 FS211224OL2XDKNP + UserId *int64 `gorm:"index;default:0;" json:"user_id"` // 用户ID + SellerUserId *int64 `gorm:"default:0;" json:"seller_user_id"` // 销售员ID 0:自主下单 + TotalAmount *int64 `gorm:"default:0;" json:"total_amount"` // 总价 + PayedAmount *int64 `gorm:"default:0;" json:"payed_amount"` // 已支付金额 + PayMethod *int64 `gorm:"default:0;" json:"pay_method"` // 支付方式 1paypal 2strip + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 + Utime *int64 `gorm:"default:0;" json:"utime"` // 更新时间 + Ptime *int64 `gorm:"default:0;" json:"ptime"` // 最后一次 支付时间(可能多次支付) + AddressId *int64 `gorm:"index;default:0;" json:"address_id"` // 地址ID或者云仓ID + DeliveryMethod *int64 `gorm:"default:0;" json:"delivery_method"` // 配送方式 1:直接发货到收获地址 2:云仓 + CustomerMark *string `gorm:"default:'';" json:"customer_mark"` // 客户备注 + Mark *string `gorm:"default:'';" json:"mark"` // 后台订单备注 + AddressInfo *string `gorm:"default:'';" json:"address_info"` // 详细地址信息JSON + IsSup *int64 `gorm:"default:0;" json:"is_sup"` // 0不是补货 1是补货 + Status *int64 `gorm:"default:0;" json:"status"` // 状态位(0:未支付,1:部分支付,2:支付完成,3:部分生产,4:部分生产完成,5:全部生产,6:全部生产完成,7:部分发货,8:发货完成,9:完成订单,10:取消订单,11:退款中,12:退款完成,13:订单已删除,14:订单已关闭) + IsPartPay *int64 `gorm:"default:0;" json:"is_part_pay"` // 是否部分支付(0:否,1:是) + IsPayCompleted *int64 `gorm:"default:0;" json:"is_pay_completed"` // 是否支付完成(0:否,1:是) + IsPartProduct *int64 `gorm:"default:0;" json:"is_part_product"` // 是否部分生产(0:否,1:是) + IsPartProductCompleted *int64 `gorm:"default:0;" json:"is_part_product_completed"` // 是否部分生产完成(0:否,1:是) + IsAllProduct *int64 `gorm:"default:0;" json:"is_all_product"` // 是否全部生产(0:否,1:是) + IsAllProductCompleted *int64 `gorm:"default:0;" json:"is_all_product_completed"` // 是否全部生产完成(0:否,1:是) + IsPartDelivery *int64 `gorm:"default:0;" json:"is_part_delivery"` // 是否部分发货(0:否,1:是) + IsDeliveryCompleted *int64 `gorm:"default:0;" json:"is_delivery_completed"` // 是否发货完成(0:否,1:是) + IsComplated *int64 `gorm:"default:0;" json:"is_complated"` // 是否完成订单(0:否,1:是) + IsCancel *int64 `gorm:"default:0;" json:"is_cancel"` // 是否取消订单(0:否,1:是) + IsRefunding *int64 `gorm:"default:0;" json:"is_refunding"` // 是否退款中(0:否,1:是) + IsRefunded *int64 `gorm:"default:0;" json:"is_refunded"` // 是否退款完成(0:否,1:是) + IsDeleted *int64 `gorm:"default:0;" json:"is_deleted"` // 是否删除(0:否,1:是) + RefundReasonId *int64 `gorm:"default:0;" json:"refund_reason_id"` // 取消订单原因ID + RefundReason *string `gorm:"default:'';" json:"refund_reason"` // 取消订单原因 + TsTime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ts_time"` // + IsSure *int64 `gorm:"default:0;" json:"is_sure"` // 是否确认订单 1确认0未确认 + DeliverSn *string `gorm:"default:'';" json:"deliver_sn"` // 发货单号 + EmailTime *int64 `gorm:"default:0;" json:"email_time"` // 邮件发送时间 +} +type FsOrderOldModel struct { + db *gorm.DB + name string +} + +func NewFsOrderOldModel(db *gorm.DB) *FsOrderOldModel { + return &FsOrderOldModel{db: db, name: "fs_order_old"} +} diff --git a/model/gmodel/fs_order_old_logic.go b/model/gmodel/fs_order_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_order_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_order_remark_old_gen.go b/model/gmodel/fs_order_remark_old_gen.go new file mode 100644 index 00000000..7c37fe76 --- /dev/null +++ b/model/gmodel/fs_order_remark_old_gen.go @@ -0,0 +1,22 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_order_remark_old 订单备注表 +type FsOrderRemarkOld struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // id + OrderId *int64 `gorm:"index;default:0;" json:"order_id"` // 订单id + Remark *string `gorm:"default:'';" json:"remark"` // 订单备注 + AdminId *int64 `gorm:"default:0;" json:"admin_id"` // 后台操作人员 + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 +} +type FsOrderRemarkOldModel struct { + db *gorm.DB + name string +} + +func NewFsOrderRemarkOldModel(db *gorm.DB) *FsOrderRemarkOldModel { + return &FsOrderRemarkOldModel{db: db, name: "fs_order_remark_old"} +} diff --git a/model/gmodel/fs_order_remark_old_logic.go b/model/gmodel/fs_order_remark_old_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_order_remark_old_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_order_trade_event_gen.go b/model/gmodel/fs_order_trade_event_gen.go new file mode 100644 index 00000000..6fa748c8 --- /dev/null +++ b/model/gmodel/fs_order_trade_event_gen.go @@ -0,0 +1,25 @@ +package gmodel + +import ( + "gorm.io/gorm" + "time" +) + +// fs_order_trade_event 订单交易事件表 +type FsOrderTradeEvent struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // 订单交易ID + PayMethod *int64 `gorm:"default:0;" json:"pay_method"` // 支付方式:1=stripe,2=paypal + EventId *string `gorm:"default:'';" json:"event_id"` // + EventType *string `gorm:"default:'';" json:"event_type"` // + EventData *[]byte `gorm:"default:'';" json:"event_data"` // + Ctime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ctime"` // + Utime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"utime"` // +} +type FsOrderTradeEventModel struct { + db *gorm.DB + name string +} + +func NewFsOrderTradeEventModel(db *gorm.DB) *FsOrderTradeEventModel { + return &FsOrderTradeEventModel{db: db, name: "fs_order_trade_event"} +} diff --git a/model/gmodel/fs_order_trade_event_logic.go b/model/gmodel/fs_order_trade_event_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_order_trade_event_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_order_trade_gen.go b/model/gmodel/fs_order_trade_gen.go new file mode 100644 index 00000000..01414724 --- /dev/null +++ b/model/gmodel/fs_order_trade_gen.go @@ -0,0 +1,36 @@ +package gmodel + +import ( + "gorm.io/gorm" + "time" +) + +// fs_order_trade 订单交易表 +type FsOrderTrade struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // 订单交易ID + UserId *int64 `gorm:"index;default:0;" json:"user_id"` // 用户ID + OrderNo *string `gorm:"default:'';" json:"order_no"` // + OrderSource *string `gorm:"default:'';" json:"order_source"` // + TradeNo *string `gorm:"index;default:'';" json:"trade_no"` // + PayAmount *int64 `gorm:"default:0;" json:"pay_amount"` // 支付金额 (分) + PayStatus *int64 `gorm:"default:0;" json:"pay_status"` // 支付状态:1=未成功,2=已成功 + PaymentMethod *int64 `gorm:"default:0;" json:"payment_method"` // 支付方式:1=stripe,2=paypal + PayStage *int64 `gorm:"default:0;" json:"pay_stage"` // 支付阶段:1=首付,2=尾款 + RefundStatus *int64 `gorm:"default:0;" json:"refund_status"` // 退款状态:1=未退款,2=已退款 + CardNo *string `gorm:"default:'';" json:"card_no"` // + CardBrand *string `gorm:"default:'';" json:"card_brand"` // + Country *string `gorm:"default:'';" json:"country"` // + Currency *string `gorm:"default:'';" json:"currency"` // + Metadata *[]byte `gorm:"default:'';" json:"metadata"` // + Ctime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ctime"` // + Utime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"utime"` // + PayTitle *string `gorm:"default:'';" json:"pay_title"` // +} +type FsOrderTradeModel struct { + db *gorm.DB + name string +} + +func NewFsOrderTradeModel(db *gorm.DB) *FsOrderTradeModel { + return &FsOrderTradeModel{db: db, name: "fs_order_trade"} +} diff --git a/model/gmodel/fs_order_trade_logic.go b/model/gmodel/fs_order_trade_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_order_trade_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_shopping_cart_gen.go b/model/gmodel/fs_shopping_cart_gen.go index 2997ec11..04996ad2 100644 --- a/model/gmodel/fs_shopping_cart_gen.go +++ b/model/gmodel/fs_shopping_cart_gen.go @@ -17,8 +17,6 @@ type FsShoppingCart struct { PurchaseQuantity *int64 `gorm:"default:0;" json:"purchase_quantity"` // 购买数量 Snapshot *string `gorm:"default:'';" json:"snapshot"` // IsHighlyCustomized *int64 `gorm:"default:0;" json:"is_highly_customized"` // 是否高度定制 0非 1是(针对客人高度定制只能后台增加如购物车) - Status *int64 `gorm:"default:0;" json:"status"` // 0未下单 1已下单 - IsEffective *int64 `gorm:"default:1;" json:"is_effective"` // 是否有效 0非 1是(针对对购物车下单,此前数据表更失效) Ctime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ctime"` // Utime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"utime"` // } diff --git a/model/gmodel/var_gen.go b/model/gmodel/var_gen.go index 1d92c033..88beb3b4 100644 --- a/model/gmodel/var_gen.go +++ b/model/gmodel/var_gen.go @@ -7,7 +7,6 @@ type AllModelsGen struct { CasbinRule *CasbinRuleModel // casbin_rule FsAddress *FsAddressModel // fs_address 用户地址表 FsAdminApi *FsAdminApiModel // fs_admin_api 后台--接口表 - FsAdminAuthRole *FsAdminAuthRoleModel // fs_admin_auth_role 后台--角色表 FsAdminDepartment *FsAdminDepartmentModel // fs_admin_department 后台--部门表 FsAdminMenu *FsAdminMenuModel // fs_admin_menu 后台--菜单表 FsAdminRole *FsAdminRoleModel // fs_admin_role 后台--角色表 @@ -23,15 +22,15 @@ type AllModelsGen struct { FsCardGroup *FsCardGroupModel // fs_card_group 卡号分组表 FsCart *FsCartModel // fs_cart 购物车 FsChangeCode *FsChangeCodeModel // fs_change_code 忘记密码code表 - FsCloud *FsCloudModel // fs_cloud 云仓表 - FsCloudDeliverEveryTmp *FsCloudDeliverEveryTmpModel // fs_cloud_deliver_every_tmp - FsCloudDeliverTmp *FsCloudDeliverTmpModel // fs_cloud_deliver_tmp - FsCloudPickUp *FsCloudPickUpModel // fs_cloud_pick_up 云仓提货单 - FsCloudPickUpDetail *FsCloudPickUpDetailModel // fs_cloud_pick_up_detail 云仓提货单-详情 - FsCloudReceive *FsCloudReceiveModel // fs_cloud_receive 云仓接收工厂总单 - FsCloudReceiveEvery *FsCloudReceiveEveryModel // fs_cloud_receive_every - FsCloudRenderLog *FsCloudRenderLogModel // fs_cloud_render_log 云渲染日志表 - FsCloudUserApplyBack *FsCloudUserApplyBackModel // fs_cloud_user_apply_back 该表废弃 + FsCloudDeliverEveryTmpOld *FsCloudDeliverEveryTmpOldModel // fs_cloud_deliver_every_tmp_old + FsCloudDeliverTmpOld *FsCloudDeliverTmpOldModel // fs_cloud_deliver_tmp_old + FsCloudOld *FsCloudOldModel // fs_cloud_old 云仓表 + FsCloudPickUpDetailOld *FsCloudPickUpDetailOldModel // fs_cloud_pick_up_detail_old 云仓提货单-详情 + FsCloudPickUpOld *FsCloudPickUpOldModel // fs_cloud_pick_up_old 云仓提货单 + FsCloudReceiveEveryOld *FsCloudReceiveEveryOldModel // fs_cloud_receive_every_old + FsCloudReceiveOld *FsCloudReceiveOldModel // fs_cloud_receive_old 云仓接收工厂总单 + FsCloudRenderLogOld *FsCloudRenderLogOldModel // fs_cloud_render_log_old 云渲染日志表 + FsCloudUserApplyBackOld *FsCloudUserApplyBackOldModel // fs_cloud_user_apply_back_old 该表废弃 FsContact *FsContactModel // fs_contact 该表暂未使用 FsContactService *FsContactServiceModel // fs_contact_service FsCoupon *FsCouponModel // fs_coupon 代金券(暂未使用) @@ -55,11 +54,14 @@ type AllModelsGen struct { FsMenu *FsMenuModel // fs_menu 后台菜单 FsMerchantCategory *FsMerchantCategoryModel // fs_merchant_category 商户类型表 FsMigration *FsMigrationModel // fs_migration 版本库 - FsOrder *FsOrderModel // fs_order - FsOrderAffiliate *FsOrderAffiliateModel // fs_order_affiliate 订单附属表-流程控制时间等 - FsOrderDetail *FsOrderDetailModel // fs_order_detail 订单详细表 - FsOrderDetailTemplate *FsOrderDetailTemplateModel // fs_order_detail_template 订单模板详细表 - FsOrderRemark *FsOrderRemarkModel // fs_order_remark 订单备注表 + FsOrder *FsOrderModel // fs_order 订单表 + FsOrderAffiliateOld *FsOrderAffiliateOldModel // fs_order_affiliate_old 订单附属表-流程控制时间等 + FsOrderDetailOld *FsOrderDetailOldModel // fs_order_detail_old 订单详细表 + FsOrderDetailTemplateOld *FsOrderDetailTemplateOldModel // fs_order_detail_template_old 订单模板详细表 + FsOrderOld *FsOrderOldModel // fs_order_old + FsOrderRemarkOld *FsOrderRemarkOldModel // fs_order_remark_old 订单备注表 + FsOrderTrade *FsOrderTradeModel // fs_order_trade 订单交易表 + FsOrderTradeEvent *FsOrderTradeEventModel // fs_order_trade_event 订单交易事件表 FsPay *FsPayModel // fs_pay 支付记录 FsPayEvent *FsPayEventModel // fs_pay_event 支付回调事件日志 FsProduct *FsProductModel // fs_product 产品表 @@ -114,7 +116,6 @@ func NewAllModels(gdb *gorm.DB) *AllModelsGen { CasbinRule: NewCasbinRuleModel(gdb), FsAddress: NewFsAddressModel(gdb), FsAdminApi: NewFsAdminApiModel(gdb), - FsAdminAuthRole: NewFsAdminAuthRoleModel(gdb), FsAdminDepartment: NewFsAdminDepartmentModel(gdb), FsAdminMenu: NewFsAdminMenuModel(gdb), FsAdminRole: NewFsAdminRoleModel(gdb), @@ -130,15 +131,15 @@ func NewAllModels(gdb *gorm.DB) *AllModelsGen { FsCardGroup: NewFsCardGroupModel(gdb), FsCart: NewFsCartModel(gdb), FsChangeCode: NewFsChangeCodeModel(gdb), - FsCloud: NewFsCloudModel(gdb), - FsCloudDeliverEveryTmp: NewFsCloudDeliverEveryTmpModel(gdb), - FsCloudDeliverTmp: NewFsCloudDeliverTmpModel(gdb), - FsCloudPickUp: NewFsCloudPickUpModel(gdb), - FsCloudPickUpDetail: NewFsCloudPickUpDetailModel(gdb), - FsCloudReceive: NewFsCloudReceiveModel(gdb), - FsCloudReceiveEvery: NewFsCloudReceiveEveryModel(gdb), - FsCloudRenderLog: NewFsCloudRenderLogModel(gdb), - FsCloudUserApplyBack: NewFsCloudUserApplyBackModel(gdb), + FsCloudDeliverEveryTmpOld: NewFsCloudDeliverEveryTmpOldModel(gdb), + FsCloudDeliverTmpOld: NewFsCloudDeliverTmpOldModel(gdb), + FsCloudOld: NewFsCloudOldModel(gdb), + FsCloudPickUpDetailOld: NewFsCloudPickUpDetailOldModel(gdb), + FsCloudPickUpOld: NewFsCloudPickUpOldModel(gdb), + FsCloudReceiveEveryOld: NewFsCloudReceiveEveryOldModel(gdb), + FsCloudReceiveOld: NewFsCloudReceiveOldModel(gdb), + FsCloudRenderLogOld: NewFsCloudRenderLogOldModel(gdb), + FsCloudUserApplyBackOld: NewFsCloudUserApplyBackOldModel(gdb), FsContact: NewFsContactModel(gdb), FsContactService: NewFsContactServiceModel(gdb), FsCoupon: NewFsCouponModel(gdb), @@ -163,10 +164,13 @@ func NewAllModels(gdb *gorm.DB) *AllModelsGen { FsMerchantCategory: NewFsMerchantCategoryModel(gdb), FsMigration: NewFsMigrationModel(gdb), FsOrder: NewFsOrderModel(gdb), - FsOrderAffiliate: NewFsOrderAffiliateModel(gdb), - FsOrderDetail: NewFsOrderDetailModel(gdb), - FsOrderDetailTemplate: NewFsOrderDetailTemplateModel(gdb), - FsOrderRemark: NewFsOrderRemarkModel(gdb), + FsOrderAffiliateOld: NewFsOrderAffiliateOldModel(gdb), + FsOrderDetailOld: NewFsOrderDetailOldModel(gdb), + FsOrderDetailTemplateOld: NewFsOrderDetailTemplateOldModel(gdb), + FsOrderOld: NewFsOrderOldModel(gdb), + FsOrderRemarkOld: NewFsOrderRemarkOldModel(gdb), + FsOrderTrade: NewFsOrderTradeModel(gdb), + FsOrderTradeEvent: NewFsOrderTradeEventModel(gdb), FsPay: NewFsPayModel(gdb), FsPayEvent: NewFsPayEventModel(gdb), FsProduct: NewFsProductModel(gdb), diff --git a/server/home-user-auth/internal/logic/usercontactservicelogic.go b/server/home-user-auth/internal/logic/usercontactservicelogic.go index 3b8509fb..b8278a86 100644 --- a/server/home-user-auth/internal/logic/usercontactservicelogic.go +++ b/server/home-user-auth/internal/logic/usercontactservicelogic.go @@ -1,10 +1,8 @@ package logic import ( - "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" - "fusenapi/utils/collect" "context" @@ -12,7 +10,6 @@ import ( "fusenapi/server/home-user-auth/internal/types" "github.com/zeromicro/go-zero/core/logx" - "gorm.io/gorm" ) type UserContactServiceLogic struct { @@ -33,36 +30,36 @@ func (l *UserContactServiceLogic) UserContactService(req *types.RequestContactSe // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) // userinfo 传入值时, 一定不为null - if !userinfo.IsUser() { - return resp.SetStatus(basic.CodeUnAuth) - } + // if !userinfo.IsUser() { + // return resp.SetStatus(basic.CodeUnAuth) + // } - cs := gmodel.FsContactService{ - UserId: &userinfo.UserId, - } - collect.LoadJsonTag(&cs, &req) + // cs := gmodel.FsContactService{ + // UserId: &userinfo.UserId, + // } + // collect.LoadJsonTag(&cs, &req) - switch req.Type { - case "order": - _, err := l.svcCtx.AllModels.FsOrder.FindOneAndCreateServiceContact(l.ctx, userinfo.UserId, req.RelationID, &cs) - if err != nil { - if err == gorm.ErrRecordNotFound { - return resp.SetStatus(basic.CodeOrderNotFoundErr) - } - return resp.SetStatus(basic.CodeDbSqlErr) - } - case "cloud": - _, err := l.svcCtx.AllModels.FsCloudPickUp.GetCloudPickUpByIDAndUserID(l.ctx, userinfo.UserId, req.RelationID, &cs) - if err != nil { - if err == gorm.ErrRecordNotFound { - return resp.SetStatus(basic.CodeCloudOrderNotFoundErr) - } - return resp.SetStatus(basic.CodeDbSqlErr) - } - return - default: - return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "type is unknown") - } + // switch req.Type { + // case "order": + // _, err := l.svcCtx.AllModels.FsOrder.FindOneAndCreateServiceContact(l.ctx, userinfo.UserId, req.RelationID, &cs) + // if err != nil { + // if err == gorm.ErrRecordNotFound { + // return resp.SetStatus(basic.CodeOrderNotFoundErr) + // } + // return resp.SetStatus(basic.CodeDbSqlErr) + // } + // case "cloud": + // _, err := l.svcCtx.AllModels.FsCloudPickUp.GetCloudPickUpByIDAndUserID(l.ctx, userinfo.UserId, req.RelationID, &cs) + // if err != nil { + // if err == gorm.ErrRecordNotFound { + // return resp.SetStatus(basic.CodeCloudOrderNotFoundErr) + // } + // return resp.SetStatus(basic.CodeDbSqlErr) + // } + // return + // default: + // return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "type is unknown") + // } - return resp.SetStatus(basic.CodeOK, cs) + return resp.SetStatus(basic.CodeOK) } diff --git a/server/home-user-auth/internal/logic/useroderdeletelogic.go b/server/home-user-auth/internal/logic/useroderdeletelogic.go index 0b4eb5ce..63c2c679 100644 --- a/server/home-user-auth/internal/logic/useroderdeletelogic.go +++ b/server/home-user-auth/internal/logic/useroderdeletelogic.go @@ -1,23 +1,15 @@ package logic import ( - "errors" - "fusenapi/constants" - "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" - "time" "context" "fusenapi/server/home-user-auth/internal/svc" "fusenapi/server/home-user-auth/internal/types" - "github.com/stripe/stripe-go/v74" - "github.com/stripe/stripe-go/v74/client" - "github.com/zeromicro/go-zero/core/logx" - "gorm.io/gorm" ) type UserOderDeleteLogic struct { @@ -38,109 +30,109 @@ func (l *UserOderDeleteLogic) UserOderDelete(req *types.RequestOrderId, userinfo // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) // userinfo 传入值时, 一定不为null - if !userinfo.IsUser() { - return resp.SetStatus(basic.CodeUnAuth) // 如果不是用户信息, 返回未授权错误 - } + // if !userinfo.IsUser() { + // return resp.SetStatus(basic.CodeUnAuth) // 如果不是用户信息, 返回未授权错误 + // } - //订单id - orderId := req.OrderId - if orderId < 1 { - return resp.SetStatus(basic.CodeRequestParamsErr) - } + // //订单id + // orderId := req.OrderId + // if orderId < 1 { + // return resp.SetStatus(basic.CodeRequestParamsErr) + // } - m := l.svcCtx.AllModels.FsOrder - order, err := m.FindOne(l.ctx, userinfo.UserId, orderId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatus(basic.CodeOrderNotFoundErr) - } - logx.Error(err) - return resp.SetStatus(basic.CodeDbSqlErr) - } + // m := l.svcCtx.AllModels.FsOrder + // order, err := m.FindOne(l.ctx, userinfo.UserId, orderId) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatus(basic.CodeOrderNotFoundErr) + // } + // logx.Error(err) + // return resp.SetStatus(basic.CodeDbSqlErr) + // } - if auth.CheckValueRange[constants.Order]( - constants.Order(*order.Status), - constants.STATUS_NEW_NOT_PAY, - constants.STATUS_NEW_PAY_COMPLETED, - constants.STATUS_NEW_PART_PAY, - ) { - return resp.SetStatus(basic.CodeOrderNotCancelledErr) - } + // if auth.CheckValueRange[constants.Order]( + // constants.Order(*order.Status), + // constants.STATUS_NEW_NOT_PAY, + // constants.STATUS_NEW_PAY_COMPLETED, + // constants.STATUS_NEW_PART_PAY, + // ) { + // return resp.SetStatus(basic.CodeOrderNotCancelledErr) + // } - if *order.IsPayCompleted == 1 && - time.Now().After(time.Unix(*order.Ctime, 0).Add(48*time.Hour)) { - return resp.SetStatus(basic.CodeOrderNotCancelledErr) - } + // if *order.IsPayCompleted == 1 && + // time.Now().After(time.Unix(*order.Ctime, 0).Add(48*time.Hour)) { + // return resp.SetStatus(basic.CodeOrderNotCancelledErr) + // } - uOrder := &gmodel.FsOrder{ - Id: orderId, - } + // uOrder := &gmodel.FsOrder{ + // Id: orderId, + // } - var ( - isCancel int64 = 1 - ustatus int64 = int64(constants.STATUS_NEW_CANCEL) - ) - // 修改取消状态和取消原因 - uOrder.Status = &ustatus - uOrder.IsCancel = &isCancel - uOrder.RefundReasonId = &req.RefundReasonId - uOrder.RefundReason = &req.RefundReason + // var ( + // isCancel int64 = 1 + // ustatus int64 = int64(constants.STATUS_NEW_CANCEL) + // ) + // // 修改取消状态和取消原因 + // uOrder.Status = &ustatus + // uOrder.IsCancel = &isCancel + // uOrder.RefundReasonId = &req.RefundReasonId + // uOrder.RefundReason = &req.RefundReason - err = m.Update(l.ctx, uOrder) - if err != nil { - logx.Error(err) - return resp.SetStatus(basic.CodeDbUpdateErr) - } + // err = m.Update(l.ctx, uOrder) + // if err != nil { + // logx.Error(err) + // return resp.SetStatus(basic.CodeDbUpdateErr) + // } - var ( - IsRefund int64 = 0 - CreatedAt = time.Now().UTC().Unix() - ) + // var ( + // IsRefund int64 = 0 + // CreatedAt = time.Now().UTC().Unix() + // ) - refund := &gmodel.FsRefundReason{ - IsRefund: &IsRefund, - RefundReasonId: &req.RefundReasonId, - RefundReason: &req.RefundReason, - OrderId: &order.Id, - CreatedAt: &CreatedAt, - } + // refund := &gmodel.FsRefundReason{ + // IsRefund: &IsRefund, + // RefundReasonId: &req.RefundReasonId, + // RefundReason: &req.RefundReason, + // OrderId: &order.Id, + // CreatedAt: &CreatedAt, + // } - mFsRefundReason := gmodel.NewFsRefundReasonModel(l.svcCtx.MysqlConn) - err = mFsRefundReason.Create(l.ctx, refund) - if err != nil { - logx.Error(err) - return resp.SetStatus(basic.CodeDbSqlErr) - } + // mFsRefundReason := gmodel.NewFsRefundReasonModel(l.svcCtx.MysqlConn) + // err = mFsRefundReason.Create(l.ctx, refund) + // if err != nil { + // logx.Error(err) + // return resp.SetStatus(basic.CodeDbSqlErr) + // } - // 退款 - // 调用第三方接口发起退款 + // // 退款 + // // 调用第三方接口发起退款 - config := &stripe.BackendConfig{ - MaxNetworkRetries: stripe.Int64(0), // Zero retries - } + // config := &stripe.BackendConfig{ + // MaxNetworkRetries: stripe.Int64(0), // Zero retries + // } - sc := &client.API{} - sc.Init(l.svcCtx.Config.Stripe.SK, &stripe.Backends{ - API: stripe.GetBackendWithConfig(stripe.APIBackend, config), - Uploads: stripe.GetBackendWithConfig(stripe.UploadsBackend, config), - }) - // ['order_number' => $order->sn, 'is_refund' => 0, 'pay_status' => 1] - payM := l.svcCtx.AllModels.FsPay + // sc := &client.API{} + // sc.Init(l.svcCtx.Config.Stripe.SK, &stripe.Backends{ + // API: stripe.GetBackendWithConfig(stripe.APIBackend, config), + // Uploads: stripe.GetBackendWithConfig(stripe.UploadsBackend, config), + // }) + // // ['order_number' => $order->sn, 'is_refund' => 0, 'pay_status' => 1] + // payM := l.svcCtx.AllModels.FsPay - // 查询支付信息 - pays, err := payM.GetOrderPayList(l.ctx, *order.Sn, 1, 0) - for _, pay := range pays { - sc.Refunds.New(&stripe.RefundParams{ - PaymentIntent: pay.TradeNo, - }) - } - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatus(basic.CodeApiErr) - } - } + // // 查询支付信息 + // pays, err := payM.GetOrderPayList(l.ctx, *order.Sn, 1, 0) + // for _, pay := range pays { + // sc.Refunds.New(&stripe.RefundParams{ + // PaymentIntent: pay.TradeNo, + // }) + // } + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatus(basic.CodeApiErr) + // } + // } - return resp.SetStatus(basic.CodePayCancelOk, uOrder) + return resp.SetStatus(basic.CodePayCancelOk) // return ResponseError(500, "Cancellation failure") diff --git a/server/home-user-auth/internal/logic/userordercancellogic.go b/server/home-user-auth/internal/logic/userordercancellogic.go index 7e7832d6..d576cb19 100644 --- a/server/home-user-auth/internal/logic/userordercancellogic.go +++ b/server/home-user-auth/internal/logic/userordercancellogic.go @@ -1,13 +1,8 @@ package logic import ( - "errors" - "fusenapi/constants" - "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" - "fusenapi/utils/handlers" - "time" "context" @@ -15,7 +10,6 @@ import ( "fusenapi/server/home-user-auth/internal/types" "github.com/zeromicro/go-zero/core/logx" - "gorm.io/gorm" ) type UserOrderCancelLogic struct { @@ -36,93 +30,93 @@ func (l *UserOrderCancelLogic) UserOrderCancel(req *types.UserOrderCancelReq, us // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) // userinfo 传入值时, 一定不为null - if userinfo == nil || userinfo.UserId == 0 { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") - } + // if userinfo == nil || userinfo.UserId == 0 { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") + // } - //查询订单信息 - orderModel := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn) - orderInfo, err := orderModel.FindOne(l.ctx, userinfo.UserId, req.ID) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the order is not exists") - } - logx.Error(err) - return resp.SetStatus(basic.CodeServiceErr, "failed to get order info") - } + // //查询订单信息 + // orderModel := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn) + // orderInfo, err := orderModel.FindOne(l.ctx, userinfo.UserId, req.ID) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the order is not exists") + // } + // logx.Error(err) + // return resp.SetStatus(basic.CodeServiceErr, "failed to get order info") + // } - // 判断订单状态 - var notCancelStatusMap = make(map[int64]struct{}, 3) - notCancelStatusMap[int64(constants.STATUS_NEW_NOT_PAY)] = struct{}{} - notCancelStatusMap[int64(constants.STATUS_NEW_PART_PAY)] = struct{}{} - notCancelStatusMap[int64(constants.STATUS_NEW_PAY_COMPLETED)] = struct{}{} - _, ok := notCancelStatusMap[int64(*orderInfo.Status)] - if !ok { - return resp.SetStatusWithMessage(basic.CodeOrderNotCancelledErr, "the order status not cancle") - } + // // 判断订单状态 + // var notCancelStatusMap = make(map[int64]struct{}, 3) + // notCancelStatusMap[int64(constants.STATUS_NEW_NOT_PAY)] = struct{}{} + // notCancelStatusMap[int64(constants.STATUS_NEW_PART_PAY)] = struct{}{} + // notCancelStatusMap[int64(constants.STATUS_NEW_PAY_COMPLETED)] = struct{}{} + // _, ok := notCancelStatusMap[int64(*orderInfo.Status)] + // if !ok { + // return resp.SetStatusWithMessage(basic.CodeOrderNotCancelledErr, "the order status not cancle") + // } - var cancelTime int64 = time.Now().UTC().Unix() - (*orderInfo.Ctime + int64(constants.CANCLE_ORDER_EXPIRE)) - // 第一次支付成功后48小时后不能进行取消操作 - if *orderInfo.IsPayCompleted == 1 && cancelTime > 0 { - return resp.SetStatusWithMessage(basic.CodeOrderNotCancelledErr, "The current order cannot be cancelled") - } + // var cancelTime int64 = time.Now().UTC().Unix() - (*orderInfo.Ctime + int64(constants.CANCLE_ORDER_EXPIRE)) + // // 第一次支付成功后48小时后不能进行取消操作 + // if *orderInfo.IsPayCompleted == 1 && cancelTime > 0 { + // return resp.SetStatusWithMessage(basic.CodeOrderNotCancelledErr, "The current order cannot be cancelled") + // } - // 修改订单--取消状态和取消原因 - *orderInfo.Status = int64(constants.STATUS_NEW_CANCEL) - *orderInfo.IsCancel = 1 - orderInfo.RefundReasonId = &req.RefundReasonId - orderInfo.RefundReason = &req.RefundReason + // // 修改订单--取消状态和取消原因 + // *orderInfo.Status = int64(constants.STATUS_NEW_CANCEL) + // *orderInfo.IsCancel = 1 + // orderInfo.RefundReasonId = &req.RefundReasonId + // orderInfo.RefundReason = &req.RefundReason - var nowTime = time.Now().UTC().Unix() - var payList []handlers.PayInfo - // 事务处理 - ctx := l.ctx - err = l.svcCtx.MysqlConn.Transaction(func(tx *gorm.DB) error { - // 修改订单信息 - orderModelTS := gmodel.NewFsOrderModel(tx) - err = orderModelTS.RBUpdate(ctx, orderInfo) - if err != nil { - return err - } - // 新增退款记录 - var isRefund int64 = 0 - refundReasonModelTS := gmodel.NewFsRefundReasonModel(tx) - refundReasonModelTS.RBCreateOrUpdate(ctx, &gmodel.FsRefundReason{ - IsRefund: &isRefund, - RefundReasonId: &req.RefundReasonId, - RefundReason: &req.RefundReason, - OrderId: &orderInfo.Id, - CreatedAt: &nowTime, - }) - // 退款申请 - // 退款申请--查询支付信息 - fsPayModelTS := gmodel.NewFsPayModel(tx) - rbFsPay := fsPayModelTS.RowSelectBuilder(nil).Where("order_number = ?", orderInfo.Sn).Where("pay_status =?", constants.PAYSTATUS_SUCCESS).Where("is_refund =?", 0) - payInfoList, err := fsPayModelTS.FindAll(ctx, rbFsPay, nil, "") - if err != nil { - return err - } - for _, payInfo := range payInfoList { - var key string - if *payInfo.PaymentMethod == int64(constants.PAYMETHOD_STRIPE) { - key = l.svcCtx.Config.PayConfig.Stripe.Key - } - payList = append(payList, handlers.PayInfo{ - TradeNo: *payInfo.TradeNo, - PaymentMethod: *payInfo.PaymentMethod, - Key: key, - }) - } - return nil - }) - // 退款申请--调取第三方接口发起退款 - handlers.PayRefundHandler(&handlers.PayRefundHandlerReq{ - PayInfoList: payList, - }) - if err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeOrderCancelledNotOk, "the order cancle failed") - } + // var nowTime = time.Now().UTC().Unix() + // var payList []handlers.PayInfo + // // 事务处理 + // ctx := l.ctx + // err = l.svcCtx.MysqlConn.Transaction(func(tx *gorm.DB) error { + // // 修改订单信息 + // orderModelTS := gmodel.NewFsOrderModel(tx) + // err = orderModelTS.RBUpdate(ctx, orderInfo) + // if err != nil { + // return err + // } + // // 新增退款记录 + // var isRefund int64 = 0 + // refundReasonModelTS := gmodel.NewFsRefundReasonModel(tx) + // refundReasonModelTS.RBCreateOrUpdate(ctx, &gmodel.FsRefundReason{ + // IsRefund: &isRefund, + // RefundReasonId: &req.RefundReasonId, + // RefundReason: &req.RefundReason, + // OrderId: &orderInfo.Id, + // CreatedAt: &nowTime, + // }) + // // 退款申请 + // // 退款申请--查询支付信息 + // fsPayModelTS := gmodel.NewFsPayModel(tx) + // rbFsPay := fsPayModelTS.RowSelectBuilder(nil).Where("order_number = ?", orderInfo.Sn).Where("pay_status =?", constants.PAYSTATUS_SUCCESS).Where("is_refund =?", 0) + // payInfoList, err := fsPayModelTS.FindAll(ctx, rbFsPay, nil, "") + // if err != nil { + // return err + // } + // for _, payInfo := range payInfoList { + // var key string + // if *payInfo.PaymentMethod == int64(constants.PAYMETHOD_STRIPE) { + // key = l.svcCtx.Config.PayConfig.Stripe.Key + // } + // payList = append(payList, handlers.PayInfo{ + // TradeNo: *payInfo.TradeNo, + // PaymentMethod: *payInfo.PaymentMethod, + // Key: key, + // }) + // } + // return nil + // }) + // // 退款申请--调取第三方接口发起退款 + // handlers.PayRefundHandler(&handlers.PayRefundHandlerReq{ + // PayInfoList: payList, + // }) + // if err != nil { + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeOrderCancelledNotOk, "the order cancle failed") + // } return resp.SetStatus(basic.CodeOK) } diff --git a/server/home-user-auth/internal/logic/userorderdeletelogic.go b/server/home-user-auth/internal/logic/userorderdeletelogic.go index 0842b983..4baf0058 100644 --- a/server/home-user-auth/internal/logic/userorderdeletelogic.go +++ b/server/home-user-auth/internal/logic/userorderdeletelogic.go @@ -1,9 +1,6 @@ package logic import ( - "errors" - "fusenapi/constants" - "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" @@ -13,7 +10,6 @@ import ( "fusenapi/server/home-user-auth/internal/types" "github.com/zeromicro/go-zero/core/logx" - "gorm.io/gorm" ) type UserOrderDeleteLogic struct { @@ -43,36 +39,36 @@ func (l *UserOrderDeleteLogic) UserOrderDelete(req *types.UserOrderDeleteReq, us // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) // userinfo 传入值时, 一定不为null - if userinfo == nil || userinfo.UserId == 0 { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") - } + // if userinfo == nil || userinfo.UserId == 0 { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") + // } - orderModel := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn) - orderInfo, err := orderModel.FindOne(l.ctx, userinfo.UserId, req.ID) + // orderModel := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn) + // orderInfo, err := orderModel.FindOne(l.ctx, userinfo.UserId, req.ID) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") - } - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get order info") - } + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") + // } + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get order info") + // } - updateStatusMap := make(map[constants.Order]struct{}, 4) - updateStatusMap[constants.STATUS_NEW_COMPLETED] = struct{}{} - updateStatusMap[constants.STATUS_NEW_CANCEL] = struct{}{} - updateStatusMap[constants.STATUS_NEW_REFUNDED] = struct{}{} - updateStatusMap[constants.STATUS_NEW_CLOSE] = struct{}{} - if _, ok := updateStatusMap[constants.Order(*orderInfo.Status)]; !ok { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") - } - *orderInfo.Status = int64(constants.STATUS_NEW_DELETE) - *orderInfo.IsDeleted = 1 - err = orderModel.Update(l.ctx, orderInfo) - if err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeServiceErr, "fail to delete") - } + // updateStatusMap := make(map[constants.Order]struct{}, 4) + // updateStatusMap[constants.STATUS_NEW_COMPLETED] = struct{}{} + // updateStatusMap[constants.STATUS_NEW_CANCEL] = struct{}{} + // updateStatusMap[constants.STATUS_NEW_REFUNDED] = struct{}{} + // updateStatusMap[constants.STATUS_NEW_CLOSE] = struct{}{} + // if _, ok := updateStatusMap[constants.Order(*orderInfo.Status)]; !ok { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") + // } + // *orderInfo.Status = int64(constants.STATUS_NEW_DELETE) + // *orderInfo.IsDeleted = 1 + // err = orderModel.Update(l.ctx, orderInfo) + // if err != nil { + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "fail to delete") + // } return resp.SetStatus(basic.CodeOK) } diff --git a/server/home-user-auth/internal/logic/userorderlistlogic.go b/server/home-user-auth/internal/logic/userorderlistlogic.go index 6122e26e..4741891d 100644 --- a/server/home-user-auth/internal/logic/userorderlistlogic.go +++ b/server/home-user-auth/internal/logic/userorderlistlogic.go @@ -1,20 +1,8 @@ package logic import ( - "errors" - "fmt" - "fusenapi/constants" - "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" - "fusenapi/utils/configs" - "fusenapi/utils/image" - "strings" - - "fusenapi/utils/format" - "fusenapi/utils/order" - "math" - "time" "context" @@ -22,7 +10,6 @@ import ( "fusenapi/server/home-user-auth/internal/types" "github.com/zeromicro/go-zero/core/logx" - "gorm.io/gorm" ) type UserOrderListLogic struct { @@ -43,263 +30,264 @@ func (l *UserOrderListLogic) UserOrderList(req *types.UserOrderListReq, userinfo // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) // userinfo 传入值时, 一定不为null - size := req.Size + // size := req.Size - if size > 0 { - size = int64(image.GetCurrentSize(uint32(size))) - } + // if size > 0 { + // size = int64(image.GetCurrentSize(uint32(size))) + // } - orderDetailModel := gmodel.NewFsOrderDetailModel(l.svcCtx.MysqlConn) - orderDetailTemplateModel := gmodel.NewFsOrderDetailTemplateModel(l.svcCtx.MysqlConn) - fsProductDesignModel := gmodel.NewFsProductDesignModel(l.svcCtx.MysqlConn) - orderModel := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn) - rowBuilder := orderModel.RowSelectBuilder(nil) - if userinfo == nil || userinfo.UserId == 0 { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") - } + // orderDetailModel := gmodel.NewFsOrderDetailModel(l.svcCtx.MysqlConn) + // orderDetailTemplateModel := gmodel.NewFsOrderDetailTemplateModel(l.svcCtx.MysqlConn) + // fsProductDesignModel := gmodel.NewFsProductDesignModel(l.svcCtx.MysqlConn) + // orderModel := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn) + // rowBuilder := orderModel.RowSelectBuilder(nil) + // if userinfo == nil || userinfo.UserId == 0 { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") + // } - // 查询条件 - var page = req.Page - var pageSize = req.PageSize - var listRes []*gmodel.FsOrderRel - rowBuilder = rowBuilder.Where("user_id =?", userinfo.UserId).Where("status <> ?", constants.STATUS_NEW_NOT_PAY).Where("status <>?", constants.STATUS_NEW_DELETE) + // // 查询条件 + // var page = req.Page + // var pageSize = req.PageSize + // var listRes []*gmodel.FsOrderRel + // rowBuilder = rowBuilder.Where("user_id =?", userinfo.UserId).Where("status <> ?", constants.STATUS_NEW_NOT_PAY).Where("status <>?", constants.STATUS_NEW_DELETE) - // 根据时间来查询不同范围的订单 - switch req.Time { - case 1: - rowBuilder = rowBuilder.Where("ctime >?", time.Now().UTC().AddDate(0, -1, 0).Unix()) - case 2: - rowBuilder = rowBuilder.Where("ctime >?", time.Now().UTC().AddDate(0, -3, 0).Unix()) - case 3: - rowBuilder = rowBuilder.Where("ctime >?", time.Now().UTC().AddDate(0, -6, 0).Unix()) - case 4: - rowBuilder = rowBuilder.Where("ctime >?", time.Now().UTC().AddDate(-1, 0, 0).Unix()) - default: - } + // // 根据时间来查询不同范围的订单 + // switch req.Time { + // case 1: + // rowBuilder = rowBuilder.Where("ctime >?", time.Now().UTC().AddDate(0, -1, 0).Unix()) + // case 2: + // rowBuilder = rowBuilder.Where("ctime >?", time.Now().UTC().AddDate(0, -3, 0).Unix()) + // case 3: + // rowBuilder = rowBuilder.Where("ctime >?", time.Now().UTC().AddDate(0, -6, 0).Unix()) + // case 4: + // rowBuilder = rowBuilder.Where("ctime >?", time.Now().UTC().AddDate(-1, 0, 0).Unix()) + // default: + // } - //按照订单状态查询不同的订单 - if req.Status != -1 { - switch req.Status { - case 1: - rowBuilder = rowBuilder.Where("status in ?", [3]constants.Order{constants.STATUS_NEW_PART_PAY, constants.STATUS_NEW_PAY_COMPLETED, constants.STATUS_NEW_SURE}) - case 2: - rowBuilder = rowBuilder.Where("status in ?", [2]constants.Order{constants.STATUS_NEW_PRODUTING, constants.STATUS_NEW_PRODUT_COMPLETED}) - case 3: - rowBuilder = rowBuilder.Where("status in ?", [2]constants.Order{constants.STATUS_NEW_DELIVER, constants.STATUS_NEW_UPS}) - case 4: - rowBuilder = rowBuilder.Where("status =?", constants.STATUS_NEW_ARRIVAL) - case 5: - rowBuilder = rowBuilder.Where("status =?", constants.STATUS_NEW_COMPLETED).Where("delivery_method =?", constants.DELIVERY_METHOD_ADDRESS) - case 7: - rowBuilder = rowBuilder.Where("status in ?", [3]constants.Order{constants.STATUS_NEW_CANCEL, constants.STATUS_NEW_REFUNDED, constants.STATUS_NEW_REFUNDING}) - case 8: - rowBuilder = rowBuilder.Where("status =?", constants.STATUS_NEW_COMPLETED).Where("delivery_method =?", constants.DELIVERY_METHOD_CLOUD) - } - } + // //按照订单状态查询不同的订单 + // if req.Status != -1 { + // switch req.Status { + // case 1: + // rowBuilder = rowBuilder.Where("status in ?", [3]constants.Order{constants.STATUS_NEW_PART_PAY, constants.STATUS_NEW_PAY_COMPLETED, constants.STATUS_NEW_SURE}) + // case 2: + // rowBuilder = rowBuilder.Where("status in ?", [2]constants.Order{constants.STATUS_NEW_PRODUTING, constants.STATUS_NEW_PRODUT_COMPLETED}) + // case 3: + // rowBuilder = rowBuilder.Where("status in ?", [2]constants.Order{constants.STATUS_NEW_DELIVER, constants.STATUS_NEW_UPS}) + // case 4: + // rowBuilder = rowBuilder.Where("status =?", constants.STATUS_NEW_ARRIVAL) + // case 5: + // rowBuilder = rowBuilder.Where("status =?", constants.STATUS_NEW_COMPLETED).Where("delivery_method =?", constants.DELIVERY_METHOD_ADDRESS) + // case 7: + // rowBuilder = rowBuilder.Where("status in ?", [3]constants.Order{constants.STATUS_NEW_CANCEL, constants.STATUS_NEW_REFUNDED, constants.STATUS_NEW_REFUNDING}) + // case 8: + // rowBuilder = rowBuilder.Where("status =?", constants.STATUS_NEW_COMPLETED).Where("delivery_method =?", constants.DELIVERY_METHOD_CLOUD) + // } + // } - // 查询总数 - total, err := orderModel.FindCount(l.ctx, rowBuilder, nil) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") - } - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get order info") - } + // // 查询总数 + // total, err := orderModel.FindCount(l.ctx, rowBuilder, nil) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") + // } + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get order info") + // } - // 查询数据 - if total > 0 { - rowBuilder = rowBuilder.Preload("FsOrderAffiliateInfo").Preload("FsOrderDetails", func(dbPreload *gorm.DB) *gorm.DB { - return dbPreload.Table(orderDetailModel.TableName()).Preload("FsOrderDetailTemplateInfo", func(dbPreload *gorm.DB) *gorm.DB { - return dbPreload.Table(orderDetailTemplateModel.TableName()).Preload("FsProductDesignInfo", func(dbPreload *gorm.DB) *gorm.DB { - return dbPreload.Table(fsProductDesignModel.TableName()).Preload("OptionData").Preload("TemplateData") - }).Preload("FsProductSizeInfo") - }).Preload("FsProductInfo") - }) - listRes, err = orderModel.FindPageListByPage(l.ctx, rowBuilder, &page, &pageSize, nil, "") - } + // // 查询数据 + // if total > 0 { + // rowBuilder = rowBuilder.Preload("FsOrderAffiliateInfo").Preload("FsOrderDetails", func(dbPreload *gorm.DB) *gorm.DB { + // return dbPreload.Table(orderDetailModel.TableName()).Preload("FsOrderDetailTemplateInfo", func(dbPreload *gorm.DB) *gorm.DB { + // return dbPreload.Table(orderDetailTemplateModel.TableName()).Preload("FsProductDesignInfo", func(dbPreload *gorm.DB) *gorm.DB { + // return dbPreload.Table(fsProductDesignModel.TableName()).Preload("OptionData").Preload("TemplateData") + // }).Preload("FsProductSizeInfo") + // }).Preload("FsProductInfo") + // }) + // listRes, err = orderModel.FindPageListByPage(l.ctx, rowBuilder, &page, &pageSize, nil, "") + // } - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") - } - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get order info") - } - listResLen := len(listRes) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") + // } + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get order info") + // } + // listResLen := len(listRes) - var respList []types.Items - if listResLen > 0 { - // 获取订单时间配置 - orderTimeConfig, err := configs.GetOrderTimeConfig(l.ctx, l.svcCtx.MysqlConn) - if err != nil { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get config time info") - } + // var respList []types.Items + // if listResLen > 0 { + // // 获取订单时间配置 + // orderTimeConfig, err := configs.GetOrderTimeConfig(l.ctx, l.svcCtx.MysqlConn) + // if err != nil { + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get config time info") + // } - // 数据处理 - for _, item := range listRes { - var pbData types.Items - pbData.ID = item.Id - pbData.Sn = *item.Sn - pbData.UserID = *item.UserId - pbData.TotalAmount = *item.TotalAmount - pbData.Ctime = format.TimeIntToFormat(*item.Ctime) - pbData.Status = *item.Status - pbData.DeliveryMethod = *item.DeliveryMethod - pbData.TsTime = format.TimeToFormat(*item.TsTime) - pbData.IsPayCompleted = *item.IsPayCompleted - pbData.DeliverSn = *item.DeliverSn + // // 数据处理 + // for _, item := range listRes { + // var pbData types.Items + // pbData.ID = item.Id + // pbData.Sn = *item.Sn + // pbData.UserID = *item.UserId + // pbData.TotalAmount = *item.TotalAmount + // pbData.Ctime = format.TimeIntToFormat(*item.Ctime) + // pbData.Status = *item.Status + // pbData.DeliveryMethod = *item.DeliveryMethod + // pbData.TsTime = format.TimeToFormat(*item.TsTime) + // pbData.IsPayCompleted = *item.IsPayCompleted + // pbData.DeliverSn = *item.DeliverSn - var pcsBox int64 - var pcs int64 - var productList []types.Product + // var pcsBox int64 + // var pcs int64 + // var productList []types.Product - var surplusAt int64 + // var surplusAt int64 - //如果是部分支付状态,那么取消订单倒计时2天 - if *item.Status == int64(constants.STATUS_NEW_PART_PAY) { - surplusAt = (*item.Ctime + int64(constants.CANCLE_ORDER_EXPIRE)) - time.Now().UTC().Unix() - if surplusAt < 0 { - surplusAt = 0 - } - } + // //如果是部分支付状态,那么取消订单倒计时2天 + // if *item.Status == int64(constants.STATUS_NEW_PART_PAY) { + // surplusAt = (*item.Ctime + int64(constants.CANCLE_ORDER_EXPIRE)) - time.Now().UTC().Unix() + // if surplusAt < 0 { + // surplusAt = 0 + // } + // } - fsOrderAffiliateInfo := item.FsOrderAffiliateInfo + // fsOrderAffiliateInfo := item.FsOrderAffiliateInfo - var sureTime int64 - var productTime int64 - var ProductEndtime int64 - var deliverTime int64 - var upsDeliverTime int64 - var upsTime int64 - var arrivalTime int64 - var recevieTime int64 - if fsOrderAffiliateInfo.Id > 0 { - sureTime = *fsOrderAffiliateInfo.SureTime - productTime = *fsOrderAffiliateInfo.ProductTime - ProductEndtime = *fsOrderAffiliateInfo.ProductEndtime - deliverTime = *fsOrderAffiliateInfo.DeliverTime - upsDeliverTime = *fsOrderAffiliateInfo.UpsDeliverTime - upsTime = *fsOrderAffiliateInfo.UpsTime - arrivalTime = *fsOrderAffiliateInfo.ArrivalTime - recevieTime = *fsOrderAffiliateInfo.RecevieTime - } + // var sureTime int64 + // var productTime int64 + // var ProductEndtime int64 + // var deliverTime int64 + // var upsDeliverTime int64 + // var upsTime int64 + // var arrivalTime int64 + // var recevieTime int64 + // if fsOrderAffiliateInfo.Id > 0 { + // sureTime = *fsOrderAffiliateInfo.SureTime + // productTime = *fsOrderAffiliateInfo.ProductTime + // ProductEndtime = *fsOrderAffiliateInfo.ProductEndtime + // deliverTime = *fsOrderAffiliateInfo.DeliverTime + // upsDeliverTime = *fsOrderAffiliateInfo.UpsDeliverTime + // upsTime = *fsOrderAffiliateInfo.UpsTime + // arrivalTime = *fsOrderAffiliateInfo.ArrivalTime + // recevieTime = *fsOrderAffiliateInfo.RecevieTime + // } - var getOrderStatusAndLogisticsReq = order.GetOrderStatusAndLogisticsReq{ - OrderStatus: constants.Order(*item.Status), - DeliveryMethod: constants.DeliveryMethod(*item.DeliveryMethod), - IsPayCompleted: *item.IsAllProductCompleted, - OrderCtime: *item.Ctime, + // var getOrderStatusAndLogisticsReq = order.GetOrderStatusAndLogisticsReq{ + // OrderStatus: constants.Order(*item.Status), + // DeliveryMethod: constants.DeliveryMethod(*item.DeliveryMethod), + // IsPayCompleted: *item.IsAllProductCompleted, + // OrderCtime: *item.Ctime, - SureTime: sureTime, - ProductTime: productTime, - ProductEndtime: ProductEndtime, - DeliverTime: deliverTime, - UpsDeliverTime: upsDeliverTime, - UpsTime: upsTime, - ArrivalTime: arrivalTime, - RecevieTime: recevieTime, + // SureTime: sureTime, + // ProductTime: productTime, + // ProductEndtime: ProductEndtime, + // DeliverTime: deliverTime, + // UpsDeliverTime: upsDeliverTime, + // UpsTime: upsTime, + // ArrivalTime: arrivalTime, + // RecevieTime: recevieTime, - WebSetTimeInfo: orderTimeConfig, - } + // WebSetTimeInfo: orderTimeConfig, + // } - statusAndLogisticsRes := order.GetOrderStatusAndLogistics(getOrderStatusAndLogisticsReq) + // statusAndLogisticsRes := order.GetOrderStatusAndLogistics(getOrderStatusAndLogisticsReq) - // 流程控制 - var statusTime []types.StatusTime - for _, itemTimes := range statusAndLogisticsRes.Times { - statusTime = append(statusTime, types.StatusTime{ - Key: itemTimes.Key, - Time: itemTimes.Time, - }) - } - pbData.StatusTimes = statusTime - pbData.LogisticsStatus = int64(statusAndLogisticsRes.LogisticsStatus) - pbData.Status = int64(statusAndLogisticsRes.OrderStatus) + // // 流程控制 + // var statusTime []types.StatusTime + // for _, itemTimes := range statusAndLogisticsRes.Times { + // statusTime = append(statusTime, types.StatusTime{ + // Key: itemTimes.Key, + // Time: itemTimes.Time, + // }) + // } + // pbData.StatusTimes = statusTime + // pbData.LogisticsStatus = int64(statusAndLogisticsRes.LogisticsStatus) + // pbData.Status = int64(statusAndLogisticsRes.OrderStatus) - var isStopMax int64 - if len(item.FsOrderDetails) > 0 { - for _, fsOrderDetailItem := range item.FsOrderDetails { + // var isStopMax int64 + // if len(item.FsOrderDetails) > 0 { + // for _, fsOrderDetailItem := range item.FsOrderDetails { - fsOrderDetailBuyNum := *fsOrderDetailItem.FsOrderDetail.BuyNum - fsOrderDetailEachBoxNum := *fsOrderDetailItem.FsOrderDetailTemplateInfo.EachBoxNum - pcs = pcs + fsOrderDetailBuyNum - pcsBoxNum := fsOrderDetailBuyNum / fsOrderDetailEachBoxNum - var csBoxNumF int64 - if (fsOrderDetailBuyNum % fsOrderDetailEachBoxNum) > 0 { - csBoxNumF = 1 - } - pcsBox = pcsBox + pcsBoxNum + csBoxNumF + // fsOrderDetailBuyNum := *fsOrderDetailItem.FsOrderDetail.BuyNum + // fsOrderDetailEachBoxNum := *fsOrderDetailItem.FsOrderDetailTemplateInfo.EachBoxNum + // pcs = pcs + fsOrderDetailBuyNum + // pcsBoxNum := fsOrderDetailBuyNum / fsOrderDetailEachBoxNum + // var csBoxNumF int64 + // if (fsOrderDetailBuyNum % fsOrderDetailEachBoxNum) > 0 { + // csBoxNumF = 1 + // } + // pcsBox = pcsBox + pcsBoxNum + csBoxNumF - productCover := *fsOrderDetailItem.Cover - // 尺寸 - if size >= 200 { - coverArr := strings.Split(*fsOrderDetailItem.Cover, ".") - if len(coverArr) < 2 { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "cover split slice item count is less than 2") - } - productCover = fmt.Sprintf("%s_%d.%s", coverArr[0], req.Size, coverArr[1]) - } + // productCover := *fsOrderDetailItem.Cover + // // 尺寸 + // if size >= 200 { + // coverArr := strings.Split(*fsOrderDetailItem.Cover, ".") + // if len(coverArr) < 2 { + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "cover split slice item count is less than 2") + // } + // productCover = fmt.Sprintf("%s_%d.%s", coverArr[0], req.Size, coverArr[1]) + // } - // 判断stop - var isStop int64 - if fsOrderDetailItem.FsOrderDetailTemplateInfo.FsProductDesignInfo.OptionData.Id != 0 { - // 尺寸或者模板下架 - if fsOrderDetailItem.FsOrderDetailTemplateInfo.FsProductDesignInfo.Id != 0 { - isStop = 1 - } else { - isStop = 3 - } - } else { - if fsOrderDetailItem.FsOrderDetailTemplateInfo.FsProductDesignInfo.Id != 0 { - isStop = 1 - } - } + // // 判断stop + // var isStop int64 + // if fsOrderDetailItem.FsOrderDetailTemplateInfo.FsProductDesignInfo.OptionData.Id != 0 { + // // 尺寸或者模板下架 + // if fsOrderDetailItem.FsOrderDetailTemplateInfo.FsProductDesignInfo.Id != 0 { + // isStop = 1 + // } else { + // isStop = 3 + // } + // } else { + // if fsOrderDetailItem.FsOrderDetailTemplateInfo.FsProductDesignInfo.Id != 0 { + // isStop = 1 + // } + // } - // 判断产品是否下架 - if *fsOrderDetailItem.FsProductInfo.IsShelf == 0 || *fsOrderDetailItem.FsProductInfo.IsDel == 1 { - isStop = 2 - } - if isStop > isStopMax { - isStopMax = isStop - } + // // 判断产品是否下架 + // if *fsOrderDetailItem.FsProductInfo.IsShelf == 0 || *fsOrderDetailItem.FsProductInfo.IsDel == 1 { + // isStop = 2 + // } + // if isStop > isStopMax { + // isStopMax = isStop + // } - productList = append(productList, types.Product{ - Cover: productCover, - Fitting: *fsOrderDetailItem.OptionalTitle, - OptionPrice: *fsOrderDetailItem.OptionPrice, - OrderDetailTemplateId: *fsOrderDetailItem.OrderDetailTemplateId, - OrderId: *fsOrderDetailItem.OrderId, - Pcs: fsOrderDetailBuyNum, - PcsBox: pcsBox, - Price: *fsOrderDetailItem.FsOrderDetail.Amount, - ProductId: *fsOrderDetailItem.OptionPrice, - Title: *fsOrderDetailItem.FsProductInfo.Title, - Size: *fsOrderDetailItem.FsOrderDetailTemplateInfo.FsProductSizeInfo.Capacity, - IsStop: isStop, - }) - } - pbData.ProductList = productList - } + // productList = append(productList, types.Product{ + // Cover: productCover, + // Fitting: *fsOrderDetailItem.OptionalTitle, + // OptionPrice: *fsOrderDetailItem.OptionPrice, + // OrderDetailTemplateId: *fsOrderDetailItem.OrderDetailTemplateId, + // OrderId: *fsOrderDetailItem.OrderId, + // Pcs: fsOrderDetailBuyNum, + // PcsBox: pcsBox, + // Price: *fsOrderDetailItem.FsOrderDetail.Amount, + // ProductId: *fsOrderDetailItem.OptionPrice, + // Title: *fsOrderDetailItem.FsProductInfo.Title, + // Size: *fsOrderDetailItem.FsOrderDetailTemplateInfo.FsProductSizeInfo.Capacity, + // IsStop: isStop, + // }) + // } + // pbData.ProductList = productList + // } - pbData.IsStop = isStopMax - pbData.PcsBox = pcsBox - pbData.Pcs = pcs - pbData.SurplusAt = surplusAt - pbData.Deposit = *item.TotalAmount / 2 - pbData.Remaining = pbData.Deposit - respList = append(respList, pbData) - } + // pbData.IsStop = isStopMax + // pbData.PcsBox = pcsBox + // pbData.Pcs = pcs + // pbData.SurplusAt = surplusAt + // pbData.Deposit = *item.TotalAmount / 2 + // pbData.Remaining = pbData.Deposit + // respList = append(respList, pbData) + // } - } + // } - return resp.SetStatusWithMessage(basic.CodeOK, "success", types.UserOrderListRsp{ - Items: respList, - Meta: types.Meta{ - TotalCount: total, - PageCount: int64(math.Ceil(float64(total) / float64(pageSize))), - CurrentPage: int(page), - PerPage: int(pageSize), - }, - }) + // return resp.SetStatusWithMessage(basic.CodeOK, "success", types.UserOrderListRsp{ + // Items: respList, + // Meta: types.Meta{ + // TotalCount: total, + // PageCount: int64(math.Ceil(float64(total) / float64(pageSize))), + // CurrentPage: int(page), + // PerPage: int(pageSize), + // }, + // }) + return resp.SetStatusWithMessage(basic.CodeOK, "success") } diff --git a/server/pay/internal/logic/orderpaymentintentlogic.go b/server/pay/internal/logic/orderpaymentintentlogic.go index 35b4484d..23f5d8e8 100644 --- a/server/pay/internal/logic/orderpaymentintentlogic.go +++ b/server/pay/internal/logic/orderpaymentintentlogic.go @@ -1,13 +1,8 @@ package logic import ( - "errors" - "fusenapi/constants" - "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" - "fusenapi/utils/pay" - "time" "context" @@ -15,7 +10,6 @@ import ( "fusenapi/server/pay/internal/types" "github.com/zeromicro/go-zero/core/logx" - "gorm.io/gorm" ) type OrderPaymentIntentLogic struct { @@ -45,143 +39,143 @@ func (l *OrderPaymentIntentLogic) OrderPaymentIntent(req *types.OrderPaymentInte // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) // userinfo 传入值时, 一定不为null - if userinfo == nil || userinfo.UserId == 0 { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") - } + // if userinfo == nil || userinfo.UserId == 0 { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") + // } - // 查询订单数据 - orderModel := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn) - orderInfo, err := orderModel.FindOneBySn(l.ctx, userinfo.UserId, req.Sn) + // // 查询订单数据 + // orderModel := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn) + // orderInfo, err := orderModel.FindOneBySn(l.ctx, userinfo.UserId, req.Sn) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") - } - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get order info") - } + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order not found") + // } + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get order info") + // } - // 校验订单状态 - if *orderInfo.IsCancel == 1 { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "order cancelled") - } + // // 校验订单状态 + // if *orderInfo.IsCancel == 1 { + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "order cancelled") + // } - // 校验地址信息 - addressModel := gmodel.NewFsAddressModel(l.svcCtx.MysqlConn) - _, err = addressModel.GetOne(l.ctx, req.AddressId, userinfo.UserId) + // // 校验地址信息 + // addressModel := gmodel.NewFsAddressModel(l.svcCtx.MysqlConn) + // _, err = addressModel.GetOne(l.ctx, req.AddressId, userinfo.UserId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "address not found") - } - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get address info") - } + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "address not found") + // } + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get address info") + // } - // 校验订单支付信息 - if *orderInfo.IsPayCompleted == 1 { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "order is pay completed") - } + // // 校验订单支付信息 + // if *orderInfo.IsPayCompleted == 1 { + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "order is pay completed") + // } - // 判断订单状态以及该支付金额 - var nowAt int64 = time.Now().UTC().Unix() - var payAmount int64 - if *orderInfo.Status == int64(constants.STATUS_NEW_NOT_PAY) { - payAmount = *orderInfo.TotalAmount / 2 - *orderInfo.DeliveryMethod = req.DeliveryMethod - *orderInfo.AddressId = req.AddressId - *orderInfo.PayMethod = req.PayMethod - } else { - payAmount = *orderInfo.TotalAmount - *orderInfo.TotalAmount/2 - } + // // 判断订单状态以及该支付金额 + // var nowAt int64 = time.Now().UTC().Unix() + // var payAmount int64 + // if *orderInfo.Status == int64(constants.STATUS_NEW_NOT_PAY) { + // payAmount = *orderInfo.TotalAmount / 2 + // *orderInfo.DeliveryMethod = req.DeliveryMethod + // *orderInfo.AddressId = req.AddressId + // *orderInfo.PayMethod = req.PayMethod + // } else { + // payAmount = *orderInfo.TotalAmount - *orderInfo.TotalAmount/2 + // } - payConfig := &pay.Config{} - var generatePrepaymentReq = &pay.GeneratePrepaymentReq{ - OrderSn: req.Sn, - ProductName: "支付标题", - Amount: payAmount, - Currency: "eur", - Quantity: 1, - ProductDescription: "支付描述", - } + // payConfig := &pay.Config{} + // var generatePrepaymentReq = &pay.GeneratePrepaymentReq{ + // OrderSn: req.Sn, + // ProductName: "支付标题", + // Amount: payAmount, + // Currency: "eur", + // Quantity: 1, + // ProductDescription: "支付描述", + // } - var resData types.OrderPaymentIntentRes - // 事务处理 - ctx := l.ctx - err = l.svcCtx.MysqlConn.Transaction(func(connGorm *gorm.DB) error { - // 支付记录--处理 //支付记录改为一条订单多条,分首款尾款 - var payStatus int64 = 0 - var orderSource int64 = 1 - var payStage int64 - var fspay *gmodel.FsPay - newFsPayModel := gmodel.NewFsPayModel(connGorm) - if *orderInfo.Status == int64(constants.STATUS_NEW_NOT_PAY) { - fspay, err = newFsPayModel.RBGetListByOrderNumberStage(ctx, *orderInfo.Sn, 1) - if err != nil { - if !errors.Is(err, gorm.ErrRecordNotFound) { - return err - } - } - payStage = 1 - } else { - fspay, err = newFsPayModel.RBGetListByOrderNumberStage(ctx, *orderInfo.Sn, 2) - if err != nil { - if !errors.Is(err, gorm.ErrRecordNotFound) { - return err - } - } - payStage = 2 - } + // var resData types.OrderPaymentIntentRes + // // 事务处理 + // ctx := l.ctx + // err = l.svcCtx.MysqlConn.Transaction(func(connGorm *gorm.DB) error { + // // 支付记录--处理 //支付记录改为一条订单多条,分首款尾款 + // var payStatus int64 = 0 + // var orderSource int64 = 1 + // var payStage int64 + // var fspay *gmodel.FsPay + // newFsPayModel := gmodel.NewFsPayModel(connGorm) + // if *orderInfo.Status == int64(constants.STATUS_NEW_NOT_PAY) { + // fspay, err = newFsPayModel.RBGetListByOrderNumberStage(ctx, *orderInfo.Sn, 1) + // if err != nil { + // if !errors.Is(err, gorm.ErrRecordNotFound) { + // return err + // } + // } + // payStage = 1 + // } else { + // fspay, err = newFsPayModel.RBGetListByOrderNumberStage(ctx, *orderInfo.Sn, 2) + // if err != nil { + // if !errors.Is(err, gorm.ErrRecordNotFound) { + // return err + // } + // } + // payStage = 2 + // } - // 支付预付--生成 - if constants.PayMethod(req.PayMethod) == constants.PAYMETHOD_STRIPE { - payConfig.Stripe.Key = l.svcCtx.Config.PayConfig.Stripe.Key - generatePrepaymentReq.SuccessURL = l.svcCtx.Config.PayConfig.Stripe.SuccessURL - generatePrepaymentReq.CancelURL = l.svcCtx.Config.PayConfig.Stripe.CancelURL - } - payDriver := pay.NewPayDriver(req.PayMethod, payConfig) - prepaymentRes, err := payDriver.GeneratePrepayment(generatePrepaymentReq) - if err != nil { - return err - } + // // 支付预付--生成 + // if constants.PayMethod(req.PayMethod) == constants.PAYMETHOD_STRIPE { + // payConfig.Stripe.Key = l.svcCtx.Config.PayConfig.Stripe.Key + // generatePrepaymentReq.SuccessURL = l.svcCtx.Config.PayConfig.Stripe.SuccessURL + // generatePrepaymentReq.CancelURL = l.svcCtx.Config.PayConfig.Stripe.CancelURL + // } + // payDriver := pay.NewPayDriver(req.PayMethod, payConfig) + // prepaymentRes, err := payDriver.GeneratePrepayment(generatePrepaymentReq) + // if err != nil { + // return err + // } - // 订单信息--修改 - err = gmodel.NewFsOrderModel(connGorm).RBUpdate(ctx, orderInfo) - if err != nil { - return err - } + // // 订单信息--修改 + // err = gmodel.NewFsOrderModel(connGorm).RBUpdate(ctx, orderInfo) + // if err != nil { + // return err + // } - if fspay == nil { - fspay = &gmodel.FsPay{ - UserId: orderInfo.UserId, - OrderNumber: orderInfo.Sn, - CreatedAt: &nowAt, - } - } else { - fspay.UpdatedAt = &nowAt - } - fspay.PayAmount = &payAmount - fspay.PayStage = &payStage - //fspay.TradeNo = &prepaymentRes.TradeNo - fspay.PaymentMethod = &req.PayMethod - fspay.OrderSource = &orderSource - fspay.PayStatus = &payStatus + // if fspay == nil { + // fspay = &gmodel.FsPay{ + // UserId: orderInfo.UserId, + // OrderNumber: orderInfo.Sn, + // CreatedAt: &nowAt, + // } + // } else { + // fspay.UpdatedAt = &nowAt + // } + // fspay.PayAmount = &payAmount + // fspay.PayStage = &payStage + // //fspay.TradeNo = &prepaymentRes.TradeNo + // fspay.PaymentMethod = &req.PayMethod + // fspay.OrderSource = &orderSource + // fspay.PayStatus = &payStatus - _, err = newFsPayModel.RBCreateOrUpdate(ctx, fspay) - if err != nil { - return err - } + // _, err = newFsPayModel.RBCreateOrUpdate(ctx, fspay) + // if err != nil { + // return err + // } - resData.RedirectUrl = prepaymentRes.URL - resData.ClientSecret = prepaymentRes.ClientSecret + // resData.RedirectUrl = prepaymentRes.URL + // resData.ClientSecret = prepaymentRes.ClientSecret - return nil - }) + // return nil + // }) - if err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to make payment") - } + // if err != nil { + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to make payment") + // } - return resp.SetStatusWithMessage(basic.CodeOK, "success", resData) + return resp.SetStatusWithMessage(basic.CodeOK, "success") } diff --git a/server/pay/internal/logic/stripewebhooklogic.go b/server/pay/internal/logic/stripewebhooklogic.go index e191b64b..05572894 100644 --- a/server/pay/internal/logic/stripewebhooklogic.go +++ b/server/pay/internal/logic/stripewebhooklogic.go @@ -1,13 +1,9 @@ package logic import ( - "encoding/json" - "errors" - "fusenapi/constants" "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" - "time" "context" @@ -15,9 +11,7 @@ import ( "fusenapi/server/pay/internal/types" "github.com/stripe/stripe-go/v74" - "github.com/stripe/stripe-go/v74/webhook" "github.com/zeromicro/go-zero/core/logx" - "gorm.io/gorm" ) type StripeWebhookLogic struct { @@ -48,97 +42,97 @@ func (l *StripeWebhookLogic) StripeWebhook(req *types.StripeWebhookReq, userinfo // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) // userinfo 传入值时, 一定不为null - stripe.Key = l.svcCtx.Config.PayConfig.Stripe.Key - event := stripe.Event{} + // stripe.Key = l.svcCtx.Config.PayConfig.Stripe.Key + // event := stripe.Event{} - if err := json.Unmarshal(req.Payload, &event); err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail") - } + // if err := json.Unmarshal(req.Payload, &event); err != nil { + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail") + // } - endpointSecret := l.svcCtx.Config.PayConfig.Stripe.EndpointSecret - signatureHeader := req.StripeSignature - event, err := webhook.ConstructEvent(req.Payload, signatureHeader, endpointSecret) - if err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "Webhook signature verification failed") - } + // endpointSecret := l.svcCtx.Config.PayConfig.Stripe.EndpointSecret + // signatureHeader := req.StripeSignature + // event, err := webhook.ConstructEvent(req.Payload, signatureHeader, endpointSecret) + // if err != nil { + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "Webhook signature verification failed") + // } - // 新增支付回调事件日志 - var payMethod = int64(constants.PAYMETHOD_STRIPE) - var nowTime = time.Now().UTC().Unix() - var eventData = string(event.Data.Raw) - var fsPayEvent = &gmodel.FsPayEvent{ - PayMethod: &payMethod, - EventId: &event.ID, - EventType: &event.Type, - EventData: &eventData, - EventCreated: &event.Created, - Ip: &req.RemoteAddr, - CreatedAt: &nowTime, - } - l.HandlePayEventCreate(fsPayEvent) + // // 新增支付回调事件日志 + // var payMethod = int64(constants.PAYMETHOD_STRIPE) + // var nowTime = time.Now().UTC().Unix() + // var eventData = string(event.Data.Raw) + // var fsPayEvent = &gmodel.FsPayEvent{ + // PayMethod: &payMethod, + // EventId: &event.ID, + // EventType: &event.Type, + // EventData: &eventData, + // EventCreated: &event.Created, + // Ip: &req.RemoteAddr, + // CreatedAt: &nowTime, + // } + // l.HandlePayEventCreate(fsPayEvent) - // Unmarshal the event data into an appropriate struct depending on its Type - switch event.Type { - case "charge.succeeded": - // var charge stripe.Charge - // err := json.Unmarshal(event.Data.Raw, &charge) - // if err != nil { - // logx.Error(err) - // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type charge.succeeded") - // } + // // Unmarshal the event data into an appropriate struct depending on its Type + // switch event.Type { + // case "charge.succeeded": + // // var charge stripe.Charge + // // err := json.Unmarshal(event.Data.Raw, &charge) + // // if err != nil { + // // logx.Error(err) + // // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type charge.succeeded") + // // } - case "checkout.session.completed": - // checkout checkout.session.completed 处理逻辑 - // var session stripe.CheckoutSession - // err := json.Unmarshal(event.Data.Raw, &session) - // if err != nil { - // logx.Error(err) - // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type payment_intent.succeeded") - // } - // fmt.Println("checkout.session.completed") - // err = l.handlePaymentSessionCompleted(session.ID, session.PaymentIntent.ID) - // if err != nil { - // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "checkout.session.completed fail") - // } - case "payment_intent.succeeded": - var paymentIntent stripe.PaymentIntent - err := json.Unmarshal(event.Data.Raw, &paymentIntent) - if err != nil { - logx.Errorf("err:%+v,desc:%s", err, "pay notify Unmarshal fail event.Type payment_intent.succeeded") - return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type payment_intent.succeeded") - } - err = l.HandlePaymentIntentSucceeded(&paymentIntent) - if err != nil { - logx.Errorf("err:%+v,desc:%s", err, "pay notify handle payment_intent.succeeded") - return resp.SetStatusWithMessage(basic.CodePaybackNotOk, "pay notify handle payment_intent.succeeded") - } - case "payment_method.attached": - var paymentMethod stripe.PaymentMethod - err := json.Unmarshal(event.Data.Raw, &paymentMethod) - if err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type payment_method.attached") - } - case "charge.refunded": - var chargeRefunded stripe.Charge - err := json.Unmarshal(event.Data.Raw, &chargeRefunded) - if err != nil { - logx.Errorf("err:%+v,desc:%s", err, "pay notify Unmarshal fail event.Type charge.refunded") - return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type charge.refunded") - } - err = l.HandleChargeRefunded(&chargeRefunded) - if err != nil { - logx.Errorf("err:%+v,desc:%s", err, "pay notify handle charge.refunded") - return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify handle charge.refunded") - } + // case "checkout.session.completed": + // // checkout checkout.session.completed 处理逻辑 + // // var session stripe.CheckoutSession + // // err := json.Unmarshal(event.Data.Raw, &session) + // // if err != nil { + // // logx.Error(err) + // // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type payment_intent.succeeded") + // // } + // // fmt.Println("checkout.session.completed") + // // err = l.handlePaymentSessionCompleted(session.ID, session.PaymentIntent.ID) + // // if err != nil { + // // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "checkout.session.completed fail") + // // } + // case "payment_intent.succeeded": + // var paymentIntent stripe.PaymentIntent + // err := json.Unmarshal(event.Data.Raw, &paymentIntent) + // if err != nil { + // logx.Errorf("err:%+v,desc:%s", err, "pay notify Unmarshal fail event.Type payment_intent.succeeded") + // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type payment_intent.succeeded") + // } + // err = l.HandlePaymentIntentSucceeded(&paymentIntent) + // if err != nil { + // logx.Errorf("err:%+v,desc:%s", err, "pay notify handle payment_intent.succeeded") + // return resp.SetStatusWithMessage(basic.CodePaybackNotOk, "pay notify handle payment_intent.succeeded") + // } + // case "payment_method.attached": + // var paymentMethod stripe.PaymentMethod + // err := json.Unmarshal(event.Data.Raw, &paymentMethod) + // if err != nil { + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type payment_method.attached") + // } + // case "charge.refunded": + // var chargeRefunded stripe.Charge + // err := json.Unmarshal(event.Data.Raw, &chargeRefunded) + // if err != nil { + // logx.Errorf("err:%+v,desc:%s", err, "pay notify Unmarshal fail event.Type charge.refunded") + // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type charge.refunded") + // } + // err = l.HandleChargeRefunded(&chargeRefunded) + // if err != nil { + // logx.Errorf("err:%+v,desc:%s", err, "pay notify handle charge.refunded") + // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify handle charge.refunded") + // } - // ... handle other event types - default: - logx.Error("Unhandled event") - return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type Unhandled") - } + // // ... handle other event types + // default: + // logx.Error("Unhandled event") + // return resp.SetStatusWithMessage(basic.CodeAesCbcDecryptionErr, "pay notify Unmarshal fail event.Type Unhandled") + // } return resp.SetStatus(basic.CodeOK) } @@ -151,62 +145,62 @@ func (l *StripeWebhookLogic) HandlePayEventCreate(fsPayEvent *gmodel.FsPayEvent) // 退款成功 func (l *StripeWebhookLogic) HandleChargeRefunded(chargeRefunded *stripe.Charge) (err error) { - // 退款成功 - if chargeRefunded.Status == "succeeded" { - ctx := l.ctx - err = l.svcCtx.MysqlConn.Transaction(func(connGorm *gorm.DB) error { - // 查询支付记录 - payModelT := gmodel.NewFsPayModel(connGorm) - payModelTRSB := payModelT.BuilderTrans(nil) - payModelTRSB1 := payModelTRSB.Where("trade_no = ?", chargeRefunded.PaymentIntent.ID).Where("pay_status = ?", constants.PAYSTATUS_SUCCESS).Where("is_refund = ?", 0) - payInfo, err := payModelT.FindOneByQuery(ctx, payModelTRSB1, nil) - if err != nil { - return err - } - // 更新支付记录 - *payInfo.IsRefund = 1 - _, err = payModelT.RBCreateOrUpdate(ctx, payInfo) - if err != nil { - return err - } - // 获取是否还有未退款的数据 - payModelTRSB2 := payModelTRSB.Where("order_number = ?", payInfo.OrderNumber).Where("pay_status = ?", constants.PAYSTATUS_SUCCESS).Where("is_refund = ?", 0) - count, err := payModelT.FindCount(l.ctx, payModelTRSB2, nil) - if count == 0 { - // 退款完成更新订单状态 - orderModelT := gmodel.NewFsOrderModel(connGorm) - orderModelTRSB := orderModelT.BuilderTrans(nil).Where("sn =?", payInfo.OrderNumber) - orderInfoRel, err := orderModelT.FindOneByQuery(ctx, orderModelTRSB, nil) - if err != nil { - return err - } - var isRefunded int64 = 1 - var isRefunding int64 = 1 - var orderStatus int64 = int64(constants.STATUS_NEW_REFUNDED) - var orderInfo = &gmodel.FsOrder{} - orderInfo.Id = orderInfoRel.Id - orderInfo.IsRefunded = &isRefunded - orderInfo.IsRefunding = &isRefunding - orderInfo.Status = &orderStatus - orderModelT.Update(ctx, orderInfo) + // // 退款成功 + // if chargeRefunded.Status == "succeeded" { + // ctx := l.ctx + // err = l.svcCtx.MysqlConn.Transaction(func(connGorm *gorm.DB) error { + // // 查询支付记录 + // payModelT := gmodel.NewFsPayModel(connGorm) + // payModelTRSB := payModelT.BuilderTrans(nil) + // payModelTRSB1 := payModelTRSB.Where("trade_no = ?", chargeRefunded.PaymentIntent.ID).Where("pay_status = ?", constants.PAYSTATUS_SUCCESS).Where("is_refund = ?", 0) + // payInfo, err := payModelT.FindOneByQuery(ctx, payModelTRSB1, nil) + // if err != nil { + // return err + // } + // // 更新支付记录 + // *payInfo.IsRefund = 1 + // _, err = payModelT.RBCreateOrUpdate(ctx, payInfo) + // if err != nil { + // return err + // } + // // 获取是否还有未退款的数据 + // payModelTRSB2 := payModelTRSB.Where("order_number = ?", payInfo.OrderNumber).Where("pay_status = ?", constants.PAYSTATUS_SUCCESS).Where("is_refund = ?", 0) + // count, err := payModelT.FindCount(l.ctx, payModelTRSB2, nil) + // if count == 0 { + // // 退款完成更新订单状态 + // orderModelT := gmodel.NewFsOrderModel(connGorm) + // orderModelTRSB := orderModelT.BuilderTrans(nil).Where("sn =?", payInfo.OrderNumber) + // orderInfoRel, err := orderModelT.FindOneByQuery(ctx, orderModelTRSB, nil) + // if err != nil { + // return err + // } + // var isRefunded int64 = 1 + // var isRefunding int64 = 1 + // var orderStatus int64 = int64(constants.STATUS_NEW_REFUNDED) + // var orderInfo = &gmodel.FsOrder{} + // orderInfo.Id = orderInfoRel.Id + // orderInfo.IsRefunded = &isRefunded + // orderInfo.IsRefunding = &isRefunding + // orderInfo.Status = &orderStatus + // orderModelT.Update(ctx, orderInfo) - // 记录退款原因 - refundReasonModelT := gmodel.NewFsRefundReasonModel(connGorm) - refundReasonModelTRSB := refundReasonModelT.BuilderTrans(nil) - refundReasonModelTRSB1 := refundReasonModelTRSB.Where("order_id =?", orderInfoRel.Id) - refundReasonInfo, err := refundReasonModelT.FindOneByQuery(ctx, refundReasonModelTRSB1, nil) - if err != nil { - return err - } - *refundReasonInfo.IsRefund = 1 - _, err = refundReasonModelT.RBCreateOrUpdate(ctx, refundReasonInfo) - if err != nil { - return err - } - } - return err - }) - } + // // 记录退款原因 + // refundReasonModelT := gmodel.NewFsRefundReasonModel(connGorm) + // refundReasonModelTRSB := refundReasonModelT.BuilderTrans(nil) + // refundReasonModelTRSB1 := refundReasonModelTRSB.Where("order_id =?", orderInfoRel.Id) + // refundReasonInfo, err := refundReasonModelT.FindOneByQuery(ctx, refundReasonModelTRSB1, nil) + // if err != nil { + // return err + // } + // *refundReasonInfo.IsRefund = 1 + // _, err = refundReasonModelT.RBCreateOrUpdate(ctx, refundReasonInfo) + // if err != nil { + // return err + // } + // } + // return err + // }) + // } return err } @@ -234,160 +228,160 @@ func (l *StripeWebhookLogic) HandleChargeRefunded(chargeRefunded *stripe.Charge) // 付款成功 func (l *StripeWebhookLogic) HandlePaymentIntentSucceeded(paymentIntent *stripe.PaymentIntent) error { - orderSn, ok := paymentIntent.Metadata["order_sn"] - if !ok || orderSn == "" { - return errors.New("order_sn not found") - } + // orderSn, ok := paymentIntent.Metadata["order_sn"] + // if !ok || orderSn == "" { + // return errors.New("order_sn not found") + // } - // 查询支付记录 - payModel := gmodel.NewFsPayModel(l.svcCtx.MysqlConn) - rsbPay := payModel.RowSelectBuilder(nil) - rsbPay = rsbPay.Where("order_number = ?", orderSn).Where("pay_status = ?", constants.PAYSTATUS_UNSUCCESS) - payInfo, err := payModel.FindOneByQuery(l.ctx, rsbPay, nil) - if err != nil { - return err - } + // // 查询支付记录 + // payModel := gmodel.NewFsPayModel(l.svcCtx.MysqlConn) + // rsbPay := payModel.RowSelectBuilder(nil) + // rsbPay = rsbPay.Where("order_number = ?", orderSn).Where("pay_status = ?", constants.PAYSTATUS_UNSUCCESS) + // payInfo, err := payModel.FindOneByQuery(l.ctx, rsbPay, nil) + // if err != nil { + // return err + // } - //订单信息 - orderDetailTemplateModel := gmodel.NewFsOrderDetailTemplateModel(l.svcCtx.MysqlConn) - orderModel := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn) - fsOrderDetailModel := gmodel.NewFsOrderDetailModel(l.svcCtx.MysqlConn) - fsProductDesignModel := gmodel.NewFsProductDesignModel(l.svcCtx.MysqlConn) + // //订单信息 + // orderDetailTemplateModel := gmodel.NewFsOrderDetailTemplateModel(l.svcCtx.MysqlConn) + // orderModel := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn) + // fsOrderDetailModel := gmodel.NewFsOrderDetailModel(l.svcCtx.MysqlConn) + // fsProductDesignModel := gmodel.NewFsProductDesignModel(l.svcCtx.MysqlConn) - rsbOrder := orderModel.RowSelectBuilder(nil) - rsbOrder = rsbOrder.Where("sn =?", orderSn).Preload("FsOrderDetails") - rsbOrder = rsbOrder.Preload("FsOrderDetails", func(dbPreload *gorm.DB) *gorm.DB { - return dbPreload.Table(fsOrderDetailModel.TableName()).Preload("FsOrderDetailTemplateInfo", func(dbPreload *gorm.DB) *gorm.DB { - return dbPreload.Table(orderDetailTemplateModel.TableName()).Preload("FsProductDesignInfo", func(dbPreload *gorm.DB) *gorm.DB { - return dbPreload.Table(fsProductDesignModel.TableName()) - }) - }) - }) - fsOrderRelInfo, err := orderModel.FindOneByQuery(l.ctx, rsbOrder, nil) - if err != nil { - return err - } + // rsbOrder := orderModel.RowSelectBuilder(nil) + // rsbOrder = rsbOrder.Where("sn =?", orderSn).Preload("FsOrderDetails") + // rsbOrder = rsbOrder.Preload("FsOrderDetails", func(dbPreload *gorm.DB) *gorm.DB { + // return dbPreload.Table(fsOrderDetailModel.TableName()).Preload("FsOrderDetailTemplateInfo", func(dbPreload *gorm.DB) *gorm.DB { + // return dbPreload.Table(orderDetailTemplateModel.TableName()).Preload("FsProductDesignInfo", func(dbPreload *gorm.DB) *gorm.DB { + // return dbPreload.Table(fsProductDesignModel.TableName()) + // }) + // }) + // }) + // fsOrderRelInfo, err := orderModel.FindOneByQuery(l.ctx, rsbOrder, nil) + // if err != nil { + // return err + // } - var designIds []int64 - var cartIds []int64 - if len(fsOrderRelInfo.FsOrderDetails) > 0 { - for _, fsOrderDetail := range fsOrderRelInfo.FsOrderDetails { - if fsOrderDetail.FsOrderDetailTemplateInfo.FsProductDesignInfo.Id != 0 { - designIds = append(designIds, fsOrderDetail.FsOrderDetailTemplateInfo.FsProductDesignInfo.Id) - } - cartIds = append(cartIds, *fsOrderDetail.CartId) - } - } + // var designIds []int64 + // var cartIds []int64 + // if len(fsOrderRelInfo.FsOrderDetails) > 0 { + // for _, fsOrderDetail := range fsOrderRelInfo.FsOrderDetails { + // if fsOrderDetail.FsOrderDetailTemplateInfo.FsProductDesignInfo.Id != 0 { + // designIds = append(designIds, fsOrderDetail.FsOrderDetailTemplateInfo.FsProductDesignInfo.Id) + // } + // cartIds = append(cartIds, *fsOrderDetail.CartId) + // } + // } - var nowTime int64 = time.Now().UTC().Unix() + // var nowTime int64 = time.Now().UTC().Unix() - // 支付成功 - if paymentIntent.Status == "succeeded" { - var card string - var brand string - if paymentIntent.LatestCharge.PaymentMethodDetails != nil { - if paymentIntent.LatestCharge.PaymentMethodDetails.Card != nil { - if paymentIntent.LatestCharge.PaymentMethodDetails.Card.Last4 != "" { - card = paymentIntent.LatestCharge.PaymentMethodDetails.Card.Last4 - } - if paymentIntent.LatestCharge.PaymentMethodDetails.Card.Brand != "" { - brand = string(paymentIntent.LatestCharge.PaymentMethodDetails.Card.Brand) - } - } - } + // // 支付成功 + // if paymentIntent.Status == "succeeded" { + // var card string + // var brand string + // if paymentIntent.LatestCharge.PaymentMethodDetails != nil { + // if paymentIntent.LatestCharge.PaymentMethodDetails.Card != nil { + // if paymentIntent.LatestCharge.PaymentMethodDetails.Card.Last4 != "" { + // card = paymentIntent.LatestCharge.PaymentMethodDetails.Card.Last4 + // } + // if paymentIntent.LatestCharge.PaymentMethodDetails.Card.Brand != "" { + // brand = string(paymentIntent.LatestCharge.PaymentMethodDetails.Card.Brand) + // } + // } + // } - ctx := l.ctx - err = l.svcCtx.MysqlConn.Transaction(func(connGorm *gorm.DB) error { - // 更新支付信息 - payModelT := gmodel.NewFsPayModel(connGorm) - *payInfo.PayStatus = 1 - *payInfo.PayTime = nowTime - *payInfo.CardNo = card - *payInfo.Brand = brand - *payInfo.TradeNo = paymentIntent.ID - _, err = payModelT.RBCreateOrUpdate(ctx, payInfo) - if err != nil { - return err - } + // ctx := l.ctx + // err = l.svcCtx.MysqlConn.Transaction(func(connGorm *gorm.DB) error { + // // 更新支付信息 + // payModelT := gmodel.NewFsPayModel(connGorm) + // *payInfo.PayStatus = 1 + // *payInfo.PayTime = nowTime + // *payInfo.CardNo = card + // *payInfo.Brand = brand + // *payInfo.TradeNo = paymentIntent.ID + // _, err = payModelT.RBCreateOrUpdate(ctx, payInfo) + // if err != nil { + // return err + // } - // 更新设计数据 - productDesignModelT := gmodel.NewFsProductDesignModel(connGorm) - productDesignModelTRSB := productDesignModelT.BuilderTrans(ctx, nil) - var isPay int64 = 1 - err = productDesignModelT.RBUpdateByIds(productDesignModelTRSB, designIds, &gmodel.FsProductDesign{IsPay: &isPay}) - if err != nil { - return err - } + // // 更新设计数据 + // productDesignModelT := gmodel.NewFsProductDesignModel(connGorm) + // productDesignModelTRSB := productDesignModelT.BuilderTrans(ctx, nil) + // var isPay int64 = 1 + // err = productDesignModelT.RBUpdateByIds(productDesignModelTRSB, designIds, &gmodel.FsProductDesign{IsPay: &isPay}) + // if err != nil { + // return err + // } - var orderInfo = &gmodel.FsOrder{} - var orderStatus int64 - var orderIsPartPay int64 - var orderPayedAmount int64 - var orderIsPayCompleted int64 - // 支付记录是首款 - if *payInfo.PayStage == int64(constants.PAYSTAGE_DEPOSIT) { - orderStatus = int64(constants.STATUS_NEW_PART_PAY) - orderIsPartPay = 1 - orderInfo.IsPartPay = &orderIsPartPay - orderPayedAmount = paymentIntent.Amount + // var orderInfo = &gmodel.FsOrder{} + // var orderStatus int64 + // var orderIsPartPay int64 + // var orderPayedAmount int64 + // var orderIsPayCompleted int64 + // // 支付记录是首款 + // if *payInfo.PayStage == int64(constants.PAYSTAGE_DEPOSIT) { + // orderStatus = int64(constants.STATUS_NEW_PART_PAY) + // orderIsPartPay = 1 + // orderInfo.IsPartPay = &orderIsPartPay + // orderPayedAmount = paymentIntent.Amount - // 删除购物车 - cartModelT := gmodel.NewFsCartModel(connGorm) - cartModelTRSB := cartModelT.BuilderTrans(ctx, nil) - err = cartModelT.RBDeleteCartsByIds(cartModelTRSB, cartIds) - if err != nil { - return err - } - } + // // 删除购物车 + // cartModelT := gmodel.NewFsCartModel(connGorm) + // cartModelTRSB := cartModelT.BuilderTrans(ctx, nil) + // err = cartModelT.RBDeleteCartsByIds(cartModelTRSB, cartIds) + // if err != nil { + // return err + // } + // } - // 支付记录是尾款 - if *payInfo.PayStage == int64(constants.PAYSTAGE_REMAINING) { - if *fsOrderRelInfo.Status < int64(constants.STATUS_NEW_PAY_COMPLETED) { - orderStatus = int64(constants.STATUS_NEW_PAY_COMPLETED) - } - orderIsPayCompleted = 1 - orderInfo.IsPayCompleted = &orderIsPayCompleted - orderPayedAmount = *fsOrderRelInfo.PayedAmount + paymentIntent.Amount - } + // // 支付记录是尾款 + // if *payInfo.PayStage == int64(constants.PAYSTAGE_REMAINING) { + // if *fsOrderRelInfo.Status < int64(constants.STATUS_NEW_PAY_COMPLETED) { + // orderStatus = int64(constants.STATUS_NEW_PAY_COMPLETED) + // } + // orderIsPayCompleted = 1 + // orderInfo.IsPayCompleted = &orderIsPayCompleted + // orderPayedAmount = *fsOrderRelInfo.PayedAmount + paymentIntent.Amount + // } - // 更新订单信息 - orderInfo.Id = fsOrderRelInfo.Id - orderInfo.Status = &orderStatus - orderInfo.Ptime = &nowTime - orderInfo.PayedAmount = &orderPayedAmount - orderModelT := gmodel.NewFsOrderModel(connGorm) - err = orderModelT.RBUpdate(ctx, orderInfo) - if err != nil { - return err - } - return err - }) - if err != nil { - return err - } + // // 更新订单信息 + // orderInfo.Id = fsOrderRelInfo.Id + // orderInfo.Status = &orderStatus + // orderInfo.Ptime = &nowTime + // orderInfo.PayedAmount = &orderPayedAmount + // orderModelT := gmodel.NewFsOrderModel(connGorm) + // err = orderModelT.RBUpdate(ctx, orderInfo) + // if err != nil { + // return err + // } + // return err + // }) + // if err != nil { + // return err + // } - //千人千面的处理 - // $renderServer = (new RenderService()); - // $renderServer->thousandsFacesV2($order->id); - // //清除用户最新的设计 - // $cache = \Yii::$app->cache; - // $cache->delete(CacheConfigHelper::LAST_DESIGN . $order->user_id); - // //缓存最新订单编号 - // $cache->set(CacheConfigHelper::USER_ORDERNO . $order->user_id, $order->sn); + // //千人千面的处理 + // // $renderServer = (new RenderService()); + // // $renderServer->thousandsFacesV2($order->id); + // // //清除用户最新的设计 + // // $cache = \Yii::$app->cache; + // // $cache->delete(CacheConfigHelper::LAST_DESIGN . $order->user_id); + // // //缓存最新订单编号 + // // $cache->set(CacheConfigHelper::USER_ORDERNO . $order->user_id, $order->sn); - // //查询用户邮箱信息 - // $user = \api\models\User::find()->where(['id' => $order->user_id])->one(); - // $redisData = [ - // 'key' => 'receipt_download', - // 'param' => [ - // 'email' => $user->email, - // 'order_id' => $order->id, - // 'pay_id' => $pay->id, - // 'type' => 1,//付款成功为1 - // ] - // ]; - // Email::timely($redisData); - } + // // //查询用户邮箱信息 + // // $user = \api\models\User::find()->where(['id' => $order->user_id])->one(); + // // $redisData = [ + // // 'key' => 'receipt_download', + // // 'param' => [ + // // 'email' => $user->email, + // // 'order_id' => $order->id, + // // 'pay_id' => $pay->id, + // // 'type' => 1,//付款成功为1 + // // ] + // // ]; + // // Email::timely($redisData); + // } // 订单记录 return nil diff --git a/server/product/internal/logic/getlastproductdesignlogic.go b/server/product/internal/logic/getlastproductdesignlogic.go index b99f2a90..2a7fc19c 100644 --- a/server/product/internal/logic/getlastproductdesignlogic.go +++ b/server/product/internal/logic/getlastproductdesignlogic.go @@ -2,11 +2,10 @@ package logic import ( "context" - "encoding/json" "errors" - "fusenapi/constants" "fusenapi/utils/auth" "fusenapi/utils/basic" + "gorm.io/gorm" "fusenapi/server/product/internal/svc" @@ -47,64 +46,64 @@ func (l *GetLastProductDesignLogic) GetLastProductDesign(req *types.Request, use return resp.SetStatusWithMessage(basic.CodeOK, "success:IsOpenRender switch is closed") } //查询用户最近下单成功的数据 - orderInfo, err := l.svcCtx.AllModels.FsOrder.FindLastSuccessOneOrder(l.ctx, user.Id, int64(constants.STATUS_NEW_NOT_PAY)) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "none of order is found") - } - logx.Error(err) - return resp.SetStatusAddMessage(basic.CodeDbSqlErr, "failed to get your last order") - } + // orderInfo, err := l.svcCtx.AllModels.FsOrder.FindLastSuccessOneOrder(l.ctx, user.Id, int64(constants.STATUS_NEW_NOT_PAY)) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "none of order is found") + // } + // logx.Error(err) + // return resp.SetStatusAddMessage(basic.CodeDbSqlErr, "failed to get your last order") + // } //获取该订单相关设计信息 - orderDetail, err := l.svcCtx.AllModels.FsOrderDetail.GetOneOrderDetailByOrderId(l.ctx, orderInfo.Id) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order detail is not found") - } - logx.Error(err) - return resp.SetStatusAddMessage(basic.CodeDbSqlErr, "failed to get order detail") - } - //获取设计模板详情,便于获得design_id - orderDetailTemplate, err := l.svcCtx.AllModels.FsOrderDetailTemplate.FindOne(l.ctx, *orderDetail.OrderDetailTemplateId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order detail template is not found") - } - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get order detail template") - } + // orderDetail, err := l.svcCtx.AllModels.FsOrderDetail.GetOneOrderDetailByOrderId(l.ctx, orderInfo.Id) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order detail is not found") + // } + // logx.Error(err) + // return resp.SetStatusAddMessage(basic.CodeDbSqlErr, "failed to get order detail") + // } + // //获取设计模板详情,便于获得design_id + // orderDetailTemplate, err := l.svcCtx.AllModels.FsOrderDetailTemplate.FindOne(l.ctx, *orderDetail.OrderDetailTemplateId) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order detail template is not found") + // } + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get order detail template") + // } //最后一次设计不存在,则不返回该设计相关数据 - if *orderDetailTemplate.DesignId <= 0 { - return resp.SetStatusWithMessage(basic.CodeOK, "success:last design id is not set") - } + // if *orderDetailTemplate.DesignId <= 0 { + // return resp.SetStatusWithMessage(basic.CodeOK, "success:last design id is not set") + // } //获取设计数据 - productDesign, err := l.svcCtx.AllModels.FsProductDesign.FindOne(l.ctx, *orderDetailTemplate.DesignId, user.Id) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "product design is not found") - } - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get product design") - } - var info interface{} - if productDesign.Info != nil && *productDesign.Info != "" { - if err := json.Unmarshal([]byte(*productDesign.Info), &info); err != nil { - logx.Error(err) - return nil - } - } - var logoColor interface{} - if productDesign.LogoColor != nil && *productDesign.LogoColor != "" { - if err := json.Unmarshal([]byte(*productDesign.LogoColor), &logoColor); err != nil { - logx.Error(err) - return nil - } - } + // productDesign, err := l.svcCtx.AllModels.FsProductDesign.FindOne(l.ctx, *orderDetailTemplate.DesignId, user.Id) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "product design is not found") + // } + // logx.Error(err) + // return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get product design") + // } + // var info interface{} + // if productDesign.Info != nil && *productDesign.Info != "" { + // if err := json.Unmarshal([]byte(*productDesign.Info), &info); err != nil { + // logx.Error(err) + // return nil + // } + // } + // var logoColor interface{} + // if productDesign.LogoColor != nil && *productDesign.LogoColor != "" { + // if err := json.Unmarshal([]byte(*productDesign.LogoColor), &logoColor); err != nil { + // logx.Error(err) + // return nil + // } + // } return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetLastProductDesignRsp{ - Id: productDesign.Id, - OptionalId: *productDesign.OptionalId, - SizeId: *productDesign.SizeId, - LogoColor: logoColor, - Info: info, + Id: 1, + OptionalId: 1, + SizeId: 1, + LogoColor: 1, + Info: nil, }) } diff --git a/server/product/internal/logic/getpricebypidlogic.go b/server/product/internal/logic/getpricebypidlogic.go index 4848af9b..025a9c33 100644 --- a/server/product/internal/logic/getpricebypidlogic.go +++ b/server/product/internal/logic/getpricebypidlogic.go @@ -8,10 +8,11 @@ import ( "fusenapi/utils/basic" "fusenapi/utils/format" "fusenapi/utils/step_price" - "gorm.io/gorm" "sort" "strings" + "gorm.io/gorm" + "context" "fusenapi/server/product/internal/svc" diff --git a/server/product/internal/logic/getproductinfologic.go b/server/product/internal/logic/getproductinfologic.go index 1a768d3c..7db20475 100644 --- a/server/product/internal/logic/getproductinfologic.go +++ b/server/product/internal/logic/getproductinfologic.go @@ -14,10 +14,11 @@ import ( "fusenapi/utils/format" "fusenapi/utils/image" "fusenapi/utils/step_price" - "gorm.io/gorm" "strconv" "strings" + "gorm.io/gorm" + "fusenapi/server/product/internal/svc" "fusenapi/server/product/internal/types" @@ -460,66 +461,66 @@ func (l *GetProductInfoLogic) getRenderDesign(clientNo string) interface{} { // 获取用户最新设计 func (l *GetProductInfoLogic) getLastDesign(userInfo gmodel.FsUser) interface{} { //查询用户最近下单成功的数据 - orderInfo, err := l.svcCtx.AllModels.FsOrder.FindLastSuccessOneOrder(l.ctx, userInfo.Id, int64(constants.STATUS_NEW_NOT_PAY)) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil - } - logx.Error(err) - return nil - } + // orderInfo, err := l.svcCtx.AllModels.FsOrder.FindLastSuccessOneOrder(l.ctx, userInfo.Id, int64(constants.STATUS_NEW_NOT_PAY)) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return nil + // } + // logx.Error(err) + // return nil + // } //获取该订单相关设计信息 - orderDetail, err := l.svcCtx.AllModels.FsOrderDetail.GetOneOrderDetailByOrderId(l.ctx, orderInfo.Id) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil - } - logx.Error(err) - return nil - } - //获取设计模板详情,便于获得design_id - orderDetailTemplate, err := l.svcCtx.AllModels.FsOrderDetailTemplate.FindOne(l.ctx, *orderDetail.OrderDetailTemplateId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil - } - logx.Error(err) - return nil - } + // orderDetail, err := l.svcCtx.AllModels.FsOrderDetail.GetOneOrderDetailByOrderId(l.ctx, orderInfo.Id) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return nil + // } + // logx.Error(err) + // return nil + // } + // //获取设计模板详情,便于获得design_id + // orderDetailTemplate, err := l.svcCtx.AllModels.FsOrderDetailTemplate.FindOne(l.ctx, *orderDetail.OrderDetailTemplateId) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return nil + // } + // logx.Error(err) + // return nil + // } //若没打开了个性化渲染按钮或者最后一次设计不存在,则不返回该设计相关数据 - if *userInfo.IsOpenRender != 1 || *orderDetailTemplate.DesignId <= 0 { - return nil - } - //获取设计数据 - productDesign, err := l.svcCtx.AllModels.FsProductDesign.FindOne(l.ctx, *orderDetailTemplate.DesignId, userInfo.Id) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil - } - logx.Error(err) - return nil - } - var info interface{} - if productDesign.Info != nil && *productDesign.Info != "" { - if err := json.Unmarshal([]byte(*productDesign.Info), &info); err != nil { - logx.Error(err) - return nil - } - } - var logoColor interface{} - if productDesign.LogoColor != nil && *productDesign.LogoColor != "" { - if err := json.Unmarshal([]byte(*productDesign.LogoColor), &logoColor); err != nil { - logx.Error(err) - return nil - } - } + // if *userInfo.IsOpenRender != 1 || *orderDetailTemplate.DesignId <= 0 { + // return nil + // } + // //获取设计数据 + // productDesign, err := l.svcCtx.AllModels.FsProductDesign.FindOne(l.ctx, *orderDetailTemplate.DesignId, userInfo.Id) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return nil + // } + // logx.Error(err) + // return nil + // } + // var info interface{} + // if productDesign.Info != nil && *productDesign.Info != "" { + // if err := json.Unmarshal([]byte(*productDesign.Info), &info); err != nil { + // logx.Error(err) + // return nil + // } + // } + // var logoColor interface{} + // if productDesign.LogoColor != nil && *productDesign.LogoColor != "" { + // if err := json.Unmarshal([]byte(*productDesign.LogoColor), &logoColor); err != nil { + // logx.Error(err) + // return nil + // } + // } return map[string]interface{}{ - "id": productDesign.Id, - "info": info, - "logo_color": logoColor, - "material_id": *productDesign.MaterialId, - "optional_id": *productDesign.OptionalId, - "size_id": *productDesign.SizeId, + "id": 1, + "info": 1, + "logo_color": 1, + "material_id": 1, + "optional_id": 1, + "size_id": 1, } } diff --git a/server/product/internal/logic/getrendersettingbypidlogic.go b/server/product/internal/logic/getrendersettingbypidlogic.go index 3529de22..94a2d546 100644 --- a/server/product/internal/logic/getrendersettingbypidlogic.go +++ b/server/product/internal/logic/getrendersettingbypidlogic.go @@ -2,14 +2,14 @@ package logic import ( "errors" - "fusenapi/constants" "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" "fusenapi/utils/color_list" - "gorm.io/gorm" "strings" + "gorm.io/gorm" + "context" "fusenapi/server/product/internal/svc" @@ -126,28 +126,28 @@ func (l *GetRenderSettingByPidLogic) checkRenderDesign(clientNo string) (bool, e // 查询是否存在最新设计 func (l *GetRenderSettingByPidLogic) checkLastDesignExists(userId int64) (bool, error) { //查询用户最近下单成功的数据 - orderInfo, err := l.svcCtx.AllModels.FsOrder.FindLastSuccessOneOrder(l.ctx, userId, int64(constants.STATUS_NEW_NOT_PAY)) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return false, nil - } - return false, err - } + // orderInfo, err := l.svcCtx.AllModels.FsOrder.FindLastSuccessOneOrder(l.ctx, userId, int64(constants.STATUS_NEW_NOT_PAY)) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return false, nil + // } + // return false, err + // } //获取该订单相关设计信息 - orderDetail, err := l.svcCtx.AllModels.FsOrderDetail.GetOneOrderDetailByOrderId(l.ctx, orderInfo.Id) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return false, nil - } - return false, err - } - //获取设计模板详情,便于获得design_id - orderDetailTemplate, err := l.svcCtx.AllModels.FsOrderDetailTemplate.FindOne(l.ctx, *orderDetail.OrderDetailTemplateId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return false, nil - } - return false, err - } - return *orderDetailTemplate.DesignId > 0, nil + // orderDetail, err := l.svcCtx.AllModels.FsOrderDetail.GetOneOrderDetailByOrderId(l.ctx, orderInfo.Id) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return false, nil + // } + // return false, err + // } + // //获取设计模板详情,便于获得design_id + // orderDetailTemplate, err := l.svcCtx.AllModels.FsOrderDetailTemplate.FindOne(l.ctx, *orderDetail.OrderDetailTemplateId) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return false, nil + // } + // return false, err + // } + return false, nil } diff --git a/server_api/basic.api b/server_api/basic.api index 7125abc4..3adb78df 100644 --- a/server_api/basic.api +++ b/server_api/basic.api @@ -33,11 +33,192 @@ type File { Data []byte `fsfile:"data"` } - // 统一分页 type Meta struct { TotalCount int64 `json:"totalCount"` PageCount int64 `json:"pageCount"` CurrentPage int `json:"currentPage"` PerPage int `json:"perPage"` +} + +type ProductLogoResource struct { + ResourceID string `json:"resource_id"` + ResourceType string `json:"resource_type"` + ResourceURL string `json:"resource_url"` + Metadata map[string]int64erface{} `json:"metadata"` +} +type ProductSnapshot struct { +} +type TemplateInfo struct { + TemplateJSON string `json:"template_json"` + TemplateTag string `json:"template_tag"` +} +type ModelInfo struct { + ModelJSON string `json:"model_json"` +} +type FittingInfo struct { + FittingJSON string `json:"fitting_json"` +} +type SizeInfo struct { + Inch string `json:"inch"` + Cm string `json:"cm"` +} +type UserDiyInformation struct { + Phone string `json:"phone"` + Address string `json:"address"` + Website string `json:"website"` + Qrcode string `json:"qrcode"` + Slogan string `json:"slogan"` +} +type Snapshot struct { + Logo string `json:"logo"` + CombineImage string `json:"combine_image"` + RenderImage string `json:"render_image"` + TemplateInfo TemplateInfo `json:"template_info"` + ModelInfo ModelInfo `json:"model_info"` + FittingInfo FittingInfo `json:"fitting_info"` + SizeInfo SizeInfo `json:"size_info"` + UserDiyInformation UserDiyInformation `json:"user_diy_information"` +} +type ShoppingCartSnapshot struct { + ID int64 `json:"id"` + UserID int64 `json:"user_id"` + ProductID int64 `json:"product_id"` + TemplateID int64 `json:"template_id"` + ModelID int64 `json:"model_id"` + SizeID int64 `json:"size_id"` + FittingID int64 `json:"fitting_id"` + PurchaseQuantity int64 `json:"purchase_quantity"` + Snapshot Snapshot `json:"snapshot"` + IsHighlyCustomized int64 `json:"is_highly_customized"` + Ctime string `json:"ctime"` + Utime string `json:"utime"` +} +type OrderProduct struct { + ProductID string `json:"product_id"` + ProductName string `json:"product_name"` + ProductPrice string `json:"product_price"` + ProductLogo string `json:"product_logo"` + ProductLogoResource ProductLogoResource `json:"product_logo_resource"` + ProductSnapshot ProductSnapshot `json:"product_snapshot"` + Number int64 `json:"number"` + Amount string `json:"amount"` + Unit string `json:"unit"` + ExpectedDeliveryTime string `json:"expected_delivery_time"` + ShoppingCartSnapshot ShoppingCartSnapshot `json:"shopping_cart_snapshot"` +} +type Children struct { +} +type Status struct { + StatusCode int64 `json:"status_code"` + StatusTitle string `json:"status_title"` + ExpectedTime string `json:"expected_time"` + Ctime string `json:"ctime"` + Utime string `json:"utime"` + Metadata map[string]int64erface{} `json:"metadata"` + Children []Children `json:"children"` +} +type OrderStatus struct { + StatusCode int64 `json:"status_code"` + StatusTitle string `json:"status_title"` + ExpectedTime string `json:"expected_time"` + Ctime string `json:"ctime"` + Utime string `json:"utime"` + Metadata map[string]int64erface{} `json:"metadata"` + Children []Children `json:"children"` +} +type OrderInfo struct { + OrderNo string `json:"order_no"` + DeliveryMethod int64 `json:"delivery_method"` + Ctime string `json:"ctime"` + Utime string `json:"utime"` + Status OrderStatus `json:"status"` + StatusLink []OrderStatus `json:"status_link"` + Metadata map[string]int64erface{} `json:"metadata"` +} +type Subtotal struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]int64erface{} `json:"metadata"` +} +type ShippingFee struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]int64erface{} `json:"metadata"` +} +type Tax struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]int64erface{} `json:"metadata"` +} +type Discount struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]int64erface{} `json:"metadata"` +} +type Total struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]int64erface{} `json:"metadata"` +} +type PayStatus struct { + StatusCode int64 `json:"status_code"` + StatusTitle string `json:"status_title"` + Metadata map[string]int64erface{} `json:"metadata"` +} + +type PayAmount struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]int64erface{} `json:"metadata"` +} +type Deposit struct { + TradeNo string `json:"trade_no"` + Status Status `json:"status"` + StatusLink []PayStatus `json:"status_link"` + PayTime string `json:"pay_time"` + PayAmount PayAmount `json:"pay_amount"` + PayMethod string `json:"pay_method"` + Metadata map[string]int64erface{} `json:"metadata"` +} +type RemainingBalance struct { + TradeNo string `json:"trade_no"` + Status PayStatus `json:"status"` + StatusLink []PayStatus `json:"status_link"` + PayTime string `json:"pay_time"` + PayAmount PayAmount `json:"pay_amount"` + PayMethod string `json:"pay_method"` + Metadata map[string]int64erface{} `json:"metadata"` +} +type OrderAmount struct { + Subtotal Subtotal `json:"subtotal"` + ShippingFee ShippingFee `json:"shipping_fee"` + Tax Tax `json:"tax"` + Discount Discount `json:"discount"` + Total Total `json:"total"` + Deposit Deposit `json:"deposit"` + RemainingBalance RemainingBalance `json:"remaining_balance"` +} +type DeliveryAddres struct { + Address string `json:"address"` + Name string `json:"name"` + Mobile string `json:"mobile"` } \ No newline at end of file diff --git a/server_api/orders.api b/server_api/orders.api new file mode 100644 index 00000000..cc0b11b1 --- /dev/null +++ b/server_api/orders.api @@ -0,0 +1,217 @@ +syntax = "v1" + +info ( + title: "订单模块" + desc: "订单相关" + author: "" + email: "" +) + +import "basic.api" + +service orders { + + @handler CreateOrderHandler + post /api/orders/create(CreateOrderReq) returns (response); + + @handler CreatePrePaymentHandler + post /api/orders/create-prepayment(OrderRefundReq) returns (response); + + @handler OrderListHandler + post /api/orders/list(OrderListReq) returns (response); + +} + +type CreateOrderReq struct { + CartIds []int64 `json:"cart_ids"` + DeliveryMethod string `json:"delivery_method"` +} + +type OrderRefundReq struct { + OrderNo string `json:"order_no"` + DeliveryMethod int64 `json:"delivery_method"` + DeliveryAddres DeliveryAddres `json:"delivery_addres"` +} +type DeliveryAddres struct { + Address string `json:"address"` + Name string `json:"name"` + Mobile string `json:"mobile"` +} + +type OrderDetail struct { + OrderProduct []OrderProduct `json:"order_product"` + OrderInfo OrderInfo `json:"order_info"` + OrderAmount OrderAmount `json:"order_amount"` + DeliveryAddres DeliveryAddres `json:"delivery_addres"` +} + +type ProductLogoResource struct { + ResourceID string `json:"resource_id"` + ResourceType string `json:"resource_type"` + ResourceURL string `json:"resource_url"` + Metadata map[string]interface{} `json:"metadata"` +} + +type TemplateInfo struct { + TemplateJSON string `json:"template_json"` + TemplateTag string `json:"template_tag"` +} +type ModelInfo struct { + ModelJSON string `json:"model_json"` +} +type FittingInfo struct { + FittingJSON string `json:"fitting_json"` +} +type SizeInfo struct { + Inch string `json:"inch"` + Cm string `json:"cm"` +} +type UserDiyInformation struct { + Phone string `json:"phone"` + Address string `json:"address"` + Website string `json:"website"` + Qrcode string `json:"qrcode"` + Slogan string `json:"slogan"` +} +type Snapshot struct { + Logo string `json:"logo"` + CombineImage string `json:"combine_image"` + RenderImage string `json:"render_image"` + TemplateInfo TemplateInfo `json:"template_info"` + ModelInfo ModelInfo `json:"model_info"` + FittingInfo FittingInfo `json:"fitting_info"` + SizeInfo SizeInfo `json:"size_info"` + UserDiyInformation UserDiyInformation `json:"user_diy_information"` +} +type ShoppingCartSnapshot struct { + ID int64 `json:"id"` + UserID int64 `json:"user_id"` + ProductID int64 `json:"product_id"` + TemplateID int64 `json:"template_id"` + ModelID int64 `json:"model_id"` + SizeID int64 `json:"size_id"` + FittingID int64 `json:"fitting_id"` + PurchaseQuantity int64 `json:"purchase_quantity"` + Snapshot Snapshot `json:"snapshot"` + IsHighlyCustomized int64 `json:"is_highly_customized"` + Ctime string `json:"ctime"` + Utime string `json:"utime"` +} +type OrderProduct struct { + ProductID string `json:"product_id"` + ProductName string `json:"product_name"` + ProductPrice string `json:"product_price"` + ProductLogo string `json:"product_logo"` + ProductLogoResource ProductLogoResource `json:"product_logo_resource"` + ProductSnapshot map[string]interface{} `json:"product_snapshot"` + Number int64 `json:"number"` + Amount string `json:"amount"` + Unit string `json:"unit"` + ExpectedDeliveryTime string `json:"expected_delivery_time"` + ShoppingCartSnapshot ShoppingCartSnapshot `json:"shopping_cart_snapshot"` +} + +type OrderStatus struct { + StatusCode int64 `json:"status_code"` + StatusTitle string `json:"status_title"` + ExpectedTime string `json:"expected_time"` + Ctime string `json:"ctime"` + Utime string `json:"utime"` + Metadata map[string]interface{} `json:"metadata"` + Children []*OrderStatus `json:"children"` +} +type OrderInfo struct { + OrderNo string `json:"order_no"` + DeliveryMethod int64 `json:"delivery_method"` + Ctime string `json:"ctime"` + Utime string `json:"utime"` + Status OrderStatus `json:"status"` + StatusLink []OrderStatus `json:"status_link"` + Metadata map[string]interface{} `json:"metadata"` +} +type Subtotal struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]interface{} `json:"metadata"` +} +type ShippingFee struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]interface{} `json:"metadata"` +} +type Tax struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]interface{} `json:"metadata"` +} +type Discount struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]interface{} `json:"metadata"` +} +type Total struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]interface{} `json:"metadata"` +} +type PayStatus struct { + StatusCode int64 `json:"status_code"` + StatusTitle string `json:"status_title"` + Metadata map[string]interface{} `json:"metadata"` +} + +type PayAmount struct { + Currency string `json:"currency"` + Current string `json:"current"` + Initiate string `json:"initiate"` + Change string `json:"change"` + ChangeRemark string `json:"change_remark"` + Metadata map[string]interface{} `json:"metadata"` +} +type Deposit struct { + TradeNo string `json:"trade_no"` + Status Status `json:"status"` + StatusLink []PayStatus `json:"status_link"` + PayTime string `json:"pay_time"` + PayAmount PayAmount `json:"pay_amount"` + PayMethod string `json:"pay_method"` + Metadata map[string]interface{} `json:"metadata"` +} +type RemainingBalance struct { + TradeNo string `json:"trade_no"` + Status PayStatus `json:"status"` + StatusLink []PayStatus `json:"status_link"` + PayTime string `json:"pay_time"` + PayAmount PayAmount `json:"pay_amount"` + PayMethod string `json:"pay_method"` + Metadata map[string]interface{} `json:"metadata"` +} +type OrderAmount struct { + Subtotal Subtotal `json:"subtotal"` + ShippingFee ShippingFee `json:"shipping_fee"` + Tax Tax `json:"tax"` + Discount Discount `json:"discount"` + Total Total `json:"total"` + Deposit Deposit `json:"deposit"` + RemainingBalance RemainingBalance `json:"remaining_balance"` +} +type DeliveryAddres struct { + Address string `json:"address"` + Name string `json:"name"` + Mobile string `json:"mobile"` +} From 5df0a0f18437cb6d66caef916741f88e49706be5 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 10:23:40 +0800 Subject: [PATCH 12/26] fix --- model/gmodel/fs_orders_trade_gen.go | 35 +++++++ model/gmodel/fs_orders_trade_logic.go | 2 + .../internal/logic/getcartslogic.go | 99 +------------------ server/shopping-cart/internal/types/types.go | 16 +-- server_api/shopping-cart.api | 16 +-- .../verify_shopping_cart_channged.go | 95 ++++++++++++++++++ 6 files changed, 152 insertions(+), 111 deletions(-) create mode 100644 model/gmodel/fs_orders_trade_gen.go create mode 100644 model/gmodel/fs_orders_trade_logic.go create mode 100644 utils/shopping_cart/verify_shopping_cart_channged.go diff --git a/model/gmodel/fs_orders_trade_gen.go b/model/gmodel/fs_orders_trade_gen.go new file mode 100644 index 00000000..4a5f4c17 --- /dev/null +++ b/model/gmodel/fs_orders_trade_gen.go @@ -0,0 +1,35 @@ +package gmodel + +import ( + "gorm.io/gorm" + "time" +) + +// fs_orders_trade 订单交易记录表 +type FsOrdersTrade struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // 订单交易ID + UserId *int64 `gorm:"index;default:0;" json:"user_id"` // 用户ID + OrderNo *string `gorm:"default:'';" json:"order_no"` // + OrderSource *string `gorm:"default:'';" json:"order_source"` // + TradeNo *string `gorm:"index;default:'';" json:"trade_no"` // + PayAmount *int64 `gorm:"default:0;" json:"pay_amount"` // 支付金额 (分) + PayStatus *int64 `gorm:"default:0;" json:"pay_status"` // 支付状态:1=未成功,2=已成功 + PaymentMethod *int64 `gorm:"default:0;" json:"payment_method"` // 支付方式:1=stripe,2=paypal + PayStage *int64 `gorm:"default:0;" json:"pay_stage"` // 支付阶段:1=首付,2=尾款 + RefundStatus *int64 `gorm:"default:0;" json:"refund_status"` // 退款状态:1=未退款,2=已退款 + CardNo *string `gorm:"default:'';" json:"card_no"` // + CardBrand *string `gorm:"default:'';" json:"card_brand"` // + Ctime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ctime"` // + Utime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"utime"` // + Country *string `gorm:"default:'';" json:"country"` // + Currency *string `gorm:"default:'';" json:"currency"` // + Metadata *[]byte `gorm:"default:'';" json:"metadata"` // +} +type FsOrdersTradeModel struct { + db *gorm.DB + name string +} + +func NewFsOrdersTradeModel(db *gorm.DB) *FsOrdersTradeModel { + return &FsOrdersTradeModel{db: db, name: "fs_orders_trade"} +} diff --git a/model/gmodel/fs_orders_trade_logic.go b/model/gmodel/fs_orders_trade_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_orders_trade_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index f28304c1..015b88fb 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -1,17 +1,13 @@ package logic import ( - "encoding/json" + "context" "fusenapi/constants" "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" - "fusenapi/utils/hash" "fusenapi/utils/shopping_cart" "math" - "strings" - - "context" "fusenapi/server/shopping-cart/internal/svc" "fusenapi/server/shopping-cart/internal/types" @@ -107,7 +103,7 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo //定义map收集变更信息 mapCartChange := make(map[int64]string) //校验购物车数据是否变更 - err = VerifyShoppingCartSnapshotDataChange(VerifyShoppingCartSnapshotDataChangeReq{ + err = shopping_cart.VerifyShoppingCartSnapshotDataChange(shopping_cart.VerifyShoppingCartSnapshotDataChangeReq{ Carts: carts, MapSize: mapSize, MapModel: mapModel, @@ -125,97 +121,6 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo return resp.SetStatus(basic.CodeOK) } -// 校验购物车快照数据跟目前是否一致 -type VerifyShoppingCartSnapshotDataChangeReq struct { - Carts []gmodel.FsShoppingCart - MapSize map[int64]gmodel.FsProductSize - MapModel map[int64]gmodel.FsProductModel3d //模型跟配件都在 - MapTemplate map[int64]gmodel.FsProductTemplateV2 - MapCartChange map[int64]string -} -type VerifyShoppingCartSnapshotDataChangeRsp struct { - CartId int64 //有改变的列表下标 - Descrption string //变更描述信息 -} - -func VerifyShoppingCartSnapshotDataChange(req VerifyShoppingCartSnapshotDataChangeReq) error { - for _, cartInfo := range req.Carts { - var snapShotParseInfo shopping_cart.CartSnapshot - if err := json.Unmarshal([]byte(*cartInfo.Snapshot), &snapShotParseInfo); err != nil { - return err - } - //快照中模板设计json数据哈希值 - snapshotTemplateJsonHash := hash.JsonHashKey(snapShotParseInfo.TemplateInfo.TemplateJson) - //快照中模型设计json数据哈希值 - snapshotModelJsonHash := hash.JsonHashKey(snapShotParseInfo.ModelInfo.ModelJson) - //快照中配件设计json数据哈希值 - snapshotFittingJsonHash := hash.JsonHashKey(snapShotParseInfo.FittingInfo.FittingJson) - descrptionBuilder := strings.Builder{} - //有模板验证模板相关 - if *cartInfo.TemplateId > 0 { - if curTemplateInfo, ok := req.MapTemplate[*cartInfo.TemplateId]; !ok { - descrptionBuilder.WriteString("

the template is lose

") - } else { - //当前模板设计json数据哈希值 - curTemplateJsonHash := hash.JsonHashKey(*curTemplateInfo.TemplateInfo) - //模板设计信息改变了 - if snapshotTemplateJsonHash != curTemplateJsonHash { - descrptionBuilder.WriteString("

the template design info has changed

") - } - //模板标签改变了 - if snapShotParseInfo.TemplateInfo.TemplateTag != *curTemplateInfo.TemplateTag { - descrptionBuilder.WriteString("

the template`s template tag has changed

") - } - } - } - //有模型验证模型相关 - if *cartInfo.ModelId > 0 { - if curModelInfo, ok := req.MapModel[*cartInfo.ModelId]; !ok { //不存在 - descrptionBuilder.WriteString("

the model is lose

") - } else { - //当前模型设计json数据哈希值 - curModelJsonHash := hash.JsonHashKey(*curModelInfo.ModelInfo) - if snapshotModelJsonHash != curModelJsonHash { - descrptionBuilder.WriteString("

the model design info has changed

") - } - } - } - //有配件验证配件相关 - if *cartInfo.FittingId > 0 { - if curFittingInfo, ok := req.MapModel[*cartInfo.FittingId]; !ok { //不存在 - descrptionBuilder.WriteString("

the fitting is lose

") - } else { - //当前配件设计json数据哈希值 - curFittingJsonHash := hash.JsonHashKey(*curFittingInfo.ModelInfo) - if snapshotFittingJsonHash != curFittingJsonHash { - descrptionBuilder.WriteString("

the fitting design info has changed

") - } - } - } - //验证尺寸相关 - if *cartInfo.SizeId > 0 { - curSize, ok := req.MapSize[*cartInfo.SizeId] - if !ok { - descrptionBuilder.WriteString("

the size is lose

") - } else { - var curSizeTitle shopping_cart.SizeInfo - if err := json.Unmarshal([]byte(*curSize.Title), &curSizeTitle); err != nil { - return err - } - if snapShotParseInfo.SizeInfo.Inch != curSizeTitle.Inch || snapShotParseInfo.SizeInfo.Cm != curSizeTitle.Cm { - descrptionBuilder.WriteString("

the size design info has changed

") - } - } - } - //收集错误 - descrption := descrptionBuilder.String() - if descrption != "" { - req.MapCartChange[cartInfo.Id] = descrption - } - } - return nil -} - // 处理逻辑后 w,r 如:重定向, resp 必须重新处理 // func (l *GetCartsLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { // // httpx.OkJsonCtx(r.Context(), w, resp) diff --git a/server/shopping-cart/internal/types/types.go b/server/shopping-cart/internal/types/types.go index fc3f605c..8fe8d2a2 100644 --- a/server/shopping-cart/internal/types/types.go +++ b/server/shopping-cart/internal/types/types.go @@ -44,13 +44,15 @@ type GetCartsRsp struct { } type CartItem struct { - ProductId int64 `json:"product_id"` //产品id - SizeInfo SizeInfo `json:"size_info"` //尺寸信息 - FittingInfo FittingInfo `json:"fitting_info"` //配件信息 - ItemPrice string `json:"item_price"` //单价 - TotalPrice string `json:"totalPrice"` //单价X数量=总价 - DiyInformation DiyInformation `json:"diy_information"` //diy信息 - StepNum []int64 `json:"step_num"` //阶梯数量 + ProductId int64 `json:"product_id"` //产品id + SizeInfo SizeInfo `json:"size_info"` //尺寸信息 + FittingInfo FittingInfo `json:"fitting_info"` //配件信息 + ItemPrice string `json:"item_price"` //单价 + TotalPrice string `json:"totalPrice"` //单价X数量=总价 + DiyInformation DiyInformation `json:"diy_information"` //diy信息 + StepNum []int64 `json:"step_num"` //阶梯数量 + IsInvalid bool `json:"is_invalid"` //是否无效 + InvalidDescription string `json:"invalid_description"` //无效原因 } type SizeInfo struct { diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index 3f1f19c5..7e96eebb 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -60,13 +60,15 @@ type GetCartsRsp { CartList []CartItem `json:"cart_list"` } type CartItem { - ProductId int64 `json:"product_id"` //产品id - SizeInfo SizeInfo `json:"size_info"` //尺寸信息 - FittingInfo FittingInfo `json:"fitting_info"` //配件信息 - ItemPrice string `json:"item_price"` //单价 - TotalPrice string `json:"totalPrice"` //单价X数量=总价 - DiyInformation DiyInformation `json:"diy_information"` //diy信息 - StepNum []int64 `json:"step_num"` //阶梯数量 + ProductId int64 `json:"product_id"` //产品id + SizeInfo SizeInfo `json:"size_info"` //尺寸信息 + FittingInfo FittingInfo `json:"fitting_info"` //配件信息 + ItemPrice string `json:"item_price"` //单价 + TotalPrice string `json:"totalPrice"` //单价X数量=总价 + DiyInformation DiyInformation `json:"diy_information"` //diy信息 + StepNum []int64 `json:"step_num"` //阶梯数量 + IsInvalid bool `json:"is_invalid"` //是否无效 + InvalidDescription string `json:"invalid_description"` //无效原因 } type SizeInfo { SizeId int64 `json:"size_id"` //尺寸id diff --git a/utils/shopping_cart/verify_shopping_cart_channged.go b/utils/shopping_cart/verify_shopping_cart_channged.go new file mode 100644 index 00000000..6863291b --- /dev/null +++ b/utils/shopping_cart/verify_shopping_cart_channged.go @@ -0,0 +1,95 @@ +package shopping_cart + +import ( + "encoding/json" + "fusenapi/model/gmodel" + "fusenapi/utils/hash" + "strings" +) + +// 校验购物车快照数据跟目前是否一致 +type VerifyShoppingCartSnapshotDataChangeReq struct { + Carts []gmodel.FsShoppingCart + MapSize map[int64]gmodel.FsProductSize + MapModel map[int64]gmodel.FsProductModel3d //模型跟配件都在 + MapTemplate map[int64]gmodel.FsProductTemplateV2 + MapCartChange map[int64]string +} + +func VerifyShoppingCartSnapshotDataChange(req VerifyShoppingCartSnapshotDataChangeReq) error { + for _, cartInfo := range req.Carts { + var snapShotParseInfo CartSnapshot + if err := json.Unmarshal([]byte(*cartInfo.Snapshot), &snapShotParseInfo); err != nil { + return err + } + //快照中模板设计json数据哈希值 + snapshotTemplateJsonHash := hash.JsonHashKey(snapShotParseInfo.TemplateInfo.TemplateJson) + //快照中模型设计json数据哈希值 + snapshotModelJsonHash := hash.JsonHashKey(snapShotParseInfo.ModelInfo.ModelJson) + //快照中配件设计json数据哈希值 + snapshotFittingJsonHash := hash.JsonHashKey(snapShotParseInfo.FittingInfo.FittingJson) + descrptionBuilder := strings.Builder{} + //有模板验证模板相关 + if *cartInfo.TemplateId > 0 { + if curTemplateInfo, ok := req.MapTemplate[*cartInfo.TemplateId]; !ok { + descrptionBuilder.WriteString("

the template is lose

") + } else { + //当前模板设计json数据哈希值 + curTemplateJsonHash := hash.JsonHashKey(*curTemplateInfo.TemplateInfo) + //模板设计信息改变了 + if snapshotTemplateJsonHash != curTemplateJsonHash { + descrptionBuilder.WriteString("

the template design info has changed

") + } + //模板标签改变了 + if snapShotParseInfo.TemplateInfo.TemplateTag != *curTemplateInfo.TemplateTag { + descrptionBuilder.WriteString("

the template`s template tag has changed

") + } + } + } + //有模型验证模型相关 + if *cartInfo.ModelId > 0 { + if curModelInfo, ok := req.MapModel[*cartInfo.ModelId]; !ok { //不存在 + descrptionBuilder.WriteString("

the model is lose

") + } else { + //当前模型设计json数据哈希值 + curModelJsonHash := hash.JsonHashKey(*curModelInfo.ModelInfo) + if snapshotModelJsonHash != curModelJsonHash { + descrptionBuilder.WriteString("

the model design info has changed

") + } + } + } + //有配件验证配件相关 + if *cartInfo.FittingId > 0 { + if curFittingInfo, ok := req.MapModel[*cartInfo.FittingId]; !ok { //不存在 + descrptionBuilder.WriteString("

the fitting is lose

") + } else { + //当前配件设计json数据哈希值 + curFittingJsonHash := hash.JsonHashKey(*curFittingInfo.ModelInfo) + if snapshotFittingJsonHash != curFittingJsonHash { + descrptionBuilder.WriteString("

the fitting design info has changed

") + } + } + } + //验证尺寸相关 + if *cartInfo.SizeId > 0 { + curSize, ok := req.MapSize[*cartInfo.SizeId] + if !ok { + descrptionBuilder.WriteString("

the size is lose

") + } else { + var curSizeTitle SizeInfo + if err := json.Unmarshal([]byte(*curSize.Title), &curSizeTitle); err != nil { + return err + } + if snapShotParseInfo.SizeInfo.Inch != curSizeTitle.Inch || snapShotParseInfo.SizeInfo.Cm != curSizeTitle.Cm { + descrptionBuilder.WriteString("

the size design info has changed

") + } + } + } + //收集错误 + descrption := descrptionBuilder.String() + if descrption != "" { + req.MapCartChange[cartInfo.Id] = descrption + } + } + return nil +} From dd13dcbf0d5264c03adc5861a02c91f4a691abb4 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 10:39:08 +0800 Subject: [PATCH 13/26] fix --- model/gmodel/fs_shopping_cart_logic.go | 5 +++++ .../canteen/internal/logic/getcanteendetaillogic.go | 2 +- .../internal/logic/savecanteentypeproductlogic.go | 2 +- .../internal/logic/getqrcodesetlistlogic.go | 2 +- .../internal/logic/getstandardlogolistlogic.go | 2 +- .../internal/logic/getmaplibrarylistlogic.go | 2 +- .../map-library/internal/logic/savemaplibrarylogic.go | 2 +- .../internal/logic/getlastproductdesignlogic.go | 2 +- .../product/internal/logic/getproductdesignlogic.go | 2 +- .../product/internal/logic/getsizebyproductlogic.go | 2 +- .../internal/logic/getsuccessrecommandlogic.go | 2 +- server/product/internal/logic/savedesignlogic.go | 2 +- .../shopping-cart/internal/logic/deletecartlogic.go | 11 ++++++++--- server/upload/internal/logic/uploadqrcodelogic.go | 2 +- 14 files changed, 25 insertions(+), 15 deletions(-) diff --git a/model/gmodel/fs_shopping_cart_logic.go b/model/gmodel/fs_shopping_cart_logic.go index 1f508ac9..bc5f4101 100644 --- a/model/gmodel/fs_shopping_cart_logic.go +++ b/model/gmodel/fs_shopping_cart_logic.go @@ -27,6 +27,11 @@ func (s *FsShoppingCartModel) Create(ctx context.Context, data *FsShoppingCart) return s.db.WithContext(ctx).Create(&data).Error } +// 删除 +func (s *FsShoppingCartModel) Delete(ctx context.Context, id, userId int64) error { + return s.db.WithContext(ctx).Where("user_id = ? and id = ?", userId, id).Delete(&FsShoppingCart{}).Error +} + // 更新 func (s *FsShoppingCartModel) Update(ctx context.Context, id, userId int64, data *FsShoppingCart) error { return s.db.WithContext(ctx).Where("user_id = ? and id = ?", userId, id).Updates(&data).Error diff --git a/server/canteen/internal/logic/getcanteendetaillogic.go b/server/canteen/internal/logic/getcanteendetaillogic.go index ea741565..95cd63aa 100644 --- a/server/canteen/internal/logic/getcanteendetaillogic.go +++ b/server/canteen/internal/logic/getcanteendetaillogic.go @@ -31,7 +31,7 @@ func NewGetCanteenDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) * // 获取餐厅详情 func (l *GetCanteenDetailLogic) GetCanteenDetail(req *types.GetCanteenDetailReq, userinfo *auth.UserInfo) (resp *basic.Response) { if userinfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "please login first") + return resp.SetStatusWithMessage(basic.CodeServiceErr, "please sign in first") } //获取餐厅类型数据 canteenTypeModel := gmodel.NewFsCanteenTypeModel(l.svcCtx.MysqlConn) diff --git a/server/canteen/internal/logic/savecanteentypeproductlogic.go b/server/canteen/internal/logic/savecanteentypeproductlogic.go index 2f1e9315..d66abf4d 100644 --- a/server/canteen/internal/logic/savecanteentypeproductlogic.go +++ b/server/canteen/internal/logic/savecanteentypeproductlogic.go @@ -32,7 +32,7 @@ func NewSaveCanteenTypeProductLogic(ctx context.Context, svcCtx *svc.ServiceCont // 保存餐厅类型的关联产品 func (l *SaveCanteenTypeProductLogic) SaveCanteenTypeProduct(req *types.SaveCanteenTypeProductReq, userinfo *auth.UserInfo) (resp *basic.Response) { if userinfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "please login first") + return resp.SetStatusWithMessage(basic.CodeServiceErr, "please sign in first") } if len(req.ProductList) == 0 { return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "product list can`t be empty") diff --git a/server/data-transfer/internal/logic/getqrcodesetlistlogic.go b/server/data-transfer/internal/logic/getqrcodesetlistlogic.go index 3b9215d4..e8395f9d 100644 --- a/server/data-transfer/internal/logic/getqrcodesetlistlogic.go +++ b/server/data-transfer/internal/logic/getqrcodesetlistlogic.go @@ -29,7 +29,7 @@ func NewGetQrCodeSetListLogic(ctx context.Context, svcCtx *svc.ServiceContext) * // 获取二维码配置列表 func (l *GetQrCodeSetListLogic) GetQrCodeSetList(req *types.Request, userinfo *auth.UserInfo) (resp *basic.Response) { if userinfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "please login first") + return resp.SetStatusWithMessage(basic.CodeServiceErr, "please sign in first") } qrCodeModel := gmodel.NewFsQrcodeSetModel(l.svcCtx.MysqlConn) qrCodeList, err := qrCodeModel.GetAll(l.ctx) diff --git a/server/data-transfer/internal/logic/getstandardlogolistlogic.go b/server/data-transfer/internal/logic/getstandardlogolistlogic.go index 4e946796..e4e9b814 100644 --- a/server/data-transfer/internal/logic/getstandardlogolistlogic.go +++ b/server/data-transfer/internal/logic/getstandardlogolistlogic.go @@ -29,7 +29,7 @@ func NewGetStandardLogoListLogic(ctx context.Context, svcCtx *svc2.ServiceContex // 获取标准logo列表 func (l *GetStandardLogoListLogic) GetStandardLogoList(req *types.Request, userinfo *auth.UserInfo) (resp *basic.Response) { if userinfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "please login first") + return resp.SetStatusWithMessage(basic.CodeServiceErr, "please sign in first") } standardLogoModel := gmodel.NewFsStandardLogoModel(l.svcCtx.MysqlConn) logoList, err := standardLogoModel.GetAll(l.ctx) diff --git a/server/map-library/internal/logic/getmaplibrarylistlogic.go b/server/map-library/internal/logic/getmaplibrarylistlogic.go index 1ecf5167..96f1d834 100644 --- a/server/map-library/internal/logic/getmaplibrarylistlogic.go +++ b/server/map-library/internal/logic/getmaplibrarylistlogic.go @@ -30,7 +30,7 @@ func NewGetMapLibraryListLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *GetMapLibraryListLogic) GetMapLibraryList(req *types.Request, userinfo *auth.UserInfo) (resp *basic.Response) { if userinfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "please login first") + return resp.SetStatusWithMessage(basic.CodeServiceErr, "please sign in first") } mapLibraryModel := gmodel.NewFsMapLibraryModel(l.svcCtx.MysqlConn) mapLibraryList, err := mapLibraryModel.GetAllEnabledList(l.ctx) diff --git a/server/map-library/internal/logic/savemaplibrarylogic.go b/server/map-library/internal/logic/savemaplibrarylogic.go index 0b23c40b..d9373903 100644 --- a/server/map-library/internal/logic/savemaplibrarylogic.go +++ b/server/map-library/internal/logic/savemaplibrarylogic.go @@ -46,7 +46,7 @@ func (l *SaveMapLibraryLogic) BeforeLogic(w http.ResponseWriter, r *http.Request func (l *SaveMapLibraryLogic) SaveMapLibrary(req *types.Request, userinfo *auth.UserInfo) (resp *basic.Response) { if userinfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "please login first") + return resp.SetStatusWithMessage(basic.CodeServiceErr, "please sign in first") } if len(l.bodyData) == 0 { diff --git a/server/product/internal/logic/getlastproductdesignlogic.go b/server/product/internal/logic/getlastproductdesignlogic.go index b99f2a90..562aa314 100644 --- a/server/product/internal/logic/getlastproductdesignlogic.go +++ b/server/product/internal/logic/getlastproductdesignlogic.go @@ -31,7 +31,7 @@ func NewGetLastProductDesignLogic(ctx context.Context, svcCtx *svc.ServiceContex func (l *GetLastProductDesignLogic) GetLastProductDesign(req *types.Request, userinfo *auth.UserInfo) (resp *basic.Response) { if !userinfo.IsUser() { - return resp.SetStatusAddMessage(basic.CodeUnAuth, "please login") + return resp.SetStatusAddMessage(basic.CodeUnAuth, "please sign in") } //获取用户信息 user, err := l.svcCtx.AllModels.FsUser.FindUserById(l.ctx, userinfo.UserId) diff --git a/server/product/internal/logic/getproductdesignlogic.go b/server/product/internal/logic/getproductdesignlogic.go index 8882bec3..8a2e9fad 100644 --- a/server/product/internal/logic/getproductdesignlogic.go +++ b/server/product/internal/logic/getproductdesignlogic.go @@ -31,7 +31,7 @@ func NewGetProductDesignLogic(ctx context.Context, svcCtx *svc.ServiceContext) * func (l *GetProductDesignLogic) GetProductDesign(req *types.GetProductDesignReq, userinfo *auth.UserInfo) (resp *basic.Response) { if userinfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeUnAuth, "please login first") + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in first") } if req.Sn == "" { return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "param sn is required") diff --git a/server/product/internal/logic/getsizebyproductlogic.go b/server/product/internal/logic/getsizebyproductlogic.go index dea0a181..5e88ef39 100644 --- a/server/product/internal/logic/getsizebyproductlogic.go +++ b/server/product/internal/logic/getsizebyproductlogic.go @@ -35,7 +35,7 @@ func NewGetSizeByProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) * // 获取分类下的产品以及尺寸 func (l *GetSizeByProductLogic) GetSizeByProduct(req *types.Request, userinfo *auth.UserInfo) (resp *basic.Response) { if userinfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeUnAuth, "please login first") + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in first") } //获取所有网站目录 tagsModel := gmodel.NewFsTagsModel(l.svcCtx.MysqlConn) diff --git a/server/product/internal/logic/getsuccessrecommandlogic.go b/server/product/internal/logic/getsuccessrecommandlogic.go index 601f7dab..67f6902c 100644 --- a/server/product/internal/logic/getsuccessrecommandlogic.go +++ b/server/product/internal/logic/getsuccessrecommandlogic.go @@ -30,7 +30,7 @@ func NewGetSuccessRecommandLogic(ctx context.Context, svcCtx *svc.ServiceContext // 获取推荐的产品列表 func (l *GetSuccessRecommandLogic) GetSuccessRecommand(req *types.GetSuccessRecommandReq, userInfo *auth.UserInfo) (resp *basic.Response) { if userInfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeUnAuth, "please login first") + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in first") } //获取用户信息 userModel := gmodel.NewFsUserModel(l.svcCtx.MysqlConn) diff --git a/server/product/internal/logic/savedesignlogic.go b/server/product/internal/logic/savedesignlogic.go index 55fa1322..4894f508 100644 --- a/server/product/internal/logic/savedesignlogic.go +++ b/server/product/internal/logic/savedesignlogic.go @@ -47,7 +47,7 @@ func NewSaveDesignLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SaveDe func (l *SaveDesignLogic) SaveDesign(req *types.SaveDesignReq, userinfo *auth.UserInfo) (resp *basic.Response) { if userinfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeUnAuth, "please login first") + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in first") } //查询是否是加密的(不太合理) encryptWebsetting, err := l.svcCtx.AllModels.FsWebSet.FindValueByKey(l.ctx, "is_encrypt") diff --git a/server/shopping-cart/internal/logic/deletecartlogic.go b/server/shopping-cart/internal/logic/deletecartlogic.go index 865a811f..4c1bc37b 100644 --- a/server/shopping-cart/internal/logic/deletecartlogic.go +++ b/server/shopping-cart/internal/logic/deletecartlogic.go @@ -31,9 +31,14 @@ func NewDeleteCartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Delete // } func (l *DeleteCartLogic) DeleteCart(req *types.DeleteCartReq, userinfo *auth.UserInfo) (resp *basic.Response) { - // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) - // userinfo 传入值时, 一定不为null - + if !userinfo.IsUser() { + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in") + } + //删除购物车 + if err := l.svcCtx.AllModels.FsShoppingCart.Delete(l.ctx, userinfo.UserId, req.Id); err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to delete shopping cart") + } return resp.SetStatus(basic.CodeOK) } diff --git a/server/upload/internal/logic/uploadqrcodelogic.go b/server/upload/internal/logic/uploadqrcodelogic.go index f3242661..e8328640 100644 --- a/server/upload/internal/logic/uploadqrcodelogic.go +++ b/server/upload/internal/logic/uploadqrcodelogic.go @@ -32,7 +32,7 @@ func NewUploadQrcodeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Uplo func (l *UploadQrcodeLogic) UploadQrcode(req *types.UploadQrcodeReq, userinfo *auth.UserInfo) (resp *basic.Response) { if userinfo.GetIdType() != auth.IDTYPE_User { - return resp.SetStatusWithMessage(basic.CodeServiceErr, "please login first") + return resp.SetStatusWithMessage(basic.CodeServiceErr, "please sign in first") } if req.Url == "" { resp.SetStatus(basic.CodeApiErr, "param url is empty") From fd16d6ac67893bf7fcee1cb69b04bf36fece9901 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 14:19:14 +0800 Subject: [PATCH 14/26] fix --- model/gmodel/fs_shopping_cart_logic.go | 12 +- .../internal/logic/addtocartlogic.go | 11 +- .../internal/logic/deletecartlogic.go | 1 + .../internal/logic/getcartslogic.go | 106 +++++++++++++++++- .../logic/modifycartpurchasequantitylogic.go | 1 + server/shopping-cart/internal/types/types.go | 8 +- server_api/shopping-cart.api | 7 +- utils/shopping_cart/shopping_cart_snapshot.go | 6 +- .../verify_shopping_cart_channged.go | 2 + 9 files changed, 136 insertions(+), 18 deletions(-) diff --git a/model/gmodel/fs_shopping_cart_logic.go b/model/gmodel/fs_shopping_cart_logic.go index bc5f4101..cc833471 100644 --- a/model/gmodel/fs_shopping_cart_logic.go +++ b/model/gmodel/fs_shopping_cart_logic.go @@ -24,22 +24,22 @@ func (s *FsShoppingCartModel) FineOneUserCart(ctx context.Context, id, userId in // 创建 func (s *FsShoppingCartModel) Create(ctx context.Context, data *FsShoppingCart) error { - return s.db.WithContext(ctx).Create(&data).Error + return s.db.WithContext(ctx).Model(&FsShoppingCart{}).Create(&data).Error } // 删除 func (s *FsShoppingCartModel) Delete(ctx context.Context, id, userId int64) error { - return s.db.WithContext(ctx).Where("user_id = ? and id = ?", userId, id).Delete(&FsShoppingCart{}).Error + return s.db.WithContext(ctx).Model(&FsShoppingCart{}).Where("user_id = ? and id = ?", userId, id).Delete(&FsShoppingCart{}).Error } // 更新 func (s *FsShoppingCartModel) Update(ctx context.Context, id, userId int64, data *FsShoppingCart) error { - return s.db.WithContext(ctx).Where("user_id = ? and id = ?", userId, id).Updates(&data).Error + return s.db.WithContext(ctx).Model(&FsShoppingCart{}).Where("user_id = ? and id = ?", userId, id).Updates(&data).Error } // 获取用户购物车数量 func (s *FsShoppingCartModel) CountUserCart(ctx context.Context, userId int64) (total int64, err error) { - err = s.db.WithContext(ctx).Where("user_id = ?", userId).Limit(1).Count(&total).Error + err = s.db.WithContext(ctx).Model(&FsShoppingCart{}).Where("user_id = ?", userId).Limit(1).Count(&total).Error return total, err } @@ -48,7 +48,7 @@ func (s *FsShoppingCartModel) GetAllByIds(ctx context.Context, ids []int64, sort if len(ids) == 0 { return } - db := s.db.WithContext(ctx).Where("id in (?)", ids) + db := s.db.WithContext(ctx).Model(&FsShoppingCart{}).Where("id in (?)", ids) if len(fields) > 0 { db = db.Select(fields[0]) } @@ -70,7 +70,7 @@ type GetAllCartsByParamReq struct { } func (s *FsShoppingCartModel) GetAllCartsByParam(ctx context.Context, req GetAllCartsByParamReq) (resp []FsShoppingCart, total int64, err error) { - db := s.db.WithContext(ctx) + db := s.db.WithContext(ctx).Model(&FsShoppingCart{}) if req.UserId > 0 { db = db.Where("user_id = ?", req.UserId) } diff --git a/server/shopping-cart/internal/logic/addtocartlogic.go b/server/shopping-cart/internal/logic/addtocartlogic.go index 6194aea9..a82d7d7a 100644 --- a/server/shopping-cart/internal/logic/addtocartlogic.go +++ b/server/shopping-cart/internal/logic/addtocartlogic.go @@ -36,6 +36,7 @@ func NewAddToCartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AddToCa // } func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserInfo) (resp *basic.Response) { + userinfo.UserId = 39 if !userinfo.IsUser() { return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in") } @@ -65,6 +66,7 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI templateJson string //模板表的记录中的json设计信息 templateTag string //模板表的模板标签 fittingJson string //配件的json设计信息 + fittingName string //配件名 ) //有模板 if req.TemplateId > 0 { @@ -105,6 +107,7 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "the fitting`s design info is empty") } fittingJson = *fittingInfo.ModelInfo + fittingName = *fittingInfo.Title } //获取尺寸信息 sizeInfo, err := l.svcCtx.AllModels.FsProductSize.FindOne(l.ctx, req.SizeId) @@ -138,11 +141,12 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI if modelInfo.ModelInfo == nil || *modelInfo.ModelInfo == "" { return resp.SetStatusWithMessage(basic.CodeServiceErr, "the model`s design info is empty") } - var sizeTitleInfo shopping_cart.SizeInfo - if err = json.Unmarshal([]byte(*sizeInfo.Title), &sizeTitleInfo); err != nil { + var sizeKeyInfo shopping_cart.SizeInfo + if err = json.Unmarshal([]byte(*sizeInfo.Title), &sizeKeyInfo); err != nil { logx.Error(err) return resp.SetStatusWithMessage(basic.CodeJsonErr, "failed to parse size info`s title ") } + sizeKeyInfo.Capacity = *sizeInfo.Capacity //快照数据 snapshot := shopping_cart.CartSnapshot{ Logo: req.Logo, @@ -157,8 +161,9 @@ func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserI }, FittingInfo: shopping_cart.FittingInfo{ FittingJson: fittingJson, + FittingName: fittingName, }, - SizeInfo: sizeTitleInfo, + SizeInfo: sizeKeyInfo, ProductInfo: shopping_cart.ProductInfo{ ProductName: *productInfo.Title, ProductSn: *productInfo.Sn, diff --git a/server/shopping-cart/internal/logic/deletecartlogic.go b/server/shopping-cart/internal/logic/deletecartlogic.go index 4c1bc37b..d868d52e 100644 --- a/server/shopping-cart/internal/logic/deletecartlogic.go +++ b/server/shopping-cart/internal/logic/deletecartlogic.go @@ -31,6 +31,7 @@ func NewDeleteCartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Delete // } func (l *DeleteCartLogic) DeleteCart(req *types.DeleteCartReq, userinfo *auth.UserInfo) (resp *basic.Response) { + userinfo.UserId = 39 if !userinfo.IsUser() { return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in") } diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index 015b88fb..204836a9 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -2,12 +2,16 @@ package logic import ( "context" + "fmt" "fusenapi/constants" "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" + "fusenapi/utils/format" "fusenapi/utils/shopping_cart" + "fusenapi/utils/step_price" "math" + "strings" "fusenapi/server/shopping-cart/internal/svc" "fusenapi/server/shopping-cart/internal/types" @@ -34,6 +38,7 @@ func NewGetCartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCarts // } func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo) (resp *basic.Response) { + userinfo.UserId = 39 if req.CurrentPage <= 0 { req.CurrentPage = constants.DEFAULT_PAGE } @@ -102,6 +107,7 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo } //定义map收集变更信息 mapCartChange := make(map[int64]string) + mapSnapshot := make(map[int64]shopping_cart.CartSnapshot) //校验购物车数据是否变更 err = shopping_cart.VerifyShoppingCartSnapshotDataChange(shopping_cart.VerifyShoppingCartSnapshotDataChangeReq{ Carts: carts, @@ -109,16 +115,106 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo MapModel: mapModel, MapTemplate: mapTemplate, MapCartChange: mapCartChange, + MapSnapshot: mapSnapshot, }) if err != nil { logx.Error("VerifyShoppingCartSnapshotDataChange err:", err.Error()) return resp.SetStatusWithMessage(basic.CodeServiceErr, "system err:failed to check shopping cart change data") } - /*list := make([]types.CartItem, 0, lenCarts) - for index := range carts { - - }*/ - return resp.SetStatus(basic.CodeOK) + //根据sizeid获取价格列表 + priceList, err := l.svcCtx.AllModels.FsProductPrice.GetPriceListBySizeIds(l.ctx, sizeIds) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get cart`s product price list") + } + mapSizePrice := make(map[int64]gmodel.FsProductPrice) + for _, v := range priceList { + mapSizePrice[*v.SizeId] = v + } + list := make([]types.CartItem, 0, lenCarts) + for _, cart := range carts { + snapShot := mapSnapshot[cart.Id] + sizePrice, ok := mapSizePrice[*cart.SizeId] + if !ok { + return resp.SetStatusWithMessage(basic.CodeServiceErr, fmt.Sprintf("the size`s price info is not exists:%d", *cart.SizeId)) + } + //阶梯数量切片 + stepNum, err := format.StrSlicToIntSlice(strings.Split(*sizePrice.StepNum, ",")) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeServiceErr, fmt.Sprintf("failed to parse step number:%d", *cart.SizeId)) + } + lenStepNum := len(stepNum) + //阶梯价格切片 + stepPrice, err := format.StrSlicToIntSlice(strings.Split(*sizePrice.StepPrice, ",")) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeServiceErr, fmt.Sprintf("failed to parse step price:%d", *cart.SizeId)) + } + lenStepPrice := len(stepPrice) + if lenStepPrice == 0 || lenStepNum == 0 { + return resp.SetStatusWithMessage(basic.CodeServiceErr, fmt.Sprintf("step price or step number is not set:%d ", *cart.SizeId)) + } + //购买箱数 + boxQuantity := int(math.Ceil(float64(*cart.PurchaseQuantity) / float64(*sizePrice.EachBoxNum))) + //获取阶梯数量 + stepQuantityList := make([]types.StepNumItem, 0, 10) + tmpMinBuyNum := *sizePrice.MinBuyNum + for tmpMinBuyNum < (int64(stepNum[lenStepNum-1]) + 5) { + //阶梯数 + tmpQuantity := tmpMinBuyNum * (*sizePrice.EachBoxNum) + stepQuantityList = append(stepQuantityList, types.StepNumItem{ + PurchaseQuantity: tmpQuantity, + IsSelected: *cart.PurchaseQuantity == tmpQuantity, + }) + tmpMinBuyNum++ + } + //根据数量获取阶梯价格中对应的价格 + itemPrice := step_price.GetStepPrice(boxQuantity, stepNum, stepPrice) + totalPrice := itemPrice * float64(*cart.PurchaseQuantity) + item := types.CartItem{ + ProductId: *cart.ProductId, + SizeInfo: types.SizeInfo{ + SizeId: *cart.SizeId, + Capacity: snapShot.SizeInfo.Capacity, + Title: types.SizeTitle{ + Cm: snapShot.SizeInfo.Cm, + Inch: snapShot.SizeInfo.Inch, + }, + }, + FittingInfo: types.FittingInfo{ + FittingId: *cart.FittingId, + FittingName: snapShot.FittingInfo.FittingName, + }, + ItemPrice: fmt.Sprintf("%.3f", itemPrice), + TotalPrice: fmt.Sprintf("%.3f", totalPrice), + DiyInformation: types.DiyInformation{ + Phone: snapShot.UserDiyInformation.Phone, + Address: snapShot.UserDiyInformation.Address, + Website: snapShot.UserDiyInformation.Website, + Qrcode: snapShot.UserDiyInformation.Qrcode, + Slogan: snapShot.UserDiyInformation.Slogan, + }, + StepNum: stepQuantityList, + IsInvalid: false, + InvalidDescription: "", + } + //是否有失效的 + if description, ok := mapCartChange[cart.Id]; ok { + item.IsInvalid = true + item.InvalidDescription = description + } + list = append(list, item) + } + return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetCartsRsp{ + Meta: types.Meta{ + TotalCount: total, + PageCount: int64(math.Ceil(float64(total) / float64(limit))), + CurrentPage: req.CurrentPage, + PerPage: limit, + }, + CartList: list, + }) } // 处理逻辑后 w,r 如:重定向, resp 必须重新处理 diff --git a/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go b/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go index b78dd2e8..916f85da 100644 --- a/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go +++ b/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go @@ -34,6 +34,7 @@ func NewModifyCartPurchaseQuantityLogic(ctx context.Context, svcCtx *svc.Service // } func (l *ModifyCartPurchaseQuantityLogic) ModifyCartPurchaseQuantity(req *types.ModifyCartPurchaseQuantityReq, userinfo *auth.UserInfo) (resp *basic.Response) { + userinfo.UserId = 39 if !userinfo.IsUser() { return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in") } diff --git a/server/shopping-cart/internal/types/types.go b/server/shopping-cart/internal/types/types.go index 8fe8d2a2..7ee9b52d 100644 --- a/server/shopping-cart/internal/types/types.go +++ b/server/shopping-cart/internal/types/types.go @@ -50,11 +50,16 @@ type CartItem struct { ItemPrice string `json:"item_price"` //单价 TotalPrice string `json:"totalPrice"` //单价X数量=总价 DiyInformation DiyInformation `json:"diy_information"` //diy信息 - StepNum []int64 `json:"step_num"` //阶梯数量 + StepNum []StepNumItem `json:"step_num"` //阶梯数量 IsInvalid bool `json:"is_invalid"` //是否无效 InvalidDescription string `json:"invalid_description"` //无效原因 } +type StepNumItem struct { + PurchaseQuantity int64 `json:"purchase_quantity"` //数量 + IsSelected bool `json:"is_selected"` //是否选中 +} + type SizeInfo struct { SizeId int64 `json:"size_id"` //尺寸id Capacity string `json:"capacity"` //尺寸名称 @@ -76,6 +81,7 @@ type DiyInformation struct { Address string `json:"address"` Website string `json:"website"` Qrcode string `json:"qrcode"` + Slogan string `json:"slogan"` } type Request struct { diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index 7e96eebb..15bb5c98 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -66,10 +66,14 @@ type CartItem { ItemPrice string `json:"item_price"` //单价 TotalPrice string `json:"totalPrice"` //单价X数量=总价 DiyInformation DiyInformation `json:"diy_information"` //diy信息 - StepNum []int64 `json:"step_num"` //阶梯数量 + StepNum []StepNumItem `json:"step_num"` //阶梯数量 IsInvalid bool `json:"is_invalid"` //是否无效 InvalidDescription string `json:"invalid_description"` //无效原因 } +type StepNumItem { + PurchaseQuantity int64 `json:"purchase_quantity"` //数量 + IsSelected bool `json:"is_selected"` //是否选中 +} type SizeInfo { SizeId int64 `json:"size_id"` //尺寸id Capacity string `json:"capacity"` //尺寸名称 @@ -88,4 +92,5 @@ type DiyInformation { Address string `json:"address"` Website string `json:"website"` Qrcode string `json:"qrcode"` + Slogan string `json:"slogan"` } \ No newline at end of file diff --git a/utils/shopping_cart/shopping_cart_snapshot.go b/utils/shopping_cart/shopping_cart_snapshot.go index b0ab5797..07df7c9c 100644 --- a/utils/shopping_cart/shopping_cart_snapshot.go +++ b/utils/shopping_cart/shopping_cart_snapshot.go @@ -21,14 +21,16 @@ type ModelInfo struct { } type FittingInfo struct { FittingJson string `json:"fitting_json"` //配件设计json数据 + FittingName string `json:"fitting_name"` //配件名称 } type TemplateInfo struct { TemplateJson string `json:"template_json"` //模板设计json数据 TemplateTag string `json:"template_tag"` //模板标签 } type SizeInfo struct { - Inch string `json:"inch"` - Cm string `json:"cm"` + Inch string `json:"inch"` + Cm string `json:"cm"` + Capacity string `json:"capacity"` } type UserDiyInformation struct { Phone string `json:"phone"` //电话 diff --git a/utils/shopping_cart/verify_shopping_cart_channged.go b/utils/shopping_cart/verify_shopping_cart_channged.go index 6863291b..d237e5ec 100644 --- a/utils/shopping_cart/verify_shopping_cart_channged.go +++ b/utils/shopping_cart/verify_shopping_cart_channged.go @@ -14,6 +14,7 @@ type VerifyShoppingCartSnapshotDataChangeReq struct { MapModel map[int64]gmodel.FsProductModel3d //模型跟配件都在 MapTemplate map[int64]gmodel.FsProductTemplateV2 MapCartChange map[int64]string + MapSnapshot map[int64]CartSnapshot } func VerifyShoppingCartSnapshotDataChange(req VerifyShoppingCartSnapshotDataChangeReq) error { @@ -22,6 +23,7 @@ func VerifyShoppingCartSnapshotDataChange(req VerifyShoppingCartSnapshotDataChan if err := json.Unmarshal([]byte(*cartInfo.Snapshot), &snapShotParseInfo); err != nil { return err } + req.MapSnapshot[cartInfo.Id] = snapShotParseInfo //快照中模板设计json数据哈希值 snapshotTemplateJsonHash := hash.JsonHashKey(snapShotParseInfo.TemplateInfo.TemplateJson) //快照中模型设计json数据哈希值 From f72a0b9f7dd5491af503863ef43d8ee00c00c077 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 14:20:08 +0800 Subject: [PATCH 15/26] fix --- server/shopping-cart/internal/logic/addtocartlogic.go | 1 - server/shopping-cart/internal/logic/deletecartlogic.go | 1 - server/shopping-cart/internal/logic/getcartslogic.go | 1 - .../internal/logic/modifycartpurchasequantitylogic.go | 1 - 4 files changed, 4 deletions(-) diff --git a/server/shopping-cart/internal/logic/addtocartlogic.go b/server/shopping-cart/internal/logic/addtocartlogic.go index a82d7d7a..e792eefe 100644 --- a/server/shopping-cart/internal/logic/addtocartlogic.go +++ b/server/shopping-cart/internal/logic/addtocartlogic.go @@ -36,7 +36,6 @@ func NewAddToCartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AddToCa // } func (l *AddToCartLogic) AddToCart(req *types.AddToCartReq, userinfo *auth.UserInfo) (resp *basic.Response) { - userinfo.UserId = 39 if !userinfo.IsUser() { return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in") } diff --git a/server/shopping-cart/internal/logic/deletecartlogic.go b/server/shopping-cart/internal/logic/deletecartlogic.go index d868d52e..4c1bc37b 100644 --- a/server/shopping-cart/internal/logic/deletecartlogic.go +++ b/server/shopping-cart/internal/logic/deletecartlogic.go @@ -31,7 +31,6 @@ func NewDeleteCartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Delete // } func (l *DeleteCartLogic) DeleteCart(req *types.DeleteCartReq, userinfo *auth.UserInfo) (resp *basic.Response) { - userinfo.UserId = 39 if !userinfo.IsUser() { return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in") } diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index 204836a9..436831f9 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -38,7 +38,6 @@ func NewGetCartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCarts // } func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo) (resp *basic.Response) { - userinfo.UserId = 39 if req.CurrentPage <= 0 { req.CurrentPage = constants.DEFAULT_PAGE } diff --git a/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go b/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go index 916f85da..b78dd2e8 100644 --- a/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go +++ b/server/shopping-cart/internal/logic/modifycartpurchasequantitylogic.go @@ -34,7 +34,6 @@ func NewModifyCartPurchaseQuantityLogic(ctx context.Context, svcCtx *svc.Service // } func (l *ModifyCartPurchaseQuantityLogic) ModifyCartPurchaseQuantity(req *types.ModifyCartPurchaseQuantityReq, userinfo *auth.UserInfo) (resp *basic.Response) { - userinfo.UserId = 39 if !userinfo.IsUser() { return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in") } From ee9246839281793d6071e92ac4cafc6cc621d517 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 14:52:36 +0800 Subject: [PATCH 16/26] fix --- server/shopping-cart/internal/handler/routes.go | 6 +++--- .../shopping-cart/internal/logic/getcartslogic.go | 14 ++++++++++---- server_api/shopping-cart.api | 6 +++--- utils/format/price.go | 6 +++--- utils/step_price/price.go | 10 +++++----- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/server/shopping-cart/internal/handler/routes.go b/server/shopping-cart/internal/handler/routes.go index 08ade841..9857154b 100644 --- a/server/shopping-cart/internal/handler/routes.go +++ b/server/shopping-cart/internal/handler/routes.go @@ -14,17 +14,17 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { []rest.Route{ { Method: http.MethodPost, - Path: "/api/shopping-cart/add_to_cart", + Path: "/api/shopping-cart/add", Handler: AddToCartHandler(serverCtx), }, { Method: http.MethodPost, - Path: "/api/shopping-cart/delete_cart", + Path: "/api/shopping-cart/delete", Handler: DeleteCartHandler(serverCtx), }, { Method: http.MethodPost, - Path: "/api/shopping-cart/modify_cart_purchase_quantity", + Path: "/api/shopping-cart/modify", Handler: ModifyCartPurchaseQuantityHandler(serverCtx), }, { diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index 436831f9..de21354b 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -169,8 +169,14 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo tmpMinBuyNum++ } //根据数量获取阶梯价格中对应的价格 - itemPrice := step_price.GetStepPrice(boxQuantity, stepNum, stepPrice) - totalPrice := itemPrice * float64(*cart.PurchaseQuantity) + itemPrice := step_price.GetCentStepPrice(boxQuantity, stepNum, stepPrice) + //如果有配件,单价也要加入配件价格 + if *cart.FittingId > 0 { + if curFittingInfo, ok := mapModel[*cart.FittingId]; ok { + itemPrice += *curFittingInfo.Price + } + } + totalPrice := itemPrice * (*cart.PurchaseQuantity) item := types.CartItem{ ProductId: *cart.ProductId, SizeInfo: types.SizeInfo{ @@ -185,8 +191,8 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo FittingId: *cart.FittingId, FittingName: snapShot.FittingInfo.FittingName, }, - ItemPrice: fmt.Sprintf("%.3f", itemPrice), - TotalPrice: fmt.Sprintf("%.3f", totalPrice), + ItemPrice: fmt.Sprintf("%.3f", format.CentitoDollar(itemPrice)), + TotalPrice: fmt.Sprintf("%.3f", format.CentitoDollar(totalPrice)), DiyInformation: types.DiyInformation{ Phone: snapShot.UserDiyInformation.Phone, Address: snapShot.UserDiyInformation.Address, diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index 15bb5c98..21ce857e 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -11,13 +11,13 @@ import "basic.api" service shopping-cart { //加入购物车 @handler AddToCartHandler - post /api/shopping-cart/add_to_cart(AddToCartReq) returns (response); + post /api/shopping-cart/add(AddToCartReq) returns (response); //删除购物车 @handler DeleteCartHandler - post /api/shopping-cart/delete_cart(DeleteCartReq) returns (response); + post /api/shopping-cart/delete(DeleteCartReq) returns (response); //修改购物车购买数量 @handler ModifyCartPurchaseQuantityHandler - post /api/shopping-cart/modify_cart_purchase_quantity(ModifyCartPurchaseQuantityReq) returns (response); + post /api/shopping-cart/modify(ModifyCartPurchaseQuantityReq) returns (response); //获取购物车列表 @handler GetCartsHandler get /api/shopping-cart/get_carts(GetCartsReq) returns (response); diff --git a/utils/format/price.go b/utils/format/price.go index 8c7ee70a..99063fde 100644 --- a/utils/format/price.go +++ b/utils/format/price.go @@ -5,9 +5,9 @@ import ( "strconv" ) -// 美分转美元 -func CentoDollar(price int64) float64 { - str := fmt.Sprintf("%.2f", float64(price)/float64(100)) +// 厘转美元 +func CentitoDollar(price int64) float64 { + str := fmt.Sprintf("%.3f", float64(price)/float64(1000)) dollar, _ := strconv.ParseFloat(str, 64) return dollar } diff --git a/utils/step_price/price.go b/utils/step_price/price.go index 0cfe5d09..f8eb2b9a 100644 --- a/utils/step_price/price.go +++ b/utils/step_price/price.go @@ -3,20 +3,20 @@ package step_price // 返回美元 func GetStepPrice(minBuyNum int, stepNum []int, stepPrice []int) float64 { if minBuyNum > stepNum[len(stepNum)-1] { - return float64(stepPrice[len(stepPrice)-1]) / float64(100) + return float64(stepPrice[len(stepPrice)-1]) / float64(1000) } for k, v := range stepNum { if minBuyNum <= v { if k <= (len(stepPrice) - 1) { - return float64(stepPrice[k]) / float64(100) + return float64(stepPrice[k]) / float64(1000) } - return float64(stepPrice[len(stepPrice)-1]) / float64(100) + return float64(stepPrice[len(stepPrice)-1]) / float64(1000) } } - return float64(stepPrice[len(stepPrice)-1]) / float64(100) + return float64(stepPrice[len(stepPrice)-1]) / float64(1000) } -// 返回美分 +// 返回厘 func GetCentStepPrice(minBuyNum int, stepNum []int, stepPrice []int) int64 { if minBuyNum > stepNum[len(stepNum)-1] { return int64(stepPrice[len(stepPrice)-1]) From 6987f2c2d19ee3c64304580ea34c535f74a8b21b Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 15:27:39 +0800 Subject: [PATCH 17/26] fix --- model/gmodel/fs_product_price_logic.go | 5 +++++ server/shopping-cart/internal/logic/getcartslogic.go | 1 + server/shopping-cart/internal/types/types.go | 2 +- server_api/shopping-cart.api | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/model/gmodel/fs_product_price_logic.go b/model/gmodel/fs_product_price_logic.go index d78f8d5f..65e61a3f 100755 --- a/model/gmodel/fs_product_price_logic.go +++ b/model/gmodel/fs_product_price_logic.go @@ -71,6 +71,11 @@ func (p *FsProductPriceModel) GetPriceListByProductIds(ctx context.Context, prod } return } +func (p *FsProductPriceModel) FindOneBySizeId(ctx context.Context, sizeId int64) (resp *FsProductPrice, err error) { + err = p.db.WithContext(ctx).Model(&FsProductPrice{}). + Where("`size_id` = ? and `status` = ?", sizeId, 1).Take(&resp).Error + return resp, err +} // 产品价格 type ProductPrice struct { diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index de21354b..5d15c60a 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -38,6 +38,7 @@ func NewGetCartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCarts // } func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo) (resp *basic.Response) { + userinfo.UserId = 39 if req.CurrentPage <= 0 { req.CurrentPage = constants.DEFAULT_PAGE } diff --git a/server/shopping-cart/internal/types/types.go b/server/shopping-cart/internal/types/types.go index 7ee9b52d..c692ba35 100644 --- a/server/shopping-cart/internal/types/types.go +++ b/server/shopping-cart/internal/types/types.go @@ -48,7 +48,7 @@ type CartItem struct { SizeInfo SizeInfo `json:"size_info"` //尺寸信息 FittingInfo FittingInfo `json:"fitting_info"` //配件信息 ItemPrice string `json:"item_price"` //单价 - TotalPrice string `json:"totalPrice"` //单价X数量=总价 + TotalPrice string `json:"total_price"` //单价X数量=总价 DiyInformation DiyInformation `json:"diy_information"` //diy信息 StepNum []StepNumItem `json:"step_num"` //阶梯数量 IsInvalid bool `json:"is_invalid"` //是否无效 diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index 21ce857e..495e46d1 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -64,7 +64,7 @@ type CartItem { SizeInfo SizeInfo `json:"size_info"` //尺寸信息 FittingInfo FittingInfo `json:"fitting_info"` //配件信息 ItemPrice string `json:"item_price"` //单价 - TotalPrice string `json:"totalPrice"` //单价X数量=总价 + TotalPrice string `json:"total_price"` //单价X数量=总价 DiyInformation DiyInformation `json:"diy_information"` //diy信息 StepNum []StepNumItem `json:"step_num"` //阶梯数量 IsInvalid bool `json:"is_invalid"` //是否无效 From 246e03d7927459c7b9075278c5f483029531e7fc Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 15:28:11 +0800 Subject: [PATCH 18/26] fix --- server/shopping-cart/internal/logic/getcartslogic.go | 1 - 1 file changed, 1 deletion(-) diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index 5d15c60a..de21354b 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -38,7 +38,6 @@ func NewGetCartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCarts // } func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo) (resp *basic.Response) { - userinfo.UserId = 39 if req.CurrentPage <= 0 { req.CurrentPage = constants.DEFAULT_PAGE } From 33055bbb4cdb07b869b27d7d38c463c37f026091 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 15:28:42 +0800 Subject: [PATCH 19/26] fix --- server/shopping-cart/internal/logic/getcartslogic.go | 1 - 1 file changed, 1 deletion(-) diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index de21354b..8f66c64c 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -45,7 +45,6 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo //获取用户购物车列表 carts, total, err := l.svcCtx.AllModels.FsShoppingCart.GetAllCartsByParam(l.ctx, gmodel.GetAllCartsByParamReq{ UserId: userinfo.UserId, - Fields: "", Sort: "id DESC", Page: req.CurrentPage, Limit: limit, From c94e59c907dce8374a52ca057784b8b521ff84ca Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 15:54:12 +0800 Subject: [PATCH 20/26] fix --- .../internal/logic/getcartslogic.go | 125 +++++++++++------- 1 file changed, 77 insertions(+), 48 deletions(-) diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index 8f66c64c..dc9f4499 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -2,6 +2,7 @@ package logic import ( "context" + "errors" "fmt" "fusenapi/constants" "fusenapi/model/gmodel" @@ -38,6 +39,7 @@ func NewGetCartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCarts // } func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo) (resp *basic.Response) { + userinfo.UserId = 39 if req.CurrentPage <= 0 { req.CurrentPage = constants.DEFAULT_PAGE } @@ -64,44 +66,22 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo CartList: nil, }) } - lenCarts := len(carts) - templateIds := make([]int64, 0, lenCarts) - modelIds := make([]int64, 0, lenCarts) //模型 + 配件 - sizeIds := make([]int64, 0, lenCarts) - for index := range carts { - templateIds = append(templateIds, *carts[index].TemplateId) - modelIds = append(modelIds, *carts[index].ModelId, *carts[index].FittingId) - sizeIds = append(sizeIds, *carts[index].SizeId) - } - //获取尺寸列表 - sizeList, err := l.svcCtx.AllModels.FsProductSize.GetAllByIds(l.ctx, sizeIds, "") + var ( + mapSize = make(map[int64]gmodel.FsProductSize) + mapModel = make(map[int64]gmodel.FsProductModel3d) + mapTemplate = make(map[int64]gmodel.FsProductTemplateV2) + mapSizePrice = make(map[int64]gmodel.FsProductPrice) + ) + //获取相关信息 + err = l.GetRelationInfo(GetRelationInfoReq{ + Carts: carts, + MapSize: mapSize, + MapModel: mapModel, + MapTemplate: mapTemplate, + MapSizePrice: mapSizePrice, + }) if err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get size list") - } - mapSize := make(map[int64]gmodel.FsProductSize) - for _, v := range sizeList { - mapSize[v.Id] = v - } - //获取模型和配件信息 - modelList, err := l.svcCtx.AllModels.FsProductModel3d.GetAllByIds(l.ctx, modelIds, "") - if err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get model list") - } - mapModel := make(map[int64]gmodel.FsProductModel3d) - for _, v := range modelList { - mapModel[v.Id] = v - } - //获取模板列表 - templateList, err := l.svcCtx.AllModels.FsProductTemplateV2.FindAllByIds(l.ctx, templateIds) - if err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get template list") - } - mapTemplate := make(map[int64]gmodel.FsProductTemplateV2) - for _, v := range templateList { - mapTemplate[v.Id] = v + return resp.SetStatusWithMessage(basic.CodeServiceErr, err.Error()) } //定义map收集变更信息 mapCartChange := make(map[int64]string) @@ -119,17 +99,8 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo logx.Error("VerifyShoppingCartSnapshotDataChange err:", err.Error()) return resp.SetStatusWithMessage(basic.CodeServiceErr, "system err:failed to check shopping cart change data") } - //根据sizeid获取价格列表 - priceList, err := l.svcCtx.AllModels.FsProductPrice.GetPriceListBySizeIds(l.ctx, sizeIds) - if err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get cart`s product price list") - } - mapSizePrice := make(map[int64]gmodel.FsProductPrice) - for _, v := range priceList { - mapSizePrice[*v.SizeId] = v - } - list := make([]types.CartItem, 0, lenCarts) + + list := make([]types.CartItem, 0, len(carts)) for _, cart := range carts { snapShot := mapSnapshot[cart.Id] sizePrice, ok := mapSizePrice[*cart.SizeId] @@ -221,6 +192,64 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo }) } +// 获取相关信息 +type GetRelationInfoReq struct { + Carts []gmodel.FsShoppingCart + MapSize map[int64]gmodel.FsProductSize + MapModel map[int64]gmodel.FsProductModel3d + MapTemplate map[int64]gmodel.FsProductTemplateV2 + MapSizePrice map[int64]gmodel.FsProductPrice +} + +func (l *GetCartsLogic) GetRelationInfo(req GetRelationInfoReq) error { + lenCarts := len(req.Carts) + templateIds := make([]int64, 0, lenCarts) + modelIds := make([]int64, 0, lenCarts) //模型 + 配件 + sizeIds := make([]int64, 0, lenCarts) + for index := range req.Carts { + templateIds = append(templateIds, *req.Carts[index].TemplateId) + modelIds = append(modelIds, *req.Carts[index].ModelId, *req.Carts[index].FittingId) + sizeIds = append(sizeIds, *req.Carts[index].SizeId) + } + //获取尺寸列表 + sizeList, err := l.svcCtx.AllModels.FsProductSize.GetAllByIds(l.ctx, sizeIds, "") + if err != nil { + logx.Error(err) + return errors.New("failed to get size list") + } + for _, v := range sizeList { + req.MapSize[v.Id] = v + } + //获取模型和配件信息 + modelList, err := l.svcCtx.AllModels.FsProductModel3d.GetAllByIds(l.ctx, modelIds, "") + if err != nil { + logx.Error(err) + return errors.New("failed to get model list") + } + for _, v := range modelList { + req.MapModel[v.Id] = v + } + //获取模板列表 + templateList, err := l.svcCtx.AllModels.FsProductTemplateV2.FindAllByIds(l.ctx, templateIds) + if err != nil { + logx.Error(err) + return errors.New("failed to get template list") + } + for _, v := range templateList { + req.MapTemplate[v.Id] = v + } + //根据sizeid获取价格列表 + priceList, err := l.svcCtx.AllModels.FsProductPrice.GetPriceListBySizeIds(l.ctx, sizeIds) + if err != nil { + logx.Error(err) + return errors.New("failed to get cart`s product price list") + } + for _, v := range priceList { + req.MapSizePrice[*v.SizeId] = v + } + return nil +} + // 处理逻辑后 w,r 如:重定向, resp 必须重新处理 // func (l *GetCartsLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { // // httpx.OkJsonCtx(r.Context(), w, resp) From 668db55e6be2a2f00c812f8894d21052cf30835d Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 15:54:24 +0800 Subject: [PATCH 21/26] fix --- server/shopping-cart/internal/logic/getcartslogic.go | 1 - 1 file changed, 1 deletion(-) diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index dc9f4499..4b070b5d 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -39,7 +39,6 @@ func NewGetCartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCarts // } func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo) (resp *basic.Response) { - userinfo.UserId = 39 if req.CurrentPage <= 0 { req.CurrentPage = constants.DEFAULT_PAGE } From da8f88b3e69f2dad42f0d9e445019ed0bc1acc49 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 16:30:01 +0800 Subject: [PATCH 22/26] fix --- model/gmodel/fs_product_logic.go | 5 ++- model/gmodel/fs_product_price_logic.go | 6 ++-- .../internal/logic/getsizebyproductlogic.go | 12 +++---- .../internal/logic/getcartslogic.go | 33 +++++++++++++------ server/shopping-cart/internal/types/types.go | 8 ++--- server_api/shopping-cart.api | 7 ++-- .../verify_shopping_cart_channged.go | 7 +++- 7 files changed, 46 insertions(+), 32 deletions(-) diff --git a/model/gmodel/fs_product_logic.go b/model/gmodel/fs_product_logic.go index 8e7cca3c..dcd6d497 100755 --- a/model/gmodel/fs_product_logic.go +++ b/model/gmodel/fs_product_logic.go @@ -18,12 +18,15 @@ func (p *FsProductModel) FindOneBySn(ctx context.Context, sn string, fields ...s err = db.Take(&resp).Error return resp, err } -func (p *FsProductModel) GetProductListByIds(ctx context.Context, productIds []int64, sort string) (resp []FsProduct, err error) { +func (p *FsProductModel) GetProductListByIds(ctx context.Context, productIds []int64, sort string, fields ...string) (resp []FsProduct, err error) { if len(productIds) == 0 { return } db := p.db.Model(&FsProduct{}).WithContext(ctx). Where("`id` in (?) and `is_del` =? and `is_shelf` = ? and `status` =?", productIds, 0, 1, 1) + if len(fields) > 0 { + db = db.Select(fields[0]) + } switch sort { case "sort-asc": db = db.Order("`sort` ASC") diff --git a/model/gmodel/fs_product_price_logic.go b/model/gmodel/fs_product_price_logic.go index 65e61a3f..a4bee9cd 100755 --- a/model/gmodel/fs_product_price_logic.go +++ b/model/gmodel/fs_product_price_logic.go @@ -23,11 +23,11 @@ func (p *FsProductPriceModel) GetSimplePriceListByProductIds(ctx context.Context } return } -func (p *FsProductPriceModel) GetPriceListBySizeIds(ctx context.Context, sizeIds []int64) (resp []FsProductPrice, err error) { - if len(sizeIds) == 0 { +func (p *FsProductPriceModel) GetPriceListByProductIdsSizeIds(ctx context.Context, productIds, sizeIds []int64) (resp []FsProductPrice, err error) { + if len(sizeIds) == 0 || len(productIds) == 0 { return } - err = p.db.WithContext(ctx).Model(&FsProductPrice{}).Where("`size_id` in (?) and `status` = ? ", sizeIds, 1).Find(&resp).Error + err = p.db.WithContext(ctx).Model(&FsProductPrice{}).Where("`size_id` in (?) and `product_id` in (?) and `status` = ? ", sizeIds, productIds, 1).Find(&resp).Error if err != nil { return nil, err } diff --git a/server/product/internal/logic/getsizebyproductlogic.go b/server/product/internal/logic/getsizebyproductlogic.go index 5e88ef39..f8e56a96 100644 --- a/server/product/internal/logic/getsizebyproductlogic.go +++ b/server/product/internal/logic/getsizebyproductlogic.go @@ -74,14 +74,14 @@ func (l *GetSizeByProductLogic) GetSizeByProduct(req *types.Request, userinfo *a } //获取价格列表 productPriceModel := gmodel.NewFsProductPriceModel(l.svcCtx.MysqlConn) - productPriceList, err := productPriceModel.GetPriceListBySizeIds(l.ctx, sizeIds) + productPriceList, err := productPriceModel.GetPriceListByProductIdsSizeIds(l.ctx, productIds, sizeIds) if err != nil { logx.Error(err) return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to get product proce list") } - mapProductPrice := make(map[int64]gmodel.FsProductPrice) + mapProductPrice := make(map[string]gmodel.FsProductPrice) for _, v := range productPriceList { - mapProductPrice[*v.SizeId] = v + mapProductPrice[fmt.Sprintf("%d_%d", *v.ProductId, *v.SizeId)] = v } //组装返回 list := make([]types.GetSizeByProductRsp, 0, len(tagsList)) @@ -103,7 +103,7 @@ func (l *GetSizeByProductLogic) GetSizeByProduct(req *types.Request, userinfo *a } // 第一层子层 -func (l *GetSizeByProductLogic) GetFirstChildrenList(tag gmodel.FsTags, productList []gmodel.FsProduct, productSizeList []gmodel.FsProductSize, mapProductPrice map[int64]gmodel.FsProductPrice) (childrenList []types.Children, err error) { +func (l *GetSizeByProductLogic) GetFirstChildrenList(tag gmodel.FsTags, productList []gmodel.FsProduct, productSizeList []gmodel.FsProductSize, mapProductPrice map[string]gmodel.FsProductPrice) (childrenList []types.Children, err error) { childrenList = make([]types.Children, 0, len(productList)) for _, product := range productList { if *product.Type != tag.Id { @@ -126,14 +126,14 @@ func (l *GetSizeByProductLogic) GetFirstChildrenList(tag gmodel.FsTags, productL } // 第2层子层 -func (l *GetSizeByProductLogic) GetSecondChildrenList(product gmodel.FsProduct, productSizeList []gmodel.FsProductSize, mapProductPrice map[int64]gmodel.FsProductPrice) (childrenObjList []types.ChildrenObj, err error) { +func (l *GetSizeByProductLogic) GetSecondChildrenList(product gmodel.FsProduct, productSizeList []gmodel.FsProductSize, mapProductPrice map[string]gmodel.FsProductPrice) (childrenObjList []types.ChildrenObj, err error) { childrenObjList = make([]types.ChildrenObj, 0, len(productSizeList)) for _, productSize := range productSizeList { if product.Id != *productSize.ProductId { continue } priceList := make([]types.PriceObj, 0, len(productSizeList)) - price, ok := mapProductPrice[productSize.Id] + price, ok := mapProductPrice[fmt.Sprintf("%d_%d", *productSize.ProductId, productSize.Id)] //无对应尺寸价格 if !ok { priceList = []types.PriceObj{ diff --git a/server/shopping-cart/internal/logic/getcartslogic.go b/server/shopping-cart/internal/logic/getcartslogic.go index 4b070b5d..0a52ba1e 100644 --- a/server/shopping-cart/internal/logic/getcartslogic.go +++ b/server/shopping-cart/internal/logic/getcartslogic.go @@ -69,7 +69,8 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo mapSize = make(map[int64]gmodel.FsProductSize) mapModel = make(map[int64]gmodel.FsProductModel3d) mapTemplate = make(map[int64]gmodel.FsProductTemplateV2) - mapSizePrice = make(map[int64]gmodel.FsProductPrice) + mapSizePrice = make(map[string]gmodel.FsProductPrice) + mapProduct = make(map[int64]struct{}) ) //获取相关信息 err = l.GetRelationInfo(GetRelationInfoReq{ @@ -78,6 +79,7 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo MapModel: mapModel, MapTemplate: mapTemplate, MapSizePrice: mapSizePrice, + MapProduct: mapProduct, }) if err != nil { return resp.SetStatusWithMessage(basic.CodeServiceErr, err.Error()) @@ -93,6 +95,7 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo MapTemplate: mapTemplate, MapCartChange: mapCartChange, MapSnapshot: mapSnapshot, + MapProduct: mapProduct, }) if err != nil { logx.Error("VerifyShoppingCartSnapshotDataChange err:", err.Error()) @@ -102,7 +105,7 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo list := make([]types.CartItem, 0, len(carts)) for _, cart := range carts { snapShot := mapSnapshot[cart.Id] - sizePrice, ok := mapSizePrice[*cart.SizeId] + sizePrice, ok := mapSizePrice[fmt.Sprintf("%d_%d", *cart.ProductId, *cart.SizeId)] if !ok { return resp.SetStatusWithMessage(basic.CodeServiceErr, fmt.Sprintf("the size`s price info is not exists:%d", *cart.SizeId)) } @@ -126,15 +129,12 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo //购买箱数 boxQuantity := int(math.Ceil(float64(*cart.PurchaseQuantity) / float64(*sizePrice.EachBoxNum))) //获取阶梯数量 - stepQuantityList := make([]types.StepNumItem, 0, 10) + stepQuantityList := make([]int64, 0, 20) tmpMinBuyNum := *sizePrice.MinBuyNum for tmpMinBuyNum < (int64(stepNum[lenStepNum-1]) + 5) { //阶梯数 tmpQuantity := tmpMinBuyNum * (*sizePrice.EachBoxNum) - stepQuantityList = append(stepQuantityList, types.StepNumItem{ - PurchaseQuantity: tmpQuantity, - IsSelected: *cart.PurchaseQuantity == tmpQuantity, - }) + stepQuantityList = append(stepQuantityList, tmpQuantity) tmpMinBuyNum++ } //根据数量获取阶梯价格中对应的价格 @@ -169,6 +169,7 @@ func (l *GetCartsLogic) GetCarts(req *types.GetCartsReq, userinfo *auth.UserInfo Qrcode: snapShot.UserDiyInformation.Qrcode, Slogan: snapShot.UserDiyInformation.Slogan, }, + PurchaseQuantity: *cart.PurchaseQuantity, StepNum: stepQuantityList, IsInvalid: false, InvalidDescription: "", @@ -197,7 +198,8 @@ type GetRelationInfoReq struct { MapSize map[int64]gmodel.FsProductSize MapModel map[int64]gmodel.FsProductModel3d MapTemplate map[int64]gmodel.FsProductTemplateV2 - MapSizePrice map[int64]gmodel.FsProductPrice + MapSizePrice map[string]gmodel.FsProductPrice + MapProduct map[int64]struct{} } func (l *GetCartsLogic) GetRelationInfo(req GetRelationInfoReq) error { @@ -205,10 +207,21 @@ func (l *GetCartsLogic) GetRelationInfo(req GetRelationInfoReq) error { templateIds := make([]int64, 0, lenCarts) modelIds := make([]int64, 0, lenCarts) //模型 + 配件 sizeIds := make([]int64, 0, lenCarts) + productIds := make([]int64, 0, lenCarts) for index := range req.Carts { templateIds = append(templateIds, *req.Carts[index].TemplateId) modelIds = append(modelIds, *req.Carts[index].ModelId, *req.Carts[index].FittingId) sizeIds = append(sizeIds, *req.Carts[index].SizeId) + productIds = append(productIds, *req.Carts[index].ProductId) + } + //获取产品集合 + productList, err := l.svcCtx.AllModels.FsProduct.GetProductListByIds(l.ctx, productIds, "", "id") + if err != nil { + logx.Error(err) + return errors.New("failed to get product list") + } + for _, v := range productList { + req.MapProduct[v.Id] = struct{}{} } //获取尺寸列表 sizeList, err := l.svcCtx.AllModels.FsProductSize.GetAllByIds(l.ctx, sizeIds, "") @@ -238,13 +251,13 @@ func (l *GetCartsLogic) GetRelationInfo(req GetRelationInfoReq) error { req.MapTemplate[v.Id] = v } //根据sizeid获取价格列表 - priceList, err := l.svcCtx.AllModels.FsProductPrice.GetPriceListBySizeIds(l.ctx, sizeIds) + priceList, err := l.svcCtx.AllModels.FsProductPrice.GetPriceListByProductIdsSizeIds(l.ctx, productIds, sizeIds) if err != nil { logx.Error(err) return errors.New("failed to get cart`s product price list") } for _, v := range priceList { - req.MapSizePrice[*v.SizeId] = v + req.MapSizePrice[fmt.Sprintf("%d_%d", *v.ProductId, *v.SizeId)] = v } return nil } diff --git a/server/shopping-cart/internal/types/types.go b/server/shopping-cart/internal/types/types.go index c692ba35..db117d2a 100644 --- a/server/shopping-cart/internal/types/types.go +++ b/server/shopping-cart/internal/types/types.go @@ -50,16 +50,12 @@ type CartItem struct { ItemPrice string `json:"item_price"` //单价 TotalPrice string `json:"total_price"` //单价X数量=总价 DiyInformation DiyInformation `json:"diy_information"` //diy信息 - StepNum []StepNumItem `json:"step_num"` //阶梯数量 + StepNum []int64 `json:"step_num"` //阶梯数量 + PurchaseQuantity int64 `json:"purchase_quantity"` //当前购买数量 IsInvalid bool `json:"is_invalid"` //是否无效 InvalidDescription string `json:"invalid_description"` //无效原因 } -type StepNumItem struct { - PurchaseQuantity int64 `json:"purchase_quantity"` //数量 - IsSelected bool `json:"is_selected"` //是否选中 -} - type SizeInfo struct { SizeId int64 `json:"size_id"` //尺寸id Capacity string `json:"capacity"` //尺寸名称 diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index 495e46d1..27249f45 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -66,14 +66,11 @@ type CartItem { ItemPrice string `json:"item_price"` //单价 TotalPrice string `json:"total_price"` //单价X数量=总价 DiyInformation DiyInformation `json:"diy_information"` //diy信息 - StepNum []StepNumItem `json:"step_num"` //阶梯数量 + StepNum []int64 `json:"step_num"` //阶梯数量 + PurchaseQuantity int64 `json:"purchase_quantity"` //当前购买数量 IsInvalid bool `json:"is_invalid"` //是否无效 InvalidDescription string `json:"invalid_description"` //无效原因 } -type StepNumItem { - PurchaseQuantity int64 `json:"purchase_quantity"` //数量 - IsSelected bool `json:"is_selected"` //是否选中 -} type SizeInfo { SizeId int64 `json:"size_id"` //尺寸id Capacity string `json:"capacity"` //尺寸名称 diff --git a/utils/shopping_cart/verify_shopping_cart_channged.go b/utils/shopping_cart/verify_shopping_cart_channged.go index d237e5ec..10315ffe 100644 --- a/utils/shopping_cart/verify_shopping_cart_channged.go +++ b/utils/shopping_cart/verify_shopping_cart_channged.go @@ -15,10 +15,16 @@ type VerifyShoppingCartSnapshotDataChangeReq struct { MapTemplate map[int64]gmodel.FsProductTemplateV2 MapCartChange map[int64]string MapSnapshot map[int64]CartSnapshot + MapProduct map[int64]struct{} } func VerifyShoppingCartSnapshotDataChange(req VerifyShoppingCartSnapshotDataChangeReq) error { for _, cartInfo := range req.Carts { + descrptionBuilder := strings.Builder{} + //产品下架/删除 + if _, ok := req.MapProduct[*cartInfo.ProductId]; !ok { + descrptionBuilder.WriteString("

the product is off shelf or deleted

") + } var snapShotParseInfo CartSnapshot if err := json.Unmarshal([]byte(*cartInfo.Snapshot), &snapShotParseInfo); err != nil { return err @@ -30,7 +36,6 @@ func VerifyShoppingCartSnapshotDataChange(req VerifyShoppingCartSnapshotDataChan snapshotModelJsonHash := hash.JsonHashKey(snapShotParseInfo.ModelInfo.ModelJson) //快照中配件设计json数据哈希值 snapshotFittingJsonHash := hash.JsonHashKey(snapShotParseInfo.FittingInfo.FittingJson) - descrptionBuilder := strings.Builder{} //有模板验证模板相关 if *cartInfo.TemplateId > 0 { if curTemplateInfo, ok := req.MapTemplate[*cartInfo.TemplateId]; !ok { From ca7cf4c81e2bc7a7881650914bbfae508f203682 Mon Sep 17 00:00:00 2001 From: momo <1012651275@qq.com> Date: Fri, 15 Sep 2023 17:58:45 +0800 Subject: [PATCH 23/26] =?UTF-8?q?fix:=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- constants/orders.go | 85 +++++++ model/gmodel/fs_cloud_storage_gen.go | 25 +++ model/gmodel/fs_cloud_storage_logic.go | 2 + model/gmodel/fs_order_gen.go | 3 +- model/gmodel/fs_order_logic.go | 297 ++++++++++++------------- model/gmodel/fs_order_logic_1.go | 192 ++++++++++++++++ model/gmodel/fs_shopping_cart_logic.go | 11 +- model/gmodel/var_gen.go | 2 + server_api/order.api | 42 ++++ server_api/orders.api | 217 ------------------ service/repositories/order.go | 151 +++++++++++++ utils/basic/basic.go | 7 + utils/configs/order.go | 92 ++++---- utils/order/order.go | 24 ++ 14 files changed, 732 insertions(+), 418 deletions(-) create mode 100644 constants/orders.go create mode 100644 model/gmodel/fs_cloud_storage_gen.go create mode 100644 model/gmodel/fs_cloud_storage_logic.go mode change 100755 => 100644 model/gmodel/fs_order_logic.go create mode 100755 model/gmodel/fs_order_logic_1.go create mode 100644 server_api/order.api delete mode 100644 server_api/orders.api create mode 100644 service/repositories/order.go diff --git a/constants/orders.go b/constants/orders.go new file mode 100644 index 00000000..7fe2de34 --- /dev/null +++ b/constants/orders.go @@ -0,0 +1,85 @@ +package constants + +// 货币 +type Currency string + +const ( + Usd Currency = "usd" +) + +// 金额单位 +type AmountUnit string + +// 交易方式 +type PayMethods string + +const ( + Card PayMethods = "CARD" + Visa PayMethods = "VISA" +) + +// 支付状态 +type PayStatusCode int64 + +const ( + PayStatusUnpaid PayStatusCode = 10 //10,未支付 + PayStatusPaid PayStatusCode = 20 //20,已支付 + PayStatusRefunded PayStatusCode = 30 //30,已退款 +) + +// 订单状态 +type OrderStatusCode int64 + +const ( + ORDERSTATUSUNPAIDDEPOSIT OrderStatusCode = 0 // 0,未支付定金 + ORDERSTATUSDIRECTMAILORDERED OrderStatusCode = 10100 // 10100,直邮单--已下单 + ORDERSTATUSDIRECTMAILCANCEL OrderStatusCode = 10101 // 10101,直邮单--已取消 + ORDERSTATUSDIRECTMAILSTARTPRODUCTION OrderStatusCode = 10200 // 10200,直邮单--开始生产 + ORDERSTATUSDIRECTMAILCOMPLETEPRODUCTION OrderStatusCode = 10300 // 10300,直邮单--生产完成 + ORDERSTATUSDIRECTMAILSHIPPED OrderStatusCode = 10400 // 10400,直邮单--已发货 + ORDERSTATUSDIRECTMAILARRIVED OrderStatusCode = 10500 // 10500,直邮单--已到达 + ORDERSTATUSCLOUDSTOREORDERED OrderStatusCode = 20100 // 20100,云仓单--已下单 + ORDERSTATUSCLOUDSTORECANCEL OrderStatusCode = 20101 // 20101,云仓单--已取消 + ORDERSTATUSCLOUDSTORESTARTPRODUCTION OrderStatusCode = 20200 // 20200,云仓单--开始生产 + ORDERSTATUSCLOUDSTOREOMPLETEPRODUCTION OrderStatusCode = 20300 // 20300,云仓单--生产完成 + ORDERSTATUSCLOUDSTOREARRIVEDWAREHOUSE OrderStatusCode = 20400 // 20400,云仓单--直达仓库 +) + +// 订单状态名称 +var OrderStatusMessage map[OrderStatusCode]string + +// 支付状态名称 +var PayStatusMessage map[PayStatusCode]string + +// 订单状态--用户可见 +var OrderStatusUser []OrderStatusCode + +func init() { + // 订单状态名称 + PayStatusMessage = make(map[PayStatusCode]string) + PayStatusMessage[PayStatusUnpaid] = "Paid" + PayStatusMessage[PayStatusPaid] = "Unpaid" + PayStatusMessage[PayStatusRefunded] = "Refunded" + + // 订单状态名称 + OrderStatusMessage = make(map[OrderStatusCode]string) + OrderStatusMessage[ORDERSTATUSUNPAIDDEPOSIT] = "未支付定金" + + OrderStatusMessage[ORDERSTATUSDIRECTMAILORDERED] = "直邮单--已下单" + OrderStatusMessage[ORDERSTATUSDIRECTMAILSTARTPRODUCTION] = "直邮单--开始生产" + OrderStatusMessage[ORDERSTATUSDIRECTMAILCOMPLETEPRODUCTION] = "直邮单--生产完成" + OrderStatusMessage[ORDERSTATUSDIRECTMAILSHIPPED] = "直邮单--已发货" + OrderStatusMessage[ORDERSTATUSDIRECTMAILARRIVED] = "直邮单--已到达" + + OrderStatusMessage[ORDERSTATUSCLOUDSTOREORDERED] = "云仓单--已下单" + OrderStatusMessage[ORDERSTATUSCLOUDSTORESTARTPRODUCTION] = "云仓单--开始生产" + OrderStatusMessage[ORDERSTATUSCLOUDSTOREOMPLETEPRODUCTION] = "云仓单--生产完成" + OrderStatusMessage[ORDERSTATUSCLOUDSTOREARRIVEDWAREHOUSE] = "云仓单--直达仓库" + + // 订单状态--用户可见 + OrderStatusUser = []OrderStatusCode{ + ORDERSTATUSUNPAIDDEPOSIT, + ORDERSTATUSDIRECTMAILORDERED, ORDERSTATUSDIRECTMAILSTARTPRODUCTION, ORDERSTATUSDIRECTMAILCOMPLETEPRODUCTION, ORDERSTATUSDIRECTMAILSHIPPED, ORDERSTATUSDIRECTMAILARRIVED, + ORDERSTATUSCLOUDSTOREORDERED, ORDERSTATUSCLOUDSTORESTARTPRODUCTION, ORDERSTATUSCLOUDSTOREOMPLETEPRODUCTION, ORDERSTATUSCLOUDSTOREARRIVEDWAREHOUSE, + } +} diff --git a/model/gmodel/fs_cloud_storage_gen.go b/model/gmodel/fs_cloud_storage_gen.go new file mode 100644 index 00000000..ec90df8d --- /dev/null +++ b/model/gmodel/fs_cloud_storage_gen.go @@ -0,0 +1,25 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_cloud_storage 仓库的基本信息, 只做映射 +type FsCloudStorage struct { + CloudStorageId *string `gorm:"unique_key;default:'';" json:"cloud_storage_id"` // 仓库id, 需要固定的命名规则, 能表达国外国内,区域等,简单明了 + Name *string `gorm:"default:'';" json:"name"` // 仓库的名字, 中文使用拼音,国外使用英文 + Address *string `gorm:"default:'';" json:"address"` // 仓库地址 + Contact *[]byte `gorm:"default:'';" json:"contact"` // + Ownership *int64 `gorm:"default:0;" json:"ownership"` // 0为自有, 1为第三方, 后期可以自由定制 + Scope *[]byte `gorm:"default:'';" json:"scope"` // + Capacity *[]byte `gorm:"default:'';" json:"capacity"` // + Metadata *[]byte `gorm:"default:'';" json:"metadata"` // +} +type FsCloudStorageModel struct { + db *gorm.DB + name string +} + +func NewFsCloudStorageModel(db *gorm.DB) *FsCloudStorageModel { + return &FsCloudStorageModel{db: db, name: "fs_cloud_storage"} +} diff --git a/model/gmodel/fs_cloud_storage_logic.go b/model/gmodel/fs_cloud_storage_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_cloud_storage_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/fs_order_gen.go b/model/gmodel/fs_order_gen.go index 66bdd701..a8448ebf 100644 --- a/model/gmodel/fs_order_gen.go +++ b/model/gmodel/fs_order_gen.go @@ -10,12 +10,13 @@ type FsOrder struct { Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // 订单ID UserId *int64 `gorm:"index;default:0;" json:"user_id"` // 用户ID DeliveryMethod *int64 `gorm:"index;default:0;" json:"delivery_method"` // 物流类型 - OrderNo *string `gorm:"index;default:'';" json:"order_no"` // + OrderSn *string `gorm:"index;default:'';" json:"order_sn"` // OrderSource *string `gorm:"default:'';" json:"order_source"` // Status *int64 `gorm:"index;default:0;" json:"status"` // 订单状态 Metadata *[]byte `gorm:"default:'';" json:"metadata"` // Ctime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ctime"` // Utime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"utime"` // + IsDel *int64 `gorm:"default:0;" json:"is_del"` // 是否删除:0=否,1=是 } type FsOrderModel struct { db *gorm.DB diff --git a/model/gmodel/fs_order_logic.go b/model/gmodel/fs_order_logic.go old mode 100755 new mode 100644 index 74f28208..78f82f1d --- a/model/gmodel/fs_order_logic.go +++ b/model/gmodel/fs_order_logic.go @@ -1,192 +1,189 @@ package gmodel import ( - "context" "fusenapi/constants" - "reflect" "time" - - "fusenapi/utils/handlers" - - "gorm.io/gorm" ) -func (o *FsOrderModel) FindOneBySn(ctx context.Context, userId int64, sn string) (resp *FsOrder, err error) { - err = o.db.WithContext(ctx).Model(&FsOrder{}).Where(" `user_id` = ? and `sn` = ? ", userId, sn).Take(&resp).Error - return resp, err +// TODO: 使用model的属性做你想做的 + +type NewFsOrder struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // 订单ID + UserId *int64 `gorm:"index;default:0;" json:"user_id"` // 用户ID + DeliveryMethod *int64 `gorm:"index;default:0;" json:"delivery_method"` // 物流类型 + OrderSn *string `gorm:"index;default:'';" json:"order_sn"` // + OrderSource *string `gorm:"default:'';" json:"order_source"` // + Status *int64 `gorm:"index;default:0;" json:"status"` // 订单状态 + Metadata *OrderDetail `gorm:"metadata,type:json" json:"metadata"` // + Ctime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"ctime"` // + Utime *time.Time `gorm:"default:'0000-00-00 00:00:00';" json:"utime"` // + IsDel *int64 `gorm:"default:0;" json:"is_del"` // 是否删除:0=否,1=是 } -func (o *FsOrderModel) FindOne(ctx context.Context, userId int64, OrderId int64) (order *FsOrder, err error) { - err = o.db.WithContext(ctx).Model(&FsOrder{}).Where("`user_id` = ? and `id` = ?", userId, OrderId).Take(&order).Error - if err != nil { - return nil, err - } - return +// 订单详情 +type OrderDetail struct { + DeliveryAddress *OrderAddress `json:"delivery_address"` // 收货地址 + OrderAmount OrderAmount `json:"order_amount"` // 订单金额 + OrderInfo OrderInfo `json:"order_info"` // 订单信息 + OrderProduct []OrderProduct `json:"order_product"` // 订单商品 } -func (o *FsOrderModel) Update(ctx context.Context, data *FsOrder) error { - return o.db.WithContext(ctx).Model(&FsOrder{}).Where("`id` = ?", data.Id).Updates(&data).Error +// 收货地址 +type OrderAddress struct { + Address string `json:"address"` // 详细地址 + Mobile string `json:"mobile"` // 手机 + Name string `json:"name"` // 姓名 } -func (o *FsOrderModel) RBUpdate(ctx context.Context, data *FsOrder) error { - return o.db.WithContext(ctx).Where("`id` = ?", data.Id).Updates(&data).Error +// 订单金额 +type OrderAmount struct { + Deposit PayInfo `json:"deposit"` // 定金 + RemainingBalance PayInfo `json:"remaining_balance"` // 尾款 + Discount AmountInfo `json:"discount"` // 折扣 + ShippingFee AmountInfo `json:"shipping_fee"` // 邮费 + Tax AmountInfo `json:"tax"` // 税费 + Subtotal AmountInfo `json:"subtotal"` // 商品总金额 + Total AmountInfo `json:"total"` // 订单总金额 } -func (o *FsOrderModel) Create(ctx context.Context, data *FsOrder) error { - return o.db.WithContext(ctx).Model(&FsOrder{}).Create(&data).Error +// 支付明细 +type PayInfo struct { + Metadata map[string]interface{} `json:"metadata"` // 额外参数 + PayAmount AmountInfo `json:"pay_amount"` // 金额明细 + PayMethod string `json:"pay_method"` // 交易方式 + PayTime string `json:"pay_time"` // 支付时间 + Status PayStatus `json:"status"` // 当前状态 + StatusLink []PayStatus `json:"status_link"` // 状态链路 + TradeNo string `json:"trade_no"` // 支付交易号 } -func (o *FsOrderModel) FindOneAndCreateServiceContact(ctx context.Context, userId int64, OrderId int64, cs *FsContactService) (order *FsOrder, err error) { - err = o.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { - err = tx.Model(&FsOrder{}).Select("id").Limit(1).Where("`user_id` = ? and `id` = ?", userId, OrderId).Take(&order).Error - if err != nil { - return err - } - ctime := time.Now().UTC().Unix() - cs.Ctime = &ctime - if constants.ConcactService(*cs.Type) == constants.TYPE_DEFAULT { - *cs.RelationId = 0 - } - - return tx.Model(&FsContactService{}).Create(cs).Error - }) - return order, err +// 金额明细 +type AmountInfo struct { + ExchangeRate string `json:"exchange_rate"` // 换算汇率 + Change constants.AmountUnit `json:"change,omitempty"` // 变动金额 + ChangeRemark string `json:"change_remark,omitempty"` // 变动备注状态编码 + Currency string `json:"currency"` // 货币 + Current constants.AmountUnit `json:"current"` // 当前金额 + Initiate constants.AmountUnit `json:"initiate"` // 初始金额 + Metadata map[string]interface{} `json:"metadata"` // 额外明细 } -// 获取用户最近下单成功的订单 -func (o *FsOrderModel) FindLastSuccessOneOrder(ctx context.Context, userId int64, statusGt int64) (order *FsOrder, err error) { - err = o.db.WithContext(ctx).Model(&FsOrder{}).Where("`user_id` = ? and `status` > ?", userId, statusGt).Order("id DESC").Take(&order).Error - return order, err +// 金额货币 +type AmountCurrency struct { + CurrentAmount constants.AmountUnit `json:"current_amount"` // 当前金额 + CurrentCurrency string `json:"current_currency"` // 当前货币 + ExchangeRate string `json:"exchange_rate"` // 换算汇率 + OriginalAmount constants.AmountUnit `json:"original_amount"` // 原始金额 + OriginalCurrency string `json:"original_currency"` // 原始货币 } -// 分页查询的订单 -func (o *FsOrderModel) FindPageListByPage(ctx context.Context, rowBuilder *gorm.DB, page *int64, pageSize *int64, filterMap map[string]string, orderBy string) ([]*FsOrderRel, error) { - var resp []*FsOrderRel - // 过滤 - if filterMap != nil { - rowBuilder = rowBuilder.Scopes(handlers.FilterData(filterMap)) - } - - // 排序 - if orderBy != "" { - var fieldsMap = make(map[string]struct{}) - s := reflect.TypeOf(&FsOrder{}).Elem() //通过反射获取type定义 - for i := 0; i < s.NumField(); i++ { - fieldsMap[s.Field(i).Tag.Get("json")] = struct{}{} - } - rowBuilder = rowBuilder.Scopes(handlers.OrderCheck(orderBy, fieldsMap)) - } - - // 分页 - rowBuilder = rowBuilder.Scopes(handlers.Paginate(page, pageSize)) - - // 结果 - result := rowBuilder.Debug().WithContext(ctx).Find(&resp) - if result.Error != nil { - return nil, result.Error - } else { - return resp, nil - } +// 支付状态 +type PayStatus struct { + Metadata map[string]interface{} `json:"metadata"` // 额外参数 + StatusCode int64 `json:"status_code"` // 状态编码 + StatusTitle string `json:"status_title"` // 状态名称 } -type FsOrderRel struct { - FsOrder - FsOrderDetails []FsOrderDetails `gorm:"foreignKey:order_id;references:id"` - FsOrderAffiliateInfo FsOrderAffiliate `gorm:"foreignKey:order_id;references:id"` +// 订单信息 +type OrderInfo struct { + Ctime string `json:"ctime"` // 创建日期 + DeliveryMethod int64 `json:"delivery_method"` // 物流类型 + Metadata map[string]interface{} `json:"metadata"` // 额外参数 + OrderSn string `json:"order_sn"` // 订单编号 + Status OrderStatus `json:"status"` // 当前状态 + StatusLink []OrderStatus `json:"status_link"` // 状态链路 + Utime string `json:"utime"` // 更新时间 } -type FsOrderDetails struct { - FsOrderDetail - FsOrderDetailTemplateInfo FsOrderDetailTemplateInfo `gorm:"foreignKey:id;references:order_detail_template_id"` - FsProductInfo FsProduct `gorm:"foreignKey:id;references:product_id"` +// 订单状态--用户 +type OrderStatus struct { + Children []*OrderStatus `json:"children"` // 子状态,管理人员的处理状态, 用户不可见 + Ctime string `json:"ctime"` // 创建时间 + ExpectedTime string `json:"expected_time"` // 预计时间 + Metadata map[string]interface{} `json:"metadata"` // 额外参数 + StatusCode constants.OrderStatusCode `json:"status_code"` // 状态编码 + StatusTitle string `json:"status_title"` // 状态名称 + Utime string `json:"utime"` // 更新时间 } -type FsOrderDetailTemplateInfo struct { - FsOrderDetailTemplate - FsProductDesignInfo FsProductDesignInfo `gorm:"foreignKey:id;references:design_id"` //获取设计数据 - FsProductSizeInfo FsProductSize `gorm:"foreignKey:id;references:size_id"` +// 订单商品 +type OrderProduct struct { + Amount AmountCurrency `json:"amount"` // 商品总价 + ExpectedDeliveryTime string `json:"expected_delivery_time"` // 预计到货时间 + Number int64 `json:"number"` // 商品数量 + ProductID string `json:"product_id"` // 商品ID + ProductLogo string `json:"product_logo"` // 商品logo + ProductLogoResource *Resource `json:"product_logo_resource"` // 商品封面--资源详情 + ProductName string `json:"product_name"` // 商品名称 + ProductPrice AmountCurrency `json:"product_price"` // 商品单价 + ProductSnapshot map[string]interface{} `json:"product_snapshot"` // 商品快照 + ShoppingCartSnapshot *ShoppingCartSnapshot `json:"shopping_cart_snapshot"` // 购物车快照 + Unit string `json:"unit"` // 商品单位 } -type FsProductDesignInfo struct { - FsProductDesign - OptionData FsProduct `gorm:"foreignKey:id;references:optional_id"` //获取配件信息 - TemplateData FsProductTemplateV2 `gorm:"foreignKey:id;references:template_id"` //获取模板信息 +// 资源详情 +type Resource struct { + Metadata map[string]interface{} `json:"metadata"` // 资源额外 + ResourceID string `json:"resource_id"` // 资源ID + ResourceType string `json:"resource_type"` // 资源类型 + ResourceURL string `json:"resource_url"` // 资源地址 } -func (m *FsOrderModel) RowSelectBuilder(selectData []string) *gorm.DB { - var rowBuilder = m.db.Table(m.name) - - if selectData != nil { - rowBuilder = rowBuilder.Select(selectData) - } else { - rowBuilder = rowBuilder.Select("*") - } - return rowBuilder +// 购物车 +type ShoppingCartSnapshot struct { + Ctime string `json:"ctime"` // 创建时间 + FittingID int64 `json:"fitting_id"` // 配件id + ID int64 `json:"id"` // 购物车ID + IsHighlyCustomized int64 `json:"is_highly_customized"` // 是否高度定制 0非 1是(针对客人高度定制只能后台增加如购物车) + ModelID int64 `json:"model_id"` // 模型id + ProductID int64 `json:"product_id"` // 产品id + PurchaseQuantity int64 `json:"purchase_quantity"` // 购买数量 + SizeID int64 `json:"size_id"` // 尺寸id + Snapshot Snapshot `json:"snapshot"` // 购物车快照数据 + TemplateID int64 `json:"template_id"` // 模板id + UserID int64 `json:"user_id"` // 用户id + Utime string `json:"utime"` // 更新时间 } -func (m *FsOrderModel) BuilderTrans(selectData []string) *gorm.DB { - var rowBuilder = m.db - - if selectData != nil { - rowBuilder = rowBuilder.Select(selectData) - } else { - rowBuilder = rowBuilder.Select("*") - } - return rowBuilder +// 购物车快照 +type Snapshot struct { + CombineImage string `json:"combine_image"` // 刀版图地址 + FittingInfo FittingInfo `json:"fitting_info"` + Logo string `json:"logo"` // logo地址 + ModelInfo ModelInfo `json:"model_info"` + RenderImage string `json:"render_image"` // 模板数据 + SizeInfo SizeInfo `json:"size_info"` + TemplateInfo TemplateInfo `json:"template_info"` + UserDiyInformation UserDiyInformation `json:"user_diy_information"` } -func (m *FsOrderModel) FindCount(ctx context.Context, countBuilder *gorm.DB, filterMap map[string]string) (int64, error) { - var count int64 - - // 过滤 - if filterMap != nil { - countBuilder = countBuilder.Scopes(handlers.FilterData(filterMap)) - } - - result := countBuilder.WithContext(ctx).Limit(1).Count(&count) - if result.Error != nil { - return 0, result.Error - } else { - return count, nil - } +// 配件信息 +type FittingInfo struct { + FittingJSON string `json:"fitting_json"` } -func (m *FsOrderModel) FindOneByQuery(ctx context.Context, rowBuilder *gorm.DB, filterMap map[string]string) (*FsOrderRel, error) { - var resp FsOrderRel - - if filterMap != nil { - rowBuilder = rowBuilder.Scopes(handlers.FilterData(filterMap)) - } - - result := rowBuilder.WithContext(ctx).Limit(1).Find(&resp) - if result.Error != nil { - return nil, result.Error - } else { - return &resp, nil - } +// 模型数据 +type ModelInfo struct { + ModelJSON string `json:"model_json"` } -// 事务 -func (m *FsOrderModel) Trans(ctx context.Context, fn func(ctx context.Context, connGorm *gorm.DB) error) error { - tx := m.db.Table(m.name).WithContext(ctx).Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - - if err := tx.Error; err != nil { - return err - } - - if err := fn(ctx, tx); err != nil { - tx.Rollback() - return err - } - - return tx.Commit().Error +// 尺寸信息 +type SizeInfo struct { + CM string `json:"cm"` + Inch string `json:"inch"` } -func (m *FsOrderModel) TableName() string { - return m.name +// 模板数据 +type TemplateInfo struct { + TemplateJSON string `json:"template_json"` + TemplateTag string `json:"template_tag"` +} + +// DIY数据 +type UserDiyInformation struct { + Address string `json:"address"` // 地址 + Phone string `json:"phone"` // 电话 + Qrcode string `json:"qrcode"` // 二维码 + Slogan string `json:"slogan"` // slogan + Website string `json:"website"` // 网站 } diff --git a/model/gmodel/fs_order_logic_1.go b/model/gmodel/fs_order_logic_1.go new file mode 100755 index 00000000..74f28208 --- /dev/null +++ b/model/gmodel/fs_order_logic_1.go @@ -0,0 +1,192 @@ +package gmodel + +import ( + "context" + "fusenapi/constants" + "reflect" + "time" + + "fusenapi/utils/handlers" + + "gorm.io/gorm" +) + +func (o *FsOrderModel) FindOneBySn(ctx context.Context, userId int64, sn string) (resp *FsOrder, err error) { + err = o.db.WithContext(ctx).Model(&FsOrder{}).Where(" `user_id` = ? and `sn` = ? ", userId, sn).Take(&resp).Error + return resp, err +} + +func (o *FsOrderModel) FindOne(ctx context.Context, userId int64, OrderId int64) (order *FsOrder, err error) { + err = o.db.WithContext(ctx).Model(&FsOrder{}).Where("`user_id` = ? and `id` = ?", userId, OrderId).Take(&order).Error + if err != nil { + return nil, err + } + return +} + +func (o *FsOrderModel) Update(ctx context.Context, data *FsOrder) error { + return o.db.WithContext(ctx).Model(&FsOrder{}).Where("`id` = ?", data.Id).Updates(&data).Error +} + +func (o *FsOrderModel) RBUpdate(ctx context.Context, data *FsOrder) error { + return o.db.WithContext(ctx).Where("`id` = ?", data.Id).Updates(&data).Error +} + +func (o *FsOrderModel) Create(ctx context.Context, data *FsOrder) error { + return o.db.WithContext(ctx).Model(&FsOrder{}).Create(&data).Error +} + +func (o *FsOrderModel) FindOneAndCreateServiceContact(ctx context.Context, userId int64, OrderId int64, cs *FsContactService) (order *FsOrder, err error) { + err = o.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + err = tx.Model(&FsOrder{}).Select("id").Limit(1).Where("`user_id` = ? and `id` = ?", userId, OrderId).Take(&order).Error + if err != nil { + return err + } + ctime := time.Now().UTC().Unix() + cs.Ctime = &ctime + if constants.ConcactService(*cs.Type) == constants.TYPE_DEFAULT { + *cs.RelationId = 0 + } + + return tx.Model(&FsContactService{}).Create(cs).Error + }) + return order, err +} + +// 获取用户最近下单成功的订单 +func (o *FsOrderModel) FindLastSuccessOneOrder(ctx context.Context, userId int64, statusGt int64) (order *FsOrder, err error) { + err = o.db.WithContext(ctx).Model(&FsOrder{}).Where("`user_id` = ? and `status` > ?", userId, statusGt).Order("id DESC").Take(&order).Error + return order, err +} + +// 分页查询的订单 +func (o *FsOrderModel) FindPageListByPage(ctx context.Context, rowBuilder *gorm.DB, page *int64, pageSize *int64, filterMap map[string]string, orderBy string) ([]*FsOrderRel, error) { + var resp []*FsOrderRel + // 过滤 + if filterMap != nil { + rowBuilder = rowBuilder.Scopes(handlers.FilterData(filterMap)) + } + + // 排序 + if orderBy != "" { + var fieldsMap = make(map[string]struct{}) + s := reflect.TypeOf(&FsOrder{}).Elem() //通过反射获取type定义 + for i := 0; i < s.NumField(); i++ { + fieldsMap[s.Field(i).Tag.Get("json")] = struct{}{} + } + rowBuilder = rowBuilder.Scopes(handlers.OrderCheck(orderBy, fieldsMap)) + } + + // 分页 + rowBuilder = rowBuilder.Scopes(handlers.Paginate(page, pageSize)) + + // 结果 + result := rowBuilder.Debug().WithContext(ctx).Find(&resp) + if result.Error != nil { + return nil, result.Error + } else { + return resp, nil + } +} + +type FsOrderRel struct { + FsOrder + FsOrderDetails []FsOrderDetails `gorm:"foreignKey:order_id;references:id"` + FsOrderAffiliateInfo FsOrderAffiliate `gorm:"foreignKey:order_id;references:id"` +} + +type FsOrderDetails struct { + FsOrderDetail + FsOrderDetailTemplateInfo FsOrderDetailTemplateInfo `gorm:"foreignKey:id;references:order_detail_template_id"` + FsProductInfo FsProduct `gorm:"foreignKey:id;references:product_id"` +} + +type FsOrderDetailTemplateInfo struct { + FsOrderDetailTemplate + FsProductDesignInfo FsProductDesignInfo `gorm:"foreignKey:id;references:design_id"` //获取设计数据 + FsProductSizeInfo FsProductSize `gorm:"foreignKey:id;references:size_id"` +} + +type FsProductDesignInfo struct { + FsProductDesign + OptionData FsProduct `gorm:"foreignKey:id;references:optional_id"` //获取配件信息 + TemplateData FsProductTemplateV2 `gorm:"foreignKey:id;references:template_id"` //获取模板信息 +} + +func (m *FsOrderModel) RowSelectBuilder(selectData []string) *gorm.DB { + var rowBuilder = m.db.Table(m.name) + + if selectData != nil { + rowBuilder = rowBuilder.Select(selectData) + } else { + rowBuilder = rowBuilder.Select("*") + } + return rowBuilder +} + +func (m *FsOrderModel) BuilderTrans(selectData []string) *gorm.DB { + var rowBuilder = m.db + + if selectData != nil { + rowBuilder = rowBuilder.Select(selectData) + } else { + rowBuilder = rowBuilder.Select("*") + } + return rowBuilder +} + +func (m *FsOrderModel) FindCount(ctx context.Context, countBuilder *gorm.DB, filterMap map[string]string) (int64, error) { + var count int64 + + // 过滤 + if filterMap != nil { + countBuilder = countBuilder.Scopes(handlers.FilterData(filterMap)) + } + + result := countBuilder.WithContext(ctx).Limit(1).Count(&count) + if result.Error != nil { + return 0, result.Error + } else { + return count, nil + } +} + +func (m *FsOrderModel) FindOneByQuery(ctx context.Context, rowBuilder *gorm.DB, filterMap map[string]string) (*FsOrderRel, error) { + var resp FsOrderRel + + if filterMap != nil { + rowBuilder = rowBuilder.Scopes(handlers.FilterData(filterMap)) + } + + result := rowBuilder.WithContext(ctx).Limit(1).Find(&resp) + if result.Error != nil { + return nil, result.Error + } else { + return &resp, nil + } +} + +// 事务 +func (m *FsOrderModel) Trans(ctx context.Context, fn func(ctx context.Context, connGorm *gorm.DB) error) error { + tx := m.db.Table(m.name).WithContext(ctx).Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + if err := tx.Error; err != nil { + return err + } + + if err := fn(ctx, tx); err != nil { + tx.Rollback() + return err + } + + return tx.Commit().Error +} + +func (m *FsOrderModel) TableName() string { + return m.name +} diff --git a/model/gmodel/fs_shopping_cart_logic.go b/model/gmodel/fs_shopping_cart_logic.go index 1f508ac9..f8356781 100644 --- a/model/gmodel/fs_shopping_cart_logic.go +++ b/model/gmodel/fs_shopping_cart_logic.go @@ -1,6 +1,15 @@ package gmodel -import "context" +import ( + "context" +) + +type RelaFsShoppingCart struct { + FsShoppingCart + ShoppingCartProduct *FsProduct `json:"shopping_cart_product" gorm:"foreignkey:product_id;references:id"` + ShoppingCartProductPriceList []*FsProductPrice `json:"shopping_cart_product_price_list" gorm:"foreignkey:product_id;references:product_id"` + ShoppingCartProductModel3dList []*FsProductModel3d `json:"shopping_cart_product_model3d_list" gorm:"foreignkey:product_id;references:product_id"` +} // 获取单个 func (s *FsShoppingCartModel) FindOne(ctx context.Context, id int64, fields ...string) (resp *FsShoppingCart, err error) { diff --git a/model/gmodel/var_gen.go b/model/gmodel/var_gen.go index 88beb3b4..df0d9ec3 100644 --- a/model/gmodel/var_gen.go +++ b/model/gmodel/var_gen.go @@ -30,6 +30,7 @@ type AllModelsGen struct { FsCloudReceiveEveryOld *FsCloudReceiveEveryOldModel // fs_cloud_receive_every_old FsCloudReceiveOld *FsCloudReceiveOldModel // fs_cloud_receive_old 云仓接收工厂总单 FsCloudRenderLogOld *FsCloudRenderLogOldModel // fs_cloud_render_log_old 云渲染日志表 + FsCloudStorage *FsCloudStorageModel // fs_cloud_storage 仓库的基本信息, 只做映射 FsCloudUserApplyBackOld *FsCloudUserApplyBackOldModel // fs_cloud_user_apply_back_old 该表废弃 FsContact *FsContactModel // fs_contact 该表暂未使用 FsContactService *FsContactServiceModel // fs_contact_service @@ -139,6 +140,7 @@ func NewAllModels(gdb *gorm.DB) *AllModelsGen { FsCloudReceiveEveryOld: NewFsCloudReceiveEveryOldModel(gdb), FsCloudReceiveOld: NewFsCloudReceiveOldModel(gdb), FsCloudRenderLogOld: NewFsCloudRenderLogOldModel(gdb), + FsCloudStorage: NewFsCloudStorageModel(gdb), FsCloudUserApplyBackOld: NewFsCloudUserApplyBackOldModel(gdb), FsContact: NewFsContactModel(gdb), FsContactService: NewFsContactServiceModel(gdb), diff --git a/server_api/order.api b/server_api/order.api new file mode 100644 index 00000000..3f755097 --- /dev/null +++ b/server_api/order.api @@ -0,0 +1,42 @@ +syntax = "v1" + +info ( + title: "订单模块" + desc: "订单相关" + author: "" + email: "" +) + +import "basic.api" + +service order { + + @handler CreateOrderHandler + post /api/order/create(CreateOrderReq) returns (response); + + @handler CreatePrePaymentHandler + post /api/order/create-prepayment(CreatePrePaymentReq) returns (response); + + @handler OrderListHandler + post /api/order/list(OrderListReq) returns (response); + +} + +type CreateOrderReq struct { + CartIds []int64 `json:"cart_ids"` + DeliveryMethod string `json:"delivery_method,options=[1,2]"` +} + +type CreatePrePaymentReq struct { + OrderSn string `json:"order_sn"` + DeliveryMethod int `json:"delivery_method"` + DeliveryAddres struct { + Address string `json:"address,optional"` + Name string `json:"name,optional"` + Mobile string `json:"mobile,optional"` + } `json:"delivery_addres,optional"` +} + +type OrderListReq struct { + +} \ No newline at end of file diff --git a/server_api/orders.api b/server_api/orders.api deleted file mode 100644 index cc0b11b1..00000000 --- a/server_api/orders.api +++ /dev/null @@ -1,217 +0,0 @@ -syntax = "v1" - -info ( - title: "订单模块" - desc: "订单相关" - author: "" - email: "" -) - -import "basic.api" - -service orders { - - @handler CreateOrderHandler - post /api/orders/create(CreateOrderReq) returns (response); - - @handler CreatePrePaymentHandler - post /api/orders/create-prepayment(OrderRefundReq) returns (response); - - @handler OrderListHandler - post /api/orders/list(OrderListReq) returns (response); - -} - -type CreateOrderReq struct { - CartIds []int64 `json:"cart_ids"` - DeliveryMethod string `json:"delivery_method"` -} - -type OrderRefundReq struct { - OrderNo string `json:"order_no"` - DeliveryMethod int64 `json:"delivery_method"` - DeliveryAddres DeliveryAddres `json:"delivery_addres"` -} -type DeliveryAddres struct { - Address string `json:"address"` - Name string `json:"name"` - Mobile string `json:"mobile"` -} - -type OrderDetail struct { - OrderProduct []OrderProduct `json:"order_product"` - OrderInfo OrderInfo `json:"order_info"` - OrderAmount OrderAmount `json:"order_amount"` - DeliveryAddres DeliveryAddres `json:"delivery_addres"` -} - -type ProductLogoResource struct { - ResourceID string `json:"resource_id"` - ResourceType string `json:"resource_type"` - ResourceURL string `json:"resource_url"` - Metadata map[string]interface{} `json:"metadata"` -} - -type TemplateInfo struct { - TemplateJSON string `json:"template_json"` - TemplateTag string `json:"template_tag"` -} -type ModelInfo struct { - ModelJSON string `json:"model_json"` -} -type FittingInfo struct { - FittingJSON string `json:"fitting_json"` -} -type SizeInfo struct { - Inch string `json:"inch"` - Cm string `json:"cm"` -} -type UserDiyInformation struct { - Phone string `json:"phone"` - Address string `json:"address"` - Website string `json:"website"` - Qrcode string `json:"qrcode"` - Slogan string `json:"slogan"` -} -type Snapshot struct { - Logo string `json:"logo"` - CombineImage string `json:"combine_image"` - RenderImage string `json:"render_image"` - TemplateInfo TemplateInfo `json:"template_info"` - ModelInfo ModelInfo `json:"model_info"` - FittingInfo FittingInfo `json:"fitting_info"` - SizeInfo SizeInfo `json:"size_info"` - UserDiyInformation UserDiyInformation `json:"user_diy_information"` -} -type ShoppingCartSnapshot struct { - ID int64 `json:"id"` - UserID int64 `json:"user_id"` - ProductID int64 `json:"product_id"` - TemplateID int64 `json:"template_id"` - ModelID int64 `json:"model_id"` - SizeID int64 `json:"size_id"` - FittingID int64 `json:"fitting_id"` - PurchaseQuantity int64 `json:"purchase_quantity"` - Snapshot Snapshot `json:"snapshot"` - IsHighlyCustomized int64 `json:"is_highly_customized"` - Ctime string `json:"ctime"` - Utime string `json:"utime"` -} -type OrderProduct struct { - ProductID string `json:"product_id"` - ProductName string `json:"product_name"` - ProductPrice string `json:"product_price"` - ProductLogo string `json:"product_logo"` - ProductLogoResource ProductLogoResource `json:"product_logo_resource"` - ProductSnapshot map[string]interface{} `json:"product_snapshot"` - Number int64 `json:"number"` - Amount string `json:"amount"` - Unit string `json:"unit"` - ExpectedDeliveryTime string `json:"expected_delivery_time"` - ShoppingCartSnapshot ShoppingCartSnapshot `json:"shopping_cart_snapshot"` -} - -type OrderStatus struct { - StatusCode int64 `json:"status_code"` - StatusTitle string `json:"status_title"` - ExpectedTime string `json:"expected_time"` - Ctime string `json:"ctime"` - Utime string `json:"utime"` - Metadata map[string]interface{} `json:"metadata"` - Children []*OrderStatus `json:"children"` -} -type OrderInfo struct { - OrderNo string `json:"order_no"` - DeliveryMethod int64 `json:"delivery_method"` - Ctime string `json:"ctime"` - Utime string `json:"utime"` - Status OrderStatus `json:"status"` - StatusLink []OrderStatus `json:"status_link"` - Metadata map[string]interface{} `json:"metadata"` -} -type Subtotal struct { - Currency string `json:"currency"` - Current string `json:"current"` - Initiate string `json:"initiate"` - Change string `json:"change"` - ChangeRemark string `json:"change_remark"` - Metadata map[string]interface{} `json:"metadata"` -} -type ShippingFee struct { - Currency string `json:"currency"` - Current string `json:"current"` - Initiate string `json:"initiate"` - Change string `json:"change"` - ChangeRemark string `json:"change_remark"` - Metadata map[string]interface{} `json:"metadata"` -} -type Tax struct { - Currency string `json:"currency"` - Current string `json:"current"` - Initiate string `json:"initiate"` - Change string `json:"change"` - ChangeRemark string `json:"change_remark"` - Metadata map[string]interface{} `json:"metadata"` -} -type Discount struct { - Currency string `json:"currency"` - Current string `json:"current"` - Initiate string `json:"initiate"` - Change string `json:"change"` - ChangeRemark string `json:"change_remark"` - Metadata map[string]interface{} `json:"metadata"` -} -type Total struct { - Currency string `json:"currency"` - Current string `json:"current"` - Initiate string `json:"initiate"` - Change string `json:"change"` - ChangeRemark string `json:"change_remark"` - Metadata map[string]interface{} `json:"metadata"` -} -type PayStatus struct { - StatusCode int64 `json:"status_code"` - StatusTitle string `json:"status_title"` - Metadata map[string]interface{} `json:"metadata"` -} - -type PayAmount struct { - Currency string `json:"currency"` - Current string `json:"current"` - Initiate string `json:"initiate"` - Change string `json:"change"` - ChangeRemark string `json:"change_remark"` - Metadata map[string]interface{} `json:"metadata"` -} -type Deposit struct { - TradeNo string `json:"trade_no"` - Status Status `json:"status"` - StatusLink []PayStatus `json:"status_link"` - PayTime string `json:"pay_time"` - PayAmount PayAmount `json:"pay_amount"` - PayMethod string `json:"pay_method"` - Metadata map[string]interface{} `json:"metadata"` -} -type RemainingBalance struct { - TradeNo string `json:"trade_no"` - Status PayStatus `json:"status"` - StatusLink []PayStatus `json:"status_link"` - PayTime string `json:"pay_time"` - PayAmount PayAmount `json:"pay_amount"` - PayMethod string `json:"pay_method"` - Metadata map[string]interface{} `json:"metadata"` -} -type OrderAmount struct { - Subtotal Subtotal `json:"subtotal"` - ShippingFee ShippingFee `json:"shipping_fee"` - Tax Tax `json:"tax"` - Discount Discount `json:"discount"` - Total Total `json:"total"` - Deposit Deposit `json:"deposit"` - RemainingBalance RemainingBalance `json:"remaining_balance"` -} -type DeliveryAddres struct { - Address string `json:"address"` - Name string `json:"name"` - Mobile string `json:"mobile"` -} diff --git a/service/repositories/order.go b/service/repositories/order.go new file mode 100644 index 00000000..1a34308e --- /dev/null +++ b/service/repositories/order.go @@ -0,0 +1,151 @@ +package repositories + +import ( + "context" + "encoding/json" + "errors" + "fusenapi/model/gmodel" + "fusenapi/utils/basic" + "fusenapi/utils/shopping_cart" + "math" + + "github.com/aws/aws-sdk-go/aws/session" + "gorm.io/gorm" +) + +func NewOrder(gormDB *gorm.DB, bLMServiceUrl *string, awsSession *session.Session) Order { + return &defaultOrder{ + MysqlConn: gormDB, + } +} + +type ( + defaultOrder struct { + MysqlConn *gorm.DB + } + Order interface { + // 下单 + // 预支付 + // 列表 + // 详情 + } + + /* 下单 */ + CreateReq struct { + CurrentCurrency string `json:"current_currency"` // 当前货币 + ExchangeRate string `json:"exchange_rate"` // 换算汇率 + OriginalCurrency string `json:"original_currency"` // 原始货币 + UserId int64 `json:"user_id"` + CartIds []int64 `json:"cart_ids"` + DeliveryMethod string `json:"delivery_method"` + } + CreateRes struct { + ErrorCode basic.StatusResponse + OrderSn string + } + /* 下单 */ +) + +// 下单 +func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRes, err error) { + var errorCode basic.StatusResponse + err = d.MysqlConn.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + // 查询购物车 + var shoppingCartList []*gmodel.RelaFsShoppingCart + resShoppingCartFind := tx.Preload("ShoppingCartProduct").Preload("ShoppingCartProductPriceList").Preload("ShoppingCartProductModel3dList"). + Where("id IN ?", in.CartIds). + Where("user_id = ?", in.UserId). + Find(&shoppingCartList) + err = resShoppingCartFind.Error + if err != nil { + return err + } + shoppingCartListLen := len(shoppingCartList) + if shoppingCartListLen == 0 { + errorCode = *basic.CodeErrOrderCreatShoppingCartEmpty + return errors.New(errorCode.Message) + } + if shoppingCartListLen != len(in.CartIds) { + errorCode = *basic.CodeErrOrderCreatShoppingCartNotMatched + return errors.New(errorCode.Message) + } + + var orderProductList []*gmodel.OrderProduct + + for _, shoppingCart := range shoppingCartList { + // 购物车快照 + var shoppingCartSnapshot shopping_cart.CartSnapshot + // 购物车商品价格 + var shoppingCartProductPrice *gmodel.FsProductPrice + // 购物车商品模型 + var shoppingCartProductModel3d *gmodel.FsProductModel3d + if shoppingCart.Snapshot != nil { + json.Unmarshal([]byte(*shoppingCart.Snapshot), &shoppingCartSnapshot) + } + // 商品异常 + if shoppingCart.ShoppingCartProduct == nil || (shoppingCart.ShoppingCartProduct != nil && *shoppingCart.ShoppingCartProduct.IsShelf == 0) { + errorCode = *basic.CodeErrOrderCreatProductAbsent + errorCode.Message = "create order failed, product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent。" + return errors.New(errorCode.Message) + } + // 商品价格异常 + if len(shoppingCart.ShoppingCartProductPriceList) == 0 { + errorCode = *basic.CodeErrOrderCreatProductPriceAbsent + errorCode.Message = "create order failed, price of product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent。" + return errors.New(errorCode.Message) + } else { + var isProductPrice bool + for _, shoppingCartProductPriceInfo := range shoppingCart.ShoppingCartProductPriceList { + if shoppingCart.SizeId == shoppingCartProductPriceInfo.SizeId { + shoppingCartProductPrice = shoppingCartProductPriceInfo + isProductPrice = true + break + } + } + if !isProductPrice { + errorCode = *basic.CodeErrOrderCreatProductPriceAbsent + errorCode.Message = "create order failed, price of product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent。" + return errors.New(errorCode.Message) + } + shoppingCart.ShoppingCartProductPriceList = []*gmodel.FsProductPrice{shoppingCartProductPrice} + } + + // 商品模型异常 + if len(shoppingCart.ShoppingCartProductModel3dList) == 0 { + errorCode = *basic.CodeErrOrderCreatProductAccessoryAbsent + errorCode.Message = "create order failed, accessoryof product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent。" + return errors.New(errorCode.Message) + } else { + var isProductModel bool + for _, shoppingCartProductModel3dInfo := range shoppingCart.ShoppingCartProductModel3dList { + if shoppingCart.SizeId == shoppingCartProductModel3dInfo.SizeId { + shoppingCartProductModel3d = shoppingCartProductModel3dInfo + isProductModel = true + break + } + } + if !isProductModel { + errorCode = *basic.CodeErrOrderCreatProductAccessoryAbsent + errorCode.Message = "create order failed, accessoryof product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent。" + return errors.New(errorCode.Message) + } + shoppingCart.ShoppingCartProductModel3dList = []*gmodel.FsProductModel3d{shoppingCartProductModel3d} + } + + var purchaseQuantity float64 = float64(*shoppingCart.PurchaseQuantity) + var eachBoxNum float64 = float64(*shoppingCartProductPrice.EachBoxNum) + var boxNum int64 = math.Ceil(purchaseQuantity / eachBoxNum) + + // 存储订单商品 + orderProductList = append(orderProductList, &gmodel.OrderProduct{}) + } + + return nil + }) + if err != nil { + + } + return &CreateRes{ + ErrorCode: errorCode, + }, nil +} diff --git a/utils/basic/basic.go b/utils/basic/basic.go index 795f04ba..dc6f383b 100644 --- a/utils/basic/basic.go +++ b/utils/basic/basic.go @@ -99,6 +99,13 @@ var ( CodeLogoCombineErr = &StatusResponse{5115, "logo combine fail"} // 合图失败 CodeLogoCombineNoFoundErr = &StatusResponse{5116, "template record not found"} // 模版不存在 + + CodeErrOrder = &StatusResponse{5300, "ocreate order failed"} // 订单错误 + CodeErrOrderCreatShoppingCartEmpty = &StatusResponse{5301, "ocreate order failed, shopping cart is empty"} // 订单创建失败,购物车为空 + CodeErrOrderCreatShoppingCartNotMatched = &StatusResponse{5302, "ocreate order failed, shopping cart not matched"} // 订单创建失败,购物车不相符 + CodeErrOrderCreatProductAbsent = &StatusResponse{5303, "ocreate order failed, product is absent"} // 订单创建失败,商品不存在 + CodeErrOrderCreatProductPriceAbsent = &StatusResponse{5304, "ocreate order failed, price of product is absent"} // 订单创建失败,商品价格不存在 + CodeErrOrderCreatProductAccessoryAbsent = &StatusResponse{5305, "ocreate order failed, accessory of product is absent"} // 订单创建失败,商品配件不存在 ) type Response struct { diff --git a/utils/configs/order.go b/utils/configs/order.go index eb1f8d6b..347bbe4c 100644 --- a/utils/configs/order.go +++ b/utils/configs/order.go @@ -2,13 +2,7 @@ package configs import ( "context" - "encoding/json" - "errors" - "fusenapi/constants" - "fusenapi/model/gmodel" - "strconv" - "github.com/zeromicro/go-zero/core/logx" "gorm.io/gorm" ) @@ -27,49 +21,49 @@ type WebSetTimeInfoData struct { } func GetOrderTimeConfig(ctx context.Context, db *gorm.DB) (res WebSetTimeInfo, err error) { - resData, err := gmodel.NewFsWebSetModel(db).FindValueByKey(ctx, string(constants.WEBSET_TIME_INFO)) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - res.ProductDay = int64(constants.ORDER_PRODUCT_DAY) - res.FactoryDeliverDay = int64(constants.ORDER_FACTORY_DELIVER_DAY) - res.DeliverUpsDay = int64(constants.ORDER_DELIVER_UPS_DAY) - res.UpsTransDay = int64(constants.ORDER_UPS_TRANS_DAY) - return res, nil - } - logx.Error(err) - return res, err - } else { - var timeInfo WebSetTimeInfoData - err = json.Unmarshal([]byte(*resData.Value), &timeInfo) - if err != nil { - logx.Error(err) - return res, err - } - productDay, err := strconv.Atoi(timeInfo.ProductDay) - if err != nil { - logx.Error(err) - return res, err - } - factoryDeliverDay, err := strconv.Atoi(timeInfo.FactoryDeliverDay) - if err != nil { - logx.Error(err) - return res, err - } - deliverUpsDay, err := strconv.Atoi(timeInfo.DeliverUpsDay) - if err != nil { - logx.Error(err) - return res, err - } - upsTransDay, err := strconv.Atoi(timeInfo.UpsTransDay) - if err != nil { - logx.Error(err) - return res, err - } - res.ProductDay = int64(productDay) - res.FactoryDeliverDay = int64(factoryDeliverDay) - res.DeliverUpsDay = int64(deliverUpsDay) - res.UpsTransDay = int64(upsTransDay) - } + // resData, err := gmodel.NewFsWebSetModel(db).FindValueByKey(ctx, string(constants.WEBSET_TIME_INFO)) + // if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // res.ProductDay = int64(constants.ORDER_PRODUCT_DAY) + // res.FactoryDeliverDay = int64(constants.ORDER_FACTORY_DELIVER_DAY) + // res.DeliverUpsDay = int64(constants.ORDER_DELIVER_UPS_DAY) + // res.UpsTransDay = int64(constants.ORDER_UPS_TRANS_DAY) + // return res, nil + // } + // logx.Error(err) + // return res, err + // } else { + // var timeInfo WebSetTimeInfoData + // err = json.Unmarshal([]byte(*resData.Value), &timeInfo) + // if err != nil { + // logx.Error(err) + // return res, err + // } + // productDay, err := strconv.Atoi(timeInfo.ProductDay) + // if err != nil { + // logx.Error(err) + // return res, err + // } + // factoryDeliverDay, err := strconv.Atoi(timeInfo.FactoryDeliverDay) + // if err != nil { + // logx.Error(err) + // return res, err + // } + // deliverUpsDay, err := strconv.Atoi(timeInfo.DeliverUpsDay) + // if err != nil { + // logx.Error(err) + // return res, err + // } + // upsTransDay, err := strconv.Atoi(timeInfo.UpsTransDay) + // if err != nil { + // logx.Error(err) + // return res, err + // } + // res.ProductDay = int64(productDay) + // res.FactoryDeliverDay = int64(factoryDeliverDay) + // res.DeliverUpsDay = int64(deliverUpsDay) + // res.UpsTransDay = int64(upsTransDay) + // } return res, nil } diff --git a/utils/order/order.go b/utils/order/order.go index 175f0c10..bcd3bbaa 100644 --- a/utils/order/order.go +++ b/utils/order/order.go @@ -1 +1,25 @@ package order + +import ( + "fusenapi/constants" + "fusenapi/model/gmodel" + "strconv" +) + +func GetAmountCurrency(req *gmodel.AmountCurrency) (*float64, error) { + if req.CurrentCurrency == req.OriginalCurrency { + req.CurrentAmount = req.OriginalAmount + } else { + f1, err1 := strconv.ParseFloat(string(req.OriginalAmount), 64) + if err1 != nil { + return nil, err1 + } + f2, err2 := strconv.ParseFloat(string(req.OriginalAmount), 64) + if err2 != nil { + return nil, err2 + } + result := f1 * f2 + req.CurrentAmount = constants.AmountUnit(strconv.FormatFloat(result, 'f', -1, 64)) + } + return nil +} From ab6f3249a2a1ed1c92880afaf51dc55433e74891 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 17:59:33 +0800 Subject: [PATCH 24/26] fix --- .../shopping-cart/internal/handler/routes.go | 5 +++++ server/shopping-cart/internal/types/types.go | 19 ++++++++++++++++++ server_api/shopping-cart.api | 20 +++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/server/shopping-cart/internal/handler/routes.go b/server/shopping-cart/internal/handler/routes.go index 9857154b..3a4188d6 100644 --- a/server/shopping-cart/internal/handler/routes.go +++ b/server/shopping-cart/internal/handler/routes.go @@ -32,6 +32,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { Path: "/api/shopping-cart/get_carts", Handler: GetCartsHandler(serverCtx), }, + { + Method: http.MethodPost, + Path: "/api/shopping-cart/calculate_cart_price", + Handler: CalculateCartPriceHandler(serverCtx), + }, }, ) } diff --git a/server/shopping-cart/internal/types/types.go b/server/shopping-cart/internal/types/types.go index db117d2a..231c717e 100644 --- a/server/shopping-cart/internal/types/types.go +++ b/server/shopping-cart/internal/types/types.go @@ -80,6 +80,25 @@ type DiyInformation struct { Slogan string `json:"slogan"` } +type CalculateCartPriceReq struct { + CalculateList []CalculateItem `json:"calculate_list"` +} + +type CalculateItem struct { + CartId int64 `json:"cart_id"` //购物车id + PurchaseQuantity int64 `json:"purchase_quantity"` //数量 +} + +type CalculateCartPriceRsp struct { + CalculateResultList []CalculateResultItem `json:"calculate_result_list"` +} + +type CalculateResultItem struct { + CartId int64 `json:"cart_id"` //购物车id + ItemPrice string `json:"item_price"` //单价 + TotalPrice string `json:"total_price"` //总价 +} + type Request struct { } diff --git a/server_api/shopping-cart.api b/server_api/shopping-cart.api index 27249f45..5c3da538 100644 --- a/server_api/shopping-cart.api +++ b/server_api/shopping-cart.api @@ -21,6 +21,9 @@ service shopping-cart { //获取购物车列表 @handler GetCartsHandler get /api/shopping-cart/get_carts(GetCartsReq) returns (response); + //计算购物车价格 + @handler CalculateCartPriceHandler + post /api/shopping-cart/calculate_cart_price(CalculateCartPriceReq) returns (response); } //加入购物车 @@ -90,4 +93,21 @@ type DiyInformation { Website string `json:"website"` Qrcode string `json:"qrcode"` Slogan string `json:"slogan"` +} + +//计算购物车价格 +type CalculateCartPriceReq { + CalculateList []CalculateItem `json:"calculate_list"` +} +type CalculateItem { + CartId int64 `json:"cart_id"` //购物车id + PurchaseQuantity int64 `json:"purchase_quantity"` //数量 +} +type CalculateCartPriceRsp { + CalculateResultList []CalculateResultItem `json:"calculate_result_list"` +} +type CalculateResultItem { + CartId int64 `json:"cart_id"` //购物车id + ItemPrice string `json:"item_price"` //单价 + TotalPrice string `json:"total_price"` //总价 } \ No newline at end of file From 43c34159ce34782226897e572db552b4429731f3 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Fri, 15 Sep 2023 18:19:01 +0800 Subject: [PATCH 25/26] fix --- .../handler/calculatecartpricehandler.go | 35 ++++++++ .../internal/logic/calculatecartpricelogic.go | 86 +++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 server/shopping-cart/internal/handler/calculatecartpricehandler.go create mode 100644 server/shopping-cart/internal/logic/calculatecartpricelogic.go 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) +// } From 95b826d8a6276ad23fef507ae6fa7f4d0a5ef463 Mon Sep 17 00:00:00 2001 From: momo <1012651275@qq.com> Date: Fri, 15 Sep 2023 18:30:45 +0800 Subject: [PATCH 26/26] =?UTF-8?q?fix:=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- service/repositories/order.go | 34 ++++++++++++++++++++++++++++------ utils/order/order.go | 26 ++++++++++---------------- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/service/repositories/order.go b/service/repositories/order.go index 1a34308e..b92668b8 100644 --- a/service/repositories/order.go +++ b/service/repositories/order.go @@ -7,6 +7,7 @@ import ( "fusenapi/model/gmodel" "fusenapi/utils/basic" "fusenapi/utils/shopping_cart" + "fusenapi/utils/step_price" "math" "github.com/aws/aws-sdk-go/aws/session" @@ -85,13 +86,13 @@ func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRe // 商品异常 if shoppingCart.ShoppingCartProduct == nil || (shoppingCart.ShoppingCartProduct != nil && *shoppingCart.ShoppingCartProduct.IsShelf == 0) { errorCode = *basic.CodeErrOrderCreatProductAbsent - errorCode.Message = "create order failed, product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent。" + errorCode.Message = "create order failed, product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent" return errors.New(errorCode.Message) } // 商品价格异常 if len(shoppingCart.ShoppingCartProductPriceList) == 0 { errorCode = *basic.CodeErrOrderCreatProductPriceAbsent - errorCode.Message = "create order failed, price of product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent。" + errorCode.Message = "create order failed, price of product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent" return errors.New(errorCode.Message) } else { var isProductPrice bool @@ -104,7 +105,7 @@ func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRe } if !isProductPrice { errorCode = *basic.CodeErrOrderCreatProductPriceAbsent - errorCode.Message = "create order failed, price of product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent。" + errorCode.Message = "create order failed, price of product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent" return errors.New(errorCode.Message) } shoppingCart.ShoppingCartProductPriceList = []*gmodel.FsProductPrice{shoppingCartProductPrice} @@ -113,7 +114,7 @@ func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRe // 商品模型异常 if len(shoppingCart.ShoppingCartProductModel3dList) == 0 { errorCode = *basic.CodeErrOrderCreatProductAccessoryAbsent - errorCode.Message = "create order failed, accessoryof product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent。" + errorCode.Message = "create order failed, accessoryof product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent" return errors.New(errorCode.Message) } else { var isProductModel bool @@ -126,7 +127,7 @@ func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRe } if !isProductModel { errorCode = *basic.CodeErrOrderCreatProductAccessoryAbsent - errorCode.Message = "create order failed, accessoryof product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent。" + errorCode.Message = "create order failed, accessory of product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is absent" return errors.New(errorCode.Message) } shoppingCart.ShoppingCartProductModel3dList = []*gmodel.FsProductModel3d{shoppingCartProductModel3d} @@ -134,7 +135,28 @@ func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRe var purchaseQuantity float64 = float64(*shoppingCart.PurchaseQuantity) var eachBoxNum float64 = float64(*shoppingCartProductPrice.EachBoxNum) - var boxNum int64 = math.Ceil(purchaseQuantity / eachBoxNum) + var boxNum float64 = math.Ceil(purchaseQuantity / eachBoxNum) + var stepNum []int + var stepPrice []int + if *shoppingCartProductPrice.StepNum == "" { + errorCode = *basic.CodeErrOrderCreatProductPriceAbsent + errorCode.Message = "create order failed, step num of product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is failed" + return errors.New(errorCode.Message) + } else { + json.Unmarshal([]byte(*shoppingCartProductPrice.StepNum), &stepNum) + } + if *shoppingCartProductPrice.StepPrice == "" { + errorCode = *basic.CodeErrOrderCreatProductPriceAbsent + errorCode.Message = "create order failed, step price of product '" + shoppingCartSnapshot.ProductInfo.ProductName + "'is failed" + return errors.New(errorCode.Message) + } else { + json.Unmarshal([]byte(*shoppingCartProductPrice.StepPrice), &stepPrice) + } + // 商品单价 + productPrice := step_price.GetCentStepPrice(int(boxNum), stepNum, stepPrice) + + // 商品总价 + productTotalPrice := productPrice * *shoppingCart.PurchaseQuantity // 存储订单商品 orderProductList = append(orderProductList, &gmodel.OrderProduct{}) diff --git a/utils/order/order.go b/utils/order/order.go index bcd3bbaa..ca040188 100644 --- a/utils/order/order.go +++ b/utils/order/order.go @@ -1,25 +1,19 @@ package order -import ( - "fusenapi/constants" - "fusenapi/model/gmodel" - "strconv" -) +type AmountCurrency struct { + ExchangeRate float64 `json:"exchange_rate"` // 换算汇率 + CurrentAmount float64 `json:"current_amount"` // 当前金额 + OriginalAmount float64 `json:"original_amount"` // 原始金额 + CurrentCurrency string `json:"current_currency"` // 当前货币 + OriginalCurrency string `json:"original_currency"` // 原始货币 +} -func GetAmountCurrency(req *gmodel.AmountCurrency) (*float64, error) { +// 汇率换算 +func GetAmountCurrency(req *AmountCurrency) error { if req.CurrentCurrency == req.OriginalCurrency { req.CurrentAmount = req.OriginalAmount } else { - f1, err1 := strconv.ParseFloat(string(req.OriginalAmount), 64) - if err1 != nil { - return nil, err1 - } - f2, err2 := strconv.ParseFloat(string(req.OriginalAmount), 64) - if err2 != nil { - return nil, err2 - } - result := f1 * f2 - req.CurrentAmount = constants.AmountUnit(strconv.FormatFloat(result, 'f', -1, 64)) + req.CurrentAmount = req.OriginalAmount * req.ExchangeRate } return nil }