You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.9 KiB
Go
137 lines
3.9 KiB
Go
package service
|
|
|
|
import (
|
|
e "errors"
|
|
"github.com/xuri/excelize/v2"
|
|
"gold-shop/errors"
|
|
"gold-shop/global"
|
|
"gold-shop/model"
|
|
"gold-shop/request"
|
|
"gold-shop/request/manage"
|
|
"gold-shop/utils"
|
|
"gold-shop/utils/excel"
|
|
"gorm.io/gorm"
|
|
"time"
|
|
)
|
|
|
|
var OrderService = orderService{}
|
|
|
|
type orderService struct {
|
|
}
|
|
|
|
func (orderService) Order(orderRequest request.OrderRequest, user *model.User) (*model.Order, error) {
|
|
product := &model.Product{}
|
|
err := global.DB.Where("id", orderRequest.ProductID).First(product).Error
|
|
if e.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.NewBusinessError("商品不存在")
|
|
}
|
|
totalAmount := float64(orderRequest.Num) * product.Price
|
|
if user.Balance < totalAmount {
|
|
return nil, errors.NewBusinessError("账号余额不足")
|
|
}
|
|
|
|
orderNo := utils.GenerateNo("order")
|
|
|
|
tx := global.DB.Begin()
|
|
order := model.Order{}
|
|
order.OrderNo = orderNo
|
|
order.Amount = totalAmount
|
|
order.UserID = user.ID
|
|
err = global.DB.Save(&order).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return nil, errors.NewBusinessError("保存数据失败")
|
|
}
|
|
|
|
orderProduct := model.OrderProduct{}
|
|
orderProduct.ProductID = orderRequest.ProductID
|
|
orderProduct.OrderNo = orderNo
|
|
orderProduct.Price = product.Price
|
|
orderProduct.Amount = totalAmount
|
|
orderProduct.Num = orderRequest.Num
|
|
err = global.DB.Save(&orderProduct).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return nil, errors.NewBusinessError("保存数据失败")
|
|
}
|
|
|
|
global.DB.Model(user).Update("balance", gorm.Expr("balance - ?", totalAmount))
|
|
tx.Commit()
|
|
|
|
return &order, nil
|
|
}
|
|
|
|
func (orderService) GetUserOrders(userID, page, pageSize int) ([]model.Order, int64) {
|
|
orders := make([]model.Order, pageSize)
|
|
offset := (page - 1) * pageSize
|
|
var total int64
|
|
global.DB.Where("user_id", userID).Preload("OrderProducts").Offset(offset).Limit(pageSize).Find(&orders)
|
|
global.DB.Model(&model.Order{}).Where("user_id", userID).Count(&total)
|
|
return orders, total
|
|
}
|
|
|
|
func (s *orderService) buildQuery(req manage.OrderQueryRequest) *gorm.DB {
|
|
tx := global.DB
|
|
if req.Mobile != "" {
|
|
var userIds []int
|
|
global.DB.Model(&model.User{}).Where("mobile", req.Mobile).Pluck("id", &userIds)
|
|
tx = tx.Where("user_id", userIds)
|
|
}
|
|
if req.OrderNo != "" {
|
|
tx = tx.Where("order_no", req.OrderNo)
|
|
}
|
|
if req.UserID != 0 {
|
|
tx = tx.Where("user_id", req.UserID)
|
|
}
|
|
return tx
|
|
}
|
|
|
|
func (s *orderService) GetOrders(req manage.OrderQueryRequest) ([]model.Order, int64) {
|
|
orders := make([]model.Order, req.PageSize)
|
|
offset := (req.Page - 1) * req.PageSize
|
|
var total int64
|
|
tx := s.buildQuery(req)
|
|
tx.Preload("OrderProducts").Preload("User").Order("id desc").Offset(offset).Limit(req.PageSize).Find(&orders)
|
|
tx.Model(&model.Order{}).Count(&total)
|
|
return orders, total
|
|
}
|
|
|
|
func (s *orderService) GenerateOrdersExcel(req manage.OrderQueryRequest) *excelize.File {
|
|
pageSize := 200
|
|
lastID := 0
|
|
tx := s.buildQuery(req)
|
|
|
|
f := excel.NewFile()
|
|
headers := []string{"订单号", "用户手机号", "购买份数", "订单总金额", "下单时间"}
|
|
excel.SetSimpleHeaders(headers, "Sheet1", f)
|
|
for {
|
|
orders := make([]model.Order, pageSize)
|
|
tx.Preload("OrderProducts").Preload("User").Where("id > ?", lastID).Limit(pageSize).Find(&orders)
|
|
count := len(orders)
|
|
if count == 0 {
|
|
break
|
|
}
|
|
s.buildOrdersExcel(orders, "Sheet1", f)
|
|
lastIndex := count - 1
|
|
lastID = orders[lastIndex].ID
|
|
}
|
|
return f
|
|
}
|
|
|
|
func (orderService) buildOrdersExcel(orders []model.Order, sheet string, f *excelize.File) {
|
|
row := 2
|
|
for _, order := range orders {
|
|
col := 0
|
|
num := 0
|
|
for _, orderProduct := range order.OrderProducts {
|
|
num += orderProduct.Num
|
|
}
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), order.OrderNo)
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), order.User.Mobile)
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), num)
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), order.Amount)
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), order.CreatedAt.Format(time.DateTime))
|
|
row++
|
|
}
|
|
}
|