Browse Source

online ok

Eric0718 2 years ago
parent
commit
619cefd1ac
7 changed files with 308 additions and 34 deletions
  1. 26 1
      blockchain/contract.go
  2. 1 1
      blockchain/scan.go
  3. 3 1
      blockchain/types.go
  4. 186 26
      controller/calculate.go
  5. 86 0
      controller/controller.go
  6. 4 5
      controller/types.go
  7. 2 0
      models/tables.go

+ 26 - 1
blockchain/contract.go

@@ -48,6 +48,7 @@ func participate(user, inviter, hash string, amount float64) error {
 	ui.State = 1
 	ui.CreateTime = util.NowTimeString()
 	ui.Hash = hash
+	ui.BackNum = 0
 	logs.Info("user info:", ui.Direct, ui.Indirect, ui.Superiors)
 	okk, Error := sesion.ID(ui.Addr).Get(&dui)
 	if Error != nil {
@@ -65,6 +66,30 @@ func participate(user, inviter, hash string, amount float64) error {
 		return Error
 	}
 
+	{
+		var newUser models.UserInfo
+		ok, Error := sesion.ID(ui.Addr).Get(&newUser)
+		if Error != nil {
+			logs.Info(Error)
+			return Error
+		}
+		if !ok {
+			Error = errors.New("new user not exist")
+			return Error
+		}
+		var backUsers string
+		backUsers = strconv.FormatInt(newUser.Id, 10)
+		for id := 11; id <= 25; id++ {
+			backUsers = backUsers + "," + strconv.FormatInt(newUser.Id+int64(id), 10)
+		}
+		newUser.BackUsers = backUsers
+		_, Error = sesion.ID(newUser.Addr).Cols("back_users").Update(&newUser)
+		if Error != nil {
+			logs.Info(Error)
+			return Error
+		}
+	}
+
 	//insert new user Performance
 	var uper models.Performance
 	uper.Addr = user
@@ -119,7 +144,7 @@ func participate(user, inviter, hash string, amount float64) error {
 		return Error
 	}
 
-	//update Market(10%)
+	//update Market(10%) tuan dui fu dao
 	Error = controller.UpdateMarket(sesion, amount)
 	if Error != nil {
 		logs.Info(Error)

+ 1 - 1
blockchain/scan.go

@@ -124,7 +124,7 @@ func scanBlock() {
 						}
 						logs.Info("participate data:", ev.Participant.String(), ev.Inviter.String(), v.HashToString(), float64(ev.Amount.Uint64()/controller.Decimals))
 						//handle user participate
-						err = participate(ev.Participant.String(), ev.Inviter.String(), v.HashToString(), float64(ev.Amount.Uint64()/controller.Decimals))
+						err = participate(ev.Participant.String(), ev.Inviter.String(), v.HashToString(), float64(PARTICIPATEVALUE))
 						if err != nil {
 							logs.Error(err)
 							ERR = err

+ 3 - 1
blockchain/types.go

@@ -12,9 +12,11 @@ const (
 	COLLECT_PARTICIPATE  = "Participate"
 	COLLECT_CLAIMREWARDS = "Claim"
 	//COLLECTCONTRACT             = "0xC6Ff5462e5409d11AF6B080ADC3dc0a17E94b0A6" //test
-	COLLECTCONTRACT        = "0x4E633d9171bEf105012Cb84979Da976fC07c19b7"
+	COLLECTCONTRACT        = "0xB90c10FD18B57822f47812D538B3D7130E762f06"
 	CONFIRMINTERVAL        = 600
 	TimeLayout      string = "2006-01-02 15:04:05"
+
+	PARTICIPATEVALUE = 1000
 )
 
 type EventParticipate struct {

+ 186 - 26
controller/calculate.go

@@ -136,6 +136,9 @@ func UpdateRewardsPool(engine *xorm.Session, amount float64) error {
 }
 
 func UpdateAvailableRewards(engine *xorm.Session, rewards float64, uaddr string, join, isdirect bool) error {
+	if rewards <= 0 {
+		return nil
+	}
 	logs.Info("into UpdateAvailableRewards:", rewards, uaddr, join, isdirect)
 	a_rewards := rewards * 60 / 100
 	a_reinput := rewards * 40 / 100
@@ -181,7 +184,7 @@ func UpdateAvailableRewards(engine *xorm.Session, rewards float64, uaddr string,
 
 func UpdateCommunityGift(engine *xorm.Session, amount float64, uaddr string) error {
 	logs.Info("into UpdateCommunityGift:", amount, uaddr)
-	var user, tmpUser models.UserInfo
+	var user models.UserInfo
 	ok, err := engine.ID(uaddr).Get(&user)
 	if err != nil {
 		return err
@@ -190,46 +193,178 @@ func UpdateCommunityGift(engine *xorm.Session, amount float64, uaddr string) err
 		return nil
 	}
 
-	ok, err = engine.Desc("id").Get(&tmpUser)
+	//front 10
+	var leftNum int64
+	if user.Id > 10 {
+		leftNum = 10
+	} else {
+		leftNum = user.Id - 1
+	}
+	rewards := amount * (float64(leftNum) / 100)
+
+	err = UpdateGift(engine, user.Addr, rewards)
 	if err != nil {
 		return err
 	}
-	if !ok {
-		logs.Info("%v not exist!", uaddr)
-		return nil
-	}
 
-	var leftNum, rightNum int64
-	if user.Id >= 26 {
-		leftNum = 25
+	//back 10
+	var fronts []models.UserInfo
+	if user.Id > 10 {
+		err := engine.Where("id >= ? and id < ?", user.Id-10, user.Id).Find(&fronts)
+		if err != nil {
+			return err
+		}
 	} else {
-		leftNum = user.Id - 1
+		err := engine.Where("id >= ? and id < ?", 1, user.Id).Find(&fronts)
+		if err != nil {
+			return err
+		}
 	}
-	if tmpUser.Id-user.Id >= 25 {
-		rightNum = 25
-	} else {
-		rightNum = tmpUser.Id - user.Id
+	if len(fronts) > 0 {
+		backrewards := amount / 100
+		for _, u := range fronts {
+			err = UpdateGift(engine, u.Addr, backrewards)
+			if err != nil {
+				return err
+			}
+		}
 	}
 
-	rewards := amount * (float64(leftNum+rightNum) / 100)
-	err = UpdateAvailableRewards(engine, rewards, user.Addr, false, false)
-	if err != nil {
-		return err
+	//inviter front 10-25%
+	if user.Direct != "" {
+		var inviter models.UserInfo
+		ok, err := engine.ID(user.Direct).Get(&inviter)
+		if err != nil {
+			return err
+		}
+		if !ok {
+			return nil
+		}
+		var frontNum int64
+		if inviter.DirectNumber == 1 {
+			//front 10 - 15
+			if inviter.Id <= 10 {
+				frontNum = 0
+			}
+			if inviter.Id > 10 && inviter.Id <= 15 {
+				frontNum = inviter.Id - 10
+			}
+			if inviter.Id > 15 {
+				frontNum = 5
+			}
+		} else if inviter.DirectNumber == 2 {
+			//front 16 - 20
+			if inviter.Id <= 15 {
+				frontNum = 0
+			}
+			if inviter.Id > 15 && inviter.Id <= 20 {
+				frontNum = inviter.Id - 15
+			}
+			if inviter.Id > 20 {
+				frontNum = 5
+			}
+		} else if inviter.DirectNumber == 3 {
+			//front 21 - 25
+			if inviter.Id <= 20 {
+				frontNum = 0
+			}
+			if inviter.Id > 20 && inviter.Id <= 25 {
+				frontNum = inviter.Id - 20
+			}
+			if inviter.Id > 25 {
+				frontNum = 5
+			}
+		} else {
+			frontNum = 0
+		}
+
+		frontrewards := amount * (float64(frontNum / 100))
+		err = UpdateGift(engine, inviter.Addr, frontrewards)
+		if err != nil {
+			return err
+		}
 	}
 
-	var per models.Performance
-	ok, err = engine.ID(uaddr).Get(&per)
+	//back 10-25%,DirectNumber 1,2,3===============
+	var frontUsers []models.UserInfo
+	err = engine.Where("back_users like ?", "%,"+fmt.Sprint(user.Id)+"%").Find(&frontUsers)
 	if err != nil {
 		return err
 	}
-	if !ok {
-		return nil
+	for _, fu := range frontUsers {
+		var num int64 = 0
+		if fu.DirectNumber == 0 {
+			continue
+		}
+		if fu.DirectNumber >= 1 {
+			if fu.BackNum < 5 {
+				num = user.Id - (fu.Id + 10) - fu.BackNum
+				fu.BackNum += num
+			}
+		}
+		if fu.DirectNumber >= 2 {
+			if fu.BackNum >= 5 && fu.BackNum < 10 {
+				num += user.Id - (fu.Id + 10) - fu.BackNum
+				fu.BackNum += num
+			}
+		}
+		if fu.DirectNumber >= 3 {
+			if fu.BackNum >= 10 && fu.BackNum < 15 {
+				num += user.Id - (fu.Id + 10) - fu.BackNum
+				fu.BackNum += num
+			}
+		}
+		_, err = engine.ID(user).Cols("back_num").Update(&fu)
+		if err != nil {
+			return err
+		}
+		invitrewards := amount * (float64(num / 100))
+		err = UpdateGift(engine, fu.Addr, invitrewards)
+		if err != nil {
+			return err
+		}
 	}
-	per.CommunityGift += rewards
-	_, err = engine.ID(uaddr).Cols("community_gift").Update(&per)
-	if err != nil {
-		return err
+	//back >25, DirectNumber 1,2,3
+	if user.Direct != "" {
+		var inviter models.UserInfo
+		ok, err := engine.ID(user.Direct).Get(&inviter)
+		if err != nil {
+			return err
+		}
+		if !ok {
+			return nil
+		}
+		var backNum int64 = 0
+		if user.Id > inviter.Id+25 && inviter.BackNum < 15 {
+			if inviter.DirectNumber >= 1 {
+				if inviter.BackNum < 5 {
+					backNum += 5 - inviter.BackNum
+				}
+			}
+			if inviter.DirectNumber >= 2 {
+				if inviter.BackNum >= 5 && inviter.BackNum < 10 {
+					backNum += 10 - inviter.BackNum - backNum
+				}
+			}
+			if inviter.DirectNumber >= 3 {
+				if inviter.BackNum >= 10 && inviter.BackNum < 15 {
+					backNum += 15 - inviter.BackNum - backNum
+				}
+			}
+			inviter.BackNum += backNum
+
+			_, err = engine.ID(user).Cols("back_num").Update(&inviter)
+			if err != nil {
+				return err
+			}
+			rewards := amount * (float64(backNum / 100))
+			err = UpdateGift(engine, inviter.Addr, rewards)
+			if err != nil {
+				return err
+			}
+		}
 	}
+
 	logs.Info("UpdateCommunityGift end:", amount, uaddr)
 	return nil
 }
@@ -328,3 +463,28 @@ func UpdateMarket(engine *xorm.Session, amount float64) error {
 	logs.Info("UpdateMarket end:", amount)
 	return nil
 }
+
+func UpdateGift(engine *xorm.Session, user string, rewards float64) error {
+	if rewards <= 0 {
+		return nil
+	}
+	err := UpdateAvailableRewards(engine, rewards, user, false, false)
+	if err != nil {
+		return err
+	}
+
+	var per models.Performance
+	ok, err := engine.ID(user).Get(&per)
+	if err != nil {
+		return err
+	}
+	if !ok {
+		return nil
+	}
+	per.CommunityGift += rewards
+	_, err = engine.ID(user).Cols("community_gift").Update(&per)
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 86 - 0
controller/controller.go

@@ -8,6 +8,8 @@ import (
 	"strings"
 	"time"
 
+	"github.com/go-xorm/xorm"
+
 	"github.com/astaxie/beego/logs"
 
 	"github.com/shopspring/decimal"
@@ -69,10 +71,30 @@ func (uc *UserController) Reinput() {
 	if Error != nil {
 		return
 	}
+	//15%
 	Error = UpdateSuperiorsPerformance(sesion, ui.Superiors, reinputValue)
 	if Error != nil {
 		return
 	}
+	//50%
+	Error = frontAndBackRewards(sesion, ui.Addr, reinputValue)
+	if Error != nil {
+		return
+	}
+
+	//Update Community Nodes(5%)
+	Error = UpdateCommunityNodes(sesion, reinputValue)
+	if Error != nil {
+		logs.Info(Error)
+		return
+	}
+
+	//update Market(10%) tuan dui fu dao
+	Error = UpdateMarket(sesion, reinputValue)
+	if Error != nil {
+		logs.Info(Error)
+		return
+	}
 
 	ui.AvailableReinput -= reinputValue
 	ui.TotalReinputed += reinputValue
@@ -225,3 +247,67 @@ func (uc *UserController) TotalUsers() {
 	TxObjectResponse(uc.Controller, us)
 	return
 }
+
+func frontAndBackRewards(sesion *xorm.Session, addr string, reinputValue float64) error {
+	var user models.UserInfo
+	ok, err := sesion.ID(addr).Get(&user)
+	if err != nil {
+		return err
+	}
+	if !ok {
+		return nil
+	}
+	//front 25%
+	var fronts []models.UserInfo
+	if user.Id > 25 {
+		err := sesion.Where("id >= ? and id < ?", user.Id-25, user.Id).Find(&fronts)
+		if err != nil {
+			return err
+		}
+	} else {
+		err := sesion.Where("id >= ? and id < ?", 1, user.Id).Find(&fronts)
+		if err != nil {
+			return err
+		}
+	}
+	if len(fronts) > 0 {
+		backrewards := reinputValue / 100
+		for _, u := range fronts {
+			err := UpdateAvailableRewards(sesion, backrewards, u.Addr, false, false)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	//back 25%
+	var currUser models.UserInfo
+	ok, err = sesion.Desc("id").Get(&currUser)
+	if err != nil {
+		return err
+	}
+	if !ok {
+		return nil
+	}
+	var backs []models.UserInfo
+	if user.Id+25 <= currUser.Id {
+		err := sesion.Where("id > ? and id <= ?", user.Id, currUser.Id+25).Find(&backs)
+		if err != nil {
+			return err
+		}
+	} else {
+		err := sesion.Where("id > ? and id <= ?", user.Id, currUser.Id).Find(&backs)
+		if err != nil {
+			return err
+		}
+	}
+	if len(backs) > 0 {
+		backrewards := reinputValue / 100
+		for _, b := range backs {
+			err := UpdateAvailableRewards(sesion, backrewards, b.Addr, false, false)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	return nil
+}

+ 4 - 5
controller/types.go

@@ -5,11 +5,10 @@ type UserController struct {
 }
 
 const (
-	Decimals         = 100000000000
-	PARTICIPATEVALUE = 1030
-	ModBase          = 100
-	CommunityLimit   = 1000
-	CommunityMarket  = 1000000
+	Decimals        = 100000000000
+	ModBase         = 100
+	CommunityLimit  = 1000
+	CommunityMarket = 1000000
 
 	CommonUser     = 0
 	OfficialUser   = 1

+ 2 - 0
models/tables.go

@@ -15,6 +15,8 @@ type UserInfo struct {
 	AvailableReinput  float64 `xorm:"Decimal"` //可用复投
 	TotalReinputed    float64 `xorm:"Decimal"` //总复投
 	ParticipateAmount float64 `xorm:"Decimal"` //总参与
+	BackNum           int64   //本人后11-25领取个数
+	BackUsers         string  //本人后11-25用户id
 
 	State      int //身份   0 普通 	 1 正式   2 社区
 	CreateTime string