03_stake_ranking.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package daily_profit
  2. import (
  3. "app/commons/constant"
  4. "app/commons/core"
  5. "app/commons/core/exchange"
  6. "app/commons/model/entity"
  7. "app/commons/utils"
  8. "fmt"
  9. "github.com/shopspring/decimal"
  10. )
  11. // 个人质押排行奖
  12. func (s *Service) stakeRankingProfitCal(jobDate string) error {
  13. dailyJob, err := s.FirstSysJob(s.DB().Where("job_date", jobDate))
  14. if err != nil {
  15. return err
  16. }
  17. if dailyJob.IsSendStakeProfit {
  18. return nil
  19. }
  20. defer func() {
  21. msg := "质押排行奖励发放完成"
  22. send := true
  23. if err != nil {
  24. msg = err.Error()
  25. send = false
  26. }
  27. errMsg := fmt.Sprintf("%s:%s", msg, utils.NowTimeSecStr())
  28. if dailyJob.Desc != "" {
  29. errMsg = fmt.Sprintf("%s\n%s", dailyJob.Desc, errMsg)
  30. }
  31. if err = s.DB().Model(&entity.SysJob{}).
  32. Where("id", dailyJob.Id).
  33. Updates(map[string]interface{}{
  34. "desc": errMsg,
  35. "is_send_stake_profit": send,
  36. }).Error; err != nil {
  37. core.JobLog.Errorf(err.Error())
  38. }
  39. }()
  40. if dailyJob.TodayStaticProfit.LessThanOrEqual(decimal.Zero) {
  41. return nil
  42. }
  43. dailyProfit := dailyJob.TodayStaticProfit
  44. quotas, err := s.AllUserQuota(s.DB().Where("person_achievement > 0").Order("person_achievement desc").Limit(33))
  45. if err != nil {
  46. return err
  47. }
  48. // 每日总手续费 规则:第一名20%,其余按小区业绩加权分50%
  49. totalAc := decimal.Zero
  50. for i, quota := range quotas {
  51. if i == 0 {
  52. continue
  53. }
  54. totalAc = totalAc.Add(quota.PersonAchievement)
  55. }
  56. price, err := exchange.GetCurrentSymbolUsdPrice(constant.CoinSymbolTD)
  57. if err != nil {
  58. return err
  59. }
  60. for i, quota := range quotas {
  61. ratio := quota.PersonAchievement.Div(totalAc).Mul(decimal.NewFromFloat(0.2)) // 业绩占比 * 总比例0.2
  62. if i == 0 {
  63. ratio = decimal.NewFromFloat(0.1) // 第一名独占10%
  64. }
  65. profit := dailyProfit.Mul(ratio) //
  66. usdProfit := profit.Mul(price)
  67. bs := constant.BsById(constant.BsStakeRankingProfit)
  68. bs.ContextValue = fmt.Sprintf("%d", quota.UserId)
  69. bs.ContextName = quota.TableName()
  70. bs.Desc = fmt.Sprintf("%s - 第%d名 总手续费:%s 占比:%s 奖励:%s", bs.BusinessName, i+1, dailyProfit, ratio, profit)
  71. profitInfo := &entity.ProfitInfo{
  72. RawUserId: quota.UserId,
  73. RawUserUid: quota.Uid,
  74. RewardUserId: quota.UserId,
  75. RewardUserUid: quota.Uid,
  76. RewardSymbol: constant.CoinSymbolTD,
  77. SymbolUsdPrice: price,
  78. CapitalUsd: dailyProfit,
  79. RewardRatio: ratio,
  80. RewardUsdValue: usdProfit,
  81. RewardQuantity: profit,
  82. RewardPeriod: jobDate,
  83. RewardDate: jobDate,
  84. }
  85. profitRecord := s.BuildUserProfitRecord(profitInfo, bs)
  86. profitRecord.State = entity.ProfitSendStateSuccess
  87. txDb := s.DB().Begin()
  88. if err = txDb.Create(&profitRecord).Error; err != nil {
  89. txDb.Rollback()
  90. continue
  91. }
  92. if err = s.GenBillAndActionAsset(txDb, quota.UserId, constant.CoinSymbolTD, decimal.Zero.Add(profit), decimal.Zero, bs); err != nil {
  93. txDb.Rollback()
  94. continue
  95. }
  96. txDb.Commit()
  97. }
  98. return nil
  99. }