Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+212
View File
@@ -0,0 +1,212 @@
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
}