Ver Fonte

临时提交

ANG YU há 4 anos atrás
pai
commit
c59cb78868

+ 53 - 22
app/OrderPackage.php

@@ -45,61 +45,92 @@ class OrderPackage extends Model
         'uploaded_to_wms',
         'sync_routes_flag',
         'is_manual_update',
+        'exception_status',
+        'is_delay_deliver',
     ];
 
     protected $casts = [
         'transfer_status' => 'array',
         'sync_routes_flag' => 'boolean',
         'is_manual_update' => 'boolean',
+        '' => 'boolean',
+    ];
+
+    protected $dates = [
+        'sent_at',
+        'received_at',
     ];
 
     static public $enums = [
         'status' => [
-            ''=>0,
-            '无'=>1,
-            '已称重'=>2,
-            '已揽收'=>3,
-            '揽件异常'=>4,
-            '疑似库内丢件'=>5,
-            '在途'=>6,
-            '在途异常'=>7,
-            '派送中'=>8,
-            '派送异常'=>9,
-            '返回中'=>10,
-            '返回异常'=>11,
-            '返回派件'=>12,
-            '其他异常'=>13,
-            '已签收'=>14,
-            '其他'=>14,
+            '' => 0,
+            '生成订单' => 1,
+            '已复核' => 2,
+            '已称重' => 3,
+            '已揽件' => 4,
+            '在途' => 5,
+            '派送中' => 6,
+            '已签收' => 7,
+            '其他' => 8,
+            '返回中' => 9,
+        ],
+        'exception_status' => [
+            '' => 0,
+            '单号异常' => 1,
+            '无法获取路由' => 2,
+            '延迟发货' => 3,
+            '疑似库内丢件' => 4,
+            '在途异常' => 5,
+            '揽件异常' => 6,
         ],
     ];
 
     function __construct(array $attributes = [])
     {
         foreach (self::$enums as &$enum) {
-            $enum=$enum+array_flip($enum);
+            $enum = $enum + array_flip($enum);
         }
         parent::__construct($attributes);
     }
 
     public function getStatusAttribute($value)
     {
-        if(!$value || !isset(self::$enums['status'][$value]))return '';
+        if (!$value || !isset(self::$enums['status'][$value])) return '';
         return self::$enums['status'][$value];
     }
+
     public function setStatusAttribute($value)
     {
-        if(!$value)return 0;
-        if (!(self::$enums['status'][$value] ?? false))return 0;
-        $this->attributes['status']=self::$enums['status'][$value];
+        if (!$value) return 0;
+        if (!(self::$enums['status'][$value] ?? false)) return 0;
+        $this->attributes['status'] = self::$enums['status'][$value];
     }
 
     public static function switchStatus($value): int
     {
-        if (!(self::$enums['status'][$value] ?? false))return 0;
+        if (!(self::$enums['status'][$value] ?? false)) return 0;
         return self::$enums['status'][$value];
     }
 
