order.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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) GetOrder(id string) (*model.Order, error) {
  54. return s.repo.FindByID(id)
  55. }
  56. func (s *OrderService) CancelOrder(id string) (*model.Order, error) {
  57. order, err := s.repo.FindByID(id)
  58. if err != nil {
  59. return nil, err
  60. }
  61. if order.Status == model.StatusCanceled {
  62. return nil, model.ErrInvalidState("取消")
  63. }
  64. updated := &model.Order{
  65. Status: model.StatusCanceled,
  66. UpdatedAt: time.Now(),
  67. }
  68. if err := s.repo.Update(id, order.Status, updated); err != nil {
  69. return nil, err
  70. }
  71. return s.repo.FindByID(id)
  72. }