mirror of
https://github.com/kongyuebin1/dongfeng-pay.git
synced 2024-12-26 12:12:25 +08:00
136 lines
4.4 KiB
Go
136 lines
4.4 KiB
Go
package pay_for
|
||
|
||
import (
|
||
"context"
|
||
"errors"
|
||
"fmt"
|
||
"gateway/conf"
|
||
"gateway/models/accounts"
|
||
"gateway/models/payfor"
|
||
"gateway/utils"
|
||
"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 == conf.PAYFOR_FAIL || tmpForPay.Status == conf.PAYFOR_SUCCESS {
|
||
logs.Error(fmt.Sprintf("该代付订单uid=%s,状态已经是最终结果", tmpForPay.PayforUid))
|
||
return errors.New("状态已经是最终结果")
|
||
}
|
||
//更新payfor记录的状态
|
||
tmpForPay.Status = conf.PAYFOR_FAIL
|
||
tmpForPay.UpdateTime = utils.GetBasicDateTime()
|
||
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 = utils.GetBasicDateTime()
|
||
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 == conf.PAYFOR_FAIL || tmpPayFor.Status == conf.PAYFOR_SUCCESS {
|
||
logs.Error(fmt.Sprintf("该代付订单uid=#{payFor.PayforUid},已经是最终结果,不需要处理"))
|
||
return errors.New("已经是最终结果,不需要处理")
|
||
}
|
||
|
||
tmpPayFor.UpdateTime = utils.GetBasicDateTime()
|
||
tmpPayFor.Status = conf.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 = utils.GetBasicDateTime()
|
||
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.AccountHistoryInfo{
|
||
AccountUid: tmpPayFor.MerchantUid,
|
||
AccountName: tmpPayFor.MerchantName,
|
||
Type: conf.SUB_AMOUNT,
|
||
Amount: tmpPayFor.PayforTotalAmount,
|
||
Balance: account.Balance,
|
||
UpdateTime: utils.GetBasicDateTime(),
|
||
CreateTime: utils.GetBasicDateTime(),
|
||
}
|
||
|
||
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
|
||
}
|