+    public function getExceptionStatusAttribute($value)
+    {
+        if (!$value || !isset(self::$enums['exception_status'][$value])) return '';
+        return self::$enums['exception_status'][$value];
+    }
+
+    public function setExceptionStatusAttribute($value)
+    {
+        if (!$value) return 0;
+        if (!(self::$enums['exception_status'][$value] ?? false)) return 0;
+        $this->attributes['exception_status'] = self::$enums['exception_status'][$value];
+    }
+
+    public static function switchExceptionStatus($value): int
+    {
+        if (!(self::$enums['exception_status'][$value] ?? false)) return 0;
+        return self::$enums['exception_status'][$value];
+    }
+
     public function order()
     {
         return $this->belongsTo('App\Order', 'order_id', 'id');

+ 2 - 2
app/Services/LogisticAliJiSuApiService.php

@@ -7,6 +7,7 @@ use App\Traits\ServiceAppAop;
 class LogisticAliJiSuApiService
 {
     use ServiceAppAop;
+    use \App\Traits\LogisticSyncTrait;
 
     public function query($logistic_number)
     {
@@ -61,8 +62,7 @@ class LogisticAliJiSuApiService
                 if ($result['status'] == '已签收') $result['received_at'] = $lastNativeRoute->time;
                 $result['transfer_status'] = $this->getTransferStatus($list);
                 $result['routes_length'] = array_key_exists('transfer_status', $result) ? count($result['transfer_status']) : 0;
-                $orderPackageReceivedSyncService = app('OrderPackageReceivedSyncService');
-                $exceptionData = $orderPackageReceivedSyncService->setExceptionType($result, $lastNativeRoute ? $lastNativeRoute->time : null);
+                $result = $this->setExceptionStatus($result);// 一定要在设置完路由之后调用
 
             } else {
                 $result['status'] = null;

+ 7 - 13
app/Services/LogisticSFService.php

@@ -5,14 +5,14 @@ namespace App\Services;
 
 
 use App\Exceptions\WarningException;
-use App\OrderPackage;
+use App\Traits\LogisticSyncTrait;
 use Exception;
 use Illuminate\Http\Client\Response;
-use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\Http;
 
 class LogisticSFService
 {
+    use LogisticSyncTrait;
     /**
      * 顺丰字段与数据库字段的映射关心
      * @var string[]
@@ -104,6 +104,7 @@ xml;
             $lastRoute = get_object_vars($routeResponse['Route'][count($routeResponse['Route']) - 1])['@attributes'];//获取最新的路由信息
             $data = $this->switchOpCodeToStatus($lastRoute, $data);
             $data['transfer_status'] = $this->transformRoutes($routeResponse['Route']);
+            $data = $this->setExceptionStatus($data);// 一定要在设置完路由之后调用
         } catch (Exception $e) {
             throw new WarningException("单号没有查询到快递路由信息','LogisticSFService->transformSFOneToArr->{$data['logistic_number']}");
         } finally {
@@ -125,9 +126,9 @@ xml;
         }
         foreach ($routs as $route) {
             $route = get_object_vars($route)['@attributes'];
-            $data['accept_time'] = $route['accept_time']??'';
-            $data['accept_address'] = $route['accept_address']??'';
-            $data['remark'] = $route['remark']??'';
+            $data['accept_time'] = $route['accept_time'] ?? '';
+            $data['accept_address'] = $route['accept_address'] ?? '';
+            $data['remark'] = $route['remark'] ?? '';
             $result[] = $data;
         }
         return $result;
@@ -153,15 +154,12 @@ xml;
                 case 106://航空板箱到达
                     $data['status'] = '在途';
                     break;
-                case 33:
-                    $data['status'] = '派送异常';
-                    break;
                 case 204:
                 case 44:
                     $data['status'] = '派送中';
                     break;
                 case 50:
-                    $data['status'] = '已揽';
+                    $data['status'] = '已揽';
                     break;
                 case 607:
                 case 8000:
@@ -169,10 +167,6 @@ xml;
                     $data['status'] = '已签收';
                     $data['received_at'] = $lastRoute[$this->protected_switch['received_at']];
                     break;
-                case 648:
-                case 99:
-                    $data['status'] = '返回中';
-                    break;
                 case 70:
                     $data['status'] = '其他';
                     break;

+ 5 - 1
app/Services/LogisticYDService.php

@@ -3,6 +3,7 @@
 namespace App\Services;
 
 use App\OrderPackage;
+use App\Traits\LogisticSyncTrait;
 use App\Traits\ServiceAppAop;
 use Carbon\Carbon;
 use Illuminate\Support\Facades\Http;
@@ -10,6 +11,7 @@ use Illuminate\Support\Facades\Http;
 class LogisticYDService
 {
     use ServiceAppAop;
+    use LogisticSyncTrait;
 
     private $app_key;
     private $app_secret;
@@ -119,6 +121,8 @@ class LogisticYDService
                 }
                 $result['transfer_status'] = $this->getTransferStatus($nativeRoutes);
                 $result['routes_length'] = array_key_exists('transfer_status', $result) ? count($result['transfer_status']) : 0;
+                $result = $this->setExceptionStatus($result);// 一定要在设置完路由之后调用
+
             } else {
                 $result['status'] = null;
                 $result['transfer_status'] = [];
@@ -140,7 +144,7 @@ class LogisticYDService
         $status = null;
         switch ($nativeData->status) {
             case 'GOT':
-                $status = '已揽';
+                $status = '已揽';
                 break;
             case 'TRANSIT':
                 $status = '在途';

+ 3 - 3
app/Services/LogisticYTOService.php

@@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Http;
 class LogisticYTOService
 {
     use ServiceAppAop;
+    use \App\Traits\LogisticSyncTrait;
 
 
     public function query($logistic_number)
@@ -64,8 +65,7 @@ class LogisticYTOService
                 if ($result['status'] == '已签收') $result['received_at'] = $lastNativeRoute->upload_Time;
                 $result['transfer_status'] = $this->getTransferStatus($response);
                 $result['routes_length'] = array_key_exists('transfer_status', $result) ? count($result['transfer_status']) : 0;
-                $orderPackageReceivedSyncService = app('OrderPackageReceivedSyncService');
-                $exceptionData = $orderPackageReceivedSyncService->setExceptionType($result, $lastNativeRoute ? $lastNativeRoute->upload_Time : null);
+                $result = $this->setExceptionStatus($result);// 一定要在设置完路由之后调用
             } else {
                 $result['status'] = null;
                 $result['transfer_status'] = [];
@@ -84,7 +84,7 @@ class LogisticYTOService
         switch ($nativeData->infoContent) {
             case 'ARRIVAL':
             case 'GOT':
-                $status = '已揽';
+                $status = '已揽';
                 break;
             case 'DEPARTURE':
             case 'PACKAGE':

+ 4 - 2
app/Services/LogisticZopService.php

@@ -4,12 +4,13 @@
 namespace App\Services;
 
 use App\OrderPackage;
+use App\Traits\LogisticSyncTrait;
 use Carbon\Carbon;
 use Illuminate\Support\Facades\Http;
 
 class LogisticZopService implements LogisticRouteInterface
 {
-
+    use LogisticSyncTrait;
     public function query($logistic_number)
     {
         $url = config('api_logistic.ZTO.url');
@@ -48,6 +49,7 @@ class LogisticZopService implements LogisticRouteInterface
         $result['received_at'] = $received_at;
         $result['transfer_status'] = $this->getTransferStatus($nativeRoutes);
         $result['routes_length'] = count($result['transfer_status']);
+        $result = $this->setExceptionStatus($result);// 一定要在设置完路由之后调用
         return $result;
     }
 
@@ -60,7 +62,7 @@ class LogisticZopService implements LogisticRouteInterface
         $received_at = null;
         switch ($lastRoute->scanType) {
             case '收件':
-                $status = '已揽';
+                $status = '已揽';
                 break;
             case '到件':
             case '发件':

+ 4 - 13
app/Services/OrderPackageReceivedSyncService.php

@@ -38,10 +38,10 @@ class OrderPackageReceivedSyncService
         if ($is_to_init) {//当前时间小于等于初始化时间
             $initDate = Carbon::parse(config('api_logistic.init_date'));
             //初始化查询一个月的数据,exception为否
-            $query = $query->where('sent_at', '>=', $initDate)
+            $query = $query->where('created_at', '>=', $initDate)
                 ->whereNull('received_at');
         } else {//查询20天以内的数据
-            $query = $query->where('sent_at', '>=', now()->subDays(config('api_logistic.querying_days'))->startOfDay())
+            $query = $query->where('created_at', '>=', now()->subDays(config('api_logistic.querying_days'))->startOfDay())
                 ->whereNull('received_at');
         }
         $query->chunkById(1000, function ($orderPackages) {
@@ -95,7 +95,7 @@ class OrderPackageReceivedSyncService
                     $builder->from('logistics')->selectRaw('id')->where('type', '=', '快递')->whereNotIn('belong_company', ['顺丰', '中通', '韵达', '圆通', '京东']);
                 });
             });
-        $query = $query->where('sent_at', '>=', now()->subDays(config('api_logistic.querying_days')))
+        $query = $query->where('created_at', '>=', now()->subDays(config('api_logistic.querying_days')))
             ->whereNull('received_at');
 
         $query->chunkById(200, function ($orderPackages) {
@@ -187,16 +187,6 @@ class OrderPackageReceivedSyncService
             if ($logisticResponse['received_at'] ?? false) {
                 $logisticResponse['status'] = '已签收';
             }
-            //未查询到路由信息改为  揽件异常
-            if (empty($logisticResponse['transfer_status'])) {
-                $logisticResponse['status'] = '揽件异常';
-                //未查询到路由信息且未称重的   疑似库内丢件
-                if (empty($orderPackage->weighed_at)) {
-                    $logisticResponse['status'] = '疑似库内丢件';
-                }
-            } else if (count($logisticResponse['transfer_status'])<=3) {//快递记录不为空但是小于3条
-                $logisticResponse['status'] = '揽件异常';
-            }
             //标记为手动更新的 status不更新
             if ($orderPackage->is_manual_update) {
                 unset($logisticResponse['status']);
@@ -204,6 +194,7 @@ class OrderPackageReceivedSyncService
             if (isset($logisticResponse['status'])) $orderPackage->status = $logisticResponse['status'];
             if (isset($logisticResponse['received_at'])) $orderPackage->received_at = $logisticResponse['received_at'];
             if (isset($logisticResponse['transfer_status']) && !empty($logisticResponse['transfer_status'])) $orderPackage->transfer_status = $logisticResponse['transfer_status'];
+            if (isset($logisticResponse['exception_status']) && !empty($logisticResponse['exception_status'])) $orderPackage->exception_status = $logisticResponse['exception_status'];
             $orderPackage->save();
         }
     }

+ 130 - 0
app/Traits/LogisticSyncTrait.php

@@ -0,0 +1,130 @@
+<?php
+
+namespace App\Traits;
+
+use App\OrderPackage;
+use Illuminate\Support\Carbon;
+
+trait LogisticSyncTrait
+{
+    public function setExceptionStatus(array $data): array
+    {
+
+        $logistic_number = $data['logistic_number'];
+        /** @var OrderPackage $orderPackage */
+        $orderPackage = OrderPackage::query()
+            ->with(['order'])
+            ->where('logistic_number', $logistic_number)
+            ->first();
+        if ($orderPackage->exception_status === '单号异常' ||
+            $orderPackage->exception_status === '无法获取路由') {//这种类型的单,不需要再更新状态
+            return $data;
+        }
+
+        /**执行该方法时,默认没有异常,
+         *1. 之前有异常的件,
+         *  1.1 新的状态是无异常的可以更新为正常
+         *  1.2 新的状态是异常的可以更新为对应异常
+         *2. 之前无异常
+         *  2.1 新的状态无异常更新为无异常
+         *  2.2 新的状态异常更新为对应异常
+         */
+        $data['exception_status'] = '';
+        $created_at = Carbon::parse($orderPackage->created_at);
+        //当天的16:30
+
+        if (empty($orderPackage->sent_at)) {//没复核
+            if (empty($data['transfer_status'])) {//没有路由信息
+                //延迟发货
+                if ($created_at->gt($created_at->startOfDay()->addHours(16))) {//下午16的单
+                    if ($created_at->addDay()->endOfDay()->lt(now())) {//超过第二天的24时
+                        $data['exception_status'] = '延迟发货';
+                        $data['is_delay_deliver'] = true;
+
+                    }
+                } else {
+                    if ($created_at->endOfDay()->lt(now())) {//超过当天的24时
+                        $data['exception_status'] = '延迟发货';
+                        $data['is_delay_deliver'] = true;
+
+                    }
+                }
+            } else {
+                //虚拟揽件
+//                $data['exception_status'] = '虚拟揽件'; //没有复核但是有路由信息   21-09-10 取消虚拟揽件状态
+            }
+        } else {//复核过
+            if (empty($data['transfer_status'])) {//没有路由信息
+                /** @var Carbon $sent_at */
+                $sent_at = $orderPackage->sent_at;
+                if (now()->gt($sent_at->addDay()->startOfDay()->addHours(6))) {//当前时间大于复核时间的第二天6点
+                    if (empty($orderPackage->weighed_at)) {//没有称重
+                        $data['exception_status'] = '疑似库内丢件';
+                    } else {//有称重
+                        $data['exception_status'] = '揽件异常';
+                    }
+                }
+            } else {//有路由信息
+
+                usort($data['transfer_status'], function ($a, $b) {
+                    if ($a['accept_time'] === $b['accept_time']) {
+                        return 0;
+                    }
+                    return ($a['accept_time'] > $b['accept_time']) ? -1 : 1;
+                });
+
+                $last_transfer = $data['transfer_status'][0]['accept_time'];
+                if (count($data['transfer_status']) <= 3) {//三条以内的不管地区 时间限制为24h
+                    if (Carbon::parse($last_transfer)->diffInHours(now()) > 24) {
+                        $data['exception_status'] = '在途异常';
+                    }
+                } else {
+                    $SHORT_RESPONSE_HOURS = (function ($province) {
+                        switch ($province) {
+                            case '浙江省':
+                            case '江苏省':
+                            case '上海':
+                            case '安徽省':
+                                return 24;
+                            case '北京':
+                            case '天津':
+                            case '江西省':
+                            case '湖北省':
+                            case '湖南省':
+                            case '广东省':
+                            case '福建省':
+                            case '山东省':
+                            case '河北省':
+                            case '河南省':
+                            case '山西省':
+                            case '四川省':
+                            case '陕西省':
+                            case '重庆':
+                            case '广西壮族自治区':
+                            case '贵州省':
+                            case '云南省':
+                            case '海南省':
+                            case '吉林省':
+                            case '黑龙江省':
+                            case '辽宁省':
+                                return 72;
+                            case '青海省':
+                            case '宁夏回族自治区':
+                            case '甘肃省':
+                            case '内蒙古自治区':
+                            case '新疆维吾尔自治区':
+                            case '西藏自治区':
+                                return 120;
+                            default:
+                                return 24;
+                        }
+                    })($orderPackage->order->province);
+                    if (Carbon::parse($last_transfer)->diffInHours(now()) > $SHORT_RESPONSE_HOURS) {
+                        $data['exception_status'] = '在途异常';
+                    }
+                }
+            }
+        }
+        return $data;
+    }
+}

+ 4 - 7
database/factories/OrderPackageFactory.php

@@ -7,9 +7,6 @@ use App\OrderPackage;
 use Faker\Generator as Faker;
 
 $factory->define(OrderPackage::class, function (Faker $faker) {
-    $statuses = ['无', '已称重', '已揽收', '在途', '在途异常', '派送中', '派送异常', '返回中', '返回异常', '返回派件', '其他异常', '已签收',];
-    $exceptions = ['是', '否'];
-    $exception_types = ['疑似库内丢件','揽件异常','中转异常','疑似丢件','派件异常','其他','无'];
     return [
         'logistic_number' => $faker->uuid,
         'order_id' => random_int(1, 10000),
@@ -21,15 +18,15 @@ $factory->define(OrderPackage::class, function (Faker $faker) {
         'paper_box_id' => random_int(1, 100),
         'measuring_machine_id' => random_int(1, 100),
         'weighed_at' => now()->subHours(3),
-        'status' => $faker->randomElement($statuses),
+        'status' => random_int(1,8),
         'sent_at' => now()->subHours(1),
         'received_at' => null,
-        'exception' => $faker->randomElement($exceptions),
         'transfer_status' => null,
         'remark' => null,
         'owner_id' => random_int(1, 100),
         'uploaded_to_wms' => '是',
-        'exception_message' => $faker->name,
-        'exception_type' => $faker->randomElement($exception_types),
+        'sync_routes_flag' => false,
+        'is_manual_update' => false,
+        'exception_status' => random_int(1,6),
     ];
 });

+ 34 - 0
database/migrations/2021_09_09_154053_add_column_exception_type_to_order_packages_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColumnExceptionTypeToOrderPackagesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->integer('exception_status')->default(0)->comment('异常状态');
+            $table->boolean('is_delay_deliver')->default(false)->comment('是否延迟发货');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->dropColumn('exception_status');
+            $table->dropColumn('is_delay_deliver');
+        });
+    }
+}

