Files
huangguo_server/app/service/productser/tool.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

213 lines
5.9 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 productser
import (
"91porn-server/common/log"
"91porn-server/common/stderr"
"91porn-server/models/commod"
"91porn-server/models/v/prdcthsomod"
"91porn-server/models/v/productmod"
"91porn-server/models/v/usermod"
"91porn-server/models/v/videocoupon"
"time"
)
// formatMoney 生成支付通道支持的金额
func formatMoney(price int64) int64 {
if price <= 0 {
return 0
}
if price <= 300 {
return 300
}
if price <= 500 {
return 500
}
for i := 1; i < 10; i++ {
if price <= int64(i*1000) {
return int64(i * 1000)
}
}
return price
}
func CheckUserUpgradeProducts(uid uint64, vips []productmod.Product) {
// 获取当前用户VIP信息
user, uErr := usermod.FindUserByUID(uid)
if uErr != nil {
log.Error("CheckUserUpgrade FindUserByUID Error", log.Any("uid", uid))
return
}
if !user.IsVIP(time.Now()) {
return
}
// 替换产品升级价格
lastPID, lastVipName, lastAmount := prdcthsomod.GetUserLastVip(uid)
if lastPID.IsZero() || lastAmount < 500 {
return
}
for i, p := range vips {
vips[i].PurchasePrice = p.DiscountedPrice
if !p.CheckUpgrade(lastPID) {
continue
}
switch p.ProductType {
case commod.VIP, commod.NEWUSERCard:
if lastAmount >= p.DiscountedPrice {
continue
}
case commod.AdvanceCard:
if lastAmount >= p.AdvanceAmount {
continue
}
realPriceAdv := formatMoney(p.AdvanceAmount - lastAmount)
vips[i].AdvanceAmount = realPriceAdv
default:
continue
}
vips[i].IsUpgrade = true
realPrice := formatMoney(p.DiscountedPrice - lastAmount)
vips[i].DiscountedPrice = realPrice
vips[i].DiscountedPriceAnd = &realPrice
vips[i].DiscountedPriceIos = &realPrice
vips[i].CurrentVipName = lastVipName
vips[i].CurrentVipPrice = lastAmount
}
}
// CheckUserUpgrade 检查用户当前VIP是否为升级
func CheckUserUpgrade(uid uint64, product *productmod.Product) {
// 获取当前用户VIP信息
user, uErr := usermod.FindUserByUID(uid)
if uErr != nil {
log.Error("CheckUserUpgrade FindUserByUID Error", log.Any("uid", uid))
return
}
if !user.IsVIP(time.Now()) {
return
}
// 替换产品升级价格
lastPID, lastVipName, lastAmount := prdcthsomod.GetUserLastVip(uid)
if lastPID.IsZero() || lastAmount < 500 {
return
}
product.PurchasePrice = product.DiscountedPrice
if !product.CheckUpgrade(lastPID) {
return
}
switch product.ProductType {
case commod.VIP, commod.NEWUSERCard:
if lastAmount >= product.DiscountedPrice {
return
}
case commod.AdvanceCard:
if lastAmount >= product.AdvanceAmount {
return
}
realPriceAdv := formatMoney(product.AdvanceAmount - lastAmount)
product.AdvanceAmount = realPriceAdv
default:
return
}
realPrice := formatMoney(product.DiscountedPrice - lastAmount)
product.IsUpgrade = true
product.DiscountedPrice = realPrice
product.DiscountedPriceAnd = &realPrice
product.DiscountedPriceIos = &realPrice
product.CurrentVipName = lastVipName
product.CurrentVipPrice = lastAmount
}
// 金币视频抵用券业务处理
func GoldVideoCoupleHandler(p *productmod.Product, u *usermod.User, sel usermod.UserSelector) usermod.UserSelector {
goldVideoCoupon := make([]usermod.UserGoldVideoCoupon, 0)
//存在
coupon_bool := true
//处理相同面值优惠券, 券数量相加
if u.GoldVideoCoupon != nil && len(u.GoldVideoCoupon) > 0 {
goldVideoCoupon = u.GoldVideoCoupon
for index, gvc := range goldVideoCoupon {
if gvc.Gold == p.GoldVideoCouponNum {
goldVideoCoupon[index].Count += p.GoldVideoCouponCount
coupon_bool = false
break
}
}
}
//用户不存在当前面值的优惠券, 则新增
if coupon_bool {
goldVideoCoupon = append(goldVideoCoupon, usermod.UserGoldVideoCoupon{
Gold: p.GoldVideoCouponNum,
Count: p.GoldVideoCouponCount,
})
}
if len(goldVideoCoupon) > 0 {
sel.GoldVideoCoupon = &goldVideoCoupon
}
return sel
}
// HandleGoldVideoCoupon 处理观影券。source表示观影券来源,如购买VIP。
func HandleGoldVideoCoupon(p *productmod.Product, uid uint64, source videocoupon.GoldVideoCouponSource) []videocoupon.UserGoldVideoCoupon {
if p.GoldVideoCouponNum <= 0 {
return nil
}
// 该产品设置了附赠观影券
coupons := make([]videocoupon.UserGoldVideoCoupon, p.GoldVideoCouponCount)
for i := 0; i < p.GoldVideoCouponCount; i++ {
coupons[i] = videocoupon.UserGoldVideoCoupon{
UID: uid,
Num: p.GoldVideoCouponNum,
Used: false,
Source: source,
}
}
return coupons
}
// CheckGoldVideoCoupon 校验用户选择的观影券是否符合要求
// userChoose:用户选择的观影券面值(金币数)。
// videoCouponsH5改版重构后的观影券,传入的 UserGoldVideoCoupon 均保证面值与用户的选择相等。
// 返回bool值: true 表示用户未选择观影券; false 表示用户未选择观影券
func CheckGoldVideoCoupon(userChoose, videoCoins int64, u *usermod.User, videoCoupons []videocoupon.UserGoldVideoCoupon) (bool, stderr.Code) {
if userChoose <= 0 { // 用户未选择观影券
return false, stderr.Success
}
if userChoose < videoCoins {
// 用户选择的观影券面值不够
return false, stderr.GoldVideoCoupleAmountErr
}
// u.GoldVideoCoupon 老版观影券数据结构, 需做兼容并判断观影券金额是否足够
// videoCoupons 新版(H5改版重构后)观影券数据结构, 无需进行金额判定
if len(u.GoldVideoCoupon) <= 0 && len(videoCoupons) <= 0 {
// 新老版数据结构皆显示用户无观影券可用
return false, stderr.GoldVideoCoupleNotExist
}
// 先在老版观影券结构中寻找是否有合适观影券
for _, coupon := range u.GoldVideoCoupon {
if coupon.Count > 0 && int64(coupon.Gold) >= userChoose {
return true, stderr.Success
}
}
// 若老版观影券结构中未找到, 则从新版观影券结构中寻找
if len(videoCoupons) > 0 {
// 找到新版观影券
return true, stderr.Success
}
// 新老版数据结构中皆未找到用户观影券
return false, stderr.GoldVideoCoupleNotExist
}