|
|
|
@ -8,6 +8,7 @@ import (
|
|
|
|
|
"recook/internal/dbc"
|
|
|
|
|
"recook/internal/model/order"
|
|
|
|
|
"recook/internal/model/user"
|
|
|
|
|
"recook/internal/v2/model/jyy"
|
|
|
|
|
"recook/internal/v2/model/recook/goods"
|
|
|
|
|
user2 "recook/internal/v2/model/recook/user"
|
|
|
|
|
"recook/tools"
|
|
|
|
@ -38,7 +39,7 @@ const (
|
|
|
|
|
ErrorWallet = "余额不足,请使用其它方式支付"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func createOrder(virtualID uint, ip string, userID uint, password string) error {
|
|
|
|
|
func createOrder(virtualID uint, ip string, userID uint, password string, is bool) error {
|
|
|
|
|
var od []order.Information
|
|
|
|
|
if err := dbc.DB.Find(&od, "virtual_id = ?", virtualID).Error; err != nil {
|
|
|
|
|
return err
|
|
|
|
@ -77,30 +78,52 @@ func createOrder(virtualID uint, ip string, userID uint, password string) error
|
|
|
|
|
return errors.New(ErrorBalance)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var wallet user.Wallet
|
|
|
|
|
if err := dbc.DB.First(&wallet, "user_id = ?", userID).Error; err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if wallet.Balance.LessThan(amount) {
|
|
|
|
|
return errors.New(ErrorWallet)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := walletCheck(&wallet, now, password); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tx := dbc.DB.Begin()
|
|
|
|
|
{
|
|
|
|
|
for _, o := range od {
|
|
|
|
|
if err := payOrder(tx, o, &wallet, ip); err != nil {
|
|
|
|
|
tx.Rollback()
|
|
|
|
|
return err
|
|
|
|
|
if !is {
|
|
|
|
|
// 余额支付
|
|
|
|
|
if wallet.Balance.LessThan(amount) {
|
|
|
|
|
return errors.New(ErrorWallet)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tx := dbc.DB.Begin()
|
|
|
|
|
{
|
|
|
|
|
for _, o := range od {
|
|
|
|
|
|
|
|
|
|
if err := payOrder(tx, o, &wallet, ip); err != nil {
|
|
|
|
|
tx.Rollback()
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tx.Commit()
|
|
|
|
|
} else {
|
|
|
|
|
// 预存款支付
|
|
|
|
|
var wallet2 jyy.UserWallet
|
|
|
|
|
dbc.DB.First(&wallet2, "user_id = ?", userID)
|
|
|
|
|
if wallet2.Deposit.LessThan(amount) {
|
|
|
|
|
return errors.New(ErrorWallet)
|
|
|
|
|
}
|
|
|
|
|
tx := dbc.DB.Begin()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
for _, o := range od {
|
|
|
|
|
|
|
|
|
|
if err := payDeposit(tx, o, &wallet2, ip); err != nil {
|
|
|
|
|
tx.Rollback()
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tx.Commit()
|
|
|
|
|
}
|
|
|
|
|
tx.Commit()
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -114,7 +137,7 @@ func walletCheck(wallet *user.Wallet, now int64, passwd string) error {
|
|
|
|
|
ErrorCount: wallet.ErrorCount + 1,
|
|
|
|
|
UnlockTime: formatime.NewSecondFrom(time.Now().Add(time.Minute * 10)),
|
|
|
|
|
})
|
|
|
|
|
return errors.New(fmt.Sprintf("%d次错误,密码已被锁定,请10分钟后再试", passwordLockCount))
|
|
|
|
|
return fmt.Errorf("%d次错误,密码已被锁定,请10分钟后再试", passwordLockCount)
|
|
|
|
|
} else {
|
|
|
|
|
if wallet.UnlockTime.Time.Unix() < now && wallet.ErrorCount == passwordLockCount {
|
|
|
|
|
dbc.DB.Model(&wallet).Updates(map[string]interface{}{
|
|
|
|
@ -153,20 +176,6 @@ func payOrder(tx *gorm.DB, orderInfo order.Information, wallet *user.Wallet, ip
|
|
|
|
|
return errors.New("账户扣款失败")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//one := user.WalletBalanceList{
|
|
|
|
|
// UserID: wallet.UserID,
|
|
|
|
|
// Amount: orderInfo.ActualTotalAmount.Mul(decimal.NewFromInt(-1)),
|
|
|
|
|
// Style: orderInfo.Style,
|
|
|
|
|
// Comment: "订单支付抵扣",
|
|
|
|
|
// OrderID: orderInfo.ID,
|
|
|
|
|
// OrderTime: orderInfo.CreatedAt,
|
|
|
|
|
//}
|
|
|
|
|
//err = tx.Create(&one).Error
|
|
|
|
|
//if err != nil {
|
|
|
|
|
// tx.Rollback()
|
|
|
|
|
// http.Err(c, err.Error())
|
|
|
|
|
// return
|
|
|
|
|
//}
|
|
|
|
|
recookUserWalletBalanceListModel := &user2.RecookUserWalletBalanceListModel{
|
|
|
|
|
UserId: wallet.UserID,
|
|
|
|
|
IncomeType: user2.RecookUserWalletBalanceListIncomeTypePay, // 订单支付
|
|
|
|
@ -198,7 +207,7 @@ func PayOrder(c *gin.Context) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if !public.Judge(p.OrderID) {
|
|
|
|
|
if err = createOrder(p.OrderID, c.ClientIP(), p.UserID, p.Password); err != nil {
|
|
|
|
|
if err = createOrder(p.OrderID, c.ClientIP(), p.UserID, p.Password, false); err != nil {
|
|
|
|
|
back.Err(c, err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
@ -273,3 +282,102 @@ func PayOrder(c *gin.Context) {
|
|
|
|
|
c.Set("id", p.OrderID)
|
|
|
|
|
back.Suc(c, "支付成功", nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func PayDeposit(c *gin.Context) {
|
|
|
|
|
var p appCreateOrderParam
|
|
|
|
|
err := tools.ParseParams(&p, c)
|
|
|
|
|
if err != nil {
|
|
|
|
|
back.Fail(c, err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if !public.Judge(p.OrderID) {
|
|
|
|
|
if err = createOrder(p.OrderID, c.ClientIP(), p.UserID, p.Password, true); err != nil {
|
|
|
|
|
back.Err(c, err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
back.Suc(c, "支付成功", nil)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err = public.UpdateNormalPay(p.OrderID); err != nil {
|
|
|
|
|
back.Err(c, err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
now := time.Now().Unix()
|
|
|
|
|
var orderInfo order.Information
|
|
|
|
|
|
|
|
|
|
err = dbc.DB.First(&orderInfo, "id = ?", p.OrderID).Error
|
|
|
|
|
if err != nil {
|
|
|
|
|
back.Err(c, err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if !orderInfo.CanPay && orderInfo.OrderType == 2 {
|
|
|
|
|
err = errors.New("批发订单运费未确定无法支付")
|
|
|
|
|
back.Fail(c, err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
err = public.ValidateOrderInfo(&orderInfo, now)
|
|
|
|
|
if err != nil {
|
|
|
|
|
back.Fail(c, err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
var wallet user.Wallet
|
|
|
|
|
dbc.DB.First(&wallet, "user_id = ?", orderInfo.UserID)
|
|
|
|
|
|
|
|
|
|
var wallet2 jyy.UserWallet
|
|
|
|
|
dbc.DB.First(&wallet2, "user_id = ?", orderInfo.UserID)
|
|
|
|
|
if wallet2.Deposit.LessThan(orderInfo.ActualTotalAmount) {
|
|
|
|
|
back.Fail(c, "余额不足,请使用其它方式支付")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(wallet.Password) == 0 {
|
|
|
|
|
back.Fail(c, "没有设置支付密码")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err = walletCheck(&wallet, now, p.Password); err != nil {
|
|
|
|
|
back.Fail(c, err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tx := dbc.DB.Begin()
|
|
|
|
|
{
|
|
|
|
|
if err = payDeposit(tx, orderInfo, &wallet2, c.ClientIP()); err != nil {
|
|
|
|
|
tx.Rollback()
|
|
|
|
|
back.Fail(c, err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tx.Commit()
|
|
|
|
|
back.Suc(c, "支付成功", nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func payDeposit(tx *gorm.DB, orderInfo order.Information, wallet *jyy.UserWallet, ip string) error {
|
|
|
|
|
if err := tx.Model(&orderInfo).Updates(
|
|
|
|
|
map[string]interface{}{
|
|
|
|
|
"PayIP": ip,
|
|
|
|
|
"PayMethod": 10,
|
|
|
|
|
}).Error; err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if orderInfo.ActualTotalAmount.GreaterThan(decimal.NewFromFloat(0.0)) {
|
|
|
|
|
if r := tx.Model(wallet).Where("version = ?", wallet.Version).Updates(map[string]interface{}{
|
|
|
|
|
"deposit": gorm.Expr("deposit - ?", orderInfo.ActualTotalAmount),
|
|
|
|
|
"version": gorm.Expr("version + 1"),
|
|
|
|
|
}).RowsAffected; r == 00 {
|
|
|
|
|
return errors.New("账户扣款失败")
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := public.PaySuccessCallback(tx, orderInfo, formatime.NewSecondNow()); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|