Explorar el Código

快递信息同步

ANG YU hace 4 años
padre
commit
f06471a8cc

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

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

@@ -129,7 +129,7 @@ class TestController extends Controller
     INSERT INTO TSK_TASKLISTS({$columns}) VALUES({$values})
 sql;
             dd($sql);
-        }catch (\Exception $e){
+        } catch (\Exception $e) {
             dd($e);
         }
     }
@@ -159,31 +159,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",
@@ -196,10 +196,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,
@@ -210,10 +210,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,
@@ -224,18 +224,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());
     }
@@ -259,11 +259,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[] = [
@@ -278,7 +279,6 @@ sql;
     }
 
 
-
     public function testUpdateInv()
     {
         ini_set('max_execution_time', 0);
@@ -351,4 +351,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/OrderPackage.php

@@ -53,7 +53,7 @@ class OrderPackage extends Model
         'transfer_status' => 'array',
         'sync_routes_flag' => 'boolean',
         'is_manual_update' => 'boolean',
-        '' => 'boolean',
+        'is_delay_deliver' => 'boolean',
     ];
 
     protected $dates = [

+ 0 - 3
app/Services/LogisticAliJiSuApiService.php

@@ -7,7 +7,6 @@ use App\Traits\ServiceAppAop;
 class LogisticAliJiSuApiService
 {
     use ServiceAppAop;
-    use \App\Traits\LogisticSyncTrait;
 
     public function query($logistic_number)
     {
@@ -62,8 +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;
-                $result = $this->setExceptionStatus($result);// 一定要在设置完路由之后调用
-
             } else {
                 $result['status'] = null;
                 $result['transfer_status'] = [];

+ 0 - 2
app/Services/LogisticSFService.php

@@ -12,7 +12,6 @@ use Illuminate\Support\Facades\Http;
 
 class LogisticSFService
 {
-    use LogisticSyncTrait;
     /**
      * 顺丰字段与数据库字段的映射关心
      * @var string[]
@@ -104,7 +103,6 @@ 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 {

+ 0 - 2
app/Services/LogisticYDService.php

@@ -11,7 +11,6 @@ use Illuminate\Support\Facades\Http;
 class LogisticYDService
 {
     use ServiceAppAop;
-    use LogisticSyncTrait;
 
     private $app_key;
     private $app_secret;
@@ -121,7 +120,6 @@ 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;

+ 0 - 2
app/Services/LogisticYTOService.php

@@ -10,7 +10,6 @@ use Illuminate\Support\Facades\Http;
 class LogisticYTOService
 {
     use ServiceAppAop;
-    use \App\Traits\LogisticSyncTrait;
 
 
     public function query($logistic_number)
@@ -65,7 +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;
-                $result = $this->setExceptionStatus($result);// 一定要在设置完路由之后调用
             } else {
                 $result['status'] = null;
                 $result['transfer_status'] = [];

+ 0 - 2
app/Services/LogisticZopService.php

@@ -10,7 +10,6 @@ use Illuminate\Support\Facades\Http;
 
 class LogisticZopService implements LogisticRouteInterface
 {
-    use LogisticSyncTrait;
     public function query($logistic_number)
     {
         $url = config('api_logistic.ZTO.url');
@@ -49,7 +48,6 @@ 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;
     }
 

+ 10 - 1
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;
 
     /**
      * 同步快递信息
@@ -189,12 +191,19 @@ class OrderPackageReceivedSyncService
             }
             //标记为手动更新的 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 (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'];
+            if (isset($logisticResponse['is_delay_deliver']) && !empty($logisticResponse['is_delay_deliver'])) $orderPackage->is_delay_deliver = $logisticResponse['is_delay_deliver'];
+            if (Str::contains($orderPackage->logistic_number,['SO','#','-'])) {
+                $orderPackage->exception_status = '单号异常';
+            }
             $orderPackage->save();
         }
     }

+ 6 - 8
app/Traits/LogisticSyncTrait.php

@@ -32,21 +32,19 @@ trait LogisticSyncTrait
         $data['exception_status'] = '';
         $created_at = Carbon::parse($orderPackage->created_at);
         //当天的16:30
-
+        $transfer_status = $data['transfer_status'] ?? [];
         if (empty($orderPackage->sent_at)) {//没复核
-            if (empty($data['transfer_status'])) {//没有路由信息
+            if (empty($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 {
@@ -54,7 +52,7 @@ trait LogisticSyncTrait
 //                $data['exception_status'] = '虚拟揽件'; //没有复核但是有路由信息   21-09-10 取消虚拟揽件状态
             }
         } else {//复核过
-            if (empty($data['transfer_status'])) {//没有路由信息
+            if (empty($transfer_status)) {//没有路由信息
                 /** @var Carbon $sent_at */
                 $sent_at = $orderPackage->sent_at;
                 if (now()->gt($sent_at->addDay()->startOfDay()->addHours(6))) {//当前时间大于复核时间的第二天6点
@@ -66,15 +64,15 @@ trait LogisticSyncTrait
                 }
             } else {//有路由信息
 
-                usort($data['transfer_status'], function ($a, $b) {
+                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 = $data['transfer_status'][0]['accept_time'];
-                if (count($data['transfer_status']) <= 3) {//三条以内的不管地区 时间限制为24h
+                $last_transfer = $transfer_status[0]['accept_time'];
+                if (count($transfer_status) <= 3) {//三条以内的不管地区 时间限制为24h
                     if (Carbon::parse($last_transfer)->diffInHours(now()) > 24) {
                         $data['exception_status'] = '在途异常';
                     }

+ 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: '称重日期'},

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