fix:支付

This commit is contained in:
momo
2023-09-28 17:53:41 +08:00
parent 4032255694
commit 642ca772e8
10 changed files with 385 additions and 23 deletions

View File

@@ -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 {