소스 검색

Merge branch 'master' into Haozi

# Conflicts:
#	app/Http/Controllers/TestController.php
haozi 4 년 전
부모
커밋
2463d96aa0
39개의 변경된 파일977개의 추가작업 그리고 811개의 파일을 삭제
  1. 1 1
      app/Console/Kernel.php
  2. 1 1
      app/Events/OrderIssueProcessLogCreateEvent.php
  3. 25 19
      app/Filters/OrderPackageFilters.php
  4. 18 4
      app/Http/ApiControllers/LoginController.php
  5. 10 17
      app/Http/Controllers/MeasureMonitorController.php
  6. 8 19
      app/Http/Controllers/PackageLogisticController.php
  7. 14 49
      app/Http/Controllers/TestController.php
  8. 44 9
      app/Http/Controllers/WaybillController.php
  9. 2 0
      app/Http/Kernel.php
  10. 53 0
      app/Http/Middleware/AuthorizingApi.php
  11. 1 1
      app/Http/Middleware/DecodingRequest.php
  12. 1 1
      app/Listeners/UpdateOrderPackageExceptionListener.php
  13. 220 146
      app/OrderPackage.php
  14. 2 0
      app/Providers/AppServiceProvider.php
  15. 12 13
      app/Providers/EventServiceProvider.php
  16. 3 14
      app/Services/LogisticAliJiSuApiService.php
  17. 1 24
      app/Services/LogisticSFService.php
  18. 4 20
      app/Services/LogisticYDService.php
  19. 3 14
      app/Services/LogisticYTOService.php
  20. 5 16
      app/Services/LogisticZopService.php
  21. 35 0
      app/Services/MeasureMonitorService.php
  22. 13 0
      app/Services/OrderIssueService.php
  23. 14 13
      app/Services/OrderPackageReceivedSyncService.php
  24. 1 5
      app/Services/OrderPackageService.php
  25. 10 2
      app/Services/OrderTrackingService.php
  26. 25 22
      app/Services/UserService.php
  27. 2 1
      app/Waybill.php
  28. 1 1
      app/library/baidu-api-speech/lib/2a7552bdd1b678c303ad53645baeafce
  29. 3 0
      config/api.php
  30. 1 1
      database/factories/OrderPackageFactory.php
  31. 60 0
      database/migrations/2021_08_24_092216_drop_column_exception_type_and_exception_to_order_packages_table.php
  32. 32 0
      database/migrations/2021_08_24_143918_change_waybills_add_column_subjoin_fee.php
  33. 32 0
      database/migrations/2021_08_25_132757_add_column_is_manual_update_status_to_order_packages_table.php
  34. 1 1
      resources/js/queryForm/queryForm.js
  35. 50 108
      resources/views/package/logistic/index.blade.php
  36. 76 60
      resources/views/package/measureMonitor/index.blade.php
  37. 177 227
      resources/views/transport/waybill/delivering.blade.php
  38. 12 0
      routes/api.php
  39. 4 2
      routes/web.php

+ 1 - 1
app/Console/Kernel.php

@@ -73,7 +73,7 @@ class  Kernel extends ConsoleKernel
         $schedule->command('sync:order')->everyMinute();
         $schedule->command('syncOrderPackageLogisticRouteTask')->dailyAt('1:20');//同步快递信息到orderPackage
         $schedule->command('syncOrderPackageLogisticRouteTask')->dailyAt('12:01');//同步快递信息到orderPackage
-        $schedule->command('updateOrderPackageExceptionTypeCountingRecordTask')->dailyAt('2:20');//更新OrderPackageExceptionTypeCountingRecord
+//        $schedule->command('updateOrderPackageExceptionTypeCountingRecordTask')->dailyAt('2:20');//更新OrderPackageExceptionTypeCountingRecord
         $schedule->command('SyncWmsCommoditiesInformation')->everyMinute();
         $schedule->command('clear:cancelledOrder')->everyMinute();
         $schedule->command('WasSyncWmsAsnInformation')->everyMinute();

+ 1 - 1
app/Events/OrderIssueProcessLogCreateEvent.php

@@ -18,7 +18,7 @@ class OrderIssueProcessLogCreateEvent
     /**
      * @var int
      * 1 返回派件
-     * 2 已收
+     * 2 已
      */
     public $status;
 

+ 25 - 19
app/Filters/OrderPackageFilters.php

@@ -16,12 +16,24 @@ class OrderPackageFilters
 {
     protected $request;
     protected $queryBuilder;
-    protected $filters = ['logistic_number', 'status', 'received_at_start',
+    protected $filters = [
+        'logistic_number',
+        'status',
+        'received_at_start',
         'default_logistics',
         'is_issue',
         'sync_routes_flag',
         'remark',
-        'received_at_end', 'is_weighed', 'logistic', 'owner', 'sent_at_start', 'sent_at_end', 'is_exception', 'exception_type', 'default_date', 'has_transfer_status'];
+        'received_at_end',
+        'is_weighed',
+        'logistic',
+        'owner',
+        'sent_at_start',
+        'sent_at_end',
+        'default_date',
+        'has_transfer_status',
+        'is_new_rejecting',
+    ];
 
     protected $orderIssueQuery;
 
@@ -61,11 +73,6 @@ class OrderPackageFilters
         }
     }
 
-    private function exception_type($exception_type)
-    {
-        $exception_types = array_filter(preg_split('/[,]+/is', $exception_type));
-        $this->queryBuilder->whereIn('exception_type', $exception_types);
-    }
 
     private function has_transfer_status($has_transfer_status)
     {
@@ -78,7 +85,8 @@ class OrderPackageFilters
 
     private function status($status)
     {
-        $this->queryBuilder->where('status', $status);
+        $statuses = array_filter(preg_split('/[,, ]+/is', $status));
+        $this->queryBuilder->whereIn('status', $statuses);
     }
 
     private function received_at_start($received_at_start)
@@ -124,11 +132,6 @@ class OrderPackageFilters
         $this->queryBuilder->where('sent_at', '<=', Carbon::parse($sent_at_end)->endOfDay());
     }
 
-    private function is_exception($is_exception)
-    {
-        $this->queryBuilder->where('exception', $is_exception);
-    }
-
     public function default_date()
     {
         $this->queryBuilder->where('sent_at', '>=', now()->startOfDay()->subDays(15))->where('sent_at', '<', now()->startOfDay()->addDay());
@@ -147,15 +150,11 @@ class OrderPackageFilters
     {
         if ($is_issue === '是') {
             $this->queryBuilder->whereIn('order_id', function ($query) {
-                $query->from('orders')->select('id')->whereIn('id', function ($query) {
-                    $query->from('order_issues')->select('order_id')->whereNotNull('order_id');
-                });
+                $query->from('order_issues')->select('order_id')->whereNotNull('order_id');
             });
         } else {
             $this->queryBuilder->whereIn('order_id', function ($query) {
-                $query->from('orders')->select('id')->whereNotIn('id', function ($query) {
-                    $query->from('order_issues')->select('order_id')->whereNotNull('order_id');
-                });
+                $query->from('order_issues')->select('order_id')->whereNotNull('order_id');
             });
         }
     }
@@ -171,4 +170,11 @@ class OrderPackageFilters
             $query->from('order_package_remarks')->select('order_package_id')->where('content', 'like', $remark);
         });
     }
+
+    public function is_new_rejecting($is_new_rejecting)
+    {
+        $this->queryBuilder->whereIn('order_id', function ($query) use ($is_new_rejecting) {
+            $query->from('order_issues')->select('order_id')->where('is_new_rejecting', $is_new_rejecting);
+        });
+    }
 }

+ 18 - 4
app/Http/ApiControllers/LoginController.php

@@ -4,10 +4,10 @@
 namespace App\Http\ApiControllers;
 
 
-use Firebase\JWT\JWT;
 use Illuminate\Foundation\Auth\User;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Hash;
 
 class LoginController
@@ -15,6 +15,8 @@ class LoginController
     /**
      * JWT登录
      *
+     * {message:'',status_code:200,code:null,data:'',errors:{}}
+     *
      * @param Request $request
      * @return JsonResponse
      */
@@ -28,7 +30,7 @@ class LoginController
             'status_code' => 200,
         ];
         //验证用户登录
-        if (!$user || !Hash::check(base64_encode($password),$user->password)){
+        if (!$user || !Hash::check(base64_decode($password),$user->password)){
             $response["message"] = "用户名或密码错误";
             $response["status_code"] = 401;
             return response()->json($response);
@@ -37,7 +39,6 @@ class LoginController
         //获取公私钥
         try {
             $privateKey = file_get_contents(base_path().'/private.pem');
-            //$publicKey = file_get_contents(base_path().'/public.pem');
         }catch (\Exception $e){
             $response["status_code"] = 410;
             if (strpos($e->getMessage(),"No such file or directory")!==false)$response["message"] = "服务器异常,资源丢失";
@@ -46,7 +47,8 @@ class LoginController
         }
 
         try {
-            $response["data"] = ["token"=>$this->getJWTToken($user,$privateKey)];
+            $response["data"] = ["token"=>app("UserService")->getJWTToken($user,$privateKey)];
+            app("UserService")->setOrRefreshCache($user);
             return response()->json($response);
         }catch (\Exception $e){
             $response["status_code"] = 409;
@@ -55,5 +57,17 @@ class LoginController
         }
     }
 
+    public function test()
+    {
+        return response()->json([
+            "message" => "登陆成功",
+            "status_code"=>200,
+            "data"=>[
+                "param" => \request("test"),
+                "user" => Auth::id(),
+            ],
+        ]);
+    }
+
 
 }

+ 10 - 17
app/Http/Controllers/MeasureMonitorController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\MeasuringMachine;
 use App\OrderPackage;
+use App\Services\MeasureMonitorService;
 use Illuminate\Http\Request;
 require_once '../app/library/baidu-api-speech/AipSpeech.php';
 class MeasureMonitorController extends Controller
@@ -36,24 +37,16 @@ class MeasureMonitorController extends Controller
         return '';
     }
 
+    /** 获取快递面单的语音播报 */
+    public function speech(Request $request,MeasureMonitorService $service): array
+    {
 
-    public function speech(Request $request){
-        $logistic=$request->input('logistic');
-        if (!$logistic)$logistic='空';
-        if (file_exists("storage/".$logistic.'.mp3')){
-            return "/storage/".$logistic.'.mp3';
-        }
-        $client=new \AipSpeech(config('api.baidu.speech.APP_ID'),config('api.baidu.speech.API_KEY'),config('api.baidu.speech.SECRET_KEY'));
-        $client->setConnectionTimeoutInMillis('180000');
-        $client->setSocketTimeoutInMillis('180000');
-
-        $result = $client->synthesis($logistic, 'zh', 1, array(
-            'vol' => 15,
-        ));
-        // 识别正确返回语音二进制 错误则返回json 参照下面错误码
-        if(!is_array($result)){
-            file_put_contents('storage/'.$logistic.'.mp3', $result);
+        if ( app('OrderIssueService')->isExists($request['logistic_number'])){
+            return $service->getMp3Audio('拦截订单');
         }
-        return "/storage/".$logistic.'.mp3';
+        return $service->getMp3Audio($request->input('logistic'));
+
     }
+
+
 }

+ 8 - 19
app/Http/Controllers/PackageLogisticController.php

@@ -32,15 +32,15 @@ class PackageLogisticController extends Controller
         $orderPackages = OrderPackage::query()
             ->filter($filters)
             ->with(['order.logistic',
-                'orderPackageRemarks'=>function ($query){
+                'orderPackageRemarks' => function ($query) {
                     $query->with('user')->orderByDesc('created_at');
                 },
                 'order.owner',
                 'order.issue' => function ($query) {
-                $query->with(['issueType', 'logs' => function ($query) {
-                    $query->with('user')->orderBy('created_at', 'DESC');
-                }]);
-            }])
+                    $query->with(['issueType', 'logs' => function ($query) {
+                        $query->with('user')->orderBy('created_at', 'DESC');
+                    }]);
+                }])
             ->orderByDesc('id')
             ->paginate($request->paginate ?? 50);
         $logistics = Logistic::all();
@@ -64,21 +64,11 @@ class PackageLogisticController extends Controller
 
     public function batchUpdate(Request $request)
     {
-        $data = [];
-        if (array_key_exists('exception_type', $request->all())) {
-            if ('无' == $request->input('exception_type')) {
-                $data['exception_type'] = $request->input('exception_type');
-                $data['exception'] = "否";
-            } else {
-                $data['exception_type'] = $request->input('exception_type');
-            }
-        } else if (array_key_exists('status', $request->all())) {
-            $data['status'] = $request->input('status');
-        }
+        $data['status'] = OrderPackage::switchStatus($request->input('status'));
         $logistic_numbers = $request->input('logistic_numbers');
+        //标记为手动更新
+        $data['is_manual_update']= true;
         OrderPackage::query()->whereIn('logistic_number', $logistic_numbers)->update($data);
-        //更新统计数据
-        event(new UpdateOrderPackageExceptionListenerEvent($logistic_numbers));
     }
 
     /**
@@ -132,7 +122,6 @@ class PackageLogisticController extends Controller
                 }
             }
             $data = [
-                $orderPackage->exception_type,
                 $orderPackage->logistic_number,
                 $orderPackage->status,
                 $orderPackage->order->logistic->name,

+ 14 - 49
app/Http/Controllers/TestController.php

@@ -34,7 +34,7 @@ use App\OrderPackageCountingRecord;
 use App\RejectedBill;
 use App\Services\CacheShelfService;
 use App\Services\ForeignHaiRoboticsService;
-use App\Services\HandInStorageService;
+use App\Services\OrderPackageReceivedSyncService;
 use App\Services\OrderService;
 use App\Services\OwnerFeeTotalService;
 use App\Services\OwnerLogisticFeeReportService;
@@ -70,7 +70,8 @@ use PhpOffice\PhpSpreadsheet\Calculation\Web\Service;
 
 class TestController extends Controller
 {
-    use AsyncResponse,ErrorPush;
+    use AsyncResponse, ErrorPush;
+
     const ASNREFERENCE_2 = 'ASNREFERENCE2';
 
     public function __construct()
@@ -82,55 +83,13 @@ class TestController extends Controller
     {
         return call_user_func([$this, $method], $request);
     }
+
     public function test4()
     {
-        $user = User::query()->first();
-        $b = file_get_contents(base_path().'/public.pem');
-        $decoded = JWT::decode("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJkYXRhIjp7ImZpZWxkMSI6MSwiZmllbGQyIjoic3RyaW5nIGRhdGEifSwiaXNzIjoiaHR0cDpcL1wvZXhhbXBsZS5vcmciLCJhdWQiOiJodHRwOlwvXC9leGFtcGxlLmNvbSIsImlhdCI6MTYyOTc3NDUxMywiZWF0IjoxNjI5NzgxNzEzfQ.Twl3_KPMLP4Pi4zaGZig8SKhE9M6nZlCI8bVifWjuYIWuqZtlujp35Zvv1oY0GnPIkUmq-PGJZLU96mmT-RTRDL-83sPF2l7PPTeriYMoiKP1r2rsI421BtrgLs0qP7QCPxH5BmHWXAVbwTtnwv8JagKzcZxkZJRH3Lj8blRapumnCk-tMfHz4xiXHIATfMS1I23vhJJLomC-KW4Ou3pjTu6X3HiiUGe9ZBGTu5mHfiKm25dxXO5Fm3JMg2-anLf_Gy6D6D7IQJ5pM5HFEN-HdD7FibeEMraMxbk5B_82L15OjhaoCV7b7ioXNSs2QAdlRfuRgx0XIE_toFwb_152a", $b, ['RS256']);
-        $payload = [
-            'data' => ['field1' => 1, 'field2' => 'string data'],
-            "iss" => "http://example.org",
-            "aud" => "http://example.com",
-            "iat" => time(),
-            "eat" => time()+7200,
-        ];
-        try {
-            $token = JWT::encode($payload, $a, 'RS256');
-        }catch (\Exception $e){
-            $this->error("HTTP:409,资源异常,无法反馈");
-        }
-        try {
-            $a = file_get_contents("test");
-        }catch (\Exception $e){
-            if (strpos($e->getMessage(),"No such file or directory")!==false)$this->error("HTTP:410,服务器异常,资源丢失");
-            else $this->error("HTTP:403,访问某些资源失败");
-        }
-
-
-        $payload = [
-
-            'data' => ['field1' => 1, 'field2' => 'string data'],
-
-            "iss" => "http://example.org",
-
-            "aud" => "http://example.com",
-
-            "iat" => time(),
-
-            "eat" => time()+7200,
-
-        ];
 
-        $token = JWT::encode($payload, $a, 'RS256');
-
-        echo "Token:\n" . print_r($token, true) . "\n";
-
-        $decoded = JWT::decode($token, $b, ['RS256']);
-
-        $decoded_array = (array) $decoded;
-
-        echo "Decoded:\n" . print_r($decoded_array, true) . "\n";
+        dd(base64_encode("123456"),base64_decode("MTIzNDU2"));
     }
+
     public function OwnerStoreFeeReportService_recordReport()
     {
         /** @var OwnerStoreFeeReportService $service */
