Selaa lähdekoodia

Merge branch 'master' into zzd

zhouzhendong 4 vuotta sitten
vanhempi
commit
97ff0a02da

+ 10 - 3
app/Filters/OrderPackageFilters.php

@@ -37,6 +37,7 @@ class OrderPackageFilters
         'result_explain',
         'issue_type_name',
         'order_notes',//订单备注
+        'exception_status',//订单备注
     ];
 
     protected $orderIssueQuery;
@@ -128,17 +129,17 @@ class OrderPackageFilters
 
     private function sent_at_start($sent_at_start)
     {
-        $this->queryBuilder->where('sent_at', '>=', Carbon::parse($sent_at_start)->startOfDay());
+        $this->queryBuilder->where('created_at', '>=', Carbon::parse($sent_at_start)->startOfDay());
     }
 
     private function sent_at_end($sent_at_end)
     {
-        $this->queryBuilder->where('sent_at', '<=', Carbon::parse($sent_at_end)->endOfDay());
+        $this->queryBuilder->where('created_at', '<=', Carbon::parse($sent_at_end)->endOfDay());
     }
 
     public function default_date()
     {
-        $this->queryBuilder->where('sent_at', '>=', now()->startOfDay()->subDays(15))->where('sent_at', '<', now()->startOfDay()->addDay());
+        $this->queryBuilder->where('created_at', '>=', now()->startOfDay()->subDays(15))->where('created_at', '<', now()->startOfDay()->addDay());
     }
 
     public function default_logistics()
@@ -212,4 +213,10 @@ class OrderPackageFilters
             $query->from('orders')->select('order_id')->whereIn('code', $ordernos);
         });
     }
+
+    public function exception_status($exception_status)
+    {
+        $arr = array_filter(preg_split('/[,, ]+/is', $exception_status));
+        $this->queryBuilder->whereIn('exception_status', $arr);
+    }
 }

+ 7 - 0
app/Http/Controllers/HandInStorageController.php

@@ -9,6 +9,7 @@ use App\OracleDOCASNHeader;
 use App\Services\HandInStorageService;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Log;
 
 class HandInStorageController extends Controller
 {
@@ -82,12 +83,15 @@ class HandInStorageController extends Controller
      */
     public function getBasSkuWithLot(Request $request): array
     {
+        $start=microtime(true);
         $customerid= $request->input('customerid');
         $skuOrBarcode= $request->input('sku');
         $asnno= $request->input('asnno');
         $asnDetail=app('HandInStorageService')->getAsnDetail($asnno,$skuOrBarcode);
         if (!$asnDetail)$this->error('无效条码');
         $basSku =app('HandInStorageService')->getBasSkuLotId($customerid,$asnDetail->sku);
+        $end=microtime(true);
+        if(($end-$start)>1)Log::warning('手持条码获取详情超时',$request->all());
         if (isset($basSku)&&isset($asnDetail))return ['success'=>true,'basSku'=>$basSku,'asnDetail'=>$asnDetail];
         else $this->error('无效条码');
     }
@@ -98,6 +102,7 @@ class HandInStorageController extends Controller
      */
     public function fluxHandIn(Request $request)
     {
+        $start=microtime(true);
         $this->gate("入库管理-手持入库-收货");
         $info=$request->input('info');
         if ($info['lotatt02']&&Carbon::now()->gt($info['lotatt02']))$this->error('失效日期超过入库效期');
@@ -120,6 +125,8 @@ class HandInStorageController extends Controller
             $result = $handInStorageService->fluxHandIn($info);
             if ($result){
                 $asnQty=$handInStorageService->getAsnQty($info['asnno']);
+                $end=microtime(true);
+                if(($end-$start)>2)Log::warning('手持收货超时',$request->all());
                 $this->success($asnQty);
             } else $this->error("收货失败");
         } catch (\Exception $e) {

+ 62 - 41
app/Http/Controllers/TestController.php

@@ -130,7 +130,7 @@ class TestController extends Controller
     INSERT INTO TSK_TASKLISTS({$columns}) VALUES({$values})
 sql;
             dd($sql);
-        }catch (\Exception $e){
+        } catch (\Exception $e) {
             dd($e);
         }
     }
