🎨 新增讲师包月功能,优化支付回调

This commit is contained in:
2025-09-07 02:11:22 +08:00
parent 7bcc2370bd
commit df46c7ab29
16 changed files with 508 additions and 43 deletions

View File

@@ -4,4 +4,5 @@ type ServiceGroup struct {
AppUserService
BannerService
OrderService
TeacherVipService
}

View File

@@ -2,6 +2,10 @@ package app
import (
"fmt"
"git.echol.cn/loser/lckt/model/vip"
"strconv"
"strings"
"time"
"git.echol.cn/loser/lckt/global"
"git.echol.cn/loser/lckt/model/app"
@@ -53,19 +57,39 @@ func (s *OrderService) Create(o *app.Order) (*app.Order, error) {
// 查询订单商品价格
price := 0
if o.OrderType == 1 {
switch o.OrderType {
case 1:
err := global.GVA_DB.Table("article").Select("price").Where("id = ?", o.ArticleId).Scan(&price).Error
if err != nil {
global.GVA_LOG.Error("查询商品价格失败", zap.Error(err))
return nil, err
}
} else {
case 2:
err := global.GVA_DB.Table("lckt_vip").Select("price").Where("id = ?", o.VipId).Scan(&price).Error
if err != nil {
global.GVA_LOG.Error("查询VIP价格失败", zap.Error(err))
return nil, err
}
case 3:
// 讲师包月
//切割TeacherVipId字符串
ids := strings.Split(o.TeacherVipId, ",")
// 查询每个服务的价格并累加
totalPrice := 0
for _, id := range ids {
var p int
err := global.GVA_DB.Table("app_teacher_vip").Select("price").Where("id = ?", id).Scan(&p).Error
if err != nil {
global.GVA_LOG.Error("查询讲师包月价格失败", zap.Error(err))
return nil, err
}
totalPrice += p
}
price = totalPrice
}
o.Price = int64(price)
o.Status = 1 // 设置订单状态为未付款
// 设置openid
@@ -108,7 +132,7 @@ func (s *OrderService) BalancePay(p request.BalancePay) error {
}
// 检查用户余额是否足够
var user user.User
err = global.GVA_DB.Where("id = ?", p.UserId).Select("id,balance").First(&user).Error
err = global.GVA_DB.Where("id = ?", p.UserId).First(&user).Error
if err != nil {
global.GVA_LOG.Error("查询用户信息失败", zap.Error(err))
return err
@@ -141,6 +165,58 @@ func (s *OrderService) BalancePay(p request.BalancePay) error {
return err
}
// 全站Vip
if order.OrderType == 2 {
// 更新用户的会员状态
user.IsVip = 1
// 查询用户购买的会员信息
vipInfo := vip.Vip{}
err = global.GVA_DB.Model(&vip.Vip{}).Where("id = ?", order.VipId).First(&vipInfo).Error
if err != nil {
global.GVA_LOG.Error("查询会员信息失败", zap.Error(err))
return nil
}
// 计算会员的过期时间
if user.VipExpireTime != "" {
expireTime, _ := time.Parse("2006-01-02", user.VipExpireTime)
if expireTime.After(time.Now()) {
// 如果会员未过期,则在原有的基础上增加时间
user.VipExpireTime = expireTime.AddDate(0, 0, int(vipInfo.Expiration)).Format("2006-01-02")
} else {
// 如果会员已过期,则从当前时间开始计算
user.VipExpireTime = time.Now().AddDate(0, 0, int(vipInfo.Expiration)).Format("2006-01-02")
}
} else {
// 如果没有会员时间,则从当前时间开始计算
user.VipExpireTime = time.Now().AddDate(0, 0, int(vipInfo.Expiration)).Format("2006-01-02")
}
err = global.GVA_DB.Save(&user).Error
if err != nil {
global.GVA_LOG.Error("更新用户会员状态失败", zap.Error(err))
return nil
}
}
// 讲师包月
if order.OrderType == 3 {
// 逗号分割字符串
ids := strings.Split(order.TeacherVipId, ",")
for _, id := range ids {
teacherVip := app.UserTeacherVip{}
teacherVip.TeacherId = uint(order.TeacherId)
// 将id转为uint
teacherVipId, _ := strconv.ParseUint(id, 10, 64)
teacherVip.TeacherVipId = uint(teacherVipId)
teacherVip.UserId = uint(order.UserId)
teacherVip.ExpireAt = time.Now().AddDate(0, 1, 0).Format("2006-01-02") // 会员有效期一个月
teacherVip.IsExpire = 1 // 设置为未过期
err = global.GVA_DB.Create(&teacherVip).Error
if err != nil {
global.GVA_LOG.Error("购买讲师会员回调处理失败:", zap.Error(err))
return err
}
}
}
global.GVA_LOG.Info("余额支付成功", zap.Int64("user_id", int64(p.UserId)), zap.String("order_no", order.OrderNo))
return nil
}

View File

@@ -0,0 +1,86 @@
package app
import (
"errors"
"git.echol.cn/loser/lckt/global"
"git.echol.cn/loser/lckt/model/app"
"git.echol.cn/loser/lckt/model/app/request"
user2 "git.echol.cn/loser/lckt/model/user"
"go.uber.org/zap"
)
type TeacherVipService struct{}
// GetTeacherVipList 获取讲师包月列表
func (u *TeacherVipService) GetTeacherVipList(p request.GetTeacherVipList) (list []app.TeacherVip, total int64, err error) {
limit := p.PageSize
offset := (p.Page - 1) * p.PageSize
db := global.GVA_DB.Model(&app.TeacherVip{}).Where("teacher_id = ?", p.TeacherId)
if p.Keyword != "" {
db = db.Where("title LIKE ?", "%"+p.Keyword+"%")
}
err = db.Count(&total).Error
if err != nil {
global.GVA_LOG.Error("查询讲师包月总数失败", zap.Error(err))
return nil, 0, err
}
err = db.Limit(limit).Offset(offset).Find(&list).Error
if err != nil {
global.GVA_LOG.Error("查询讲师包月列表失败", zap.Error(err))
return nil, 0, err
}
return
}
func (u *TeacherVipService) CreateTeacherVip(p app.TeacherVip, userId uint) (err error) {
// 判断是否是讲师
var user user2.User
err = global.GVA_DB.Where("id = ?", userId).First(&user).Error
if err != nil {
global.GVA_LOG.Error("查询用户信息失败:", zap.Error(err))
return err
}
if user.UserType != 2 {
// 不是讲师
global.GVA_LOG.Error("当前用户不是讲师无法创建讲师VIP")
return errors.New("当前用户不是讲师无法创建讲师VIP")
}
err = global.GVA_DB.Create(&p).Error
if err != nil {
global.GVA_LOG.Error("创建讲师VIP失败", zap.Error(err))
return err
}
return nil
}
func (u *TeacherVipService) DeleteTeacherVip(p app.TeacherVip) (err error) {
err = global.GVA_DB.Delete(&p).Error
if err != nil {
global.GVA_LOG.Error("删除讲师VIP失败", zap.Error(err))
return err
}
return nil
}
func (u *TeacherVipService) Update(p app.TeacherVip) (err error) {
err = global.GVA_DB.Save(&p).Error
if err != nil {
global.GVA_LOG.Error("更新讲师VIP失败", zap.Error(err))
return err
}
return nil
}
func (u *TeacherVipService) GetTeacherVip(id int) (vip app.TeacherVip, err error) {
err = global.GVA_DB.Where("id = ?", id).First(&vip).Error
if err != nil {
global.GVA_LOG.Error("获取讲师VIP失败", zap.Error(err))
return vip, err
}
return vip, nil
}

View File

@@ -374,3 +374,45 @@ func (u *AppUserService) IsFollowTeacher(userId, teacherId uint) (bool, error) {
}
return count > 0, nil
}
func (u *AppUserService) GetVipTeacherList(p common.PageInfo, userId uint) (list []vo.TeacherInfo, total int64, err error) {
limit := p.PageSize
offset := (p.Page - 1) * p.PageSize
// 1. 获取所有购买了讲师VIP的讲师ID
var vipTeacherIds []uint
err = global.GVA_DB.Model(&app.UserTeacherVip{}).Where("user_id = ? and is_expire = 1", userId).Select("id").Scan(&vipTeacherIds).Error
if err != nil {
global.GVA_LOG.Error("获取用户讲师包月信息失败:", zap.Error(err))
return nil, 0, err
}
db := global.GVA_DB.Model(&user.User{}).Where("user_type = ? and id in ?", 2, vipTeacherIds)
if p.Keyword != "" {
db = db.Where("nick_name LIKE ?", "%"+p.Keyword+"%")
}
err = db.Count(&total).Error
if err != nil {
global.GVA_LOG.Error("查询教师总数失败", zap.Error(err))
return nil, 0, err
}
err = db.Limit(limit).Offset(offset).Select("id, nick_name, avatar,des").Find(&list).Error
if err != nil {
global.GVA_LOG.Error("查询教师列表失败", zap.Error(err))
return nil, 0, err
}
// 获取每个教师的粉丝数
for i := range list {
followCount, err := u.GetTeacherFansCount(list[i].ID)
if err != nil {
global.GVA_LOG.Error("查询教师粉丝数失败", zap.Error(err))
return nil, 0, err
}
list[i].Follow = followCount
}
return
}