fix:支付
This commit is contained in:
@@ -11,6 +11,8 @@ import (
|
||||
"fusenapi/utils/handlers"
|
||||
"fusenapi/utils/order"
|
||||
"fusenapi/utils/pay"
|
||||
"fusenapi/utils/queue"
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
@@ -19,15 +21,17 @@ import (
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func NewOrder(gormDB *gorm.DB, bLMServiceUrl *string, awsSession *session.Session) Order {
|
||||
func NewOrder(gormDB *gorm.DB, bLMServiceUrl *string, awsSession *session.Session, delayQueue *queue.DelayMessage) Order {
|
||||
return &defaultOrder{
|
||||
MysqlConn: gormDB,
|
||||
MysqlConn: gormDB,
|
||||
DelayQueue: delayQueue,
|
||||
}
|
||||
}
|
||||
|
||||
type (
|
||||
defaultOrder struct {
|
||||
MysqlConn *gorm.DB
|
||||
MysqlConn *gorm.DB
|
||||
DelayQueue *queue.DelayMessage
|
||||
}
|
||||
Order interface {
|
||||
// 下单
|
||||
@@ -42,6 +46,11 @@ type (
|
||||
Detail(ctx context.Context, in *DetailReq) (res *DetailRes, err error)
|
||||
// 支付成功
|
||||
PaymentSuccessful(ctx context.Context, in *PaymentSuccessfulReq) (res *PaymentSuccessfulRes, err error)
|
||||
// 关闭
|
||||
Close(ctx context.Context, in *CloseReq) (res *CloseRes, err error)
|
||||
|
||||
// 支付超时订单自动关闭
|
||||
CloseList(ctx context.Context, in *CloseListReq) (res *CloseListRes, err error)
|
||||
}
|
||||
|
||||
PayInfo struct {
|
||||
@@ -74,6 +83,22 @@ type (
|
||||
Amount int64 `json:"amount"` // 金额
|
||||
Label string `json:"label"` // 标签
|
||||
}
|
||||
/* 支付超时订单自动关闭 */
|
||||
CloseListReq struct {
|
||||
Type int64 // type:1=关闭
|
||||
}
|
||||
CloseListRes struct{}
|
||||
/* 支付超时订单自动关闭 */
|
||||
|
||||
/* 关闭 */
|
||||
CloseReq struct {
|
||||
Type int64 // type:1=添加购物车
|
||||
OrderSn string
|
||||
}
|
||||
CloseRes struct {
|
||||
ErrorCode basic.StatusResponse
|
||||
}
|
||||
/* 关闭 */
|
||||
|
||||
/* 支付成功 */
|
||||
PaymentSuccessfulReq struct {
|
||||
@@ -170,6 +195,138 @@ type (
|
||||
/* 列表 */
|
||||
)
|
||||
|
||||
// 支付超时订单自动关闭
|
||||
func (d *defaultOrder) CloseList(ctx context.Context, in *CloseListReq) (res *CloseListRes, err error) {
|
||||
var orderList []gmodel.FsOrder
|
||||
result := d.MysqlConn.Model(&gmodel.FsOrder{}).
|
||||
Where("is_del = ?", 0).
|
||||
Where("status = ?", int64(constants.ORDER_STATUS_UNPAIDDEPOSIT)).
|
||||
Where("pay_status = ?", int64(constants.ORDER_PAY_STATUS_UNPAIDDEPOSIT)).
|
||||
Find(&orderList)
|
||||
if result.Error != nil {
|
||||
logc.Errorf(ctx, "order count failed, err: %v", err)
|
||||
return nil, result.Error
|
||||
}
|
||||
for _, orderInfo := range orderList {
|
||||
var ntime = time.Now().UTC()
|
||||
var cptime = orderInfo.Ctime.UTC().Add(time.Minute * 30)
|
||||
var dtime time.Time
|
||||
var dd = ntime.Unix() - cptime.Unix()
|
||||
if dd > 0 {
|
||||
dtime = time.Now().Add(time.Second * 0)
|
||||
} else {
|
||||
dtime = time.Now().Add(time.Second * time.Duration(math.Abs(float64(dd))))
|
||||
}
|
||||
// 延时任务
|
||||
d.DelayQueue.AddTask(dtime, constants.QUEUE_NAME_ORDER, func(args ...interface{}) {
|
||||
ctx := context.Background()
|
||||
orderSn := args[0].(string)
|
||||
logc.Infof(ctx, "order close, orderSn: %s", orderSn)
|
||||
d.Close(ctx, &CloseReq{
|
||||
OrderSn: orderSn,
|
||||
Type: 1,
|
||||
})
|
||||
}, []interface{}{*orderInfo.OrderSn})
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// 关闭
|
||||
func (d *defaultOrder) Close(ctx context.Context, in *CloseReq) (res *CloseRes, err error) {
|
||||
fmt.Println(in)
|
||||
var errorCode basic.StatusResponse
|
||||
err = d.MysqlConn.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||||
var orderInfo gmodel.FsOrder
|
||||
model := tx.Where("status = ?", int64(constants.ORDER_STATUS_UNPAIDDEPOSIT)).Where("pay_status = ?", int(constants.ORDER_PAY_STATUS_UNPAIDDEPOSIT))
|
||||
if in.OrderSn != "" {
|
||||
model.Where("order_sn = ?", in.OrderSn)
|
||||
}
|
||||
result := model.Take(&orderInfo)
|
||||
if result.Error != nil {
|
||||
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
||||
errorCode = *basic.CodeErrOrderCreatePrePaymentInfoNoFound
|
||||
} else {
|
||||
errorCode = *basic.CodeServiceErr
|
||||
}
|
||||
logc.Errorf(ctx, "order close failed, err: %v", err)
|
||||
return result.Error
|
||||
}
|
||||
ress, err := d.OrderDetailHandler(ctx, &orderInfo, 0)
|
||||
if err != nil {
|
||||
logc.Errorf(ctx, "order close failed DetailOrderDetailHandler,OrderSn:%s, err: %v", in.OrderSn, err)
|
||||
return err
|
||||
}
|
||||
// 更新状态、状态链路
|
||||
var ntime = time.Now().UTC()
|
||||
var statusCode = constants.ORDER_STATUS_CLOSE
|
||||
var statusLink = order.UpdateOrderStatusLink(ress.OrderDetailOriginal.StatusLink, gmodel.OrderStatus{
|
||||
Ctime: &ntime,
|
||||
Utime: &ntime,
|
||||
StatusCode: statusCode,
|
||||
StatusTitle: constants.OrderStatusMessage[statusCode],
|
||||
})
|
||||
statusLinkByte, err := json.Marshal(statusLink)
|
||||
if err != nil {
|
||||
logc.Errorf(ctx, "order close failed Marshal statusLinkByte,OrderSn:%s, err: %v", in.OrderSn, err)
|
||||
return err
|
||||
}
|
||||
|
||||
var table = gmodel.NewAllModels(tx).FsOrder.TableName()
|
||||
var resUpdate *gorm.DB
|
||||
var resUpdateSql string = fmt.Sprintf("UPDATE %s SET `status` = %d , `utime` = '%s'", table, statusCode, ntime)
|
||||
resUpdate = tx.Exec(fmt.Sprintf("%s ,`status_link`= JSON_MERGE_PATCH(`status_link`,?) WHERE `id` = %d", resUpdateSql, orderInfo.Id), statusLinkByte)
|
||||
|
||||
err = resUpdate.Error
|
||||
if err != nil {
|
||||
logc.Errorf(ctx, "order close failed Update FsOrder,OrderSn:%s, err: %v", in.OrderSn, err)
|
||||
return err
|
||||
}
|
||||
|
||||
// 新增购物车
|
||||
if in.Type == 1 {
|
||||
var users []gmodel.FsShoppingCart
|
||||
for _, shoppingCart := range ress.OrderDetailOriginal.ShoppingCartSnapshot {
|
||||
users = append(users, gmodel.FsShoppingCart{
|
||||
UserId: shoppingCart.UserId,
|
||||
ProductId: shoppingCart.ProductId,
|
||||
TemplateId: shoppingCart.TemplateId,
|
||||
ModelId: shoppingCart.ModelId,
|
||||
SizeId: shoppingCart.SizeId,
|
||||
LightId: shoppingCart.FittingId,
|
||||
FittingId: shoppingCart.FittingId,
|
||||
PurchaseQuantity: shoppingCart.PurchaseQuantity,
|
||||
Snapshot: shoppingCart.Snapshot,
|
||||
IsSelected: shoppingCart.IsSelected,
|
||||
IsHighlyCustomized: shoppingCart.IsHighlyCustomized,
|
||||
Ctime: &ntime,
|
||||
Utime: &ntime,
|
||||
})
|
||||
}
|
||||
resCreate := tx.Create(&users)
|
||||
err = resCreate.Error
|
||||
if err != nil {
|
||||
logc.Errorf(ctx, "order close failed Create FsShoppingCart,OrderSn:%s, err: %v", in.OrderSn, err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
logc.Errorf(ctx, "order close failed, err: %v", err)
|
||||
if errorCode.Code == 0 {
|
||||
errorCode.Code = basic.CodeApiErr.Code
|
||||
errorCode.Message = basic.CodeApiErr.Message
|
||||
}
|
||||
return &CloseRes{
|
||||
ErrorCode: errorCode,
|
||||
}, err
|
||||
}
|
||||
|
||||
return &CloseRes{
|
||||
ErrorCode: errorCode,
|
||||
}, err
|
||||
}
|
||||
|
||||
// 支付成功
|
||||
func (d *defaultOrder) PaymentSuccessful(ctx context.Context, in *PaymentSuccessfulReq) (res *PaymentSuccessfulRes, err error) {
|
||||
var orderSn string
|
||||
@@ -380,7 +537,7 @@ func (d *defaultOrder) PaymentSuccessful(ctx context.Context, in *PaymentSuccess
|
||||
})
|
||||
|
||||
// 更新数据库
|
||||
var table = gmodel.NewAllModels(d.MysqlConn).FsOrder.TableName()
|
||||
var table = gmodel.NewAllModels(tx).FsOrder.TableName()
|
||||
var resUpdate *gorm.DB
|
||||
var resUpdateSql string
|
||||
if *orderInfo.Status == int64(constants.ORDER_STATUS_UNPAIDDEPOSIT) {
|
||||
@@ -388,7 +545,7 @@ func (d *defaultOrder) PaymentSuccessful(ctx context.Context, in *PaymentSuccess
|
||||
} else {
|
||||
resUpdateSql = fmt.Sprintf("UPDATE %s SET `pay_status` = %d , `utime` = '%s'", table, orderPayStatusCode, ntime)
|
||||
}
|
||||
resUpdate = d.MysqlConn.Exec(fmt.Sprintf("%s ,`status_link`= JSON_MERGE_PATCH(`status_link`,?),`pay_status_link`= JSON_MERGE_PATCH(`pay_status_link`,?),`order_amount`= JSON_MERGE_PATCH(`order_amount`,?) WHERE `id` = %d", resUpdateSql, orderInfo.Id), statusLinkByte, payStatusLinkByte, orderAmountByte)
|
||||
resUpdate = tx.Exec(fmt.Sprintf("%s ,`status_link`= JSON_MERGE_PATCH(`status_link`,?),`pay_status_link`= JSON_MERGE_PATCH(`pay_status_link`,?),`order_amount`= JSON_MERGE_PATCH(`order_amount`,?) WHERE `id` = %d", resUpdateSql, orderInfo.Id), statusLinkByte, payStatusLinkByte, orderAmountByte)
|
||||
|
||||
err = resUpdate.Error
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user