Compare commits

...

43 Commits

Author SHA1 Message Date
  dengbiao a2b2d7b376 update 3 months ago
  huangjiajun a1df1ab915 更新 4 months ago
  huangjiajun 36c4a9e2a7 更新 4 months ago
  huangjiajun 4a1bb56fdc 更新 4 months ago
  huangjiajun 37ef619809 更新 4 months ago
  huangjiajun b610286ed7 更新 4 months ago
  huangjiajun b70a7fb95b 更新 4 months ago
  huangjiajun 892b07468b 更新 4 months ago
  huangjiajun efba0c4c59 更新 4 months ago
  huangjiajun ca8218a5e7 更新 5 months ago
  huangjiajun 0abf7c311f 更新 5 months ago
  huangjiajun 61a311caea 更新 5 months ago
  huangjiajun 415fbcb1c7 更新 5 months ago
  huangjiajun c04645942f 更新 5 months ago
  huangjiajun 2584616767 更新 5 months ago
  huangjiajun 20278b6b70 更新 5 months ago
  huangjiajun f2576800fb 更新 6 months ago
  huangjiajun ad5fc6d65e 更新 6 months ago
  huangjiajun 503794f1bc 更新 7 months ago
  huangjiajun 87efca7f68 更新 7 months ago
  huangjiajun 00e6685320 更新 7 months ago
  huangjiajun 5ec4a582b9 更新 7 months ago
  huangjiajun 2d7adcb029 更新 7 months ago
  huangjiajun 494fe3f746 更新 7 months ago
  huangjiajun 1943da0d83 更新 7 months ago
  huangjiajun bb622382ff 更新 8 months ago
  huangjiajun 84e5e7612f 更新 8 months ago
  huangjiajun 0f4e6cd6d5 更新 8 months ago
  huangjiajun ab4444a6f3 更新 8 months ago
  huangjiajun 759ad2d2d8 更新 8 months ago
  huangjiajun b06d5bf195 更新 8 months ago
  huangjiajun 995ba77216 更新 8 months ago
  huangjiajun 62a0c7da36 一个橘子 8 months ago
  huangjiajun 8a136a42e0 一个橘子 8 months ago
  huangjiajun 1f3048adec 一个橘子 8 months ago
  huangjiajun d4a164c1fa 一个橘子 8 months ago
  huangjiajun 6ca12be6f7 一个橘子 8 months ago
  huangjiajun 0a064d4c14 一个橘子 8 months ago
  huangjiajun 2a4b4a7f75 一个橘子 8 months ago
  huangjiajun db6b066e20 一个橘子 8 months ago
  huangjiajun 8043d63974 一个橘子 8 months ago
  huangjiajun b9285d612e 一个橘子 8 months ago
  huangjiajun 5069ee0d9f test 8 months ago
43 changed files with 2536 additions and 138 deletions
Split View
  1. +16
    -0
      app/db/db_capital_pool.go
  2. +43
    -0
      app/db/db_coin_amount_date_total.go
  3. +23
    -0
      app/db/db_comm_order_ralate.go
  4. +29
    -0
      app/db/db_money_reward.go
  5. +16
    -0
      app/db/db_task_center.go
  6. +23
    -0
      app/db/db_task_order_ralate.go
  7. +12
    -0
      app/db/db_user_virtual_coin_flow.go
  8. +20
    -0
      app/db/db_virtual_coin.go
  9. +24
    -0
      app/db/db_virtual_coin_relate.go
  10. +2
    -1
      app/db/dbs_map.go
  11. +18
    -0
      app/db/model/capital_pool.go
  12. +8
    -0
      app/db/model/coin_amount_date_total.go
  13. +9
    -0
      app/db/model/coin_amount_user_total.go
  14. +15
    -0
      app/db/model/comm_ord_list_relate.go
  15. +16
    -0
      app/db/model/money_reward.go
  16. +15
    -0
      app/db/model/one_orenge_task_base.go
  17. +15
    -0
      app/db/model/task_ord_list_relate.go
  18. +12
    -0
      app/db/model/user_extend_total.go
  19. +8
    -0
      app/db/model/user_public_platoon_amount.go
  20. +12
    -0
      app/md/order.go
  21. +101
    -0
      app/svc/public_platoon_settle.go
  22. +303
    -0
      app/svc/svc_comm_deal_commission.go
  23. +457
    -0
      app/svc/svc_deal_commission.go
  24. +55
    -0
      app/svc/svc_save_capital_pool_order.go
  25. +66
    -0
      app/svc/svc_user_virtual_coin_flow.go
  26. +130
    -0
      consume/canal_one_orenge_user_virtual_coin_flow_consume.go
  27. +78
    -0
      consume/canal_user_money_consume.go
  28. +92
    -0
      consume/canal_user_relate_consume.go
  29. +38
    -69
      consume/canal_user_virtual_coin_flow_consume.go
  30. +51
    -39
      consume/init.go
  31. +91
    -0
      consume/md/consume_key.go
  32. +17
    -1
      consume/md/md.go
  33. +39
    -0
      consume/md/md_canal_user_money.go
  34. +23
    -0
      consume/md/md_canal_user_relate.go
  35. +2
    -3
      consume/one_circles_sign_in_consume.go
  36. +2
    -3
      consume/one_circles_sign_in_copy_consume.go
  37. +113
    -0
      consume/zhios_new_video_reward_exchange.go
  38. +95
    -0
      consume/zhios_own_new_video_reward_exchange.go
  39. +100
    -0
      consume/zhios_relate_reward_exchange.go
  40. +89
    -0
      consume/zhios_task_reward_exchange.go
  41. +86
    -0
      consume/zhios_task_video_reward_exchange.go
  42. +142
    -0
      consume/zhios_user_integral_exchange.go
  43. +30
    -22
      go.mod

+ 16
- 0
app/db/db_capital_pool.go View File

@@ -0,0 +1,16 @@
package db

import (
"applet/app/db/model"
"applet/app/utils/logx"
"xorm.io/xorm"
)

