165 lines
3.9 KiB
Go
165 lines
3.9 KiB
Go
package service
|
|
|
|
import (
|
|
"encoding/json"
|
|
"ops/internal/repository"
|
|
"ops/models"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/datatypes"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type PurchaseService interface {
|
|
GetOrders(c *gin.Context, userID uint, search string, page, entries int) (gin.H, bool)
|
|
CreateOrder(c *gin.Context, userID uint, request CreateOrderRequest) bool
|
|
GetOrderDetails(orderID uint) (*models.TabPurchaseOrder, []models.TabPurchaseCosts, error)
|
|
}
|
|
|
|
type purchaseService struct {
|
|
repo repository.PurchaseRepository
|
|
}
|
|
|
|
func NewPurchaseService(db *gorm.DB) PurchaseService {
|
|
return &purchaseService{
|
|
repo: repository.NewPurchaseRepository(db),
|
|
}
|
|
}
|
|
|
|
// 请求结构体
|
|
type CostItem struct {
|
|
Cost int `json:"cost" binding:"required,min=1"`
|
|
CostT int `json:"costt" binding:"required,min=0"`
|
|
CurrencyType string `json:"currencytype" binding:"required"`
|
|
Int int `json:"int" binding:"required,min=1"`
|
|
Type string `json:"type" binding:"required"`
|
|
}
|
|
|
|
type CreateOrderRequest struct {
|
|
Costs []CostItem `json:"costs" binding:"required,min=1,dive"`
|
|
Link string `json:"link"`
|
|
OrderStatus string `json:"order_status" binding:"required"`
|
|
PartName string `json:"partname"`
|
|
Photos []string `json:"photos"`
|
|
Remark string `json:"remark"`
|
|
Styles string `json:"styles"`
|
|
Title string `json:"title" binding:"required"`
|
|
TrackingNumber string `json:"tracking_number"`
|
|
UpdateTime string `json:"update_time"`
|
|
}
|
|
|
|
func (s *purchaseService) GetOrders(c *gin.Context, userID uint, search string, page, entries int) (gin.H, bool) {
|
|
// 验证分页参数
|
|
if entries <= 0 || entries > 300 {
|
|
return nil, false
|
|
}
|
|
if page <= 0 {
|
|
return nil, false
|
|
}
|
|
|
|
orders, total, err := s.repo.GetOrders(userID, search, page, entries)
|
|
if err != nil {
|
|
return nil, false
|
|
}
|
|
|
|
// 构建响应
|
|
result := gin.H{
|
|
"all_count": total,
|
|
"all_orders": orders,
|
|
}
|
|
|
|
return result, true
|
|
}
|
|
|
|
func (s *purchaseService) CreateOrder(c *gin.Context, userID uint, request CreateOrderRequest) bool {
|
|
// 验证数据
|
|
if request.Title == "" {
|
|
return false
|
|
}
|
|
|
|
// 验证价格和数量
|
|
for _, cost := range request.Costs {
|
|
if cost.Cost <= 0 {
|
|
return false
|
|
}
|
|
if cost.Int <= 0 {
|
|
return false
|
|
}
|
|
}
|
|
|
|
// 验证图片哈希(简单检查是否包含特殊字符)
|
|
for _, photo := range request.Photos {
|
|
if models.IsContainsSpecialChar(photo) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
// 解析更新时间
|
|
var updateTime *time.Time
|
|
if request.UpdateTime != "" {
|
|
parsedTime, err := models.StringToTimePtr(request.UpdateTime)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
updateTime = parsedTime
|
|
}
|
|
|
|
// 转换照片数组为JSON
|
|
var photosJSON datatypes.JSON
|
|
if len(request.Photos) > 0 {
|
|
photosBytes, err := json.Marshal(request.Photos)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
photosJSON = datatypes.JSON(photosBytes)
|
|
}
|
|
|
|
// 创建订单
|
|
order := &models.TabPurchaseOrder{
|
|
UserID: userID,
|
|
Title: request.Title,
|
|
Remark: request.Remark,
|
|
Photos: photosJSON,
|
|
Link: request.Link,
|
|
PartName: request.PartName,
|
|
Styles: request.Styles,
|
|
UpdateTime: updateTime,
|
|
TrackingNumber: request.TrackingNumber,
|
|
OrderStatus: request.OrderStatus,
|
|
}
|
|
|
|
if err := s.repo.CreateOrder(order); err != nil {
|
|
return false
|
|
}
|
|
|
|
// 创建费用明细
|
|
for _, costItem := range request.Costs {
|
|
cost := &models.TabPurchaseCosts{
|
|
UserID: userID,
|
|
OrderID: order.ID,
|
|
Price: costItem.Cost,
|
|
Quantity: costItem.Int,
|
|
}
|
|
|
|
if err := s.repo.CreateCost(cost); err != nil {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func (s *purchaseService) GetOrderDetails(orderID uint) (*models.TabPurchaseOrder, []models.TabPurchaseCosts, error) {
|
|
order, err := s.repo.GetOrderByID(orderID)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
costs, err := s.repo.GetOrderCosts(orderID)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
return order, costs, nil
|
|
} |