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
+443
View File
@@ -0,0 +1,443 @@
package prizemod
import (
"91porn-server/models/v/taskrecordmod"
"91porn-server/models/v/videocoupon"
"errors"
"fmt"
"time"
"91porn-server/common/db"
"91porn-server/models/v/backpackmod"
"91porn-server/models/v/productmod"
"91porn-server/models/v/txnmod"
"91porn-server/models/v/usermod"
"91porn-server/models/v/walletmod"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type PrizeHanlder interface {
Run(t *db.MongoTool) error
GetTransactionLog() []txnmod.TransactionLog
}
func Run(uid uint64, p Prize, transType txnmod.TransType) (PrizeHanlder, error) {
switch p.Type {
case CurrentValue:
return newAddCurrentValue(uid, p, transType), nil
case Gold:
return newAddGold(uid, p, transType), nil
case VIPCard:
u, err := usermod.FindUserByUID(uid)
if err != nil {
return nil, err
}
// 查询会员卡详情
productDetail, err := productmod.FindProduct(p.VIPCardID, "android")
if err != nil {
return nil, err
}
if productDetail == nil {
return nil, fmt.Errorf("product not found. id: %v", p.VIPCardID)
}
return newAddVIPCard(u, p, transType, productDetail), nil
case VIPDiscount:
return newAddVIPDiscount(uid, p, transType), nil
case InKind:
return nil, nil
case Integral:
return newAddIntegral(uid, p, transType), nil
case AIUndress:
return newAddAIUndress(uid, p, transType), nil
case AIChangeFace:
return newAddAIChangeFace(uid, p, transType), nil
case VideoCoupon:
return newAddVideoCoupon(uid, p, transType), nil
default:
return nil, errors.New("未知类型")
}
}
// 新增活跃值
type addCurrentValue struct {
uid uint64
p Prize
transType txnmod.TransType
}
// 处理程序初始化
func newAddCurrentValue(uid uint64, p Prize, transType txnmod.TransType) PrizeHanlder {
return &addCurrentValue{
uid: uid,
p: p,
transType: transType,
}
}
// 运行
func (h *addCurrentValue) Run(t *db.MongoTool) error {
return taskrecordmod.CurrentValueUpdate(t, h.uid, h.p.Value)
}
// 资金流水记录
func (h *addCurrentValue) GetTransactionLog() []txnmod.TransactionLog {
return nil
}
// 新增金币
type addGold struct {
uid uint64
p Prize
transType txnmod.TransType
wallet *walletmod.Wallet
}
// 处理程序初始化
func newAddGold(uid uint64, p Prize, transType txnmod.TransType) PrizeHanlder {
return &addGold{
uid: uid,
p: p,
transType: transType,
}
}
// 运行
func (h *addGold) Run(t *db.MongoTool) error {
walletInfo, err := walletmod.CreditAmount(t, h.p.Price, h.uid)
if err != nil {
return err
}
h.wallet = walletInfo
return nil
}
// 资金流水记录
func (h *addGold) GetTransactionLog() []txnmod.TransactionLog {
return []txnmod.TransactionLog{txnmod.TransactionLog{
TransNo: primitive.NewObjectID(),
UID: h.uid,
Amount: h.p.Price,
ActualAmount: float64(h.p.Price),
TranType: h.transType.Key(),
TranTypeInt: int64(h.transType),
Desc: fmt.Sprintf("%s-金币[%d个]", h.transType.Key(), h.p.Price),
RealAmount: h.wallet.RealAmount(),
}}
}
// 会员卡处理
type addVIPCard struct {
u *usermod.User
p Prize
transType txnmod.TransType
productDetail *productmod.Product
}
// 处理程序初始化
func newAddVIPCard(u *usermod.User, p Prize, transType txnmod.TransType, productDetail *productmod.Product) PrizeHanlder {
return &addVIPCard{
u: u,
p: p,
transType: transType,
productDetail: productDetail,
}
}
// 运行
func (h *addVIPCard) Run(t *db.MongoTool) error {
vipExpire, vipLevel, payVidDiscount := checkVipRenew(h.u, h.productDetail)
sel := usermod.UserSelector{VipExpireDate: &vipExpire, VipLevel: &vipLevel, PayVidDiscount: &payVidDiscount}
if h.productDetail.GoldVideoFreeDay > 0 {
expire := time.Time{}
if h.u.GoldVideoFreeExpire.IsZero() || h.u.GoldVideoFreeExpire.Before(time.Now()) {
expire = time.Now().AddDate(0, 0, h.productDetail.GoldVideoFreeDay)
} else {
expire = h.u.GoldVideoFreeExpire.AddDate(0, 0, h.productDetail.GoldVideoFreeDay)
}
sel.GoldVideoFreeExpire = &expire
}
if err := usermod.UpdateVIP(t, h.u.UID, h.u.VipExpireDate, sel); err != nil {
return err
}
return nil
}
// 资金流水记录
func (h *addVIPCard) GetTransactionLog() (out []txnmod.TransactionLog) {
return []txnmod.TransactionLog{txnmod.TransactionLog{
TransNo: primitive.NewObjectID(),
UID: h.u.UID,
Amount: h.p.Price,
ActualAmount: float64(h.p.Price),
TranType: h.transType.Key(),
TranTypeInt: int64(h.transType),
Desc: fmt.Sprintf("%s-VIP[%d天]", h.transType.Key(), h.productDetail.Duration),
}}
}
func checkVipRenew(u *usermod.User, p *productmod.Product) (time.Time, int, int) {
now := time.Now()
var end time.Time
level := u.VipLevel
payVidDiscount := u.PayVidDiscount
d := time.Hour * 24 * time.Duration(p.Duration)
if u.VipExpireDate.After(now) { //renew
end = u.VipExpireDate.Add(d)
} else {
end = now.Add(time.Duration(d))
}
if p.VipLevel > level { //当前用户的vip等级比这次购买的大,使用用户的
level = p.VipLevel
}
if p.PayVidDiscount > 0 && p.PayVidDiscount < payVidDiscount {
payVidDiscount = p.PayVidDiscount
}
return end, level, payVidDiscount
}
// 会员折扣卷处理
type addVIPDiscount struct {
uid uint64
p Prize
transType txnmod.TransType
}
// 处理程序初始化
func newAddVIPDiscount(uid uint64, p Prize, transType txnmod.TransType) PrizeHanlder {
return &addVIPDiscount{
uid: uid,
p: p,
transType: transType,
}
}
// 运行
func (h *addVIPDiscount) Run(t *db.MongoTool) error {
goodsList := make([]backpackmod.Backpack, h.p.Count)
now := time.Now()
for i := 0; i < int(h.p.Count); i++ {
goodsList[i] = backpackmod.Backpack{
UID: h.uid,
GoodsName: h.p.Name,
GoodsType: backpackmod.VIPDiscount,
GoodsValue: h.p.Value,
GoodsOrigin: h.transType.Key(),
GoodsDesc: h.p.Desc,
Status: backpackmod.Unused,
ExpiredTime: now.AddDate(0, 0, int(h.p.ValidityTime)),
CreateTime: now,
}
}
return backpackmod.AddGoodsMany(t, h.uid, goodsList)
}
// 资金流水记录
func (h *addVIPDiscount) GetTransactionLog() []txnmod.TransactionLog {
return nil
}
// addIntegral 新增积分
type addIntegral struct {
uid uint64
p Prize
transType txnmod.TransType
wallet *walletmod.Wallet
}
// newAddIntegral 处理程序初始化
func newAddIntegral(uid uint64, p Prize, transType txnmod.TransType) PrizeHanlder {
return &addIntegral{
uid: uid,
p: p,
transType: transType,
}
}
// Run 运行
func (h *addIntegral) Run(t *db.MongoTool) error {
walletInfo, err := walletmod.CreditIntegral(t, h.p.Price, h.uid)
if err != nil {
return err
}
h.wallet = walletInfo
return nil
}
// GetTransactionLog 资金流水记录
func (h *addIntegral) GetTransactionLog() []txnmod.TransactionLog {
return []txnmod.TransactionLog{txnmod.TransactionLog{
TransNo: primitive.NewObjectID(),
UID: h.uid,
Integral: h.p.Price,
ActualIntegral: float64(h.p.Price),
TranType: h.transType.Key(),
TranTypeInt: int64(h.transType),
Desc: fmt.Sprintf("%s-积分[%d个]", h.transType.Key(), h.p.Price),
RealIntegral: h.wallet.RealIntegral(),
}}
}
// ---------------------------
// addAIUndress 新增ai脱衣次数
type addAIUndress struct {
uid uint64
p Prize
transType txnmod.TransType
wallet *walletmod.Wallet
}
// newAddAIUndress 处理程序初始化
func newAddAIUndress(uid uint64, p Prize, transType txnmod.TransType) PrizeHanlder {
return &addAIUndress{
uid: uid,
p: p,
transType: transType,
}
}
// Run 运行
func (h *addAIUndress) Run(t *db.MongoTool) error {
count := int64(h.p.Count)
price := h.p.Price
aiUndressFreeTimes := count * price
p := walletmod.CreditPlan{}
p.AiUndressFreeTimes = &aiUndressFreeTimes
walletInfo, err := walletmod.Credit(t, p, h.uid)
if err != nil {
return err
}
h.wallet = walletInfo
return nil
}
// GetTransactionLog 资金流水记录
func (h *addAIUndress) GetTransactionLog() []txnmod.TransactionLog {
return []txnmod.TransactionLog{txnmod.TransactionLog{
TransNo: primitive.NewObjectID(),
UID: h.uid,
Amount: int64(h.p.Count),
ActualAmount: float64(h.p.Count),
TranType: h.transType.Key(),
TranTypeInt: int64(h.transType),
Desc: fmt.Sprintf("%s-AI脱衣次数[%v次]", h.transType.Key(), h.p.Count),
RealAmount: h.wallet.RealAmount(),
}}
}
// ---------------------------
// addAIChangeFace 新增ai换脸次数
type addAIChangeFace struct {
uid uint64
p Prize
transType txnmod.TransType
wallet *walletmod.Wallet
}
// newAddAIChangeFace 处理程序初始化
func newAddAIChangeFace(uid uint64, p Prize, transType txnmod.TransType) PrizeHanlder {
return &addAIChangeFace{
uid: uid,
p: p,
transType: transType,
}
}
// Run 运行
func (h *addAIChangeFace) Run(t *db.MongoTool) error {
count := int64(h.p.Count)
price := h.p.Price
aiChangeFaceImgFreeTimes := count * price
p := walletmod.CreditPlan{}
p.AiUndressFreeTimes = &aiChangeFaceImgFreeTimes
walletInfo, err := walletmod.Credit(t, p, h.uid)
if err != nil {
return err
}
h.wallet = walletInfo
return nil
}
// GetTransactionLog 资金流水记录
func (h *addAIChangeFace) GetTransactionLog() []txnmod.TransactionLog {
return []txnmod.TransactionLog{txnmod.TransactionLog{
TransNo: primitive.NewObjectID(),
UID: h.uid,
Amount: int64(h.p.Count),
ActualAmount: float64(h.p.Count),
TranType: h.transType.Key(),
TranTypeInt: int64(h.transType),
Desc: fmt.Sprintf("%s-AI图片换脸次数[%v次]", h.transType.Key(), h.p.Count),
RealAmount: h.wallet.RealAmount(),
}}
}
// ---------------------------
// addVideoCoupon 新增观影券
type addVideoCoupon struct {
uid uint64
p Prize
transType txnmod.TransType
wallet *walletmod.Wallet
}
// newAddVideoCoupon 处理程序初始化
func newAddVideoCoupon(uid uint64, p Prize, transType txnmod.TransType) PrizeHanlder {
return &addVideoCoupon{
uid: uid,
p: p,
transType: transType,
}
}
// Run 运行
func (h *addVideoCoupon) Run(t *db.MongoTool) error {
now := time.Now()
for i := 0; i < int(h.p.Count); i++ {
videoCoupon := videocoupon.UserGoldVideoCoupon{
UID: h.uid,
Num: int(h.p.Price),
Used: false,
Source: videocoupon.GoldVideoCouponSourceSign,
UpdatedAt: now,
CreatedAt: now,
}
if err := videocoupon.InsertOne(videoCoupon); err != nil {
continue
}
backpack := backpackmod.Backpack{
UID: h.uid,
GoodsType: backpackmod.SIGNCoupon,
GoodsValue: int64(videoCoupon.Num),
GoodsOrigin: string(videocoupon.GoldVideoCouponSourceSign),
Status: backpackmod.Unused,
ExpiredTime: now.AddDate(0, 0, 7),
CreateTime: now,
}
err := backpackmod.AddGoods(nil, h.uid, backpack)
if err != nil {
continue
}
}
walletInfo, err := walletmod.GetWallet(h.uid)
if err != nil {
return err
}
h.wallet = walletInfo
return nil
}
// GetTransactionLog 资金流水记录
func (h *addVideoCoupon) GetTransactionLog() []txnmod.TransactionLog {
return []txnmod.TransactionLog{txnmod.TransactionLog{
TransNo: primitive.NewObjectID(),
UID: h.uid,
Amount: int64(h.p.Count),
ActualAmount: float64(h.p.Count),
TranType: h.transType.Key(),
TranTypeInt: int64(h.transType),
Desc: fmt.Sprintf("%s-观影券[面额%v,%d张]", h.transType.Key(), h.p.Price, h.p.Count),
RealAmount: h.wallet.RealAmount(),
}}
}