calculate.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. package controller
  2. import (
  3. "fmt"
  4. "ktogame/models"
  5. "strings"
  6. "github.com/astaxie/beego/logs"
  7. "github.com/go-xorm/xorm"
  8. )
  9. func UpdateSuperiorsPerformance(engine *xorm.Session, superiorsStr string, amount float64) error {
  10. logs.Info("into UpdateSuperiorsPerformance:", superiorsStr, amount)
  11. ids := strings.Split(superiorsStr, ",")
  12. if len(ids) <= 0 {
  13. return nil
  14. }
  15. logs.Info("UpdateSuperiorsPerformance ids::::::", ids)
  16. var supers []models.UserInfo
  17. for _, sid := range ids {
  18. var tmpUser models.UserInfo
  19. ok, err := engine.Where("id = ?", sid).Get(&tmpUser)
  20. if err != nil {
  21. return err
  22. }
  23. if !ok {
  24. continue
  25. }
  26. supers = append(supers, tmpUser)
  27. }
  28. logs.Info("UpdateSuperiorsPerformance supers::::::%v", len(supers))
  29. if len(supers) == 0 {
  30. return nil
  31. }
  32. var rp models.RewardsPool
  33. _, err := engine.ID(1).Get(&rp)
  34. if err != nil {
  35. return err
  36. }
  37. for _, super := range supers {
  38. var per models.Performance
  39. ok, err := engine.ID(super.Addr).Get(&per)
  40. if err != nil {
  41. fmt.Println(err)
  42. continue
  43. }
  44. if !ok {
  45. logs.Info("%v not exist!", super.Addr)
  46. continue
  47. }
  48. per.TotalPerformance += amount
  49. if per.TotalPerformance >= float64(CommunityMarket) {
  50. var super models.Performance
  51. ok, err := engine.ID(per.Addr).Get(&super)
  52. if err != nil {
  53. fmt.Println(err)
  54. continue
  55. }
  56. if !ok {
  57. logs.Info("%v not exist!", per.Addr)
  58. continue
  59. }
  60. super.MarketNum = int(per.TotalPerformance / float64(CommunityMarket))
  61. logs.Debug("matket check=====,", per.Addr, per.TotalPerformance, CommunityMarket, super.MarketNum)
  62. _, err = engine.ID(super.Addr).Cols("market_num").Update(&super)
  63. if err != nil {
  64. fmt.Println(err)
  65. continue
  66. }
  67. }
  68. var level int = 0
  69. for i := 1; i < len(PerformanceLevel); i++ {
  70. if PerformanceLevel[i-1] <= per.TotalPerformance && per.TotalPerformance < PerformanceLevel[i] {
  71. level = i
  72. break
  73. }
  74. }
  75. logs.Debug("Performance check=====1,", per.Addr, rp.TeamPerformance, per.TotalPerformance, per.PerformanceRewards, level, per.PerformanceLevel)
  76. if level > 0 {
  77. if level > per.PerformanceLevel {
  78. ratio := PerformanceRatio[level] - PerformanceRatio[per.PerformanceLevel]
  79. rewards := amount * ratio
  80. if rp.TeamPerformance >= rewards {
  81. rp.TeamPerformance -= rewards //pool sub rewards
  82. per.PerformanceRewards += rewards //user add rewards to PerformanceRewards
  83. per.PerformanceLevel = level
  84. //update available
  85. logs.Debug("Performance check=====2,", per.Addr, level, amount, ratio, rewards)
  86. err := UpdateAvailableRewards(engine, rewards, super.Addr, false, false)
  87. if err != nil {
  88. return err
  89. }
  90. }
  91. }
  92. }
  93. _, err = engine.ID(super.Addr).Cols("total_performance,performance_level,performance_rewards").Update(&per)
  94. if err != nil {
  95. return err
  96. }
  97. logs.Debug("Performance check=====3,", per.Addr, rp.TeamPerformance, per.TotalPerformance, per.PerformanceRewards, per.PerformanceLevel)
  98. }
  99. _, err = engine.ID(1).Cols("team_performance").Update(&rp)
  100. if err != nil {
  101. return err
  102. }
  103. logs.Info("UpdateSuperiorsPerformance end:", rp)
  104. return nil
  105. }
  106. func UpdateRewardsPool(engine *xorm.Session, amount float64) error {
  107. logs.Info("into UpdateRewardsPool:", amount)
  108. var rp models.RewardsPool
  109. _, err := engine.ID(1).Get(&rp)
  110. if err != nil {
  111. return err
  112. }
  113. rp.TeamPerformance += amount * 0.15
  114. rp.TeamCultivate += amount * 0.10
  115. rp.TotalPool += amount
  116. _, err = engine.ID(1).Update(&rp)
  117. if err != nil {
  118. return err
  119. }
  120. logs.Info("UpdateRewardsPool end:", rp)
  121. return nil
  122. }
  123. func UpdateAvailableRewards(engine *xorm.Session, rewards float64, uaddr string, join, isdirect bool) error {
  124. if rewards <= 0 {
  125. return nil
  126. }
  127. logs.Info("into UpdateAvailableRewards:", rewards, uaddr, join, isdirect)
  128. a_rewards := rewards * 60 / 100
  129. a_reinput := rewards * 40 / 100
  130. var user models.UserInfo
  131. ok, err := engine.ID(uaddr).Get(&user)
  132. if err != nil {
  133. return err
  134. }
  135. if !ok {
  136. logs.Info("%v not exist!", uaddr)
  137. return nil
  138. }
  139. user.AvailableClaim += a_rewards
  140. user.AvailableReinput += a_reinput
  141. if join {
  142. if isdirect {
  143. user.DirectNumber += 1
  144. user.DirectRewards += rewards
  145. logs.Info("check direct info=====:", rewards, a_rewards, a_reinput, user.AvailableClaim, user.AvailableReinput, user.DirectNumber, user.DirectRewards)
  146. _, err := engine.ID(user.Addr).Cols("available_claim,available_reinput,direct_number,direct_rewards").Update(&user)
  147. if err != nil {
  148. return err
  149. }
  150. } else {
  151. user.IndirectNumber += 1
  152. user.IndirectRewards += rewards
  153. logs.Info("check indirect info=====:", rewards, a_rewards, a_reinput, user.AvailableClaim, user.AvailableReinput, user.DirectNumber, user.DirectRewards)
  154. _, err := engine.ID(user.Addr).Cols("available_claim,available_reinput,indirect_number,indirect_rewards").Update(&user)
  155. if err != nil {
  156. return err
  157. }
  158. }
  159. } else {
  160. logs.Info("check else info=====:", user.AvailableClaim, user.AvailableReinput)
  161. _, err := engine.ID(user.Addr).Cols("available_claim,available_reinput").Update(&user)
  162. if err != nil {
  163. return err
  164. }
  165. }
  166. logs.Info("UpdateAvailableRewards end:", user)
  167. return nil
  168. }
  169. func UpdateCommunityGift(engine *xorm.Session, amount float64, uaddr string) error {
  170. logs.Info("into UpdateCommunityGift:", amount, uaddr)
  171. var user models.UserInfo
  172. ok, err := engine.ID(uaddr).Get(&user)
  173. if err != nil {
  174. return err
  175. }
  176. if !ok {
  177. return nil
  178. }
  179. //front 10
  180. var leftNum int64
  181. if user.Id > 10 {
  182. leftNum = 10
  183. } else {
  184. leftNum = user.Id - 1
  185. }
  186. rewards := amount * (float64(leftNum) / 100)
  187. err = UpdateGift(engine, user.Addr, rewards)
  188. if err != nil {
  189. return err
  190. }
  191. //back 10
  192. var fronts []models.UserInfo
  193. if user.Id > 10 {
  194. err := engine.Where("id >= ? and id < ?", user.Id-10, user.Id).Find(&fronts)
  195. if err != nil {
  196. return err
  197. }
  198. } else {
  199. err := engine.Where("id >= ? and id < ?", 1, user.Id).Find(&fronts)
  200. if err != nil {
  201. return err
  202. }
  203. }
  204. if len(fronts) > 0 {
  205. backrewards := amount / 100
  206. for _, u := range fronts {
  207. err = UpdateGift(engine, u.Addr, backrewards)
  208. if err != nil {
  209. return err
  210. }
  211. }
  212. }
  213. //inviter front 10-25%
  214. if user.Direct != "" {
  215. var inviter models.UserInfo
  216. ok, err := engine.ID(user.Direct).Get(&inviter)
  217. if err != nil {
  218. return err
  219. }
  220. if !ok {
  221. return nil
  222. }
  223. var frontNum int64
  224. if inviter.DirectNumber == 1 {
  225. //front 10 - 15
  226. if inviter.Id <= 10 {
  227. frontNum = 0
  228. }
  229. if inviter.Id > 10 && inviter.Id <= 15 {
  230. frontNum = inviter.Id - 10
  231. }
  232. if inviter.Id > 15 {
  233. frontNum = 5
  234. }
  235. } else if inviter.DirectNumber == 2 {
  236. //front 16 - 20
  237. if inviter.Id <= 15 {
  238. frontNum = 0
  239. }
  240. if inviter.Id > 15 && inviter.Id <= 20 {
  241. frontNum = inviter.Id - 15
  242. }
  243. if inviter.Id > 20 {
  244. frontNum = 5
  245. }
  246. } else if inviter.DirectNumber == 3 {
  247. //front 21 - 25
  248. if inviter.Id <= 20 {
  249. frontNum = 0
  250. }
  251. if inviter.Id > 20 && inviter.Id <= 25 {
  252. frontNum = inviter.Id - 20
  253. }
  254. if inviter.Id > 25 {
  255. frontNum = 5
  256. }
  257. } else {
  258. frontNum = 0
  259. }
  260. frontrewards := amount * (float64(frontNum / 100))
  261. err = UpdateGift(engine, inviter.Addr, frontrewards)
  262. if err != nil {
  263. return err
  264. }
  265. }
  266. //back 10-25%,DirectNumber 1,2,3===============
  267. var frontUsers []models.UserInfo
  268. err = engine.Where("back_users like ?", "%,"+fmt.Sprint(user.Id)+"%").Find(&frontUsers)
  269. if err != nil {
  270. return err
  271. }
  272. for _, fu := range frontUsers {
  273. var num int64 = 0
  274. if fu.DirectNumber == 0 {
  275. continue
  276. }
  277. if fu.DirectNumber >= 1 {
  278. if fu.BackNum < 5 {
  279. num = user.Id - (fu.Id + 10) - fu.BackNum
  280. fu.BackNum += num
  281. }
  282. }
  283. if fu.DirectNumber >= 2 {
  284. if fu.BackNum >= 5 && fu.BackNum < 10 {
  285. num += user.Id - (fu.Id + 10) - fu.BackNum
  286. fu.BackNum += num
  287. }
  288. }
  289. if fu.DirectNumber >= 3 {
  290. if fu.BackNum >= 10 && fu.BackNum < 15 {
  291. num += user.Id - (fu.Id + 10) - fu.BackNum
  292. fu.BackNum += num
  293. }
  294. }
  295. _, err = engine.ID(user).Cols("back_num").Update(&fu)
  296. if err != nil {
  297. return err
  298. }
  299. invitrewards := amount * (float64(num / 100))
  300. err = UpdateGift(engine, fu.Addr, invitrewards)
  301. if err != nil {
  302. return err
  303. }
  304. }
  305. //back >25, DirectNumber 1,2,3
  306. if user.Direct != "" {
  307. var inviter models.UserInfo
  308. ok, err := engine.ID(user.Direct).Get(&inviter)
  309. if err != nil {
  310. return err
  311. }
  312. if !ok {
  313. return nil
  314. }
  315. var backNum int64 = 0
  316. if user.Id > inviter.Id+25 && inviter.BackNum < 15 {
  317. if inviter.DirectNumber >= 1 {
  318. if inviter.BackNum < 5 {
  319. backNum += 5 - inviter.BackNum
  320. }
  321. }
  322. if inviter.DirectNumber >= 2 {
  323. if inviter.BackNum >= 5 && inviter.BackNum < 10 {
  324. backNum += 10 - inviter.BackNum - backNum
  325. }
  326. }
  327. if inviter.DirectNumber >= 3 {
  328. if inviter.BackNum >= 10 && inviter.BackNum < 15 {
  329. backNum += 15 - inviter.BackNum - backNum
  330. }
  331. }
  332. inviter.BackNum += backNum
  333. _, err = engine.ID(user).Cols("back_num").Update(&inviter)
  334. if err != nil {
  335. return err
  336. }
  337. rewards := amount * (float64(backNum / 100))
  338. err = UpdateGift(engine, inviter.Addr, rewards)
  339. if err != nil {
  340. return err
  341. }
  342. }
  343. }
  344. logs.Info("UpdateCommunityGift end:", amount, uaddr)
  345. return nil
  346. }
  347. func UpdateCommunityNodes(engine *xorm.Session, amount float64) error {
  348. logs.Info("into UpdateCommunityNodes:", amount)
  349. var nodes []models.UserInfo
  350. err := engine.Where("state = ?", CommunityUsers).Find(&nodes)
  351. if err != nil {
  352. return err
  353. }
  354. if len(nodes) == 0 {
  355. return nil
  356. }
  357. rewards := (amount * 5 / 100) / float64(len(nodes))
  358. for _, node := range nodes {
  359. err = UpdateAvailableRewards(engine, rewards, node.Addr, false, false)
  360. if err != nil {
  361. fmt.Println(err)
  362. continue
  363. }
  364. var per models.Performance
  365. _, err = engine.ID(node.Addr).Get(&per)
  366. if err != nil {
  367. fmt.Println(err)
  368. continue
  369. }
  370. per.CommunityNode += rewards
  371. _, err = engine.ID(node.Addr).Cols("community_node").Update(&per)
  372. if err != nil {
  373. fmt.Println(err)
  374. continue
  375. }
  376. }
  377. logs.Info("UpdateCommunityNodes end:", amount)
  378. return nil
  379. }
  380. func UpdateMarket(engine *xorm.Session, amount float64) error {
  381. logs.Info("into UpdateMarket:", amount)
  382. var pers []models.Performance
  383. err := engine.Where("market_num >= ?", 2).Find(&pers)
  384. if err != nil {
  385. return err
  386. }
  387. var rp models.RewardsPool
  388. ok, err := engine.ID(1).Get(&rp)
  389. if err != nil {
  390. return err
  391. }
  392. if !ok {
  393. return nil
  394. }
  395. for _, per := range pers {
  396. var level int = 0
  397. for i := 1; i < len(MarketLevel); i++ {
  398. if MarketLevel[i-1] <= per.MarketNum && per.MarketNum < MarketLevel[i] {
  399. level = i
  400. break
  401. }
  402. }
  403. logs.Debug(" UpdateMarket=====1,", per.Addr, rp.TeamCultivate, per.MarketRewards, level, per.MarketLevel)
  404. if level > 0 {
  405. if level > per.MarketLevel {
  406. ratio := MarketRatio[level] - MarketRatio[per.MarketLevel]
  407. rewards := amount * ratio
  408. if rp.TeamCultivate >= rewards {
  409. rp.TeamCultivate -= rewards //pool sub rewards
  410. per.MarketRewards += rewards //user add rewards to PerformanceRewards
  411. per.MarketLevel = level
  412. //update available
  413. logs.Debug(" UpdateMarket=====2,", per.Addr, rewards)
  414. err := UpdateAvailableRewards(engine, rewards, per.Addr, false, false)
  415. if err != nil {
  416. return err
  417. }
  418. _, err = engine.ID(per.Addr).Cols("market_level,market_rewards").Update(&per)
  419. if err != nil {
  420. return err
  421. }
  422. }
  423. }
  424. }
  425. logs.Debug(" UpdateMarket=====3,", per.Addr, rp.TeamCultivate, per.MarketRewards, level, per.MarketLevel)
  426. }
  427. _, err = engine.ID(1).Cols("team_performance").Update(&rp)
  428. if err != nil {
  429. return err
  430. }
  431. logs.Info("UpdateMarket end:", amount)
  432. return nil
  433. }
  434. func UpdateGift(engine *xorm.Session, user string, rewards float64) error {
  435. if rewards <= 0 {
  436. return nil
  437. }
  438. err := UpdateAvailableRewards(engine, rewards, user, false, false)
  439. if err != nil {
  440. return err
  441. }
  442. var per models.Performance
  443. ok, err := engine.ID(user).Get(&per)
  444. if err != nil {
  445. return err
  446. }
  447. if !ok {
  448. return nil
  449. }
  450. per.CommunityGift += rewards
  451. _, err = engine.ID(user).Cols("community_gift").Update(&per)
  452. if err != nil {
  453. return err
  454. }
  455. return nil
  456. }