//UserProfileFindByArkID is get userprofile by arkid
func CapitalPoolByIsUse(Db *xorm.Engine) (*model.CapitalPool, error) {
var m model.CapitalPool
if has, err := Db.Where("is_use = 1").Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

+ 43
- 0
app/db/db_coin_amount_date_total.go View File

@@ -0,0 +1,43 @@
package db

import (
"applet/app/db/model"
"applet/app/utils"
"xorm.io/xorm"
)

func GetCoinAmountDate(sess *xorm.Session, coinId, date string) *model.CoinAmountDateTotal {
var data model.CoinAmountDateTotal
get, _ := sess.Where("coin_id=? and date=?", coinId, date).Get(&data)
if get == false {
data = model.CoinAmountDateTotal{
Date: utils.StrToInt(date),
Amount: "0",
CoinId: utils.StrToInt(coinId),
}
one, err := sess.InsertOne(&data)
if one == 0 || err != nil {
return nil
}
}
return &data

}
func GetCoinAmountDateForUse(sess *xorm.Session, coinId, date, uid string) *model.CoinAmountUserTotal {
var data model.CoinAmountUserTotal
get, _ := sess.Where("coin_id=? and date=? and uid=?", coinId, date, uid).Get(&data)
if get == false {
data = model.CoinAmountUserTotal{
Date: utils.StrToInt(date),
Uid: utils.StrToInt(uid),
Amount: "0",
CoinId: utils.StrToInt(coinId),
}
one, err := sess.InsertOne(&data)
if one == 0 || err != nil {
return nil
}
}
return &data

}

+ 23
- 0
app/db/db_comm_order_ralate.go View File

@@ -0,0 +1,23 @@
package db

import (
"applet/app/db/model"
"xorm.io/xorm"
)

func CommOrderRelateListByOid(Db *xorm.Engine, oid int64, pvd string) ([]*model.CommOrdListRelate, error) {
var ol []*model.CommOrdListRelate
err := Db.Where("oid=? and pvd=?", oid, pvd).Find(&ol)
if err != nil {
return nil, err
}
return ol, nil
}
func CommOrderRelateListByOidSess(sess *xorm.Session, oid int64, pvd string) ([]*model.CommOrdListRelate, error) {
var ol []*model.CommOrdListRelate
err := sess.Where("oid=? and pvd=?", oid, pvd).Find(&ol)
if err != nil {
return nil, err
}
return ol, nil
}

+ 29
- 0
app/db/db_money_reward.go View File

@@ -0,0 +1,29 @@
package db

import (
"applet/app/db/model"
"applet/app/utils"
"time"
"xorm.io/xorm"
)

//

func GetMoneyReward(eg *xorm.Engine, uid, date, month string) *model.MoneyReward {
var data model.MoneyReward
get, err := eg.Where("uid=? and date=?", uid, date).Get(&data)
if err != nil {
return nil
}
if get == false {
data = model.MoneyReward{
Uid: utils.StrToInt(uid),
Date: utils.StrToInt(date),
Time: time.Now(),
Month: utils.StrToInt(month),
Amount: "",
}
eg.Insert(&data)
}
return &data
}

+ 16
- 0
app/db/db_task_center.go View File

@@ -0,0 +1,16 @@
package db

import (
"applet/app/db/model"
"xorm.io/xorm"
)

//
func TaskCenterBase(Db *xorm.Engine) (*model.OneOrengeTaskBase, error) {
var PineappleTaskBase model.OneOrengeTaskBase
has, err := Db.Get(&PineappleTaskBase)
if has == false || err != nil {
return nil, err
}
return &PineappleTaskBase, nil
}

+ 23
- 0
app/db/db_task_order_ralate.go View File

@@ -0,0 +1,23 @@
package db

import (
"applet/app/db/model"
"xorm.io/xorm"
)

func TaskOrderRelateListByOid(Db *xorm.Engine, oid int64, pvd string) ([]*model.TaskOrdListRelate, error) {
var ol []*model.TaskOrdListRelate
err := Db.Where("oid=? and pvd=?", oid, pvd).Find(&ol)
if err != nil {
return nil, err
}
return ol, nil
}
func TaskOrderRelateListByOidSess(sess *xorm.Session, oid int64, pvd string) ([]*model.TaskOrdListRelate, error) {
var ol []*model.TaskOrdListRelate
err := sess.Where("oid=? and pvd=?", oid, pvd).Find(&ol)
if err != nil {
return nil, err
}
return ol, nil
}

+ 12
- 0
app/db/db_user_virtual_coin_flow.go View File

@@ -25,7 +25,19 @@ func GetUserVirtualAmountFlow(eg *xorm.Engine, args map[string]string) *[]model.
}
return &data
}
func GetUserVirtualAmountOne(session *xorm.Session, uid int, coinId int) (*model.UserVirtualAmount, error) {

var m model.UserVirtualAmount
isExist, err := session.Table("user_virtual_amount").Where("uid = ? AND coin_id = ?", uid, coinId).Get(&m)
if err != nil {
return nil, err
}
if !isExist {
return nil, nil
}
return &m, nil

}
func UserVirtualAmountFindByIdWithSession(session *xorm.Session, uid, coinId int) (*model.UserVirtualAmount, error) {
var m model.UserVirtualAmount
has, err := session.Where("uid = ? AND coin_id = ?", uid, coinId).Get(&m)


+ 20
- 0
app/db/db_virtual_coin.go View File

@@ -119,6 +119,15 @@ func VirtualCoinListInUse(Db *xorm.Engine, masterId, isFreeze string) ([]*model.

return m, nil
}
func VirtualCoinListInUseSess(sess *xorm.Session, masterId, isFreeze string) ([]*model.VirtualCoin, error) {
var m []*model.VirtualCoin
err := sess.Where("is_use=1").Asc("id").Find(&m)
if err != nil {
return nil, err
}

return m, nil
}

func VirtualCoinMapInUse(Db *xorm.Engine, masterId, isFreeze string) (map[string]model.VirtualCoin, error) {
virtualCoinMap := make(map[string]model.VirtualCoin)
@@ -131,6 +140,17 @@ func VirtualCoinMapInUse(Db *xorm.Engine, masterId, isFreeze string) (map[string
}
return virtualCoinMap, nil
}
func VirtualCoinMapInUseSess(sess *xorm.Session, masterId, isFreeze string) (map[string]model.VirtualCoin, error) {
virtualCoinMap := make(map[string]model.VirtualCoin)
listInUse, err := VirtualCoinListInUseSess(sess, masterId, isFreeze)
if err != nil {
return nil, err
}
for _, coin := range listInUse {
virtualCoinMap[utils.AnyToString(coin.Id)] = *coin
}
return virtualCoinMap, nil
}

func VirtualCoinByIds(eg *xorm.Engine, ids []string) map[string]model.VirtualCoin {
var data []model.VirtualCoin


+ 24
- 0
app/db/db_virtual_coin_relate.go View File

@@ -0,0 +1,24 @@
package db

import (
model2 "applet/app/db/model"
"xorm.io/xorm"
)

// 根据订单id查出相关的数据
func GetVirtualCoinRelateListWithOrdId(engine *xorm.Engine, ordId int64, pvd string) ([]*model2.VirtualCoinRelate, error) {
var list []*model2.VirtualCoinRelate
err := engine.Table("virtual_coin_relate").Where("oid = ? and pvd=?", ordId, pvd).Find(&list)
if err != nil {
return nil, err
}
return list, nil
}
func GetVirtualCoinRelateListWithOrdIdSess(sess *xorm.Session, ordId int64, pvd string) ([]*model2.VirtualCoinRelate, error) {
var list []*model2.VirtualCoinRelate
err := sess.Table("virtual_coin_relate").Where("oid = ? and pvd=?", ordId, pvd).Find(&list)
if err != nil {
return nil, err
}
return list, nil
}

+ 2
- 1
app/db/dbs_map.go View File

@@ -110,7 +110,8 @@ func GetAllDatabaseDev() *[]model.DbMapping {
fmt.Println("cfg.Local is: ", cfg.Local)
if cfg.Local { // 本地调试 加快速度
fmt.Println("notice:LOCAL TEST, only masterId:** 99813608 ** available!")
err = Db.Where("deleted_at != ? AND db_master_id=?", 1, 31585332).Find(&m)
err = Db.Where("deleted_at != ? AND is_dev = '1' AND db_master_id=?", 1, 123456).Find(&m)

} else {
err = Db.Where("deleted_at != ? AND is_dev = '1' ", 1).Find(&m)
}


+ 18
- 0
app/db/model/capital_pool.go View File

@@ -0,0 +1,18 @@
package model

import (
"time"
)

type CapitalPool struct {
Id int `json:"id" xorm:"not null pk autoincr comment('主键id') INT(11)"`
IsUse int `json:"is_use" xorm:"not null comment('是否开启(否:0;是:1)') TINYINT(1)"`
IsAuto int `json:"is_auto" xorm:"not null default 0 comment('是否自动分红(否:0;是:1)') TINYINT(1)"`
BonusType string `json:"bonus_type" xorm:"not null default '0' comment('分红类型(1佣金,2积分,3区块币)多个以逗号隔开') VARCHAR(255)"`
BonusDateType int `json:"bonus_date_type" xorm:"not null default 0 comment('日期类型(1每天,2固定时间)') TINYINT(1)"`
BonusTime string `json:"bonus_time" xorm:"default '0' comment('分红日期(1,15,30)多个日期已逗号分隔开;ps 只有日期类型是2才是有数据') VARCHAR(255)"`
BonusLevelType int `json:"bonus_level_type" xorm:"not null default 0 comment('用户等级分红类型(1,指定等级,2大于或等于指定等级)') TINYINT(1)"`
UserLevelGroup string `json:"user_level_group" xorm:"not null comment('指定用户等级组json') TEXT"`
CreateAt time.Time `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') TIMESTAMP"`
UpdateAt time.Time `json:"update_at" xorm:"default 'CURRENT_TIMESTAMP' comment('更新时间') TIMESTAMP"`
}

+ 8
- 0
app/db/model/coin_amount_date_total.go View File

@@ -0,0 +1,8 @@
package model

type CoinAmountDateTotal struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Date int `json:"date" xorm:"default 0 INT(11)"`
Amount string `json:"amount" xorm:"default 0.000000 DECIMAL(20,6)"`
CoinId int `json:"coin_id" xorm:"default 0 INT(11)"`
}

+ 9
- 0
app/db/model/coin_amount_user_total.go View File

@@ -0,0 +1,9 @@
package model

type CoinAmountUserTotal struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Date int `json:"date" xorm:"default 0 INT(11)"`
Amount string `json:"amount" xorm:"default 0.000000 DECIMAL(20,6)"`
CoinId int `json:"coin_id" xorm:"default 0 INT(11)"`
Uid int `json:"uid" xorm:"default 0 INT(11)"`
}

+ 15
- 0
app/db/model/comm_ord_list_relate.go View File

@@ -0,0 +1,15 @@
package model

type CommOrdListRelate struct {
Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"`
Oid int64 `json:"oid" xorm:"not null default 0 comment('订单号') index unique(IDX_ORD) BIGINT(20)"`
Uid int `json:"uid" xorm:"not null default 0 comment('用户ID') unique(IDX_ORD) index INT(10)"`
Amount float64 `json:"amount" xorm:"not null default 0.00 comment('金额') FLOAT(10,2)"`
Pvd string `json:"pvd" xorm:"not null default '' comment('供应商taobao,jd,pdd,vip,suning,kaola') index VARCHAR(8)"`
Info string `json:"info" xorm:"not null comment('备注') TEXT"`
CreateAt int `json:"create_at" xorm:"not null default 0 comment('订单创建时间') index INT(10)"`
Level int `json:"level" xorm:"not null default 0 comment('0自购 1直推 大于1:间推') INT(10)"`
Mode string `json:"mode" xorm:"default '' comment('分佣方案类型') VARCHAR(255)"`
AdditionalSubsidy string `json:"additional_subsidy" xorm:"default 0.000000 comment('额外补贴 酒庄模式才有效') DECIMAL(16,6)"`
ExtendType int `json:"extend_type" xorm:"default 0 unique(IDX_ORD) comment('0普通 1超级推荐人 2团长 3团长上级超级推荐人 4团长担保用户') INT(11)"`
}

+ 16
- 0
app/db/model/money_reward.go View File

@@ -0,0 +1,16 @@
package model

import (
"time"
)

//

type MoneyReward struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Uid int `json:"uid" xorm:"INT(11)"`
Date int `json:"date" xorm:"default 0 INT(11)"`
Time time.Time `json:"time" xorm:"DATETIME"`
Month int `json:"month" xorm:"default 0 INT(11)"`
Amount string `json:"amount" xorm:"default 0.00 DECIMAL(20,2)"`
}

+ 15
- 0
app/db/model/one_orenge_task_base.go View File

@@ -0,0 +1,15 @@
package model

type OneOrengeTaskBase struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
CoinId int `json:"coin_id" xorm:"default 0 INT(11)"`
SignCondition int `json:"sign_condition" xorm:"default 0 comment('0无条件 1看完视频') INT(1)"`
SignWayType int `json:"sign_way_type" xorm:"default 0 comment('签到玩法 0连续签到 1累计签到') INT(1)"`
SignWay string `json:"sign_way" xorm:"default '' comment('签到玩法') VARCHAR(255)"`
MustSign int `json:"must_sign" xorm:"default 0 comment('强制签到') INT(1)"`
WithdrawClearDay int `json:"withdraw_clear_day" xorm:"default 0 comment('收益清空 未进入app天数') INT(11)"`
BaseSignReward string `json:"base_sign_reward" xorm:"default 0.00 comment('签到基础奖励') DECIMAL(20,2)"`
AdvId int `json:"adv_id" xorm:"default 0 INT(11)"`
VideoTotal int `json:"video_total" xorm:"default 0 INT(11)"`
VideoReward string `json:"video_reward" xorm:"default 0.00 comment('签到基础奖励') DECIMAL(20,2)"`
}

+ 15
- 0
app/db/model/task_ord_list_relate.go View File

@@ -0,0 +1,15 @@
package model

type TaskOrdListRelate struct {
Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"`
Oid int64 `json:"oid" xorm:"not null default 0 comment('订单号') index unique(IDX_ORD) BIGINT(20)"`
Uid int `json:"uid" xorm:"not null default 0 comment('用户ID') unique(IDX_ORD) index INT(10)"`
Amount float64 `json:"amount" xorm:"not null default 0.00 comment('金额') FLOAT(10,2)"`
Pvd string `json:"pvd" xorm:"not null default '' comment('供应商taobao,jd,pdd,vip,suning,kaola') index VARCHAR(8)"`
Info string `json:"info" xorm:"not null comment('备注') TEXT"`
CreateAt int `json:"create_at" xorm:"not null default 0 comment('订单创建时间') index INT(10)"`
Level int `json:"level" xorm:"not null default 0 comment('0自购 1直推 大于1:间推') INT(10)"`
Mode string `json:"mode" xorm:"default '' comment('分佣方案类型') VARCHAR(255)"`
AdditionalSubsidy string `json:"additional_subsidy" xorm:"default 0.000000 comment('额外补贴 酒庄模式才有效') DECIMAL(16,6)"`
ExtendType int `json:"extend_type" xorm:"default 0 unique(IDX_ORD) comment('0普通 1超级推荐人 2团长 3团长上级超级推荐人 4团长担保用户') INT(11)"`
}

+ 12
- 0
app/db/model/user_extend_total.go View File

@@ -0,0 +1,12 @@
package model

//

type UserExtendTotal struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Uid int `json:"uid" xorm:"default 0 INT(11)"`
Date int `json:"date" xorm:"default 0 INT(11)"`
Month int `json:"month" xorm:"default 0 INT(11)"`
Count int `json:"count" xorm:"default 0 comment('直推的') INT(11)"`
TeamCount int `json:"team_count" xorm:"default 0 comment('团队的') INT(11)"`
}

+ 8
- 0
app/db/model/user_public_platoon_amount.go View File

@@ -0,0 +1,8 @@
package model

type UserPublicPlatoonAmount struct {
Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"`
Uid int `json:"uid" xorm:"unique(idx_uid_coin_id) INT(11)"`
CoinId int `json:"coin_id" xorm:"unique(idx_uid_coin_id) INT(11)"`
Amount string `json:"amount" xorm:"DECIMAL(16,6)"`
}

+ 12
- 0
app/md/order.go View File

@@ -253,3 +253,15 @@ type VipOrder struct {

// 定制订单列表的站长
const CustomizedOrderListMaster = "[68823769], [22255132]"

type InsertCapitalPoolOrdBelongData struct {
Uid string `json:"uid" remark:用户id`
Pvd string `json:"pvd" remark:订单渠道:自营,导购,o2o。。。。`
OrdId string `json:"ord_id" remark:订单id`
Commission string `json:"commission" remark:订单总佣金`
CommissionType string `json:"commission_type" remark:佣金类型(CNY,虚拟币1Id,虚拟币2Id)`
CapitalPoolRate string `json:"capital_pool_rate" remark:资金池存入比例`
DepositValue string `json:"deposit_value" remark:存入金额`
Price string `json:"price"`
PriceValue string `json:"price_value"`
}

+ 101
- 0
app/svc/public_platoon_settle.go View File

@@ -0,0 +1,101 @@
package svc

import (
"applet/app/utils"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model"
"time"
"xorm.io/xorm"
)

//共富收益
func PublicPlatoonSettle(session *xorm.Session, ItemTitle, source, ordId string, uid, coinId int, amount float64) bool {
now := time.Now()
var data model.UserPublicPlatoonAmount
has, err := session.Where("uid=? and coin_id=?", uid, coinId).Get(&data)
if err != nil {
return false
}
beforeAmount := "0"
if has == false {
data = model.UserPublicPlatoonAmount{
Uid: uid,
CoinId: coinId,
Amount: utils.AnyToString(amount),
}
_, err := session.Insert(&data)
if err != nil {
return false
}
} else {
beforeAmount = data.Amount
data.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(data.Amount)+amount, 6)
_, err := session.Where("id=?", data.Id).Cols("amount").Update(&data)
if err != nil {
return false
}
}
finUserFlow := model.UserPublicPlatoonIncomeRecords{
Type: 0,
Uid: uid,
Amount: utils.AnyToString(amount),
CreateAt: now,
UpdateAt: now,
Date: now.Format("2006-01"),
Kind: 3,
CoinId: coinId,
Title: ItemTitle,
BeforeAmount: beforeAmount,
Oid: ordId,
Source: source,
}
_, err = session.Insert(&finUserFlow)
if err != nil {
return false
}
return true
}
func PublicPlatoonAddRecord(eg *xorm.Engine, ItemTitle, ordId string, uid, coinId, kind, types int, amount float64, beforeAmount string) bool {
now := time.Now()

finUserFlow := model.UserPublicPlatoonIncomeRecords{
Type: types,
Uid: uid,
Amount: utils.AnyToString(amount),
CreateAt: now,
UpdateAt: now,
Date: now.Format("2006-01"),
Kind: kind,
CoinId: coinId,
Title: ItemTitle,
BeforeAmount: beforeAmount,
Oid: ordId,
}
_, err := eg.Insert(&finUserFlow)
if err != nil {
return false
}
return true
}
func PublicPlatoonAddRecordWithSession(session *xorm.Session, ItemTitle, ordId string, uid, coinId, kind, types int, amount float64, beforeAmount, source string) bool {
now := time.Now()

finUserFlow := model.UserPublicPlatoonIncomeRecords{
Type: types,
Uid: uid,
Amount: utils.AnyToString(amount),
CreateAt: now,
UpdateAt: now,
Date: now.Format("2006-01"),
Kind: kind,
CoinId: coinId,
Title: ItemTitle,
BeforeAmount: beforeAmount,
Oid: ordId,
Source: source,
}
_, err := session.Insert(&finUserFlow)
if err != nil {
return false
}
return true
}

