fix:购物车下单

This commit is contained in:
momo 2023-09-20 11:39:56 +08:00
parent 78558bb74d
commit b45da2b637
6 changed files with 117 additions and 38 deletions

View File

@ -76,8 +76,11 @@ var OrderStatusMessage map[OrderStatusCode]string
// 支付状态名称 // 支付状态名称
var PayStatusMessage map[PayStatusCode]string var PayStatusMessage map[PayStatusCode]string
// 订单状态--用户可见 // 订单状态--用户可见--直邮
var OrderStatusUser []OrderStatusCode var OrderStatusUserDIRECTMAIL []OrderStatusCode
// 订单状态--用户可见--云仓
var OrderStatusUserCLOUDSTORE []OrderStatusCode
func init() { func init() {
// 订单状态名称 // 订单状态名称
@ -101,10 +104,14 @@ func init() {
OrderStatusMessage[ORDERSTATUSCLOUDSTOREOMPLETEPRODUCTION] = "云仓单--生产完成" OrderStatusMessage[ORDERSTATUSCLOUDSTOREOMPLETEPRODUCTION] = "云仓单--生产完成"
OrderStatusMessage[ORDERSTATUSCLOUDSTOREARRIVEDWAREHOUSE] = "云仓单--直达仓库" OrderStatusMessage[ORDERSTATUSCLOUDSTOREARRIVEDWAREHOUSE] = "云仓单--直达仓库"
// 订单状态--用户可见 // 订单状态--用户可见--直邮
OrderStatusUser = []OrderStatusCode{ OrderStatusUserDIRECTMAIL = []OrderStatusCode{
ORDERSTATUSUNPAIDDEPOSIT, ORDERSTATUSUNPAIDDEPOSIT,
ORDERSTATUSDIRECTMAILORDERED, ORDERSTATUSDIRECTMAILSTARTPRODUCTION, ORDERSTATUSDIRECTMAILCOMPLETEPRODUCTION, ORDERSTATUSDIRECTMAILSHIPPED, ORDERSTATUSDIRECTMAILARRIVED, ORDERSTATUSDIRECTMAILORDERED, ORDERSTATUSDIRECTMAILSTARTPRODUCTION, ORDERSTATUSDIRECTMAILCOMPLETEPRODUCTION, ORDERSTATUSDIRECTMAILSHIPPED, ORDERSTATUSDIRECTMAILARRIVED,
}
// 订单状态--用户可见--云仓
OrderStatusUserCLOUDSTORE = []OrderStatusCode{
ORDERSTATUSUNPAIDDEPOSIT,
ORDERSTATUSCLOUDSTOREORDERED, ORDERSTATUSCLOUDSTORESTARTPRODUCTION, ORDERSTATUSCLOUDSTOREOMPLETEPRODUCTION, ORDERSTATUSCLOUDSTOREARRIVEDWAREHOUSE, ORDERSTATUSCLOUDSTOREORDERED, ORDERSTATUSCLOUDSTORESTARTPRODUCTION, ORDERSTATUSCLOUDSTOREOMPLETEPRODUCTION, ORDERSTATUSCLOUDSTOREARRIVEDWAREHOUSE,
} }
} }

View File

@ -53,7 +53,7 @@ type PayInfo struct {
Metadata map[string]interface{} `json:"metadata"` // 额外参数 Metadata map[string]interface{} `json:"metadata"` // 额外参数
PayAmount AmountInfo `json:"pay_amount"` // 金额明细 PayAmount AmountInfo `json:"pay_amount"` // 金额明细
PayMethod string `json:"pay_method"` // 交易方式 PayMethod string `json:"pay_method"` // 交易方式
PayTime string `json:"pay_time"` // 支付时间 PayTime time.Time `json:"pay_time"` // 支付时间
Status PayStatus `json:"status"` // 当前状态 Status PayStatus `json:"status"` // 当前状态
StatusLink []PayStatus `json:"status_link"` // 状态链路 StatusLink []PayStatus `json:"status_link"` // 状态链路
TradeNo string `json:"trade_no"` // 支付交易号 TradeNo string `json:"trade_no"` // 支付交易号
@ -86,24 +86,24 @@ type PayStatus struct {
// 订单信息 // 订单信息
type OrderInfo struct { type OrderInfo struct {
Ctime string `json:"ctime"` // 创建日期 Ctime time.Time `json:"ctime"` // 创建日期
DeliveryMethod int64 `json:"delivery_method"` // 物流类型 DeliveryMethod int64 `json:"delivery_method"` // 物流类型
Metadata map[string]interface{} `json:"metadata"` // 额外参数 Metadata map[string]interface{} `json:"metadata"` // 额外参数
OrderSn string `json:"order_sn"` // 订单编号 OrderSn string `json:"order_sn"` // 订单编号
Status OrderStatus `json:"status"` // 当前状态 Status OrderStatus `json:"status"` // 当前状态
StatusLink []OrderStatus `json:"status_link"` // 状态链路 StatusLink []OrderStatus `json:"status_link"` // 状态链路
Utime string `json:"utime"` // 更新时间 Utime time.Time `json:"utime"` // 更新时间
} }
// 订单状态--用户 // 订单状态--用户
type OrderStatus struct { type OrderStatus struct {
Children []*OrderStatus `json:"children"` // 子状态,管理人员的处理状态, 用户不可见 Children []*OrderStatus `json:"children"` // 子状态,管理人员的处理状态, 用户不可见
Ctime string `json:"ctime"` // 创建时间 Ctime time.Time `json:"ctime"` // 创建时间
ExpectedTime string `json:"expected_time"` // 预计时间 ExpectedTime time.Time `json:"expected_time"` // 预计时间
Metadata map[string]interface{} `json:"metadata"` // 额外参数 Metadata map[string]interface{} `json:"metadata"` // 额外参数
StatusCode constants.OrderStatusCode `json:"status_code"` // 状态编码 StatusCode constants.OrderStatusCode `json:"status_code"` // 状态编码
StatusTitle string `json:"status_title"` // 状态名称 StatusTitle string `json:"status_title"` // 状态名称
Utime string `json:"utime"` // 更新时间 Utime time.Time `json:"utime"` // 更新时间
} }
// 订单商品 // 订单商品

View File

@ -9,6 +9,7 @@ type RelaFsShoppingCart struct {
ShoppingCartProduct *RelaFsProduct `json:"shopping_cart_product" gorm:"foreignkey:product_id;references:id"` ShoppingCartProduct *RelaFsProduct `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"` 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"` ShoppingCartProductModel3dList []*FsProductModel3d `json:"shopping_cart_product_model3d_list" gorm:"foreignkey:product_id;references:product_id"`
ShoppingCartProductModel3dFitting *FsProductModel3d `json:"shopping_cart_product_model3d_list_fitting" gorm:"foreignkey:fitting_id;references:id"`
} }
// 获取单个 // 获取单个

View File

@ -15,7 +15,7 @@ service order {
post /api/order/create(CreateOrderReq) returns (response); post /api/order/create(CreateOrderReq) returns (response);
@handler CreatePrePaymentHandler @handler CreatePrePaymentHandler
post /api/order/create-prepayment(CreatePrePaymentReq) returns (response); post /api/order/create-prepayment-balance(CreatePrePaymentReq) returns (response);
@handler OrderListHandler @handler OrderListHandler
post /api/order/list(OrderListReq) returns (response); post /api/order/list(OrderListReq) returns (response);

View File

@ -4,7 +4,6 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"fusenapi/constants" "fusenapi/constants"
"fusenapi/model/gmodel" "fusenapi/model/gmodel"
"fusenapi/utils/basic" "fusenapi/utils/basic"
@ -62,12 +61,15 @@ type (
// 下单 // 下单
func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRes, err error) { func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRes, err error) {
var errorCode basic.StatusResponse var errorCode basic.StatusResponse
// 订单编号
var orderSn string = order.GenerateOrderNumber(int(in.DeliveryMethod), int(in.UserId))
err = d.MysqlConn.WithContext(ctx).Transaction(func(tx *gorm.DB) error { err = d.MysqlConn.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
// 查询购物车 // 查询购物车
var shoppingCartList []*gmodel.RelaFsShoppingCart var shoppingCartList []*gmodel.RelaFsShoppingCart
resShoppingCartFind := tx.Preload("ShoppingCartProduct", func(dbPreload *gorm.DB) *gorm.DB { resShoppingCartFind := tx.Preload("ShoppingCartProduct", func(dbPreload *gorm.DB) *gorm.DB {
return dbPreload.Table(gmodel.NewFsProductModel(tx).TableName()).Preload("CoverResource") return dbPreload.Table(gmodel.NewFsProductModel(tx).TableName()).Preload("CoverResource")
}).Preload("ShoppingCartProductPriceList").Preload("ShoppingCartProductModel3dList"). }).Preload("ShoppingCartProductPriceList").Preload("ShoppingCartProductModel3dList").Preload("ShoppingCartProductModel3dFitting").
Where("id IN ?", in.CartIds). Where("id IN ?", in.CartIds).
Where("user_id = ?", in.UserId). Where("user_id = ?", in.UserId).
Find(&shoppingCartList) Find(&shoppingCartList)
@ -86,7 +88,7 @@ func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRe
} }
// 订单商品列表 // 订单商品列表
var orderProductList []*gmodel.OrderProduct var orderProductList []gmodel.OrderProduct
var shippingFee gmodel.AmountInfo var shippingFee gmodel.AmountInfo
// 订单税费总价(厘) // 订单税费总价(厘)
@ -229,7 +231,7 @@ func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRe
var productSnapshot = make(map[string]interface{}, 1) var productSnapshot = make(map[string]interface{}, 1)
productSnapshot["product_snapshot"] = shoppingCart.ShoppingCartProduct productSnapshot["product_snapshot"] = shoppingCart.ShoppingCartProduct
orderProductList = append(orderProductList, &gmodel.OrderProduct{ orderProductList = append(orderProductList, gmodel.OrderProduct{
Amount: order.GetAmountInfo(order.GetAmountInfoReq{ Amount: order.GetAmountInfo(order.GetAmountInfoReq{
ExchangeRate: in.ExchangeRate, ExchangeRate: in.ExchangeRate,
Initiate: productTotalPrice, Initiate: productTotalPrice,
@ -272,29 +274,94 @@ func (d *defaultOrder) Create(ctx context.Context, in *CreateReq) (res *CreateRe
OriginalCurrency: in.OriginalCurrency, OriginalCurrency: in.OriginalCurrency,
}) })
// 定金 // 定金
var depositInt int64 //厘 var depositInt int64 = orderTotal / 2
var deposit = gmodel.PayInfo{ var deposit = gmodel.PayInfo{
Status: gmodel.PayStatus{ Status: gmodel.PayStatus{
StatusCode: int64(constants.PAYSTATUSUNPAID), StatusCode: int64(constants.PAYSTATUSUNPAID),
StatusTitle: constants.PayStatusMessage[constants.PAYSTATUSUNPAID], StatusTitle: constants.PayStatusMessage[constants.PAYSTATUSUNPAID],
}, },
PayAmount: gmodel.AmountInfo{}, PayAmount: order.GetAmountInfo(order.GetAmountInfoReq{
ExchangeRate: in.ExchangeRate,
Initiate: depositInt,
Current: depositInt,
CurrentCurrency: in.CurrentCurrency,
OriginalCurrency: in.OriginalCurrency,
}),
} }
// 尾款 // 尾款
var remainingBalanceInt int64 //厘 var remainingBalanceInt int64 = orderTotal - depositInt
var remainingBalance = gmodel.PayInfo{} var remainingBalance = gmodel.PayInfo{
fmt.Println(orderProductList, shippingFee, shippingFeeTotal, tax, taxTotal, discount, discountTotal, subtotal, orderProductTotal, total) Status: gmodel.PayStatus{
StatusCode: int64(constants.PAYSTATUSUNPAID),
StatusTitle: constants.PayStatusMessage[constants.PAYSTATUSUNPAID],
},
PayAmount: order.GetAmountInfo(order.GetAmountInfoReq{
ExchangeRate: in.ExchangeRate,
Initiate: remainingBalanceInt,
Current: remainingBalanceInt,
CurrentCurrency: in.CurrentCurrency,
OriginalCurrency: in.OriginalCurrency,
}),
}
var orderAmount = gmodel.OrderAmount{ var orderAmount = gmodel.OrderAmount{
Deposit: deposit, Deposit: deposit,
RemainingBalance: remainingBalance, RemainingBalance: remainingBalance,
Discount: discount,
ShippingFee: shippingFee,
Tax: tax,
Subtotal: subtotal,
Total: total,
}
// 订单状态--当前
var status = gmodel.OrderStatus{
Ctime: nowTime,
Utime: nowTime,
StatusCode: constants.ORDERSTATUSUNPAIDDEPOSIT,
StatusTitle: constants.OrderStatusMessage[constants.ORDERSTATUSUNPAIDDEPOSIT],
}
// 订单状态--链路
var statusLink = order.GenerateOrderStatusLink(in.DeliveryMethod, nowTime)
var orderInfo = gmodel.OrderInfo{
Ctime: nowTime,
DeliveryMethod: in.DeliveryMethod,
OrderSn: orderSn,
Status: status,
StatusLink: statusLink,
}
var orderDetail = gmodel.OrderDetail{
DeliveryAddress: orderAddress,
OrderAmount: orderAmount,
OrderInfo: orderInfo,
OrderProduct: orderProductList,
PayStatus: payStatus,
}
// 数据库操作
var order = gmodel.NewFsOrder{
UserId: &in.UserId,
DeliveryMethod: &in.DeliveryMethod,
OrderSn: &orderSn,
Status: (*int64)(&status.StatusCode),
PayStatus: (*int64)(&payStatus),
Ctime: &nowTime,
Metadata: &orderDetail,
}
result := tx.Create(&order)
if result.Error != nil {
return result.Error
} }
return nil return nil
}) })
if err != nil { if err != nil {
fmt.Println(err) return &CreateRes{
OrderSn: orderSn,
ErrorCode: errorCode,
}, err
} }
return &CreateRes{ return &CreateRes{
OrderSn: orderSn,
ErrorCode: errorCode, ErrorCode: errorCode,
}, nil }, nil
} }

View File

@ -81,7 +81,7 @@ func GetAmountInfo(req GetAmountInfoReq) gmodel.AmountInfo {
} }
} }
func GenerateOrderNumber(userID int) string { func GenerateOrderNumber(deliveryMethod int, userID int) string {
// 获取当前时间 // 获取当前时间
now := time.Now() now := time.Now()
@ -98,26 +98,30 @@ func GenerateOrderNumber(userID int) string {
randomNum := fmt.Sprintf("%02d", rand.Intn(100)) randomNum := fmt.Sprintf("%02d", rand.Intn(100))
// 拼接订单号 // 拼接订单号
orderNumber := year + month + day + hour + minute + second + randomNum + strconv.Itoa(userID) orderNumber := year + month + day + hour + minute + second + randomNum + strconv.Itoa(userID) + strconv.Itoa(deliveryMethod)
return orderNumber return orderNumber
} }
// 初始化订单状态 // 初始化订单状态
func GenerateOrderStatusLink(req []gmodel.OrderStatus) []gmodel.OrderStatus { func GenerateOrderStatusLink(deliveryMethod int64, noTime time.Time) []gmodel.OrderStatus {
var list []gmodel.OrderStatus var list []gmodel.OrderStatus
for _, v := range constants.OrderStatusUser { var orderStatus []constants.OrderStatusCode
for _, v1 := range req { if deliveryMethod == constants.DELIVERYMETHODDIRECTMAIL {
if v1.StatusCode == v { orderStatus = constants.OrderStatusUserDIRECTMAIL
list = append(list, v1)
} else { } else {
orderStatus = constants.OrderStatusUserCLOUDSTORE
}
for _, v := range orderStatus {
list = append(list, gmodel.OrderStatus{ list = append(list, gmodel.OrderStatus{
StatusCode: v, StatusCode: v,
StatusTitle: constants.OrderStatusMessage[v], StatusTitle: constants.OrderStatusMessage[v],
}) })
} }
} list[0].Ctime = noTime
} list[0].Utime = noTime
tPlus60Days := noTime.AddDate(0, 0, 60)
list[len(list)-1].ExpectedTime = tPlus60Days
return list return list
} }