diff --git a/app/db/model/lucky_draw_rotary_table_setting.go b/app/db/model/lucky_draw_rotary_table_setting.go new file mode 100644 index 0000000..d2ce2a2 --- /dev/null +++ b/app/db/model/lucky_draw_rotary_table_setting.go @@ -0,0 +1,88 @@ +package model + +import ( + "time" + "xorm.io/xorm" +) + +type LuckyDrawRotaryTableSetting struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + IsOpen int `json:"is_open" xorm:"not null default 0 comment('0关1开') TINYINT(1)"` + StartTime time.Time `json:"start_time" xorm:"comment('活动开始时间') DATETIME"` + EndTime time.Time `json:"end_time" xorm:"comment('活动结束时间') DATETIME"` + Condition string `json:"condition" xorm:"comment('抽奖条件') TEXT"` + ChanceCondition string `json:"chance_condition" xorm:"comment('获得抽奖机会条件') TEXT"` + ChanceRule string `json:"chance_rule" xorm:"comment('获得抽奖机会条件') TEXT"` + AdBroadcast int `json:"ad_broadcast" xorm:"not null default 0 comment('广告轮播:0关闭1开启') TINYINT(1)"` + AdBroadcastType int `json:"ad_broadcast_type" xorm:"not null default 0 comment('广告轮播数据:1仅真实数据2仅虚拟数据3两者读取') TINYINT(1)"` + DrawTimesLimit int `json:"draw_times_limit" xorm:"not null default 0 comment('总抽奖机会次数限制,0不限制1限制') TINYINT(1)"` + DrawTimes int `json:"draw_times" xorm:"not null default 0 comment('每人最多多少次抽奖次数') INT(11)"` + DrawTimesByDay int `json:"draw_times_by_day" xorm:"not null default 0 comment('每人每日最多抽奖次数') INT(11)"` + BingoTimes int `json:"bingo_times" xorm:"not null default 0 comment('每人最多中奖数') INT(11)"` + BingoTimesByDay int `json:"bingo_times_by_day" xorm:"not null comment('每人每日最多中奖数') INT(11)"` + MaxAwardNum int `json:"max_award_num" xorm:"not null default 8 comment('最多可以设置多少个奖品') INT(11)"` + CreateTime time.Time `json:"create_time" xorm:"created not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` + UpdateTime time.Time `json:"update_time" xorm:"updated not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` + Pvd int `json:"pvd" xorm:"not null default 1 comment('基数来源(1当前活动抽奖积分;2订单)') TINYINT(1)"` + IsAutoIssueReward int `json:"is_auto_issue_reward" xorm:"not null default 1 comment('自动发放奖励,0否1是') TINYINT(1)"` + BingoTimesByDayLimit int `json:"bingo_times_by_day_limit" xorm:"not null default 0 comment('每天中奖奖机会次数限制,0不限制1限制') TINYINT(1)"` +} + +func (setting *LuckyDrawRotaryTableSetting) init(engine *xorm.Engine) error { + setting.Condition = "[]" + setting.ChanceCondition = "[]" + setting.AdBroadcastType = 1 + setting.BingoTimesByDay = 0 + setting.Pvd = 1 + setting.IsAutoIssueReward = 1 + setting.MaxAwardNum = 8 + _, err := engine.Insert(setting) + return err +} + +// Get +// @Description: 此方法会获取到一条唯一的基础设置信息,如果数据库没有会初始化生成一条信息 +// @receiver setting +// @param engine +// @return error +func (setting *LuckyDrawRotaryTableSetting) Get(engine *xorm.Engine) error { + exist, err := engine.IsTableExist(setting) + if err != nil { + return err + } + if !exist { + if err := engine.CreateTables(setting); err != nil { + return err + } + } + if err != nil { + return err + } + get, err := engine.Get(setting) + if err != nil { + return err + } + if !get { + err := setting.init(engine) + if err != nil { + return err + } + } + return nil +} + +func (setting *LuckyDrawRotaryTableSetting) Update(engine *xorm.Engine, cols []string) error { + if len(cols) == 0 { + _, err := engine.ID(setting.Id).AllCols().Update(setting) + if err != nil { + return err + } + return nil + } else { + _, err := engine.ID(setting.Id).Cols(cols...).Update(setting) + if err != nil { + return err + } + return nil + } +} diff --git a/app/db/model/lucky_draw_rotary_table_user_chance.go b/app/db/model/lucky_draw_rotary_table_user_chance.go new file mode 100644 index 0000000..8fd50bf --- /dev/null +++ b/app/db/model/lucky_draw_rotary_table_user_chance.go @@ -0,0 +1,19 @@ +package model + +import ( + "time" +) + +type LuckyDrawRotaryTableUserChance struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"not null INT(11)"` + Title string `json:"title" xorm:"not null comment('描述') VARCHAR(255)"` + Pvd int `json:"pvd" xorm:"not null default 1 comment('来源:(1虚拟货币购买2订单购买3下单任务获取4分享任务获取)') INT(11)"` + State int `json:"state" xorm:"not null default 1 comment('状态:1未消耗2已消耗') INT(11)"` + OrdId int64 `json:"ord_id" xorm:"comment('订单id') BIGINT(22)"` + OrdAmount string `json:"ord_amount" xorm:"not null default 0.0000 comment('订单金额') DECIMAL(12,4)"` + CoinId int `json:"coin_id" xorm:"comment('虚拟币id') INT(11)"` + CoinAmount string `json:"coin_amount" xorm:"not null default 0.0000 comment('消耗的虚拟币数量') DECIMAL(12,4)"` + CreateTime time.Time `json:"create_time" xorm:"created not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` + UpdateTime time.Time `json:"update_time" xorm:"updated not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` +} diff --git a/app/db/model/user_invite_num.go b/app/db/model/user_invite_num.go new file mode 100644 index 0000000..0687766 --- /dev/null +++ b/app/db/model/user_invite_num.go @@ -0,0 +1,7 @@ +package model + +type UserInviteNum struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"default 0 INT(11)"` + Num int `json:"num" xorm:"default 0 INT(11)"` +} diff --git a/consume/init.go b/consume/init.go index 3c1f5f2..c667b6c 100644 --- a/consume/init.go +++ b/consume/init.go @@ -19,6 +19,8 @@ func Init() { func initConsumes() { //jobs[consumeMd.ZhiosGuideStoreOrderFunName] = ZhiosGuideStoreOrder + jobs[consumeMd.ZhiosUserRegGiveFunName] = ZhiosUserRegGive + jobs[consumeMd.ZhiosIntegralProxyRechargeFunName] = ZhiosIntegralProxyRecharge jobs[consumeMd.ZhiosUserUpLvFunName] = ZhiosUserUpLv jobs[consumeMd.CanalGuideOrderByUserUpLvConsume] = CanalGuideOrderByUserUpLvConsume diff --git a/consume/md/consume_key.go b/consume/md/consume_key.go index f1c48fb..2812a9c 100644 --- a/consume/md/consume_key.go +++ b/consume/md/consume_key.go @@ -470,6 +470,15 @@ var RabbitMqQueueKeyList = []*MqQueue{ BindKey: "", ConsumeFunName: "ZhiosUserUpLv", }, + { + ExchangeName: "zhios.user_reg_give.exchange", + Name: "zhios_user_reg_give", + Type: DirectQueueType, + IsPersistent: false, + RoutKey: "user_reg_give", + BindKey: "", + ConsumeFunName: "ZhiosUserRegGive", + }, { ExchangeName: "zhios.integral_proxy_recharge.exchange", Name: "zhios_integral_proxy_recharge", @@ -658,6 +667,7 @@ const ( ZhiosMallGreenCoinConsumeFunName = "ZhiosMallGreenCoinConsume" ZhiosOneCirclesCoinConsumeFunName = "ZhiosOneCirclesCoinConsume" ZhiosUserUpLvFunName = "ZhiosUserUpLv" + ZhiosUserRegGiveFunName = "ZhiosUserRegGive" CanalGuideOrderByUserUpLvConsume = "CanalGuideOrderByUserUpLvConsume" ZhiosOrderFreeFunName = "ZhiosOrderFree" ZhiosOrderSettleTotalFunName = "ZhiosOrderSettleTotal" diff --git a/consume/md/md.go b/consume/md/md.go index 7af48c8..3abe298 100644 --- a/consume/md/md.go +++ b/consume/md/md.go @@ -2,6 +2,11 @@ package md import "applet/app/db/model" +type ChanceRule struct { + NewUserIsOpen string `json:"new_user_is_open"` + NewUserCount string `json:"new_user_count"` + NewUserNum string `json:"new_user_num"` +} type ZhiosAcquisition struct { Uid string `json:"uid"` Mid string `json:"mid"` diff --git a/consume/zhios_user_reg_give.go b/consume/zhios_user_reg_give.go new file mode 100644 index 0000000..ad9ddd0 --- /dev/null +++ b/consume/zhios_user_reg_give.go @@ -0,0 +1,136 @@ +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" + "time" +) + +//自动升级 +func ZhiosUserRegGive(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(1000) + 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 = handleZhiosUserRegGive(res.Body) + //_ = res.Reject(false) + fmt.Println(err) + _ = res.Ack(true) + } else { + panic(errors.New("error getting message")) + } + } + fmt.Println("get msg done") +} + +func handleZhiosUserRegGive(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 + } + var setting model.LuckyDrawRotaryTableSetting + get, _ := eg.Get(&setting) + if get == false { + return nil + } + chanceRule := md.ChanceRule{} + json.Unmarshal([]byte(setting.ChanceRule), &chanceRule) + if chanceRule.NewUserIsOpen != "1" || utils.StrToInt(chanceRule.NewUserCount) == 0 { + return nil + } + profile, _ := db.UserProfileFindByID(eg, canalMsg.Uid) + if profile == nil { + return nil + } + if profile.ParentUid == 0 { + return nil + } + canalMsg.Uid = utils.IntToStr(profile.ParentUid) + sess := eg.NewSession() + defer sess.Close() + sess.Begin() + var numData model.UserInviteNum + b, _ := sess.Where("uid=?", canalMsg.Uid).Get(&numData) + isNew := 0 + if b == false { + isNew = 1 + numData = model.UserInviteNum{ + Uid: utils.StrToInt(canalMsg.Uid), + } + insert, _ := sess.Insert(&numData) + if insert == 0 { + sess.Rollback() + return errors.New("失败") + } + } + numData.Num++ + num := 0 + if numData.Num >= utils.StrToInt(chanceRule.NewUserCount) { + num = numData.Num / utils.StrToInt(chanceRule.NewUserCount) + numData.Num -= utils.StrToInt(chanceRule.NewUserCount) * num + } + if num > 0 && utils.StrToInt(chanceRule.NewUserNum) > 0 { + update, err := sess.Where("id=?", numData.Id).Cols("num").Update(&numData) + fmt.Println(err) + if update == 0 && isNew == 0 { + sess.Rollback() + return errors.New("失败") + } + for i := 0; i < num*utils.StrToInt(chanceRule.NewUserNum); i++ { + var tmp = model.LuckyDrawRotaryTableUserChance{ + Uid: utils.StrToInt(canalMsg.Uid), + Title: "邀请好友赠送", + Pvd: 5, + State: 1, + CreateTime: time.Now(), + UpdateTime: time.Now(), + } + insert, _ := sess.Insert(&tmp) + if insert == 0 { + sess.Rollback() + return errors.New("失败") + } + } + } + sess.Commit() + return nil +}