bindbox-game/internal/service/user/points_convert.go
2026-02-08 17:19:27 +08:00

63 lines
1.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package user
import (
"context"
"fmt"
)
// getExchangeRate 获取积分兑换比率
// 配置含义1 元 = X 积分(后台配置的值)
// 计算:分 / (100 / rate) = 分 * rate / 100
// 当 rate=1 时1元=1积分100分=1积分
// 当 rate=2 时1元=2积分50分=1积分
func (s *service) getExchangeRate(ctx context.Context) int64 {
// 读取后台配置的 keypoints.exchange_rate
cfg, _ := s.readDB.SystemConfigs.WithContext(ctx).Where(s.readDB.SystemConfigs.ConfigKey.Eq("points.exchange_rate")).First()
rate := int64(1) // 默认 1 元 = 1 积分
if cfg != nil {
var r int64
_, _ = fmt.Sscanf(cfg.ConfigValue, "%d", &r)
if r > 0 {
rate = r
}
}
return rate
}
// CentsToPointsFloat 分 → 积分(浮点数,用于 API 返回展示)
// 公式:积分 = 分 * rate / 100
// 例如rate=1, 3580分 → 35.8积分
// CentsToPointsFloat 分 → 积分(浮点数,用于 API 返回展示)
// 公式:积分 = 分 * rate / 100
// 例如rate=1, 3580分 → 35.8积分
func (s *service) CentsToPointsFloat(ctx context.Context, cents int64) float64 {
if cents == 0 {
return 0
}
rate := s.getExchangeRate(ctx)
return float64(cents) * float64(rate) / 100
}
// CentsToPoints 分 → 积分(整数,向下取整,用于计算)
// 公式:积分 = 分 * rate / 100
func (s *service) CentsToPoints(ctx context.Context, cents int64) (int64, error) {
if cents <= 0 {
return 0, nil
}
rate := s.getExchangeRate(ctx)
return (cents * rate) / 100, nil
}
// PointsToCents 积分 → 分(用于将用户输入的积分转为分)
// 公式:分 = 积分 * 100 / rate
func (s *service) PointsToCents(ctx context.Context, pts int64) (int64, error) {
if pts <= 0 {
return 0, nil
}
rate := s.getExchangeRate(ctx)
if rate == 0 {
rate = 1
}
return (pts * 100) / rate, nil
}