calculate.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package controller
  2. import (
  3. "errors"
  4. "ktogame/models"
  5. "strings"
  6. "github.com/go-xorm/xorm"
  7. )
  8. func UpdateSuperiorsPerformance(engine *xorm.Engine, superiorsStr string, amount float64) error {
  9. ids := strings.Split(superiorsStr, ",")
  10. if len(ids) <= 0 {
  11. return nil
  12. }
  13. var supers []models.UserInfo
  14. for _, sid := range ids {
  15. var tmpUser models.UserInfo
  16. ok, err := engine.Id(sid).Get(&tmpUser)
  17. if err != nil {
  18. return err
  19. }
  20. if !ok {
  21. return errors.New("UpdateSuperiorsPerformance get super failed")
  22. }
  23. supers = append(supers, tmpUser)
  24. }
  25. var rp models.RewardsPool
  26. _, err := engine.Id(1).Get(&rp)
  27. if err != nil {
  28. return err
  29. }
  30. for _, user := range supers {
  31. var per models.Performance
  32. ok, err := engine.Id(user.Addr).Get(&per)
  33. if err != nil {
  34. return err
  35. }
  36. if !ok {
  37. return errors.New("UpdateSuperiorsPerformance get performance failed")
  38. }
  39. per.TotalPerformance += amount
  40. var level int = 0
  41. for i := 1; i < len(PerformanceLevel); i++ {
  42. if PerformanceLevel[i-1] <= per.TotalPerformance && per.TotalPerformance < PerformanceLevel[i] {
  43. level = i
  44. break
  45. }
  46. }
  47. if level > 0 {
  48. if level > per.ClaimedPerformanceLevel {
  49. ratio := PerformanceRatio[level] - PerformanceRatio[per.ClaimedPerformanceLevel]
  50. rewards := amount * ratio
  51. if rp.TeamPerformance >= rewards {
  52. rp.TeamPerformance -= rewards //pool sub rewards
  53. per.PerformanceRewards += rewards //user add rewards to PerformanceRewards
  54. per.ClaimedPerformanceLevel = level
  55. //update available
  56. err := UpdateAvailableRewards(engine, rewards, user.Id)
  57. if err != nil {
  58. return err
  59. }
  60. _, err = engine.ID(user.Addr).Update(&per)
  61. if err != nil {
  62. return err
  63. }
  64. }
  65. }
  66. }
  67. }
  68. _, err = engine.ID(1).Update(&rp)
  69. if err != nil {
  70. return err
  71. }
  72. return nil
  73. }
  74. func UpdateRewardsPool(engine *xorm.Engine, amount float64) error {
  75. var rp models.RewardsPool
  76. rp.Recommendation = amount * 0.2
  77. rp.TeamPerformance = amount * 0.2
  78. rp.CommunityGift = amount * 0.5
  79. rp.TeamCultivate = amount * 0.05
  80. rp.CommunityNode = amount * 0.05
  81. _, err := engine.ID(1).Update(&rp)
  82. if err != nil {
  83. return err
  84. }
  85. return nil
  86. }
  87. func UpdateAvailableRewards(engine *xorm.Engine, rewards float64, uid int64) error {
  88. a_rewards := rewards * 60 / 100
  89. a_reinput := rewards * 40 / 100
  90. var user models.UserInfo
  91. ok, err := engine.Id(uid).Get(&user)
  92. if err != nil {
  93. return err
  94. }
  95. if !ok {
  96. return errors.New("engine get failed")
  97. }
  98. user.AvailableClaim = a_rewards
  99. user.AvailableReinput = a_reinput
  100. _, err = engine.ID(user.Addr).Cols("available_claim").Update(&user)
  101. if err != nil {
  102. return err
  103. }
  104. _, err = engine.ID(user.Addr).Cols("available_reinput").Update(&user)
  105. if err != nil {
  106. return err
  107. }
  108. return nil
  109. }