+ 207 - 0
tests/Services/LogisticSFService/SetExceptionStatusTest.php

@@ -0,0 +1,207 @@
+<?php
+
+
+namespace Tests\Services\LogisticSFService;
+
+
+use App\OrderPackage;
+use App\Services\LogisticSFService;
+use Tests\TestCase;
+
+class SetExceptionStatusTest extends TestCase
+{
+    /**
+     * @var LogisticSFService $service
+     */
+    private $service;
+
+    protected function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app('LogisticSFService');
+
+    }
+
+    public function test_单号异常()
+    {
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263_1')->delete();
+        $data = [
+            "logistic_number" => "SF1332897469263_1",
+            "status" => "已签收",
+            "received_at" => "2021-09-09 12:11:03",
+            "transfer_status" => [
+                ["accept_time" => "2021-09-08 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                ["accept_time" => "2021-09-08 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                ["accept_time" => "2021-09-08 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                ["accept_time" => "2021-09-08 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+            ],
+        ];
+        factory(OrderPackage::class)->create([
+            'status' => "生成订单",
+            'exception_status' => "单号异常",
+            'logistic_number' => 'SF1332897469263_1',
+        ]);
+        $response = $this->service->setExceptionStatus($data);
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263_1')->delete();
+        $this->assertEquals($data, $response);
+    }
+
+    public function test_延迟发货_16()
+    {
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $data = [
+            "logistic_number" => "SF1332897469263",
+            "status" => "已签收",
+            "received_at" => "2021-09-09 12:11:03",
+            "transfer_status" => [],
+        ];
+        factory(OrderPackage::class)->create([
+            'status' => "生成订单",
+            'logistic_number' => 'SF1332897469263',
+            'transfer_status' => null,
+            'sent_at' => null,
+            'created_at' => now()->subDays(3),
+        ]);
+        $response = $this->service->setExceptionStatus($data);
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $this->assertEquals('延迟发货', $response['exception_status']);
+    }
+
+    public function test_疑似库内丢件()
+    {
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $data = [
+            "logistic_number" => "SF1332897469263",
+            "status" => "已签收",
+            "received_at" => "2021-09-09 12:11:03",
+            "transfer_status" => [],
+        ];
+        factory(OrderPackage::class)->create([
+            'status' => "生成订单",
+            'logistic_number' => 'SF1332897469263',
+            'transfer_status' => null,
+            'sent_at' => now()->subDays(3),
+            'created_at' => now()->subDays(3),
+            'weighed_at' => null,
+        ]);
+        $response = $this->service->setExceptionStatus($data);
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $this->assertEquals('疑似库内丢件', $response['exception_status']);
+    }
+
+    public function test_揽件异常()
+    {
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $data = [
+            "logistic_number" => "SF1332897469263",
+            "status" => "已签收",
+            "received_at" => "2021-09-09 12:11:03",
+            "transfer_status" => [],
+        ];
+        factory(OrderPackage::class)->create([
+            'status' => "生成订单",
+            'logistic_number' => 'SF1332897469263',
+            'transfer_status' => null,
+            'sent_at' => now()->subDays(3),
+            'created_at' => now()->subDays(3),
+            'weighed_at' => now()->subDays(2),
+        ]);
+        $response = $this->service->setExceptionStatus($data);
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $this->assertEquals('揽件异常', $response['exception_status']);
+    }
+
+    public function test_在途异常大于3上海()
+    {
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $data = [
+            "logistic_number" => "SF1332897469263",
+            "status" => "在途",
+            "received_at" => null,
+            "transfer_status" => [
+                ["accept_time" => "2021-09-06 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                ["accept_time" => "2021-09-07 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                ["accept_time" => "2021-09-08 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                ["accept_time" => now()->subHours(25)->toDateTimeString(), "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                //最近一条是在24h前
+            ],
+        ];
+        $order =  factory(\App\Order::class)->create([
+            'province' =>'上海'
+        ]);
+        factory(OrderPackage::class)->create([
+            'status' => "生成订单",
+            'logistic_number' => 'SF1332897469263',
+            'transfer_status' => OrderPackage::switchStatus('在途'),
+            'sent_at' => now()->subDays(3),
+            'created_at' => now()->subDays(3),
+            'weighed_at' => now()->subDays(2),
+            'order_id' =>$order->id,
+        ]);
+        $response = $this->service->setExceptionStatus($data);
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $this->assertEquals('在途异常', $response['exception_status']);
+    }
+    public function test_在途异常小于3上海()
+    {
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $data = [
+            "logistic_number" => "SF1332897469263",
+            "status" => "在途",
+            "received_at" => null,
+            "transfer_status" => [
+                ["accept_time" => "2021-09-08 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                ["accept_time" => now()->subHours(25)->toDateTimeString(), "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                //最近一条是在24h前
+            ],
+        ];
+        $order =  factory(\App\Order::class)->create([
+            'province' =>'上海'
+        ]);
+        factory(OrderPackage::class)->create([
+            'status' => "生成订单",
+            'logistic_number' => 'SF1332897469263',
+            'transfer_status' => OrderPackage::switchStatus('在途'),
+            'sent_at' => now()->subDays(3),
+            'created_at' => now()->subDays(3),
+            'weighed_at' => now()->subDays(2),
+            'order_id' =>$order->id,
+        ]);
+        $response = $this->service->setExceptionStatus($data);
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $this->assertEquals('在途异常', $response['exception_status']);
+    }
+    public function test_在途异常大于3黑龙江()
+    {
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $data = [
+            "logistic_number" => "SF1332897469263",
+            "status" => "在途",
+            "received_at" => null,
+            "transfer_status" => [
+                ["accept_time" => "2021-08-06 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                ["accept_time" => "2021-08-07 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                ["accept_time" => "2021-08-08 19:25:42", "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                ["accept_time" => now()->subHours(73)->toDateTimeString(), "accept_address" => "上海市", "remark" => "顺丰速运 已收取快件",],
+                //最近一条是在24h前
+            ],
+        ];
+        $order =  factory(\App\Order::class)->create([
+            'province' =>'黑龙江省'
+        ]);
+        factory(OrderPackage::class)->create([
+            'status' => OrderPackage::switchStatus('在途'),
+            'logistic_number' => 'SF1332897469263',
+            'transfer_status' => [],
+            'sent_at' => now()->subDays(3),
+            'created_at' => now()->subDays(3),
+            'weighed_at' => now()->subDays(2),
+            'order_id' =>$order->id,
+        ]);
+        $response = $this->service->setExceptionStatus($data);
+        OrderPackage::query()->where('logistic_number', 'SF1332897469263')->delete();
+        $this->assertEquals('在途异常', $response['exception_status']);
+    }
+
+
+}