+ 303
- 0
app/svc/svc_comm_deal_commission.go View File

@@ -0,0 +1,303 @@
package svc

import (
db2 "applet/app/db"
"applet/app/db/model"
"applet/app/md"
"applet/app/utils"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/lib/comm_plan"
md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
svc2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc"
"fmt"
"github.com/jinzhu/copier"
"time"
"xorm.io/xorm"
)

func CommGetLvUser(engine *xorm.Engine, CommissionParam md2.CommissionFirstParam, oid int64, masterId string, mapData map[string]string) {
commArr := rule.GetComm(engine)
plan, commission, virtualCoinMoneyRate := svc2.GetAllPlan(engine, masterId)
var CommissionParam1 md2.CommissionParam
comm := CommissionParam.CommissionParam
err2 := copier.Copy(&CommissionParam1, &comm)
fmt.Println(err2)
_, _, _, _, lvUser, err := svc2.GetRewardCommission(engine, &CommissionParam1, false, CommissionParam.Uid, CommissionParam.Provider, masterId, true, mapData, commArr, plan, commission, virtualCoinMoneyRate)
if err != nil {
return
}
if lvUser == nil {
return
}

CommCommOrderRelateInsert(engine, oid, CommissionParam.Provider, int(time.Now().Unix()), lvUser, mapData)
//sql := `SELECT id from user_virtual_coin_flow where ord_id='%d'`
//sql = fmt.Sprintf(sql, oid)
//nativeString, _ := db2.QueryNativeString(engine, sql)
//has := false
//if len(nativeString) > 0 && utils.StrToInt(nativeString[0]["id"]) > 0 {
// has = true
//}
//sql1 := `SELECT id from fin_user_flow where ord_id='%d'`
//sql1 = fmt.Sprintf(sql1, oid)
//nativeString1, _ := db2.QueryNativeString(engine, sql1)
//has1 := false
//if len(nativeString1) > 0 && utils.StrToInt(nativeString1[0]["id"]) > 0 {
// has1 = true
//}
//fmt.Println("===========任务4=============", masterId, CommissionParam.Uid, oid, has, has1)
//if has == false && has1 == false {
CommSettleDone(engine, CommissionParam.Provider, oid, masterId, mapData)
//}
}

// 分佣表插入获取到的数据
func CommCommOrderRelateInsert(eg *xorm.Engine, oid int64, pvd string, createTime int, lvUser *comm_plan.LvUser, mapData map[string]string) {
level := 0
oldLevel := 0
fmt.Println(lvUser)
profit := utils.FloatFormat(lvUser.Profit+lvUser.SubsidyFee, 6)
oldLvUser := lvUser
data := []*model.CommOrdListRelate{
{
Oid: oid,
Uid: lvUser.Uid,
Amount: profit,
Pvd: pvd,
CreateAt: createTime,
Level: level,
},
}
if mapData["reward_type"] == "2" {
data = make([]*model.CommOrdListRelate, 0)
}
mode := mapData["mode"]
for lvUser.ParentUser != nil {
lvUser = lvUser.ParentUser
if lvUser.Uid == 0 {
continue
}
fmt.Println(lvUser)
level = level + 1
profit = utils.FloatFormat(lvUser.Profit+lvUser.SubsidyFee, 6)
var additionalSubsidy float64 = 0
if utils.InArr(mode, []string{"lv_winery", "public_platoon"}) {
profit = utils.FloatFormat(lvUser.Profit, 6)
additionalSubsidy = lvUser.SubsidyFee
}
data = append(data, &model.CommOrdListRelate{
Oid: oid,
Uid: lvUser.Uid,
Amount: profit,
Pvd: pvd,
CreateAt: createTime,
Level: level,
Mode: mode,
AdditionalSubsidy: utils.Float64ToStrByPrec(additionalSubsidy, 9),
ExtendType: lvUser.ExtendType,
})
}
for _, v := range data {
if utils.StrToInt(mapData["coin_id_type"]) > 0 {
v.Amount = 0
v.AdditionalSubsidy = "0"
v.Info = "任务没佣金设置,不返佣金"
}
}
err1 := db2.DbInsertBatch(eg, data)
if err1 != nil {
return
} else {
// 插入虚拟币数据
vcrData := CommCombineVirtualCoinRelateData(oldLvUser, oid, pvd, oldLevel, mapData)
err2 := db2.DbInsertBatch(eg, vcrData)
for _, item := range vcrData {
fmt.Println(item)
}
if err2 != nil {
return
}
}
}
func CommSettleDone(eg *xorm.Engine, pvd string, oid int64, masterId string, mapData map[string]string) bool {
fmt.Println("=======================任务=============", masterId, oid, pvd)
ol, err := db2.CommOrderRelateListByOid(eg, oid, pvd)
if err != nil {
return false
}
// 查询虚拟币 virtual_coin_relate 表
vcrList, err := db2.GetVirtualCoinRelateListWithOrdId(eg, oid, pvd)
if err != nil {
return false
}
session := eg.NewSession()
defer session.Close()
if err := session.Begin(); err != nil {
return false
}

set, _ := db2.SysCfgGetOne(eg, "app_name_cn")
var appName = ""
if set != nil {
appName = set.Val
}
pvdOid := oid
if mapData["pvd_oid"] != "" {
pvdOid = utils.StrToInt64(mapData["pvd_oid"])
}
for _, item := range ol {
if mapData["reward_type"] == "2" && item.Level == 0 {
continue
}
//佣金不为空
if item.Amount > 0 {
//公排
if utils.InArr(item.Mode, []string{"lv_commission_public_platoon", "lv_price_public_platoon"}) && item.ExtendType == 5 {
fmt.Println("======================555")
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(pvdOid), item.Uid, 0, item.Amount)
fmt.Println("======================666", bools)
if bools == false {
_ = session.Rollback()
return false
}
continue
}
item.Oid = pvdOid
_ = CommCommSettleMoney(session, item, appName, masterId, mapData)
}
if utils.StrToFloat64(item.AdditionalSubsidy) > 0 {
if item.Mode == "public_platoon" { //公排
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(pvdOid), item.Uid, 0, utils.StrToFloat64(item.AdditionalSubsidy))
if bools == false {
_ = session.Rollback()
return false
}
}
}
}
// 虚拟币相关操作
for _, item := range vcrList {
if mapData["reward_type"] == "2" && item.Level == 0 {
continue
}
if utils.StrToFloat64(item.Amount) > 0 {
if utils.InArr(item.Mode, []string{"lv_commission_public_platoon", "lv_price_public_platoon"}) && item.ExtendType == 5 {
fmt.Println("======================555")
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(pvdOid), item.Uid, item.CoinId, utils.StrToFloat64(item.Amount))
fmt.Println("======================666", bools)
if bools == false {
_ = session.Rollback()
return false
}
continue
}
item.Oid = pvdOid
_ = CommSettleVirtualCoin(session, item, mapData)
}
//公排
if item.Mode == "public_platoon" && utils.StrToFloat64(item.AdditionalSubsidy) > 0 {
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(pvdOid), item.Uid, item.CoinId, utils.StrToFloat64(item.AdditionalSubsidy))
if bools == false {
_ = session.Rollback()
return false
}
}
}
// 提交事务
err = session.Commit()
if err != nil {
return false
}
//全球分红写入
var req = &md.InsertCapitalPoolOrdBelongData{
Uid: mapData["uid"],
Pvd: mapData["pvd"],
Commission: mapData["commission"],
CommissionType: "cny",
OrdId: utils.Int64ToStr(oid),
CapitalPoolRate: mapData["global_rate"],
DepositValue: utils.Float64ToStr(utils.FloatFormat(utils.StrToFloat64(mapData["commission"])*utils.StrToFloat64(mapData["global_rate"]), 6)),
Price: mapData["price"],
PriceValue: utils.Float64ToStr(utils.FloatFormat(utils.StrToFloat64(mapData["price"])*utils.StrToFloat64(mapData["global_rate"]), 6)),
}
SaveCapitalPoolOrderByCommApi(eg, masterId, req)
return true
}
func CommCommSettleMoney(session *xorm.Session, item *model.CommOrdListRelate, appName, masterId string, mapData map[string]string) bool {
now := time.Now()
beforeAmount := "0"
afterAmount := "0"
var affected int64 = 0
userProfile, err := db2.UserProfileFindByIdWithSession(session, item.Uid)
if userProfile == nil {
}
if err != nil || userProfile == nil {
_ = session.Rollback()
return false
}

// 获取余额更新锁
cb, err := HandleBalanceDistributedLock(masterId, utils.IntToStr(item.Uid), "mall_settle_order")
if err != nil {
fmt.Println(err.Error())
_ = session.Rollback()
return false
}
// 释放锁
if cb != nil {
defer cb()
}
// 开始写入流水
var orderAction int
if item.Level == 0 {
orderAction = 10 // 自购
} else {
orderAction = 11 // 推广
}
var ItemTitle = mapData["title"] + "奖励"
if item.Level > 0 {
ItemTitle = mapData["title"] + "团队奖励"
}
finUserFlow := model.FinUserFlow{
Type: 0,
Uid: item.Uid,
Amount: utils.Float64ToStrByPrec(item.Amount, 8),
BeforeAmount: beforeAmount,
AfterAmount: afterAmount,
OrdType: item.Pvd,
OrdId: utils.AnyToString(item.Oid),
OrdAction: orderAction,
OrdDetail: "",
State: 2,
OtherId: item.Id,
OrdTitle: ItemTitle,
OrdTime: int(now.Unix()),
CreateAt: now,
UpdateAt: now,
}
// 更新用户余额
finUserFlow.BeforeAmount = userProfile.FinValid
userProfile.FinValid = utils.Float64ToStrByPrec(utils.AnyToFloat64(userProfile.FinValid)+utils.AnyToFloat64(item.Amount), 8)
userProfile.FinTotal = userProfile.FinTotal + utils.StrToFloat32(utils.Float64ToStrByPrec(item.Amount, 8))
affected, err = db2.UserProfileUpdateWithSession(session, item.Uid, userProfile, "fin_valid", "fin_total")
finUserFlow.AfterAmount = userProfile.FinValid
has, errs := db2.InsertCommWithSession(
session, &finUserFlow)
if affected == 0 || err != nil || errs != nil || has == 0 {
_ = session.Rollback()
return false
}
if utils.InArr(item.Mode, []string{"public_platoon", "lv_commission_public_platoon", "lv_price_public_platoon"}) { //公排的加一条流水
kind := 4
title := "自购奖"
if item.Level == 1 {
kind = 5
title = "直推奖"
}
bools := PublicPlatoonAddRecordWithSession(session, title, utils.Int64ToStr(item.Oid), item.Uid, 0, kind, 0, item.Amount, beforeAmount, mapData["title"]+"奖励")
if bools == false {
return false
}
}
return true
}

+ 457
- 0
app/svc/svc_deal_commission.go View File

@@ -0,0 +1,457 @@
package svc

import (
db2 "applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/lib/comm_plan"
md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
svc2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc"
"fmt"
"github.com/jinzhu/copier"
"time"
"xorm.io/xorm"
)

func GetLvUser(engine *xorm.Engine, CommissionParam md2.CommissionFirstParam, oid int64, masterId string, mapData map[string]string) {
commArr := rule.GetComm(engine)
plan, commission, virtualCoinMoneyRate := svc2.GetAllPlan(engine, masterId)
var CommissionParam1 md2.CommissionParam
comm := CommissionParam.CommissionParam
err2 := copier.Copy(&CommissionParam1, &comm)
fmt.Println(err2)
_, _, _, _, lvUser, err := svc2.GetRewardCommission(engine, &CommissionParam1, false, CommissionParam.Uid, CommissionParam.Provider, masterId, true, mapData, commArr, plan, commission, virtualCoinMoneyRate)
if err != nil {
return
}
if lvUser == nil {
return
}

CommOrderRelateInsert(engine, oid, CommissionParam.Provider, int(time.Now().Unix()), lvUser, mapData)
//sql := `SELECT id from user_virtual_coin_flow where ord_id='%d'`
//sql = fmt.Sprintf(sql, oid)
//nativeString, _ := db2.QueryNativeString(engine, sql)
//has := false
//if len(nativeString) > 0 && utils.StrToInt(nativeString[0]["id"]) > 0 {
// has = true
//}
//sql1 := `SELECT id from fin_user_flow where ord_id='%d'`
//sql1 = fmt.Sprintf(sql1, oid)
//nativeString1, _ := db2.QueryNativeString(engine, sql1)
//has1 := false
//if len(nativeString1) > 0 && utils.StrToInt(nativeString1[0]["id"]) > 0 {
// has1 = true
//}
//fmt.Println("===========任务4=============", masterId, CommissionParam.Uid, oid, has, has1)
//if has == false && has1 == false {
SettleDone(engine, CommissionParam.Provider, oid, masterId, mapData)
//}
}

