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 }