@@ -160,31 +160,31 @@ sql;
         app("CacheShelfService")->_stationCacheLightOff("HAIB1-01-01");//灭灯
         app("CacheShelfService")->_stationCacheLightOff("HAIB1-02-01");//灭灯
         dd(1);*/
-        Station::query()->where("station_type_id",5)->update(["status"=>1]);
+        Station::query()->where("station_type_id", 5)->update(["status" => 1]);
         Cache::forget("CACHE_SHELF_AVAILABLE");
-        $station = ["HAIB1-01-01","HAIB1-02-01"];
-        $material = ["IDE0001824","IDE0001740","IDE0002710"];
-        Station::query()->whereIn("code",$station)->update(["status"=>0]);
-        $stations = Station::query()->whereIn("code",$station)->get();
-        $materials = MaterialBox::query()->whereIn("code",$material)->get();
+        $station = ["HAIB1-01-01", "HAIB1-02-01"];
+        $material = ["IDE0001824", "IDE0001740", "IDE0002710"];
+        Station::query()->whereIn("code", $station)->update(["status" => 0]);
+        $stations = Station::query()->whereIn("code", $station)->get();
+        $materials = MaterialBox::query()->whereIn("code", $material)->get();
         $dateTime = date("Y-m-d H:i:s");
         $task1 = StationTaskMaterialBox::query()->create([
-            'station_id'=>$stations[0]->id,
-            'material_box_id'=>$materials[0]->id,
-            'station_task_batch_id'=>1,
-            'status'=>'待处理'
+            'station_id' => $stations[0]->id,
+            'material_box_id' => $materials[0]->id,
+            'station_task_batch_id' => 1,
+            'status' => '待处理'
         ]);
