order.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package service
  2. import (
  3. "time"
  4. "job-cheng-xing/model"
  5. "job-cheng-xing/repository"
  6. "github.com/google/uuid"
  7. )
  8. type OrderService struct {
  9. repo repository.OrderRepository
  10. }
  11. func NewOrderService(repo repository.OrderRepository) *OrderService {
  12. return &OrderService{repo: repo}
  13. }
  14. func (s *OrderService) CreateOrder(req model.CreateOrderRequest) (*model.Order, error) {
  15. now := time.Now()
  16. order := &model.Order{
  17. ID: "ord_" + uuid.NewString()[:8],
  18. Status: model.StatusPending,
  19. ServiceTime: req.ServiceTime,
  20. Duration: req.Duration,
  21. Address: req.Address,
  22. ProviderID: nil,
  23. CreatedAt: now,
  24. UpdatedAt: now,
  25. }
  26. if err := s.repo.Create(order); err != nil {
  27. return nil, err
  28. }
  29. return order, nil
  30. }
  31. func (s *OrderService) AcceptOrder(id, providerID string) (*model.Order, error) {
  32. order, err := s.repo.FindByID(id)
  33. if err != nil {
  34. return nil, err
  35. }
  36. if order.Status == model.StatusCanceled {
  37. return nil, model.ErrInvalidState("接单")
  38. }
  39. if order.Status != model.StatusPending {
  40. return nil, model.ErrConflict
  41. }
  42. pid := providerID
  43. updated := &model.Order{
  44. Status: model.StatusAccepted,
  45. ProviderID: &pid,
  46. UpdatedAt: time.Now(),
  47. }
  48. if err := s.repo.Update(id, model.StatusPending, updated); err != nil {
  49. return nil, err
  50. }
  51. return s.repo.FindByID(id)
  52. }
  53. func (s *OrderService) CancelOrder(id string) (*model.Order, error) {
  54. order, err := s.repo.FindByID(id)
  55. if err != nil {
  56. return nil, err
  57. }
  58. if order.Status == model.StatusCanceled {
  59. return nil, model.ErrInvalidState("取消")
  60. }
  61. updated := &model.Order{
  62. Status: model.StatusCanceled,
  63. UpdatedAt: time.Now(),
  64. }
  65. if err := s.repo.Update(id, order.Status, updated); err != nil {
  66. return nil, err
  67. }
  68. return s.repo.FindByID(id)
  69. }