// 分佣表插入获取到的数据
func CommOrderRelateInsert(eg *xorm.Engine, oid int64, pvd string, createTime int, lvUser *comm_plan.LvUser, mapData map[string]string) {
level := 0
oldLevel := 0
fmt.Println(lvUser)
profit := utils.FloatFormat(lvUser.Profit+lvUser.SubsidyFee, 6)
oldLvUser := lvUser
data := []*model.TaskOrdListRelate{
{
Oid: oid,
Uid: lvUser.Uid,
Amount: profit,
Pvd: pvd,
CreateAt: createTime,
Level: level,
},
}
if mapData["reward_type"] == "2" {
data = make([]*model.TaskOrdListRelate, 0)
}
mode := mapData["mode"]
for lvUser.ParentUser != nil {
lvUser = lvUser.ParentUser
if lvUser.Uid == 0 {
continue
}
fmt.Println(lvUser)
level = level + 1
profit = utils.FloatFormat(lvUser.Profit+lvUser.SubsidyFee, 6)
var additionalSubsidy float64 = 0
if utils.InArr(mode, []string{"lv_winery", "public_platoon"}) {
profit = utils.FloatFormat(lvUser.Profit, 6)
additionalSubsidy = lvUser.SubsidyFee
}
data = append(data, &model.TaskOrdListRelate{
Oid: oid,
Uid: lvUser.Uid,
Amount: profit,
Pvd: pvd,
CreateAt: createTime,
Level: level,
Mode: mode,
AdditionalSubsidy: utils.Float64ToStrByPrec(additionalSubsidy, 9),
ExtendType: lvUser.ExtendType,
})
}
for _, v := range data {
if utils.StrToInt(mapData["coin_id_type"]) > 0 {
v.Amount = 0
v.AdditionalSubsidy = "0"
v.Info = "任务没佣金设置,不返佣金"
}
}
err1 := db2.DbInsertBatch(eg, data)
if err1 != nil {
return
} else {
// 插入虚拟币数据
vcrData := CommCombineVirtualCoinRelateData(oldLvUser, oid, pvd, oldLevel, mapData)
err2 := db2.DbInsertBatch(eg, vcrData)
for _, item := range vcrData {
fmt.Println(item)
}
if err2 != nil {
return
}
}
}
func ConvertList2Map(a []*comm_plan.VirtualCoinCommission) (b map[string]float64) {
b = make(map[string]float64)
for _, i := range a {
b[i.Cid] = i.Val
}
return b
}
func CommCombineVirtualCoinRelateData(lvUser *comm_plan.LvUser, oid int64, pvd string, level int, mapData map[string]string) []*model.VirtualCoinRelate {
mode := mapData["mode"]

var data = make([]*model.VirtualCoinRelate, 0)
if mapData["reward_type"] != "2" && level == 0 || level > 0 {
//可能没有极差返利 只有补贴
profitList := lvUser.ProfitList
if len(profitList) == 0 {
profitList = lvUser.SubsidyFeeList
}
if profitList != nil {
var subsidyFeeList map[string]float64
if lvUser.SubsidyFeeList != nil && len(lvUser.ProfitList) > 0 {
subsidyFeeList = ConvertList2Map(lvUser.SubsidyFeeList)
}
var coinList = make([]string, 0)
for _, v := range profitList {
coinList = append(coinList, v.Cid)
}
if utils.InArr(mode, []string{"lv_winery", "public_platoon"}) && lvUser.SubsidyFeeList != nil { //补贴类型 没有的要补上
subsidyFeeList = ConvertList2Map(lvUser.SubsidyFeeList)
for _, v := range lvUser.SubsidyFeeList {
if utils.InArr(v.Cid, coinList) == false && v.Val > 0 {
v.Val = 0
profitList = append(profitList, v)
}
}
}
for _, item := range profitList {

if lvUser.Uid == 0 {
continue
}
if item.Cid != "0" && item.Cid != "commission" {
//加上补贴
subsidyFee := subsidyFeeList[item.Cid]
var additionalSubsidy float64 = 0
profit := utils.Float64ToStrByPrec(item.Val+subsidyFee, 9)
if utils.InArr(mode, []string{"lv_winery", "public_platoon"}) {
profit = utils.Float64ToStrByPrec(item.Val, 9)
additionalSubsidy = subsidyFee
}
if mode == "public_platoon" && level > 1 {
profit = "0"
}
var virtualCoinRelate = &model.VirtualCoinRelate{
Oid: oid,
Uid: lvUser.Uid,
CoinId: utils.StrToInt(item.Cid),
Amount: profit,
Pvd: pvd,
CreateAt: int(time.Now().Unix()),
Level: level,
Mode: mode,
AdditionalSubsidy: utils.Float64ToStrByPrec(additionalSubsidy, 6),
ExtendType: lvUser.ExtendType,
}
data = append(data, virtualCoinRelate)
}
}
}
}
if lvUser.ParentUser != nil {
level += 1
data = append(data, CommCombineVirtualCoinRelateData(lvUser.ParentUser, oid, pvd, level, mapData)...)
}
return data
}
func SettleDone(eg *xorm.Engine, pvd string, oid int64, masterId string, mapData map[string]string) bool {
fmt.Println("=======================任务=============", masterId, oid, pvd)
ol, err := db2.TaskOrderRelateListByOid(eg, oid, pvd)
if err != nil {
return false
}
// 查询虚拟币 virtual_coin_relate 表
vcrList, err := db2.GetVirtualCoinRelateListWithOrdId(eg, oid, pvd)
if err != nil {
return false
}
session := eg.NewSession()
defer session.Close()
if err := session.Begin(); err != nil {
return false
}

set, _ := db2.SysCfgGetOne(eg, "app_name_cn")
var appName = ""
if set != nil {
appName = set.Val
}
for _, item := range ol {
if mapData["reward_type"] == "2" && item.Level == 0 {
continue
}
//佣金不为空
if item.Amount > 0 {
//公排
if utils.InArr(item.Mode, []string{"lv_commission_public_platoon", "lv_price_public_platoon"}) && item.ExtendType == 5 {
fmt.Println("======================555")
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(oid), item.Uid, 0, item.Amount)
fmt.Println("======================666", bools)
if bools == false {
_ = session.Rollback()
return false
}
continue
}
_ = CommSettleMoney(session, item, appName, masterId)
}
if utils.StrToFloat64(item.AdditionalSubsidy) > 0 {
if item.Mode == "public_platoon" { //公排
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(oid), item.Uid, 0, utils.StrToFloat64(item.AdditionalSubsidy))
if bools == false {
_ = session.Rollback()
return false
}
}
}
}
// 虚拟币相关操作
for _, item := range vcrList {
if mapData["reward_type"] == "2" && item.Level == 0 {
continue
}
if utils.StrToFloat64(item.Amount) > 0 {
if utils.InArr(item.Mode, []string{"lv_commission_public_platoon", "lv_price_public_platoon"}) && item.ExtendType == 5 {
fmt.Println("======================555")
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(oid), item.Uid, item.CoinId, utils.StrToFloat64(item.Amount))
fmt.Println("======================666", bools)
if bools == false {
_ = session.Rollback()
return false
}
continue
}
_ = CommSettleVirtualCoin(session, item, map[string]string{})
}
//公排
if item.Mode == "public_platoon" && utils.StrToFloat64(item.AdditionalSubsidy) > 0 {
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(oid), item.Uid, item.CoinId, utils.StrToFloat64(item.AdditionalSubsidy))
if bools == false {
_ = session.Rollback()
return false
}
}
}
// 提交事务
err = session.Commit()
if err != nil {
return false
}
return true
}
func CommSettleMoney(session *xorm.Session, item *model.TaskOrdListRelate, appName, masterId string) bool {
now := time.Now()
beforeAmount := "0"
afterAmount := "0"
var affected int64 = 0
userProfile, err := db2.UserProfileFindByIdWithSession(session, item.Uid)
if userProfile == nil {
}
if err != nil || userProfile == nil {
_ = session.Rollback()
return false
}

// 获取余额更新锁
cb, err := HandleBalanceDistributedLock(masterId, utils.IntToStr(item.Uid), "mall_settle_order")
if err != nil {
fmt.Println(err.Error())
_ = session.Rollback()
return false
}
// 释放锁
if cb != nil {
defer cb()
}
// 开始写入流水
var orderAction int
if item.Level == 0 {
orderAction = 10 // 自购
} else {
orderAction = 11 // 推广
}
var ItemTitle = "任务分佣结算"
if item.Pvd == "adset_video" {
ItemTitle = "看视频奖励"
}
titles := ItemTitle
if item.Level > 0 {
ItemTitle = "团队任务奖励"
if item.Pvd == "adset_video" {
ItemTitle = "团队看视频奖励"
}
}
finUserFlow := model.FinUserFlow{
Type: 0,
Uid: item.Uid,
Amount: utils.Float64ToStrByPrec(item.Amount, 8),
BeforeAmount: beforeAmount,
AfterAmount: afterAmount,
OrdType: item.Pvd,
OrdId: utils.AnyToString(item.Oid),
OrdAction: orderAction,
OrdDetail: "",
State: 2,
OtherId: item.Id,
OrdTitle: ItemTitle,
OrdTime: int(now.Unix()),
CreateAt: now,
UpdateAt: now,
}
// 更新用户余额
finUserFlow.BeforeAmount = userProfile.FinValid
userProfile.FinValid = utils.Float64ToStrByPrec(utils.AnyToFloat64(userProfile.FinValid)+utils.AnyToFloat64(item.Amount), 8)
userProfile.FinTotal = userProfile.FinTotal + utils.StrToFloat32(utils.Float64ToStrByPrec(item.Amount, 8))
affected, err = db2.UserProfileUpdateWithSession(session, item.Uid, userProfile, "fin_valid", "fin_total")
finUserFlow.AfterAmount = userProfile.FinValid
has, errs := db2.InsertCommWithSession(
session, &finUserFlow)
if affected == 0 || err != nil || errs != nil || has == 0 {
_ = session.Rollback()
return false
}
if utils.InArr(item.Mode, []string{"public_platoon", "lv_commission_public_platoon", "lv_price_public_platoon"}) { //公排的加一条流水
kind := 4
title := "自购奖"
if item.Level == 1 {
kind = 5
title = "直推奖"
}
bools := PublicPlatoonAddRecordWithSession(session, title, utils.Int64ToStr(item.Oid), item.Uid, 0, kind, 0, item.Amount, beforeAmount, titles)
if bools == false {
return false
}
}
return true
}

func CommSettleVirtualCoin(session *xorm.Session, virtualCoinRelateItem *model.VirtualCoinRelate, mapData map[string]string) bool {

var (
beforeAmount = "0"
afterAmount = "0"
)
// 查询用户虚拟币余额表记录,有则更新,无则新增一条记录
userVirtualAmount, err := db2.GetUserVirtualAmountOne(session, virtualCoinRelateItem.Uid, virtualCoinRelateItem.CoinId)
if err != nil {
_ = session.Rollback()
return false
}

if userVirtualAmount == nil { // 没有记录则新增一条
userVirtualAmount = &model.UserVirtualAmount{
Uid: virtualCoinRelateItem.Uid,
CoinId: virtualCoinRelateItem.CoinId,
Amount: virtualCoinRelateItem.Amount,
}
afterAmount = virtualCoinRelateItem.Amount
has, errs := db2.InsertCommWithSession(
session, userVirtualAmount)
if errs != nil || has == 0 {
_ = session.Rollback()
return false
}
} else { // 更新
beforeAmount = userVirtualAmount.Amount
amount := utils.StrToFloat64(userVirtualAmount.Amount) + utils.StrToFloat64(virtualCoinRelateItem.Amount)
userVirtualAmount.Amount = utils.Float64ToStrByPrec(amount, 6)
afterAmount = userVirtualAmount.Amount
affected, err := session.Where("id = ?", userVirtualAmount.Id).Update(userVirtualAmount)
if err != nil {
_ = session.Rollback()
return false
}
if affected == 0 {
_ = session.Rollback()
return false
}
}
var title = "任务分佣结算"
if virtualCoinRelateItem.Pvd == "adset_video" {
title = "看视频奖励"
}
if mapData["title"] != "" {
title = mapData["title"] + "奖励"
}
titles := title
if virtualCoinRelateItem.Level > 0 {
title = "团队任务奖励"
if virtualCoinRelateItem.Pvd == "adset_video" {
title = "团队看视频奖励"
}
if mapData["title"] != "" {
title = mapData["title"] + "团队奖励"
}
}
// 用户虚拟币流水表新增记录
var userVirtualCoinFlow = model.UserVirtualCoinFlow{
Uid: virtualCoinRelateItem.Uid,
CoinId: virtualCoinRelateItem.CoinId,
Direction: 1,
Title: title,
OrdId: utils.Int64ToStr(virtualCoinRelateItem.Oid),
Amout: virtualCoinRelateItem.Amount,
BeforeAmout: beforeAmount,
AfterAmout: afterAmount,
SysFee: "0",
CreateTime: time.Now(),
}
has, errs := db2.InsertCommWithSession(
session, &userVirtualCoinFlow)
if errs != nil || has == 0 {
_ = session.Rollback()
return false
}
if utils.InArr(virtualCoinRelateItem.Mode, []string{"public_platoon", "lv_commission_public_platoon", "lv_price_public_platoon"}) { //公排的加一条流水
kind := 4
title := "自购奖"
if virtualCoinRelateItem.Level == 1 {
kind = 5
title = "直推奖"
}
bools := PublicPlatoonAddRecordWithSession(session, title, utils.Int64ToStr(virtualCoinRelateItem.Oid), virtualCoinRelateItem.Uid, virtualCoinRelateItem.CoinId, kind, 0, utils.StrToFloat64(virtualCoinRelateItem.Amount), beforeAmount, titles)
if bools == false {
return false
}
}
return true
}