-        $task2=StationTaskMaterialBox::query()->create([
-            'station_id'=>$stations[1]->id,
-            'material_box_id'=>$materials[1]->id,
-            'station_task_batch_id'=>1,
-            'status'=>'待处理'
+        $task2 = StationTaskMaterialBox::query()->create([
+            'station_id' => $stations[1]->id,
+            'material_box_id' => $materials[1]->id,
+            'station_task_batch_id' => 1,
+            'status' => '待处理'
         ]);
-        $task3=StationTaskMaterialBox::query()->create([
-            'station_id'=>6,
-            'material_box_id'=>$materials[2]->id,
-            'station_task_batch_id'=>1,
-            'status'=>'待处理'
+        $task3 = StationTaskMaterialBox::query()->create([
+            'station_id' => 6,
+            'material_box_id' => $materials[2]->id,
+            'station_task_batch_id' => 1,
+            'status' => '待处理'
         ]);
         TaskTransaction::query()->insert([[
             "doc_code" => "test",
@@ -197,10 +197,10 @@ sql;
             "type" => "出库",
             "status" => 0,
             "mark" => 2,
-            "bin_number"=>1,
-            "created_at"=>$dateTime,
-            "updated_at"=>$dateTime,
-        ],[
+            "bin_number" => 1,
+            "created_at" => $dateTime,
+            "updated_at" => $dateTime,
+        ], [
             "doc_code" => "test",
             "bar_code" => "test",
             "to_station_id" => $stations[1]->id,
@@ -211,10 +211,10 @@ sql;
             "type" => "出库",
             "status" => 0,
             "mark" => 2,
-            "bin_number"=>1,
-            "created_at"=>$dateTime,
-            "updated_at"=>$dateTime,
-        ],[
+            "bin_number" => 1,
+            "created_at" => $dateTime,
+            "updated_at" => $dateTime,
+        ], [
             "doc_code" => "test",
             "bar_code" => "test",
             "to_station_id" => 6,
@@ -225,18 +225,18 @@ sql;
             "type" => "出库",
             "status" => 3,
             "mark" => 2,
-            "bin_number"=>1,
-            "created_at"=>$dateTime,
-            "updated_at"=>$dateTime,
+            "bin_number" => 1,
+            "created_at" => $dateTime,
+            "updated_at" => $dateTime,
         ]]);
         $foreignHaiRoboticsService = new ForeignHaiRoboticsService();
         $toLocation = collect($station);
-        $taskMaterialBoxes = collect([$task1,$task2]);
+        $taskMaterialBoxes = collect([$task1, $task2]);
         $foreignHaiRoboticsService->
-        fetchGroup_multiLocation($toLocation, $taskMaterialBoxes, '', '立架出至缓存架',20,false);
-        foreach ($toLocation as $index=>$value){
-            app("CacheShelfService")->lightUp($value,'3','0',["title"=>"机器人取箱中,禁止操作"]);
-            Cache::forever("CACHE_SHELF_OCCUPANCY_{$stations[$index]->id}",true);
+        fetchGroup_multiLocation($toLocation, $taskMaterialBoxes, '', '立架出至缓存架', 20, false);
+        foreach ($toLocation as $index => $value) {
+            app("CacheShelfService")->lightUp($value, '3', '0', ["title" => "机器人取箱中,禁止操作"]);
+            Cache::forever("CACHE_SHELF_OCCUPANCY_{$stations[$index]->id}", true);
         }
         app("StationService")->locationOccupyMulti($toLocation->toArray());
     }
@@ -260,11 +260,12 @@ sql;
         }
     }
 
-    public function updateWorkOrder(){
+    public function updateWorkOrder()
+    {
         $items = WorkOrder::query()->with('order.owner')->get();
         $params = [];
-        $items->each(function($item)use(&$params){
-            if ($item->order){
+        $items->each(function ($item) use (&$params) {
+            if ($item->order) {
                 $owner_id = $item->order->owner_id;
 
                 $params[] = [
@@ -279,7 +280,6 @@ sql;
     }
 
 
-
     public function testUpdateInv()
     {
         ini_set('max_execution_time', 0);
@@ -352,4 +352,25 @@ sql;
             }
         }
     }
+
+    /**
+     * 重置15天内的数据
+     */
+    public function order_packages_init()
+    {
+        OrderPackage::query()
+            ->whereBetween('created_at', [now()->subDays(15), now()])
+            ->update([
+                'is_delay_deliver' => 0,
+                'sync_routes_flag' => 0,
+                'status' => 1,
+                'exception_status' => 0,
+            ]);
+        OrderPackage::query()
+            ->whereBetween('created_at', [now()->subDays(15), now()])
+            ->whereNotNull('received_at')
+            ->update([
+                'status' => 7,
+            ]);
+    }
 }

+ 1 - 0
app/Jobs/LogisticYTOSync.php

@@ -27,6 +27,7 @@ class LogisticYTOSync implements ShouldQueue
 
     protected $logistic_number;
     protected $logisticYTOService;
+    /** @var orderPackageReceivedSyncService OrderPackageReceivedSyncService */
     protected $orderPackageReceivedSyncService;
 
     /**

+ 1 - 1
app/OracleDOCASNHeader.php

@@ -29,6 +29,6 @@ class OracleDOCASNHeader extends Model
     public function asnDetails()
     {
         return $this->hasMany(OracleDOCASNDetail::class,'asnno','asnno')
-            ->select('asnno','asnlineno','customerid','sku','skudescrc','linestatus','lotatt08','lotatt05','receivedqty','expectedqty','addtime','edittime');
+            ->select('asnno','asnlineno','customerid','sku','skudescrc','linestatus','lotatt08','lotatt05','receivedqty','receivedqty_each','expectedqty','addtime','edittime');
     }
 }

+ 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',
+        'is_delay_deliver' => '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');

+ 1 - 2
app/Services/HandInStorageService.php

@@ -618,11 +618,10 @@ sql;
                 $asnDetail['customerid'] == $info['customerid'] &&
                 $asnDetail['sku'] == $info['sku'] ){
                 $receiveAsn = $asnDetail;
-                break;
             }
         }
 
-        if (!$receiveAsn) return true;
+        if (!$receiveAsn) return false;
 
         $receivedQty = (int)($receiveAsn['receivedqty']??$receiveAsn['receivedqty_each']);  // 已收货数量
         $amount = (int) $info['amount'];                    // 当前收货数量

+ 0 - 3
app/Services/LogisticAliJiSuApiService.php

@@ -61,9 +61,6 @@ 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);
-
             } else {
                 $result['status'] = null;
                 $result['transfer_status'] = [];

+ 6 - 13
app/Services/LogisticSFService.php

@@ -5,10 +5,9 @@ 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
@@ -125,9 +124,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,26 +152,20 @@ 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:
+                case 125:
                 case 80:
                     $data['status'] = '已签收';
                     $data['received_at'] = $lastRoute[$this->protected_switch['received_at']];
                     break;
-                case 648:
-                case 99:
-                    $data['status'] = '返回中';
-                    break;
                 case 70:
                     $data['status'] = '其他';
                     break;

+ 3 - 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;
@@ -119,6 +120,7 @@ class LogisticYDService
                 }
                 $result['transfer_status'] = $this->getTransferStatus($nativeRoutes);
                 $result['routes_length'] = array_key_exists('transfer_status', $result) ? count($result['transfer_status']) : 0;
+
             } else {
                 $result['status'] = null;
                 $result['transfer_status'] = [];
@@ -140,7 +142,7 @@ class LogisticYDService
         $status = null;
         switch ($nativeData->status) {
             case 'GOT':
-                $status = '已揽';
+                $status = '已揽';
                 break;
             case 'TRANSIT':
                 $status = '在途';

+ 1 - 3
app/Services/LogisticYTOService.php

@@ -64,8 +64,6 @@ 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);
             } else {
                 $result['status'] = null;
                 $result['transfer_status'] = [];
@@ -84,7 +82,7 @@ class LogisticYTOService
         switch ($nativeData->infoContent) {
             case 'ARRIVAL':
             case 'GOT':
-                $status = '已揽';
+                $status = '已揽';
                 break;
             case 'DEPARTURE':
             case 'PACKAGE':

+ 2 - 2
app/Services/LogisticZopService.php

@@ -4,12 +4,12 @@
 namespace App\Services;
 
 use App\OrderPackage;
+use App\Traits\LogisticSyncTrait;
 use Carbon\Carbon;
 use Illuminate\Support\Facades\Http;
 
 class LogisticZopService implements LogisticRouteInterface
 {
-
     public function query($logistic_number)
     {
         $url = config('api_logistic.ZTO.url');
@@ -60,7 +60,7 @@ class LogisticZopService implements LogisticRouteInterface
         $received_at = null;
         switch ($lastRoute->scanType) {
             case '收件':
-                $status = '已揽';
+                $status = '已揽';
                 break;
             case '到件':
             case '发件':

+ 17 - 18
app/Services/OrderPackageReceivedSyncService.php

@@ -13,11 +13,13 @@ use App\OrderPackage;
 use Carbon\Carbon;
 use Exception;
 use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Str;
 
 class OrderPackageReceivedSyncService
 {
     protected $logisticSFService;
     protected $logisticZopService;
+    use \App\Traits\LogisticSyncTrait;
 
     /**
      * 同步快递信息
@@ -38,10 +40,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 +97,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,24 +189,21 @@ 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']);
+                if (OrderPackage::switchStatus($orderPackage->status)>OrderPackage::switchStatus($logisticResponse['status']??'生成订单')) {
+                    unset($logisticResponse['status']);
+                }
+            }
+            $logisticResponse = $this->setExceptionStatus($logisticResponse);
+            if (Str::contains($orderPackage->logistic_number,['SO','#','-'])) {
+                $logisticResponse['exception_status'] = '单号异常';
             }
-            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'];
-            $orderPackage->save();
+            if (isset($logisticResponse['exception_status'])) $logisticResponse['exception_status'] = OrderPackage::switchExceptionStatus($logisticResponse['exception_status']);
+            if (isset($logisticResponse['status'])) $logisticResponse['status'] = OrderPackage::switchStatus($logisticResponse['status']);
+            if (isset($logisticResponse['routes_length'])) unset($logisticResponse['routes_length']);
+            OrderPackage::query()->where('logistic_number', $logisticResponse['logistic_number'])
+                ->update($logisticResponse);
         }
     }
 

+ 138 - 0
app/Traits/LogisticSyncTrait.php

@@ -0,0 +1,138 @@
+<?php
+
+namespace App\Traits;
+
+use App\OrderPackage;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Str;
+use function DeepCopy\deep_copy;
+
+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
+        $transfer_status = $data['transfer_status'] ?? [];
+        if (empty($orderPackage->sent_at)) {//没复核
+            if (empty($transfer_status)) {//没有路由信息
+                //延迟发货
+                $created_at_clone = deep_copy($created_at);
+                if ($created_at->gt($created_at_clone->startOfDay()->addHours(16)->addMinutes(30))) {//下午16的单
+                    $created_at_clone = deep_copy($created_at);
+                    if ($created_at_clone->addDay()->endOfDay()->lt(now())) {//超过第二天的24时
+                        $created_at_clone = deep_copy($created_at);
+                        $data['exception_status'] = '延迟发货';
+                        $data['is_delay_deliver'] = true;
+                    }
+                } else {
+                    if ($created_at_clone->endOfDay()->lt(now())) {//超过当天的24时
+                        $data['exception_status'] = '延迟发货';
+                        $data['is_delay_deliver'] = true;
+                    }
+                }
+            } else {
+                //虚拟揽件
+//                $data['exception_status'] = '虚拟揽件'; //没有复核但是有路由信息   21-09-10 取消虚拟揽件状态
+            }
+        } else {//复核过
+            if (empty($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($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 = $transfer_status[0]['accept_time'];
+                $last_remark = $transfer_status[0]['remark'];
+                if (count($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'] = '在途异常';
+                    }
+                }
+                if (Str::contains($last_remark,['代收','快递柜'])) {
+                    $data['exception_status'] = '';
+                    $data['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');
+        });
+    }
+}

+ 42 - 0
database/migrations/2021_09_11_142547_add_index_to_order_packages_table.php

@@ -0,0 +1,42 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddIndexToOrderPackagesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->dropIndex('order_packages_express_index');
+        });
+
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->index(['sent_at', 'order_id', 'status', 'exception_status', 'received_at', 'sync_routes_flag'], 'order_packages_express_index');
+
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->dropIndex('order_packages_express_index');
+
+        });
+
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->index(['sent_at', 'order_id', 'status', 'received_at', 'sync_routes_flag'], 'order_packages_express_index');
+        });
+    }
+}

+ 54 - 28
resources/views/package/logistic/index.blade.php

@@ -115,23 +115,35 @@
                         <input class="checkItem" type="checkbox" :value="package.logistic_number">
                     </td>
                     <td>
-                        <span style="position:relative">
+                        <span style="position:relative;line-height: 12px">
                             @{{ i+1 }}
-                            <span class="badge badge-danger" v-if="package.order.issue">问题件</span>
+                            <!--          是否同步过                  -->
                             <span
                                 style="display: inline-block;width: 15px;height: 15px;border-radius: 50%;position: relative;top: 3px; margin-left: 3px;box-shadow: 0 0 3px #211f1f"
-                                  :style="package.sync_routes_flag?'background-color:#4ed32d':'background-color:#e83939'"></span>
+                                :style="package.sync_routes_flag?'background-color:#4ed32d':'background-color:#e83939'"></span>
+                            <!--               是否为问题件         -->
+                            <span class="badge badge-danger" v-if="package.order.issue">?</span>
+
+<!--       是否手动修改                     -->
                             <span v-if="package.is_manual_update">
                                 <i class="fa fa-hand-paper-o" aria-hidden="true"
                                    style="color: red;margin-left: 5px"></i>
                             </span>
+<!--     延时发货图标                       -->
+                            <span
+                                v-if="package.is_delay_deliver"
+                                style="margin-left: 5px">
+                                <i class="fa fa-circle-o-notch fa-spin"></i>
+                            </span>
                         </span>
                     </td>
-                    <td>@{{ package.logistic_number }}</td>
+                    <td :style="package.exception_status=='单号异常'?'color:red':''">@{{ package.logistic_number }}</td>
                     <td>@{{ package.status }}</td>
+                    <td>@{{ package.exception_status }}</td>
                     <td>@{{ package.order != null ? package.order.logistic.name : '#' }}</td>
                     <td>@{{ package.order != null ? package.order.owner.name : '#' }}</td>
                     <td>@{{ package.order != null ? package.order.province : '#' }}</td>
+                    <td>@{{ package.created_at }}</td>
                     <td>@{{ package.sent_at }}</td>
                     <td>@{{ package.received_at }}</td>
                     <td>@{{ package.weighed_at }}</td>
@@ -267,20 +279,23 @@
                 showRemarkList: {},
                 selectTr: 0,
                 statuses: [
-                    '无',
+                    '生成订单',
+                    '已复核',
                     '已称重',
-                    '已揽收',
-                    '揽件异常',
-                    '疑似库内丢件',
+                    '已揽件',
                     '在途',
-                    '在途异常',
                     '派送中',
-                    '派送异常',
-                    '返回中',
-                    '返回异常',
-                    '返回派件',
-                    '其他异常',
                     '已签收',
+                    '其他',
+                    '返回中',
+                ],
+                exception_statuses: [
+                    '单号异常',
+                    '无法获取路由',
+                    '延迟发货',
+                    '疑似库内丢件',
+                    '在途异常',
+                    '揽件异常'
                 ],
                 batchStatus: null,
                 remarkHover: null,
@@ -319,20 +334,15 @@
                             tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
                             placeholder: ['状态','定位或多选状态'],
                             data: [
-                                {name: '1', value: '无'},
-                                {name: '2', value: '已称重'},
-                                {name: '3', value: '已揽收'},
-                                {name: '4', value: '揽件异常'},
-                                {name: '5', value: '疑似库内丢件'},
-                                {name: '6', value: '在途'},
-                                {name: '7', value: '在途异常'},
-                                {name: '8', value: '派送中'},
-                                {name: '9', value: '派送异常'},
-                                {name: '10', value: '返回中'},
-                                {name: '11', value: '返回异常'},
-                                {name: '12', value: '返回派件'},
-                                {name: '13', value: '其他异常'},
-                                {name: '14', value: '已签收'},
+                                {name: '1', value: '生成订单'},
+                                {name: '2', value: '已复核'},
+                                {name: '3', value: '已称重'},
+                                {name: '4', value: '已揽件'},
+                                {name: '5', value: '在途'},
+                                {name: '6', value: '派送中'},
+                                {name: '7', value: '已签收'},
+                                {name: '8', value: '其他'},
+                                {name: '9', value: '返回中'},
                             ]
                         },
                         {name: 'sent_at_start', type: 'dateTime', tip: '选择显示发出时间的起始时间'},
@@ -421,6 +431,20 @@
                             ]
                         },
                         {name: 'order_notes', type: 'input', tip: '糊模查找需要在右边打上%符号', placeholder: '订单备注'},
+                        {
+                            name: 'exception_status',
+                            type: 'select_multiple_select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的异常'],
+                            placeholder: ['异常', '定位或多选异常'],
+                            data: [
+                                {name: '1', value: '单号异常'},
+                                {name: '2', value: '无法获取路由'},
+                                {name: '3', value: '延迟发货'},
+                                {name: '4', value: '疑似库内丢件'},
+                                {name: '5', value: '在途异常'},
+                                {name: '6', value: '揽件异常'},
+                            ]
+                        },
 
                     ]
                 ];
@@ -434,9 +458,11 @@
                     {name: 'index', value: '序号', neglect: true},
                     {name: 'logistic_number', value: '单号'},
                     {name: 'status', value: '状态'},
+                    {name: 'exception_status', value: '异常状态'},
                     {name: 'logistic_name', value: '快递公司'},
                     {name: 'owner_name', value: '货主'},
                     {name: 'province', value: '省份'},
+                    {name: 'created_at', value: '订单生成日期'},
                     {name: 'sent_at', value: '发出日期'},
                     {name: 'received_at', value: '收货日期'},
                     {name: 'weighed_at', value: '称重日期'},

+ 0 - 1
resources/views/store/handInStorage/receiveDetailPage.blade.php

@@ -295,7 +295,6 @@
                             if (res.data.success){
                                 this.asnDetails=res.data.data;
                                 this.$forceUpdate()
-                                return;
                             }else {
                                 window.tempTip.setDuration(3000);
                                 window.tempTip.show(res.data.data);

+ 7 - 5
resources/views/transport/waybill/delivering.blade.php

@@ -9,10 +9,12 @@
                 <div class="text-center" :class="slideStatus[date] ? 'col-8' : 'col-12'" @click="selectedHeader(date)" @touchstart="startSlide()" @touchend="endSlide(date)">
                     @{{ date }}<i class="fa mr-2 pull-right" style="top: 2em" :class="header[date] ? 'fa-angle-down' : 'fa-angle-right'"></i>
                 </div>
-                <div class="col-4 bg-white p-1" :class="slideStatus[date] ? '' : 'd-none'">
-
+                <div class="col-4  p-0" :class="slideStatus[date] ? '' : 'd-none'">
                    <span class="btn btn-sm btn-success w-100" v-if="!item.pick_up_fee_total"  @click="dailyBillingApp(date)">按日输入专线费</span>
-                   <span class="text-info w-100 small" v-else>已输入专线费:<span class="font-weight-bold">@{{ item.pick_up_fee_total }}</span></span>
+                   <span class="text-info w-100 small" v-else>专线费:
+                       <span class="font-weight-bold">@{{ item.pick_up_fee_total }}</span>
+                       <span class="btn btn-sm btn-info text-white" @click="dailyBillingApp(date)">修改</span>
+                   </span>
                 </div>
             </div>
             <div class="card-body p-0" v-if="header[date]">
@@ -171,7 +173,7 @@
                 setTimeout(()=>{
                     element.classList.remove('translationRtoL');
                     this.$set(this.slideStatus,date,true);
-                },400);
+                },300);
             },
             lToR(date,element){
                 if (!this.slideStatus[date])return;
@@ -179,7 +181,7 @@
                 setTimeout(()=>{
                     element.classList.remove('translationLtoR');
                     this.$set(this.slideStatus,date,false);
-                },400);
+                },300);
             },
             selectedHeader(date){
                 if (this.header[date]===undefined)this.loadData(date);

+ 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']);
+    }
+
+
+}

+ 28 - 0
tests/Services/LogisticYTSync/SyncTest.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace Tests\Services\LogisticYTSync;
+
+use App\Jobs\LogisticYTOSync;
+use App\Services\LogisticYTOService;
+use Tests\TestCase;
+
+class SyncTest extends TestCase
+{
+
+    /** @var LogisticYTOService $service */
+    public $service;
+
+    function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('LogisticYTOService');
+    }
+
+    /**
+     * @test
+     */
+    public function format_test()
+    {
+        LogisticYTOSync::dispatch('YT5781193551713');
+    }
+}