103 lines
2.8 KiB
Go
103 lines
2.8 KiB
Go
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
|
|
}
|