calculate.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. package controller
  2. import (
  3. "fmt"
  4. "ktogame/dbUtil"
  5. "ktogame/models"
  6. "strings"
  7. "github.com/astaxie/beego/logs"
  8. "github.com/go-xorm/xorm"
  9. )
  10. func UpdateSuperiorsPerformance(engine *xorm.Engine, superiorsStr string, amount float64) error {
  11. logs.Info("into UpdateSuperiorsPerformance:", superiorsStr, amount)
  12. ids := strings.Split(superiorsStr, ",")
  13. if len(ids) <= 0 {
  14. return nil
  15. }
  16. logs.Info("UpdateSuperiorsPerformance ids::::::", ids)
  17. var supers []models.UserInfo
  18. for _, sid := range ids {
  19. var tmpUser models.UserInfo
  20. ok, err := engine.Where("id = ?", sid).Get(&tmpUser)
  21. if err != nil {
  22. return err
  23. }
  24. if !ok {
  25. continue
  26. }
  27. supers = append(supers, tmpUser)
  28. }
  29. logs.Info("UpdateSuperiorsPerformance supers::::::%v", len(supers))
  30. if len(supers) == 0 {
  31. return nil
  32. }
  33. var rp models.RewardsPool
  34. _, err := engine.Id(1).Get(&rp)
  35. if err != nil {
  36. return err
  37. }
  38. for _, super := range supers {
  39. var per models.Performance
  40. ok, err := engine.Id(super.Addr).Get(&per)
  41. if err != nil {
  42. fmt.Println(err)
  43. continue
  44. }
  45. if !ok {
  46. logs.Info("%v not exist!", super.Addr)
  47. continue
  48. }
  49. per.TotalPerformance += amount
  50. if per.TotalPerformance >= float64(CommunityMarket) {
  51. var super models.Performance
  52. ok, err := engine.Id(per.Addr).Get(&super)
  53. if err != nil {
  54. fmt.Println(err)
  55. continue
  56. }
  57. if !ok {
  58. logs.Info("%v not exist!", per.Addr)
  59. continue
  60. }
  61. super.MarketNum = int(per.TotalPerformance / float64(CommunityMarket))
  62. logs.Debug("matket check=====,", per.Addr, per.TotalPerformance, CommunityMarket, super.MarketNum)
  63. _, err = engine.ID(super.Addr).Cols("market_num").Update(&super)
  64. if err != nil {
  65. fmt.Println(err)
  66. continue
  67. }
  68. }
  69. var level int = 0
  70. for i := 1; i < len(PerformanceLevel); i++ {
  71. if PerformanceLevel[i-1] <= per.TotalPerformance && per.TotalPerformance < PerformanceLevel[i] {
  72. level = i
  73. break
  74. }
  75. }
  76. logs.Debug("Performance check=====1,", per.Addr, rp.TeamPerformance, per.TotalPerformance, per.PerformanceRewards, level, per.PerformanceLevel)
  77. if level > 0 {
  78. if level > per.PerformanceLevel {
  79. ratio := PerformanceRatio[level] - PerformanceRatio[per.PerformanceLevel]
  80. rewards := amount * ratio
  81. if rp.TeamPerformance >= rewards {
  82. rp.TeamPerformance -= rewards //pool sub rewards
  83. per.PerformanceRewards += rewards //user add rewards to PerformanceRewards
  84. per.PerformanceLevel = level
  85. //update available
  86. logs.Debug("Performance check=====2,", per.Addr, level, amount, ratio, rewards)
  87. err := UpdateAvailableRewards(rewards, super.Addr, false, false)
  88. if err != nil {
  89. return err
  90. }
  91. }
  92. }
  93. }
  94. _, err = engine.ID(super.Addr).Cols("total_performance,performance_level,performance_rewards").Update(&per)
  95. if err != nil {
  96. return err
  97. }
  98. logs.Debug("Performance check=====3,", per.Addr, rp.TeamPerformance, per.TotalPerformance, per.PerformanceRewards, per.PerformanceLevel)
  99. }
  100. _, err = engine.ID(1).Cols("team_performance").Update(&rp)
  101. if err != nil {
  102. return err
  103. }
  104. logs.Info("into UpdateSuperiorsPerformance end:", rp)
  105. return nil
  106. }
  107. func UpdateRewardsPool(engine *xorm.Engine, amount float64) error {
  108. logs.Info("into UpdateRewardsPool:", amount)
  109. var rp models.RewardsPool
  110. _, err := dbUtil.Engine.Id(1).Get(&rp)
  111. if err != nil {
  112. return err
  113. }
  114. rp.TeamPerformance += amount * 0.15
  115. rp.TeamCultivate += amount * 0.10
  116. rp.TotalPool += amount
  117. _, err = engine.ID(1).Update(&rp)
  118. if err != nil {
  119. return err
  120. }
  121. logs.Info("UpdateRewardsPool end:", rp)
  122. return nil
  123. }
  124. func UpdateAvailableRewards(rewards float64, uaddr string, join, isdirect bool) error {
  125. logs.Info("into UpdateAvailableRewards:", rewards, uaddr, join, isdirect)
  126. a_rewards := rewards * 60 / 100
  127. a_reinput := rewards * 40 / 100
  128. var user models.UserInfo
  129. ok, err := dbUtil.Engine.Id(uaddr).Get(&user)
  130. if err != nil {
  131. return err
  132. }
  133. if !ok {
  134. logs.Info("%v not exist!", uaddr)
  135. return nil
  136. }
  137. user.AvailableClaim += a_rewards
  138. user.AvailableReinput += a_reinput
  139. if join {
  140. if isdirect {
  141. user.DirectNumber += 1
  142. user.DirectRewards += rewards
  143. logs.Info("check direct info=====:", rewards, a_rewards, a_reinput, user.AvailableClaim, user.AvailableReinput, user.DirectNumber, user.DirectRewards)
  144. _, err := dbUtil.Engine.ID(user.Addr).Cols("available_claim,available_reinput,direct_number,direct_rewards").Update(&user)
  145. if err != nil {
  146. return err
  147. }
  148. } else {
  149. user.IndirectNumber += 1
  150. user.IndirectRewards += rewards
  151. logs.Info("check indirect info=====:", rewards, a_rewards, a_reinput, user.AvailableClaim, user.AvailableReinput, user.DirectNumber, user.DirectRewards)
  152. _, err := dbUtil.Engine.ID(user.Addr).Cols("available_claim,available_reinput,indirect_number,indirect_rewards").Update(&user)
  153. if err != nil {
  154. return err
  155. }
  156. }
  157. } else {
  158. logs.Info("check else info=====:", user.AvailableClaim, user.AvailableReinput)
  159. _, err := dbUtil.Engine.ID(user.Addr).Cols("available_claim,available_reinput").Update(&user)
  160. if err != nil {
  161. return err
  162. }
  163. }
  164. logs.Info("into UpdateAvailableRewards end:", user)
  165. return nil
  166. }
  167. func UpdateCommunityGift(engine *xorm.Engine, amount float64, uaddr string) error {
  168. logs.Info("into UpdateCommunityGift:", amount, uaddr)
  169. var user, tmpUser models.UserInfo
  170. ok, err := engine.Id(uaddr).Get(&user)
  171. if err != nil {
  172. return err
  173. }
  174. if !ok {
  175. return nil
  176. }
  177. ok, err = engine.Desc("id").Get(&tmpUser)
  178. if err != nil {
  179. return err
  180. }
  181. if !ok {
  182. logs.Info("%v not exist!", uaddr)
  183. return nil
  184. }
  185. var leftNum, rightNum int64
  186. if user.Id >= 26 {
  187. leftNum = 25
  188. } else {
  189. leftNum = user.Id - 1
  190. }
  191. if tmpUser.Id-user.Id >= 25 {
  192. rightNum = 25
  193. } else {
  194. rightNum = tmpUser.Id - user.Id
  195. }
  196. rewards := amount * (float64(leftNum+rightNum) / 100)
  197. err = UpdateAvailableRewards(rewards, user.Addr, false, false)
  198. if err != nil {
  199. return err
  200. }
  201. var per models.Performance
  202. ok, err = engine.Id(uaddr).Get(&per)
  203. if err != nil {
  204. return err
  205. }
  206. if !ok {
  207. return nil
  208. }
  209. per.CommunityGift += rewards
  210. _, err = engine.ID(uaddr).Cols("community_gift").Update(&per)
  211. if err != nil {
  212. return err
  213. }
  214. logs.Info("into UpdateCommunityGift end:", amount, uaddr)
  215. return nil
  216. }
  217. func UpdateCommunityNodes(engine *xorm.Engine, amount float64) error {
  218. logs.Info("into UpdateCommunityNodes:", amount)
  219. var nodes []models.UserInfo
  220. err := engine.Where("state = ?", CommunityUsers).Find(&nodes)
  221. if err != nil {
  222. return err
  223. }
  224. if len(nodes) == 0 {
  225. return nil
  226. }
  227. rewards := (amount * 5 / 100) / float64(len(nodes))
  228. for _, node := range nodes {
  229. err = UpdateAvailableRewards(rewards, node.Addr, false, false)
  230. if err != nil {
  231. fmt.Println(err)
  232. continue
  233. }
  234. var per models.Performance
  235. _, err = engine.Id(node.Addr).Get(&per)
  236. if err != nil {
  237. fmt.Println(err)
  238. continue
  239. }
  240. per.CommunityNode += rewards
  241. _, err = engine.ID(node.Addr).Cols("community_node").Update(&per)
  242. if err != nil {
  243. fmt.Println(err)
  244. continue
  245. }
  246. }
  247. logs.Info("into UpdateCommunityNodes end:", amount)
  248. return nil
  249. }
  250. func UpdateMarket(engine *xorm.Engine, amount float64) error {
  251. logs.Info("into UpdateMarket:", amount)
  252. var pers []models.Performance
  253. err := engine.Where("market_num >= ?", 2).Find(&pers)
  254. if err != nil {
  255. return err
  256. }
  257. var rp models.RewardsPool
  258. ok, err := engine.Id(1).Get(&rp)
  259. if err != nil {
  260. return err
  261. }
  262. if !ok {
  263. return nil
  264. }
  265. for _, per := range pers {
  266. var level int = 0
  267. for i := 1; i < len(MarketLevel); i++ {
  268. if MarketLevel[i-1] <= per.MarketNum && per.MarketNum < MarketLevel[i] {
  269. level = i
  270. break
  271. }
  272. }
  273. logs.Debug(" UpdateMarket=====1,", per.Addr, rp.TeamCultivate, per.MarketRewards, level, per.MarketLevel)
  274. if level > 0 {
  275. if level > per.MarketLevel {
  276. ratio := MarketRatio[level] - MarketRatio[per.MarketLevel]
  277. rewards := amount * ratio
  278. if rp.TeamCultivate >= rewards {
  279. rp.TeamCultivate -= rewards //pool sub rewards
  280. per.MarketRewards += rewards //user add rewards to PerformanceRewards
  281. per.MarketLevel = level
  282. //update available
  283. logs.Debug(" UpdateMarket=====2,", per.Addr, rewards)
  284. err := UpdateAvailableRewards(rewards, per.Addr, false, false)
  285. if err != nil {
  286. return err
  287. }
  288. _, err = engine.ID(per.Addr).Cols("market_level,market_rewards").Update(&per)
  289. if err != nil {
  290. return err
  291. }
  292. }
  293. }
  294. }
  295. logs.Debug(" UpdateMarket=====3,", per.Addr, rp.TeamCultivate, per.MarketRewards, level, per.MarketLevel)
  296. }
  297. _, err = engine.ID(1).Cols("team_performance").Update(&rp)
  298. if err != nil {
  299. return err
  300. }
  301. logs.Info("into UpdateMarket end:", amount)
  302. return nil
  303. }