package rechargereward import ( "context" "strings" ) var rechargeRewardOrderPlatforms = []string{ "GOOGLE", "PAYER_MAX", "AIRWALLEX", "PAYNICORN", "STRIPE", "PAY_PAL", "CLIPSPAY", } type rechargeRewardAmountRow struct { RechargeAmountCents int64 `gorm:"column:recharge_amount_cents"` } func (s *Service) loadCurrentRechargeCents(ctx context.Context, sysOrigin string, userID int64, period rechargeRewardPeriod) (int64, error) { if userID <= 0 { return 0, nil } sysOrigin = strings.ToUpper(strings.TrimSpace(sysOrigin)) startAt := rechargeRewardStorageTime(period.StartAt, s.storageLocation) endAt := rechargeRewardStorageTime(period.EndAt, s.storageLocation) coinSellerGoldPerUSD := s.cfg.RechargeReward.CoinSellerGoldPerUSD if coinSellerGoldPerUSD <= 0 { coinSellerGoldPerUSD = 100000 } const query = ` SELECT CAST(IFNULL(SUM(source.amount_cents), 0) AS SIGNED) AS recharge_amount_cents FROM ( SELECT CAST(ROUND(SUM(IFNULL(t.unit_price, 0)) * 100, 0) AS SIGNED) AS amount_cents FROM order_purchase_history AS t INNER JOIN user_base_info AS u ON u.id = t.user_id WHERE t.evn = 'PROD' AND t.is_trial_period = 0 AND t.status = 'COMPLETE' AND t.pay_platform IN ? AND (u.is_del = 0 OR u.is_del IS NULL) AND UPPER(TRIM(u.origin_sys)) = ? AND t.user_id = ? AND t.create_time >= ? AND t.create_time < ? UNION ALL SELECT CAST(ROUND(SUM(IFNULL(t.compute_usd_amount, 0)) * 100, 0) AS SIGNED) AS amount_cents FROM order_user_purchase_pay AS t INNER JOIN user_base_info AS u ON u.id = t.user_id WHERE t.evn = 'PROD' AND t.factory_code = 'MIFA_PAY' AND t.pay_status = 'SUCCESSFUL' AND t.receipt_type = 'PAYMENT' AND t.refund_status = 'NONE' AND (u.is_del = 0 OR u.is_del IS NULL) AND UPPER(TRIM(u.origin_sys)) = ? AND t.user_id = ? AND IFNULL(t.update_time, t.create_time) >= ? AND IFNULL(t.update_time, t.create_time) < ? UNION ALL SELECT CAST(ROUND(SUM(IFNULL(t.quantity, 0) * 100 / ?), 0) AS SIGNED) AS amount_cents FROM likei_wallet.user_freight_balance_running_water AS t INNER JOIN user_base_info AS u ON u.id = t.accept_user_id WHERE t.origin = 'SHIPMENT' AND t.type = 1 AND t.accept_user_id IS NOT NULL AND IFNULL(t.quantity, 0) > 0 AND (u.is_del = 0 OR u.is_del IS NULL) AND UPPER(TRIM(u.origin_sys)) = ? AND t.accept_user_id = ? AND t.create_time >= ? AND t.create_time < ? ) AS source` var row rechargeRewardAmountRow if err := s.db.WithContext(ctx).Raw( query, rechargeRewardOrderPlatforms, sysOrigin, userID, startAt, endAt, sysOrigin, userID, startAt, endAt, coinSellerGoldPerUSD, sysOrigin, userID, startAt, endAt, ).Scan(&row).Error; err != nil { return 0, err } if row.RechargeAmountCents < 0 { return 0, nil } return row.RechargeAmountCents, nil }