Files
ai_dianshang/server/internal/service/aftersale.go
2025-11-17 13:32:54 +08:00

125 lines
3.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package service
import (
"dianshang/internal/model"
"fmt"
"time"
"gorm.io/gorm"
)
// AfterSaleService 售后服务
type AfterSaleService struct {
db *gorm.DB
}
// NewAfterSaleService 创建售后服务
func NewAfterSaleService(db *gorm.DB) *AfterSaleService {
return &AfterSaleService{
db: db,
}
}
// GetUserAfterSales 获取用户售后列表
func (s *AfterSaleService) GetUserAfterSales(userID uint, page, pageSize int, status int) ([]model.AfterSale, int64, error) {
var afterSales []model.AfterSale
var total int64
query := s.db.Model(&model.AfterSale{}).Where("user_id = ?", userID)
// 如果指定了状态,添加状态过滤
if status > 0 {
query = query.Where("status = ?", status)
}
// 获取总数
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
// 分页查询,预加载关联数据
offset := (page - 1) * pageSize
if err := query.Preload("Order").Preload("OrderItem").Preload("User").
Order("created_at DESC").
Offset(offset).Limit(pageSize).
Find(&afterSales).Error; err != nil {
return nil, 0, err
}
return afterSales, total, nil
}
// GetAfterSaleDetail 获取售后详情
func (s *AfterSaleService) GetAfterSaleDetail(userID, afterSaleID uint) (*model.AfterSale, error) {
var afterSale model.AfterSale
if err := s.db.Where("id = ? AND user_id = ?", afterSaleID, userID).
Preload("Order").Preload("OrderItem").Preload("User").
First(&afterSale).Error; err != nil {
return nil, err
}
return &afterSale, nil
}
// CreateAfterSale 创建售后申请
func (s *AfterSaleService) CreateAfterSale(userID uint, req *CreateAfterSaleRequest) (*model.AfterSale, error) {
// 验证订单是否存在且属于该用户
var order model.Order
if err := s.db.Where("id = ? AND user_id = ?", req.OrderID, userID).First(&order).Error; err != nil {
return nil, fmt.Errorf("订单不存在或无权限")
}
// 验证订单项是否存在
var orderItem model.OrderItem
if err := s.db.Where("id = ? AND order_id = ?", req.OrderItemID, req.OrderID).First(&orderItem).Error; err != nil {
return nil, fmt.Errorf("订单项不存在")
}
// 创建售后记录
afterSale := &model.AfterSale{
OrderID: req.OrderID,
OrderItemID: req.OrderItemID,
UserID: userID,
Type: req.Type,
Reason: req.Reason,
Description: req.Description,
Images: req.Images,
Status: 1, // 1待审核
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
if err := s.db.Create(afterSale).Error; err != nil {
return nil, err
}
// 预加载关联数据
if err := s.db.Preload("Order").Preload("OrderItem").Preload("User").
First(afterSale, afterSale.ID).Error; err != nil {
return nil, err
}
return afterSale, nil
}
// CreateAfterSaleRequest 创建售后申请请求
type CreateAfterSaleRequest struct {
OrderID uint `json:"order_id" binding:"required"`
OrderItemID uint `json:"order_item_id" binding:"required"`
Type int `json:"type" binding:"required"` // 1退货2换货3维修
Reason string `json:"reason" binding:"required"`
Description string `json:"description"`
Images model.JSONSlice `json:"images"`
}
// UpdateAfterSaleStatus 更新售后状态
func (s *AfterSaleService) UpdateAfterSaleStatus(afterSaleID uint, status int, adminRemark string) error {
return s.db.Model(&model.AfterSale{}).
Where("id = ?", afterSaleID).
Updates(map[string]interface{}{
"status": status,
"admin_remark": adminRemark,
"updated_at": time.Now(),
}).Error
}