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
|
|||
|
}
|