147 lines
4.4 KiB
Go
147 lines
4.4 KiB
Go
package walletser
|
|
|
|
import (
|
|
"91porn-server/app/appg"
|
|
"91porn-server/common/db"
|
|
"91porn-server/common/log"
|
|
"91porn-server/common/stderr"
|
|
"91porn-server/models/v/txnmod"
|
|
"91porn-server/models/v/walletmod"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
func debitPlan(w *walletmod.Wallet, amt int64) *walletmod.DebitPlan {
|
|
p := walletmod.DebitPlan{}
|
|
l1 := w.Amount - amt
|
|
if l1 >= 0 { //amount够了
|
|
p.Amount = amt
|
|
return &p
|
|
} else { // l1 < 0
|
|
//amount 扣完
|
|
l2 := w.Income + l1
|
|
if l2 >= 0 {
|
|
p.Amount = w.Amount
|
|
p.Income = -l1
|
|
return &p
|
|
} else {
|
|
return nil //余额不足
|
|
}
|
|
}
|
|
}
|
|
|
|
const (
|
|
StoreBuyGoods = 1
|
|
StoreBuyNudeChat = 2
|
|
StorePublishWish = 3
|
|
StoreGoodsOrderRefund = 4
|
|
StoreNudeChatOrderRefund = 5
|
|
StoreWishRefund = 6
|
|
StoreWishEdit = 7
|
|
)
|
|
|
|
// StoreDeductBalance 商城相关扣款
|
|
func StoreDeductBalance(uid uint64, amount int64, orderId primitive.ObjectID, source int, desc string) (balance int64, code stderr.Code) {
|
|
w, err := walletmod.GetWallet(uid)
|
|
if err != nil || w == nil {
|
|
return 0, stderr.ErrNetWorkBusy
|
|
}
|
|
plan := debitPlan(w, amount)
|
|
if plan == nil {
|
|
return 0, stderr.InsufficientBalance
|
|
}
|
|
var tranType txnmod.TransType
|
|
switch source {
|
|
case StoreBuyGoods:
|
|
tranType = txnmod.StoreBuyGoods
|
|
case StoreBuyNudeChat:
|
|
tranType = txnmod.StoreBuyNudeChat
|
|
case StorePublishWish:
|
|
tranType = txnmod.StorePublishWish
|
|
case StoreWishEdit:
|
|
tranType = txnmod.StoreWishEdit
|
|
default:
|
|
return 0, stderr.ErrParamError
|
|
}
|
|
err = appg.VideoDB.Trans(func(t *db.MongoTool) (err error) {
|
|
wallet, err := walletmod.Debit(t, plan, uid)
|
|
if err != nil {
|
|
log.Error("StoreDeductBalance walletmod.Debit fail", log.Any("uid", uid), log.Any("orderId", orderId), log.Any("amount", amount), log.Any("source", source))
|
|
return
|
|
}
|
|
// 写入流水
|
|
txnLog := &txnmod.TransactionLog{UID: uid,
|
|
Amount: -amount,
|
|
ActualAmount: float64(-amount),
|
|
TranType: tranType.Key(),
|
|
TranTypeInt: int64(tranType),
|
|
TransNo: orderId,
|
|
Desc: desc,
|
|
//DiscDoc: discDoc,
|
|
//SysType: u.SysType,
|
|
RealAmount: walletmod.GetRealAmount(wallet),
|
|
}
|
|
err = txnmod.InsertTransactionLog(t, txnLog)
|
|
if err != nil {
|
|
log.Error("StoreDeductBalance txnmod.InsertTransactionLog fail", log.Any("uid", uid), log.Any("orderId", orderId), log.Any("amount", amount), log.Any("source", source))
|
|
return
|
|
}
|
|
balance = wallet.Amount + wallet.Income
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
log.Error("StoreDeductBalance fail", log.Any("uid", uid), log.Any("orderId", orderId), log.Any("amount", amount), log.Any("source", source))
|
|
return 0, stderr.Failure //通知消息
|
|
}
|
|
return balance, stderr.Success
|
|
}
|
|
|
|
// StoreRefund 商城相关退款
|
|
func StoreRefund(uid uint64, amount int64, orderId primitive.ObjectID, source int, desc string) (balance int64, code stderr.Code) {
|
|
w, err := walletmod.GetWallet(uid)
|
|
if err != nil || w == nil {
|
|
return 0, stderr.ErrNetWorkBusy
|
|
}
|
|
var tranType txnmod.TransType
|
|
switch source {
|
|
case StoreGoodsOrderRefund:
|
|
tranType = txnmod.StoreGoodsOrderRefund
|
|
case StoreNudeChatOrderRefund:
|
|
tranType = txnmod.StoreNudeChatOrderRefund
|
|
case StoreWishRefund:
|
|
tranType = txnmod.StoreWishRefund
|
|
default:
|
|
return 0, stderr.ErrParamError
|
|
}
|
|
err = appg.VideoDB.Trans(func(t *db.MongoTool) (err error) {
|
|
wallet, err := walletmod.CreditAmount(t, amount, uid)
|
|
if err != nil {
|
|
log.Error("StoreRefund walletmod.CreditAmount fail", log.Any("uid", uid), log.Any("orderId", orderId), log.Any("amount", amount), log.Any("source", source))
|
|
return
|
|
}
|
|
// 写入流水
|
|
txnLog := &txnmod.TransactionLog{UID: uid,
|
|
Amount: amount,
|
|
ActualAmount: float64(amount),
|
|
TranType: tranType.Key(),
|
|
TranTypeInt: int64(tranType),
|
|
TransNo: orderId,
|
|
Desc: desc,
|
|
//DiscDoc: discDoc,
|
|
//SysType: u.SysType,
|
|
RealAmount: walletmod.GetRealAmount(wallet),
|
|
}
|
|
err = txnmod.InsertTransactionLog(t, txnLog)
|
|
if err != nil {
|
|
log.Error("StoreRefund txnmod.InsertTransactionLog fail", log.Any("uid", uid), log.Any("orderId", orderId), log.Any("amount", amount), log.Any("source", source))
|
|
return
|
|
}
|
|
balance = wallet.Amount + wallet.Income
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
log.Error("StoreRefund fail", log.Any("uid", uid), log.Any("orderId", orderId), log.Any("amount", amount), log.Any("source", source))
|
|
return 0, stderr.Failure //通知消息
|
|
}
|
|
return balance, stderr.Success
|
|
}
|