calculate.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. //update available
  55. err := UpdateAvailableRewards(engine, rewards, user.Id)
  56. if err != nil {
  57. return err
  58. }
  59. _, err = engine.ID(user.Addr).Update(&per)
  60. if err != nil {
  61. return err
  62. }
  63. }
  64. }
  65. }
  66. }
  67. return nil
  68. }
  69. func UpdateRewardsPool(engine *xorm.Engine, amount float64) error {
  70. var rp models.RewardsPool
  71. rp.Recommendation = amount * 0.2
  72. rp.TeamPerformance = amount * 0.2
  73. rp.CommunityGift = amount * 0.5
  74. rp.TeamCultivate = amount * 0.05
  75. rp.CommunityNode = amount * 0.05
  76. _, err := engine.ID(1).Update(&rp)
  77. if err != nil {
  78. return err
  79. }
  80. return nil
  81. }
  82. func UpdateAvailableRewards(engine *xorm.Engine, rewards float64, uid int64) error {
  83. a_rewards := rewards * 60 / 100
  84. a_reinput := rewards * 40 / 100
  85. var user models.UserInfo
  86. ok, err := engine.Id(uid).Get(&user)
  87. if err != nil {
  88. return err
  89. }
  90. if !ok {
  91. return errors.New("engine get failed")
  92. }
  93. user.AvailableClaim = a_rewards
  94. user.AvailableReinput = a_reinput
  95. _, err = engine.ID(user.Addr).Cols("available_claim").Update(&user)
  96. if err != nil {
  97. return err
  98. }
  99. _, err = engine.ID(user.Addr).Cols("available_reinput").Update(&user)
  100. if err != nil {
  101. return err
  102. }
  103. return nil
  104. }