package integral_config_ser import ( "91porn-server/app/appg" "91porn-server/common" "91porn-server/common/db" "91porn-server/common/log" "91porn-server/common/stderr" "91porn-server/models/v/backpackmod" "91porn-server/models/v/coupon_record_mod" "91porn-server/models/v/integralconfigmod" "91porn-server/models/v/integralexcangemod" "91porn-server/models/v/prdcthsomod" "91porn-server/models/v/txnmod" "91porn-server/models/v/usermod" "91porn-server/models/v/videocoupon" "91porn-server/models/v/walletmod" "fmt" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo/options" ) func GetAllConfig() []integralconfigmod.APPIntegralConfig { var data []integralconfigmod.APPIntegralConfig op := options.Find().SetSort(bson.M{"duration": 1}) filter := bson.M{"status": true} list, err := integralconfigmod.QueryAllList(filter, op) if err != nil { return data } if len(list) <= 0 { return data } for _, i := range list { appdata := integralconfigmod.APPIntegralConfig{ ID: i.ID, Name: i.Name, Type: i.Type, Desc: i.Desc, Price: i.Price, Img: i.Img, Duration: i.Duration, } data = append(data, appdata) } return data } func ExchangeIntegral(uid uint64, in *integralconfigmod.ExchangeIntegralReq) stderr.Code { user, err := usermod.FindUserByUID(uid) if err != nil { return stderr.ErrDbQueryError } if user == nil || user.ID.IsZero() { return stderr.UserIsNotExists } if user.HasBanned || user.HasLocked { return stderr.ErrAccountHasBinded } wallet, err := walletmod.GetWallet(uid) if err != nil { return stderr.ErrDbQueryError } if wallet.ID.IsZero() || wallet.Integral <= 0 { return stderr.InsufficientIntegral } id, err := primitive.ObjectIDFromHex(in.ID) if err != nil { return stderr.Failure } // 获取积分配置 config, err := integralconfigmod.FindOneById(id) if err != nil { return stderr.ErrDbQueryError } if config.ID.IsZero() { return stderr.CodeEmptyData } if config.Price > wallet.Integral { return stderr.InsufficientIntegral } var code stderr.Code switch config.Type { case integralconfigmod.VIPDate: // 1 VIP兑换 code = HandeExchangeVip(config, user) case integralconfigmod.AICount: // 2 AI黑科技卷 code = HandeExchangeAIUndressCount(config, user) //code = HandeExchangeAICount(config, user) case integralconfigmod.GoldCoinBonus: // 3 金币加赠券 code = HandeExchangeGoldCoinBonus(config, user) case integralconfigmod.GoldWatch: // 4 金币观影券 code = HandeExchangeGoldWatch(config, user) case integralconfigmod.InKind: // 5 实物奖励 code = HandeExchangeInKind(config, user, in) case integralconfigmod.FreeCount: // 6 幸运抽奖次数 code = HandeExchangeFreeCount(config, user) default: code = stderr.Success } return code } // HandeExchangeAIUndressCount 兑换ai脱衣次数 func HandeExchangeAIUndressCount(config integralconfigmod.IntegralConfig, user *usermod.User) (code stderr.Code) { uid := user.UID integral := -config.Price var creditPlan = walletmod.CreditPlan{Integral: &integral} undressTimes := config.EquivalentPrice creditPlan.AiUndressFreeTimes = &undressTimes if err := appg.VideoDB.Trans(func(t *db.MongoTool) error { var err error wallet, err := walletmod.Credit(t, creditPlan, uid) if err != nil { //扣钱 return err } txnLogs := []txnmod.TransactionLog{ { UID: uid, Integral: -config.Price, ActualIntegral: float64(-config.Price), TranType: txnmod.IntegralExchangeAICount.Key(), TranTypeInt: int64(txnmod.IntegralExchangeAICount), Desc: "积分兑换AI黑科技券-" + config.Name, SysType: user.SysType, RealIntegral: wallet.RealIntegral(), }, } if err = txnmod.InsertManyTransactionLog(t, txnLogs); err != nil { log.Warn(fmt.Sprintf("HandeExchangeAIUndressCount Transaction Log err %s", err.Error())) return err } return nil }); err != nil { log.Warn(fmt.Sprintf("HandeExchangeAIUndressCount Transaction err %s", err.Error())) return stderr.BuyFailed //通知消息 } return stderr.Success } // HandeExchangeAICount 积分兑换AI黑科技劵 func HandeExchangeAICount(config integralconfigmod.IntegralConfig, user *usermod.User) (code stderr.Code) { var ( goodsList []backpackmod.Backpack now = time.Now() uid = user.UID ) goodsList = append(goodsList, backpackmod.Backpack{ UID: user.UID, GoodsName: config.Name, GoodsType: backpackmod.AiChangeFaceDiscount, GoodsValue: config.EquivalentPrice, GoodsOrigin: "积分兑换AI黑科技劵", GoodsDesc: config.Desc, Status: backpackmod.Unused, ExpiredTime: now.AddDate(0, 0, int(config.Duration)), CreateTime: now, }) if err := appg.VideoDB.Trans(func(t *db.MongoTool) error { var err error wallet, err := walletmod.DebitIntegral(t, config.Price, uid) if err != nil { //扣钱 return err } if err := backpackmod.AddGoodsMany(t, uid, goodsList); err != nil { return err } txnLogs := []txnmod.TransactionLog{ { UID: uid, Integral: -config.Price, ActualIntegral: float64(-config.Price), TranType: txnmod.IntegralExchangeAICount.Key(), TranTypeInt: int64(txnmod.IntegralExchangeAICount), Desc: "积分兑换AI黑科技券-" + config.Name, SysType: user.SysType, RealIntegral: wallet.RealIntegral(), }, } if err = txnmod.InsertManyTransactionLog(t, txnLogs); err != nil { log.Warn(fmt.Sprintf("HandeExchangeAICount Transaction err %s", err.Error())) return err } return nil }); err != nil { log.Warn(fmt.Sprintf("HandeExchangeAICount Transaction err %s", err.Error())) return stderr.BuyFailed //通知消息 } return stderr.Success } // HandeExchangeGoldCoinBonus 积分兑换金币加赠券 func HandeExchangeGoldCoinBonus(config integralconfigmod.IntegralConfig, user *usermod.User) (code stderr.Code) { uid := user.UID // 保存用户优惠券 now := time.Now() cId := HandleCId(config.ID) // 获取观影券是否存在 c, err := coupon_record_mod.FindOneByCId(cId) if err != nil { return stderr.Failure } if !c.ID.IsZero() { return stderr.Failure } newCo := coupon_record_mod.CouponRecord{ CID: cId, UID: user.UID, UserName: user.Name, Name: config.Name, Count: 1, Price: config.EquivalentPrice, Type: coupon_record_mod.PrizeTypeGoldCoinBonus, Used: false, IsDelete: false, ExpireTime: now.Add(time.Hour * 24 * time.Duration(config.Duration)), } if err := appg.VideoDB.Trans(func(t *db.MongoTool) error { var err error wallet, err := walletmod.DebitIntegral(t, config.Price, uid) if err != nil { //扣钱 return err } txnLogs := []txnmod.TransactionLog{ { UID: uid, Integral: -config.Price, ActualIntegral: float64(-config.Price), TranType: txnmod.IntegralExchangeGoldCoinBonus.Key(), TranTypeInt: int64(txnmod.IntegralExchangeGoldCoinBonus), Desc: "积分兑换金币加赠券-" + config.Name, SysType: user.SysType, RealIntegral: wallet.RealIntegral(), }, } err = coupon_record_mod.InsertOne(newCo) if err != nil { return err } if err = txnmod.InsertManyTransactionLog(t, txnLogs); err != nil { log.Warn(fmt.Sprintf("HandeExchangeGoldCoinBonus Transaction err %s", err.Error())) return err } return nil }); err != nil { log.Warn(fmt.Sprintf("HandeExchangeGoldCoinBonus Transaction err %s", err.Error())) return stderr.BuyFailed //通知消息 } return stderr.Success } // HandeExchangeGoldWatch 积分兑换金币观影券 func HandeExchangeGoldWatch(config integralconfigmod.IntegralConfig, user *usermod.User) (code stderr.Code) { uid := user.UID var coupons []videocoupon.UserGoldVideoCoupon coupon := videocoupon.UserGoldVideoCoupon{ UID: uid, Num: int(config.EquivalentPrice), Used: false, Source: "积分兑换金币观影券", } coupons = append(coupons, coupon) if err := appg.VideoDB.Trans(func(t *db.MongoTool) error { var err error wallet, err := walletmod.DebitIntegral(t, config.Price, uid) if err != nil { //扣钱 return err } txnLogs := []txnmod.TransactionLog{ { UID: uid, Integral: -config.Price, ActualIntegral: float64(-config.Price), TranType: txnmod.IntegralExchangeGoldWatch.Key(), TranTypeInt: int64(txnmod.IntegralExchangeGoldWatch), Desc: "积分兑换金币观影券-" + config.Name, SysType: user.SysType, RealIntegral: wallet.RealIntegral(), }, } // 赠送观影券 if len(coupons) > 0 { if err := videocoupon.InsertMany(coupons); err != nil { return err } } if err = txnmod.InsertManyTransactionLog(t, txnLogs); err != nil { log.Warn(fmt.Sprintf("HandeExchangeGoldWatch Transaction err %s", err.Error())) return err } return nil }); err != nil { log.Warn(fmt.Sprintf("HandeExchangeGoldWatch Transaction err %s", err.Error())) return stderr.BuyFailed //通知消息 } return stderr.Success } // HandeExchangeFreeCount 积分兑换幸运抽奖次数 func HandeExchangeFreeCount(config integralconfigmod.IntegralConfig, user *usermod.User) (code stderr.Code) { uid := user.UID integral := -config.Price var creditPlan = walletmod.CreditPlan{Integral: &integral} lotteryTimes := config.EquivalentPrice creditPlan.LotteryTimes = &lotteryTimes if err := appg.VideoDB.Trans(func(t *db.MongoTool) error { var err error wallet, err := walletmod.Credit(t, creditPlan, uid) if err != nil { //扣钱 return err } txnLogs := []txnmod.TransactionLog{ { UID: uid, Integral: -config.Price, ActualIntegral: float64(-config.Price), TranType: txnmod.IntegralExchangeFreeCount.Key(), TranTypeInt: int64(txnmod.IntegralExchangeFreeCount), Desc: "积分兑换幸运抽奖次数-" + config.Name, SysType: user.SysType, RealIntegral: wallet.RealIntegral(), }, } if err = txnmod.InsertManyTransactionLog(t, txnLogs); err != nil { log.Warn(fmt.Sprintf("HandeExchangeFreeCount Transaction err %s", err.Error())) return err } return nil }); err != nil { log.Warn(fmt.Sprintf("HandeExchangeFreeCount Transaction err %s", err.Error())) return stderr.BuyFailed //通知消息 } return stderr.Success } // HandeExchangeVip 积分兑换VIP func HandeExchangeVip(config integralconfigmod.IntegralConfig, user *usermod.User) (code stderr.Code) { var vipExpire time.Time uid := user.UID now := time.Now() d := time.Hour * 24 * time.Duration(config.EquivalentPrice) if user.VipExpireDate.After(now) { //renew vipExpire = user.VipExpireDate.Add(d) } else { vipExpire = now.Add(d) } vipLevel := usermod.RenewVIPLevel(user.VipExpireDate, now, user.VipLevel, 1) sel := usermod.UserSelector{VipExpireDate: &vipExpire, VipLevel: &vipLevel} if err := appg.VideoDB.Trans(func(t *db.MongoTool) error { var err error wallet, err := walletmod.DebitIntegral(t, config.Price, uid) if err != nil { //扣钱 return err } history := prdcthsomod.ProductHistory{ //插入商品购买记录 ID: primitive.NewObjectID(), UID: uid, ProductID: config.ID, Name: config.Name, Amount: config.Price, Income: 0, ProductType: prdcthsomod.VIP, SysType: user.SysType, } if err = prdcthsomod.InsertProductHistory(t, &history); err != nil { return err } // 修改会员 if err = usermod.UpdateVIP(t, uid, user.VipExpireDate, sel); err != nil { return err } txnLogs := []txnmod.TransactionLog{ { UID: uid, Integral: -config.Price, ActualIntegral: float64(-config.Price), TranType: txnmod.IntegralExchangeVip.Key(), TranTypeInt: int64(txnmod.IntegralExchangeVip), TransNo: history.ID, Desc: "积分兑换VIP-" + config.Name, SysType: user.SysType, RealIntegral: wallet.RealIntegral(), }, } if err = txnmod.InsertManyTransactionLog(t, txnLogs); err != nil { log.Warn(fmt.Sprintf("HandeExchangeVip Transaction err %s", err.Error())) return err } return nil }); err != nil { log.Warn(fmt.Sprintf("HandeExchangeVip Transaction err %s", err.Error())) return stderr.BuyFailed //通知消息 } return stderr.Success } // HandeExchangeInKind 积分兑换实体 func HandeExchangeInKind(config integralconfigmod.IntegralConfig, user *usermod.User, in *integralconfigmod.ExchangeIntegralReq) (code stderr.Code) { //if in.Name == "" || in.Tel == "" || in.Address == "" { // return stderr.ErrParamError //} uid := user.UID now := time.Now() ie := integralexcangemod.IntegralExchange{ EID: config.ID, UID: user.UID, Portrait: user.Portrait, Name: in.Name, Tel: in.Tel, Address: in.Address, Status: integralexcangemod.PENDING, CreateTime: now, } if err := appg.VideoDB.Trans(func(t *db.MongoTool) error { var err error wallet, err := walletmod.DebitIntegral(t, config.Price, uid) if err != nil { //扣钱 return err } err = integralexcangemod.InsertOne(t, ie) if err != nil { return err } txnLogs := []txnmod.TransactionLog{ { UID: uid, Integral: -config.Price, ActualIntegral: float64(-config.Price), TranType: txnmod.IntegralExchangeInKind.Key(), TranTypeInt: int64(txnmod.IntegralExchangeInKind), Desc: "积分兑换实物-" + config.Name, SysType: user.SysType, RealIntegral: wallet.RealIntegral(), }, } if err = txnmod.InsertManyTransactionLog(t, txnLogs); err != nil { log.Warn(fmt.Sprintf("HandeExchangeInKind Transaction err %s", err.Error())) return err } return nil }); err != nil { log.Warn(fmt.Sprintf("HandeExchangeInKind Transaction err %s", err.Error())) return stderr.BuyFailed //通知消息 } return stderr.Success } func HandleCId(id primitive.ObjectID) string { return id.Hex() + common.UUID() } func GetRecordConfig(uid uint64) []integralconfigmod.AppIntegralRecord { var data []integralconfigmod.AppIntegralRecord filter := bson.M{"tranTypeInt": bson.M{"$in": []txnmod.TransType{ txnmod.IntegralExchangeVip, txnmod.IntegralExchangeAICount, txnmod.IntegralExchangeGoldCoinBonus, txnmod.IntegralExchangeGoldWatch, txnmod.IntegralExchangeInKind, txnmod.IntegralExchangeFreeCount, }}, "uid": uid} op := options.Find().SetSort(bson.D{{"createdAt", -1}}) all, err := txnmod.QueryAll(filter, op) if err != nil { return data } for _, i := range all { appdata := integralconfigmod.AppIntegralRecord{ ID: i.ID, Integral: i.Integral, Name: i.TranType, Desc: i.Desc, Type: int(i.TranTypeInt), CreatedAt: i.CreatedAt, } data = append(data, appdata) } return data }