部分重构
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user