| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package period_profit
- import (
- "app/commons/constant"
- "app/commons/core"
- "app/commons/core/exchange"
- "app/commons/model/entity"
- "app/commons/utils"
- "fmt"
- "github.com/shopspring/decimal"
- "gorm.io/gorm"
- )
- func (s *Service) calCurrentStakeProfit(periodNo string) error {
- records, err := s.BatchStakeUserCurrentOrder(s.DB().
- Where("usd_amount > 0").
- Where("last_profit_period < ?", periodNo))
- if err != nil {
- return err
- }
- dailyJobDate, err := utils.PeriodNoToDailyDate(periodNo) // 期任务格式转化为 日任务格式
- if err != nil {
- return err
- }
- core.JobLog.Infof("当期活期待计算收益数量:%d", len(records))
- productInfo, err := s.FirstStakeProduct(s.DB().Where("pledge_mode", entity.StakeProductTypeCurrent))
- if err != nil {
- core.JobLog.Errorf(err.Error())
- return err
- }
- price, err := exchange.GetCurrentSymbolUsdPrice(constant.CoinSymbolTD)
- if err != nil {
- core.JobLog.Errorf(err.Error())
- return err
- }
- profitRatio := productInfo.PeriodProfitRatio
- profitRecords := make([]*entity.UserProfitRecord, 0)
- core.JobLog.Infof("活期收益 price:%s profitRatio:%s", price, profitRatio)
- totalProfitQuantity := decimal.Zero
- totalProfitUsdAmount := decimal.Zero
- var ids []int64
- for _, item := range records {
- usdProfit := item.UsdAmount.Mul(profitRatio) // USD收益
- symbolProfit := usdProfit.Div(price) // 币收益数量
- bs := constant.BsById(constant.BsCurrentStaticProfit)
- bs.ContextValue = fmt.Sprintf("%d", item.Id)
- bs.ContextName = item.TableName()
- bs.Desc = fmt.Sprintf("期:%s-usdAmount%s-profitRatio:%s-usdProfit:%s-Price:%s-SymbolProfit:%s", periodNo, item.UsdAmount, profitRatio, usdProfit, price, symbolProfit)
- profitInfo := &entity.ProfitInfo{
- RawUserId: item.UserId,
- RawUserUid: item.Uid,
- RewardUserId: item.UserId,
- RewardUserUid: item.Uid,
- RewardSymbol: constant.CoinSymbolTD,
- SymbolUsdPrice: price,
- CapitalUsd: item.UsdAmount,
- RewardRatio: profitRatio,
- RewardUsdValue: usdProfit,
- RewardQuantity: symbolProfit,
- RewardPeriod: periodNo,
- RewardDate: dailyJobDate,
- }
- profitRecord := s.BuildUserProfitRecord(profitInfo, bs)
- profitRecords = append(profitRecords, profitRecord)
- totalProfitUsdAmount = totalProfitUsdAmount.Add(usdProfit)
- totalProfitQuantity = totalProfitQuantity.Add(symbolProfit)
- ids = append(ids, item.Id)
- }
- if len(profitRecords) > 0 {
- txDb := s.DB().Begin()
- err = txDb.CreateInBatches(profitRecords, 200).Error
- if err != nil {
- txDb.Rollback()
- return err
- }
- err = txDb.Model(&entity.StakeUserCurrentOrder{}).
- Where("id in (?)", ids).
- Updates(map[string]interface{}{
- "last_profit_period": periodNo,
- "version": gorm.Expr("version + 1"),
- }).Error
- if err != nil {
- txDb.Rollback()
- return err
- }
- updateStm := txDb.Model(&entity.StakePeriodJob{}).
- Where("period_no", periodNo).
- Where("job_state", entity.PeriodJobStateRunning).
- Updates(map[string]interface{}{
- "price": price,
- "static_symbol_profit": totalProfitQuantity,
- "static_usd_profit": totalProfitUsdAmount,
- })
- if updateStm.RowsAffected != 1 || updateStm.Error != nil {
- txDb.Rollback()
- return err
- }
- utils.Today20060102Format()
- dailyStm := txDb.Model(&entity.SysJob{}).
- Where("job_date", dailyJobDate).
- Updates(map[string]interface{}{
- "today_static_profit": gorm.Expr("today_static_profit + ?", totalProfitQuantity),
- "today_static_usd_profit": gorm.Expr("today_static_profit + ?", totalProfitUsdAmount),
- })
- if dailyStm.RowsAffected != 1 || dailyStm.Error != nil {
- txDb.Rollback()
- return err
- }
- txDb.Commit()
- }
- return nil
- }
|