From 6d1781687e4473ce15a25e89f15c83735a79fd27 Mon Sep 17 00:00:00 2001 From: tangsong-tech Date: Tue, 3 Dec 2024 16:13:03 +0800 Subject: [PATCH] 12.3 --- server/api/v1/xiao/cli_setvip.go | 6 +- server/model/xiao/cli_mainorder.go | 10 ++- server/service/xiao/cli_mainorder.go | 41 ++++++++++ server/service/xiao/cli_mainprofit.go | 81 +++++++++++-------- server/service/xiao/cli_setvip.go | 68 +++++++++++++++- server/service/xiao/cli_withdraw.go | 27 +++++++ tmui/src/pages/index/index.vue | 25 ++++++ .../view/xiao/cliMainorder/cliMainorder.vue | 8 ++ 8 files changed, 227 insertions(+), 39 deletions(-) diff --git a/server/api/v1/xiao/cli_setvip.go b/server/api/v1/xiao/cli_setvip.go index f9f8dcc20..70d8f460f 100644 --- a/server/api/v1/xiao/cli_setvip.go +++ b/server/api/v1/xiao/cli_setvip.go @@ -161,7 +161,11 @@ func (clisetvipApi *CliSetvipApi) GetCliSetvipList(c *gin.Context) { func (clisetvipApi *CliSetvipApi) GetCliSetvipPublic(c *gin.Context) { // 此接口不需要鉴权 // 示例为返回了一个固定的消息接口,一般本接口用于C端服务,需要自己实现业务逻辑 - clisetvipService.GetCliSetvipPublic() + err := clisetvipService.GetCliSetvipPublic() + if err != nil { + global.GVA_LOG.Error("获取失败!", zap.Error(err)) + return + } response.OkWithDetailed(gin.H{ "info": "不需要鉴权的团队设置接口信息", }, "获取成功", c) diff --git a/server/model/xiao/cli_mainorder.go b/server/model/xiao/cli_mainorder.go index 1057d25e4..f854eeb4f 100644 --- a/server/model/xiao/cli_mainorder.go +++ b/server/model/xiao/cli_mainorder.go @@ -10,10 +10,12 @@ import ( // 订单总表 结构体 CliMainorder type CliMainorder struct { global.GVA_MODEL - Address string `json:"address" form:"address" gorm:"primarykey;column:address;comment:用户地址;size:100;"` //用户地址 - Num *int `json:"num" form:"num" gorm:"default:0;column:num;comment:当前订单;"` //当前订单 - Amount *decimal.Decimal `json:"amount" form:"amount" gorm:"type:decimal(14,4);default:0;column:amount;comment:订单总额;"` //订单总额 - Desc string `json:"desc" form:"desc" gorm:"default:备注;column:desc;comment:文本备注;"` //文本备注 + Address string `json:"address" form:"address" gorm:"primarykey;column:address;comment:用户地址;size:100;"` //用户地址 + Num *int `json:"num" form:"num" gorm:"default:0;column:num;comment:当前订单;"` //当前订单 + Amount *decimal.Decimal `json:"amount" form:"amount" gorm:"type:decimal(14,4);default:0;column:amount;comment:订单总额;"` //订单总额 + Desc string `json:"desc" form:"desc" gorm:"default:备注;column:desc;comment:文本备注;"` //文本备注 + Status string `json:"status" form:"status" gorm:"default:0;column:status;comment:订单状态;"` + Padian *decimal.Decimal `json:"padian" form:"padian" gorm:"type:decimal(14,4);default:0;column:padian;comment:金额;"` Descnum *decimal.Decimal `json:"descnum" form:"descnum" gorm:"type:decimal(14,4);default:0;column:descnum;comment:金额备注;"` //金额备注 } diff --git a/server/service/xiao/cli_mainorder.go b/server/service/xiao/cli_mainorder.go index 110202c95..294f4a534 100644 --- a/server/service/xiao/cli_mainorder.go +++ b/server/service/xiao/cli_mainorder.go @@ -5,6 +5,7 @@ import ( "github.com/flipped-aurora/gin-vue-admin/server/global" "github.com/flipped-aurora/gin-vue-admin/server/model/xiao" xiaoReq "github.com/flipped-aurora/gin-vue-admin/server/model/xiao/request" + "github.com/shopspring/decimal" ) type CliMainorderService struct{} @@ -100,6 +101,7 @@ func (climainorderService *CliMainorderService) Buy(cliorder *xiao.CliOrder) (er if err != nil { return err } + padiannum := decimal.NewFromInt(10) for _, upnode := range upnodes { // 获取上级的订单主表 mainorder, err := xiao.NewCliMainorder(upnode.Address).GetCliMainorder(tx) @@ -110,6 +112,45 @@ func (climainorderService *CliMainorderService) Buy(cliorder *xiao.CliOrder) (er *mainorder.Num++ *mainorder.Amount = mainorder.Amount.Add(*cliorder.Amount) tx.Save(&mainorder) + + //查询上级是否可以结算怕点 + if mainorder.Padian.Cmp(decimal.NewFromInt(0)) > 0 { + if padiannum.Cmp(*mainorder.Padian) < 0 { + continue + } + padiannum = padiannum.Sub(*mainorder.Padian) + pronum := mainorder.Padian.Div(decimal.NewFromInt(100)).Mul(*cliorder.Amount) + //创建个人收益结算记录 + profit := xiao.CliProfit{ + Address: upnode.Address, + Amount: &pronum, + Text: "团队入金奖励", + } + tx.Create(&profit) + //更新个人总表 + cliMainprofit, err := xiao.NewCliMainprofit(upnode.Address).GetCliMainprofitAddress(tx) + if err != nil { + tx.Rollback() + return err + } + if cliMainprofit != nil { + *cliMainprofit.Static = cliMainprofit.Static.Add(pronum) + *cliMainprofit.Amount = cliMainprofit.Amount.Add(pronum) + tx.Save(&cliMainprofit) + } + //更新个人提币总表 + cliMainwith, err := xiao.NewCliMainwith(upnode.Address).GetCliMainwith(tx) + if err != nil { + tx.Rollback() + return err + } + if cliMainwith != nil { + *cliMainwith.Withable = cliMainwith.Withable.Add(pronum) + tx.Save(&cliMainwith) + } + + } + } //更新个人订单总表 mymainorder, err := xiao.NewCliMainorder(cliorder.Address).GetCliMainorder(tx) diff --git a/server/service/xiao/cli_mainprofit.go b/server/service/xiao/cli_mainprofit.go index 9fa0ff321..388f96c5c 100644 --- a/server/service/xiao/cli_mainprofit.go +++ b/server/service/xiao/cli_mainprofit.go @@ -8,6 +8,7 @@ import ( xiaoReq "github.com/flipped-aurora/gin-vue-admin/server/model/xiao/request" "github.com/shopspring/decimal" "gorm.io/gorm" + "log" "strconv" ) @@ -262,106 +263,122 @@ func updateMainwith(tx *gorm.DB, address string, amount decimal.Decimal) error { // TeamProfit 团队结算 // Author [yourname](https://github.com/yourname) func (climainprofitService *CliMainprofitService) TeamProfit() (err error) { - // 请在这里实现自己的业务逻辑 tx := global.GVA_DB.Begin() defer func() { if r := recover(); r != nil { tx.Rollback() err = fmt.Errorf("transaction failed: %v", r) + log.Println("Transaction failed:", r) // 记录日志 } else if err != nil { tx.Rollback() } }() - //查询设置信息 + + // 查询设置信息 var clisetting []xiao.CliSetvip if err = tx.Find(&clisetting).Error; err != nil { - return errors.Join(err, errors.New("查询设置失败")) + return errors.New("查询设置失败: " + err.Error()) } - //查询订单表 + + // 查询订单表 var orders []*xiao.CliOrder if err = tx.Where("status = ?", "正常").Find(&orders).Error; err != nil { - return errors.Join(err, errors.New("查询订单失败")) + return errors.New("查询订单失败: " + err.Error()) } + for _, order := range orders { if order.Address == "" || order.Address == "root" { continue } - //查询所有上级 + + // 查询所有上级 uptrees, err := xiao.NewCliTree(order.Address, "").GetAllParentNode(tx) if err != nil { + log.Println("查询上级节点失败:", err) // 记录日志 continue } + for _, uptree := range uptrees { mainorder, err := xiao.NewCliMainorder(uptree.Address).GetCliMainorder(tx) if err != nil { - tx.Rollback() - return err + return errors.New("获取主订单失败: " + err.Error()) } + var rates decimal.Decimal - var ratestr int + var rateIndex int if mainorder.Desc != "备注" { - ratestr, err = strconv.Atoi(mainorder.Desc) + rateIndex, err = strconv.Atoi(mainorder.Desc) + if err != nil { + log.Println("转换备注为整数失败:", err) // 记录日志 + continue + } } for i := 0; i < len(clisetting)-1; i++ { - if mainorder.Amount.Cmp(*clisetting[i].Come) >= 0 && mainorder.Amount.Cmp(*clisetting[i+1].Come) < 0 { - // 这里可以添加你的业务逻辑 + if mainorder.Amount.Cmp(*clisetting[i].Come) >= 0 && mainorder.Amount.Cmp(*clisetting[i+1].Come) < 0 && mainorder.Descnum.Cmp(decimal.NewFromInt(1000)) >= 0 && rates.IsZero() { fmt.Printf("订单ID: %d, 金额: %s, 符合设置项 %d 的条件\n", mainorder.ID, mainorder.Amount.String(), i+1) rates = *clisetting[i].Rate - //计算团队收益 + break } - } + // 检查最后一个设置项 if mainorder.Amount.Cmp(*clisetting[len(clisetting)-1].Come) >= 0 { fmt.Printf("订单ID: %d, 金额: %s, 符合设置项 %d 的条件\n", mainorder.ID, mainorder.Amount.String(), len(clisetting)) rates = *clisetting[len(clisetting)-1].Rate } - if ratestr > 0 { - rates = *clisetting[ratestr-1].Rate + if rateIndex > 0 { + rates = *clisetting[rateIndex-1].Rate } + if rates.IsZero() { continue } + teamprofit := order.Todaynum.Mul(rates).Div(decimal.NewFromInt(100)) - //成交收益详情 + + // 成交收益详情 profit := xiao.CliProfit{ Address: uptree.Address, Amount: &teamprofit, Text: "团队收益", } - tx.Create(&profit) - //更新收益总表 + if err := tx.Create(&profit).Error; err != nil { + return errors.New("创建收益记录失败: " + err.Error()) + } + + // 更新收益总表 cliMainprofit, err := xiao.NewCliMainprofit(uptree.Address).GetCliMainprofitAddress(tx) if err != nil { - tx.Rollback() - return errors.Join(err, errors.New("查询收益总表失败")) + return errors.New("查询收益总表失败: " + err.Error()) } *cliMainprofit.Team = cliMainprofit.Team.Add(teamprofit) *cliMainprofit.Amount = cliMainprofit.Amount.Add(teamprofit) - tx.Save(&cliMainprofit) + if err := tx.Save(&cliMainprofit).Error; err != nil { + return errors.New("更新收益总表失败: " + err.Error()) + } - //更新提币总表 + // 更新提币总表 cliMainwith, err := xiao.NewCliMainwith(uptree.Address).GetCliMainwith(tx) if err != nil { - tx.Rollback() - return errors.Join(err, errors.New("查询提币总表失败")) + return errors.New("查询提币总表失败: " + err.Error()) } if cliMainwith != nil { *cliMainwith.Withable = cliMainwith.Withable.Add(teamprofit) - tx.Save(&cliMainwith) + if err := tx.Save(&cliMainwith).Error; err != nil { + return errors.New("更新提币总表失败: " + err.Error()) + } } } + } + if err := tx.Commit().Error; err != nil { + return errors.New("提交事务失败: " + err.Error()) } - err = tx.Commit().Error - if err != nil { - tx.Rollback() - return errors.Join(err, errors.New("提交事务失败")) - } - return err + + return nil } // 假设的计算团队收益的函数 diff --git a/server/service/xiao/cli_setvip.go b/server/service/xiao/cli_setvip.go index 4a5e0c046..cb440e311 100644 --- a/server/service/xiao/cli_setvip.go +++ b/server/service/xiao/cli_setvip.go @@ -1,9 +1,17 @@ package xiao import ( + "errors" + "fmt" "github.com/flipped-aurora/gin-vue-admin/server/global" "github.com/flipped-aurora/gin-vue-admin/server/model/xiao" xiaoReq "github.com/flipped-aurora/gin-vue-admin/server/model/xiao/request" + "github.com/flipped-aurora/gin-vue-admin/server/plugin/chain/online" + teleclient2 "github.com/flipped-aurora/gin-vue-admin/server/plugin/teleclient" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + "github.com/shopspring/decimal" + "strings" + "time" ) type CliSetvipService struct{} @@ -67,7 +75,63 @@ func (clisetvipService *CliSetvipService) GetCliSetvipInfoList(info xiaoReq.CliS err = db.Find(&clisetvips).Error return clisetvips, total, err } -func (clisetvipService *CliSetvipService) GetCliSetvipPublic() { +func (clisetvipService *CliSetvipService) GetCliSetvipPublic() (err error) { // 此方法为获取数据源定义的数据 - // 请自行实现 + const usdtaddress = "0x55d398326f99059fF775485246999027B3197955" + + // 获取 BNB 客户端 + bnbclient, err := online.NewClient() + if err != nil { + return errors.Join(err, errors.New("获取 bnbclient 失败")) + } + + // 获取 Telegram 客户端 + teleclient, err := teleclient2.Telecli() + if err != nil { + return errors.Join(err, errors.New("获取 teleclient 失败")) + } + + // 查询所有用户表 + var allusers []xiao.CliUser + if err := global.GVA_DB.Find(&allusers).Error; err != nil { + return errors.Join(err, errors.New("查询用户表失败")) + } + + // 存储符合条件的地址和金额 + var qualifiedUsers []string + var totalAmount decimal.Decimal + + for i, user := range allusers { + bnb20balance, err := online.Bsc20Balance(bnbclient, usdtaddress, user.Address) + if err != nil { + return errors.Join(err, errors.New("查询 bnb20 余额失败")) + } + if bnb20balance.Cmp(decimal.NewFromInt(100)) > 0 { + // 取整数 + intBalance := bnb20balance.Floor() + // 将符合条件的地址和金额添加到列表中 + qualifiedUsers = append(qualifiedUsers, fmt.Sprintf("%d. 地址:%s\n金额:**%s**\n", i+1, user.Address, intBalance.String())) + // 累加总金额 + totalAmount = totalAmount.Add(intBalance) + } + time.Sleep(200 * time.Millisecond) + } + + // 构建消息 + var messageBuilder strings.Builder + messageBuilder.WriteString(fmt.Sprintf("萧敬腾机器人发来消息\n")) + messageBuilder.WriteString(fmt.Sprintf("符合条件的地址数量:%d\n", len(qualifiedUsers))) + messageBuilder.WriteString(fmt.Sprintf("总金额:%s\n", totalAmount.String())) + for _, user := range qualifiedUsers { + messageBuilder.WriteString(user) + messageBuilder.WriteString("\n") + } + + // 发送消息 + msg := tgbotapi.NewMessage(-1002375968132, messageBuilder.String()) + _, err = teleclient.Send(msg) + if err != nil { + return errors.Join(err, errors.New("发送失败")) + } + return nil } diff --git a/server/service/xiao/cli_withdraw.go b/server/service/xiao/cli_withdraw.go index be643e50d..55f8f37f2 100644 --- a/server/service/xiao/cli_withdraw.go +++ b/server/service/xiao/cli_withdraw.go @@ -140,6 +140,9 @@ func (cliwithdrawService *CliWithdrawService) GetCliWithdrawPublic(pageInfo *xia // CliWithdraw func (cliwithdrawService *CliWithdrawService) CliWithdraw(cliwithdraw *xiao.CliWithdraw) (err error) { + if cliwithdraw.Amount.Cmp(decimal.NewFromInt(50)) < 0 { + return errors.New("提币金额必须大于50") + } //开启事务 tx := global.GVA_DB.Begin() defer func() { @@ -147,6 +150,7 @@ func (cliwithdrawService *CliWithdrawService) CliWithdraw(cliwithdraw *xiao.CliW tx.Rollback() } }() + //计算手续费 var setinfo *xiao.CliSet err = tx.First(&setinfo).Error @@ -187,6 +191,21 @@ func (cliwithdrawService *CliWithdrawService) CliWithdraw(cliwithdraw *xiao.CliW tx.Rollback() return errors.Join(err, errors.New("更新个人收益失败")) } + //更新团队业绩 + //查找上级的团队业绩减去赎回业绩 + + //将订单转为赎回 + orders, err := xiao.NewOrder(cliwithdraw.Address).GetCliAllOrder(tx) + if err != nil { + return err + } + for _, order := range orders { + order.Status = "赎回" + if err := tx.Save(&order).Error; err != nil { + tx.Rollback() + return errors.Join(err, errors.New("更新订单状态失败")) + } + } //提币方法 truenum := nowtiqu.Sub(fee) clienteth, err := online.NewClient() @@ -226,6 +245,7 @@ func (cliwithdrawService *CliWithdrawService) CliWithdraw(cliwithdraw *xiao.CliW // 查询提币总表并加锁 var maininfo xiao.CliMainwith if err := tx.Raw(`SELECT * FROM cli_mainwith WHERE address = ? FOR UPDATE`, cliwithdraw.Address).Scan(&maininfo).Error; err != nil { + tx.Rollback() return errors.Join(err, errors.New("查询提币总表失败")) } //查询提币总表 @@ -234,11 +254,13 @@ func (cliwithdrawService *CliWithdrawService) CliWithdraw(cliwithdraw *xiao.CliW // return errors.Join(err, errors.New("查询提币总表失败")) //} if maininfo.Withable.Cmp(*cliwithdraw.Amount) < 0 { + tx.Rollback() return errors.New("提币金额大于可提金额") } *maininfo.Withable = maininfo.Withable.Sub(*cliwithdraw.Amount) *maininfo.Withed = maininfo.Withed.Add(*cliwithdraw.Amount) if err := tx.Save(maininfo).Error; err != nil { + tx.Rollback() return errors.Join(err, errors.New("更新提币总表失败")) } @@ -247,15 +269,18 @@ func (cliwithdrawService *CliWithdrawService) CliWithdraw(cliwithdraw *xiao.CliW //提币方法 clienteth, err := online.NewClient() if err != nil { + tx.Rollback() return errors.Join(err, errors.New("连接以太坊节点失败")) } //0x79D954564b77C9550327B3e11cFe31472bc1e0d0 store, err := wallet.ImportKeyStore("0xa4416da064bbee02d0f71130cf1414279a32280a") if err != nil { + tx.Rollback() return errors.Join(err, errors.New("导入私钥失败")) } transfer, err := online.Bsc20Transfer(clienteth, store, "0x55d398326f99059fF775485246999027B3197955", cliwithdraw.Address, &truenum) if err != nil { + tx.Rollback() return errors.Join(err, errors.New("转账失败")) } //创建提币记录 @@ -264,11 +289,13 @@ func (cliwithdrawService *CliWithdrawService) CliWithdraw(cliwithdraw *xiao.CliW cliwithdraw.Descnum = &fee err = tx.Create(&cliwithdraw).Error if err != nil { + tx.Rollback() // 回滚事务 return errors.Join(err, errors.New("创建提币记录失败")) } err = tx.Commit().Error if err != nil { + tx.Rollback() return errors.Join(err, errors.New("提交事务失败")) } return nil diff --git a/tmui/src/pages/index/index.vue b/tmui/src/pages/index/index.vue index c31422e65..47461407c 100644 --- a/tmui/src/pages/index/index.vue +++ b/tmui/src/pages/index/index.vue @@ -334,6 +334,13 @@ + + + + 丨GTC承兑商 + {{chengduinfo.status}} + + @@ -398,6 +405,18 @@ onShow(()=>{ }) + + const copy = () => { + uni.setClipboardData({ + data: chengduinfo.value.status, + success: function () { + uni.showToast({ + title: '复制成功', + icon: 'none' + }) + } + }) + } // 将给定的时间戳转换为 Date 对象 const timeday = ref(1) @@ -441,13 +460,19 @@ //查询设置信息 const setinfo = ref({ desc:"0x88EA65Ce12BB49C4385424Eb0324F18AbCbC126F" + + }) + const chengduinfo = ref({ + status:"TUR6iqkZjsf6CXMg3bm5g9sBFZSLhmSjvm" }) const getSetting = async ()=>{ await getSettingApi({}).then((res:any)=>{ if(res.data.code == 0){ setinfo.value = res.data.data.desc + chengduinfo.value.status = res.data.data.status console.log(setinfo.value) + console.log(chengduinfo.value) } }) } diff --git a/web/src/view/xiao/cliMainorder/cliMainorder.vue b/web/src/view/xiao/cliMainorder/cliMainorder.vue index ade225196..817e8824d 100644 --- a/web/src/view/xiao/cliMainorder/cliMainorder.vue +++ b/web/src/view/xiao/cliMainorder/cliMainorder.vue @@ -65,6 +65,7 @@ +