OrderTrait.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. namespace App\Handlers;
  3. use App\Models\Device;
  4. use App\Models\Order;
  5. use App\Repositories\Enums\OrderStatusEnum;
  6. use App\Repositories\Enums\OrderWorkTypeCodeEnum;
  7. use Carbon\Carbon;
  8. use Illuminate\Support\Facades\Log;
  9. trait OrderTrait
  10. {
  11. public static function startBoxByOrder($order, $box_no = false)
  12. {
  13. if ($box_no === false) $box_no = Device::byIdGetNo($order['device_id']);
  14. $mode = $aTime = $bTime = 0;
  15. $data = [];
  16. $time = $order['work_time'];
  17. $c = Carbon::parse($order['pay_time'])->diffInMinutes(Carbon::now(), false);
  18. if ($c >= 3) {
  19. $time = $time - $c;
  20. }
  21. switch ($order['work_type']) {
  22. case OrderWorkTypeCodeEnum::A:
  23. $mode = 1;
  24. $aTime = $time;
  25. $data['a'] = 1;
  26. $bOrder = Order::query()->where('device_id', $order['device_id'])->where('work_type', OrderWorkTypeCodeEnum::B)->where('status', OrderStatusEnum::IN_SERVICE)->first();
  27. if ($bOrder) {
  28. $b = $bOrder->work_time - Carbon::parse($bOrder['pay_time'])->diffInMinutes(Carbon::now(), false);
  29. if ($b > 0) {
  30. $mode = 2;
  31. $bTime = $b;
  32. }
  33. }
  34. break;
  35. case OrderWorkTypeCodeEnum::B:
  36. $mode = 3;
  37. $bTime = $time;
  38. $data['b'] = 1;
  39. $aOrder = Order::query()->where('device_id', $order['device_id'])->where('work_type', OrderWorkTypeCodeEnum::A)->where('status', OrderStatusEnum::IN_SERVICE)->first();
  40. if ($aOrder) {
  41. $a = $aOrder->work_time - Carbon::parse($aOrder['pay_time'])->diffInMinutes(Carbon::now(), false);
  42. if ($a > 0) {
  43. $mode = 2;
  44. $aTime = $a;
  45. }
  46. }
  47. break;
  48. case OrderWorkTypeCodeEnum::AB:
  49. $mode = 2;
  50. $bTime = $time;
  51. $aTime = $time;
  52. $data['a'] = 1;
  53. $data['b'] = 1;
  54. break;
  55. }
  56. Device::query()->where('id', $order['device_id'])->update($data);
  57. return self::startBox($box_no, $mode, $aTime, $bTime);
  58. }
  59. public static function closeBoxByOrder($order, $box_no, $a = 0, $b = 0)
  60. {
  61. $mode = $aTime = $bTime = 0;
  62. switch ($order['work_type']) {
  63. case OrderWorkTypeCodeEnum::A:
  64. $aTime = 0;
  65. if ($b) {
  66. $bTime = self::getOtherTime($order, OrderWorkTypeCodeEnum::B);
  67. $mode = 3;
  68. }
  69. break;
  70. case OrderWorkTypeCodeEnum::B:
  71. $mode = 3;
  72. $bTime = 0;
  73. if ($a) {
  74. $aTime = self::getOtherTime($order, OrderWorkTypeCodeEnum::A);
  75. $mode = 1;
  76. }
  77. break;
  78. case OrderWorkTypeCodeEnum::AB:
  79. $bTime = 0;
  80. $aTime = 0;
  81. break;
  82. }
  83. Log::error("*******");
  84. Log::error($aTime);
  85. Log::error($bTime);
  86. Log::error("*******");
  87. return self::startBox($box_no, $mode, $aTime, $bTime);
  88. }
  89. private static function getOtherTime($order, $type)
  90. {
  91. $other_order = Order::query()->where('device_id', $order->device_id)->where('work_type', $type)->where('status', OrderStatusEnum::IN_SERVICE)->select(['work_time', 'start_use_time'])->first();
  92. if (!$other_order) return 0;
  93. $time = Carbon::now()->diffInMinutes(Carbon::parse($other_order->start_use_time)->addMinutes($other_order->work_time), false);
  94. if ($time < 0) return 0;
  95. return $time;
  96. }
  97. }