@@ -155,7 +114,7 @@ class TestController extends Controller
 //快递
     public function OwnerLogisticFeeReportService_record()
     {
-        ini_set('max_execution_time',-1);
+        ini_set('max_execution_time', -1);
 
         /** @var OwnerLogisticFeeReportService $service */
         $service = app('OwnerLogisticFeeReportService');
@@ -164,11 +123,17 @@ class TestController extends Controller
 
     public function order_packages_sync_routes_flag_init()
     {
-        OrderPackage::query()->whereNotNull('transfer_status')->update(['sync_routes_flag'=>true]);
+        OrderPackage::query()->whereNotNull('transfer_status')->update(['sync_routes_flag' => true]);
     }
 
     public function SettlementBillReportTask()
     {
         SettlementBillReportTask::dispatchNow('2021-08-01');
     }
+
+    public function init_order_packages_status()
+    {
+        OrderPackage::query()->whereNotNull('received_at')->update(['status' => 14]);
+    }
+
 }

+ 44 - 9
app/Http/Controllers/WaybillController.php

@@ -9,6 +9,7 @@ use App\Owner;
 use App\Region;
 use App\Services\CarTypeService;
 use App\Services\LogisticService;
+use App\Services\LogService;
 use App\Services\OwnerService;
 use App\Services\UnitService;
 use App\Services\WaybillPayoffService;
@@ -768,19 +769,39 @@ SQL;
         ])->direct();
     }
 
-    //发运
-    public function delivering(){
-        if (!Auth::user())return view('exception.login');
-        $waybills= Waybill::query()->where("type","专线")->whereNotNull("deliver_at")
-            ->whereNotNull("logistic_id")->whereIn("status",["已审核","待终审"])
-            ->whereNull("carrier_bill")->orderByDesc("id");
+    private function deliveringQuery(Request $request): Builder
+    {
+        $waybills= Waybill::query()->where("type","专线")->with(["order","logistic"])
+            ->whereNotNull("logistic_id")->whereNotIn("status",["未审核","待重审"])
+            ->orderByDesc("id")->limit(10);
         if (!Auth::user()->isSuperAdmin()){
             $carriersUsers=DB::table('logistic_user')->where('user_id',Auth::id())->get();
             $carrierIds=array_column($carriersUsers->toArray(),'logistic_id');
             if ($carrierIds)$waybills->whereIn("logistic_id",$carrierIds);
         }
-        $waybills = $waybills->get();
-        return view('transport.waybill.delivering',compact('waybills'));
+        $searchText = $request->get("searchText","");
+        if ($searchText)$waybills->where(function ($query)use($searchText){
+            $query->where("waybill_number",'like','%'.$searchText.'%')->orWhere("carrier_bill",'like','%'.$searchText.'%');
+        });
+        $lastId = $request->get("lastId","");
+        if ($lastId)$waybills->where("id","<",$lastId);
+        return $waybills;
+    }
+    //发运
+    public function delivering(Request $request){
+        if (!Auth::user())return view('exception.login');
+        $waybills = $this->deliveringQuery($request)->get();
+        $searchText = $request->get("searchText","");
+        return view('transport.waybill.delivering',compact('waybills',"searchText"));
+    }
+
+    /**
+     * 懒加载发运数据
+     */
+    public function loadData(Request $request)
+    {
+        if (!Auth::user())$this->error("登录信息失效");
+        $this->success($this->deliveringQuery($request)->get());
     }
     //承运商提交
     public function storeCarrierBill(Request $request){
@@ -1265,6 +1286,7 @@ SQL;
             $owner = array_unique($owner);
             if (count($owner)>1)$waybill->merge_owner = implode(',',$owner);
             $waybill->deliver_at = date("Y-m-d H:i:s");
+            if ($waybill->status=='未审核')$waybill->status = '已审核';
             $waybill->update();
             Waybill::destroy($destroys);
             WaybillAuditLog::query()->create([
@@ -1283,7 +1305,9 @@ SQL;
                 'audit_stage'=>'单独发货',
                 'user_id'=>Auth::id(),
             ]);
-            $waybill->update(["deliver_at"=>date("Y-m-d H:i:s"),"logistic"=>\request("logistic")]);
+            $update = ["deliver_at"=>date("Y-m-d H:i:s"),"logistic_id"=>\request("logistic")];
+            if ($waybill->status=='未审核')$update["status"] = '已审核';
+            $waybill->update($update);
         }
         $this->success();
     }
@@ -1344,4 +1368,15 @@ SQL;
         ]);
         $this->success();
     }
+
+    public function appendSubjoinFee()
+    {
+        $this->gate("运输管理-编辑");
+        $id = \request("id");
+        $subjoinFee = \request("subjoinFee");
+        if (!$id || !$subjoinFee)$this->error("非法参数");
+        if (Waybill::query()->where("id",$id)->update(["subjoin_fee"=>$subjoinFee]) == 0)$this->error("修改失败,运单信息发送变更");
+        LogService::log("运输附加费","调度商添加","录入人:".Auth::id()." | 修改费用{$id}为:".$subjoinFee);
+        $this->success();
+    }
 }

+ 2 - 0
app/Http/Kernel.php

@@ -2,6 +2,7 @@
 
 namespace App\Http;
 
+use App\Http\Middleware\AuthorizingApi;
 use App\Http\Middleware\CheckCsrfToken;
 use App\Http\Middleware\LogPostRequest;
 use Illuminate\Foundation\Http\Kernel as HttpKernel;
@@ -75,6 +76,7 @@ class Kernel extends HttpKernel
         'auth.api' => \App\Http\Middleware\ApiAuth::class,
         'procurement.auth.api' => \App\Http\Middleware\ProcurementApiAuth::class,
         'check.token' => CheckCsrfToken::class,
+        'authorizing' => AuthorizingApi::class,
     ];
 
     /**

+ 53 - 0
app/Http/Middleware/AuthorizingApi.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+use Firebase\JWT\ExpiredException;
+use Firebase\JWT\JWT;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
+
+class AuthorizingApi
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  Request  $request
+     * @param  Closure  $next
+     * @return mixed
+     */
+    public function handle(Request $request, Closure $next)
+    {
+        $token = $request->header("token");
+        if (!$token) return response()->json([
+                        'message' => '没有认证,请前去认证',
+                        'status_code' => 401,
+                    ]);
+        try {
+            $publicKey = Cache::remember("TOKEN_PUBLIC_KEY",7200,function (){
+                return file_get_contents(base_path().'/public.pem');
+            });
+        }catch (\Exception $e){
+            $response["status_code"] = 410;
+            if (strpos($e->getMessage(),"No such file or directory")!==false)$response["message"] = "服务器异常,资源丢失";
+            else $response["message"] = "访问某些资源失败";
+            return response()->json($response);
+        }
+        try {
+            $payload = JWT::decode($token, $publicKey, ['RS256']);
+            $user = app("UserService")->getOrRefreshCache($payload->data->id,$payload->exp);
+        }catch (ExpiredException $e){
+            $response["status_code"] = 401;
+            $response["message"] = "token失效";
+            return response()->json($response);
+        } catch (\Exception $e){
+            $response["status_code"] = 401;
+            $response["message"] = "token非法";
+            return response()->json($response);
+        }
+        Auth::setUser($user);
+        return $next($request);
+    }
+}

+ 1 - 1
app/Http/Middleware/DecodingRequest.php

@@ -18,7 +18,7 @@ class DecodingRequest
     {
         if ($request->method() == "GET"){
             foreach ($request->input() as $key => $value){
-                if ($value != null)$request->offsetSet($key, urldecode($value));
+                if ($value != null && is_string($value))$request->offsetSet($key, urldecode($value));
             }
         }
         return $next($request);

+ 1 - 1
app/Listeners/UpdateOrderPackageExceptionListener.php

@@ -33,7 +33,7 @@ class UpdateOrderPackageExceptionListener implements ShouldQueue
                 $status = '返回派件';
                 break;
             case 2:
-                $status = '已收';
+                $status = '已收';
                 break;
             default:
                 $status = '无';

+ 220 - 146
app/OrderPackage.php

@@ -40,38 +40,89 @@ class OrderPackage extends Model
         'status',
         'sent_at',
         'received_at',
-        'exception',
         'transfer_status',
         'owner_id',
         'uploaded_to_wms',
-        'exception_type',
         'sync_routes_flag',
+        'is_manual_update',
     ];
 
-    public function order(){
-        return $this->belongsTo('App\Order','order_id','id');
-    }
-
     protected $casts = [
         'transfer_status' => 'array',
         'sync_routes_flag' => 'boolean',
+        'is_manual_update' => 'boolean',
+    ];
+
+    static public $enums = [
+        'status' => [
+            ''=>0,
+            '无'=>1,
+            '已称重'=>2,
+            '已揽收'=>3,
+            '揽件异常'=>4,
+            '疑似库内丢件'=>5,
+            '在途'=>6,
+            '在途异常'=>7,
+            '派送中'=>8,
+            '派送异常'=>9,
+            '返回中'=>10,
+            '返回异常'=>11,
+            '返回派件'=>12,
+            '其他异常'=>13,
+            '已签收'=>14,
+            '其他'=>14,
+        ],
     ];
 
+    function __construct(array $attributes = [])
+    {
+        foreach (self::$enums as &$enum) {
+            $enum=$enum+array_flip($enum);
+        }
+        parent::__construct($attributes);
+    }
+
+    public function getStatusAttribute($value)
+    {
+        if(!$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];
+    }
+
+    public static function switchStatus($value): int
+    {
+        return self::$enums['status'][$value];
+    }
+
+    public function order()
+    {
+        return $this->belongsTo('App\Order', 'order_id', 'id');
+    }
+
+
     public function commodities(): HasMany
     {
-        return $this->hasMany('App\OrderPackageCommodities','order_package_id','id');
+        return $this->hasMany('App\OrderPackageCommodities', 'order_package_id', 'id');
     }
+
     public function paperBox(): HasOne
     {
-        return $this->hasOne('App\PaperBox','id','paper_box_id');
+        return $this->hasOne('App\PaperBox', 'id', 'paper_box_id');
     }
+
     public function measuringMachine(): HasOne
     {
-        return $this->hasOne('App\MeasuringMachine','id','measuring_machine_id');
+        return $this->hasOne('App\MeasuringMachine', 'id', 'measuring_machine_id');
     }
+
     public function WMSReflectPackage(): HasOne
     {
-        return $this->hasOne('App\WMSReflectPackage','SOReference5','logistic_number');
+        return $this->hasOne('App\WMSReflectPackage', 'SOReference5', 'logistic_number');
     }
 
     static protected $oracleOrderHeaderFields = [
@@ -87,24 +138,31 @@ class OrderPackage extends Model
         'doc_wave_header.descr',
     ];
 
