210 lines
6.7 KiB
Go
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
|
|
}
|