03_dis_profit.go 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package period_profit
  2. import (
  3. "app/commons/constant"
  4. "app/commons/core"
  5. "app/commons/model/entity"
  6. "app/commons/utils"
  7. "fmt"
  8. "github.com/shopspring/decimal"
  9. "gorm.io/gorm"
  10. )
  11. func (s *Service) DisProfit() error {
  12. allRewards, err := s.BatchUserProfitRecord(s.DB().Where("state", entity.ProfitSendStateWaiting))
  13. if err != nil {
  14. return err
  15. }
  16. count := len(allRewards)
  17. for i, item := range allRewards {
  18. if i%10000 == 0 && i > 0 {
  19. core.JobLog.Infof("发放进度:%d/%d", i, count)
  20. }
  21. txDb := s.DB().Begin()
  22. bs := constant.BsById(item.BusinessNumber)
  23. bs.ContextName = item.TableName()
  24. bs.ContextValue = fmt.Sprintf("%d", item.Id)
  25. state := entity.ProfitSendStateSuccess
  26. // 根据业务场景
  27. // 1 静态写入订单池
  28. // 2 动态直接发放到资产钱包
  29. // todo:发放到待领取 -- 需计算上一轮发放时间 并计算出是否可继续发放
  30. if bs.BusinessNumber == constant.BsCurrentStaticProfit {
  31. // 检查是否满池
  32. currentOrder, err := s.CheckUserCurrentStakeUserOrder(txDb, item.RewardUserId, item.RewardUserUid)
  33. if err != nil {
  34. txDb.Rollback()
  35. core.JobLog.Errorf(err.Error())
  36. continue
  37. }
  38. if currentOrder.LastClaimPeriod == "" {
  39. currentOrder.LastClaimPeriod = utils.NowPeriodNo()
  40. }
  41. n := utils.CalPeriodNosSpan(currentOrder.LastClaimPeriod, item.RewardPeriod)
  42. core.JobLog.Infof("剩余%d期 未领取", n)
  43. if n >= 12 {
  44. state = entity.ProfitSendStateOverflow // 溢出
  45. } else {
  46. // LastProfitPeriod string `json:"lastProfitPeriod" gorm:"type:varchar(32);comment:最近产出期号"`
  47. // AvailableQuantity decimal.Decimal `json:"availableQuantity" gorm:"type:decimal(25,8);default:0;comment:待领取数量"`
  48. // AvailableUsdAmount decimal.Decimal `json:"availableUsdAmount" gorm:"type:decimal(25,8);default:0;comment:待领取价值"`
  49. updateStm := txDb.
  50. Debug().
  51. Model(&entity.StakeUserCurrentOrder{}).
  52. Where("id", currentOrder.Id).
  53. Where("version", currentOrder.Version).
  54. Updates(map[string]interface{}{
  55. "available_quantity": gorm.Expr("available_quantity + ?", item.RewardQuantity),
  56. "available_usd_amount": gorm.Expr("available_usd_amount + ?", item.RewardUsdValue),
  57. "last_profit_period": item.RewardPeriod,
  58. "version": gorm.Expr("version + 1"),
  59. })
  60. if updateStm.RowsAffected != 1 || updateStm.Error != nil {
  61. txDb.Rollback()
  62. core.JobLog.Errorf("update fail RowsAffected:%d err:%+v", updateStm.RowsAffected, updateStm.Error)
  63. continue
  64. }
  65. }
  66. } else {
  67. // 其他类型全部发放到资产钱包
  68. if err = s.GenBillAndActionAsset(txDb, item.RewardUserId, constant.CoinSymbolTD, item.RewardQuantity, decimal.Zero, bs); err != nil {
  69. txDb.Rollback()
  70. core.JobLog.Errorf(err.Error())
  71. continue
  72. }
  73. }
  74. // 发放记录状态修改
  75. err = txDb.Model(&entity.UserProfitRecord{}).
  76. Where("id", item.Id).
  77. Update("state", state).Error
  78. if err != nil {
  79. txDb.Rollback()
  80. core.JobLog.Errorf(err.Error())
  81. continue
  82. }
  83. txDb.Commit()
  84. }
  85. return nil
  86. }