01_cal_current_profit.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package period_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. "gorm.io/gorm"
  11. )
  12. func (s *Service) calCurrentStakeProfit(periodNo string) error {
  13. records, err := s.BatchStakeUserCurrentOrder(s.DB().
  14. Where("usd_amount > 0").
  15. Where("last_profit_period < ?", periodNo))
  16. if err != nil {
  17. return err
  18. }
  19. dailyJobDate, err := utils.PeriodNoToDailyDate(periodNo) // 期任务格式转化为 日任务格式
  20. if err != nil {
  21. return err
  22. }
  23. core.JobLog.Infof("当期活期待计算收益数量:%d", len(records))
  24. productInfo, err := s.FirstStakeProduct(s.DB().Where("pledge_mode", entity.StakeProductTypeCurrent))
  25. if err != nil {
  26. core.JobLog.Errorf(err.Error())
  27. return err
  28. }
  29. price, err := exchange.GetCurrentSymbolUsdPrice(constant.CoinSymbolTD)
  30. if err != nil {
  31. core.JobLog.Errorf(err.Error())
  32. return err
  33. }
  34. profitRatio := productInfo.PeriodProfitRatio
  35. profitRecords := make([]*entity.UserProfitRecord, 0)
  36. core.JobLog.Infof("活期收益 price:%s profitRatio:%s", price, profitRatio)
  37. totalProfitQuantity := decimal.Zero
  38. totalProfitUsdAmount := decimal.Zero
  39. var ids []int64
  40. for _, item := range records {
  41. usdProfit := item.UsdAmount.Mul(profitRatio) // USD收益
  42. symbolProfit := usdProfit.Div(price) // 币收益数量
  43. bs := constant.BsById(constant.BsCurrentStaticProfit)
  44. bs.ContextValue = fmt.Sprintf("%d", item.Id)
  45. bs.ContextName = item.TableName()
  46. bs.Desc = fmt.Sprintf("期:%s-usdAmount%s-profitRatio:%s-usdProfit:%s-Price:%s-SymbolProfit:%s", periodNo, item.UsdAmount, profitRatio, usdProfit, price, symbolProfit)
  47. profitInfo := &entity.ProfitInfo{
  48. RawUserId: item.UserId,
  49. RawUserUid: item.Uid,
  50. RewardUserId: item.UserId,
  51. RewardUserUid: item.Uid,
  52. RewardSymbol: constant.CoinSymbolTD,
  53. SymbolUsdPrice: price,
  54. CapitalUsd: item.UsdAmount,
  55. RewardRatio: profitRatio,
  56. RewardUsdValue: usdProfit,
  57. RewardQuantity: symbolProfit,
  58. RewardPeriod: periodNo,
  59. RewardDate: dailyJobDate,
  60. }
  61. profitRecord := s.BuildUserProfitRecord(profitInfo, bs)
  62. profitRecords = append(profitRecords, profitRecord)
  63. totalProfitUsdAmount = totalProfitUsdAmount.Add(usdProfit)
  64. totalProfitQuantity = totalProfitQuantity.Add(symbolProfit)
  65. ids = append(ids, item.Id)
  66. }
  67. if len(profitRecords) > 0 {
  68. txDb := s.DB().Begin()
  69. err = txDb.CreateInBatches(profitRecords, 200).Error
  70. if err != nil {
  71. txDb.Rollback()
  72. return err
  73. }
  74. err = txDb.Model(&entity.StakeUserCurrentOrder{}).
  75. Where("id in (?)", ids).
  76. Updates(map[string]interface{}{
  77. "last_profit_period": periodNo,
  78. "version": gorm.Expr("version + 1"),
  79. }).Error
  80. if err != nil {
  81. txDb.Rollback()
  82. return err
  83. }
  84. updateStm := txDb.Model(&entity.StakePeriodJob{}).
  85. Where("period_no", periodNo).
  86. Where("job_state", entity.PeriodJobStateRunning).
  87. Updates(map[string]interface{}{
  88. "price": price,
  89. "static_symbol_profit": totalProfitQuantity,
  90. "static_usd_profit": totalProfitUsdAmount,
  91. })
  92. if updateStm.RowsAffected != 1 || updateStm.Error != nil {
  93. txDb.Rollback()
  94. return err
  95. }
  96. utils.Today20060102Format()
  97. dailyStm := txDb.Model(&entity.SysJob{}).
  98. Where("job_date", dailyJobDate).
  99. Updates(map[string]interface{}{
  100. "today_static_profit": gorm.Expr("today_static_profit + ?", totalProfitQuantity),
  101. "today_static_usd_profit": gorm.Expr("today_static_profit + ?", totalProfitUsdAmount),
  102. })
  103. if dailyStm.RowsAffected != 1 || dailyStm.Error != nil {
  104. txDb.Rollback()
  105. return err
  106. }
  107. txDb.Commit()
  108. }
  109. return nil
  110. }