LogisticSyncTrait.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace App\Traits;
  3. use App\OrderPackage;
  4. use Illuminate\Support\Carbon;
  5. trait LogisticSyncTrait
  6. {
  7. public function setExceptionStatus(array $data): array
  8. {
  9. $logistic_number = $data['logistic_number'];
  10. /** @var OrderPackage $orderPackage */
  11. $orderPackage = OrderPackage::query()
  12. ->with(['order'])
  13. ->where('logistic_number', $logistic_number)
  14. ->first();
  15. if ($orderPackage->exception_status === '单号异常' ||
  16. $orderPackage->exception_status === '无法获取路由') {//这种类型的单,不需要再更新状态
  17. return $data;
  18. }
  19. /**执行该方法时,默认没有异常,
  20. *1. 之前有异常的件,
  21. * 1.1 新的状态是无异常的可以更新为正常
  22. * 1.2 新的状态是异常的可以更新为对应异常
  23. *2. 之前无异常
  24. * 2.1 新的状态无异常更新为无异常
  25. * 2.2 新的状态异常更新为对应异常
  26. */
  27. $data['exception_status'] = '';
  28. $created_at = Carbon::parse($orderPackage->created_at);
  29. //当天的16:30
  30. if (empty($orderPackage->sent_at)) {//没复核
  31. if (empty($data['transfer_status'])) {//没有路由信息
  32. //延迟发货
  33. if ($created_at->gt($created_at->startOfDay()->addHours(16))) {//下午16的单
  34. if ($created_at->addDay()->endOfDay()->lt(now())) {//超过第二天的24时
  35. $data['exception_status'] = '延迟发货';
  36. $data['is_delay_deliver'] = true;
  37. }
  38. } else {
  39. if ($created_at->endOfDay()->lt(now())) {//超过当天的24时
  40. $data['exception_status'] = '延迟发货';
  41. $data['is_delay_deliver'] = true;
  42. }
  43. }
  44. } else {
  45. //虚拟揽件
  46. // $data['exception_status'] = '虚拟揽件'; //没有复核但是有路由信息 21-09-10 取消虚拟揽件状态
  47. }
  48. } else {//复核过
  49. if (empty($data['transfer_status'])) {//没有路由信息
  50. /** @var Carbon $sent_at */
  51. $sent_at = $orderPackage->sent_at;
  52. if (now()->gt($sent_at->addDay()->startOfDay()->addHours(6))) {//当前时间大于复核时间的第二天6点
  53. if (empty($orderPackage->weighed_at)) {//没有称重
  54. $data['exception_status'] = '疑似库内丢件';
  55. } else {//有称重
  56. $data['exception_status'] = '揽件异常';
  57. }
  58. }
  59. } else {//有路由信息
  60. usort($data['transfer_status'], function ($a, $b) {
  61. if ($a['accept_time'] === $b['accept_time']) {
  62. return 0;
  63. }
  64. return ($a['accept_time'] > $b['accept_time']) ? -1 : 1;
  65. });
  66. $last_transfer = $data['transfer_status'][0]['accept_time'];
  67. if (count($data['transfer_status']) <= 3) {//三条以内的不管地区 时间限制为24h
  68. if (Carbon::parse($last_transfer)->diffInHours(now()) > 24) {
  69. $data['exception_status'] = '在途异常';
  70. }
  71. } else {
  72. $SHORT_RESPONSE_HOURS = (function ($province) {
  73. switch ($province) {
  74. case '浙江省':
  75. case '江苏省':
  76. case '上海':
  77. case '安徽省':
  78. return 24;
  79. case '北京':
  80. case '天津':
  81. case '江西省':
  82. case '湖北省':
  83. case '湖南省':
  84. case '广东省':
  85. case '福建省':
  86. case '山东省':
  87. case '河北省':
  88. case '河南省':
  89. case '山西省':
  90. case '四川省':
  91. case '陕西省':
  92. case '重庆':
  93. case '广西壮族自治区':
  94. case '贵州省':
  95. case '云南省':
  96. case '海南省':
  97. case '吉林省':
  98. case '黑龙江省':
  99. case '辽宁省':
  100. return 72;
  101. case '青海省':
  102. case '宁夏回族自治区':
  103. case '甘肃省':
  104. case '内蒙古自治区':
  105. case '新疆维吾尔自治区':
  106. case '西藏自治区':
  107. return 120;
  108. default:
  109. return 24;
  110. }
  111. })($orderPackage->order->province);
  112. if (Carbon::parse($last_transfer)->diffInHours(now()) > $SHORT_RESPONSE_HOURS) {
  113. $data['exception_status'] = '在途异常';
  114. }
  115. }
  116. }
  117. }
  118. return $data;
  119. }
  120. }