MexOrderExistsValidator.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace App\Module\Mex\Validators;
  3. use App\Module\Mex\Models\MexOrder;
  4. use App\Module\Mex\Enums\OrderStatus;
  5. use UCore\Validator;
  6. use Illuminate\Support\Facades\Log;
  7. /**
  8. * 农贸市场订单存在性验证器
  9. *
  10. * 验证订单是否存在、是否属于当前用户、是否可以取消等
  11. */
  12. class MexOrderExistsValidator extends Validator
  13. {
  14. /**
  15. * 验证订单存在性和可操作性
  16. *
  17. * @param mixed $value 订单ID
  18. * @param array $data 所有数据
  19. * @return bool 验证是否通过
  20. */
  21. public function validate(mixed $value, array $data): bool
  22. {
  23. $orderId = (int)$value;
  24. $userId = $data['user_id'] ?? null;
  25. if (!$orderId || $orderId <= 0) {
  26. $this->addError('订单ID无效');
  27. return false;
  28. }
  29. if (!$userId || $userId <= 0) {
  30. $this->addError('用户ID无效');
  31. return false;
  32. }
  33. try {
  34. // 查找订单
  35. $order = MexOrder::where('id', $orderId)
  36. ->where('user_id', $userId)
  37. ->first();
  38. if (!$order) {
  39. $this->addError('订单不存在');
  40. return false;
  41. }
  42. // 验证订单状态是否可以取消
  43. if ($order->status !== OrderStatus::PENDING) {
  44. $statusText = $this->getOrderStatusText($order->status);
  45. $this->addError("只能取消等待中的订单,当前订单状态:{$statusText}");
  46. return false;
  47. }
  48. return true;
  49. } catch (\Exception $e) {
  50. Log::error('农贸市场订单存在性验证失败', [
  51. 'order_id' => $orderId,
  52. 'user_id' => $userId,
  53. 'error' => $e->getMessage()
  54. ]);
  55. $this->addError('订单验证时发生错误');
  56. return false;
  57. }
  58. }
  59. /**
  60. * 获取订单状态描述
  61. *
  62. * @param OrderStatus $status 订单状态
  63. * @return string
  64. */
  65. private function getOrderStatusText(OrderStatus $status): string
  66. {
  67. return match ($status) {
  68. OrderStatus::PENDING => '等待中',
  69. OrderStatus::COMPLETED => '已完成',
  70. OrderStatus::CANCELLED => '已取消',
  71. OrderStatus::FAILED => '已失败',
  72. default => '未知状态'
  73. };
  74. }
  75. }