This commit is contained in:
2025-02-06 11:14:33 +08:00
commit 07847a2d9e
535 changed files with 65131 additions and 0 deletions

View File

@ -0,0 +1,334 @@
package udunservice
import (
"encoding/json"
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/shopspring/decimal"
"go-admin/app/admin/models"
"go-admin/pkg/timehelper"
"go-admin/pkg/udunhelper"
"go-admin/pkg/utility"
"go.uber.org/zap"
"gorm.io/gorm"
"math"
"strconv"
"strings"
)
// TradeCallback 充值,提币回调
func TradeCallback(orm *gorm.DB, timestamp, nonce, body, sign string) string {
log.Error("充值,提币回调返回值", zap.String("body", body), zap.String("timestamp", timestamp), zap.String("nonce", nonce),
zap.String("sign", sign))
//验证签名
sign1 := udunhelper.CheckCallBackSign(timestamp, nonce, body)
//udunhelper.CheckCallBackSign()
if sign != sign1 {
log.Error("充值,提币回调返回值 签名不正确", zap.String("body", body), zap.String("timestamp", timestamp), zap.String("nonce", nonce),
zap.String("sign", sign))
return "error"
}
// 反序列化
var trade udunhelper.CallBackRes
if err := json.Unmarshal([]byte(body), &trade); err != nil {
return "error"
}
// 充值
if trade.TradeType == 1 {
//
return handleRecharge(orm, trade, timestamp)
} else if trade.TradeType == 2 {
//提币
//return handleWithdraw(trade)
}
return "success"
}
// 充值回调处理
func handleRecharge(orm *gorm.DB, trade udunhelper.CallBackRes, timestamp string) string {
// 检测是否已经写入,根据交易Hash判断是否已经存在充值记录
var charge models.LineRecharge
err := orm.Model(&models.LineRecharge{}).Where("txid = ?", trade.TxId).Find(&charge).Error
if err != nil {
log.Error("GetVtsRechargeByOrderNo", zap.Error(err))
return "error"
}
if charge.Status == "2" {
// 已经成功,则不继续写入
log.Error("已经成功,则不继续写入", zap.String("txId", trade.TxId))
return "error"
}
// 充币通知
amount := getBalance(trade.Amount, trade.Decimals)
fee := getBalance(trade.Fee, trade.Decimals)
// 查询钱包信息
var wallet models.LineWallet
err = orm.Model(&models.LineWallet{}).Where("address = ?", trade.Address).Find(&wallet).Error
//wallet, err := walletdb.GetVtsWalletByAddress(trade.Address)
if err != nil {
log.Error("GetVtsWalletByAddress", zap.Error(err), zap.String("address", trade.Address))
return "error"
}
// 加载币种信息
var udCoin models.LineUduncoin
err = orm.Model(&models.LineUduncoin{}).Where("main_coin_type = ? AND coin_type = ?", trade.MainCoinType, trade.CoinType).Find(&udCoin).Error
//udCoin, err := uduncoindb.GetVtsUduncoinItemByCoinType(trade.MainCoinType, trade.CoinType)
if err != nil {
log.Error("GetVtsUduncoinItemByCoinType", zap.Error(err), zap.String("MainCoinType", trade.MainCoinType),
zap.String("CoinType", trade.CoinType))
return "error"
}
height := utility.StringAsInteger(trade.BlockHigh)
//currTime := time.Now()
status := 1
switch trade.Status {
case 0:
status = 1
case 1:
status = 1
case 2:
status = 3 // 失败
case 3:
status = 2 // 成功
case 4:
status = 3 // 失败
}
coinCode := udCoin.Symbol
if strings.EqualFold(coinCode, "TRCUSDT") {
coinCode = "USDT"
}
//coin := coinservice.CoinCache.GetByCode(coinCode)
//if coin.Id == 0 {
// loghelper.Error("TradeCallback 充值,提币回调 未找到系统对应的币种Id", zap.String("udCoin.Symbol", udCoin.Symbol))
// return "error"
//}
t1 := timehelper.IntToTime(utility.StringAsInt64(timestamp))
//timehelper.IntToTime()
// 充值
recharge := models.LineRecharge{
UserId: wallet.UserId,
Confirms: strconv.Itoa(0),
TranType: strconv.Itoa(1),
BlockIndex: strconv.Itoa(height),
Amount: utility.FloatToStr(amount),
Fee: utility.FloatToStr(fee),
Account: "",
Address: trade.Address,
Txid: trade.TxId,
BlockTime: t1,
TimeReceived: t1,
MainCoin: udCoin.MainSymbol,
OrderNo: trade.TradeId, // 流水号
Status: strconv.Itoa(status),
State: strconv.Itoa(trade.Status),
AddressFrom: "",
}
// 加载账户信息
//beforeAmount := float64(0)
//afterAmount := float64(0)
if trade.Status == 3 {
tx := orm.Begin()
err := tx.Model(&models.LineRecharge{}).Create(&recharge).Error
if err != nil {
tx.Rollback()
log.Error("create LineRecharge err", zap.Error(err), zap.String("wallet.UserId", strconv.FormatInt(wallet.UserId, 10)),
zap.String("money", utility.FloatToStr(amount)))
}
err = tx.Model(&models.LineUser{}).Where("id = ?", wallet.UserId).Update("money", gorm.Expr("money + ?", amount)).Error
if err != nil {
tx.Rollback()
log.Error("update user money err", zap.Error(err), zap.String("wallet.UserId", strconv.FormatInt(wallet.UserId, 10)),
zap.String("money", utility.FloatToStr(amount)))
return "error"
}
tx.Commit()
}
//hold := holddb.GetUserHold(wallet.UserId, recharge.CoinId)
//if hold.Id == 0 {
// hold = dbmodel.VtsHold{
// Id: 0,
// CoinId: recharge.CoinId,
// UserId: wallet.UserId,
// Num: 0,
// UseNum: amount,
// FreezeNum: 0,
// CreateTime: currTime,
// UpdateTime: currTime,
// }
// beforeAmount = 0
// afterAmount = amount
//} else {
// beforeAmount = hold.UseNum
// afterAmount = utility.FloatAdd(hold.UseNum, amount)
// hold.UseNum = amount
// hold.UpdateTime = currTime
//}
//// 流水
//log := dbmodel.VtsCurrentHoldLog{
// ID: 0,
// UserID: wallet.UserId,
// CoinID: recharge.CoinId,
// UseFree: 1,
// DealType: 5,
// Remarks: "优顿充值",
// RelateOrderNo: trade.TradeId,
// Amount: amount,
// BeforeAmount: beforeAmount,
// AfterAmount: afterAmount,
// Poundage: fee,
// CreateTime: currTime,
//}
//
//// 开启事务
//tx, err := dbhelper.MasterPgdb.Beginx()
//if err != nil {
// loghelper.Error("Begin", zap.Error(err))
// return "error"
//}
//if err = walletdb.RechargeInsert(recharge, tx); err != nil {
// _ = tx.Rollback()
// return "error"
//}
//// 账户写入
//if trade.Status == 3 {
// if err = holddb.UpdateHoldUseNum(hold, tx); err != nil {
// _ = tx.Rollback()
// return "error"
// }
// // 流水
// if err = holddb.AddCurrentHoldLog(log, tx); err != nil {
// _ = tx.Rollback()
// loghelper.Error("handleRecharge", zap.Error(err))
// return "error"
// }
//}
//// 提交
//if err = tx.Commit(); err != nil {
// loghelper.Error("Commit", zap.Error(err))
// return "error"
//}
////保存消息日志
//templates := cmsdb.GetTempContent(3, 3) //充币通知
//var template adminmodel.CmsTemplateContentDb
//if len(templates) > 0 {
// template = templates[0]
//}
//if template.TemplateId > 0 {
// // 写入站内信
// store := dbmodel.CmsMessageUserDB{
// UserId: recharge.UserId,
// MessageId: template.TemplateId,
// IsRead: 1,
// Type: 1,
// CreateTime: time.Now(),
// CategoryId: template.CategoryId,
// Content: strings.ReplaceAll(template.Content, "{num}", " "+utility.FloatToStr(amount)+" "+coinCode),
// LittleTitle: template.LittleTitle,
// }
// err = cmsdb.AddMessageUserItem(store)
// if err != nil {
// loghelper.Error("AddCmsMessageUser Error:", zap.Error(err))
// }
//}
return "success"
}
// 提币回调处理
//func handleWithdraw(trade udunhelper.CallBackRes) string {
// // 提币通知
// status := 7
// switch trade.Status {
// case 0:
// status = 7
// case 1:
// status = 7
// case 2:
// status = 9
// case 3:
// status = 8
// case 4:
// status = 9
// }
// if status < 8 {
// return "success"
// }
// // 加载
// data, err := walletdb.GetWithdrawItemByOrderNo(trade.BusinessId)
// if err != nil {
// return "error"
// }
// data.Status = status
// data.State = trade.Status
// data.TxId = trade.TxId
// if status == 9 {
// data.Remark = "未知原因"
// }
// num := data.SumNum //utility.FloatAddCut(data.Num, data.NumFee, 8)
// // 更新这个表的状态
// tx, err := dbhelper.MasterPgdb.Beginx()
// if err != nil {
// loghelper.Error("Begin", zap.Error(err))
// return "error"
// }
// err = walletdb.WithdrawStatusByUd(data, tx)
// if err != nil {
// _ = tx.Rollback()
// return "error"
// }
// if status == 9 {
// //如果失败则把资金重新返回给用户,减去相应的冻结资金
// err = holddb.UpdateHoldWithdraw(num, -num, data.UserId, data.CoinId, tx)
// if err != nil {
// _ = tx.Rollback()
// return "error"
// }
// } else {
// //成功的话则减去相应的冻结资金
// err = holddb.UpdateHoldWithdraw(0, -num, data.UserId, data.CoinId, tx)
// if err != nil {
// _ = tx.Rollback()
// return "error"
// }
// }
// _ = tx.Commit()
//
// //保存消息日志
// templates := cmsdb.GetTempContent(4, 3) // 提币通知
// var template adminmodel.CmsTemplateContentDb
// if len(templates) > 0 {
// template = templates[0]
// }
// if template.TemplateId > 0 {
// coin := coinservice.CoinCache.GetById(data.CoinId)
// // 写入站内信
// store := dbmodel.CmsMessageUserDB{
// UserId: data.UserId,
// MessageId: template.TemplateId,
// IsRead: 1,
// Type: 1,
// CreateTime: time.Now(),
// CategoryId: template.CategoryId,
// Content: strings.ReplaceAll(template.Content, "{num}", " "+utility.FloatToStr(data.Num)+" "+coin.CoinCode),
// LittleTitle: template.LittleTitle,
// }
// err = cmsdb.AddMessageUserItem(store)
// if err != nil {
// loghelper.Error("AddCmsMessageUser Error:", zap.Error(err))
// }
// }
// return "success"
//}
// getBalance 获取金额
func getBalance(balance, decimals string) float64 {
am, _ := strconv.ParseFloat(balance, 64)
dec, _ := strconv.ParseFloat(decimals, 64)
res := decimal.NewFromFloat(am / math.Pow(10, dec))
amount, _ := res.Truncate(8).Float64()
return amount
}