145 lines
4.5 KiB
Go
145 lines
4.5 KiB
Go
package pay_for
|
||
|
||
import (
|
||
"context"
|
||
"errors"
|
||
"fmt"
|
||
"gateway/internal/config"
|
||
"gateway/internal/models/accounts"
|
||
"gateway/internal/models/payfor"
|
||
"time"
|
||
|
||
"github.com/beego/beego/v2/client/orm"
|
||
"github.com/beego/beego/v2/core/logs"
|
||
)
|
||
|
||
func PayForFail(p payfor.PayforInfo) bool {
|
||
o := orm.NewOrm()
|
||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||
var tmpForPay payfor.PayforInfo
|
||
if err := txOrm.Raw(
|
||
"select * from payfor_info where bank_order_id = ? for update", p.BankOrderId).
|
||
QueryRow(&tmpForPay); err != nil || tmpForPay.PayforUid == "" {
|
||
|
||
logs.Error("solve pay fail select fail:", err)
|
||
return err
|
||
}
|
||
|
||
if tmpForPay.Status == config.PAYFOR_FAIL || tmpForPay.Status == config.PAYFOR_SUCCESS {
|
||
logs.Error(fmt.Sprintf("该代付订单uid=%s,状态已经是最终结果", tmpForPay.PayforUid))
|
||
return errors.New("状态已经是最终结果")
|
||
}
|
||
// 更新payfor记录的状态
|
||
tmpForPay.Status = config.PAYFOR_FAIL
|
||
tmpForPay.UpdateTime = time.Now()
|
||
if _, err := txOrm.Update(&tmpForPay); err != nil {
|
||
logs.Error("PayForFail update payfor_info fail: ", err)
|
||
return err
|
||
}
|
||
|
||
var account accounts.AccountInfo
|
||
if err := txOrm.Raw(
|
||
"select * from account_info where account_uid = ? for update",
|
||
tmpForPay.MerchantUid).
|
||
QueryRow(&account); err != nil || account.AccountUid == "" {
|
||
|
||
logs.Error("payfor select account fail:", err)
|
||
return err
|
||
}
|
||
|
||
account.UpdateTime = time.Now()
|
||
if account.PayforAmount < tmpForPay.PayforTotalAmount {
|
||
logs.Error(fmt.Sprintf("商户uid=%s,账户中待代付金额小于代付记录的金额", tmpForPay.MerchantUid))
|
||
return errors.New("账户中待代付金额小于代付记录的金额")
|
||
}
|
||
// 将正在打款中的金额减去
|
||
account.PayforAmount = account.PayforAmount - tmpForPay.PayforTotalAmount
|
||
|
||
if _, err := txOrm.Update(&account); err != nil {
|
||
logs.Error("PayForFail update account fail: ", err)
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}); err != nil {
|
||
return false
|
||
}
|
||
return true
|
||
}
|
||
|
||
func PayForSuccess(p payfor.PayforInfo) bool {
|
||
o := orm.NewOrm()
|
||
|
||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||
var tmpPayFor payfor.PayforInfo
|
||
if err := txOrm.Raw("select * from payfor_info where bank_order_id = ? for update",
|
||
p.BankOrderId).
|
||
QueryRow(&tmpPayFor); err != nil || tmpPayFor.PayforUid == "" {
|
||
logs.Error("payfor success select payfor fail:", err)
|
||
return err
|
||
}
|
||
if tmpPayFor.Status == config.PAYFOR_FAIL || tmpPayFor.Status == config.PAYFOR_SUCCESS {
|
||
logs.Error(fmt.Sprintf("该代付订单uid=#{payFor.PayforUid},已经是最终结果,不需要处理"))
|
||
return errors.New("已经是最终结果,不需要处理")
|
||
}
|
||
|
||
tmpPayFor.UpdateTime = time.Now()
|
||
tmpPayFor.Status = config.PAYFOR_SUCCESS
|
||
_, err := txOrm.Update(&tmpPayFor)
|
||
if err != nil {
|
||
logs.Error("PayForSuccess update payfor fail: ", err)
|
||
return err
|
||
}
|
||
|
||
var account accounts.AccountInfo
|
||
if err := txOrm.Raw(
|
||
"select * from account_info where account_uid = ? for update",
|
||
tmpPayFor.MerchantUid).
|
||
QueryRow(&account); err != nil || account.AccountUid == "" {
|
||
logs.Error("payfor success select account fail:", err)
|
||
return err
|
||
}
|
||
|
||
account.UpdateTime = time.Now()
|
||
if account.PayforAmount < tmpPayFor.PayforTotalAmount {
|
||
logs.Error(fmt.Sprintf("商户uid=#{payFor.MerchantUid},账户中待代付金额小于代付记录的金额"))
|
||
return errors.New("账户中待代付金额小于代付记录的金额")
|
||
}
|
||
|
||
// 代付打款中的金额减去
|
||
account.PayforAmount = account.PayforAmount - tmpPayFor.PayforTotalAmount
|
||
// 减去余额,减去可用金额
|
||
account.Balance = account.Balance - tmpPayFor.PayforTotalAmount
|
||
// 已结算金额减去
|
||
account.SettleAmount = account.SettleAmount - tmpPayFor.PayforTotalAmount
|
||
|
||
if _, err := txOrm.Update(&account); err != nil {
|
||
logs.Error("PayForSuccess update account fail:", err)
|
||
return err
|
||
}
|
||
|
||
// 添加一条动账记录
|
||
accountHistory := accounts.AccountHistoryInfoModel{
|
||
AccountUid: tmpPayFor.MerchantUid,
|
||
AccountName: tmpPayFor.MerchantName,
|
||
OrderId: tmpPayFor.MerchantOrderId,
|
||
Type: config.SUB_AMOUNT,
|
||
Amount: tmpPayFor.PayforTotalAmount,
|
||
Balance: account.Balance,
|
||
UpdateTime: time.Now(),
|
||
CreateTime: time.Now(),
|
||
}
|
||
|
||
if _, err := txOrm.Insert(&accountHistory); err != nil {
|
||
logs.Error("PayForSuccess insert account history fail: ", err)
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}); err != nil {
|
||
return false
|
||
}
|
||
|
||
return true
|
||
}
|