@@ -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:用户选择的观影券面值(金币数)。
|
||||
// videoCoupons:H5改版重构后的观影券,传入的 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
|
||||
}
|
||||
Reference in New Issue
Block a user