package service import ( "time" "job-cheng-xing/model" "job-cheng-xing/repository" "github.com/google/uuid" ) type OrderService struct { repo repository.OrderRepository } func NewOrderService(repo repository.OrderRepository) *OrderService { return &OrderService{repo: repo} } func (s *OrderService) CreateOrder(req model.CreateOrderRequest) (*model.Order, error) { now := time.Now() order := &model.Order{ ID: "ord_" + uuid.NewString()[:8], Status: model.StatusPending, ServiceTime: req.ServiceTime, Duration: req.Duration, Address: req.Address, ProviderID: nil, CreatedAt: now, UpdatedAt: now, } if err := s.repo.Create(order); err != nil { return nil, err } return order, nil } func (s *OrderService) AcceptOrder(id, providerID string) (*model.Order, error) { order, err := s.repo.FindByID(id) if err != nil { return nil, err } if order.Status == model.StatusCanceled { return nil, model.ErrInvalidState("接单") } if order.Status != model.StatusPending { return nil, model.ErrConflict } pid := providerID updated := &model.Order{ Status: model.StatusAccepted, ProviderID: &pid, UpdatedAt: time.Now(), } if err := s.repo.Update(id, model.StatusPending, updated); err != nil { return nil, err } return s.repo.FindByID(id) } func (s *OrderService) GetOrder(id string) (*model.Order, error) { return s.repo.FindByID(id) } func (s *OrderService) CancelOrder(id string) (*model.Order, error) { order, err := s.repo.FindByID(id) if err != nil { return nil, err } if order.Status == model.StatusCanceled { return nil, model.ErrInvalidState("取消") } updated := &model.Order{ Status: model.StatusCanceled, UpdatedAt: time.Now(), } if err := s.repo.Update(id, order.Status, updated); err != nil { return nil, err } return s.repo.FindByID(id) }