2025-06-19 10:33:58 +08:00

210 lines
6.7 KiB
Go

package biz
import (
"context"
"errors"
"fmt"
"gorm.io/gorm"
"strconv"
"time"
//"time"
"github.guxuan/haibei/internal/mods/app/dal"
//"github.guxuan/haibei/internal/mods/app/schema"
activityDal "github.guxuan/haibei/internal/mods/activity/dal"
activitySchema "github.guxuan/haibei/internal/mods/activity/schema"
commonDal "github.guxuan/haibei/internal/mods/common/dal"
commonSchema "github.guxuan/haibei/internal/mods/common/schema"
customerDal "github.guxuan/haibei/internal/mods/customer/dal"
customerSchema "github.guxuan/haibei/internal/mods/customer/schema"
productDal "github.guxuan/haibei/internal/mods/product/dal"
productSchema "github.guxuan/haibei/internal/mods/product/schema"
//"github.guxuan/haibei/pkg/errors"
"github.guxuan/haibei/pkg/util"
)
// Defining the `App` business logic.
type App struct {
DB *gorm.DB
Trans *util.Trans
AppDAL *dal.App
BannerDal *commonDal.Banner
NoticeDal *commonDal.Notice
ProductDal *productDal.Product
ProductCategoryDal *productDal.ProductCategory
ProductOrderDal *customerDal.ProductOrder
ActivityDal *activityDal.Activity
ActivityDetailDal *activityDal.ActivityDetail
QuestionnaireDal *activityDal.Questionnaire
QeustionDetailDal *activityDal.QeustionDetail
CustomerDal *customerDal.Customer
BalanceDal *customerDal.Balance
}
func (a *App) QueryBannerList(ctx context.Context, areaId uint) (*[]commonSchema.Banner, error) {
query := commonDal.GetBannerDB(ctx, a.DB)
if areaId > 0 {
query.Where("area_id = ?", areaId)
}
var list []commonSchema.Banner
query.Order("sequence DESC").Limit(3).Find(&list)
return &list, nil
}
func (a *App) QueryNoticeList(ctx context.Context, areaId uint) (*[]commonSchema.Notice, error) {
query := commonDal.GetNoticeDB(ctx, a.DB)
if areaId > 0 {
query.Where("area_id = ?", areaId)
}
var list []commonSchema.Notice
query.Order("sequence DESC").Limit(6).Find(&list)
return &list, nil
}
func (a *App) QueryHomeProductList(ctx context.Context, isHot bool, areaId uint) (*[]productSchema.Product, error) {
query := productDal.GetProductDB(ctx, a.DB).Preload("Category").Where("status = ?", "enabled")
query.Where("area_id = ?", areaId)
if isHot {
query.Where("is_hot = ?", 1)
}
var list []productSchema.Product
query.Order("createAt DESC").Find(&list)
return &list, nil
}
func (a *App) QueryProductDetails(ctx context.Context, id uint) (productSchema.Product, error) {
query := productDal.GetProductDB(ctx, a.DB).Preload("Category").Where("id = ?", id)
var info productSchema.Product
query.First(&info)
return info, nil
}
func (a *App) QueryHomeActivityList(ctx context.Context, areaId uint) (activitySchema.Activities, error) {
query := activityDal.GetActivityDB(ctx, a.DB).Where("status = ?", "enabled")
query.Where("area_id = ?", areaId)
var list activitySchema.Activities
query.Order("createAt DESC").Find(list)
return list, nil
}
func (a *App) QueryActivityDetails(ctx context.Context, customerId, id uint) (activitySchema.Activity, *activitySchema.ActivityDetail, error) {
query := activityDal.GetActivityDB(ctx, a.DB).Where("id = ?", id)
var info activitySchema.Activity
query.First(&info)
result, _ := a.ActivityDetailDal.GetByCustomerIDAndActivityID(ctx, customerId, id)
return info, result, nil
}
func (a *App) QueryHomeQuestionsList(ctx context.Context, areaId uint) (activitySchema.Questionnaires, error) {
query := activityDal.GetQuestionnaireDB(ctx, a.DB).Where("status = ?", "enabled")
query.Where("area_id = ?", areaId)
var list activitySchema.Questionnaires
query.Order("createAt DESC").Find(list)
return list, nil
}
func (a *App) QueryQuestionsDetails(ctx context.Context, customerId, id uint) (activitySchema.Questionnaire, *activitySchema.QeustionDetail, error) {
query := activityDal.GetQuestionnaireDB(ctx, a.DB).Where("id = ?", id)
var info activitySchema.Questionnaire
query.First(&info)
result, _ := a.QeustionDetailDal.GetByCustomerIDAndActivityID(ctx, customerId, id)
return info, result, nil
}
func (a *App) AddProductToCustomer(ctx context.Context, customerID, productID, num uint) error {
customer, err2 := a.CustomerDal.Get(ctx, customerID, customerSchema.CustomerQueryOptions{})
if err2 != nil {
return errors.New("用户未找到")
}
product, err := a.ProductDal.Get(ctx, productID, productSchema.ProductQueryOptions{})
if err != nil {
return errors.New("商品未找到")
}
if product.Stock < int(num) {
return errors.New("商品库存不足")
}
if product.Status != "enabled" {
return errors.New("商品状态不可用")
}
if product.ExpireAt.Before(time.Now()) {
return errors.New("商品已过期")
}
if customer.Balance < product.Price*int(num) {
return errors.New("积分不足")
}
info, err := a.ProductOrderDal.ExistsByCustomerID(ctx, customerID, productID)
if err != nil {
return errors.New("系统繁忙,请稍后再试!")
}
if info != nil && len(*info) >= product.MaxNum {
return errors.New("兑换数量已达到上限")
}
orderInfo := customerSchema.ProductOrder{
CustomerID: customerID,
ProductID: productID,
MentorID: customer.MentorID,
Status: "UNCHECK",
}
return a.Trans.Exec(ctx, func(ctx context.Context) error {
//创建商品订单
err = a.ProductOrderDal.Create(ctx, &orderInfo)
if err != nil {
return errors.New("系统繁忙,请稍后再试!")
}
//修改库存
product.Stock--
err = a.ProductDal.Update(ctx, product)
if err != nil {
return errors.New("系统繁忙,请稍后再试!")
}
//积分变动
oldBalance := customer.Balance
change := product.Price * int(num)
newBalance := oldBalance - change
customer.Balance = newBalance
err = a.CustomerDal.Update(ctx, customer)
if err != nil {
return errors.New("系统繁忙,请稍后再试!")
}
var record = customerSchema.Balance{
CustomerID: customerID,
Before: oldBalance,
After: newBalance,
Change: -change,
Reason: fmt.Sprintf("用户通过小程序兑换商品-%s", product.Name),
Typer: "兑换商品",
OperatorID: productID,
CreatorID: "",
}
err = a.BalanceDal.Create(ctx, &record)
if err != nil {
return errors.New("系统繁忙,请稍后再试!")
}
return nil
})
}
func (a *App) RegisterActivity(ctx context.Context, customerID, activityID uint) error {
return nil
}
func (a *App) RegisterQuestion(ctx context.Context, customerID, questionID uint, questionBody *[]activitySchema.QuestionDetailTable) error {
return nil
}
func (a *App) GetLoginUid(ctx context.Context) (uint, error) {
userID := util.FromUserID(ctx)
u64, err := strconv.ParseUint(fmt.Sprintf("%v", userID), 10, 64)
if err != nil {
fmt.Println("转换错误:", err)
return 0, errors.New("登录id获取失败")
}
return uint(u64), nil
}