-    protected $tempFields=[
-        'temOracleInfo','temOwner','temLogistic',
+    protected $tempFields = [
+        'temOracleInfo', 'temOwner', 'temLogistic',
     ];
 
-    public function setLengthAttribute($value){
-        if(empty((int)($value)))return;
+    public function setLengthAttribute($value)
+    {
+        if (empty((int)($value))) return;
         $this->attributes['length'] = $value;
     }
-    public function setWidthAttribute($value){
-        if(empty((int)($value)))return;
+
+    public function setWidthAttribute($value)
+    {
+        if (empty((int)($value))) return;
         $this->attributes['width'] = $value;
     }
-    public function setHeightAttribute($value){
-        if(empty((int)($value)))return;
+
+    public function setHeightAttribute($value)
+    {
+        if (empty((int)($value))) return;
         $this->attributes['height'] = $value;
     }
-    public function setBulkAttribute($value){
-        if(empty((int)($value)))return;
+
+    public function setBulkAttribute($value)
+    {
+        if (empty((int)($value))) return;
         $this->attributes['bulk'] = $value;
     }
 
@@ -113,196 +171,212 @@ class OrderPackage extends Model
         $this->commodities()->delete();
         return parent::delete();
     }
-    public function deleteSafe(){
+
+    public function deleteSafe()
+    {
         return parent::delete();
     }
 
-    public function isActivityBatch(){
-        return ($this['batch_rule'] && strstr($this['batch_rule'],'组合')  && $this['batch_number'] );
+    public function isActivityBatch()
+    {
+        return ($this['batch_rule'] && strstr($this['batch_rule'], '组合') && $this['batch_number']);
     }
-    public function fetchAllFromOracle(){
-        if(empty($this->oracleInfo))return null;
-/*        $this->fetchOwnerFromOracle();
-        $this->fetchLogisticFromOracle();*/
-/*        $this['recipient'] = $this->oracleInfo['consigneename'];
-        $this['order_code'] = $this->oracleInfo['orderno'];*/
+
+    public function fetchAllFromOracle()
+    {
+        if (empty($this->oracleInfo)) return null;
+        /*        $this->fetchOwnerFromOracle();
+                $this->fetchLogisticFromOracle();*/
+        /*        $this['recipient'] = $this->oracleInfo['consigneename'];
+                $this['order_code'] = $this->oracleInfo['orderno'];*/
         $this['batch_rule'] = $this->oracleInfo['descr'];
-/*        $this['recipient_mobile'] = $this->oracleInfo['c_tel2']??$this->oracleInfo['c_tel1'];
-        if(!$this['logistic_number']&&$this->oracleInfo['soreference5'])
-            $this['logistic_number'] = $this->oracleInfo['soreference5'];*/
-        $this['batch_number'] = $this->oracleInfo['waveno']??null;
+        /*        $this['recipient_mobile'] = $this->oracleInfo['c_tel2']??$this->oracleInfo['c_tel1'];
+                if(!$this['logistic_number']&&$this->oracleInfo['soreference5'])
+                    $this['logistic_number'] = $this->oracleInfo['soreference5'];*/
+        $this['batch_number'] = $this->oracleInfo['waveno'] ?? null;
     }
-    static public function createPackagesFromBatchCode($batchCode,$weight){
 
+    static public function createPackagesFromBatchCode($batchCode, $weight)
+    {
 
 
-        $queryBuilder=OracleDOCOrderHeader::query()->select(self::$oracleOrderHeaderFields);
-        $queryBuilder->where('doc_order_header.waveno',$batchCode);
-        $queryBuilder->leftJoin('act_allocation_details','act_allocation_details.orderno','doc_order_header.orderno');
-        $queryBuilder->leftJoin('doc_wave_header','doc_wave_header.waveno','doc_order_header.waveno');
-        $resultOracleObjs=$queryBuilder->get();
-        $resultOracleObjs_grouped=$resultOracleObjs->groupBy('soreference5');
+        $queryBuilder = OracleDOCOrderHeader::query()->select(self::$oracleOrderHeaderFields);
+        $queryBuilder->where('doc_order_header.waveno', $batchCode);
+        $queryBuilder->leftJoin('act_allocation_details', 'act_allocation_details.orderno', 'doc_order_header.orderno');
+        $queryBuilder->leftJoin('doc_wave_header', 'doc_wave_header.waveno', 'doc_order_header.waveno');
+        $resultOracleObjs = $queryBuilder->get();
+        $resultOracleObjs_grouped = $resultOracleObjs->groupBy('soreference5');
         $packages = [];
         $now = Carbon::now();
 
-        foreach($resultOracleObjs_grouped as $resultOracleObj_grouped){
+        foreach ($resultOracleObjs_grouped as $resultOracleObj_grouped) {
             $resultOracleObj = $resultOracleObj_grouped[0];
-            /** @var OrderService $orderService*/
+            /** @var OrderService $orderService */
             $orderService = app('OrderService');
             $order = $orderService->logisticNumberFirstOrCreateOrder($resultOracleObj['soreference5']);
-            if (!$order){
-                app('LogService')->log(__METHOD__,"此包裹在WMS未找到order",json_encode($resultOracleObj),Auth::user()['id']);
+            if (!$order) {
+                app('LogService')->log(__METHOD__, "此包裹在WMS未找到order", json_encode($resultOracleObj), Auth::user()['id']);
                 continue;
             }
-            array_push($packages,[
-                'batch_number'=>$batchCode??'',
+            array_push($packages, [
+                'batch_number' => $batchCode ?? '',
                 'order_id' => $order->id,
-                'logistic_number'=>$resultOracleObj['soreference5']??'',
-                'weight'=>$weight,
-                'weighed_at'=> $now,
-                'uploaded_to_wms'=>"是",
-                "created_at"=>$now,
+                'logistic_number' => $resultOracleObj['soreference5'] ?? '',
+                'weight' => $weight,
+                'weighed_at' => $now,
+                'uploaded_to_wms' => "是",
+                "created_at" => $now,
             ]);
         }
 
 
         $packagesLogisticNumbers = array_map(function ($orderPackage) {
             return $orderPackage['logistic_number'];
-        } ,$packages);
-        $existingOrderPackages=OrderPackage::whereIn('logistic_number', $packagesLogisticNumbers)->get();
-        $existingLogisticNumbers=$existingOrderPackages->map(function($orderPackage){
+        }, $packages);
+        $existingOrderPackages = OrderPackage::whereIn('logistic_number', $packagesLogisticNumbers)->get();
+        $existingLogisticNumbers = $existingOrderPackages->map(function ($orderPackage) {
             return $orderPackage['logistic_number'];
         })->toArray();
         OrderPackage::whereIn('logistic_number', $existingLogisticNumbers)->update([
-            'batch_number'=>$batchCode??'',
-            'weight'=>$weight,
-            'weighed_at'=> $now,
-            'uploaded_to_wms'=>"是",]);
-        $newPackages=$packages;
-        if($existingOrderPackages->isNotEmpty())
-            $newPackages=array_filter($packages,function ($package)use($existingLogisticNumbers){
-                return array_search($package['logistic_number'],$existingLogisticNumbers)===false;
+            'batch_number' => $batchCode ?? '',
+            'weight' => $weight,
+            'weighed_at' => $now,
+            'uploaded_to_wms' => "是",]);
+        $newPackages = $packages;
+        if ($existingOrderPackages->isNotEmpty())
+            $newPackages = array_filter($packages, function ($package) use ($existingLogisticNumbers) {
+                return array_search($package['logistic_number'], $existingLogisticNumbers) === false;
             });
-        DB::transaction(function ()use($newPackages){
+        DB::transaction(function () use ($newPackages) {
             OrderPackage::query()->insert($newPackages);
         });
 
 
-        app('LogService')->log(__METHOD__,"批量录入包裹成功",json_encode($packages),Auth::user()['id']);
+        app('LogService')->log(__METHOD__, "批量录入包裹成功", json_encode($packages), Auth::user()['id']);
     }
-    public function unifyThisMeasureUnderSameBatch(){
+
+    public function unifyThisMeasureUnderSameBatch()
+    {
         $this->fetchPaperBox();
-        $params=[];
-        !empty($this['weight'])?$params['weight']= $this['weight']:null;
-        !empty($this['length'])?$params['length']= $this['length']:null;
-        !empty($this['width'])?$params['width']= $this['width']:null;
-        !empty($this['height'])?$params['height']= $this['height']:null;
-        !empty($this['bulk'])?$params['bulk']= $this['bulk']:null;
-        !empty($this['measuring_machine_id'])?$params['measuring_machine_id']= $this['measuring_machine_id']:null;
-        !empty($this['weighed_at'])?$params['weighed_at']= $this['weighed_at']:null;
-        !empty($this['paper_box_id'])?$params['paper_box_id']= $this['paper_box_id']:null;
-        if(empty($params)||empty($this['batch_number']))return;
-        OrderPackage::query()->where(['batch_number'=>$this['batch_number']])->update($params);
+        $params = [];
+        !empty($this['weight']) ? $params['weight'] = $this['weight'] : null;
+        !empty($this['length']) ? $params['length'] = $this['length'] : null;
+        !empty($this['width']) ? $params['width'] = $this['width'] : null;
+        !empty($this['height']) ? $params['height'] = $this['height'] : null;
+        !empty($this['bulk']) ? $params['bulk'] = $this['bulk'] : null;
+        !empty($this['measuring_machine_id']) ? $params['measuring_machine_id'] = $this['measuring_machine_id'] : null;
+        !empty($this['weighed_at']) ? $params['weighed_at'] = $this['weighed_at'] : null;
+        !empty($this['paper_box_id']) ? $params['paper_box_id'] = $this['paper_box_id'] : null;
+        if (empty($params) || empty($this['batch_number'])) return;
+        OrderPackage::query()->where(['batch_number' => $this['batch_number']])->update($params);
     }
-    public function fetchLogisticFromOracle(){
-        if(empty($this->oracleInfo))return null;
-        if(Arr::exists($this->tempFields,'temLogistic'))return $this->tempFields['temLogistic'];
-        Controller::logs(__METHOD__, __FUNCTION__, "tempPackage:{$this->oracleInfo['carrierid']}||SOR:{$this->oracleInfo['SOReference5']}||sor:{$this->oracleInfo['soreference5']}||orderno:{$this['orderno']}" , null);
-        if(!$this->oracleInfo['carrierid'])return null;
-        $logistic= Logistic::query()->where('code',$this->oracleInfo['carrierid'])->first();
-        if(!$logistic){
-            $logistic=Logistic::query()->create(['code'=>$this->oracleInfo['carrierid'],'name'=>$this->oracleInfo['carrierid']]);
-            Controller::logs(__METHOD__, __FUNCTION__, "富勒下发找不到快递公司,添加{$this->oracleInfo['carrierid']}" , null);
+
+    public function fetchLogisticFromOracle()
+    {
+        if (empty($this->oracleInfo)) return null;
+        if (Arr::exists($this->tempFields, 'temLogistic')) return $this->tempFields['temLogistic'];
+        Controller::logs(__METHOD__, __FUNCTION__, "tempPackage:{$this->oracleInfo['carrierid']}||SOR:{$this->oracleInfo['SOReference5']}||sor:{$this->oracleInfo['soreference5']}||orderno:{$this['orderno']}", null);
+        if (!$this->oracleInfo['carrierid']) return null;
+        $logistic = Logistic::query()->where('code', $this->oracleInfo['carrierid'])->first();
+        if (!$logistic) {
+            $logistic = Logistic::query()->create(['code' => $this->oracleInfo['carrierid'], 'name' => $this->oracleInfo['carrierid']]);
+            Controller::logs(__METHOD__, __FUNCTION__, "富勒下发找不到快递公司,添加{$this->oracleInfo['carrierid']}", null);
         }
-        Controller::logs(__METHOD__, __FUNCTION__, "tempPackage2:{$logistic->id}" , null);
-        if(!$logistic)return null;
-        $this->tempFields['temLogistic']=$logistic;
+        Controller::logs(__METHOD__, __FUNCTION__, "tempPackage2:{$logistic->id}", null);
+        if (!$logistic) return null;
+        $this->tempFields['temLogistic'] = $logistic;
         $this['logistic_id'] = $logistic['id'];
         return $logistic;
     }
-    public function fetchOwnerFromOracle(){
-        if(empty($this->oracleInfo))return null;
-        if(Arr::exists($this->tempFields,'temOwner'))return $this->tempFields['temOwner'];
-        $owner= Owner::query()->where('code',$this->oracleInfo['customerid'])->first();
-        if(!$owner){
-            $owner=Owner::query()->create(['code'=>$this->oracleInfo['customerid'],'name'=>$this->oracleInfo['customerid']]);
-            Controller::logs(__METHOD__, __FUNCTION__, "富勒下发找不到货主,添加{$this->oracleInfo['customerid']}" , null);
+
+    public function fetchOwnerFromOracle()
+    {
+        if (empty($this->oracleInfo)) return null;
+        if (Arr::exists($this->tempFields, 'temOwner')) return $this->tempFields['temOwner'];
+        $owner = Owner::query()->where('code', $this->oracleInfo['customerid'])->first();
+        if (!$owner) {
+            $owner = Owner::query()->create(['code' => $this->oracleInfo['customerid'], 'name' => $this->oracleInfo['customerid']]);
+            Controller::logs(__METHOD__, __FUNCTION__, "富勒下发找不到货主,添加{$this->oracleInfo['customerid']}", null);
         }
-        if(!$owner)return null;
-        $this->tempFields['temOwner']=$owner;
+        if (!$owner) return null;
+        $this->tempFields['temOwner'] = $owner;
         $this['owner_id'] = $owner['id'];
         return $owner;
     }
+
     //寻找相近纸箱ID
-    public  function fetchPaperBox($max=null, $centre=null, $min=null, $owner_id=null){
-        if($this['paper_box_id'])return $this['paper_box_id'];
-        $sumDiffer=0;
-        $maxDiffer=0;
-        $paperBox_id=null;
-        if(!$max)$max=$this['length'];
-        if(!$centre)$centre=$this['width'];
-        if(!$min)$min=$this['height'];
-        if(!$owner_id) $owner_id = $this['order'] ? $this['order']['owner_id'] : null;
-        if(!$owner_id) {
+    public function fetchPaperBox($max = null, $centre = null, $min = null, $owner_id = null)
+    {
+        if ($this['paper_box_id']) return $this['paper_box_id'];
+        $sumDiffer = 0;
+        $maxDiffer = 0;
+        $paperBox_id = null;
+        if (!$max) $max = $this['length'];
+        if (!$centre) $centre = $this['width'];
+        if (!$min) $min = $this['height'];
+        if (!$owner_id) $owner_id = $this['order'] ? $this['order']['owner_id'] : null;
+        if (!$owner_id) {
             $owner = $this->fetchOwnerFromOracle();
             $owner_id = $owner['id'];
-            if(!$owner_id)return null;
+            if (!$owner_id) return null;
         }
-        $boxes=Owner::select('id')->with('paperBoxes')->find($owner_id);
-        $targetPaperBox=null;
-        foreach ($boxes->paperBoxes as $i=>$paperBox){
-            if ($paperBox->length==$max&&$paperBox->width==$centre&&$paperBox->height==$min){
-                $targetPaperBox=$paperBox;
+        $boxes = Owner::select('id')->with('paperBoxes')->find($owner_id);
+        $targetPaperBox = null;
+        foreach ($boxes->paperBoxes as $i => $paperBox) {
+            if ($paperBox->length == $max && $paperBox->width == $centre && $paperBox->height == $min) {
+                $targetPaperBox = $paperBox;
                 break;
             }
-            $lengthDiffer=abs($paperBox->length-$max);
-            $widthDiffer=abs($paperBox->width-$centre);
-            $heightDiffer=abs($paperBox->height-$min);
-            $thisMaxDiffer=($lengthDiffer>=($widthDiffer>=$heightDiffer?$widthDiffer:$heightDiffer)?$lengthDiffer:($widthDiffer>=$heightDiffer?$widthDiffer:$heightDiffer));
-            if($i==0){
-                $maxDiffer=$thisMaxDiffer;
-                $sumDiffer=$lengthDiffer+$widthDiffer+$heightDiffer;
-                $targetPaperBox=$paperBox;
+            $lengthDiffer = abs($paperBox->length - $max);
+            $widthDiffer = abs($paperBox->width - $centre);
+            $heightDiffer = abs($paperBox->height - $min);
+            $thisMaxDiffer = ($lengthDiffer >= ($widthDiffer >= $heightDiffer ? $widthDiffer : $heightDiffer) ? $lengthDiffer : ($widthDiffer >= $heightDiffer ? $widthDiffer : $heightDiffer));
+            if ($i == 0) {
+                $maxDiffer = $thisMaxDiffer;
+                $sumDiffer = $lengthDiffer + $widthDiffer + $heightDiffer;
+                $targetPaperBox = $paperBox;
             }
-            if ($thisMaxDiffer==$maxDiffer){
-                if($sumDiffer>($lengthDiffer+$widthDiffer+$heightDiffer)){
-                    $sumDiffer=$lengthDiffer+$widthDiffer+$heightDiffer;
-                    $targetPaperBox=$paperBox;
+            if ($thisMaxDiffer == $maxDiffer) {
+                if ($sumDiffer > ($lengthDiffer + $widthDiffer + $heightDiffer)) {
+                    $sumDiffer = $lengthDiffer + $widthDiffer + $heightDiffer;
+                    $targetPaperBox = $paperBox;
                 }
             }
-            if ($thisMaxDiffer<$maxDiffer){
-                $sumDiffer=$lengthDiffer+$widthDiffer+$heightDiffer;
-                $maxDiffer=$thisMaxDiffer;
-                $targetPaperBox=$paperBox;
+            if ($thisMaxDiffer < $maxDiffer) {
+                $sumDiffer = $lengthDiffer + $widthDiffer + $heightDiffer;
+                $maxDiffer = $thisMaxDiffer;
+                $targetPaperBox = $paperBox;
             }
         }
-        if($targetPaperBox)$this['paper_box_id']=$targetPaperBox['id'];
+        if ($targetPaperBox) $this['paper_box_id'] = $targetPaperBox['id'];
         return $targetPaperBox['id'];
     }
+
     public function getOracleInfoAttribute()
     {
-        if(isset($this->tempFields['temOracleInfo']))return $this->tempFields['temOracleInfo'];
-        if(empty($this['logistic_number'])&&empty($this['order_code']))return '';
-        if($this['order_code']){
-            $resultOracleObjs=OracleDOCOrderHeader::query()->select(self::$oracleOrderHeaderFields)->where('orderno',$this['order_code']);
-            $resultOracleObjs->leftJoin('doc_wave_header','doc_wave_header.waveno','doc_order_header.waveno');
-        }else{
-            $resultOracleObjs=OracleActAllocationDetails::query()->select(self::$oracleOrderHeaderFields);
-            $resultOracleObjs->where('picktotraceid',$this['logistic_number']);
-            $resultOracleObjs->leftJoin('DOC_Order_Header','act_allocation_details.orderno','doc_order_header.orderno');
-            $resultOracleObjs->leftJoin('doc_wave_header','doc_wave_header.waveno','doc_order_header.waveno');
+        if (isset($this->tempFields['temOracleInfo'])) return $this->tempFields['temOracleInfo'];
+        if (empty($this['logistic_number']) && empty($this['order_code'])) return '';
+        if ($this['order_code']) {
+            $resultOracleObjs = OracleDOCOrderHeader::query()->select(self::$oracleOrderHeaderFields)->where('orderno', $this['order_code']);
+            $resultOracleObjs->leftJoin('doc_wave_header', 'doc_wave_header.waveno', 'doc_order_header.waveno');
+        } else {
+            $resultOracleObjs = OracleActAllocationDetails::query()->select(self::$oracleOrderHeaderFields);
+            $resultOracleObjs->where('picktotraceid', $this['logistic_number']);
+            $resultOracleObjs->leftJoin('DOC_Order_Header', 'act_allocation_details.orderno', 'doc_order_header.orderno');
+            $resultOracleObjs->leftJoin('doc_wave_header', 'doc_wave_header.waveno', 'doc_order_header.waveno');
         }
-        $this->tempFields['temOracleInfo']=$resultOracleObjs->first();
-        if(empty($this->tempFields['temOracleInfo'])) {
-            $resultOracleObjs=OracleDOCOrderHeader::query()->select(self::$oracleOrderHeaderFields)->where('soreference5',$this['logistic_number']);
-            $resultOracleObjs->leftJoin('doc_wave_header','doc_wave_header.waveno','doc_order_header.waveno');
+        $this->tempFields['temOracleInfo'] = $resultOracleObjs->first();
+        if (empty($this->tempFields['temOracleInfo'])) {
+            $resultOracleObjs = OracleDOCOrderHeader::query()->select(self::$oracleOrderHeaderFields)->where('soreference5', $this['logistic_number']);
+            $resultOracleObjs->leftJoin('doc_wave_header', 'doc_wave_header.waveno', 'doc_order_header.waveno');
         }
-        $this->tempFields['temOracleInfo']=$resultOracleObjs->first();
+        $this->tempFields['temOracleInfo'] = $resultOracleObjs->first();
         return $this->tempFields['temOracleInfo'];
     }
+
     public function getLogisticNumberAttribute($val)
     {
-        if(strpos($val,'null')!==false)return '';
+        if (strpos($val, 'null') !== false) return '';
         return $val;
     }
 

+ 2 - 0
app/Providers/AppServiceProvider.php

@@ -181,6 +181,7 @@ use App\Services\RequirementUserService;
 use App\Services\WorkOrderService;
 use App\Services\WorkOrderTypeService;
 use App\Services\OrderPackageRemarkService;
+use App\Services\MeasureMonitorService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -260,6 +261,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('LogisticZopService', LogisticZopService::class);
         app()->singleton('MaterialBoxModelService',MaterialBoxModelService::class);
         app()->singleton('MaterialBoxService', MaterialBoxService::class);
+        app()->singleton('MeasureMonitorService',MeasureMonitorService::class);
         app()->singleton('MenuService',MenuService::class);
         app()->singleton('NewOrderCountingRecordService',NewOrderCountingRecordService::class);
         app()->singleton('OracleActAllocationDetailService', OracleActAllocationDetailService::class);

+ 12 - 13
app/Providers/EventServiceProvider.php

@@ -39,19 +39,18 @@ class EventServiceProvider extends ServiceProvider
         'App\Events\GitPushedEvent' => [
             'App\Listeners\GitPushedSendEmailListener'
         ],
-
-        'App\Events\AddOrUpdateOrderIssues' => [//问题件新增或更新
-            'App\Listeners\AddOrUpdateOrderIssuesListener',//将对应的order_packages的数据的异常装变更
-        ],
-        'App\Events\OrderIssueProcessLogCreateEvent' => [//orderIssue增添日志时
-            'App\Listeners\UpdateOrderPackageExceptionListener',//将对应的order_packages的数据的异常装变更为无
-        ],
-        'App\Events\UpdateOrderPackageExceptionListenerEvent' => [//order_packages的数据的异常数据变更时
-            'App\Listeners\UpdateOrderPackageExceptionTypeCountingRecordListener',//更新OrderPackageExceptionTypeCountingRecord的统计信息
-        ],
-        'App\Events\SettlementBillCreateEvent' => [
-            'App\Listeners\SettlementBillCreateListener'
-        ],
+//        'App\Events\AddOrUpdateOrderIssues' => [//问题件新增或更新
+//            'App\Listeners\AddOrUpdateOrderIssuesListener',//将对应的order_packages的数据的异常装变更
+//        ],
+//        'App\Events\OrderIssueProcessLogCreateEvent' => [//orderIssue增添日志时
+//            'App\Listeners\UpdateOrderPackageExceptionListener',//将对应的order_packages的数据的异常装变更为无
+//        ],
+//        'App\Events\UpdateOrderPackageExceptionListenerEvent' => [//order_packages的数据的异常数据变更时
+//            'App\Listeners\UpdateOrderPackageExceptionTypeCountingRecordListener',//更新OrderPackageExceptionTypeCountingRecord的统计信息
+//        ],
+//        'App\Events\SettlementBillCreateEvent' => [
+//            'App\Listeners\SettlementBillCreateListener'
+//        ],
     ];
 
     /**

+ 3 - 14
app/Services/LogisticAliJiSuApiService.php

@@ -46,8 +46,6 @@ class LogisticAliJiSuApiService
         if (!isset($response)||($response && $response->status!=0)) {
             return [
                 'logistic_number' => $logistic_number,
-                'exception_type' => '揽件异常',
-                'exception' => '是',
             ];
         }
         else {
@@ -60,25 +58,16 @@ class LogisticAliJiSuApiService
             if (!empty($list) && is_array($list)) {
                 $lastNativeRoute = $list[0];
                 $result['status'] = $this->getStatus($response);
-                if ($result['status'] == '已收') $result['received_at'] = $lastNativeRoute->time;
+                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['exception_type'] = $exceptionData['exception_type'];
-                $result['exception'] = $exceptionData['exception'];
 
             } else {
                 $result['status'] = null;
                 $result['transfer_status'] = [];
             }
-            if (!array_key_exists('exception', $result)
-                && !array_key_exists('exception_type', $result)
-                && array_key_exists('transfer_status', $result)
-            ) {
-                $result['exception_type'] = '无';
-                $result['exception'] = '否';
-            }
             if (!array_key_exists('status', $result)) {
                 $result['status'] = null;
                 $result['transfer_status'] = [];
@@ -101,13 +90,13 @@ class LogisticAliJiSuApiService
                 $status = '派送中';
                 break;
             case '3':
-                $status = '已收';
+                $status = '已收';
                 break;
             case '4':
                 $status = '派送异常';
                 break;
             default:
-                $status = '';
+                $status = '其他';
         }
         return $status;
     }

+ 1 - 24
app/Services/LogisticSFService.php

@@ -104,29 +104,10 @@ xml;
             $lastRoute = get_object_vars($routeResponse['Route'][count($routeResponse['Route']) - 1])['@attributes'];//获取最新的路由信息
             $data = $this->switchOpCodeToStatus($lastRoute, $data);
             $data['transfer_status'] = $this->transformRoutes($routeResponse['Route']);
-            if (!array_key_exists('exception', $data)) {//当顺丰返回异常时,不需要再根据时间判断是否异常,直接用顺丰的异常就好
-                $orderPackageReceivedSyncService = app('OrderPackageReceivedSyncService');
-                $exceptionData = $orderPackageReceivedSyncService->setExceptionType($data, array_key_exists('accept_time',$lastRoute) ? $lastRoute['accept_time'] : null);
-                $data['exception_type'] = $exceptionData['exception_type'];
-                $data['exception'] = $exceptionData['exception'];
-            }
-            //如果没有发现额外的异常,且查询到物流轨迹,将异常置为无
-            if (!array_key_exists('exception', $data)
-                && !array_key_exists('exception_type', $data)
-                && array_key_exists('transfer_status', $data)
-            ) {
-                $data['exception_type'] = '无';
-                $data['exception'] = '否';
-            }
         } catch (Exception $e) {
             throw new WarningException("单号没有查询到快递路由信息','LogisticSFService->transformSFOneToArr->{$data['logistic_number']}");
         } finally {
             $data['routes_length'] = array_key_exists('transfer_status', $data) ? count($data['transfer_status']) : 0;
-            //如果查询不到物流轨迹 设置为揽收异常
-            if ($data['routes_length']===0) {
-                $data['exception_type'] = '揽件异常';
-                $data['exception'] = '是';
-            }
             return $data;
         }
     }
@@ -173,8 +154,6 @@ xml;
                     break;
                 case 33:
                     $data['status'] = '派送异常';
-                    $data['exception_type'] = '派件异常';
-                    $data['exception'] = '是';
                     break;
                 case 204:
                 case 44:
@@ -186,7 +165,7 @@ xml;
                 case 607:
                 case 8000:
                 case 80:
-                    $data['status'] = '已收';
+                    $data['status'] = '已收';
                     $data['received_at'] = $lastRoute[$this->protected_switch['received_at']];
                     break;
                 case 648:
@@ -195,8 +174,6 @@ xml;
                     break;
                 case 70:
                     $data['status'] = '无';
-                    $data['exception'] = '是';
-                    $data['exception_type'] = '其他';
                     break;
                 default:
                     throw new WarningException("未知的丰桥状态码: {$lastRoute['opcode']}->{json_encode($lastRoute)}");

+ 4 - 20
app/Services/LogisticYDService.php

@@ -101,8 +101,6 @@ class LogisticYDService
         if (is_null($nativeResponse) || $nativeResponse->code != '0000' || empty($nativeResponse->data) ||$nativeResponse->data->result == "false") {
             return [
                 'logistic_number' => $logistic_number,
-                'exception_type' => '揽件异常',
-                'exception' => '是',
             ];
         } else {
             $nativeData = $nativeResponse->data;
@@ -116,33 +114,19 @@ class LogisticYDService
             if (!empty($nativeRoutes)) {
                 $lastNativeRoute = $nativeRoutes[count($nativeRoutes) - 1];
                 $result['status'] = $this->getStatus($nativeData);
-                if ($result['status'] == '已收') {
+                if ($result['status'] == '已收') {
                     $result['received_at'] = $lastNativeRoute->time;
                 }
                 $result['transfer_status'] = $this->getTransferStatus($nativeRoutes);
                 $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['exception_type'] = $exceptionData['exception_type'];
-                $result['exception'] = $exceptionData['exception'];
-
             } else {
                 $result['status'] = null;
                 $result['transfer_status'] = [];
             }
-
             if (!array_key_exists('status', $result)) {
                 $result['status'] = null;
                 $result['transfer_status'] = [];
             }
-            //如果没有发现额外的异常,且查询到物流轨迹,将异常置为无
-            if (!array_key_exists('exception', $result)
-                && !array_key_exists('exception_type', $result)
-                && array_key_exists('transfer_status', $result)
-            ) {
-                $result['exception_type'] = '无';
-                $result['exception'] = '否';
-            }
             return $result;
         }
     }
@@ -162,16 +146,16 @@ class LogisticYDService
                 $status = '在途';
                 break;
             case 'SIGNED':
-                $status = '已收';
+                $status = '已收';
                 break;
             case 'RETURN':
                 $status = '返回中';
                 break;
             case 'SIGNFAIL':
-                $status = '';
+                $status = '其他';
                 break;
             default:
-                $status = '';
+                $status = '其他';
         }
         return $status;
     }

+ 3 - 14
app/Services/LogisticYTOService.php

@@ -47,8 +47,6 @@ class LogisticYTOService
         if (is_object($response) && $response->code=='1001') {
             return [
                 'logistic_number' => $logistic_number,
-                'exception_type' => '揽件异常',
-                'exception' => '是',
             ];
         }
         else {
@@ -58,30 +56,21 @@ class LogisticYTOService
                 LogService::log(LogisticYTOService::class, "YTO快递信息异常", $logistic_number);
                 return [
                     'logistic_number' => $logistic_number,
-                    'exception_type' => '其他',
-                    'exception' => '是',
                 ];
             }
             if (!empty($response) && is_array($response)) {
                 $lastNativeRoute = $response[count($response) - 1];
                 $result['status'] = $this->getStatus($lastNativeRoute);
-                if ($result['status'] == '已收') $result['received_at'] = $lastNativeRoute->upload_Time;
+                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['exception_type'] = $exceptionData['exception_type'];
-                $result['exception'] = $exceptionData['exception'];
             } else {
                 $result['status'] = null;
                 $result['transfer_status'] = [];
             }
             if (!array_key_exists('status', $result)) {$result['status'] = null;$result['transfer_status'] = [];}
-            //如果没有发现额外的异常,且查询到物流轨迹,将异常置为无
-            if (!array_key_exists('exception', $result)
-                && !array_key_exists('exception_type', $result)
-                && array_key_exists('transfer_status', $result)
-            ) {$result['exception_type'] = '无';$result['exception'] = '否';}
             return $result;
         }
     }
@@ -106,13 +95,13 @@ class LogisticYTOService
                 $status = '派送中';
                 break;
             case 'SIGNED':
-                $status = '已收';
+                $status = '已收';
                 break;
             case 'TMS_RETURN':
                 $status = '返回中';
                 break;
             default:
-                $status = '';
+                $status = '其他';
         }
         return $status;
     }

+ 5 - 16
app/Services/LogisticZopService.php

@@ -30,35 +30,24 @@ class LogisticZopService implements LogisticRouteInterface
 
     public function format($nativeResponse,$logistic_number)
     {
+
         $order_package = OrderPackage::query()->where('logistic_number', $logistic_number)->first();
         $result = [
             'logistic_number' => $logistic_number,
-            'exception_type' => $order_package->exception_type,
-            'exception' => $order_package->exception,
             'status' => $order_package->status,
             'transfer_status' => $order_package->transfer_status,
             'received_at' => $order_package->received_at,
         ];
-        $nativeRoutes = $nativeResponse->result??[];
-        if (empty($nativeRoutes)) {
-            $result['exception_type'] = '揽件异常';
-            $result['exception'] = '是';
+        if (empty($nativeResponse->result)|| !$nativeResponse->status || $nativeResponse->statusCode=='P-OW005') {
             return $result;
         }
+        $nativeRoutes = $nativeResponse->result??[];
         $lastRoute = $nativeRoutes[count($nativeRoutes) - 1]??[];
         list($status, $received_at) = $this->getNormalStatusAndReceivedAt($lastRoute);
         $result['status'] = $status;
         $result['received_at'] = $received_at;
         $result['transfer_status'] = $this->getTransferStatus($nativeRoutes);
         $result['routes_length'] = count($result['transfer_status']);
-        /**
-         * @var $orderPackageReceivedSyncService OrderPackageReceivedSyncService
-         */
-        $orderPackageReceivedSyncService = app('OrderPackageReceivedSyncService');
-        $lastRouteDate = Carbon::parse($lastRoute->scanDate / 1000)->addHours(8)->toDateTimeString();
-        $exceptionData = $orderPackageReceivedSyncService->setExceptionType($result, $lastRouteDate);
-        $result['exception_type'] = $exceptionData['exception_type'];
-        $result['exception'] = $exceptionData['exception'];
         return $result;
     }
 
@@ -83,11 +72,11 @@ class LogisticZopService implements LogisticRouteInterface
                 break;
             case 'SIGNED':
             case '签收':
-                $status = '已收';
+                $status = '已收';
                 $received_at = Carbon::parse($lastRoute->scanDate / 1000)->addHours(8)->toDateTimeString();
                 break;
             default:
-                $status = '';
+                $status = '其他';
                 break;
         }
         return array($status, $received_at);

+ 35 - 0
app/Services/MeasureMonitorService.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+
+require_once '../app/library/baidu-api-speech/AipSpeech.php';
+
+class MeasureMonitorService
+{
+    use ServiceAppAop;
+
+    public function getMp3Audio($content): array
+    {
+        if (!$content)$content='空';
+        if (file_exists("storage/".$content.'.mp3')){
+            return ['success' => true,'data' =>['name'=>$content,'path' =>"/storage/".$content.'.mp3'] ];
+        }
+
+        $client=new \AipSpeech(config('api.baidu.speech.APP_ID'),config('api.baidu.speech.API_KEY'),config('api.baidu.speech.SECRET_KEY'));
+        $client->setConnectionTimeoutInMillis('180000');
+        $client->setSocketTimeoutInMillis('180000');
+
+        $result = $client->synthesis($content, 'zh', 1, array(
+            'vol' => 15,
+        ));
+
+        if(!is_array($result)){
+            file_put_contents('storage/'.$content.'.mp3', $result);
+        }
+
+        return  ['success' => true,'data' =>['name'=>$content,'path' =>"/storage/".$content.'.mp3'] ];
+    }
+
+}

+ 13 - 0
app/Services/OrderIssueService.php

@@ -428,4 +428,17 @@ class OrderIssueService
             $orderIssue->update($updateParams);
         });
     }
+
+    /**
+     * 快递单对应的问题件是否存在
+     * @param $logistic_number
+     * @return bool
+     */
+    public function isExists($logistic_number): bool
+    {
+        $order_package_query = OrderPackage::query()->select('order_id')->whereIn('logistic_number',[$logistic_number]);
+        $order_issue_type_query = OrderIssueType::query()->select('id')->where('name' ,'拦截');
+        return OrderIssue::query()->whereIn('order_id',$order_package_query)->whereIn('order_issue_type_id',$order_issue_type_query)->count() ;
+    }
 }
+

+ 14 - 13
app/Services/OrderPackageReceivedSyncService.php

@@ -180,24 +180,25 @@ class OrderPackageReceivedSyncService
         foreach ($logisticResponses as $logisticResponse) {
             if (empty($logisticResponse)) continue;
             $orderPackage = OrderPackage::query()->where('logistic_number', $logisticResponse['logistic_number'])->first();
-            try {
-                if ($orderPackage->order && $orderPackage->order->issue) {
-                    unset($logisticResponse['exception_type']);
-                    unset($logisticResponse['exception']);
+            //如果已经收货,状态改为已签收
+            if ($logisticResponse['received_at']??false) {
+                $logisticResponse['status'] = '已签收';
+            }
+            //未查询到路由信息改为  揽件异常
+            if (empty($logisticResponse['transfer_status'])) {
+                $logisticResponse['status'] = '揽件异常';
+                //未查询到路由信息且未称重的   疑似库内丢件
+                if (empty($orderPackage->weighed_at)) {
+                    $logisticResponse['status'] = '疑似库内丢件';
                 }
-            } catch (Exception $e) {
-                //  LogService::log(OrderPackageReceivedSyncService::class, "标记问题件不需要更新异常状态失败", $logisticResponse['logistic_number'] . '-' . json_encode($e));
             }
-            //如果已经收货,将异常更新为正常
-            if ($logisticResponse['received_at']??false) {
-                $logisticResponse['exception_type'] = '无';
-                $logisticResponse['exception'] = '否';
+            //标记为手动更新的 status不更新
+            if ($orderPackage->is_manual_update) {
+                unset($logisticResponse['status']);
             }
             if (isset($logisticResponse['status'])) $orderPackage->status = $logisticResponse['status'];
             if (isset($logisticResponse['received_at'])) $orderPackage->received_at = $logisticResponse['received_at'];
-            if (isset($logisticResponse['exception'])) $orderPackage->exception = $logisticResponse['exception'];
             if (isset($logisticResponse['transfer_status']) && !empty($logisticResponse['transfer_status'])) $orderPackage->transfer_status = $logisticResponse['transfer_status'];
-            if (isset($logisticResponse['exception_type'])) $orderPackage->exception_type = $logisticResponse['exception_type'];
             $orderPackage->save();
         }
     }
@@ -346,7 +347,7 @@ class OrderPackageReceivedSyncService
             $conclusion |= !empty($data['transfer_status']) ? $IS_ROUTED : 0;
             $conclusion |= ($delivered_duration > $VALID_HOURS) ? $IS_IN_VALID_TIME : 0;
             $conclusion |= ($orderPackage->weighed_at) ? $IS_WEIGHED : 0;
-            $conclusion |= ($data['status'] == '已收') ? $IS_RECEIVED : 0;
+            $conclusion |= ($data['status'] == '已收') ? $IS_RECEIVED : 0;
             $conclusion |= ($data['status'] == '派送中') ? $IS_SENDING : 0;//
             $conclusion |= ($last_routed_duration > $SHORT_RESPONSE_HOURS && $last_routed_duration < $LONG_RESPONSE_HOURS) ? $IS_SHORT_NO_RESPONSE : 0;
             $conclusion |= ($last_routed_duration > $LONG_RESPONSE_HOURS) ? $IS_LONG_NO_RESPONSE : 0;

+ 1 - 5
app/Services/OrderPackageService.php

@@ -2,10 +2,6 @@
 
 namespace App\Services;
 
-use App\Logistic;
-use App\OracleActAllocationDetails;
-use App\OracleDOCOrderDetail;
-use App\OracleDOCOrderHeader;
 use App\Order;
 use App\OrderPackage;
 use App\OrderPackageCommodities;
@@ -184,7 +180,7 @@ class OrderPackageService
         }
 
         /** 承运商是京东时的定制操作 */
-        if($order['id'] == $logistic['id'] && count($logistic_numbers) == 1){
+        if($order['logistic_id'] == $logistic['id'] && count($logistic_numbers) == 1){
             $logistic_numbers = [$orderHeader['soreference5']];
             $sentAtMap[$orderHeader['soreference5']] = $orderHeader->actAllocationDetails->first() ?? null;
         }

+ 10 - 2
app/Services/OrderTrackingService.php

@@ -350,8 +350,16 @@ class OrderTrackingService
             if(mb_stristr($order_remark,'[')){
                 $items = [];
                 preg_match_all('/^(.*?)(\\[)(.*?)(\\])(.*?)$/u',$order_remark,$items);
-                $params['client'] = $items[1][0];
-                $params['order_remark'] = $items[3][0];
+                if (isset($items[1][0])){
+                    $params['client'] = $items[1][0];
+                } else {
+                    $params['client'] = $orderHeader['issuepartyname'];
+                }
+                if (isset($items[3][0])) {
+                    $params['order_remark'] = $items[3][0];
+                } else {
+                    $params['order_remark'] = $order_remark;
+                }
             }else{
                 $params['client'] = $orderHeader['issuepartyname'];
                 $params['order_remark'] = $order_remark;

+ 25 - 22
app/Services/UserService.php

@@ -4,15 +4,13 @@
 namespace App\Services;
 
 
-use App\Authority;
 use App\Owner;
 use App\User;
 use App\UserWorkgroup;
 use Firebase\JWT\JWT;
+use Illuminate\Database\Eloquent\Model;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
-use Illuminate\Support\Facades\DB;
-use Illuminate\Support\Facades\Gate;
 use App\Traits\ServiceAppAop;
 
 
@@ -118,6 +116,7 @@ class UserService
         Cache::forget("owners:user_".$user->id);
         Cache::forget("userWorkGroups:user_".$user->id);
         Cache::tags("AUTHORITY_MENU_MAPPING")->forget("am_mapping_".$user->id);
+        Cache::tags("USERS")->pull("user_info_".$user->id);
     }
 
     /**
@@ -134,7 +133,7 @@ class UserService
             'iss' => $_SERVER["HTTP_HOST"], //签发者
             'iat' => $time,
             'nbf' => $time,
-            'exp' => $time+7200,
+            'exp' => $time+config("api.timeliness_limits.token","7200"),
             'data' => [
                 'id' => $user->id,
                 'username' => $user->name
@@ -145,26 +144,30 @@ class UserService
     }
 
     /**
-     * 获取JWT token
+     * 设置或刷新缓存
      *
-     * @param User|\stdClass $user
-     * @param mixed $key
-     * @return string
+     * @param User|\stdClass|Model $user
+     * @param null $exp
      */
-    public function checkJWTToken($user,$key):string
+    public function setOrRefreshCache($user, $exp = null)
     {
-        $time = time();
-        $payload = [
-            'iss' => $_SERVER["HTTP_HOST"], //签发者
-            'iat' => $time,
-            'nbf' => $time,
-            'exp' => $time+7200,
-            'data' => [
-                'id' => $user->id,
-                'username' => $user->name
-            ]
-        ];
-        $alg = 'RS256';
-        return JWT::encode($payload, $key, $alg);
+        if (!$exp)$exp = config("api.timeliness_limits.token","7200");
+        Cache::tags("USERS")->put("user_info_".$user->id,$user,$exp);
+    }
+
+    /**
+     * @param integer $id
+     * @param integer $exp
+     * @return User|\stdClass|null
+     */
+    public function getOrRefreshCache(int $id,int $exp):?Model
+    {
+        $user = Cache::tags("USERS")->get("user_info_".$id);
+        if ($user)return $user;
+        $user = User::query()->find($id);
+        if (!$user)return null;
+        $time = $exp-time();
+        $this->setOrRefreshCache($user,$time>0 ? $time : 7200);
+        return $user;
     }
 }

+ 2 - 1
app/Waybill.php

@@ -73,7 +73,8 @@ class Waybill extends Model
         'express_face_list',
         'arrived_org_simple_name',
         'much_higher_delivery',
-        'station_no'
+        'station_no',
+        'subjoin_fee',//附加费
     ];
 
     public function district()

+ 1 - 1
app/library/baidu-api-speech/lib/2a7552bdd1b678c303ad53645baeafce

@@ -1 +1 @@
-{"refresh_token":"25.7e4748217e997c84c2402b9b24adb134.315360000.1936752238.282335-18688250","expires_in":2592000,"session_key":"9mzdCPblW0XXeNGCMqTv\/JHlyb1R+CCFsPtDR+I+pkvO3Wt6R95mYM6B\/czx+j6XbwA+xuH79EnEt1k9LyvlecbmLoyo3A==","access_token":"24.32855024de5bed138fec0c12a1dd166d.2592000.1623984238.282335-18688250","scope":"brain_asr_async brain_speech_realtime audio_voice_assistant_get brain_enhanced_asr audio_tts_post public brain_all_scope picchain_test_picchain_api_scope wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\u6743\u9650 vis-classify_flower lpq_\u5f00\u653e cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base smartapp_mapp_dev_manage iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi fake_face_detect_\u5f00\u653eScope vis-ocr_\u865a\u62df\u4eba\u7269\u52a9\u7406 idl-video_\u865a\u62df\u4eba\u7269\u52a9\u7406 smartapp_component smartapp_search_plugin avatar_video_test","session_secret":"a8e2a31ba3a17b7c3f30efa29600b809","time":1621392238,"is_cloud_user":false}
+{"refresh_token":"25.795dad640f8af76864554c1c5afb8926.315360000.1945136504.282335-18688250","expires_in":2592000,"session_key":"9mzdX+3tcFZOpclBI6LTZrgxalCMs8nwU+QbwhRD2ex+wA6nIpZQQG7UR3cJNloHVeLBAU+JTC6Chj0iLy1LTU25Zb\/BBA==","access_token":"24.d799fe5d40a04d715a4abe85bf739e5e.2592000.1632368504.282335-18688250","scope":"brain_asr_async brain_speech_realtime audio_voice_assistant_get brain_enhanced_asr audio_tts_post public brain_all_scope picchain_test_picchain_api_scope wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\u6743\u9650 vis-classify_flower lpq_\u5f00\u653e cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base smartapp_mapp_dev_manage iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi fake_face_detect_\u5f00\u653eScope vis-ocr_\u865a\u62df\u4eba\u7269\u52a9\u7406 idl-video_\u865a\u62df\u4eba\u7269\u52a9\u7406 smartapp_component smartapp_search_plugin avatar_video_test","session_secret":"71dcb07b69c06e01063930662a5fc2a6","time":1629776504,"is_cloud_user":false}

+ 3 - 0
config/api.php

@@ -75,4 +75,7 @@ return [
         // 登录相关,次数/分钟
         'sign' =>  env('SIGN_RATE_LIMITS', '10,1'),
     ],
+    "timeliness_limits" => [
+        'token' => 604800,
+    ],
 ];

+ 1 - 1
database/factories/OrderPackageFactory.php

@@ -7,7 +7,7 @@ use App\OrderPackage;
 use Faker\Generator as Faker;
 
 $factory->define(OrderPackage::class, function (Faker $faker) {
-    $statuses = ['无', '已称重', '已揽收', '在途', '在途异常', '派送中', '派送异常', '返回中', '返回异常', '返回派件', '其他异常', '已收',];
+    $statuses = ['无', '已称重', '已揽收', '在途', '在途异常', '派送中', '派送异常', '返回中', '返回异常', '返回派件', '其他异常', '已收',];
     $exceptions = ['是', '否'];
     $exception_types = ['疑似库内丢件','揽件异常','中转异常','疑似丢件','派件异常','其他','无'];
     return [

+ 60 - 0
database/migrations/2021_08_24_092216_drop_column_exception_type_and_exception_to_order_packages_table.php

@@ -0,0 +1,60 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class DropColumnExceptionTypeAndExceptionToOrderPackagesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->dropColumn('exception');
+            $table->dropColumn('exception_type');
+            $table->dropColumn('status');
+        });
+
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->integer('status')->default(1)->comment('状态');
+        });
+
+        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');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->enum('exception', ['是', '否']);
+            $table->enum('exception_type', ['疑似库内丢件', '揽件异常', '中转异常', '疑似丢件', '派件异常', '其他', '无']);
+            $table->dropColumn('status');
+        });
+
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->enum('status', ['无', '已称重', '已揽收', '在途', '在途异常', '派送中', '派送异常', '返回中', '返回异常', '返回派件', '其他异常', '已收件']);
+        });
+
+        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', 'exception', 'exception_type', 'status', 'received_at', 'sync_routes_flag'], 'order_packages_express_index');
+        });
+    }
+}

+ 32 - 0
database/migrations/2021_08_24_143918_change_waybills_add_column_subjoin_fee.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeWaybillsAddColumnSubjoinFee extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table("waybills",function (Blueprint $table){
+            $table->decimal("subjoin_fee",10,3)->default(0)->comment("附加费");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table("waybills",function (Blueprint $table){
+            $table->dropColumn("subjoin_fee");
+        });
+    }
+}

+ 32 - 0
database/migrations/2021_08_25_132757_add_column_is_manual_update_status_to_order_packages_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColumnIsManualUpdateStatusToOrderPackagesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->boolean('is_manual_update')->default(false)->comment('是否手动更新');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->dropColumn('is_manual_update');
+        });
+    }
+}

+ 1 - 1
resources/js/queryForm/queryForm.js

@@ -635,7 +635,7 @@ const query = function getQueryForm(data) {
         input.attr('title', controlJsType(condition.tip[1], 'undefined') ? '' : condition.tip[1]);
         input.attr('placeholder', controlJsType(condition.placeholder[1], 'undefined') ? '' : condition.placeholder[1])
 
-        let ul_div = $("<div class='pl-0 tooltipTarget' style='position: absolute;left: 100px;top:25px; max-height: 150px; overflow-y: scroll; border: 1px solid rgb(221, 221, 221); border-radius: 5px; text-align: center; transform: scale(0.9);z-index:95' ></div>");
+        let ul_div = $("<div class='pl-0 tooltipTarget' style='position: absolute;left: 100px;top:25px; max-height: 150px; overflow-y: scroll; border: 1px solid rgb(221, 221, 221); border-radius: 5px; text-align: center; z-index:95' ></div>");
         let ul = $("<ul name='" + condition.name + "' class='list-group pl-0 m-0 p-0 bg-white' style='list-style-type: none;width: 150px;top:35px; z-index: 95' ></ul>");
         let check = $("<input id='multipleCheckBox' type = 'checkbox' style='z-index:101;position:fixed;top:0;right: 0;border:1px green' >");
         let isMouseenterCheckBox = false;

+ 50 - 108
resources/views/package/logistic/index.blade.php

@@ -81,16 +81,6 @@
                             <a class="dropdown-item" @click="orderPackageExport(true)" href="javascript:">导出所有页</a>
                         </div>
                     </span>
-                    <span class="ml-1">
-                        <select class="form-control-sm" v-model="batchExceptionType">
-                            <option v-for="(value,index) in exception_types" :value="value"
-                                    :name="value" :key="index">@{{ value }}
-                            </option>
-                        </select>
-                        <button @click="batchExceptionTypeUpdate()" type="button"
-                                class="btn btn-sm ml-2 btn-outline-primary">批量异常状态修改
-                        </button>
-                    </span>
                     <span class="ml-1">
                         <select class="form-control-sm ml-2" v-model="batchStatus">
                             <option v-for="(value,index) in statuses" :value="value"
@@ -131,20 +121,12 @@
                             <span
                                 style="display: inline-block;width: 15px;height: 15px;border-radius: 50%;position: absolute;top: 2px; margin-left: 3px;box-shadow: 0 0 3px #211f1f"
                                   :style="package.sync_routes_flag?'background-color:#4ed32d':'background-color:#e83939'"></span>
+                            <span v-if="package.is_manual_update">
+                                <i class="fa fa-hand-paper-o" aria-hidden="true"
+                                   style="color: red;position: absolute;left: 50px;top: 3px;"></i>
+                            </span>
                         </span>
                     </td>
-                    <td>
-                        <select class="form-control-sm" v-model="package.exception_type"
-                                @change="package.showEditButton = true">
-                            <option :disabled="!exception_editable" v-for="(value,index) in exception_types"
-                                    :value="value" :name="value" :key="index">@{{ value }}
-                            </option>
-                        </select>
-                        <button class="btn btn-info btn-sm text-white mr-1" @click="updateExceptionType(package)"
-                                v-if="package.showEditButton">
-                            更新状态
-                        </button>
-                    </td>
                     <td>@{{ package.logistic_number }}</td>
                     <td>@{{ package.status }}</td>
                     <td>@{{ package.order != null ? package.order.logistic.name : '#' }}</td>
@@ -154,6 +136,7 @@
                     <td>@{{ package.received_at }}</td>
                     <td>@{{ package.weighed_at }}</td>
                     <td>
+
                         <div v-if="package.transfer_status && package.transfer_status.length>0"
                              class="text-overflow-warp-200 up" :id="'route-'+i">
                             <p v-for="route in package.transfer_status">
@@ -172,6 +155,8 @@
                             </label>
                         </div>
                     </td>
+                    <!--退件状态-->
+                    <td>@{{ package.order.issue?package.order.issue.is_new_rejecting:'' }}</td>
                     <td  class="m-0 p-0 order-package-remarks" style="padding-left: 0 !important;padding-right: 0 !important">
                         @can('包裹管理-快递-客服备注')
                         <label :for="'create_remark_'+package.id" class="btn-create-remark" @click="package.input_remark=!package.input_remark">
@@ -245,7 +230,7 @@
                 </div>
             </div>
         </div>
-        <textarea id="clipboardDiv hidden" style="opacity:0"></textarea>
+        <textarea id="clipboardDiv" style="opacity:0"></textarea>
     </div>
 @endsection
 
@@ -279,23 +264,22 @@
                 showList: {},
                 showRemarkList: {},
                 selectTr: 0,
-                exception_types: [
-                    '疑似库内丢件',
-                    '揽件异常',
-                    '中转异常',
-                    '疑似丢件',
-                    '派件异常',
-                    '其他',
-                    '无',
-                ],
                 statuses: [
+                    '无',
+                    '已称重',
                     '已揽收',
+                    '揽件异常',
+                    '疑似库内丢件',
                     '在途',
-                    '无',
+                    '在途异常',
+                    '派送中',
+                    '派送异常',
+                    '返回中',
+                    '返回异常',
+                    '返回派件',
+                    '其他异常',
+                    '已签收',
                 ],
-                exception_editable: @can('包裹管理-快递-异常类型-编辑') true @else false  @endcan,
-                selectedExceptionType: '修改异常类型',
-                batchExceptionType: null,
                 batchStatus: null,
                 remarkHover: null,
                 remark: null,
@@ -324,30 +308,30 @@
                 $(".up").slideUp();
                 let data = [
                     [
-                        /*"","","","","","","","","","",""*/
                         {name: 'logistic_number', type: 'input', tip: '可支持多快递单号,糊模查找需要在右边打上%符号', placeholder: '快递单号'},
                         {name: 'remark', type: 'input', tip: '糊模查找需要在右边打上%符号', placeholder: '客服备注'},
                         {
                             name: 'status',
-                            type: 'select',
+                            type: 'select_multiple_select',
                             tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
-                            placeholder: '状态',
-                            data: [{name: '无', value: '无'}, {name: '已称重', value: '已称重'}, {
-                                name: '已揽收',
-                                value: '已揽收'
-                            }, {name: '在途', value: '在途'}, {name: '在途异常', value: '在途异常'}, {
-                                name: '派送中',
-                                value: '派送中'
-                            }, {
-                                name: '已收件',
-                                value: '已收件'
-                            }, {name: '派送异常', value: '派送异常'}, {name: '返回中', value: '返回中'}, {
-                                name: '返回异常',
-                                value: '返回异常'
-                            }, {name: '返回派件', value: '返回派件'}, {name: '其他异常', value: '其他异常'},]
+                            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: 'sent_at_start', type: 'dateTime', tip: '选择显示发出时间的起始时间'},
                         {
                             name: 'is_weighed',
@@ -357,17 +341,8 @@
                             data: [{name: false, value: '无'}, {name: true, value: '已称重'}]
                         },
                         {name: 'received_at_start', type: 'dateTime', tip: '选择显示收货时间的起始时间'},
-                        {
-                            name: 'has_transfer_status',
-                            type: 'select',
-                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
-                            placeholder: '是否有物流信息',
-                            data: [{name: '是', value: '是'}, {name: '否', value: '否'}]
-                        },
-
                         {name: 'default_date', type: 'checkbox', tip: '默认15天', data: [{name: 'ture', value: '默认15天'}]},
                         {name: 'default_logistics', type: 'checkbox', tip: '默认承运商', data: [{name: 'ture', value: '默认承运商'}]},
-
                     ], [
                         {
                             name: 'logistic',
@@ -383,31 +358,22 @@
                             placeholder: ['货主', '定位或多选货主'],
                             data: _this.owners
                         },
-                        {name: 'sent_at_end', type: 'dateTime', tip: '选择显示发出时间的截止时间'},
                         {
-                            name: 'is_exception',
+                            name: 'has_transfer_status',
                             type: 'select',
                             tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
-                            placeholder: '是否有异常',
+                            placeholder: '是否有物流信息',
                             data: [{name: '是', value: '是'}, {name: '否', value: '否'}]
                         },
-                        {name: 'received_at_end', type: 'dateTime', tip: '选择显示收货时间的截止时间'},
-
+                        {name: 'sent_at_end', type: 'dateTime', tip: '选择显示发出时间的截止时间'},
                         {
-                            name: 'exception_type',
-                            type: 'select_multiple_select',
+                            name: 'sync_routes_flag',
+                            type: 'select',
                             tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
-                            placeholder: ['异常类型', '定位或多选异常类型'],
-                            data: [
-                                {name: '疑似库内丢件', value: '疑似库内丢件'},
-                                {name: '揽件异常', value: '揽件异常'},
-                                {name: '中转异常', value: '中转异常'},
-                                {name: '疑似丢件', value: '疑似丢件'},
-                                {name: '派件异常', value: '派件异常'},
-                                {name: '其他', value: '其他'},
-                                {name: '无', value: '无'}
-                            ]
+                            placeholder: '是否有查询记录',
+                            data: [{name: true, value: '是'}, {name: false, value: '否'}]
                         },
+                        {name: 'received_at_end', type: 'dateTime', tip: '选择显示收货时间的截止时间'},
                         {
                             name: 'is_issue',
                             type: 'select',
@@ -415,13 +381,12 @@
                             placeholder: '是否为问题件',
                             data: [{name: '是', value: '是'}, {name: '否', value: '否'}]
                         },
-
                         {
-                            name: 'sync_routes_flag',
+                            name: 'is_new_rejecting',
                             type: 'select',
                             tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
-                            placeholder: '是否有查询记录',
-                            data: [{name: true, value: '是'}, {name: false, value: '否'}]
+                            placeholder: '退件状态',
+                            data: [{name: '无', value: '无'}, {name: '有', value: '有'},{name: '已处理', value: '已处理'}]
                         },
                     ]
                 ];
@@ -433,7 +398,6 @@
                 _this.form.init();
                 let column = [
                     {name: 'index', value: '序号', neglect: true},
-                    {name: 'exception_type', value: '异常类型'},
                     {name: 'logistic_number', value: '单号'},
                     {name: 'status', value: '状态'},
                     {name: 'logistic_name', value: '快递公司'},
@@ -443,6 +407,7 @@
                     {name: 'received_at', value: '收货日期'},
                     {name: 'weighed_at', value: '称重日期'},
                     {name: 'transfer_status', value: '快递路由'},
+                    {name: 'is_new_rejecting', value: '退件状态'},
                     {name: 'remark', value: '客服备注'},
                     {name: 'result_explain', value: '情况说明'},
                     {name: 'issue_type', value: '问题类别'},
@@ -480,29 +445,6 @@
                     }
                     this.$forceUpdate();
                 },
-                updateExceptionType(orderPackages) {
-                    let url = '{{ url("package/logistic") }}' + '/' + orderPackages.id;
-                    let data = {id: orderPackages['id'], exception_type: orderPackages.exception_type}
-                    axios.patch(url, data).then((res) => {
-                        window.tempTip.showSuccess('异常状态修改成功');
-                    });
-                },
-                batchExceptionTypeUpdate() {
-                    if(!confirm('是否却认操作')) return;
-                    let _this = this;
-                    if (checkData.length === 0) {
-                        tempTip.show('没有勾选记录');
-                        return
-                    }
-                    axios.put('{{url('package/logistic/batchUpdate')}}', {
-                        exception_type: this.batchExceptionType,
-                        logistic_numbers: checkData
-                    }).then(() => {
-                        tempTip.setDuration(1000);
-                        tempTip.showSuccess('批量更新异常状态成功');
-                        location.reload();
-                    })
-                },
                 batchStatusUpdate() {
                     if(!confirm('是否却认操作')) return;
                     let _this = this;

+ 76 - 60
resources/views/package/measureMonitor/index.blade.php

@@ -62,6 +62,7 @@
                     </div>
                 </div>
             </section>
+
         </div>
     </div>
 @endsection
@@ -102,50 +103,38 @@
                     let audioTag=$('<audio id="audio'+i+'" src="" autoplay></audio>');
                     body.append(audioTag);
                 }
-                let _this=this;
-                _this.measuringMachines.forEach(function(machine){
-                    _this.measuringMachinesIndex[machine.name]=machine;
-                });
 
+
+                this.measuringMachines.forEach((machine)=>{
+                    this.measuringMachinesIndex[machine.name] = machine;
+                })
                 initEcho();
-                Echo.channel('{{$laravelEchoPrefix}}package').listen('WeighedEvent',(e)=>{
-                    let package=e.package;
-                    let _this=this;
-                    let audio=document.getElementById("audio"+_this.currentAudioIndex);
-                    if (_this.currentAudioIndex==_this.amount){
-                        _this.currentAudioIndex=1;
-                    }else{
-                        _this.currentAudioIndex=_this.currentAudioIndex+1;
+                Echo.channel('{{$laravelEchoPrefix}}package').listen('WeighedEvent',e=>{
+                    let item = e.package;
+                    let audio = document.getElementById('audio'+this.currentAudioIndex);
+                    if (this.currentAudioIndex === this.amount){
+                        this.currentAudioIndex = 1;
+                    } else {
+                        this.currentAudioIndex = this.currentAudioIndex +1;
                     }
-                    if (package && package.measuring_machine && package.measuring_machine.name ===_this.package.measuringMachine){
-                        if (package.id ===_this.package.id){
-                            _this.package.measuringMachine_status=package.measuring_machine.status;
-                            _this.measuringMachinesIndex[package.measuring_machine.name].status=package.measuring_machine.status;
-                            tempTip.setDuration(2000);
-                            tempTip.showSuccess('暂无新数据');
-                            return;
+                    if (item && item.measuring_machine && item.measuring_machine.name === this.package.measuringMachine){
+                        if (item.id === this.package.id){
+                            this.package.measuringMachine_status = item.measuring_machine.status;
+                            this.measuringMachinesIndex[item.measuring_machine.name].status = item.measuring_machine.status;
+                            window.tempTip.setDuration(2000);
+                            window.tempTip.showSuccess('暂无新数据');
+                            return ;
                         }
-                        _this.updateData(_this,package);
-                        let logistic_name = package.order ? (package.order.logistic ? package.order.logistic.name : '') : '';
-                        if (_this.logisticAudioURL[logistic_name]){
-                            audio.src=_this.logisticAudioURL[logistic_name];
+                        this.updateData(item);
+                        let logistic_name = item.order ? (item.order.logistic ? item.order.logistic.name : '') : '';
+                        let logistic_number = item.logistic_number;
+                        if (this.logisticAudioURL[logistic_name]){
+                            audio.src=this.logisticAudioURL[logistic_name];
                             setTimeout(()=>{
                                 audio.play();
                             },0);
-                        }else {
-                            window.tempTip.setDuration(3000);
-                            window.axios.post("{{url('package/weigh/measureMonitor/speech')}}",{logistic:logistic_name})
-                                .then(function (response) {
-                                    if (response.data){
-                                        _this.logisticAudioURL[logistic_name]=response.data;
-                                        audio.src=response.data;
-                                        setTimeout(()=>{
-                                            audio.play();
-                                        },0);
-                                    }else window.tempTip.show('没有对应快递名称!');
-                                }).catch(function (err) {
-                                    window.tempTip.show('语音合成发生错误:'+err);
-                                });
+                        } else {
+                            this.speech(logistic_name,logistic_number);
                         }
                         window.tempTip.setDuration(1000);
                         window.tempTip.showSuccess('刷新成功!');
@@ -154,36 +143,63 @@
             },
             methods:{
                 clickMeasuringMachine(e){
-                    let _this=this;
-                    window.axios.post('{{url('package/weigh/measureMonitor/data')}}',{id:e})
-                        .then(function (response) {
-                            if (response.data.id){
-                                let orderPackage=response.data;
-                                _this.updateData(_this,orderPackage);
-                                _this.package.measuringMachine=orderPackage.measuring_machine ? orderPackage.measuring_machine.name : '';                            }else {
+                    let url  = '{{route('measureMonitor.dataApi')}}';
+                    let data = {id:e};
+                    window.axios.post(url,data).then(res =>{
+                            if (res.data.id){
+                                let orderPackage=res.data;
+                                this.updateData(orderPackage);
+                                this.package.measuringMachine= orderPackage.measuring_machine ? orderPackage.measuring_machine.name : '';
+                            }else {
                                 tempTip.setDuration(3000);
                                 tempTip.showSuccess('暂无数据!');
                             }
-                        })
-                        .catch(function (err) {
+                        }).catch(err=>{
                             tempTip.setDuration(4000);
                             tempTip.show('切换设备错误:'+err);
                         });
                 },
-                updateData(_this,package){
-                    _this.package.id=package.id;
-                    _this.package.logistic_number=package.logistic_number;
-                    _this.package.orderno = package.order ?  package.order.code : '';
-                    _this.package.weight=package.weight;
-                    _this.package.owner=package.order ? (package.order.owner ? package.order.owner.name : '') : '';
-                    _this.package.paperBox=package.paper_box ? package.paper_box.name : '';
-                    _this.package.recipient=package.order ? package.order.recipient : '';
-                    _this.package.status=package.status;
-                    _this.package.weighed_at=package.weighed_at;_this.package.bulk=package.bulk;
-                    _this.package.logistic_name=package.order ? (package.order.logistic ? package.order.logistic.name : '') : '';
-                    _this.package.measuringMachine_status=package.measuring_machine ? package.measuring_machine.status : '';
-                    _this.measuringMachinesIndex[package.measuring_machine ? package.measuring_machine.name : ''].status=package.measuring_machine ? package.measuring_machine.status : '离线';
-                }
+                updateData(item){
+                    this.package.id=item.id;
+                    this.package.logistic_number=item.logistic_number;
+                    this.package.orderno = item.order ?  item.order.code : '';
+                    this.package.weight=item.weight;
+                    this.package.owner=item.order ? (item.order.owner ? item.order.owner.name : '') : '';
+                    this.package.paperBox=item.paper_box ? item.paper_box.name : '';
+                    this.package.recipient=item.order ? item.order.recipient : '';
+                    this.package.status=item.status;
+                    this.package.weighed_at=item.weighed_at;
+                    this.package.bulk=item.bulk;
+                    this.package.logistic_name=item.order ? (item.order.logistic ? item.order.logistic.name : '') : '';
+                    this.package.measuringMachine_status=item.measuring_machine ? item.measuring_machine.status : '';
+                    this.measuringMachinesIndex[item.measuring_machine ? item.measuring_machine.name : ''].status = item.measuring_machine ? item.measuring_machine.status : '离线';
+                },
+                speech(logistic_name,logistic_number){
+                    let audio = document.getElementById('audio'+this.currentAudioIndex);
+                    window.tempTip.setDuration(3000);
+                    let url = '{{route('measureMonitor.speechApi')}}';
+                    let data = {logistic:logistic_name,logistic_number:logistic_number};
+                    window.axios.post(url,data).then(res=>{
+                        if(res.data.success){
+                            let name =res.data.data.name;
+                            let path = res.data.data.path;
+                            this.logisticAudioURL[name] = path;
+                            audio.src = path;
+                            setTimeout(()=>{
+                                audio.play();
+                            },0);
+                        }else {
+                            if (res.data.data){
+                                audio.src = res.data.data.path;
+                                setTimeout(()=>{
+                                    audio.play();
+                                },0);
+                            }
+                        }
+                    }).catch(err=>{
+                        window.tempTip.show('语音合成发生错误:'+err);
+                    });
+                },
             },
         });
     </script>

+ 177 - 227
resources/views/transport/waybill/delivering.blade.php

@@ -2,112 +2,20 @@
 @section('title')发运-运输管理@endsection
 
 @section('content')
-    <div id="list" class=" container-fluid">
-<!--        <form method="GET" action="{{url('transport/waybill/delivering')}}" id="form">
-            计费模型  <div class="text-nowrap mb-0" style="background: #fff;">
-                <div v-if="isBeingFilterConditions">
-                    <div><div class="col" style="padding:0">
-                            <a  href="{{url('transport/waybill/delivering')}}"><span class="btn btn-warning text-dark">清除筛选</span></a>
-                        </div>
-                    </div>
-                </div>
-                <div class="row mt-2 ml-2">
-                    <div class="col-md-6 form-inline" style="max-width: 400px">
-                        <input type="date" name="created_at_start" class="form-control form-control-sm tooltipTarget" title="选择显示指定日期的起始时间"
-                               v-model="filterData.created_at_start" :class="filterData.created_at_start?'bg-warning':''">
-                        <input type="date" class="form-control form-control-sm tooltipTarget" name="created_at_end" title="选择显示指定日期的结束时间"
-                               v-model="filterData.created_at_end" :class="filterData.created_at_end?'bg-warning':''" >
-                    </div>
-                    <div class=" col-md-2 mr-0 " style="max-width: 160px">
-                        <input type="text" title="运单号:可在两侧增加百分号(%)进行模糊搜索" name="waybill_number" placeholder="运单号"
-                               class="form-control form-control-sm tooltipTarget" v-model="filterData.waybill_number" style="vertical-align: middle;width: 153px" :class="filterData.waybill_number?'bg-warning':''">
-                    </div>
-                    <div class=" col-md-2 ml-2 p-0" style="max-width: 160px">
-                        <input type="text" title="承运商单号:可在两侧增加百分号(%)进行模糊搜索"  name="carrier_bill" placeholder="承运商单号"
-                               class="form-control form-control-sm tooltipTarget" v-model="filterData.carrier_bill" style="vertical-align: middle;width: 153px" :class="filterData.carrier_bill?'bg-warning':''">
-                    </div>
-                    <input type="submit" hidden>
-                </div>
-                <div class="ml-4 mt-2">
-                    <span class="dropdown">
-                        <button type="button" class="btn  btn-sm  form-control-sm dropdown-toggle tooltipTarget"
-                                data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
-                            导出Excel
-                        </button>
-                        <div class="dropdown-menu">
-                            <a class="dropdown-item" @click="waybillExport(false)" href="javascript:">导出勾选内容</a>
-                            <a class="dropdown-item" @click="waybillExport(true)" href="javascript:">导出所有页</a>
-                        </div>
-                    </span>
-                </div>
-            </div>
-        </form>-->
+    <div id="list" class="d-none container-fluid">
         <div class="card">
-            <table class="card-body table table-sm table-hover table-striped table-bordered d-none d-sm-block p-0 text-nowrap td-min-width-80" style="width: 100%" id="table">
-                <tr v-for="(waybill,i) in waybills">
-                    <td>
-                        <input class="checkItem" type="checkbox" :value="waybill.id">
-                    </td>
-                    <td><span>@{{ i+1 }}</span></td>
-                    <td><span>@{{ waybill.created_at }}</span></td>
-                    <td><span>@{{ waybill.carrier_name }}</span></td>
-                    <td><span>@{{ waybill.waybill_number }}</span></td>
-                    <td><span>@{{ waybill.origination }}</span></td>
-                    <td><span>@{{ waybill.owner_name }}</span></td>
-                    <td><span>@{{ waybill.warehouse_weight_other }}</span></td>
-                    <td><span>@{{ waybill.warehouse_weight }}</span></td>
-                    <td><span v-if="waybill.status=='已完结'">已完成</span><span v-else><span v-if="waybill.carrier_bill">已提交</span><span v-if="!waybill.carrier_bill">待提交</span></span></td>
-                    <td>
-                        <span v-if="waybill.isBtn || !waybill.carrier_bill">
-                            <input :id="'carrier_bill'+waybill.id+'PC'" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_bill?'is-invalid tooltipTargetError':''"
-                                   :title="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_bill?errors['_'+waybill.id].carrier_bill[0]:''" type="text" class="form-control form-control-sm w-100" :value="waybill.carrier_bill">
-                        </span><span v-else>@{{ waybill.carrier_bill }}</span>
-                    </td>
-                    <td>
-                        <span v-if="waybill.isBtn || !waybill.carrier_bill">
-                            <input :id="'inquire_tel'+waybill.id+'PC'" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].inquire_tel?'is-invalid tooltipTargetError':''"
-                                   :title="errors['_'+waybill.id]&&errors['_'+waybill.id].inquire_tel?errors['_'+waybill.id].inquire_tel[0]:''" type="text" class="form-control form-control-sm w-100" :value="waybill.inquire_tel">
-                        </span><span v-else>@{{ waybill.inquire_tel }} </span>
-                    </td>
-                    <td>
-                        <span v-if="waybill.isBtn || !waybill.carrier_bill">
-                            <input :id="'amount'+waybill.id+'PC'" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].amount?'is-invalid tooltipTargetError':''"
-                                   :title="errors['_'+waybill.id]&&errors['_'+waybill.id].amount?errors['_'+waybill.id].amount[0]:''" type="text" class="form-control form-control-sm w-100" :value="waybill.amount">
-                        </span><span v-else><span v-if="waybill.amount">@{{ waybill.amount }} @{{ waybill.amount_unit_name }}</span></span>
-                    </td>
-                    <td>
-                        <span v-if="waybill.isBtn || !waybill.carrier_bill">
-                            <input :id="'carrier_weight_other'+waybill.id+'PC'" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight_other?'is-invalid tooltipTargetError':''"
-                                   :title="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight_other?errors['_'+waybill.id].carrier_weight_other[0]:''" type="text" class="form-control form-control-sm w-100" :value="waybill.carrier_weight_other">
-                        </span><span v-else>@{{ waybill.carrier_weight_other }}</span>
-                    </td>
-                    <td>
-                        <span v-if="waybill.isBtn || !waybill.carrier_bill">
-                            <input :id="'carrier_weight'+waybill.id+'PC'" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight?'is-invalid tooltipTargetError':''"
-                                   :title="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight?errors['_'+waybill.id].carrier_weight[0]:''" type="text" class="form-control form-control-sm w-100" :value="waybill.carrier_weight">
-                        </span><span v-else>@{{ waybill.carrier_weight }}</span>
-                    </td>
-                    <td>
-                        <span v-if="waybill.status!='已完结'">
-                            <button v-if="!waybill.isBtn&&waybill.carrier_bill" @click="waybill.isBtn=true" class="btn btn-sm btn-outline-dark" >修改</button>
-                            <button v-if="!waybill.isBtn&& !waybill.carrier_bill" @click="submit(waybill.id+'PC',waybill.id);" class="btn btn-sm btn-outline-info" >录入</button>
-                            <button v-if="waybill.isBtn" @click="submit(waybill.id+'PC',waybill.id);" class="btn btn-sm btn-outline-success">确定</button>
-                            <button @click="waybill.isBtn=false" v-if="waybill.isBtn" class="btn btn-sm btn-outline-danger">取消</button>
-                        </span>
-                    </td>
-                </tr>
-            </table>
             <table class="table table-striped table-sm table-bordered table-hover p-0 d-block d-sm-none" style="background: rgb(255, 255, 255);">
                 <tbody>
                 <tr v-for="waybill in waybills">
-                    <td style="filter:grayscale(30%); ">
+                    <td style="filter:grayscale(30%); " :id="'waybill-'+waybill.id">
                         <div :style="waybill.status!='已完结'?'background-color:#f6eee8':''" class="mt-3">
                             <div style="transform:scale(0.9)" class="pl-0">
-                                <span class="mr-3 text-nowrap"><span style="color:#783000">日期:</span><span style="color:#af7651">@{{ waybill.created_at }}</span></span>
+                                <span class="mr-3 text-nowrap"><span style="color:#783000">日期:</span><span style="color:#af7651">@{{ waybill.deliver_at }}</span></span>
                                 <span class="mr-3 text-nowrap"><span style="color:#783000">承运商:</span><span style="color:#af7651">@{{ waybill.carrier_name }}</span></span>
-                                <span class="mr-3 text-nowrap"><span style="color:#783000">宝时运单号:</span><span style="color:#af7651">@{{ waybill.waybill_number }}</span></span>
+                                <span class="mr-3 text-nowrap"><span style="color:#783000">宝时运单号:</span><span style="color:#af7651">@{{ waybill.waybill_number }}</span><br></span>
+                                <span class="mr-3 text-nowrap"><span style="color:#783000">目的地:</span><span style="color:#af7651">@{{ waybill.address }}</span><br></span>
+                                <span class="mr-3 text-nowrap"><span style="color:#783000">收货人:</span><span style="color:#af7651">@{{ waybill.recipient }}</span></span>
                                 <span class="mr-3 text-nowrap"><span style="color:#783000">提货仓:</span><span style="color:#af7651">@{{ waybill.origination }}</span></span>
-                                <span class="mr-3 text-nowrap"><span style="color:#783000">项目:</span><span style="color:#af7651">@{{ waybill.owner_name }}</span></span>
                                 <span class="mr-3 text-nowrap"><span style="color:#783000">预估重量:</span><span style="color:#af7651" v-if="waybill.warehouse_weight_other">@{{ waybill.warehouse_weight_other }} @{{ waybill.warehouse_weight_unit_other_name }}</span></span>
                                 <span class="mr-3 text-nowrap"><span style="color:#783000">预估体积:</span><span style="color:#af7651" v-if="waybill.warehouse_weight">@{{ waybill.warehouse_weight }} @{{ waybill.warehouse_weight_unit_name }}</span></span>
                             </div>
@@ -116,44 +24,76 @@
                             <div style="transform:scale(0.9)" class="pl-0 form-inline">
                                 <span class="mr-3 text-nowrap form-inline"><span style="color:#02346a">专线运单号:</span>
                                     <input :id="'carrier_bill'+waybill.id" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_bill?'is-invalid tooltipTargetError':''"
-                                           :title="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_bill?errors['_'+waybill.id].carrier_bill[0]:''" v-if="waybill.isBtn || !waybill.carrier_bill" type="text" :value="waybill.carrier_bill"
+                                           :title="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_bill?errors['_'+waybill.id].carrier_bill[0]:''" v-if="waybill.isBtn" type="text" :value="waybill.carrier_bill"
                                            class="form-control form-control-sm " @click="enlarge($event)"  style="width: 50px">
                                     <span v-else  class="text-muted">@{{ waybill.carrier_bill }}</span>
                                 </span>
-                                <span class="mr-3 text-nowrap form-inline"><span style="color:#02346a">查&nbsp;件&nbsp;电&nbsp;话:</span>
+                                <span class="mr-3 text-nowrap form-inline"><span style="color:#02346a">查&nbsp;件&nbsp;电&nbsp;&nbsp;话:</span>
                                     <input :id="'inquire_tel'+waybill.id" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].inquire_tel?'is-invalid tooltipTargetError':''"
-                                           :title="errors['_'+waybill.id]&&errors['_'+waybill.id].inquire_tel?errors['_'+waybill.id].inquire_tel[0]:''" v-if="waybill.isBtn || !waybill.carrier_bill" type="text" :value="waybill.inquire_tel"
+                                           :title="errors['_'+waybill.id]&&errors['_'+waybill.id].inquire_tel?errors['_'+waybill.id].inquire_tel[0]:''" v-if="waybill.isBtn" type="text" :value="waybill.inquire_tel"
                                            class="form-control form-control-sm" @click="enlarge($event)"  style="width:50px">
                                     <span v-else  class="text-muted">@{{ waybill.inquire_tel }}</span>
                                 </span>
-                                <span class="mr-3 text-nowrap form-inline"><span style="color:#02346a">件数:</span>
-                                    <input :id="'amount'+waybill.id" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].amount?'is-invalid tooltipTargetError':''"
-                                           :title="errors['_'+waybill.id]&&errors['_'+waybill.id].amount?errors['_'+waybill.id].amount[0]:''" v-if="waybill.isBtn || !waybill.carrier_bill" type="text" :value="waybill.amount" class="form-control form-control-sm"
-                                           @click="enlarge($event)" style="width:50px">
+                                <span class="mr-3 text-nowrap form-inline"><span style="color:#02346a">数量:</span>
+                                    <span class="input-group input-group-sm" v-if="waybill.isBtn">
+                                        <input :id="'amount'+waybill.id" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].amount?'is-invalid tooltipTargetError':''"
+                                               :title="errors['_'+waybill.id]&&errors['_'+waybill.id].amount?errors['_'+waybill.id].amount[0]:''" type="text" :value="waybill.amount"
+                                               class="form-control"
+                                               @click="enlarge($event)" style="width:50px">
+                                        <span class="input-group-append">
+                                          <span class="input-group-text">件</span>
+                                        </span>
+                                    </span>
                                     <span v-else class="text-muted"><span v-if="waybill.amount">@{{ waybill.amount }} @{{ waybill.amount_unit_name }}</span></span>
                                 </span>
                                 <span class="mr-3 text-nowrap form-inline"><span style="color:#02346a">重量:</span>
-                                    <input :id="'carrier_weight_other'+waybill.id" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight_other?'is-invalid tooltipTargetError':''"
-                                           :title="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight_other?errors['_'+waybill.id].carrier_weight_other[0]:''" v-if="waybill.isBtn || !waybill.carrier_bill" type="text" :value="waybill.carrier_weight_other"
-                                           class="form-control form-control-sm" @click="enlarge($event)" style="width:50px">
+                                    <span class="input-group input-group-sm" v-if="waybill.isBtn">
+                                        <input :id="'carrier_weight_other'+waybill.id" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight_other?'is-invalid tooltipTargetError':''"
+                                               :title="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight_other?errors['_'+waybill.id].carrier_weight_other[0]:''" type="text" :value="waybill.carrier_weight_other"
+                                               class="form-control" @click="enlarge($event)" style="width:50px">
+                                        <span class="input-group-append">
+                                          <span class="input-group-text">KG</span>
+                                        </span>
+                                    </span>
                                     <span v-else class="text-muted">@{{ waybill.carrier_weight_other }}</span>
                                 </span>
                                 <span class="mr-3 text-nowrap form-inline"><span style="color:#02346a">体积:</span>
-                                    <input :id="'carrier_weight'+waybill.id" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight?'is-invalid tooltipTargetError':''"
-                                           :title="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight?errors['_'+waybill.id].carrier_weight[0]:''" v-if="waybill.isBtn || !waybill.carrier_bill" type="text" :value="waybill.carrier_weight"
-                                           class="form-control form-control-sm" @click="enlarge($event)" {{--@mouseleave="shrink($event)"--}} style="width:50px">
+                                    <span class="input-group input-group-sm" v-if="waybill.isBtn">
+                                        <input :id="'carrier_weight'+waybill.id" :class="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight?'is-invalid tooltipTargetError':''"
+                                               :title="errors['_'+waybill.id]&&errors['_'+waybill.id].carrier_weight?errors['_'+waybill.id].carrier_weight[0]:''" type="text" :value="waybill.carrier_weight"
+                                               class="form-control" @click="enlarge($event)" style="width:50px">
+                                        <span class="input-group-append">
+                                          <span class="input-group-text">M³</span>
+                                        </span>
+                                    </span>
                                     <span v-else class="text-muted">@{{ waybill.carrier_weight }}</span>
                                 </span>
-                                <span class="mr-3 text-nowrap" v-if="waybill.status!='已完结'">
-                                    <button v-if="waybill.isBtn==true || !waybill.carrier_bill" class="btn btn-sm btn-outline-success" @click="submit(waybill.id)">提交</button>
-                                    <button v-if="waybill.isBtn==true" class="btn btn-sm btn-outline-danger" @click="waybill.isBtn=false">取消</button>
-                                    <button v-if="waybill.isBtn==false && waybill.carrier_bill" class="btn btn-sm " @click="waybill.isBtn=true" :class="waybill.carrier_bill?'btn-outline-dark':'btn-outline-primary'">修改</button></span></div>
+                                <span class="mr-3 text-nowrap form-inline" v-if="!waybill.isBtn && (waybill.status!=='已完结' && waybill.status!=='无模型')"><span style="color:#02346a">附加费:</span>
+                                    <span class="input-group input-group-sm">
+                                        <input :id="'subjoin_fee'+waybill.id" :value="waybill.subjoin_fee" type="number" step="0.01"
+                                               class="form-control" style="width:150px">
+                                        <span class="input-group-append">
+                                          <span class="input-group-text">元</span>
+                                        </span>
+                                    </span>
+                                </span>
+                                <span class="mr-3 text-nowrap" v-if="waybill.status!=='已完结' || waybill.status!=='无模型'">
+                                    <button class="btn btn-sm btn-outline-success" @click="submit(waybill.isBtn,waybill.id)">提交</button>
+                                </span>
+                            </div>
                         </div>
                     </td>
                 </tr>
             </tbody>
             </table>
         </div>
+        <div class="bg-white w-100 row" id="searchBlock" style="position: fixed;top:0;left:0;
+            width: 100%; text-align: center; border-radius: 3px;">
+            <div class="position-relative offset-2 col-9 mt-3 mb-3">
+                <input class="form-control form-control-sm w-100 rounded-pill" @keydown.enter="searchSubmit()" v-model="searchText" type="text" placeholder="运单号 物流单号"></input>
+                <a id="search" v-bind:href="'{{url('transport/waybill/delivering?searchText=')}}'+searchText"><button type="button" class="border btn btn-sm btn-primary text-white rounded-pill position-absolute" style="top: 0;right: 12px;">搜索</button></a>
+            </div>
+        </div>
     </div>
 @endsection
 
@@ -171,7 +111,7 @@
             waybills:[
                     @foreach($waybills as $waybill)
                 {id:'{{$waybill->id}}',
-                    created_at:'{{$waybill->created_at}}',
+                    deliver_at:'{{$waybill->deliver_at}}',
                     waybill_number:'{{$waybill->waybill_number}}',
                     origination:'{{$waybill->origination}}',
                     carrier_bill:'{{$waybill->carrier_bill}}',
@@ -181,73 +121,80 @@
                     carrier_weight_other:'{{$waybill->carrier_weight_other}}',
                     status:'{{$waybill->status}}',
                     amount:'{{$waybill->amount}}',
-                    amount_unit_id:'{{$waybill->amount_unit_id}}',
-                    amount_unit_name:'{{$waybill->amount_unit ? $waybill->amount_unit->name : ''}}',
                     inquire_tel:'{{$waybill->inquire_tel}}',
                     carrier_name:'{{$waybill->logistic->name ?? ''}}',
-                    owner_name:'{{$waybill->owner_name ?? ($waybill->owner->name ?? '')}}',
-                    warehouse_weight_unit_name:'{{$waybill->warehouse_weight_unit ? $waybill->warehouse_weight_unit->name : ''}}',
-                    carrier_weight_unit_name:'{{$waybill->carrier_weight_unit ? $waybill->carrier_weight_unit->name : ''}}',
-                    warehouse_weight_unit_other_name:'{{$waybill->warehouse_weight_unit_other ? $waybill->warehouse_weight_unit_other->name : ''}}',
-                    carrier_weight_unit_other_name:'{{$waybill->carrier_weight_unit_other ? $waybill->carrier_weight_unit_other->name : ''}}',
-                    isBtn:false
+                    isBtn:!!!'{{$waybill->carrier_bill}}',
+                    subjoin_fee:'{{$waybill->subjoin_fee}}',
+                    recipient:'{{$waybill->order->consignee_name ?? $waybill->recipient}}',
+                    address:'{{$waybill->order ? $waybill->order->province.$waybill->order->city.$waybill->order->district : $waybill->destination}}',
                 },
                 @endforeach
             ],
-            filterData:{
-                created_at_start:'',created_at_end:'',waybill_number:'',carrier_bill:''
-            },
             errors:{},
-            sum:{!! $waybills->count() !!},
+            searchText:"{{$searchText}}",
+            lastId:"",
+            lastHeight:"",
         },
         mounted:function(){
-            let _this=this;
             $(".tooltipTarget").tooltip({'trigger':'hover'});
-            _this.initInputs();
+            if (this.waybills.length>0)this.lastId = this.waybills[this.waybills.length-1].id;
+            this.listener();
             if (navigator.userAgent.indexOf("Android")!==-1)this.isAndroid = true;
             this.pageInit();
             $("#list").removeClass('d-none');
-            let column = [
-                {name:'index',value: '序号', neglect: true},
-                {name:'created_at',value: '日期', class:"color1"},
-                {name:'carrier_name',value: '承运商', class:"color1"},
-                {name:'waybill_number',value: '宝时运单号', class:"color1"},
-                {name:'origination',value: '提货仓', class:"color1"},
-                {name:'owner_name',value: '货主', class:"color1"},
-                {name:'warehouse_weight_other',value: '预估重量', neglect: true, class:"color1"},
-                {name:'warehouse_weight',value: '预估体积', neglect: true, class:"color1"},
-                {name:'status',value: '状态', class:"color2"},
-                {name:'carrier_bill',value: '专线运单号', class:"color2"},
-                {name:'inquire_tel',value: '查件电话', class:"color2"},
-                {name:'amount',value: '件数', neglect: true, class:"color2"},
-                {name:'carrier_weight_other',value: '重量', neglect: true, class:"color2"},
-                {name:'carrier_weight',value: '体积', neglect: true, class:"color2"},
-                {name:'operation',value: '操作', neglect: true},
-            ];
-            if (window.innerWidth > 500){
-                new Header({
-                    el: "table",
-                    name: "waybillDelivering",
-                    column: column,
-                    data: this.waybills,
-                    restorationColumn: 'id',
-                    fixedTop:($('#form_div').height())+2,
-                }).init();
-            }
         },
-        computed:{
-            isBeingFilterConditions:function(){
-
-                for(let key in this.filterData){
-                    if(this.filterData[key]){
-                        return true
+        methods:{
+            listener(){
+                window.addEventListener('scroll',  ()=>{
+                    let clientHeight = document.documentElement.clientHeight;
+                    let scrollTop = document.body.scrollTop;
+                    let scrollHeight = document.body.scrollHeight;
+                    if (clientHeight+scrollTop >= scrollHeight-500) {
+                        setTimeout(()=>{
+                            if (this.lastHeight===scrollHeight)return;
+                            this.loadData();
+                            this.lastHeight=scrollHeight;
+                        });
                     }
-                }
-                return false;
+                }, false);
+            },
+            loadData(){
+                window.tempTip.postBasicRequest("{{url('transport/waybill/loadData')}}",{searchText:this.searchText,lastId:this.lastId},res=>{
+                    if(!res || res.length<1){
+                        window.removeEventListener("scroll",function (){},false);
+                        return;
+                    }
+                    let waybills = [];
+                    let lastId = "";
+                    res.forEach(waybill=>{
+                        waybills.push({
+                            id:waybill.id,
+                            deliver_at:waybill.deliver_at,
+                            waybill_number:waybill.waybill_number,
+                            origination:waybill.origination,
+                            carrier_bill:waybill.carrier_bill,
+                            warehouse_weight:waybill.warehouse_weight,
+                            carrier_weight:waybill.carrier_weight,
+                            warehouse_weight_other:waybill.warehouse_weight_other,
+                            carrier_weight_other:waybill.carrier_weight_other,
+                            status:waybill.status,
+                            amount:waybill.amount,
+                            inquire_tel:waybill.inquire_tel,
+                            carrier_name:waybill.logistic ? waybill.logistic.name : '',
+                            isBtn:!!!waybill.carrier_bill,
+                            subjoin_fee:waybill.subjoin_fee,
+                            recipient:waybill.order ? waybill.order.consignee_name : waybill.recipient,
+                            address:waybill.order ? waybill.order.province+waybill.order.city+waybill.order.district : waybill.destination,
+                        });
+                        lastId = waybill.id;
+                    });
+                    this.waybills.push.apply(this.waybills, waybills);
+                    this.lastId = lastId;
+                });
+            },
+            searchSubmit(){
+                document.getElementById("search").click();
             },
-
-        },
-        methods:{
             //页面初始化
             pageInit(){
                 if (!this.isAndroid)return;
@@ -258,79 +205,82 @@
                 element.innerHTML = element.children[0].outerHTML;
                 let e1 = document.getElementById("menu");
                 let e2 = document.getElementById("demand-div");
+                //let e3 = document.getElementsByClassName("navbar");
                 if (e1)e1.remove();
                 if (e2)e2.remove();
+                //if (e3.length>0)e3[0].remove();
                 element = document.getElementById("container");
                 if (element)element.style.height = (window.innerHeight-100)+"px";
             },
-            initInputs:function(){
-                let data=this;
-                let uriParts =decodeURI(location.href).split("?");
-                if(uriParts.length>1){
-                    let params = uriParts[1].split('&');
-                    params.forEach(function(paramPair){
-                        let pair=paramPair.split('=');
-                        let key = pair[0], val = pair[1];
-                        $('input[name="'+key+'"]').val(val);
-                        $('select[name="'+key+'"]').val(val);
-                        decodeURI(data.filterData[key]=val);
-                    });
-                }
-            },
-            waybillExport(checkAllSign){
-                let url = '{{url('transport/waybill/deliveringExport')}}';
-                let token='{{ csrf_token() }}';
-                excelExport(checkAllSign,checkData,url,this.sum,token);
-            },
             enlarge(e){
                 e.target.style.width="150px";
             },
             shrink(e){
                 e.target.style.width="50px";
             },
-            submit(waybill_id,id=null){
-                if (!confirm('确定要提交吗?')){return;}
-                let _this=this;
-                let data={};
-                data['id'] = id ? waybill_id : '';
-                data['carrier_bill'] = $("#carrier_bill"+waybill_id).val();
-                data['inquire_tel'] = $("#inquire_tel"+waybill_id).val();
-                data['amount'] = $("#amount"+waybill_id).val();
-                data['carrier_weight'] = $("#carrier_weight"+waybill_id).val();//体积
-                data['carrier_weight_other'] = $("#carrier_weight_other"+waybill_id).val();//重量
-                if (_this.errors["_"+data['id']])_this.errors["_"+data['id']]={};
-                axios.post("{{url('transport/waybill/storeCarrierBill')}}",data)
-                    .then(function (response) {
-                        if (response.data.error){
-                            tempTip.setDuration(3000);
-                            tempTip.show(response.data.error);
-                            return
-                        }
-                        if (response.data.errors){
-                            Vue.set(_this.errors,"_"+data['id'],response.data.errors);
-                            setTimeout(function(){
-                                $(".tooltipTargetError").tooltip('show');
-                            },1);
-                            return;
+            appendSubjoinFee(waybillId){
+                let subjoinFee =  $("#subjoin_fee"+waybillId).val();
+                if (!subjoinFee)return;
+                window.tempTip.postBasicRequest("{{url('transport/waybill/appendSubjoinFee')}}",{subjoinFee:subjoinFee,id:waybillId},()=>{
+                    this.waybills.some((waybill,index)=>{
+                        if (waybill.id===waybillId){
+                            this.$set(this.waybills[index],"subjoin_fee",subjoinFee);
+                            return true;
                         }
-                        _this.waybills.some(function (waybill) {
-                            if (waybill.id===data['id']){
-                                waybill.carrier_bill=response.data.carrier_bill;
-                                waybill.inquire_tel=response.data.inquire_tel;
-                                waybill.amount=response.data.amount;
-                                waybill.amount_unit_name=response.data.amount_unit_name;
-                                waybill.carrier_weight=response.data.carrier_weight;
-                                waybill.carrier_weight_other=response.data.carrier_weight_other;
-                                waybill.isBtn=false;
-                                tempTip.setDuration(2000);
-                                tempTip.showSuccess('录入成功!');
-                                return true;
+                    });
+                    return "附加费添加成功";
+                });
+            },
+            submit(isBtn,waybillId,id=null){
+                if(!isBtn){this.appendSubjoinFee(waybillId);return;}
+                window.tempTip.confirm("确定要提交调配信息吗?",()=>{
+                    let data={
+                        id           :  id ? id : waybillId,
+                        carrier_bill :  $("#carrier_bill"+waybillId).val(),
+                        inquire_tel  :  $("#inquire_tel"+waybillId).val(),
+                        amount  :  $("#amount"+waybillId).val(),
+                        carrier_weight  :  $("#carrier_weight"+waybillId).val(),
+                        carrier_weight_other  :  $("#carrier_weight_other"+waybillId).val(),
+                    };
+                    if (!data["id"]){
+                        window.tempTip.setDuration(3000);
+                        window.tempTip.show("参数异常");
+                        return;
+                    }
+                    this.errors["_"+data['id']]={};
+                    axios.post("{{url('transport/waybill/storeCarrierBill')}}",data)
+                        .then(response=>{
+                            if (response.data.error){
+                                tempTip.setDuration(3000);
+                                tempTip.show(response.data.error);
+                                return;
+                            }
+                            if (response.data.errors){
+                                this.$set(this.errors,"_"+data['id'],response.data.errors);
+                                setTimeout(function(){
+                                    $(".tooltipTargetError").tooltip('show');
+                                },1);
+                                return;
                             }
+                            this.waybills.some(function (waybill) {
+                                if (waybill.id===data['id']){
+                                    waybill.carrier_bill=response.data.carrier_bill;
+                                    waybill.inquire_tel=response.data.inquire_tel;
+                                    waybill.amount=response.data.amount;
+                                    waybill.amount_unit_name=response.data.amount_unit_name;
+                                    waybill.carrier_weight=response.data.carrier_weight;
+                                    waybill.carrier_weight_other=response.data.carrier_weight_other;
+                                    if (waybill.carrier_bill)waybill.isBtn=false;
+                                    tempTip.setDuration(2000);
+                                    tempTip.showSuccess('录入成功!');
+                                    return true;
+                                }
+                            });
+                        }).catch(function (err) {
+                            tempTip.setDuration(3000);
+                            tempTip.show('网络异常:'+err);
                         });
-                    }).catch(function (err) {
-                    tempTip.setDuration(3000);
-                    tempTip.show('网络异常:'+err);
-                });
+                })
             }}
     });
 

+ 12 - 0
routes/api.php

@@ -14,3 +14,15 @@ use Illuminate\Support\Facades\Route;
 |
 */
 
+Route::prefix("v1")->group(function (){
+    Route::middleware('throttle:' . config('api.rate_limits.sign'))
+        ->group(function () {
+           //登录
+           Route::POST('login', 'LoginController@login');
+        });
+    Route::middleware(['throttle:' . config('api.rate_limits.access'),"authorizing"])
+        ->group(function () {
+            Route::POST('test', 'LoginController@test');
+        });
+});
+

+ 4 - 2
routes/web.php

@@ -23,10 +23,10 @@ Auth::routes();
 Route::get('/', function () {return redirect('login');});
 Route::any('test/{method}', 'TestController@method');
 //称重广播
-Route::post('package/weigh/measureMonitor/speech','MeasureMonitorController@speech');
+Route::post('package/weigh/measureMonitor/speech','MeasureMonitorController@speech')->name('measureMonitor.speechApi');
 //设备切换
 Route::post('package/measureMonitor/data','MeasureMonitorController@data');
-Route::post('package/weigh/measureMonitor/data','MeasureMonitorController@data');
+Route::post('package/weigh/measureMonitor/data','MeasureMonitorController@data')->name('measureMonitor.dataApi');
 //称重显示
 Route::get('package/measureMonitor','MeasureMonitorController@index');
 Route::get('package/weigh/measureMonitor','MeasureMonitorController@index');
@@ -391,6 +391,8 @@ Route::group(['middleware'=>'auth'],function ($route){
             Route::resource('waybillFinancialExcepted','WaybillFinancialExceptedController');
             Route::post('expressFaceList','WaybillController@expressFaceList');
             Route::post('changeExpressTag','WaybillController@changeExpressTag');
+            Route::post('appendSubjoinFee','WaybillController@appendSubjoinFee');
+            Route::post('loadData','WaybillController@loadData');
         });
         Route::resource('waybill','WaybillController');
     });