修复钱包金额精度结算
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
|||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"hfb_sys/backend/internal/model"
|
"hfb_sys/backend/internal/model"
|
||||||
@@ -118,6 +119,7 @@ func (r *Repository) AdminLedger(query AdminLedgerQuery) (*PaginatedResult, erro
|
|||||||
|
|
||||||
func AppendEntries(tx *gorm.DB, entries ...Entry) error {
|
func AppendEntries(tx *gorm.DB, entries ...Entry) error {
|
||||||
for _, entry := range entries {
|
for _, entry := range entries {
|
||||||
|
entry.Amount = roundWalletMoney(entry.Amount)
|
||||||
if entry.Amount <= 0 {
|
if entry.Amount <= 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -169,25 +171,28 @@ func ensureAccount(tx *gorm.DB, userID uint64) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func applyEntry(account *model.WalletAccount, entry Entry) (float64, error) {
|
func applyEntry(account *model.WalletAccount, entry Entry) (float64, error) {
|
||||||
|
entry.Amount = roundWalletMoney(entry.Amount)
|
||||||
|
account.AvailableBalance = roundWalletMoney(account.AvailableBalance)
|
||||||
|
account.FrozenBalance = roundWalletMoney(account.FrozenBalance)
|
||||||
switch entry.BalanceType {
|
switch entry.BalanceType {
|
||||||
case "available":
|
case "available":
|
||||||
if entry.Direction == "in" {
|
if entry.Direction == "in" {
|
||||||
account.AvailableBalance += entry.Amount
|
account.AvailableBalance = roundWalletMoney(account.AvailableBalance + entry.Amount)
|
||||||
} else {
|
} else {
|
||||||
if account.AvailableBalance < entry.Amount {
|
if account.AvailableBalance < entry.Amount {
|
||||||
return 0, ErrInsufficientBalance
|
return 0, ErrInsufficientBalance
|
||||||
}
|
}
|
||||||
account.AvailableBalance -= entry.Amount
|
account.AvailableBalance = roundWalletMoney(account.AvailableBalance - entry.Amount)
|
||||||
}
|
}
|
||||||
return account.AvailableBalance, nil
|
return account.AvailableBalance, nil
|
||||||
case "frozen":
|
case "frozen":
|
||||||
if entry.Direction == "in" {
|
if entry.Direction == "in" {
|
||||||
account.FrozenBalance += entry.Amount
|
account.FrozenBalance = roundWalletMoney(account.FrozenBalance + entry.Amount)
|
||||||
} else {
|
} else {
|
||||||
if account.FrozenBalance < entry.Amount {
|
if account.FrozenBalance < entry.Amount {
|
||||||
return 0, ErrInsufficientBalance
|
return 0, ErrInsufficientBalance
|
||||||
}
|
}
|
||||||
account.FrozenBalance -= entry.Amount
|
account.FrozenBalance = roundWalletMoney(account.FrozenBalance - entry.Amount)
|
||||||
}
|
}
|
||||||
return account.FrozenBalance, nil
|
return account.FrozenBalance, nil
|
||||||
default:
|
default:
|
||||||
@@ -195,6 +200,10 @@ func applyEntry(account *model.WalletAccount, entry Entry) (float64, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func roundWalletMoney(value float64) float64 {
|
||||||
|
return math.Round(value*100) / 100
|
||||||
|
}
|
||||||
|
|
||||||
func toAccountDTO(account model.WalletAccount) *AccountDTO {
|
func toAccountDTO(account model.WalletAccount) *AccountDTO {
|
||||||
return &AccountDTO{
|
return &AccountDTO{
|
||||||
UserID: account.UserID,
|
UserID: account.UserID,
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package wallet
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"hfb_sys/backend/internal/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestApplyEntryRoundsMoneyBeforeComparing(t *testing.T) {
|
||||||
|
account := model.WalletAccount{
|
||||||
|
UserID: 7,
|
||||||
|
FrozenBalance: 606.41,
|
||||||
|
}
|
||||||
|
entry := Entry{
|
||||||
|
UserID: 7,
|
||||||
|
Direction: "out",
|
||||||
|
Amount: 406.41 + 200.00,
|
||||||
|
BalanceType: "frozen",
|
||||||
|
}
|
||||||
|
|
||||||
|
balanceAfter, err := applyEntry(&account, entry)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("applyEntry() error = %v", err)
|
||||||
|
}
|
||||||
|
if balanceAfter != 0 {
|
||||||
|
t.Fatalf("balanceAfter = %v, want 0", balanceAfter)
|
||||||
|
}
|
||||||
|
if account.FrozenBalance != 0 {
|
||||||
|
t.Fatalf("FrozenBalance = %v, want 0", account.FrozenBalance)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user