package call import ( "fmt" "reflect" "server/common" "server/db" "server/pb" "server/util" "time" "github.com/liangdas/mqant/log" "gorm.io/gorm" ) func GetShareInfo(uid int) *common.ShareInfo { shareInfo := &common.ShareInfo{UID: uid} db.Mysql().Get(shareInfo) if shareInfo.ID <= 0 { info, _ := GetUserXInfo(uid, "channel_id") shareInfo.ChannelID = info.ChannelID shareInfo.Share = util.GetShareCode(uid) shareInfo.Time = time.Now().Unix() db.Mysql().Create(shareInfo) } return shareInfo } // 分享查询 func ShareBind(share string, isOld bool, uid, cid int) { // 绑定 if share == "" || isOld { return } now := time.Now().Unix() codeInfo := &common.ShareActivityCode{ShareCode: share} upInfo := &common.ShareInfo{} db.Mysql().Get(codeInfo) if codeInfo.Id > 0 { upInfo.UID = codeInfo.UID // 判断是否过期 if now < codeInfo.ExpireAt { util.Go(func() { SendShareReward(uid, codeInfo.ActivityId) }) } } else { // 一级 upInfo = &common.ShareInfo{Share: share} } db.Mysql().Get(upInfo) if upInfo.ID <= 0 { return } shareInfo := &common.ShareInfo{UID: uid, UP1: upInfo.UID, UP2: upInfo.UP1, UP3: upInfo.UP2, Time: time.Now().Unix(), ChannelID: cid, Share: util.GetShareCode(uid)} db.Mysql().Create(shareInfo) // 更新上级邀请玩家数 db.Mysql().Update(&common.ShareInfo{UID: upInfo.UID}, map[string]interface{}{"invites": gorm.Expr("invites + 1")}) } // 判断分享,发放有效用户奖励 func CheckShare(r *common.RechargeOrder) { reward := GetConfigShareSys().ShareReward if reward <= 0 { return } if r.Amount < GetConfigShareSys().ShareRecharge { return } share := GetShareInfo(r.UID) if share.UP1 == 0 { return } // 发放奖励 db.Mysql().Update(&common.ShareInfo{UID: share.UP1}, map[string]interface{}{ "invalid_invites": gorm.Expr("invalid_invites + 1"), "invite_reward": gorm.Expr("invite_reward + ?", reward), "available_reward": gorm.Expr("available_reward + ?", reward), }) } // 投注奖励结算 func ShareSettle(d *pb.InnerAfterSettle) { shareInfo := &common.ShareInfo{UID: int(d.UID)} db.Mysql().Get(shareInfo) if shareInfo.UP1 == 0 { return } db.Mysql().Update(&common.ShareInfo{UID: int(d.UID)}, map[string]interface{}{"bet": gorm.Expr("bet + ?", d.TotalBet)}) ref := reflect.ValueOf(shareInfo).Elem() // 循环查询上级 for i := 1; i <= 3; i++ { uid := int(ref.FieldByName(fmt.Sprintf("UP%d", i)).Int()) if uid == 0 { break } con := GetConfigShareByLevel(i) if con == nil { log.Error("unknown config share level:%v", i) continue } // 发奖 reward := d.TotalBet * con.Per / 1000 if reward <= 0 { continue } db.Mysql().Update(&common.ShareInfo{UID: uid}, map[string]interface{}{ "bet_reward": gorm.Expr("bet_reward + ?", reward), "available_reward": gorm.Expr("available_reward + ?", reward), }) } } func PackLevelSql(uid, level int) (sql string) { if level == 0 { sql = fmt.Sprintf("up1 = %d or up2 = %d or up3 = %d", uid, uid, uid) } else { sql = fmt.Sprintf("up%d = %d", level, uid) } return } // GetUserShares 查询玩家下级数量 func GetUserShares(uid, level int) int64 { return db.Mysql().Count(&common.ShareInfo{}, PackLevelSql(uid, level)) } // GetUserShareRecharges 查询玩家下级充值人数 func GetUserShareRecharges(uid, level int) (count int64) { sql := fmt.Sprintf(`SELECT count(*) as count from (SELECT uid from share_info WHERE %s)a INNER JOIN (SELECT uid from recharge_info WHERE total_recharge > 0)b on a.uid = b.uid`, PackLevelSql(uid, level)) err := db.Mysql().C().Raw(sql).Scan(&count).Error if err != nil { log.Error("err:%v", err) } return } // GetUserShareValidRecharges 查询玩家下级有效充值人数 func GetUserShareValidRecharges(uid, level int) (count int64) { sql := fmt.Sprintf(`SELECT count(*) as count from (SELECT uid from share_info WHERE %s)a INNER JOIN (SELECT uid from recharge_info WHERE total_recharge >= %d)b on a.uid = b.uid`, PackLevelSql(uid, level), GetConfigShareSys().ShareRecharge) err := db.Mysql().C().Raw(sql).Scan(&count).Error if err != nil { log.Error("err:%v", err) } return } // GetUserShareRechargeAmount 查询玩家下级充值总额 func GetUserShareRechargeAmount(uid, level int) (count int64) { sql := fmt.Sprintf(`SELECT sum(b.total_recharge) as count from (SELECT uid from share_info WHERE %s)a INNER JOIN (SELECT uid,total_recharge from recharge_info WHERE total_recharge > 0)b on a.uid = b.uid`, PackLevelSql(uid, level)) err := db.Mysql().C().Raw(sql).Scan(&count).Error if err != nil { log.Error("err:%v", err) } return } // GetActivityShareCode 根据actid获取share code func GetActivityShareCode(uid, actId int) (code string, err error) { now := time.Now() ret := make([]*common.ShareActivityCode, 0, 1) _, err = db.Mysql().QueryList(0, 1, fmt.Sprintf("uid = %d and activity_id = %d and expire_at < %d", uid, actId, now.Unix()), "id", &common.ShareActivityCode{}, &ret) if err != nil { log.Error("GetActivityShareCode err:%v", err) return } if len(ret) == 0 { expireTime := util.GetZeroTime(now.AddDate(0, 0, 1)) code = util.GetShareCode(-uid - actId) err = db.Mysql().Create(&common.ShareActivityCode{ UID: uid, ShareCode: code, ActivityId: actId, ExpireAt: expireTime.Unix(), CreateAt: now.Unix(), }) if err != nil { log.Error("GetActivityShareCode err:%v", err) return } } else { code = ret[0].ShareCode } return } func SendShareReward(uid, actId int) { switch actId { } }