+ 55
- 0
app/svc/svc_save_capital_pool_order.go View File

@@ -0,0 +1,55 @@
package svc

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/md"
"crypto/tls"
"encoding/json"
"io/ioutil"
"net/http"
"strings"
"time"
"xorm.io/xorm"
)

func SaveCapitalPoolOrderByCommApi(eg *xorm.Engine, masterId string, req *md.InsertCapitalPoolOrdBelongData) {
ms, err := db.CapitalPoolByIsUse(eg)
if ms == nil || err != nil {
return
}
host := cfg.AppComm.URL + "/api/v1/comm/CapitalPool/addBonusOrd"
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{
Timeout: 15 * time.Second,
Transport: tr,
}
byte1, _ := json.Marshal(req)
req1, _ := http.NewRequest("POST", host, strings.NewReader(string(byte1)))
req1.Header.Set("master_id", masterId)
req1.Header.Set("Content-Type", "application/json")
resp, err := (client).Do(req1)
if err != nil || resp == nil {
return
}
defer resp.Body.Close()
respByte, _ := ioutil.ReadAll(resp.Body)

if len(respByte) == 0 {
return
}
var serverResp map[string]interface{}
err = json.Unmarshal(respByte, &serverResp)
if err != nil || serverResp == nil {
return
}
if serverResp["data"] == nil {
if serverResp["msg"] != "" {
return
}
return
}
return
}

+ 66
- 0
app/svc/svc_user_virtual_coin_flow.go View File

@@ -74,3 +74,69 @@ func virtualCoinFlowInsert(session *xorm.Session, uid, coinId, coinIdTo int, mon
}
return data.Id, nil
}

func UpdateUserFinValidAndInterFlowWithSession(session *xorm.Session, money, Title, ordType string, types, orderAction, uid, id int, ordId, otherId int64) error {
if utils.StrToFloat64(money) <= 0 {
return nil
}
userProfile, err := db.UserProfileFindByIdWithSession(session, uid)
if err != nil || userProfile == nil {
_ = session.Rollback()
if err == nil {
err = errors.New("获取用户余额信息失败")
}
return err
}
beforeAmount := userProfile.FinValid
if types == 0 {
userProfile.FinValid = utils.AnyToString(utils.AnyToFloat64(userProfile.FinValid) + utils.StrToFloat64(money))
} else if types == 1 {
userProfile.FinValid = utils.AnyToString(utils.AnyToFloat64(userProfile.FinValid) - utils.StrToFloat64(money))
}
afterAmount := userProfile.FinValid
userProfile.FinTotal = userProfile.FinTotal + utils.StrToFloat32(money)
affected, err := db.UserProfileUpdateWithSession(session, uid, userProfile, "fin_valid,fin_total")
if err != nil || affected == 0 {
if err == nil {
err = errors.New("更新用户余额信息失败")
}
return err
}
err = flowInsert(session, uid, money, orderAction, ordId, otherId, id, Title, ordType, types, beforeAmount, afterAmount)
if err != nil {
return err
}
return nil
}

// 开始写入流水
//uid:用户id,paidPrice金额,ordId订单id,id其他关联订单,具体根据订单类型判断,goodsId(OrdDetail记录商品ID或提现账号),ItemTitle订单标题
//type:0收入,1支出,beforeAmount变更前金额,afterAmount变更后
//orderAction:10自购,11推广,12团队,13免单,20提现,21消费,22退款,23拼团返佣,24资金池分红
//ordType:订单类型taobao,jd,pdd,vip,suning,kaola,own自营,withdraw提现,vip_refund会员升级退款,vip_order会员升级余额支付流水,group_buy拼团
func flowInsert(session *xorm.Session, uid int, paidPrice string, orderAction int, ordId int64, id int64, goodsId int, ItemTitle string, ordType string, types int, beforeAmount string, afterAmount string) error {
now := time.Now()
if err := db.FinUserFlowInsertOneWithSession(
session,
&model.FinUserFlow{
Type: types,
Uid: uid,
Amount: paidPrice,
BeforeAmount: beforeAmount,
AfterAmount: afterAmount,
OrdType: ordType,
OrdId: utils.Int64ToStr(ordId),
OrdAction: orderAction,
OrdDetail: utils.IntToStr(goodsId),
State: 2,
OtherId: id,
OrdTitle: ItemTitle,
OrdTime: int(now.Unix()),
CreateAt: now,
UpdateAt: now,
}); err != nil {
_ = logx.Warn(err)
return err
}
return nil
}

+ 130
- 0
consume/canal_one_orenge_user_virtual_coin_flow_consume.go View File

@@ -0,0 +1,130 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/shopspring/decimal"
"github.com/streadway/amqp"
"strings"
"time"
)

func CanalUserVirtualCoinFlowConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>CanalUserVirtualCoinFlowConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalUserVirtualCoinFlowConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleCanalUserVirtualCoinFlow(res.Body)
if err != nil {
fmt.Println("handleCanalUserVirtualCoinFlow_ERR:::::", err.Error())
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleCanalUserVirtualCoinFlow(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalUserVirtualCoinFlowOrderMessage[md.CanalUserVirtualCoinFlowOrder]
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
return err
}

masterId := strings.Split(canalMsg.Database, "_")[1]
if masterId != "32053480" {
return nil
}
engine := db.DBs[masterId]
now := time.Now()

//2、查找 one_circles_green_energy_basic_setting 基础设置
userPublicPlatoonDoubleNetworkSetting, err := db.UserPublicPlatoonDoubleNetworkSettingGetOneByParams(engine, map[string]interface{}{
"key": "is_open",
"value": 1,
})
if err != nil {
return err
}
if userPublicPlatoonDoubleNetworkSetting == nil {
return errors.New("公排双网未开启")
}
if canalMsg.Type == md.CanalMsgInsertSqlType {
if canalMsg.Data[0].CoinId == utils.IntToStr(userPublicPlatoonDoubleNetworkSetting.CoinId) {
//3、查找 user_public_platoon_double_network_user_coin_record
userPublicPlatoonDoubleNetworkUserCoinRecord, err1 := db.UserPublicPlatoonDoubleNetworkUserCoinRecordGetOneByParams(engine, map[string]interface{}{
"key": "uid",
"value": canalMsg.Data[0].Uid,
})
if err1 != nil {
return err1
}
if userPublicPlatoonDoubleNetworkUserCoinRecord == nil {
userProfile, err2 := db.UserProfileFindByIDSess(engine.NewSession(), canalMsg.Data[0].Uid)
if userProfile == nil {
return errors.New("用户不存在")
}
if err2 != nil {
return err2
}
//新增记录
_, err3 := db.UserPublicPlatoonDoubleNetworkUserCoinRecordInsert(engine, &model.UserPublicPlatoonDoubleNetworkUserCoinRecord{
Uid: utils.StrToInt(canalMsg.Data[0].Uid),
LastAmount: canalMsg.Data[0].AfterAmout,
Amount: canalMsg.Data[0].AfterAmout,
RecommendUid: userProfile.ParentUid,
CoinId: utils.StrToInt(canalMsg.Data[0].CoinId),
CreateAt: now.Format("2006-01-02 15:04:05"),
UpdateAt: now.Format("2006-01-02 15:04:05"),
})
if err3 != nil {
return err3
}
} else {
//更新记录
afterAmount, _ := decimal.NewFromString(canalMsg.Data[0].AfterAmout)
amount, _ := decimal.NewFromString(userPublicPlatoonDoubleNetworkUserCoinRecord.Amount)
lastAmount, _ := decimal.NewFromString(userPublicPlatoonDoubleNetworkUserCoinRecord.LastAmount)
if canalMsg.Data[0].Direction == "1" || canalMsg.Data[0].Direction == "2" {
//收入 && 支出
userPublicPlatoonDoubleNetworkUserCoinRecord.Amount = amount.Add(afterAmount.Sub(lastAmount)).String()
}
userPublicPlatoonDoubleNetworkUserCoinRecord.LastAmount = canalMsg.Data[0].AfterAmout
_, err2 := db.UserPublicPlatoonDoubleNetworkUserCoinRecordUpdate(engine, userPublicPlatoonDoubleNetworkUserCoinRecord.Id, userPublicPlatoonDoubleNetworkUserCoinRecord, "amount", "last_amount")
if err2 != nil {
return err2
}
}
}
}

return nil
}

+ 78
- 0
consume/canal_user_money_consume.go View File

@@ -0,0 +1,78 @@
package consume

import (
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strings"
)

func CancalUserMoneyConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>handleCancalUserMoneyConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>handleCancalUserMoneyConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleCancalUserMoneyConsume(res.Body)
if err != nil {
fmt.Println("handleCancalUserMoneyConsume_ERR:::::", err.Error())
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleCancalUserMoneyConsume(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalUserMoneyMessage[md.CanalUserMoney]
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
return err
}

masterId := strings.Split(canalMsg.Database, "_")[1]
if masterId != "15763466" {
return nil
}
engine := db.DBs[masterId]
//

if canalMsg.Type == md.CanalMsgInsertSqlType {
if utils.StrToFloat64(canalMsg.Data[0].Amount) > 0 && canalMsg.Data[0].Type == "0" {
ex := strings.Split(canalMsg.Data[0].CreateAt, " ")
date := strings.ReplaceAll(ex[0], "-", "")
monthEx := strings.Split(ex[0], "-")
reward := db.GetMoneyReward(engine, canalMsg.Data[0].Uid, date, monthEx[0]+monthEx[1])
reward.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(reward.Amount)+utils.StrToFloat64(canalMsg.Data[0].Amount), 6)
engine.Where("id=?", reward.Id).Update(reward)
}
}

return nil
}

+ 92
- 0
consume/canal_user_relate_consume.go View File

@@ -0,0 +1,92 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strings"
"time"
)

func CancalUserRelateConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>CancalUserRelateConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CancalUserRelateConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleCancalUserRelateConsume(res.Body)
if err != nil {
fmt.Println("CancalUserRelateConsume_ERR:::::", err.Error())
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleCancalUserRelateConsume(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalUserRelateMessage[md.CanalUserRelate]
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
return err
}

masterId := strings.Split(canalMsg.Database, "_")[1]
if masterId != "15763466" {
return nil
}
engine := db.DBs[masterId]
//

if canalMsg.Type == md.CanalMsgInsertSqlType {
var data1 model.UserExtendTotal
date := time.Unix(utils.TimeStdParseUnix(canalMsg.Data[0].InviteTime), 0).Format("20060102")
month := time.Unix(utils.TimeStdParseUnix(canalMsg.Data[0].InviteTime), 0).Format("200601")
engine.Where("uid=? and date=?", canalMsg.Data[0].ParentUid, date).Get(&data1)
if data1.Id == 0 {
data1 = model.UserExtendTotal{
Uid: utils.StrToInt(canalMsg.Data[0].ParentUid),
Date: utils.StrToInt(date),
Month: utils.StrToInt(month),
Count: 0,
TeamCount: 0,
}
engine.Insert(&data1)
}
if utils.StrToInt(canalMsg.Data[0].Level) == 1 {
data1.Count++
} else {
data1.TeamCount++
}
engine.Where("id=?", data1.Id).AllCols().Update(&data1)
}

return nil
}

+ 38
- 69
consume/canal_user_virtual_coin_flow_consume.go View File

@@ -2,7 +2,6 @@ package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
@@ -10,14 +9,11 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/shopspring/decimal"
"github.com/streadway/amqp"
"strings"
"time"
)

func CanalUserVirtualCoinFlowConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>CanalUserVirtualCoinFlowConsume>>>>>>>>>>>>")
func CanalOneOrengeUserVirtualCoinFlowConsume(queue md.MqQueue) {
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
@@ -27,7 +23,7 @@ func CanalUserVirtualCoinFlowConsume(queue md.MqQueue) {
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
ch.Qos(1000)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
@@ -36,10 +32,10 @@ func CanalUserVirtualCoinFlowConsume(queue md.MqQueue) {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalUserVirtualCoinFlowConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleCanalUserVirtualCoinFlow(res.Body)
fmt.Println(">>>>>>>>>>>>>>>>CanalOneOrengeUserVirtualCoinFlowConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleCanalOneOrengeUserVirtualCoinFlow(res.Body)
if err != nil {
fmt.Println("handleCanalUserVirtualCoinFlow_ERR:::::", err.Error())
fmt.Println("CanalOneOrengeUserVirtualCoinFlowConsume_ERR:::::", err.Error())
}
//_ = res.Reject(false)
err = res.Ack(true)
@@ -51,7 +47,7 @@ func CanalUserVirtualCoinFlowConsume(queue md.MqQueue) {
fmt.Println("get msg done")
}

func handleCanalUserVirtualCoinFlow(msg []byte) error {
func handleCanalOneOrengeUserVirtualCoinFlow(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalUserVirtualCoinFlowOrderMessage[md.CanalUserVirtualCoinFlowOrder]
err := json.Unmarshal(msg, &canalMsg)
@@ -60,70 +56,43 @@ func handleCanalUserVirtualCoinFlow(msg []byte) error {
}

masterId := strings.Split(canalMsg.Database, "_")[1]
if masterId != "32053480" {
if masterId != "15763466" {
return nil
}
engine := db.DBs[masterId]
now := time.Now()

//2、查找 one_circles_green_energy_basic_setting 基础设置
userPublicPlatoonDoubleNetworkSetting, err := db.UserPublicPlatoonDoubleNetworkSettingGetOneByParams(engine, map[string]interface{}{
"key": "is_open",
"value": 1,
})
if err != nil {
return err
}
if userPublicPlatoonDoubleNetworkSetting == nil {
return errors.New("公排双网未开启")
}
if canalMsg.Type == md.CanalMsgInsertSqlType {
if canalMsg.Data[0].CoinId == utils.IntToStr(userPublicPlatoonDoubleNetworkSetting.CoinId) {
//3、查找 user_public_platoon_double_network_user_coin_record
userPublicPlatoonDoubleNetworkUserCoinRecord, err1 := db.UserPublicPlatoonDoubleNetworkUserCoinRecordGetOneByParams(engine, map[string]interface{}{
"key": "uid",
"value": canalMsg.Data[0].Uid,
})
if err1 != nil {
return err1
}
if userPublicPlatoonDoubleNetworkUserCoinRecord == nil {
userProfile, err2 := db.UserProfileFindByIDSess(engine.NewSession(), canalMsg.Data[0].Uid)
if userProfile == nil {
return errors.New("用户不存在")
}
if err2 != nil {
return err2
}
//新增记录
_, err3 := db.UserPublicPlatoonDoubleNetworkUserCoinRecordInsert(engine, &model.UserPublicPlatoonDoubleNetworkUserCoinRecord{
Uid: utils.StrToInt(canalMsg.Data[0].Uid),
LastAmount: canalMsg.Data[0].AfterAmout,
Amount: canalMsg.Data[0].AfterAmout,
RecommendUid: userProfile.ParentUid,
CoinId: utils.StrToInt(canalMsg.Data[0].CoinId),
CreateAt: now.Format("2006-01-02 15:04:05"),
UpdateAt: now.Format("2006-01-02 15:04:05"),
})
if err3 != nil {
return err3
}
} else {
//更新记录
afterAmount, _ := decimal.NewFromString(canalMsg.Data[0].AfterAmout)
amount, _ := decimal.NewFromString(userPublicPlatoonDoubleNetworkUserCoinRecord.Amount)
lastAmount, _ := decimal.NewFromString(userPublicPlatoonDoubleNetworkUserCoinRecord.LastAmount)
if canalMsg.Data[0].Direction == "1" || canalMsg.Data[0].Direction == "2" {
//收入 && 支出
userPublicPlatoonDoubleNetworkUserCoinRecord.Amount = amount.Add(afterAmount.Sub(lastAmount)).String()
}
userPublicPlatoonDoubleNetworkUserCoinRecord.LastAmount = canalMsg.Data[0].AfterAmout
_, err2 := db.UserPublicPlatoonDoubleNetworkUserCoinRecordUpdate(engine, userPublicPlatoonDoubleNetworkUserCoinRecord.Id, userPublicPlatoonDoubleNetworkUserCoinRecord, "amount", "last_amount")
if err2 != nil {
return err2
}
}
if canalMsg.Data[0].TransferType == "9" || canalMsg.Data[0].Direction != "1" || utils.StrToFloat64(canalMsg.Data[0].Amout) <= 0 {
//转赠不记录
return nil
}
sess := engine.NewSession()
defer sess.Close()
sess.Begin()
date := utils.TimeParseStd(canalMsg.Data[0].CreateTime).Format("20060102")
amountDate := db.GetCoinAmountDate(sess, canalMsg.Data[0].CoinId, date)
if amountDate == nil {
sess.Rollback()
return errors.New("失败")
}
amountDate.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(canalMsg.Data[0].Amout)+utils.StrToFloat64(amountDate.Amount), 8)
update, err := sess.Where("id=?", amountDate.Id).Cols("amount").Update(amountDate)
if update == 0 || err != nil {
sess.Rollback()
return errors.New("失败")
}

amountUser := db.GetCoinAmountDateForUse(sess, canalMsg.Data[0].CoinId, date, canalMsg.Data[0].Uid)
if amountUser == nil {
sess.Rollback()
return errors.New("失败")
}
amountUser.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(canalMsg.Data[0].Amout)+utils.StrToFloat64(amountUser.Amount), 8)
update, err = sess.Where("id=?", amountUser.Id).Cols("amount").Update(amountUser)
if update == 0 || err != nil {
sess.Rollback()
return errors.New("失败")
}
sess.Commit()
}

return nil


+ 51
- 39
consume/init.go View File

@@ -18,47 +18,47 @@ func Init() {
// 增加消费任务队列
func initConsumes() {
//
jobs[consumeMd.ZhiosIntegralProxyRechargeFunName] = ZhiosIntegralProxyRecharge
jobs[consumeMd.ZhiosUserUpLvFunName] = ZhiosUserUpLv
jobs[consumeMd.CanalGuideOrderByUserUpLvConsume] = CanalGuideOrderByUserUpLvConsume
jobs[consumeMd.ZhiosOrderFreeFunName] = ZhiosOrderFree
jobs[consumeMd.ZhiosOrderTotalFunName] = ZhiosOrderTotal
jobs[consumeMd.ZhiosOrderTotalSecondFunName] = ZhiosOrderTotalSecond
//jobs[consumeMd.ZhiosIntegralProxyRechargeFunName] = ZhiosIntegralProxyRecharge
//jobs[consumeMd.ZhiosUserUpLvFunName] = ZhiosUserUpLv
//jobs[consumeMd.CanalGuideOrderByUserUpLvConsume] = CanalGuideOrderByUserUpLvConsume
//jobs[consumeMd.ZhiosOrderFreeFunName] = ZhiosOrderFree
//jobs[consumeMd.ZhiosOrderTotalFunName] = ZhiosOrderTotal
//jobs[consumeMd.ZhiosOrderTotalSecondFunName] = ZhiosOrderTotalSecond
////
//jobs[consumeMd.ZhiosOrderSettleTotalFunName] = ZhiosSettleTotal
//jobs[consumeMd.ZhiosOrderHjyFunName] = ZhiosOrderHjy
//jobs[consumeMd.ZhiosOrderBuckleFunName] = ZhiosOrderBuckle
////
//jobs[consumeMd.ZhiosSupplierAfterOrderFunName] = ZhiosSupplierAfterOrder
//jobs[consumeMd.ZhiosGuideStoreOrderFunName] = ZhiosGuideStoreOrder
//
jobs[consumeMd.ZhiosOrderSettleTotalFunName] = ZhiosSettleTotal
jobs[consumeMd.ZhiosOrderHjyFunName] = ZhiosOrderHjy
jobs[consumeMd.ZhiosOrderBuckleFunName] = ZhiosOrderBuckle
//jobs[consumeMd.ZhiosAppreciationFunName] = ZhiosAppreciation
//jobs[consumeMd.ZhiosValidUserFunName] = ZhiosValidUser
//
jobs[consumeMd.ZhiosSupplierAfterOrderFunName] = ZhiosSupplierAfterOrder
jobs[consumeMd.ZhiosGuideStoreOrderFunName] = ZhiosGuideStoreOrder

jobs[consumeMd.ZhiosAppreciationFunName] = ZhiosAppreciation
jobs[consumeMd.ZhiosValidUserFunName] = ZhiosValidUser

jobs[consumeMd.ZhiosAcquisitionConditionFunName] = ZhiosAcquisitionCondition

jobs[consumeMd.DouShenUserRegisterConsumeForOfficialFunName] = DouShenUserRegisterConsumeForOfficial
jobs[consumeMd.DouShenUserRegisterConsumeForOperationCenterFunName] = DouShenUserRegisterConsumeForOperationCenter
jobs[consumeMd.DouShenUserRegisterConsumeForMyRecommenderFunName] = DouShenUserRegisterConsumeForMyRecommender
jobs[consumeMd.DouShenUserRegisterConsumeForMyFansFunName] = DouShenUserRegisterConsumeForMyFans
jobs[consumeMd.DouShenUserRegisterConsumeForUserRegisterUpLvFunName] = DouShenUserRegisterConsumeForUserRegisterUpLv

jobs[consumeMd.ZhiosFastReturnOrderPayFunName] = ZhiosFastReturnOrderPay
jobs[consumeMd.ZhiosFastReturnOrderSuccessFunName] = ZhiosFastReturnOrderSuccess
jobs[consumeMd.ZhiosFastReturnOrderRefundFunName] = ZhiosFastReturnOrderRefund
jobs[consumeMd.ZhiosFastReturnOrderRefundSecondFunName] = ZhiosFastReturnOrderRefundSecond

jobs[consumeMd.YoumishangExchangeStoreFunName] = YoumishangExchangeStore

jobs[consumeMd.ZhiosRechargeOrderFailFunName] = ZhiosRechargeOrderFail

jobs[consumeMd.CloudIssuanceAsyncMLoginFunName] = CloudIssuanceAsyncMLoginConsume
jobs[consumeMd.ZhiosTikTokUpdateFunName] = ZhiosTikTokUpdate
jobs[consumeMd.ZhiosTikTokAllUpdateFunName] = ZhiosTikTokAllUpdate

jobs[consumeMd.ZhiosCapitalPoolOrderTotalFunName] = ZhiosCapitalPoolOrderTotal
jobs[consumeMd.ZhiosExpressOrderFail] = ZhiosExpressOrderFail
jobs[consumeMd.ZhiosWithdrawReward] = ZhiosWithdrawReward
//jobs[consumeMd.ZhiosAcquisitionConditionFunName] = ZhiosAcquisitionCondition
//
//jobs[consumeMd.DouShenUserRegisterConsumeForOfficialFunName] = DouShenUserRegisterConsumeForOfficial
//jobs[consumeMd.DouShenUserRegisterConsumeForOperationCenterFunName] = DouShenUserRegisterConsumeForOperationCenter
//jobs[consumeMd.DouShenUserRegisterConsumeForMyRecommenderFunName] = DouShenUserRegisterConsumeForMyRecommender
//jobs[consumeMd.DouShenUserRegisterConsumeForMyFansFunName] = DouShenUserRegisterConsumeForMyFans
//jobs[consumeMd.DouShenUserRegisterConsumeForUserRegisterUpLvFunName] = DouShenUserRegisterConsumeForUserRegisterUpLv
//
//jobs[consumeMd.ZhiosFastReturnOrderPayFunName] = ZhiosFastReturnOrderPay
//jobs[consumeMd.ZhiosFastReturnOrderSuccessFunName] = ZhiosFastReturnOrderSuccess
//jobs[consumeMd.ZhiosFastReturnOrderRefundFunName] = ZhiosFastReturnOrderRefund
//jobs[consumeMd.ZhiosFastReturnOrderRefundSecondFunName] = ZhiosFastReturnOrderRefundSecond
//
//jobs[consumeMd.YoumishangExchangeStoreFunName] = YoumishangExchangeStore
//
//jobs[consumeMd.ZhiosRechargeOrderFailFunName] = ZhiosRechargeOrderFail
//
//jobs[consumeMd.CloudIssuanceAsyncMLoginFunName] = CloudIssuanceAsyncMLoginConsume
//jobs[consumeMd.ZhiosTikTokUpdateFunName] = ZhiosTikTokUpdate
//jobs[consumeMd.ZhiosTikTokAllUpdateFunName] = ZhiosTikTokAllUpdate
//
//jobs[consumeMd.ZhiosCapitalPoolOrderTotalFunName] = ZhiosCapitalPoolOrderTotal
//jobs[consumeMd.ZhiosExpressOrderFail] = ZhiosExpressOrderFail
//jobs[consumeMd.ZhiosWithdrawReward] = ZhiosWithdrawReward

//

@@ -86,6 +86,18 @@ func initConsumes() {
//jobs[consumeMd.WithdrawConsumeFunName] = WithdrawConsume

//jobs[consumeMd.ZhiosMallGreenCoinConsumeFunName] = ZhiosMallGreenCoinConsume //绿色双链积分

//一个橘子
jobs[consumeMd.CancalUserMoneyConsumeFunName] = CancalUserMoneyConsume //余额
jobs[consumeMd.CancalUserRelateConsumeFunName] = CancalUserRelateConsume //推荐人数
jobs[consumeMd.CancalUserIntegralExchangeConsumeFunName] = CancalUserIntegralExchange //兑换
jobs[consumeMd.ZhiosTaskRewardConsumeFunName] = ZhiosTaskRewardExchange //兑换
jobs[consumeMd.CanalOneOrengeUserVirtualCcoinFlowFunName] = CanalOneOrengeUserVirtualCoinFlowConsume
jobs[consumeMd.ZhiosTaskVideoRewardConsumeFunName] = ZhiosTaskVideoRewardExchange //视频分佣
jobs[consumeMd.ZhiosNewVideoRewardConsumeFunName] = ZhiosNewVideoRewardExchange //短视频奖励
jobs[consumeMd.ZhiosRelateRewardConsumeFunName] = ZhiosRelateRewardExchange //分佣结算
jobs[consumeMd.ZhiosOwnNewVideoRewardConsumeFunName] = ZhiosOwnNewVideoRewardExchange //短视频奖励

}

func Run() {


+ 91
- 0
consume/md/consume_key.go View File

@@ -398,6 +398,15 @@ var RabbitMqQueueKeyList = []*MqQueue{
BindKey: "",
ConsumeFunName: "CanalUserVirtualCoinFlowConsume",
},
{
ExchangeName: "canal.topic",
Name: "canal_user_virtual_coin_flow_15763466",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "canal_user_virtual_coin_flow_15763466",
BindKey: "",
ConsumeFunName: "CanalOneOrengeUserVirtualCoinFlowConsume",
},
{
ExchangeName: "one.circles",
Name: "one_circles_sign_in_green_energy",
@@ -434,6 +443,78 @@ var RabbitMqQueueKeyList = []*MqQueue{
BindKey: "",
ConsumeFunName: "WithdrawConsume",
},
{
ExchangeName: "zhios.one.orenge.exchange",
Name: "zhios_one_orenge_exchange",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "integral_exchange",
BindKey: "",
ConsumeFunName: "CancalUserIntegralExchange",
},
{
ExchangeName: "zhios.one_orenge_task_reward.exchange",
Name: "zhios_one_orenge_task_reward",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "task_reward",
BindKey: "",
ConsumeFunName: "ZhiosTaskRewardExchange",
},
{
ExchangeName: "zhios.relate_reward.exchange",
Name: "zhios_relate_reward",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "relate_reward",
BindKey: "",
ConsumeFunName: "ZhiosRelateRewardExchange",
},
{
ExchangeName: "zhios.task_video_reward.exchange",
Name: "zhios_task_video_reward",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "task_video_reward",
BindKey: "",
ConsumeFunName: "ZhiosTaskVideoRewardExchange",
},
{
ExchangeName: "zhios.new_video_reward.exchange",
Name: "zhios_new_video_reward",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "new_video_reward",
BindKey: "",
ConsumeFunName: "ZhiosNewVideoRewardExchange",
},
{
ExchangeName: "zhios.new_video_reward.exchange",
Name: "zhios_own_new_video_reward",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "own_new_video_reward",
BindKey: "",
ConsumeFunName: "ZhiosOwnNewVideoRewardExchange",
},
{
ExchangeName: "canal.topic", //
Name: "canal_fin_user_flow",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "canal_fin_user_flow",
BindKey: "",
ConsumeFunName: "CancalUserMoneyConsume",
},
{
ExchangeName: "canal.topic", //
Name: "canal_user_relate",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "canal_user_relate",
BindKey: "",
ConsumeFunName: "CancalUserRelateConsume",
},
}

const (
@@ -485,4 +566,14 @@ const (
OneCirclesStartLevelDividendFunName = "OneCirclesStartLevelDividendConsume"
OneCirclesSignInCopyGreenEnergyFunName = "OneCirclesSignInCopyGreenEnergyConsume"
WithdrawConsumeFunName = "WithdrawConsume"

CancalUserMoneyConsumeFunName = "CancalUserMoneyConsume"
CancalUserRelateConsumeFunName = "CancalUserRelateConsume"
CancalUserIntegralExchangeConsumeFunName = "CancalUserIntegralExchange"
ZhiosTaskRewardConsumeFunName = "ZhiosTaskRewardExchange"
ZhiosRelateRewardConsumeFunName = "ZhiosRelateRewardExchange"
ZhiosTaskVideoRewardConsumeFunName = "ZhiosTaskVideoRewardExchange"
ZhiosNewVideoRewardConsumeFunName = "ZhiosNewVideoRewardExchange"
ZhiosOwnNewVideoRewardConsumeFunName = "ZhiosOwnNewVideoRewardExchange"
CanalOneOrengeUserVirtualCcoinFlowFunName = "CanalOneOrengeUserVirtualCoinFlowConsume"
)

+ 17
- 1
consume/md/md.go View File

@@ -7,7 +7,23 @@ type ZhiosAcquisition struct {
Mid string `json:"mid"`
Id string `json:"id"`
}

type ZhiosTaskReward struct {
CoinId string `json:"coin_id"`
Money string `json:"money"`
Uid string `json:"uid"`
Mid string `json:"mid"`
Reward string `json:"reward"`
CoinIdType string `json:"coin_id_type"`
Mode string `json:"mode"`
Title string `json:"title"`
DeviceModel string `json:"device_model"`
Oid string `json:"oid"`
RewardType string `json:"reward_type"`
PlanType string `json:"plan_type"`
Provider string `json:"provider"`
PvdOid string `json:"pvd_oid"`
IsTeam string `json:"is_team"`
}
type AcquisitionCfg struct {
Id string `json:"id"`
Status string `json:"status"`


+ 39
- 0
consume/md/md_canal_user_money.go View File

@@ -0,0 +1,39 @@
package md

type CanalUserMoney struct {
Id string `json:"id" xorm:"pk autoincr comment('流水编号') BIGINT(20)"`
Uid string `json:"uid" xorm:"not null default 0 comment('用户id') INT(11)"`
Type string `json:"type" xorm:"not null default 0 comment('0收入,1支出') TINYINT(1)"`
Amount string `json:"amount" xorm:"not null default 0.0000 comment('变动金额') DECIMAL(11,4)"`
BeforeAmount string `json:"before_amount" xorm:"not null default 0.0000 comment('变动前金额') DECIMAL(11,4)"`
AfterAmount string `json:"after_amount" xorm:"not null default 0.0000 comment('变动后金额') DECIMAL(11,4)"`
SysFee string `json:"sys_fee" xorm:"not null default 0.0000 comment('手续费') DECIMAL(11,4)"`
PaymentType string `json:"payment_type" xorm:"not null default 1 comment('1支付宝,2微信.3手动转账') TINYINT(1)"`
OrdType string `json:"ord_type" xorm:"not null default '' comment('订单类型taobao,jd,pdd,vip,suning,kaola,own自营,withdraw提现') VARCHAR(20)"`
OrdId string `json:"ord_id" xorm:"not null default '' comment('对应订单编号') VARCHAR(50)"`
OrdTitle string `json:"ord_title" xorm:"not null default '' comment('订单标题') VARCHAR(50)"`
OrdAction string `json:"ord_action" xorm:"not null default 0 comment('10自购,11推广,12团队,20提现,21消费') TINYINT(2)"`
OrdTime string `json:"ord_time" xorm:"not null default 0 comment('下单时间or提现时间') INT(11)"`
OrdDetail string `json:"ord_detail" xorm:"not null default '' comment('记录商品ID或提现账号') VARCHAR(50)"`
ExpectedTime string `json:"expected_time" xorm:"not null default '0' comment('预期到账时间,字符串用于直接显示,结算后清除内容') VARCHAR(30)"`
State string `json:"state" xorm:"not null default 1 comment('1未到账,2已到账') TINYINT(1)"`
Memo string `json:"memo" xorm:"not null default '' comment('备注') VARCHAR(2000)"`
OtherId string `json:"other_id" xorm:"not null default 0 comment('其他关联订单,具体根据订单类型判断') BIGINT(20)"`
AliOrdId string `json:"ali_ord_id" xorm:"default '' comment('支付宝订单号') VARCHAR(128)"`
CreateAt string `json:"create_at" xorm:"created not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"`
UpdateAt string `json:"update_at" xorm:"updated not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
}

//
type CanalUserMoneyMessage[T any] struct {
Data []T `json:"data"`
Database string `json:"database"`
ES int64 `json:"es"`
ID int64 `json:"id"`
IsDdl bool `json:"isDdl"`
Old []T `json:"old"`
PkNames []string `json:"pkNames"`
Table string `json:"table"`
TS int64 `json:"ts"`
Type string `json:"type"`
}

+ 23
- 0
consume/md/md_canal_user_relate.go View File

@@ -0,0 +1,23 @@
package md

type CanalUserRelate struct {
Id string `json:"id" xorm:"pk autoincr comment('主键') BIGINT(10)"`
ParentUid string `json:"parent_uid" xorm:"not null default 0 comment('上级会员ID') unique(idx_union_u_p_id) INT(20)"`
Uid string `json:"uid" xorm:"not null default 0 comment('关联UserID') unique(idx_union_u_p_id) INT(20)"`
Level string `json:"level" xorm:"not null default 1 comment('推广等级(1直属,大于1非直属)') INT(10)"`
InviteTime string `json:"invite_time" xorm:"not null default CURRENT_TIMESTAMP comment('邀请时间') TIMESTAMP"`
}

//
type CanalUserRelateMessage[T any] struct {
Data []T `json:"data"`
Database string `json:"database"`
ES int64 `json:"es"`
ID int64 `json:"id"`
IsDdl bool `json:"isDdl"`
Old []T `json:"old"`
PkNames []string `json:"pkNames"`
Table string `json:"table"`
TS int64 `json:"ts"`
Type string `json:"type"`
}

+ 2
- 3
consume/one_circles_sign_in_consume.go View File

@@ -2,7 +2,6 @@ package consume

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
@@ -56,8 +55,8 @@ func handleOneCirclesSignInGreenEnergy(msgData []byte) error {
return err
}

engine := db.DBs[msg.MasterId]
err = one_circles.HandleSettlementSignInGreenEnergy(engine, msg.MasterId, msg.Id, msg.Uid)
//engine := db.DBs[msg.MasterId]
//err = one_circles.HandleSettlementSignInGreenEnergy(engine, msg.MasterId, msg.Id, msg.Uid)
fmt.Println("err::::", err)
if err != nil {
return err


+ 2
- 3
consume/one_circles_sign_in_copy_consume.go View File

@@ -2,7 +2,6 @@ package consume

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
@@ -56,8 +55,8 @@ func handleOneCirclesSignInCopyGreenEnergy(msgData []byte) error {
return err
}

engine := db.DBs[msg.MasterId]
err = one_circles.HandleSettlementSignInGreenEnergy(engine, msg.MasterId, msg.Id, msg.Uid)
//engine := db.DBs[msg.MasterId]
//err = one_circles.HandleSettlementSignInGreenEnergy(engine, msg.MasterId, msg.Id, msg.Uid)
fmt.Println("err::::", err)
if err != nil {
return err


+ 113
- 0
consume/zhios_new_video_reward_exchange.go View File

@@ -0,0 +1,113 @@
package consume

import (
"applet/app/db"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
md3 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

//
func ZhiosNewVideoRewardExchange(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(20)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>ZhiosNewVideoRewardExchange<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosNewVideoRewardExchange(res.Body)
if err != nil {
fmt.Println(err)
fmt.Println("ZhiosOwnNewVideoRewardExchange_ERR:::::", err.Error())
_ = res.Reject(false)
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.ZhiosTaskReward
json.Unmarshal(res.Body, &msg)
ch.Publish(queue.ExchangeName, msg, queue.RoutKey)
//TODO::推一份到异常备份队列
ch.Publish(queue.ExchangeName, msg, "new_video_reward_abnormal")
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosNewVideoRewardExchange(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosTaskReward
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
amount := canalMsg.Money
//奖励
oid := canalMsg.Oid
uid := canalMsg.Uid
if canalMsg.IsTeam != "1" {
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
_, err = svc.ExchangeUserVirFinValidAndInterFlowWithSession(sess,
utils.StrToFloat64(amount), "看视频奖励", "0", 1, 170, utils.StrToInt(uid), utils.StrToInt(canalMsg.CoinId), 0, utils.StrToInt64(oid), "", 0, 0)
if err != nil {
sess.Rollback()
return err
}
sess.Commit()
}
if canalMsg.Mode != "" {
//计算佣金
var CommissionParam md3.CommissionFirstParam
CommissionParam.CommissionParam.Commission = canalMsg.Reward
CommissionParam.Uid = uid
CommissionParam.Provider = canalMsg.PlanType
title := canalMsg.Title
var mapData = map[string]string{
"coin_id_type": canalMsg.CoinIdType,
"mode": canalMsg.Mode,
"title": title,
"device_model": canalMsg.DeviceModel,
"reward_type": canalMsg.RewardType,
}
svc.GetLvUser(eg, CommissionParam, utils.StrToInt64(canalMsg.Oid), mid, mapData)
}

return nil
}

+ 95
- 0
consume/zhios_own_new_video_reward_exchange.go View File

@@ -0,0 +1,95 @@
package consume

import (
"applet/app/db"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

//
func ZhiosOwnNewVideoRewardExchange(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>ZhiosOwnNewVideoRewardExchange<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosOwnNewVideoRewardExchange(res.Body)
if err != nil {
fmt.Println(err)
fmt.Println("ZhiosOwnNewVideoRewardExchange_ERR:::::", err.Error())
_ = res.Reject(false)
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.ZhiosTaskReward
json.Unmarshal(res.Body, &msg)
ch.Publish(queue.ExchangeName, msg, queue.RoutKey)
//TODO::推一份到异常备份队列
ch.Publish(queue.ExchangeName, msg, "own_new_video_reward_abnormal")
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosOwnNewVideoRewardExchange(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosTaskReward
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
amount := canalMsg.Money
//奖励
oid := canalMsg.Oid
uid := canalMsg.Uid
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
_, err = svc.ExchangeUserVirFinValidAndInterFlowWithSession(sess,
utils.StrToFloat64(amount), "看视频奖励", "0", 1, 170, utils.StrToInt(uid), utils.StrToInt(canalMsg.CoinId), 0, utils.StrToInt64(oid), "", 0, 0)
if err != nil {
sess.Rollback()
return err
}
sess.Commit()

return nil
}

+ 100
- 0
consume/zhios_relate_reward_exchange.go View File

@@ -0,0 +1,100 @@
package consume

import (
"applet/app/db"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
md3 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
svc2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

//
func ZhiosRelateRewardExchange(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosRelateRewardExchange(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosRelateRewardExchange(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosTaskReward
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
uid := canalMsg.Uid
//计算佣金
var CommissionParam md3.CommissionFirstParam
CommissionParam.CommissionParam.Commission = canalMsg.Reward
CommissionParam.CommissionParam.GoodsPrice = canalMsg.Money
CommissionParam.Uid = uid
CommissionParam.Provider = canalMsg.Provider

plans, commission, virtualCoinMoneyRate := svc2.GetAllPlan(eg, mid)
cfgs, err := svc2.GetPlanCfg(eg, canalMsg.Provider, mid, plans, commission, virtualCoinMoneyRate, &CommissionParam.CommissionParam)
if err != nil || cfgs == nil {
return nil
}
title := canalMsg.Title
var mapData = map[string]string{
"coin_id_type": canalMsg.CoinIdType,
"mode": cfgs.Mode,
"uid": uid,
"pvd": canalMsg.Provider,
"commission": canalMsg.Reward,
"global_rate": utils.Float64ToStr(cfgs.GlobalRate),
"price": canalMsg.Money,
"title": title,
"device_model": canalMsg.DeviceModel,
"reward_type": canalMsg.RewardType,
"pvd_oid": canalMsg.PvdOid,
}
svc.CommGetLvUser(eg, CommissionParam, utils.StrToInt64(canalMsg.Oid), mid, mapData)
return nil
}

+ 89
- 0
consume/zhios_task_reward_exchange.go View File

@@ -0,0 +1,89 @@
package consume

import (
"applet/app/db"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
md3 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

//
func ZhiosTaskRewardExchange(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosTaskRewardExchange(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosTaskRewardExchange(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosTaskReward
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
uid := canalMsg.Uid
//计算佣金
var CommissionParam md3.CommissionFirstParam
CommissionParam.CommissionParam.Commission = canalMsg.Reward
CommissionParam.Uid = uid
CommissionParam.Provider = "task_center"
if canalMsg.RewardType == "2" {
CommissionParam.Provider = "task_reward_new"
}
title := canalMsg.Title
var mapData = map[string]string{
"coin_id_type": canalMsg.CoinIdType,
"mode": canalMsg.Mode,
"title": title,
"device_model": canalMsg.DeviceModel,
"reward_type": canalMsg.RewardType,
}
svc.GetLvUser(eg, CommissionParam, utils.StrToInt64(canalMsg.Oid), mid, mapData)
return nil
}

+ 86
- 0
consume/zhios_task_video_reward_exchange.go View File

@@ -0,0 +1,86 @@
package consume

import (
"applet/app/db"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
md3 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

//
func ZhiosTaskVideoRewardExchange(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosVideoTaskVideoRewardExchange(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosVideoTaskVideoRewardExchange(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosTaskReward
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
uid := canalMsg.Uid
//计算佣金
var CommissionParam md3.CommissionFirstParam
CommissionParam.CommissionParam.Commission = canalMsg.Reward
CommissionParam.Uid = uid
CommissionParam.Provider = canalMsg.PlanType
title := canalMsg.Title
var mapData = map[string]string{
"coin_id_type": canalMsg.CoinIdType,
"mode": canalMsg.Mode,
"title": title,
"device_model": canalMsg.DeviceModel,
"reward_type": canalMsg.RewardType,
}
svc.GetLvUser(eg, CommissionParam, utils.StrToInt64(canalMsg.Oid), mid, mapData)
return nil
}

+ 142
- 0
consume/zhios_user_integral_exchange.go View File

@@ -0,0 +1,142 @@
package consume

import (
"applet/app/db"
"applet/app/e"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
db2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"xorm.io/xorm"
)

//
func CancalUserIntegralExchange(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleCancalUserIntegralExchange(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
_ = res.Ack(true)

} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleCancalUserIntegralExchange(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosAcquisition
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
uid := canalMsg.Uid
base, _ := db.TaskCenterBase(eg)
if base == nil {
return nil
}
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
amount, _ := db.UserVirtualAmountFindById(sess, utils.StrToInt(uid), base.CoinId)
if amount != nil && utils.StrToFloat64(amount.Amount) > 0 {
err := CoinExchange(eg, sess, utils.StrToInt(uid), utils.IntToStr(base.CoinId), "cny", amount.Amount, mid)
if err != nil {
sess.Rollback()
return nil
}
}
sess.Commit()
return nil
}
func CoinExchange(eg *xorm.Engine, sess *xorm.Session, uid int, coinId, coinIdTo, amount, masterId string) error {
//虚拟币转换
//获取目前可以兑换的虚拟币
coinMapInUse, err := db.VirtualCoinMapInUseSess(sess, masterId, "")
if err != nil {
return nil
}
fromCoin, ok := coinMapInUse[coinId]
toCoin, ok2 := coinMapInUse[coinIdTo]
//判断兑换的虚拟币是否可以兑换
if !ok || (!ok2 && coinIdTo != "cny") {
return nil
}
//被兑换虚拟币金额比例,兑换虚拟币金额比例,手续费比例
var (
fromRate, toRate float64
)
//获取用户两个虚拟币的余额数据
fromWallet, err := db2.GetUserVirtualWalletWithSession(sess, uid, utils.StrToInt(coinId))
if err != nil {
return nil
}
amount = fromWallet.Amount
fromRate = utils.AnyToFloat64(fromCoin.ExchangeRatio)
toRate = utils.AnyToFloat64(toCoin.ExchangeRatio)
if coinIdTo == "cny" {
toRate = 1
}
//兑换比例
rate := fromRate / toRate
//计算兑换的总值
toValue := utils.AnyToFloat64(amount) / rate
toAmount := toValue
//先扣
title := coinMapInUse[coinId].Name + "兑换" + coinMapInUse[coinIdTo].Name

_, err = svc.ExchangeUserVirFinValidAndInterFlowWithSession(sess,
utils.StrToFloat64(amount), title, "0", 2, 5, uid, utils.StrToInt(coinId), utils.StrToInt(coinIdTo), -1, "", 0, 0)

if err != nil {
return e.NewErrCode(e.ERR_BAD_REQUEST)
}
//再给
err = svc.UpdateUserFinValidAndInterFlowWithSession(sess,
utils.Float64ToStr(toAmount), title, "money_exchange", 0, 35, uid, 0, utils.StrToInt64(coinId), 0)
if err != nil {
return err

}
return nil
}

+ 30
- 22
go.mod View File

@@ -5,8 +5,8 @@ go 1.18
require (
code.fnuoos.com/go_rely_warehouse/zyos_go_condition_statistics.git v1.1.2-0.20240222023917-c31b53f7e8cb
code.fnuoos.com/go_rely_warehouse/zyos_go_es.git v1.0.0
code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git v0.0.4
code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git v1.9.10-0.20240315113731-a22c0fb96812
code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git v0.0.5
code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git v1.9.10-0.20240722064401-49d2884770db
code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git v1.6.2-0.20231116085701-9ba6e19f877b
code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20240126015516-38ca248db2fd
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5
@@ -17,15 +17,15 @@ require (
github.com/dchest/uniuri v0.0.0-20200228104902-7aecb25e1fe5
github.com/forgoer/openssl v1.2.1
github.com/gin-contrib/sessions v0.0.3
github.com/gin-gonic/gin v1.8.0
github.com/go-playground/locales v0.14.0
github.com/go-playground/universal-translator v0.18.0
github.com/go-playground/validator/v10 v10.10.0
github.com/gin-gonic/gin v1.9.1
github.com/go-playground/locales v0.14.1
github.com/go-playground/universal-translator v0.18.1
github.com/go-playground/validator/v10 v10.14.0
github.com/go-redis/redis v6.15.9+incompatible
github.com/go-sql-driver/mysql v1.6.0
github.com/go-sql-driver/mysql v1.8.1
github.com/gomodule/redigo v2.0.0+incompatible
github.com/iGoogle-ink/gopay v1.5.36
github.com/jinzhu/copier v0.3.5
github.com/jinzhu/copier v0.4.0
github.com/json-iterator/go v1.1.12
github.com/makiuchi-d/gozxing v0.1.1
github.com/mingrammer/commonregex v1.0.1
@@ -34,59 +34,67 @@ require (
github.com/sony/sonyflake v1.0.0
github.com/streadway/amqp v1.0.0
github.com/swaggo/swag v1.7.0
github.com/syyongx/php2go v0.9.7
github.com/syyongx/php2go v0.9.8
github.com/tidwall/gjson v1.14.1
go.uber.org/zap v1.16.0
google.golang.org/grpc v1.32.0
google.golang.org/protobuf v1.28.0
gopkg.in/natefinch/lumberjack.v2 v2.0.0
google.golang.org/protobuf v1.30.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/yaml.v2 v2.4.0
xorm.io/xorm v1.3.2
)

require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/bitly/go-simplejson v0.5.0 // indirect
github.com/bytedance/sonic v1.9.1 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.5 // indirect
github.com/go-openapi/spec v0.20.3 // indirect
github.com/go-openapi/swag v0.19.15 // indirect
github.com/goccy/go-json v0.9.7 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/gorilla/context v1.1.1 // indirect
github.com/gorilla/securecookie v1.1.1 // indirect
github.com/gorilla/sessions v1.2.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mvdan/xurls v1.1.0 // indirect
github.com/nilorg/sdk v0.0.0-20221104025912-4b6ccb7004d8 // indirect
github.com/olivere/elastic/v7 v7.0.32 // indirect
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/rakyll/statik v0.1.7 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/ugorji/go/codec v1.2.7 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.9.0 // indirect
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
golang.org/x/net v0.0.0-20221004154528-8021a29435af // indirect
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/tools v0.1.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
golang.org/x/tools v0.6.0 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
honnef.co/go/tools v0.0.1-2020.1.4 // indirect
xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 // indirect
)

Loading…
Cancel
Save