소스 검색

Merge branch 'master' into Haozi

# Conflicts:
#	public/js/app.js
#	resources/views/inventory/stockInventory/inventoryMission.blade.php
haozi 5 년 전
부모
커밋
a6e3f77942
51개의 변경된 파일3188개의 추가작업 그리고 481개의 파일을 삭제
  1. 69 0
      app/Console/Commands/WASSyncWMSOrderInformation.php
  2. 3 3
      app/Console/Kernel.php
  3. 65 1
      app/Http/Controllers/CommodityController.php
  4. 1 0
      app/Http/Controllers/OrderIssueController.php
  5. 56 6
      app/Http/Controllers/OrderTrackingController.php
  6. 10 10
      app/Http/Controllers/OrderTrackingOwnerController.php
  7. 9 12
      app/Http/Controllers/OwnerController.php
  8. 12 0
      app/Http/Controllers/StoreCheckingReceiveController.php
  9. 22 3
      app/Http/Controllers/TestController.php
  10. 12 27
      app/Http/Controllers/UserLaborController.php
  11. 62 13
      app/Imports/StoreCheckingReceiveImport.php
  12. 6 0
      app/OracleDOCOrderHeader.php
  13. 1 1
      app/Order.php
  14. 4 0
      app/OrderPackageCommodities.php
  15. 32 1
      app/OrderTracking.php
  16. 1 0
      app/Owner.php
  17. 39 3
      app/Providers/AppServiceProvider.php
  18. 148 4
      app/Services/CommodityService.php
  19. 34 0
      app/Services/LogisticService.php
  20. 20 0
      app/Services/OracleBasSkuService.php
  21. 28 0
      app/Services/OracleDOCOrderHeaderService.php
  22. 37 18
      app/Services/OrderIssueService.php
  23. 312 25
      app/Services/OrderPackageCommoditiesService.php
  24. 221 51
      app/Services/OrderPackageService.php
  25. 330 12
      app/Services/OrderService.php
  26. 246 28
      app/Services/OrderTrackingService.php
  27. 58 18
      app/Services/OwnerService.php
  28. 48 5
      app/Services/ShopService.php
  29. 4 2
      app/Services/StoreCheckingReceiveItemService.php
  30. 12 0
      app/Services/StoreCheckingReceiveService.php
  31. 70 0
      app/Services/common/BatchUpdateService.php
  32. 84 0
      app/Services/common/DataHandlerService.php
  33. 1 1
      app/Services/common/QueryService.php
  34. 3 0
      app/StoreCheckingReceive.php
  35. 0 7
      config/sync,php.php
  36. 7 0
      config/sync.php
  37. 1 1
      database/migrations/2020_09_03_182051_create_order_trackings_table.php
  38. 3 3
      database/migrations/2020_09_16_090458_create_store_checking_receive_items_table.php
  39. 2 2
      public/js/app.js
  40. 1 1
      resources/js/queryForm/queryForm.js
  41. 3 3
      resources/views/inventory/stockInventory/inventoryMission.blade.php
  42. 67 2
      resources/views/maintenance/commodity/index.blade.php
  43. 16 2
      resources/views/maintenance/userLabor/index.blade.php
  44. 1 1
      resources/views/order/issue/edit.blade.php
  45. 170 112
      resources/views/order/issue/index.blade.php
  46. 344 72
      resources/views/order/tracking/index.blade.php
  47. 2 5
      resources/views/store/checkingReceive/menu.blade.php
  48. 67 23
      resources/views/store/checkingReceive/mission.blade.php
  49. 429 0
      resources/views/store/checkingReceive/show.blade.php
  50. 12 1
      routes/apiLocal.php
  51. 3 2
      routes/web.php

+ 69 - 0
app/Console/Commands/WASSyncWMSOrderInformation.php

@@ -0,0 +1,69 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Services\LogService;
+use App\Services\OrderTrackingService;
+use Illuminate\Console\Command;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\Auth;
+
+class WASSyncWMSOrderInformation extends Command
+{
+
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'WASSyncWMSOrderInformation';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '同步WMS的订单信息';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        $this->WasSyncWmsOrder();
+    }
+
+    public function WasSyncWmsOrder(){
+
+        /** @var OrderTrackingService $orderTrackingService */
+        $orderTrackingService  = app('orderTrackingService');
+
+        $dataInterval = intval(data_get(config('sync'), 'order_tracking_import.interval')) * 60 + 5;
+
+        $startDate = Carbon::now()->subSeconds($dataInterval);
+
+        $syncStartDate = data_get(config('sync'), 'order_tracking_import.start_at');
+
+        if($syncStartDate ?? false){
+            $syncStartDate = Carbon::parse($syncStartDate);
+            if ($startDate->lt($syncStartDate)) {
+                $startDate = $syncStartDate;
+            }
+        }
+
+//        $startDate = Carbon::parse('2020-05-06 13:16:51')->toDateTimeString();
+        $orderTrackingService->根据设置从WMS同步追踪货主的订单($startDate);
+    }
+}

+ 3 - 3
app/Console/Kernel.php

@@ -2,10 +2,8 @@
 
 namespace App\Console;
 
-use Carbon\Carbon;
 use Illuminate\Console\Scheduling\Schedule;
 use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
-use Illuminate\Support\Facades\DB;
 
 class Kernel extends ConsoleKernel
 {
@@ -19,7 +17,7 @@ class Kernel extends ConsoleKernel
         \App\Console\Commands\MakeServiceCommand::class,
         \App\Console\Commands\FluxOrderFix::class,
         \App\Console\Commands\InventoryDailyLoggingOwner::class,
-
+        \App\Console\Commands\WASSyncWMSOrderInformation::class,
     ];
 
     /**
@@ -33,6 +31,8 @@ class Kernel extends ConsoleKernel
         $schedule->command('LogExpireDelete')->dailyAt('00:01');
         $schedule->command('InventoryDailyLoggingOwner')->dailyAt('08:00');
         $schedule->command('FluxOrderFix')->hourlyAt(1);
+        $schedule->command('FluxOrderFix')->cron('* * * * *');
+        $schedule->command('WASSyncWMSOrderInformation')->everyMinute();
     }
 
     /**

+ 65 - 1
app/Http/Controllers/CommodityController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\Commodity;
 use App\Imports\CommodityImport;
+use App\OracleBasSKU;
 use Exception;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
@@ -23,7 +24,7 @@ class CommodityController extends Controller
     public function index()
     {
         if(!Gate::allows('商品信息-查询')){ return redirect(url('/'));  }
-        $commodities=Commodity::orderBy('id','desc')->paginate(50);
+        $commodities=Commodity::query()->orderBy('id','desc')->paginate(50);
         return view('maintenance.commodity.index',['commodities'=>$commodities]);
     }
 
@@ -162,4 +163,67 @@ class CommodityController extends Controller
         }
         return ['success'=>'true','name'=>$name];
     }
+
+    public function syncWMS(Request $request){
+        $owner_code = $request->owner_code ?? false;
+        $owner_id = $request->owner_id ?? false;
+        if (!$owner_code || !$owner_id)return ['success'=>false, 'data'=>"未指定货主"];
+
+        $map = [];
+        $skus = [];
+        $wmsCommodities = app('oracleBasSkuService')->getOwnerCommodities(['code' => $owner_code]);
+        foreach ($wmsCommodities as $index => $wmsCommodity){
+            $map[$wmsCommodity->sku] = $index;
+            $skus[] = $wmsCommodity->sku;
+        }
+
+        $commodities = app('commodityService')->getOwnerCommodities(['id' => $owner_id, 'sku'=>$skus]);
+
+        $updateCommodities = [];
+        $updateCommodities[] = [
+            'id', 'name', 'length', 'width', 'height', 'volumn',
+        ];
+        foreach ($commodities as $commodity){
+            $wms = $wmsCommodities[$map[$commodity->sku]];
+            if (($commodity->length != $wms->skulength) || ($commodity->width != $wms->skuwidth)
+                || ($commodity->height != $wms->skuhigh) || ($commodity->volumn != $wms->cube)
+                || ($commodity->name != $wms->descr_c)){
+                $updateCommodities[] = [
+                    'id'=>$commodity->id,
+                    'name' => $wms->descr_c,
+                    'length' => $wms->skulength,
+                    'width' => $wms->skuwidth,
+                    'height' => $wms->skuhigh,
+                    'volumn' => $wms->cube
+                ];
+            }
+            unset($wmsCommodities[$map[$commodity->sku]]);
+            unset($map[$commodity->sku]);
+        }
+        unset($commodities);
+        unset($skus);
+
+        if (count($updateCommodities) > 1)app('commodityService')->batchUpdate($updateCommodities);
+
+        $createCommodities = [];
+        $today = date('Y-m-d H:i:s');
+        foreach ($map as $sku => $index){
+            $wms = $wmsCommodities[$index];
+            $createCommodities[] = [
+                'owner_id' => $owner_id,
+                'sku' => $wms->sku,
+                'name' => $wms->descr_c,
+                'length' => $wms->skulength,
+                'width' => $wms->skuwidth,
+                'height' => $wms->skuhigh,
+                'volumn' => $wms->cube,
+                "created_at" => $today,
+            ];
+            unset($wmsCommodities[$index]);
+        }
+
+        if (count($createCommodities) > 0)app('commodityService')->insert($createCommodities);
+
+        return ['success'=>true];
+    }
 }

+ 1 - 0
app/Http/Controllers/OrderIssueController.php

@@ -14,6 +14,7 @@ use App\Owner;
 use App\QualityLabel;
 use App\RejectedBill;
 use App\Services\OrderIssueService;
+use App\Services\OrderPackageService;
 use App\Services\OrderService;
 use App\Services\RejectedService;
 use App\Shop;

+ 56 - 6
app/Http/Controllers/OrderTrackingController.php

@@ -2,8 +2,19 @@
 
 namespace App\Http\Controllers;
 
+use App\OracleActAllocationDetails;
+use App\OracleBasCustomer;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\OrderTracking;
+use App\OrderTrackingOwner;
 use App\Owner;
+use App\Services\CommodityService;
+use App\Services\LogService;
+use App\Services\OrderTrackingService;
+use App\Services\OwnerService;
 use Illuminate\Http\Request;
+use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\Gate;
 
 class OrderTrackingController extends Controller
@@ -11,19 +22,58 @@ class OrderTrackingController extends Controller
 
     public function index(Request $request)
     {
-        if(!Gate::allows('订单管理-跟踪')){ return redirect(url('/'));  }
-        $owners = Owner::all();
+        if (!Gate::allows('订单管理-跟踪'))
+            return redirect(url('/'));
 
-        return view('order.tracking.index',compact('owners'));
+        $owners = Owner::all();
+        $service = app('orderTrackingService');
+        $trackOrders = $service->paginate($request->input());
+        return view('order.tracking.index', compact('owners', 'trackOrders'));
     }
 
-
-    public function export(){
+    public function logisticUpdateApi(Request $request)
+    {
+        if (!Gate::allows('订单管理-跟踪-物流公司编辑'))
+            return redirect(url('/'));
+        try {
+            $bool = OrderTracking::query()
+                ->where('id', $request->input('id'))
+                ->update([$request->input('param') => $request->input('value')]);
+            LogService::log(__METHOD__, __FUNCTION__, '更新成功「' . json_encode($request) . '」');
+            return ['success' => $bool];
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__, '更新失败「' . json_encode($request) . '」');
+            return ['success' => false];
+        }
 
     }
 
-    public function updateApi(Request $request){
+    public function warehouseUpdateApi(Request $request)
+    {
+        if (!Gate::allows('订单管理-跟踪-仓库编辑'))
+            return redirect(url('/'));
+        try {
+            $bool = OrderTracking::query()
+                ->where('id', $request->input('id'))
+                ->update([$request->input('param') => $request->input('value')]);
+            LogService::log(__METHOD__, __FUNCTION__, '更新成功「' . json_encode($request) . '」');
+            return ['success' => $bool];
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__, '更新失败「' . json_encode($request) . '」');
+            return ['success' => false];
+        }
+    }
 
+    public function export(Request $request)
+    {
+        if (!Gate::allows('订单管理-跟踪'))
+            return redirect(url('/'));
+        $service = app('orderTrackingService');
+        if($request->filled('data')){
+            $request['ids'] = $request->input('data');
+            $request['data'] = null;
+        }
+        return $service->export($request->input());
     }
 
 }

+ 10 - 10
app/Http/Controllers/OrderTrackingOwnerController.php

@@ -16,20 +16,18 @@ class OrderTrackingOwnerController extends Controller
         if (!Gate::allows('订单管理-跟踪-监听')) {
             return ['success' => false, 'fail_info' => '权限不足'];
         }
-        if($request->filled('owner_id') || $request->filled('status')){
+        if (!$request->filled('owner_id') || !$request->filled('status')) {
             return ['success' => false, 'fail_info' => '没有传入对应参数'];
         }
 
-        $orderTrackingOwner = OrderTrackingOwner::query()
-            ->where(['owner_id' => $request->input('owner_id')])
-            ->first();
-        if (!$orderTrackingOwner ?? false) {
+        $orderTrackingOwner = OrderTrackingOwner::query()->where('owner_id',$request->input('owner_id'))->first();
+        if ($orderTrackingOwner ?? false) {
             $success = $orderTrackingOwner->update(['status' => $request->input('status')]);
-            return ['success'=>$success] ;
+            return ['success' => $success];
         }
 
         $data = ['owner_id' => $request->input('owner_id'), 'status' => $request->input('status')];
-        $success =  $orderTrackingOwner = OrderTrackingOwner::query()->create($data);
+        $success = $orderTrackingOwner = OrderTrackingOwner::query()->create($data) != null;
         return ['success' => $success];
     }
 
@@ -40,10 +38,12 @@ class OrderTrackingOwnerController extends Controller
         }
         $user = Auth::user();
         $owner_ids = $user ? $user->getPermittingOwnerIdsAttribute() : [];
-
-        return Owner::query()
-            ->with('orderTrackingOwner')
+        $owner = Owner::query()->with('orderTrackingOwner')
+            ->whereIn('id',$owner_ids)
+            ->whereHas('orderTrackingOwner',function ($query){$query->where('status','启用');})
+            ->select('id')
             ->get();
+        return  data_get($owner,'*.id');
     }
 }
 

+ 9 - 12
app/Http/Controllers/OwnerController.php

@@ -28,7 +28,6 @@ class OwnerController extends Controller
         return view('maintenance.owner.index',['owners'=>$owners]);
     }
 
-
     public function create()
     {
         if(!Gate::allows('货主-录入')){ return redirect(url('/'));  }
@@ -73,15 +72,9 @@ class OwnerController extends Controller
             'code'=>['required', 'string', 'max:50',"unique:owners,code,$id"]
         ]);
     }
-    /**
-     * Display the specified resource.
-     *
-     * @param Owner $owner
-     * @return Response
-     */
-    public function show(Owner $owner)
-    {
-        //
+    public function getOwners(){
+        $owners = app('ownerService')->getSelection(['id','code','name']);
+        return $owners;
     }
 
     /**
@@ -124,7 +117,9 @@ class OwnerController extends Controller
     public function destroy(Owner $owner)
     {
         if(!Gate::allows('货主-删除')){ return redirect(url('/'));  }
-        $re=$owner->delete();
+        $re=$owner->update([
+            "deleted_at" => date('Y-m-d H:i:s'),
+        ]);
         $this->log(__METHOD__,__FUNCTION__,$owner->toJson(),Auth::user()['id']);
         return ['success'=>$re];
     }
@@ -138,7 +133,9 @@ class OwnerController extends Controller
     {
         if(!Gate::allows('货主-删除')){ return ['success'=>'false','fail_info'=>"没有权限"];  }
         $id=$request->input('id');
-        $owner=Owner::query()->whereNotNull('deleted_at')->where('id',$id)->delete();
+        $owner=Owner::query()->whereNotNull('deleted_at')->where('id',$id)->update([
+            "deleted_at" => null,
+        ]);
         $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true','owner'=>$owner];
     }

+ 12 - 0
app/Http/Controllers/StoreCheckingReceiveController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Imports\StoreCheckingReceiveImport;
 use App\Services\StoreCheckingReceiveService;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
 use Maatwebsite\Excel\Facades\Excel;
 
 class StoreCheckingReceiveController extends Controller
@@ -28,5 +29,16 @@ class StoreCheckingReceiveController extends Controller
         ini_set('memory_limit','1526M');
         $fileSuffix = ucwords($fileSuffix);
         Excel::import(new StoreCheckingReceiveImport($isCovering),$request->file('file')->path(),null,$fileSuffix);
+        if (Cache::has('storeCheckingReceive')){
+            return Cache::pull('storeCheckingReceive');
+        }
+        return ["success"=>false, "data"=>"读取导入文件错误"];
+    }
+
+    public function show($id){
+        /** @var StoreCheckingReceiveService $service */
+        $service = app('storeCheckingReceiveService');
+        $storeCheckingReceive = $service->find($id);
+        return view('store.checkingReceive.show',compact('storeCheckingReceive'));
     }
 }

+ 22 - 3
app/Http/Controllers/TestController.php

@@ -12,6 +12,7 @@ use App\Log;
 use App\Logistic;
 use App\OracleActAllocationDetails;
 use App\OracleBasCode;
+use App\OracleBasSKU;
 use App\OracleDOCASNDetail;
 use App\OracleDOCOrderHeader;
 use App\OracleDocOrderPackingSummary;
@@ -25,11 +26,14 @@ use App\Process;
 use App\ProcessDaily;
 use App\ProcessStatistic;
 use App\RejectedBillItem;
+use App\Services\common\DataHandlerService;
 use App\Services\InventoryCompareService;
 use App\Services\LogService;
+use App\Services\OracleDOCOrderHeaderService;
 use App\Services\OrderIssueService;
 use App\Services\OrderPackageService;
 use App\Services\OrderService;
+use App\Services\OrderTrackingService;
 use App\Unit;
 use App\User;
 use App\Waybill;
@@ -357,7 +361,7 @@ class TestController extends Controller
         $id = array_column($statistics->toArray(),'process_id');
         $processes = Process::query()->where(function (Builder $query){
             $query->where('status','待交接')->orWhere('status','交接完成');
-        })->whereIn('process_id',$id)->get();
+        })->whereIn('id',$id)->get();
         $sign_end = true;
         foreach ($processes as $process){
             if (count($process->processDailies)>0){
@@ -405,8 +409,9 @@ class TestController extends Controller
     }
 
     public function test2(){
-        $a = ["a"=>1,"b"=>2];
-        dd(array_keys($a));
+        $a = OracleBasSKU::query()->where('customerid','HY')->get();
+        unset($a[0]);
+        dd($a[1],$a);
     }
 
     /*1*/
@@ -465,4 +470,18 @@ class TestController extends Controller
         echo "共耗时:".($e-$a)."\n";
     }
 
+
+    public function test3(){
+        /** @var DataHandlerService $dataHandlerService */
+        $dataHandlerService = app('dataHandlerService');
+
+        $startDate = \Illuminate\Support\Carbon::parse('2020-05-06 13:16:51')->toDateTimeString();
+        /** @var OrderTrackingService $orderTrackingService */
+        $orderTrackingService  = app('orderTrackingService');
+        $orderTrackingService->根据设置从WMS同步追踪货主的订单($startDate);
+//        $orderHeaders = OracleDOCOrderHeader::query()->where("addTime",'>=',$startDate)->groupBy('orderno')->get();
+//        dd($orderHeaders);
+
+    }
+
 }

+ 12 - 27
app/Http/Controllers/UserLaborController.php

@@ -20,13 +20,19 @@ class UserLaborController extends Controller
 {
     /**
      * Display a listing of the resource.
-     *
+     * @param Request $request
      * @return \Illuminate\Http\Response
      */
-    public function index()
+    public function index(Request $request)
     {
-        $userLabors=UserLabor::with('userDetail')->orderBy('user_id','desc')->paginate(50);
-
+        $userLabors=UserLabor::query()->with('userDetail')->orderBy('user_id','desc');
+        $full_name = $request->user_name ?? false;
+        if ($full_name){
+            $userLabors->whereHas('userDetail',function($query)use($full_name){
+                $query->where('full_name','like',$full_name."%");
+            });
+        }
+        $userLabors = $userLabors->paginate($request->paginate ?? 50);
         foreach ($userLabors as $userLabor){
             if($userLabor->userDetail){
                 $userLabor->is_relieve_facility=$userLabor->userDetail->hasDutyCheckToken();
@@ -35,16 +41,6 @@ class UserLaborController extends Controller
         return view('maintenance.userLabor.index',['userLabors'=>$userLabors]);
     }
 
-    /**
-     * Show the form for creating a new resource.
-     *
-     * @return \Illuminate\Http\Response
-     */
-    public function create()
-    {
-        //
-    }
-
     public function relieve(Request $request){
         $user_id=$request->input('user_id');
         if (!$user_id) return ['error'=>'传递空值!'];
@@ -58,17 +54,6 @@ class UserLaborController extends Controller
         return ['success'=>true,'userLabor'=>$userLabor];
     }
 
-    /**
-     * Store a newly created resource in storage.
-     *
-     * @param  \Illuminate\Http\Request  $request
-     * @return \Illuminate\Http\Response
-     */
-    public function store(Request $request)
-    {
-        //
-    }
-
     /**
      * Display the specified resource.
      *
@@ -109,7 +94,7 @@ class UserLaborController extends Controller
     {
         if(!Gate::allows('临时工-编辑')){ return redirect(url('/'));  }
         $userLabor=UserLabor::with(['userDetail','laborCompany'])->find($id);
-        $laborCompanies=LaborCompany::select('id','name')->get();
+        $laborCompanies=LaborCompany::query()->select('id','name')->get();
         return view('maintenance.userLabor.edit',['userLabor'=>$userLabor,'laborCompanies'=>$laborCompanies,]);
     }
 
@@ -168,7 +153,7 @@ class UserLaborController extends Controller
      * Remove the specified resource from storage.
      *
      * @param  int  $id
-     * @return \Illuminate\Http\Response
+     * @return \Illuminate\Http\Response|array
      */
     public function destroy($id)
     {

+ 62 - 13
app/Imports/StoreCheckingReceiveImport.php

@@ -3,7 +3,9 @@
 namespace App\Imports;
 
 use App\Services\CommodityService;
+use Carbon\Carbon;
 use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Cache;
 use Maatwebsite\Excel\Concerns\ToCollection;
 use Maatwebsite\Excel\Concerns\WithHeadingRow;
 use Maatwebsite\Excel\Imports\HeadingRowFormatter;
@@ -21,8 +23,9 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
     }
 
     /**
-    * @param Collection $collection
-     * @return array
+     * @param Collection $collection
+     * @return bool
+     * @throws \Exception
     */
     public function collection(Collection $collection)
     {
@@ -31,7 +34,10 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
             "货主","SKU","商品名称","条码","数量","生产日期","失效日期","批号","唯一码"
         ];
         foreach ($header as $str){
-            if (!($row[$str] ?? false)) return ["success"=>false, "data"=>"表头不存在“".$str."”"];
+            if (!($row[$str] ?? false)){
+                Cache::put("storeCheckingReceive",["success"=>false, "data"=>"表头不存在“".$str."”"],86400);
+                return false;
+            }
         }
         $owner_name = null;
         $items = [];
@@ -45,13 +51,31 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
                 array_push($errors,($index+2)." 行:条码或数量不存在");
                 continue;
             }
-            if ($item["生产日期"] && !(strtotime($item["生产日期"]) ? true : false)){
-                array_push($errors,($index+2)." 行:生产日期格式错误");
-                continue;
+            if ($item["生产日期"]){
+                if (is_numeric($item["生产日期"])){
+                    $diff = intval($item["生产日期"]);
+                    $today=new Carbon('1900-01-01');
+                    $day = $today->addDays($diff-2);
+                    $item["生产日期"] = $day;
+                }else{
+                    if (!(strtotime($item["生产日期"]) ? true : false)){
+                        array_push($errors,($index+2)." 行:生产日期格式错误");
+                        continue;
+                    }
+                }
             }
             if ($item["失效日期"] && !(strtotime($item["失效日期"]) ? true : false)){
-                array_push($errors,($index+2)." 行:失效日期格式错误");
-                continue;
+                if (is_numeric($item["失效日期"])){
+                    $diff = intval($item["失效日期"]);
+                    $today=new Carbon('1900-01-01');
+                    $day = $today->addDays($diff-2);
+                    $item["失效日期"] = $day;
+                }else{
+                    if (!(strtotime($item["失效日期"]) ? true : false)){
+                        array_push($errors,($index+2)." 行:失效日期格式错误");
+                        continue;
+                    }
+                }
             }
             $isUniqueCommodity = isset($commodities[$item["条码"]]);
             if ($isUniqueCommodity){
@@ -64,6 +88,7 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
                 }
             }
             array_push($items,[
+                "bin_number" => $item["格口号"],
                 "imported_amount" => $item["数量"],
                 "produced_at" => $item["生产日期"],
                 "invalid_at" => $item["失效日期"],
@@ -82,9 +107,11 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
                 array_push($barcodes,$item["条码"]);
             }
         }
-
         //不存在货主
-        if (!$owner_name) return ["success"=>false, "data"=>"货主为空,不允许录入,至少为一行标明货主!"];
+        if (!$owner_name){
+            Cache::put("storeCheckingReceive",["success"=>false, "data"=>"货主为空,不允许录入,至少为一行标明货主!"],86400);
+            return false;
+        }
 
         //使用条码获取商品ID
         $commodityBarCodes = app('commodityBarcodeService')->getCommodities($barcodes);
@@ -130,7 +157,7 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
         $barcodes = [];
         /** @var CommodityService $commodityService */
         $commodityService = app('commodityService');
-        $commodities = $commodityService->get(["owner_id"=>$owner->id,"sku"=>$skuParam]);
+        if (count($skuParam) > 0)$commodities = $commodityService->get(["owner_id"=>$owner->id,"sku"=>$skuParam]);
         foreach ($commodities as $commodity){
             foreach ($skus[$commodity->sku] as $i => $index){
                 $items[$index]["commodity_id"] = $commodity->id;
@@ -153,6 +180,7 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
         //未找到商品录入商品
         $commodities = [];
         $skuParam = [];
+        $barcodes = [];
         foreach ($skus as $sku => $arr){
             $data = &$items[$arr[0]];
             array_push($commodities,[
@@ -163,8 +191,8 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
             ]);
             array_push($skuParam, $sku);
         }
-        $commodityService->insert($commodities);
-        $commodities = $commodityService->get(["owner_id"=>$owner->id,"sku"=>$skuParam]);
+        if (count($commodities) > 0)$commodityService->insert($commodities);
+        if (count($skuParam) > 0)$commodities = $commodityService->get(["owner_id"=>$owner->id,"sku"=>$skuParam]);
         foreach ($commodities as $commodity){
             foreach ($skus[$commodity->sku] as $i => $index){
                 $items[$index]["commodity_id"] = $commodity->id;
@@ -182,5 +210,26 @@ class StoreCheckingReceiveImport implements ToCollection,WithHeadingRow
             }
             unset($skus[$commodity->sku]);
         }
+        if (count($barcodes) > 0) app('commodityBarcodeService')->insert($barcodes);
+
+        if (count($items) < 1){
+            Cache::put("storeCheckingReceive",["success"=>false, "errors"=>$errors],86400);
+            return false;
+        }
+        $storeCheckingReceive = app('storeCheckingReceiveService')->create([
+            "owner_id" => $owner->id,
+            "created_at" => date('Y-m-d H:i:s'),
+            'status' => "已导入",
+        ]);
+        $storeCheckingReceive->owner_name = $owner_name;
+
+        foreach ($items as &$item){
+            $item["store_checking_receive_id"] = $storeCheckingReceive->id;
+        }
+
+        app('storeCheckingReceiveItemService')->insert($items);
+
+        Cache::put("storeCheckingReceive",["success"=>true,"data"=>$storeCheckingReceive,"errors"=>$errors],86400);
+        return true;
     }
 }

+ 6 - 0
app/OracleDOCOrderHeader.php

@@ -2,10 +2,13 @@
 
 namespace App;
 
+use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 
 class OracleDOCOrderHeader extends Model
 {
+
+    use ModelTimeFormat;
     protected $connection="oracle";
     protected $table="DOC_Order_Header";
     protected $primaryKey="ORDERNO";
@@ -35,6 +38,9 @@ class OracleDOCOrderHeader extends Model
     public function oracleBASCode(){
         return $this->hasOne('App\OracleBasCode','code','sostatus')->where('codeid','SO_STS');
     }
+    public function actAllocationDetails(){
+        return $this->hasMany('App\OracleActAllocationDetails','orderno','orderno');
+    }
 
     public function getOracleBASCustomerDescrCAttribute(){
         return $this['oracleBASCustomer']['descr_c']??'';

+ 1 - 1
app/Order.php

@@ -43,7 +43,7 @@ class Order extends Model
 
     public function packages()
     {
-        return $this->hasMany('App\OrderPackage', 'order_id', 'id');
+        return $this->hasMany('App\OrderPackage','order_id','id');
     }
 
     public function getLogisticNumbersAttribute()

+ 4 - 0
app/OrderPackageCommodities.php

@@ -20,4 +20,8 @@ class OrderPackageCommodities extends Model
         return $this->belongsTo('App\Commodity','commodity_id','id');
     }
 
+    public function orderTracking(){
+        return $this->belongsTo(OrderTracking::class,'id','order_package_commodity_id');
+    }
+
 }

+ 32 - 1
app/OrderTracking.php

@@ -16,11 +16,42 @@ class OrderTracking extends Model
         'is_on_duty_shift','is_arrival','signed_at',
         'receive_bill_status','remark'];
 
+    protected $appends =[
+        'ownerName','sku','packageWeight','packageBulk','orderCity','packageLogisticNumber','packageLogistic','orderClientCode'
+    ];
+
     public function commodities(){
         return $this->hasOne('App\OrderPackageCommodities','id','order_package_commodity_id');
     }
 
     public function owner(){
-        return $this->hasOne('App\Owner','owner','owner_id');
+        return $this->hasOne('App\Owner','id','owner_id');
+    }
+
+    public function getOwnerNameAttribute(){
+        return $this->owner['name'] ?? '';
+    }
+    public function getSkuAttribute(){
+        return ['sku' => $this->commodities['commodity']['sku'] ?? '',
+            'skuName' => $this->commodities['commodity']['name'] ?? '',
+            'skuAmount' => $this->commodities['amount'] ?? ''];
+    }
+    public function getPackageWeightAttribute(){
+        return $this->commodities->package['weight'] ?? '';
+    }
+    public function getPackageBulkAttribute(){
+        return $this->commodities->package['bulk'] ?? '';
+    }
+    public function getOrderCityAttribute(){
+        return $this->commodities->package->order['city'] ?? '';
+    }
+    public function getPackageLogisticNumberAttribute(){
+        return $this->commodities->package['logistic_number'] ?? '';
+    }
+    public function getPackageLogisticAttribute(){
+        return $this->commodities->package->order->logistic['name'] ?? '';
+    }
+    public function getOrderClientCodeAttribute(){
+        return $this->commodities->package->order['client_code'] ?? '';
     }
 }

+ 1 - 0
app/Owner.php

@@ -38,4 +38,5 @@ class Owner extends Model
     public function orderTrackingOwner(){
         return $this->belongsTo(OrderTrackingOwner::class,'id','owner_id');
     }
+
 }

+ 39 - 3
app/Providers/AppServiceProvider.php

@@ -3,12 +3,14 @@
 namespace App\Providers;
 
 use App\Http\Controllers\Controller;
-use App\Services\CommodityBarcodeService;
 use App\Services\CommodityService;
+use App\Services\common\BatchUpdateService;
+use App\Services\CommodityBarcodeService;
+use App\Services\common\DataHandlerService;
 use App\Services\InventoryCompareService;
+use App\Services\OracleBasSkuService;
 use App\Services\OracleDOCOrderHeaderService;
 use App\Services\OrderIssuePerformanceService;
-use App\OracleActAllocationDetail;
 use App\Services\AllInventoryService;
 use App\Services\InventoryDailyLogService;
 use App\Services\LogisticService;
@@ -16,6 +18,9 @@ use App\Services\OracleActAllocationDetailService;
 use App\Services\OrderIssueService;
 use App\Services\OrderPackageService;
 use App\Services\OrderService;
+use App\Services\OrderIssueWorkLoadService;
+use App\Services\OrderPackageCommoditiesService;
+use App\Services\OrderTrackingService;
 use App\Services\OwnerService;
 use App\Services\PackageStatisticsService;
 use App\Services\ProcessMethodService;
@@ -24,11 +29,11 @@ use App\Services\ProcessStatisticService;
 use App\Services\RejectedBillItemService;
 use App\Services\RejectedBillService;
 use App\Services\ShopService;
+use App\Services\RejectedService;
 use App\Services\StoreCheckingReceiveItemService;
 use App\Services\StoreCheckingReceiveService;
 use App\Services\WaybillFinancialService;
 use App\Services\WeighExceptedService;
-use App\StoreCheckingReceiveItem;
 use Illuminate\Queue\Events\JobFailed;
 use Illuminate\Support\Facades\Queue;
 use Illuminate\Support\Facades\Schema;
@@ -104,5 +109,36 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('storeCheckingReceiveItemService',StoreCheckingReceiveItemService::class);
         app()->singleton('commodityBarcodeService',CommodityBarcodeService::class);
         app()->singleton('commodityService',CommodityService::class);
+        app()->singleton('oracleBasSkuService',OracleBasSkuService::class);
+
+        $this->loadingOrderModuleService();
+        $this->loadingBasedModuleService();
+        $this->loadingRejectedModuleService();
     }
+
+    private function loadingOrderModuleService(){
+        app()->singleton('orderTrackingService',OrderTrackingService::class);
+        app()->singleton('orderService',OrderService::class);
+        app()->singleton('orderPackageService',OrderPackageService::class);
+        app()->singleton('orderPackageCommoditiesService',OrderPackageCommoditiesService::class);
+        app()->singleton('orderIssueService',OrderIssueService::class);
+        app()->singleton('orderIssueWorkLoadService',OrderIssueWorkLoadService::class);
+        app()->singleton('orderIssuePerformanceService',OrderIssuePerformanceService::class);
+        app()->singleton('oracleDOCOrderHeaderService',OracleDOCOrderHeaderService::class);
+        app()->singleton('oracleActAllocationDetailService',OracleActAllocationDetailService::class);
+    }
+
+    private function loadingBasedModuleService(){
+        app()->singleton("shopService", ShopService::class);
+        //app()->singleton("logisticService", LogisticService::class);
+        //app()->singleton('ownerService',OwnerService::class);
+        app()->singleton('commodityService' , CommodityService::class);
+        app()->singleton('batchUpdateService' , BatchUpdateService::class);
+        app()->singleton('dataHandlerService',DataHandlerService::class);
+    }
+
+    private function loadingRejectedModuleService(){
+        app()->singleton('rejectedService',RejectedService::class);
+    }
+
 }

+ 148 - 4
app/Services/CommodityService.php

@@ -1,11 +1,14 @@
-<?php 
+<?php
 
-namespace App\Services; 
+namespace App\Services;
 
 use App\Commodity;
+use App\OracleBasSKU;
+use App\Owner;
+use App\Services\common\BatchUpdateService;
 
 Class CommodityService
-{ 
+{
     public function firstOrCreate($param,$column = null){
         if ($column) return Commodity::query()->firstOrCreate($param,$column);
         return Commodity::query()->firstOrCreate($param);
@@ -30,4 +33,145 @@ Class CommodityService
     public function insert(array $params){
         return Commodity::query()->insert($params);
     }
-}
+
+    public function getWASCommoditiesByWMSOrderHeaders($orderHeaders)
+    {
+        $skus = [];
+        $customerIDs = [];
+        $logs = [];
+        $errs = [];
+        $fillables = [];
+        $owners_list = [];
+
+        foreach ($orderHeaders as $orderHeader) {
+            $customerIDs[] = $orderHeader['customerid'];
+            $oracleDOCOrderDetails = $orderHeader['oracleDOCOrderDetails'] ?? [];
+            foreach ($oracleDOCOrderDetails as $detail) {
+                $skus[] = $detail['sku'];
+            }
+        }
+        $skus = array_unique($skus);
+        $customerIDs = array_unique($customerIDs);
+
+        $owners = Owner::query()->whereIn('code',$customerIDs)->get();
+
+        foreach ($owners as $owner) {
+            $key = 'code='.$owner->code;
+            $owners_list[$key] = $owner;
+        }
+
+        $commodities = Commodity::query()->with('owner')->whereIn('sku',$skus)->get();
+
+        if(count($skus) > $commodities->count()){ //需要更新
+            $commoditiesSku = data_get($commodities,'*.sku');
+            $diffSku = array_diff($skus,$commoditiesSku);
+            $baseSKUs = OracleBasSKU::query()->whereIn('sku',$diffSku)->whereIn('CustomerID',$customerIDs)->get();
+            foreach ($baseSKUs as $baseSKU) {
+                $key = 'code='.$baseSKU['customerid'];
+                $owner = $owners_list[$key] ?? '';
+                $fillables[] = [
+                    'name' => $baseSKU['descr_c'],
+                    'sku' => $baseSKU['sku'],
+                    'owner_id' => $owner['id'] ?? '',
+                    'length' => $baseSKU['skulength'] ?? '',
+                    'width' => $baseSKU['skuwidth'] ?? '',
+                    'height' => $baseSKU['skuhigh'] ?? '',
+                    'volumn' => $baseSKU['cube'],
+                ];
+            }
+        }
+        try {
+            if(count($fillables) > 0){
+                Commodity::query()->create($fillables);
+                LogService::log(__METHOD__,__FUNCTION__,'添加商品信息'.json_encode($fillables));
+            }
+        } catch (\Exception $e) {
+            array_push($errs,json_encode($fillables).$e->getMessage().$e->getTraceAsString());
+        }
+        unset($customerIDs,$logs,$errs,$fillables);
+        return Commodity::query()->with('owner')->whereIn('sku',$skus)->get();
+    }
+
+    public function syncCommodityAttribute($noAttributeCommodity){
+        /** @var BatchUpdateService $batchUpdateService */
+        $batchUpdateService = app('batchUpdateService');
+        $multipleData = [];
+        $multipleData[] = ['id','length','width','height','volumn'];
+
+        $noAttributeCommodity = array_unique($noAttributeCommodity);
+        if(count($noAttributeCommodity) > 1){
+            $SkuCode = data_get($noAttributeCommodity,'*.sku');
+            $BasSKUs = OracleBasSKU::query()->whereIn('sku',$SkuCode)->get();
+            foreach ($noAttributeCommodity as $commodity){
+                $BasSKU = $BasSKUs
+                    ->where('sku',$commodity['code'])
+                    ->where('CustomerID',$commodity['owner']['code'])
+                    ->first();
+                $update = [
+                    'id' => $commodity['id'],
+                    'length' =>  $BasSKU['skulength'] ?? 0,
+                    'width' => $BasSKU['skuwidth'] ?? 0,
+                    'height' => $BasSKU['skuhigh'] ?? 0,
+                    'volumn' => $BasSKU['cube'] ?? 0,
+                ];
+                if($commodity['length'] !==$update['length'] ||$commodity['width'] !==$update['width'] ||$commodity['height'] !==$update['height'] ||$commodity['volumn'] !==$update['volumn'] ){
+                    $multipleData[] = $update;
+                }
+            }
+        }
+        if(count($multipleData) > 1){
+            try {
+                $tableName = 'commodities';
+                $batchUpdateService->batchUpdate($tableName, $multipleData);
+                LogService::log(__METHOD__,__FUNCTION__,'批量更新'.count($multipleData).json_encode($multipleData));
+            } catch (\Exception $e) {
+                LogService::log(__METHOD__,__FUNCTION__,'批量更新失败'.json_encode($multipleData).$e->getMessage(),$e->getTraceAsString());
+            } finally {
+                unset($multipleData);
+            }
+        }
+    }
+
+    public function 根据sku和货主同步商品信息($sku,$owner)
+    {
+        try {
+            $basSku = OracleBasSKU::query()->where('sku', $sku)->where('CustomerID', $owner['code'])->first();
+            $commodity = Commodity::query()->where('sku', $sku)->where('owner_id', $owner['id'])->first();
+            $syncInfo = [
+                'name' => $basSku['descr_c'],
+                'sku' => $sku,
+                'owner_id' => $owner['id'],
+                'length' => $basSku['skulength'],
+                'width' => $basSku['skuwidth'],
+                'height' => $basSku['skuhigh'],
+                'volumn' => $basSku['cube'],
+            ];
+            if ($commodity) {
+                $commodity->update($syncInfo);
+            } else {
+                $commodity = Commodity::query()->create($syncInfo);
+            }
+        } catch (\Exception $e) {
+            $log = ['info'=>'根据sku和货主同步商品信息','mesaage'=>$e->getMessage(),'trace'=>$e->getTraceAsString()];
+            LogService::log(__METHOD__,__FUNCTION__,json_encode($log));
+        } finally {
+            return $commodity ?? null;
+        }
+    }
+
+
+    public function getOwnerCommodities(array $params){
+        $query = Commodity::query();
+        foreach ($params as $column => $value){
+            if (!is_array($value)){
+                $value = [$value];
+            }
+            $query->whereIn($column,$value);
+        }
+        return $query->get();
+    }
+
+    public function batchUpdate(array $params){
+        return app(BatchUpdateService::class)->batchUpdate('commodities', $params);
+    }
+}

+ 34 - 0
app/Services/LogisticService.php

@@ -3,6 +3,8 @@
 namespace App\Services;
 
 use App\Logistic;
+use App\OracleBasCustomer;
+use Illuminate\Support\Facades\Auth;
 
 Class LogisticService
 {
@@ -11,6 +13,38 @@ Class LogisticService
     }
 
 
+    public function getWASLogisticsByWMSOrderHeaders($WMSOrderHeaders){
+        $carrierIds = [];
+        foreach ($WMSOrderHeaders as $WMSOrderHeader) {
+            array_push($carrierIds,$WMSOrderHeader['carrierid']);
+        }
+        $carrierIds = array_unique($carrierIds);
+        $carrierIds = array_diff($carrierIds,['*','',null]);
+        $logistics = Logistic::query()->whereIn('code',$carrierIds)->get();
+        $fillables = [];
+        if(count($carrierIds) > count($logistics)){
+            $logistics_fillter= data_get($logistics,'*.code');
+            $logisticDiff = array_diff($carrierIds, $logistics_fillter);
+            $basCustomers = OracleBasCustomer::query()->where('Customer_Type','CA')->whereIn('CustomerID',$logisticDiff)->get();
+            foreach ($basCustomers as $basCustomer){
+                $fillable = ['name' => $basCustomer['descr_c'], 'code' => $basCustomer['customerid']];
+                array_push($fillables,$fillable);
+            }
+        }
+        try {
+            if(count($fillables) > 0){
+                Logistic::query()->insert($fillables);
+                LogService::log(__METHOD__,__FUNCTION__,'批量创建'.json_encode($fillables));
+            }
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__,__FUNCTION__,'创建失败「' .json_encode($fillables). $e->getMessage().$e->getTraceAsString());
+        } finally {
+           return  $logistics = Logistic::query()->whereIn('code',$carrierIds)->get();
+        }
+    }
+
+
+
     public function firstOrCreate(array $params, array $values = null){
         $logistic = Logistic::query();
         if ($values)return $logistic->firstOrCreate($params, $values);

+ 20 - 0
app/Services/OracleBasSkuService.php

@@ -0,0 +1,20 @@
+<?php 
+
+namespace App\Services; 
+
+use App\OracleBasSKU;
+
+Class OracleBasSkuService
+{ 
+    public function getOwnerCommodities(array $params){
+        $query = OracleBasSKU::query();
+        if ($params['code'] ?? false){
+            if (!is_array($params['code'])){
+                $params['code'] = [$params['code']];
+            }
+            $query->whereIn('customerid',$params['code']);
+        }
+        return $query->get();
+    }
+
+}

+ 28 - 0
app/Services/OracleDOCOrderHeaderService.php

@@ -14,4 +14,32 @@ Class OracleDOCOrderHeaderService
         }
         return $order->first();
     }
+    public function 根据时间获取在这段时间内创建的WMS订单($startDate){
+        /** @var OwnerService $ownerService */
+        $ownerService = app('ownerService');
+        $owners = $ownerService->获取订单跟踪的货主();
+        $ownerIds = data_get($owners, '*.code');
+        return OracleDOCOrderHeader::query()
+            ->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCode'])
+            ->where('addtime', '>=', $startDate)
+            ->whereIn('customerID', $ownerIds)
+            ->orderBy('addtime')
+            ->get();
+    }
+
+    public function 根据时间获取在这段时间内更新的WMS订单($startDate){
+        /** @var OwnerService $ownerService */
+        $ownerService = app('ownerService');
+        $owners = $ownerService->获取订单跟踪的货主();
+        $ownerIds = data_get($owners, '*.code');
+        return OracleDOCOrderHeader::query()
+            ->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCode'])
+            ->where('EditTime','>=',$startDate)
+            ->whereColumn('EditTime','<>','addtime')
+            ->whereIn('customerID', $ownerIds)
+            ->orderBy('EditTime')
+            ->get();
+    }
+
+
 }

+ 37 - 18
app/Services/OrderIssueService.php

@@ -2,7 +2,6 @@
 
 namespace App\Services;
 
-use App\Http\Controllers\Controller;
 use App\OracleDOCASNHeader;
 use App\OracleDOCOrderHeader;
 use App\OrderIssue;
@@ -34,7 +33,7 @@ class OrderIssueService
         if ($condition['owner_id'] ?? false) {
             $owner_ids = explode(',', $condition['owner_id']);
         }
-        $query = OrderIssue::with(['top', 'userWorkGroup', 'issueType', 'logs' => function ($query) {
+        $query = OrderIssue::with(['userWorkGroup', 'issueType', 'logs' => function ($query) {
             $query->with('user')->orderByDesc('created_at');
         }, 'order' => function ($query) {
             $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity']);
@@ -240,12 +239,20 @@ class OrderIssueService
             return $meg;
         }
         foreach ($orderNos as $orderNo) {
-            $orderIssue = $this->createOrFindByOrderNo($orderNo);
-            OrderIssue::query()->where('id', $orderIssue['id'])->update(['order_issue_type_id' => $params['typeId'], 'result_explain' => $params['result_explain']]);
-            OrderIssueProcessLog::query()->create(['order_issue_id' => $orderIssue['id'], 'user_id' => Auth::user()['id'], 'content' => '', 'type' => '创建']);
+            try {
+                $orderIssue = $this->createOrFindByOrderNo($orderNo);
+                if($orderIssue != null){
+                    OrderIssue::query()->where('id', $orderIssue['id'])->update(['order_issue_type_id' => $params['typeId'], 'result_explain' => $params['result_explain']]);
+                    OrderIssueProcessLog::query()->create(['order_issue_id' => $orderIssue['id'], 'user_id' => Auth::user()['id'], 'content' => '', 'type' => '创建']);
+                    LogService::log(__METHOD__, __FUNCTION__, '标记订单问题件' . json_encode($orderNo).json_encode($orderIssue));
+                }
+            } catch (\Exception $e) {
+                LogService::log(__METHOD__, __FUNCTION__, '标记订单问题件error' . json_encode($orderNo).$e->getMessage(),$e->getTraceAsString());
+            }
         }
-        Controller::logS(__METHOD__, __FUNCTION__, '标记订单问题件' . json_encode($orderNos), Auth::user()['id']);
+
         $meg['success'] = true;
+        unset($params,$orderIssues,$orderNos);
         return $meg;
     }
 
@@ -270,17 +277,26 @@ class OrderIssueService
         $rejectedBill = RejectedBill::query()->where('order_number', $orderHeader['soreference1'])->first();
         if(!($rejectedBill ?? false)){
            $asnHeader =  OracleDOCASNHeader::query()->where('ASNReference2', $orderHeader['soreference1'])->first();
-           if($asnHeader['asnreference3'] ?? false)
-              $rejectedBill = RejectedBill::query()->where('logistic_number_return',$asnHeader['asnreference3'])->first();
+           if($asnHeader['asnreference3'] ?? false){
+               $rejectedBill = RejectedBill::query()->where('logistic_number_return',$asnHeader['asnreference3'])->first();
+           }
         }
         $arr = [
             'order_id' => $order['id'],
             'rejected_bill_id' => $rejectedBill['id'] ?? '',
         ];
-        $orderIssue = OrderIssue::query()->create($arr);
-        $orderIssue->同步退单状态();
-        $orderIssue->order = $order;
-        return $orderIssue;
+        $orderIssue = null;
+        try {
+            $orderIssue = OrderIssue::query()->create($arr);
+            $orderIssue->同步退单状态();
+            $orderIssue->order = $order;
+            LogService::log(__METHOD__,__FUNCTION__,'创建问题件'.json_encode($orderIssue));
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__,__FUNCTION__,'创建问题件error'.json_encode($arr).$e->getMessage().$e->getTraceAsString());
+        } finally {
+            unset($orderHeader,$rejectedBill,$order);
+            return $orderIssue;
+        }
     }
 
     public function validatorCreate(Request $request)
@@ -344,10 +360,11 @@ class OrderIssueService
             return [];
         }
         $order_ids = [];
-        foreach ($orders as $order)
-            $order_ids[] = $order->id;
-        $orderIssues = OrderIssue::query()->with('order')->whereIn('order_id', $order_ids)->get();
-        return $orderIssues;
+        foreach ($orders as $order){
+            $order_ids[] = $order['id'];
+        }
+        unset($orders,$arr);
+        return OrderIssue::query()->with('order')->whereIn('order_id', $order_ids)->get();
     }
 
     public function exportExcel(Request $request)
@@ -376,7 +393,8 @@ class OrderIssueService
                 $rejectedBill->同步问题件();
                 $rejectedBill->同步问题件退件状态();
 
-            } /*else if ($arr['rejectedBill']['id_logistic_return'] ?? false && $arr['rejectedBill']['logistic_number_return'] ?? false) {
+            } else if ($arr['rejectedBill']['id_logistic_return'] ?? false && $arr['rejectedBill']['logistic_number_return'] ?? false) {
+
                 $owner_id = $orderIssue['order']['owner_id'];
                 $rejectedBill = RejectedBill::query()->firstOrCreate([
                         'id_logistic_return' => $arr['rejectedBill']['id_logistic_return'] ?? '',
@@ -388,7 +406,7 @@ class OrderIssueService
                 $rejectedBill->同步问题件退件状态();
                 $arr['orderIssues']['rejected_bill_id'] = $rejectedBill['id'];
                 $arr['orderIssues']['is_new_rejecting'] = '有';
-            }*/
+            }
         }
         if ($arr['order'] ?? false) {
             $order = Order::query()->where('id', $arr['order']['id'])->first();
@@ -398,6 +416,7 @@ class OrderIssueService
         $orderIssue->fill($arr['orderIssues']);
         $orderIssue->同步退单状态();
         $orderIssue->update();
+        unset($orderIssue,$arr);
     }
 
 }

+ 312 - 25
app/Services/OrderPackageCommoditiesService.php

@@ -11,39 +11,99 @@ use App\Order;
 use App\OrderPackage;
 use App\OrderPackageCommodities;
 use App\Owner;
-use Illuminate\Support\Arr;
+use App\Services\common\BatchUpdateService;
+use Carbon\Carbon;
 
 class OrderPackageCommoditiesService
 {
     public function basedOnOracleDetailsStore($orderNo, $orderPackage)
     {
         $details = OracleDOCOrderDetail::query()->where('orderNo', $orderNo)->get();
-        foreach ($details as $key => $detail) {
-            $this->createByOrderDetail($detail, $orderPackage);
-        }
+        $orderPackageCommodities = OrderPackageCommodities::query()->where('order_package_id',$orderPackage['id'])->get();
+        $this->根据详情更新OrderPackage下的商品信息($orderPackage,$orderPackageCommodities,$details,'qtyordered');
+        unset($details,$orderPackageCommodities);
     }
 
     public function basedOnActAllocationDetailsStoreByOrderNo($orderNo,$orderPackage){
         $details = OracleActAllocationDetails::query()->where('orderno', $orderNo)->get();
-        foreach ($details as $key => $detail) {
-            $this->createByActAllocationDetail($detail, $orderPackage);
+        $orderPackageCommodities =  OrderPackageCommodities::query()->where('order_package_id',$orderPackage['id'])->get();
+        $this->根据详情更新OrderPackage下的商品信息($orderPackage,$orderPackageCommodities,$details,'qty');
+        unset($details,$orderPackageCommodities);
+    }
+
+    public function 根据详情更新OrderPackage下的商品信息($orderPackage,$orderPackageCommodities,$details,$key){
+        $newItems = [];
+        foreach ($details as $detail) {
+            $owner = Owner::query()->where(['code' => $detail['customerid']])->first();      // 货主
+            $sku = $detail->sku;    // sku
+            $owner_id = $owner->id; // 货主id
+            $commodity = Commodity::query()->where(['sku' => $sku, 'owner_id' => $owner_id])->first(); // 商品
+            if ($commodity == null) {
+                $basSku = OracleBasSKU::query()->where(['sku' => $sku, 'customerid' => $detail->customerid])->first();   // 没有找到对应的商品信息
+                $commodity = Commodity::query()->create(['sku' => $sku, 'owner_id' => $owner_id, 'name' => $basSku->descr_c]);
+            }
+            $data =  ['order_package_id' => $orderPackage['id'], 'commodity_id' => $commodity['id'], 'amount' => $detail[$key]];
+            array_push($newItems,$data);
+        }
+        $diffarr = [];
+        foreach ($newItems as $newItem) {
+            $packageCommodity =  $orderPackageCommodities->where('order_package_id',$newItem['order_package_id'])->where('commodity_id',$newItem['commodity_id'])->first();
+            if($packageCommodity!=null){
+                if($packageCommodity['amount'] != $newItem['amount']){
+                    $packageCommodity->update(['amount'=>intval($newItem['amount'])]);
+                }
+                $orderPackageCommodities =  $orderPackageCommodities->filter(function ($item) use ($packageCommodity){
+                    if($item['id'] == $packageCommodity['id']){
+                        return false;
+                    }
+                    return true;
+                });
+                array_push($diffarr,$newItem);
+            }
+        }
+        if($orderPackageCommodities->count() > 0){
+            foreach ($orderPackageCommodities as $orderPackageCommodity) {
+                $id = $orderPackageCommodity['id'];
+                OrderPackageCommodities::destroy($id);
+            }
+        }
+        $newItems = array_filter($newItems,function($newItem) use ($diffarr){
+            foreach ($diffarr as $item) {
+                if($item['order_package_id'] == $newItem['order_package_id'] &&
+                    $item['commodity_id'] == $newItem['commodity_id'] &&
+                    $item['amount'] == $newItem['amount']){
+                    return false;
+                }
+            }
+            return true;
+        });
+        try {
+            if(count($newItems) > 0 ){
+                OrderPackageCommodities::query()->insert($newItems);
+                LogService::log(__METHOD__,__FUNCTION__,'添加包裹商品信息'.json_encode($newItems));
+            }
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__,__FUNCTION__,'添加包裹商品信息异常'.json_encode($newItems).$e->getMessage(),$e->getTraceAsString());
+        } finally {
+            unset($newItems,$orderPackageCommodities);
         }
     }
 
     public function basedOnActAllocationDetailsStore($orderPackage)
     {
         $details = OracleActAllocationDetails::query()->where('picktotraceid', $orderPackage->logistic_number)->get();
-        foreach ($details as $key => $detail) {
-            $this->createByActAllocationDetail($detail, $orderPackage);
-        }
+        $orderPackageCommodities =  OrderPackageCommodities::query()->where('order_package_id',$orderPackage['id'])->get();
+        $this->根据详情更新OrderPackage下的商品信息($orderPackage,$orderPackageCommodities,$details,'qty');
+        unset($details,$orderPackageCommodities);
     }
 
-    public function basedOnActAllocationDetail(Order $order,OracleDOCOrderHeader $header,array  $details){
-        foreach ($details as $detail){
-            $logistic_number  = $details['picktotraceid'];
-            if($logistic_number == '*' || $logistic_number== null || $logistic_number== ''){
+    public function basedOnActAllocationDetail(Order $order, OracleDOCOrderHeader $header, array $details)
+    {
+        foreach ($details as $detail) {
+            $logistic_number = $details['picktotraceid'];
+            if ($logistic_number == '*' || $logistic_number == null || $logistic_number == '') {
                 $logistic_number = $header['soreference5'];
-                if($logistic_number  == '*' || $logistic_number== null || $logistic_number== ''){
+                if ($logistic_number == '*' || $logistic_number == null || $logistic_number == '') {
                     continue;
                 }
             }
@@ -63,12 +123,15 @@ class OrderPackageCommoditiesService
             $commodity = Commodity::query()->create(['sku' => $sku, 'owner_id' => $owner_id, 'name' => $basSku->descr_c]);
         }
         try {
-            $orderPackageCommodities = OrderPackageCommodities::query()->create(['order_package_id' => $orderPackage['id'], 'commodity_id' => $commodity['id'], 'amount' => $detail['qty']]);
-            LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹详情'.json_encode($orderPackageCommodities));
-            return $orderPackageCommodities;
+            $count  = OrderPackageCommodities::query()->where(['order_package_id' => $orderPackage['id'], 'commodity_id' => $commodity['id'], 'amount' => $detail['qty']])->count();
+            if($count == 0){
+                $orderPackageCommodities = OrderPackageCommodities::query()->firstOrCreate(['order_package_id' => $orderPackage['id'], 'commodity_id' => $commodity['id'], 'amount' => $detail['qty']]);
+                LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹详情'.json_encode($orderPackageCommodities));
+            }
         } catch (\Exception $e) {
             LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹失败'.$e->getMessage().$e->getTraceAsString());
-            return  null;
+        } finally {
+            return $orderPackageCommodities ?? null;
         }
     }
 
@@ -87,21 +150,245 @@ class OrderPackageCommoditiesService
 
     public function createByOrderDetail(OracleDOCOrderDetail $detail, OrderPackage $orderPackage)
     {
-        $owner = Owner::query()->where(['code' => $detail['customerid']])->first();      // 货主
+        $owner = Owner::query()->where('code', $detail['customerid'])->first();      // 货主
         $sku = $detail->sku;    // sku
         $owner_id = $owner->id; // 货主id
-        $commodity = Commodity::query()->where(['sku' => $sku, 'owner_id' => $owner_id])->first(); // 商品
+        $commodity = Commodity::query()->where('sku', $sku)->where('owner_id', $owner_id)->first(); // 商品
         if ($commodity == null) {
-            $basSku = OracleBasSKU::query()->where(['sku' => $sku, 'customerid' => $detail->customerid])->first();   // 没有找到对应的商品信息
+            $basSku = OracleBasSKU::query()->where('sku', $sku)->where('customerid' , $detail->customerid)->first();   // 没有找到对应的商品信息
             $commodity = Commodity::query()->create(['sku' => $sku, 'owner_id' => $owner_id, 'name' => $basSku->descr_c]);
         }
+        return OrderPackageCommodities::query()->create(['order_package_id' => $orderPackage['id'], 'commodity_id' => $commodity['id'], 'amount' => $detail['qtyordered']]);
+    }
+
+    public function 根据WMS订单信息创建WAS订单包裹商品($orderHeaders,$oracleDOCOrderDetails,$actAllocationDetails,$orders)
+    {
+        /** @var CommodityService $commodityService */
+        $commodityService = app('commodityService');
+        $commodities = $commodityService->getWASCommoditiesByWMSOrderHeaders($orderHeaders); // 商品
+
+        $orderPackages = [];
+        $orderList = [];
+        foreach ($orders as $order) {
+            $orderList[$order['id']] = $order;
+            $packages = $order['packages'] ?? [];
+            foreach ($packages as $package) {
+                $orderPackages[$package['logistic_number']]  = $package;
+            }
+        }
+        $fillables = [];
+        foreach ($orderPackages as $key=>$orderPackage) {
+            $logistic_number = $key;
+            $order = $orderList[$orderPackage['order_id']];
+            $details1 =  $actAllocationDetails[strval($logistic_number)] ?? [];
+            $details2 = [];
+            if(count($details1)== 0){
+                $details2 = $actAllocationDetails[$order['code']] ?? [];
+            }
+            if(count($details1) > 0 ||  count($details2) > 0){
+                $items = $this->根据订单分配详情返回创建数组($details1,$orderPackage,$commodities,$order);
+                foreach ($items as $item){
+                    $fillables[] = $item;
+                }
+                $items = $this->根据订单分配详情返回创建数组($details2,$orderPackage,$commodities,$order);
+                foreach ($items as $item){
+                    $fillables[] = $item;
+                }
+                continue;
+             }
+            $details =  $oracleDOCOrderDetails[$order['code']] ?? [];
+            if($details->count() >0){
+                $items = $this->根据订单详情返回创建数组($details,$orderPackage,$commodities,$order);
+                foreach ($items as $item){
+                    $fillables[] = $item;
+                }
+            }
+        }
         try {
-            $orderpackageCommodities = OrderPackageCommodities::query()->create(['order_package_id' => $orderPackage['id'], 'commodity_id' => $commodity['id'], 'amount' => $detail['qtyordered']]);
-            LogService::log(__METHOD__,__FUNCTION__,'创建顶订单包裹详情'.json_encode($orderpackageCommodities));
-            return  $orderpackageCommodities;
+            if(count($fillables) > 0){
+                OrderPackageCommodities::query()->insert($fillables);
+                LogService::log(__METHOD__,__FUNCTION__,'批量创建'.count($fillables).json_encode($fillables));
+            }
         } catch (\Exception $e) {
-            LogService::log(__METHOD__,__FUNCTION__,'创建顶订单包裹详情'.$e->getMessage().$e->getTraceAsString());
+            LogService::log(__METHOD__,__FUNCTION__,'批量创建异常:'.$e->getMessage().$e->getTraceAsString());
+        } finally {
+            $orderIds = data_get($orders,'*.id');
+            return Order::query()->with('packages.commodities')->whereIn('id',$orderIds)->get();
+        }
+    }
+
+    // XXX 逻辑优化 删除不存在未完成
+    public function 更新WAS订单快递打包商品信息($orderHeaders,$orders,$commodities)
+    {
+        $newItems = $this->获取WMS订单打包信息($orderHeaders,$commodities,$orders);
+        $orderPackagesCommodities = $this->basedOrdersReturnOrderPackageCommodities($orders);
+
+        $multipleData = [['id','order_package_id','commodity_id']];
+        $packageCommodity_list_amount = [];
+        $packageCommodity_list = [];
+
+        foreach ($orderPackagesCommodities as $item) {
+            $key = 'order_package_id='.$item['order_package_id'].' commodity_id='.$item['commodity_id'].' amount='.$item['amount'];
+            if(!($packageCommodity_list_amount[$key] ?? false)){
+                $packageCommodity_list_amount[$key] = [];
+            }
+            $packageCommodity_list_amount[$key][] = $item;
+            $key2 = 'order_package_id'.$item['order_package_id'].' commodity_id='.$item['commodity_id'];
+            if($packageCommodity_list[$key2] ?? false){
+                $packageCommodity_list[$key2] = [];
+            }
+            $packageCommodity_list[$key2][] = $item;
+        }
+        foreach ($newItems as $key=>$newItem) {
+            $key1 = 'order_package_id='.$newItem['order_package_id'].' commodity_id='.$newItem['commodity_id'].' amount='.$newItem['amount'];
+            $packageCommodity = $packageCommodity_list_amount[$key1][0] ?? false;
+            if($packageCommodity ?? false){
+                unset($newItems[$key]);
+                array_shift($packageCommodity_list_amount[$key1]);
+            }else{
+                $key2 = 'order_package_id'.$newItem['order_package_id'].' commodity_id='.$newItem['commodity_id'];
+                $packageCommodity = $packageCommodity_list[$key2][0] ?? false;
+                if($packageCommodity ?? false) {
+                    $amount = intval($newItem['amount']);
+                    if($packageCommodity['amount'] !== $amount){
+                        $data = [
+                            'order_package_id' => $packageCommodity['order_package_id'],
+                            'commodity_id' => $packageCommodity['commodity_id'],
+                            'amount' => $amount,
+                        ];
+                        $multipleData[]  = $data;
+                    }
+                    array_shift($packageCommodity_list[$key2]);
+                    unset($newItems[$key]);
+                }
+            }
+        }
+        try {
+            if (count($newItems) > 0) {
+                OrderPackageCommodities::query()->insert($newItems);
+                LogService::log(__METHOD__, __FUNCTION__, '添加打包信息' . json_encode($newItems));
+            }
+        }catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__, '添加打包信息失败' . json_encode($newItems).$e->getMessage().$e->getTraceAsString());
+        }
+        if(count($multipleData) > 1){
+            try {
+                /** @var BatchUpdateService $batchUpdateService */
+                $batchUpdateService = app('batchUpdateService');
+                $batchUpdateService->batchUpdate('order_package_commodities', $multipleData);
+                LogService::log(__METHOD__,__FUNCTION__,'批量更新'.count($multipleData).json_encode($multipleData));
+            } catch (\Exception $e) {
+                LogService::log(__METHOD__,__FUNCTION__,'批量更新失败'.json_encode($multipleData).$e->getMessage(),$e->getTraceAsString());
+            } finally {
+                unset($multipleData);
+            }
+        }
+    }
+
+    private function 获取WMS订单打包信息($orderHeaders,$commodities,$orders){
+        $newItems = [];
+
+        $commodities_list = [];
+        foreach ($commodities as $commodity) {
+            $key = 'sku='.$commodity['sku'].' owner_id='.$commodity['owner_id'];
+            $commodities_list[$key] = $commodity;
+        }
+        foreach ($orderHeaders as $orderHeader) {
+            $order = $orders[$orderHeader['orderno']] ?? '';
+            if(!($order ?? false)){
+                continue;
+            }
+            $orderPackages = $order['packages'];
+            $oracleDOCOrderDetails = $orderHeader['oracleDOCOrderDetails'] ?? [];
+            $actAllocationDetails = $orderHeader['actAllocationDetails'] ?? [];
+            if($actAllocationDetails->count() > 0){
+                foreach ($orderPackages as $orderPackage) {
+                    $details = [];
+                    if($orderPackage['logistic_number'] == $orderHeader['soreference5'] ){
+                        foreach ($actAllocationDetails as $detail) {
+                            if($detail['picktotraceid'] == '*' || $detail['picktotraceid'] == $orderHeader['soreference5'])
+                                $details[] = $detail;
+                        }
+                    }else{
+                        $logistic_number = $orderPackage['logistic_number'];
+                        foreach ($actAllocationDetails as $detail) {
+                            if($detail['picktotraceid'] == $logistic_number)
+                                $details[] = $detail;
+                        }
+                    }
+                    $addArr = $this->basedDetailsReturnFillables($details,$orderPackage,$commodities_list,$order,'qty');
+                    $newItems = array_merge($newItems,$addArr);
+                }
+            }elseif($oracleDOCOrderDetails->count() > 0){
+                foreach ($orderPackages as $orderPackage) {
+                    $details = [];
+                    $logistic_number = $orderPackage['logistic_number'];
+                    foreach ($actAllocationDetails as $detail) {
+                        if($detail['dropid'] == $logistic_number){
+                            array_push($details,$detail);
+                        }
+                    }
+                    $addArr = $this->basedDetailsReturnFillables($details,$orderPackage,$commodities_list,$order,'qtyordered');
+                    $newItems = array_merge($newItems,$addArr);
+                }
+            }
+        }
+        return $newItems;
+    }
+
+    public function 根据订单详情返回创建数组($details,$orderPackage,$commodities,$order){
+        $orderPackagerCommodities = [];
+        foreach ($details as $detail) {
+            $commodity = $commodities->where('sku', $detail['sku'])->where('owner_id', $order['owner_id'])->first();
+            $fillable = [
+                'order_package_id' => $orderPackage['id'] ?? '',
+                'commodity_id' => $commodity['id'] ?? '',
+                'amount' => $detail['qtyordered'],
+            ];
+            $orderPackagerCommodities[] = $fillable;
+        }
+        return $orderPackagerCommodities;
+    }
+
+    public function 根据订单分配详情返回创建数组($details,$orderPackage,$commodities,$order){
+        $orderPackagerCommodities = [];
+        foreach ($details as $detail) {
+
+            $commodity = $commodities->where('sku', $detail['sku'])->where('owner_id', $order['owner_id'])->first();
+            $fillable = [
+                'order_package_id' => $orderPackage['id'] ?? '',
+                'commodity_id' => $commodity['id'] ?? '',
+                'amount' => $detail['qty'] ?? '',
+            ];
+            array_push($orderPackagerCommodities,$fillable);
         }
+        return $orderPackagerCommodities;
     }
 
+    public function basedOrdersReturnOrderPackageCommodities($orders){
+        $orderPackageCommodities = [];
+        foreach ($orders as $order) {
+            foreach ($order['packages'] as $package) {
+                foreach ($package['commodities'] as $commodity) {
+                    $orderPackageCommodities[] = $commodity;
+                }
+            }
+        }
+        return $orderPackageCommodities;
+    }
+
+    public function basedDetailsReturnFillables($details,$orderPackage,$commoditiesMap,$order,$column){
+        $orderPackagerCommodities = [];
+        foreach ($details as $detail) {
+            $key = 'sku='.$detail['sku'].' owner_id='.$order['owner_id'];
+            $commodity = $commoditiesMap[$key];
+            $fillable = [
+                'order_package_id' => $orderPackage['id'] ?? '',
+                'commodity_id' => $commodity['id'] ?? '',
+                'amount' => $detail[$column] ?? '',
+            ];
+            array_push($orderPackagerCommodities,$fillable);
+        }
+        return $orderPackagerCommodities;
+    }
 }

+ 221 - 51
app/Services/OrderPackageService.php

@@ -8,80 +8,91 @@ use App\OracleDOCOrderHeader;
 use App\Order;
 use App\OrderPackage;
 use App\OrderPackageCommodities;
+use App\Services\common\BatchUpdateService;
+use Carbon\Carbon;
 
 class OrderPackageService
 {
 
-    public function __construct()
-    {
-        app()->bind('orderPackageCommoditiesService', OrderPackageCommoditiesService::class);
-    }
-
     public function createdByOrder($order)
     {
+        /** @var OrderPackageCommoditiesService $orderPackageCommoditiesService */
         $orderPackageCommoditiesService = app('orderPackageCommoditiesService');
-        $actAllocationCount = OracleActAllocationDetails::query()->where('OrderNo', $order['code'])->count();
+        $oracleActAllocationDetails = OracleActAllocationDetails::query()->where('OrderNo', $order['code'])->get();
         $orderHeader = OracleDOCOrderHeader::query()->where('OrderNo', $order['code'])->first();
-        $orderDetailCount = OracleDOCOrderDetail::query()->where('OrderNo', $order['code'])->count();
+        $oracleDOCOrderDetail = OracleDOCOrderDetail::query()->where('OrderNo', $order['code'])->get();
         $logistic_number = null;
-        if ($actAllocationCount == 0) {  // 通过oracle Order Detail
+        if ($oracleActAllocationDetails->count() == 0) {  // 通过oracle Order Detail
             $logistic_number = $orderHeader['soreference5'];
-            if ($orderDetailCount == 0) {return null;}
-            if ($logistic_number == null || $logistic_number == '*') { return null; }
+            if ($oracleDOCOrderDetail->count() == 0) {
+                return null;
+            }
+            if ($logistic_number == null || $logistic_number == '*') {
+                return null;
+            }
             try {
-                $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
+                $orderPackage = OrderPackage::query()->firstOrCreate(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
                 $orderPackageCommoditiesService->basedOnOracleDetailsStore($orderHeader['orderno'], $orderPackage);
-                LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹orderPackage'. json_encode($orderPackage));
+                LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage' . json_encode($orderPackage));
             } catch (\Exception $e) {
-                LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹orderPackage失败'.$e->getMessage().$e->getTraceAsString());
+                LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage失败' . $e->getMessage() . $e->getTraceAsString());
             }
-        } else if ($actAllocationCount > 0) {
-            $count = OracleActAllocationDetails::query()->where('OrderNo', $order['code'])->whereNull('picktotraceid')->count();
+        } else if ($oracleActAllocationDetails->count() > 0) {
+            $count = $oracleActAllocationDetails->where('OrderNo', $order['code'])->whereNull('picktotraceid')->count();
             if ($count > 0) {   // 快递单号为空
-                if (($orderHeader['soreference5'] ?? false) && $orderHeader['soreference5'] == '*') { return null; }
+                if (($orderHeader['soreference5'] ?? false) && $orderHeader['soreference5'] == '*') {
+                    return null;
+                }
                 $logistic_number = $orderHeader['soreference5'];
+
                 try {
-                    $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
+                    $orderPackage = OrderPackage::query()->firstOrCreate(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
                     $orderPackageCommoditiesService->basedOnOracleDetailsStore($order, $orderPackage);
-                    LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹orderPackage'. json_encode($orderPackage));
+                    LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage' . json_encode($orderPackage));
                 } catch (\Exception $e) {
-                    LogService::log(__METHOD__,__FUNCTION__,'创建订单包裹orderPackage失败'.$e->getMessage().$e->getTraceAsString());
+                    LogService::log(__METHOD__, __FUNCTION__, '创建订单包裹orderPackage失败' . $e->getMessage() . $e->getTraceAsString());
                 }
             } else {
-                $ActAllocationDetails = OracleActAllocationDetails::query()->where('orderno', $order['code'])->get();
-                foreach ($ActAllocationDetails as $detail) {
-                    $logistic_number = $detail['picktotraceid'];
+                $ActAllocationDetails = $oracleActAllocationDetails->where('orderno', $order['code']);
+                $picktotraceids = data_get($ActAllocationDetails,'*.picktotraceid');
+                $picktotraceids = array_unique($picktotraceids);
+                foreach ($picktotraceids as $picktotraceid) {
+                    $logistic_number = $picktotraceid;
                     if ($logistic_number == null || $logistic_number == '*') {
                         $logistic_number = $orderHeader['soreference5'];
-                        if ($logistic_number == null || $logistic_number == '*')  {return null;}
+                        if ($logistic_number == null || $logistic_number == '*') {
+                            return null;
+                        }
                         $orderPackage = OrderPackage::query()->where(['order_id' => $order['id'], 'logistic_number' => $logistic_number])->first();
-                        if($orderPackage){continue;}
+                        if ($orderPackage) {
+                            $orderPackageCommoditiesService->basedOnActAllocationDetailsStoreByOrderNo($order['code'], $orderPackage);
+                            continue;
+                        }
                         try {
                             $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
                             $orderPackageCommoditiesService->basedOnActAllocationDetailsStoreByOrderNo($order['code'], $orderPackage);
-                            LogService::log(__METHOD__,__FUNCTION__,'创建订单orderPackage'.json_encode($orderPackage));
+                            LogService::log(__METHOD__, __FUNCTION__, '创建订单orderPackage' . json_encode($orderPackage));
                         } catch (\Exception $e) {
-                            LogService::log(__METHOD__,__FUNCTION__,'创建订单orderPackage失败'.json_encode($e->getMessage()).json_encode($e->getTraceAsString()));
+                            LogService::log(__METHOD__, __FUNCTION__, '创建订单orderPackage失败' . json_encode($e->getMessage()) . json_encode($e->getTraceAsString()));
                         }
                         continue;
                     }
-                    $orderPackage = OrderPackage::query()->where('order_id' , $order['id'])->where('logistic_number' , $logistic_number)->first();
-                    if ($orderPackage) {continue;}
+                    $orderPackage = OrderPackage::query()->where('order_id', $order['id'])->where('logistic_number', $logistic_number)->first();
+                    if ($orderPackage) {
+                        $orderPackageCommoditiesService->basedOnActAllocationDetailsStore($orderPackage);
+                        continue;
+                    }
                     try {
                         $orderPackage = OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $logistic_number]);
                         $orderPackageCommoditiesService->basedOnActAllocationDetailsStore($orderPackage);
-                        LogService::log(__METHOD__,__FUNCTION__,'创建订单'.json_encode($orderPackage));
+                        LogService::log(__METHOD__, __FUNCTION__, '创建订单' . json_encode($orderPackage));
                     } catch (\Exception $e) {
-                        LogService::log(__METHOD__,__FUNCTION__,'创建订单orderPackage失败'.json_encode($e->getMessage()).json_encode($e->getTraceAsString()));
+                        LogService::log(__METHOD__, __FUNCTION__, '创建订单orderPackage失败' . json_encode($e->getMessage()) . json_encode($e->getTraceAsString()));
                     }
                 }
             }
-        }else{
-            $this->updateOrderPackageInfo($order);
         }
-        return OrderPackage::with(['commodities' => function ($query) {
-            return $query->with(['commodity']);
-        }])->get();
+        unset($oracleActAllocationDetails,$oracleDOCOrderDetail);
     }
 
     public function updateOrderPackageInfo(Order $order)
@@ -94,16 +105,18 @@ class OrderPackageService
         $orderPackageCommodities = OrderPackageCommodities::with('commodity')->whereIn('order_package_id', data_get($orderPackages, '*.id'))->get();
         $actAllocationDetails = OracleActAllocationDetails::where('orderNo', $order['client_code'])->get();
         if (count($orderPackageCommodities) < count($actAllocationDetails)) {
-            $actAllocationDetails =  $actAllocationDetails->reject(function($value,$key) use (&$orderPackageCommodities){
+            $actAllocationDetails = $actAllocationDetails->reject(function ($value, $key) use (&$orderPackageCommodities) {
                 $bool = false;
                 $count = 0;
-                $orderPackageCommodities->reject(function($value1,$key1)use($value,&$bool,$count){
-                    if($count>0){return false;}
-                    if($value1->commodity['sku'] == $value['sku'] && $value1['amount'] == intval($value['qty']) ){
+                $orderPackageCommodities->reject(function ($value1, $key1) use ($value, &$bool, $count) {
+                    if ($count > 0) {
+                        return false;
+                    }
+                    if ($value1->commodity['sku'] == $value['sku'] && $value1['amount'] == intval($value['qty'])) {
                         $bool = true;
                         $count++;
                         return true;
-                    }else{
+                    } else {
                         return false;
                     }
                 });
@@ -121,13 +134,13 @@ class OrderPackageService
      * @return OrderPackage $package
      */
     public function firstOrCreate($logistic_number, array $values){
-        /** @var OrderPackage $package */
-        $package = OrderPackage::query()->where('logistic_number','=',$logistic_number)->first();
+        /** @var $package OrderPackage  */
+        $package = OrderPackage::query()->where('logistic_number',$logistic_number)->first();
         if ($package)return $package;
 
         /** @var OrderService */
         $order = app('orderService')->logisticNumberCreateOrder($logistic_number);
-        if ($order)$values["order_id"] = $order->id;
+        if ($order) $values["order_id"] = $order->id;
 
         $values["logistic_number"] = $logistic_number;
         /** @var OrderPackage $package */
@@ -136,17 +149,174 @@ class OrderPackageService
     }
 
 
-    public function createExceptionPaginate($paginate){
-        return OrderPackage::query()->select('id','status','logistic_number','measuring_machine_id','weighed_at','weight','length','width','height','bulk','paper_box_id')
-            ->where('status','上传异常')->orWhere('status','测量异常')->orderBy('created_at','DESC')
+    public function createExceptionPaginate($paginate)
+    {
+        return OrderPackage::query()->select('id', 'status', 'logistic_number', 'measuring_machine_id', 'weighed_at', 'weight', 'length', 'width', 'height', 'bulk', 'paper_box_id')
+            ->where('status', '上传异常')->orWhere('status', '测量异常')->orderBy('created_at', 'DESC')
             ->paginate($paginate);
     }
 
-    public function issueExceptionPaginate($paginate){
-        return OrderPackage::query()->select('id','logistic_number','created_at','batch_number','batch_rule')
-            ->where('status','下发异常')->orWhere('status','记录异常')
-            ->orWhere('status','已上传异常')->orderBy('created_at','DESC')
+    public function issueExceptionPaginate($paginate)
+    {
+        return OrderPackage::query()->select('id', 'logistic_number', 'created_at', 'batch_number', 'batch_rule')
+            ->where('status', '下发异常')->orWhere('status', '记录异常')
+            ->orWhere('status', '已上传异常')->orderBy('created_at', 'DESC')
             ->paginate($paginate);
     }
 
- }
+
+    public function 根据WMS订单创建WAS包裹($orderHeaders, $orders)
+    {
+        $orderPackagesFillables = [];
+        foreach ($orders as $order) {
+            $orderHeader = $orderHeaders[strval($order['code'])] ?? false;
+            if(!$orderHeader){
+                continue;
+            }
+            $fillables = $this->根据WMS订单生成包裹信息($orderHeader, $order);
+            foreach ($fillables as $fillable) {
+                $orderPackagesFillables[] = $fillable;
+            }
+        }
+        try {
+            if(count($orderPackagesFillables) > 0){
+                OrderPackage::query()->insert($orderPackagesFillables);
+                LogService::log(__METHOD__, __FUNCTION__, '批量订单包裹信息' .count($orderPackagesFillables). json_encode($orderPackagesFillables) );
+            }
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__, '批量订单包裹信息 error' .json_encode($orderPackagesFillables) .  $e->getMessage().$e->getTraceAsString());
+        } finally {
+            $order_ids = data_get($orders,'*.id');
+            unset($orderPackagesFillables,$orders,$fillables);
+            return Order::query()->with('packages')->whereIn('id',$order_ids)->get();
+        }
+    }
+
+    public function 根据WMS订单生成包裹信息($orderHeader, $order)
+    {
+
+        $soReference5 = $orderHeader['soreference5'];
+        $orderPackages= [];
+        $logistic_numbers = [];
+
+        foreach ($orderHeader['actAllocationDetails'] as $actAllocationDetail) {
+            $logistic_numbers[]  =$actAllocationDetail->picktotraceid;
+            array_push($logistic_numbers,$actAllocationDetail['picktotraceid']);
+        }
+
+        $logistic_numbers = array_unique($logistic_numbers);
+        $logistic_numbers = array_diff($logistic_numbers,['','*',null]);
+
+        $logistic_numbers = count($logistic_numbers) == 0 ? ($soReference5 != '*' ? [$soReference5] : []) : $logistic_numbers;
+        $logistic_numbers = array_diff($logistic_numbers,['','*',null]);
+
+        if(count($logistic_numbers) == 0 ){ return  [];}
+
+        if (count($logistic_numbers) != 0) {
+            foreach ($logistic_numbers as $logistic_number) {
+                $fillable = [
+                    'order_id' => $order['id'],
+                    'logistic_number' => $logistic_number,
+                ];
+                $orderPackages[] = $fillable;
+            }
+        }
+        return $orderPackages;
+    }
+
+    public function 更新WAS订单的包裹的重量和体积($orderHeaders,$orderPackages)
+    {
+
+        /** @var CommodityService $commodityService */
+        $commodityService = app('commodityService');
+        $commodities = $commodityService->getWASCommoditiesByWMSOrderHeaders($orderHeaders); // 商品
+
+        /** @var BatchUpdateService $batchUpdateService */
+        $batchUpdateService = app('batchUpdateService');
+        $multipleData = [['id','weight','bulk']];
+        $noAttributeCommodity = [];
+        foreach ($orderPackages as $packages) {
+            foreach ($packages as $package) {
+                if($package == null){
+                    continue;
+                }
+                $orderPackageCommodities = $package['commodities'] ?? [];
+                $updateArr = [
+                    'id' => $package['id'],
+                    'weight' => 0,
+                    'bulk' => 0,
+                ];
+                foreach ($orderPackageCommodities as $packageCommodity) {
+                    $commodity = $commodities->where('id',$packageCommodity['commodity_id'])->first();
+                    if(!($commodity['weight'] ?? false) ||!($packageCommodity['amount'] ?? false) ){
+                        array_push($noAttributeCommodity,$commodity);
+                    }
+                    $updateArr['weight'] +=(intval($commodity['weight']) ?? 0)  * ( intval($packageCommodity['amount']) ?? 0);
+                    $updateArr['bulk'] += (intval($commodity['bulk']) ?? 0) * (intval($packageCommodity['amount']) ?? 0);
+                }
+                if($package['weight'] == $updateArr['weight'] && $package['weight'] == $updateArr['bulk']){
+                    continue;
+                }
+                $multipleData[] = $updateArr;
+            }
+        }
+        if(count($multipleData) > 1){
+            $batchUpdateService->batchUpdate('order_packages',$multipleData);
+        }
+        array_unique($noAttributeCommodity);
+        if(count($noAttributeCommodity) > 1){
+            $commodityService->syncCommodityAttribute($noAttributeCommodity);
+        }
+        unset($multipleData,$noAttributeCommodity,$commodities);
+    }
+
+    public function 更新WAS订单快递单号信息($orderHeaders,$orders)
+    {
+
+        $fillables = [];
+        $orders_map = [];
+        $orders_package_map = [];
+        foreach ($orders as $order){
+            $key = $order['code'];
+            $orders_map[$key] = $order;
+            foreach ($order['packages'] as $package) {
+                $logistic_numbers = $package['logistic_number'];
+                $orders_package_map[$key][$logistic_numbers] =$package;
+            }
+        }
+
+        foreach ($orderHeaders as $key=>$orderHeader) {
+            $order = $orders[$key] ?? false;
+            if(!$order){
+                continue;
+            }
+            $packages = $orders_package_map[$key] ?? false;
+            $pickToTraceIds = [];
+            foreach ($orderHeader->actAllocationDetails as $actAllocationDetail) {
+                $pickToTraceIds[] = $actAllocationDetail['picktotraceid'];
+            }
+            $pickToTraceIds = array_unique(array_diff($pickToTraceIds,['','*',null]));
+
+            foreach ($pickToTraceIds as $pickToTraceId) {
+                if(!$packages || !($orders_package_map[$key][$pickToTraceId] ?? false)){
+                    $fillables[] = [
+                        'order_id' => $order->id,
+                        'logistic_number' => $pickToTraceId
+                    ];
+                }
+            }
+        }
+
+        try {
+            if(count($fillables)>0){
+                OrderPackage::query()->insert($fillables);
+                LogService::log(__METHOD__,__FUNCTION__,'创建orderPackage:'.json_encode($fillables));
+            }
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__,__FUNCTION__,'创建orderPackage 失败:'.json_encode($fillables).$e->getMessage().$e->getTraceAsString());
+        } finally {
+            unset($fillables);
+        }
+    }
+
+}

+ 330 - 12
app/Services/OrderService.php

@@ -7,10 +7,13 @@ use App\OracleActAllocationDetails;
 use App\OracleDOCASNHeader;
 use App\OracleDOCOrderHeader;
 use App\Order;
-use App\OrderItems;
+use App\OrderPackage;
+use App\OrderPackageCommodities;
 use App\Owner;
 use App\RejectedBill;
+use App\Services\common\BatchUpdateService;
 use App\Shop;
+use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Support\Facades\DB;
 
@@ -312,9 +315,9 @@ class OrderService
             if (!$owner) {
                 try {
                     $owner = Owner::query()->create(['code' => $orderHeadAttr['customerid'], 'name' => $customer_name]);
-                    LogService::log(__METHOD__,__FUNCTION__,'创建货主'.json_encode($owner));
+                    LogService::log(__METHOD__, __FUNCTION__, '创建货主' . json_encode($owner));
                 } catch (\Exception $e) {
-                    LogService::log(__METHOD__,__FUNCTION__,'创建货主失败'.$e->getMessage().$e->getTraceAsString());
+                    LogService::log(__METHOD__, __FUNCTION__, '创建货主失败' . $e->getMessage() . $e->getTraceAsString());
                 }
             }
             $owner_id = $owner['id'];
@@ -353,16 +356,12 @@ class OrderService
                 'client_code' => $orderHeadAttr['soreference1'],
             ];
             $order = Order::query()->create($arr);
+            unset($arr,$orderHeadAttr,$owner);
         }
-        $orderPackageService->createdByOrder($order);
+        $orderPackageService->createdByOrder($order);unset($order);
         return Order::with('packages.commodities.commodity')->where('client_code', $clientCode)->first();
     }
 
-    public function getOrderInfo($orderId)
-    {
-        return Order::with('packages.commodities.commodity')->where('id', $orderId)->first();
-    }
-
     public function getRejectedBillOfClientCode($clientCode)
     {
         $orderHeader = OracleDOCOrderHeader::query()->where('SOReference1', $clientCode)->first();
@@ -389,9 +388,328 @@ class OrderService
         return $this->findOrCreateByClientCode($orderHeader['soreference1']);
     }
 
-    public function first(array $params){
+    public function 根据设置从WMS获取跟踪的订单($startDate)
+    {
+
+        /** @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService */
+        $oracleDOCOrderHeaderService = app('oracleDOCOrderHeaderService');
+        $orderHeadersResult = $oracleDOCOrderHeaderService->根据时间获取在这段时间内创建的WMS订单($startDate);
+        if ($orderHeadersResult->count() == 0) {
+            return null;
+        }
+
+        $orderHeaders_map = [];
+        $oracleDOCOrderDetails = [];
+        $actAllocationDetails = [];
+
+        foreach ($orderHeadersResult as $key=>$orderHeader) {
+            $orderHeaders_map[$orderHeader['orderno']] = $orderHeader;
+            $oracleDOCOrderDetails[$orderHeader['orderno']] = $orderHeader['oracleDOCOrderDetails'];
+            $details = $orderHeader['actAllocationDetails'];
+            $orderno = strval($orderHeader['orderno']);
+            foreach ($details as $detail) {
+                $picktotraceid = strval($detail['picktotraceid']);
+                if ($picktotraceid == '*') {
+                    if (!($actAllocationDetails[$orderno] ?? false)) {
+                        $actAllocationDetails[$orderno] = [];
+                    }
+                    array_push($actAllocationDetails[$orderno], $detail);
+                    continue;
+                }
+                if (!($actAllocationDetails[$picktotraceid] ?? false)) {
+                    $actAllocationDetails[$picktotraceid] = [];
+                }
+                $actAllocationDetails[$picktotraceid][] =$detail;
+            }
+            unset($orderHeadersResult[$key]);
+        }
+        return $this->根据WMS订单生成WAS订单($orderHeaders_map, $oracleDOCOrderDetails, $actAllocationDetails);
+    }
+
+    public function 根据设置从WMS同步该时间段内更新的订单($startDate)
+    {
+        /** @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService */
+        $oracleDOCOrderHeaderService = app('oracleDOCOrderHeaderService');
+
+        $editedOrderHeaders = $oracleDOCOrderHeaderService->根据时间获取在这段时间内更新的WMS订单($startDate);
+        $orderHeaders_map = [];
+        foreach ($editedOrderHeaders as $editedOrderHeader) {
+            $orderHeaders_map[$editedOrderHeader['orderno']] = $editedOrderHeader;
+        }
+
+        $orderNos = array_keys($orderHeaders_map);
+
+        $orders = Order::query()
+            ->with('packages.commodities')
+            ->whereIn('code', $orderNos)
+            ->get();
+
+        if ($orders->count() == 0) {
+            return ['orderPackageCommodities'=> null, 'orderHeaders'=>null];
+        }
+
+        $ordersList =[];
+        foreach ($orders as $order) {
+            $ordersList[$order['code']] = $order;
+        }
+        $orderHeaders_map = $this->filterNoCorrespondingOrder($orderHeaders_map,$ordersList);
+
+        $this->将WMS订单对应的WAS订单信息更新($orderHeaders_map,$ordersList);
+
+        $orderPackageCommodities = OrderPackageCommodities::query()
+            ->with('package.order')
+            ->whereHas('package.order', function ($query) use ($orderNos) {
+                $query->whereIn('code',$orderNos);
+            })->get();
+        $orderHeaders = $orderHeaders_map;
+        return compact('orderPackageCommodities', 'orderHeaders');
+    }
+
+
+    public function 根据WMS订单生成WAS订单($orderHeaders, $oracleDOCOrderDetails, $actAllocationDetails)
+    {
+
+        /** @var OrderPackageService $orderPackageService */
+        $orderPackageService = app('orderPackageService');
+        /** @var OrderPackageCommoditiesService $orderCommoditiesService */
+        $orderCommoditiesService = app('orderPackageCommoditiesService');
+
+        if (count($orderHeaders) === 0) {
+            return [];
+        }
+        $params = $this->根据WMS订单信息返回创建WAS订单需要信息($orderHeaders);
+        $owners = $params['owners'];
+        $shops = $params['shops'];
+        $logistics = $params['logistics'];
+        $orderHeaders = $this->过滤已有的WAS订单($orderHeaders);
+        $this->根据WMS订单创建WAS订单($orderHeaders, $owners, $shops, $logistics);
+        $orderNos = array_keys($orderHeaders);
+        $orders = Order::query()->whereIn('code',$orderNos)->get();
+        $orders = $orderPackageService->根据WMS订单创建WAS包裹($orderHeaders, $orders);
+        $orders = $orderCommoditiesService->根据WMS订单信息创建WAS订单包裹商品($orderHeaders, $oracleDOCOrderDetails, $actAllocationDetails, $orders);
+
+        $orderPackages = [];
+        foreach ($orders as $order) {
+            $orderPackages[] = $order['packages'];
+        }
+        $orderPackageService->更新WAS订单的包裹的重量和体积($orderHeaders,$orderPackages);
+        return compact('orders', 'orderHeaders', 'actAllocationDetails', 'oracleDOCOrderDetails');
+    }
+
+    public function 过滤已有的WAS订单($orderHeaders,$orders_map = [])
+    {
+
+        if(count($orders_map) == 0){
+            $orderNos = array_keys($orderHeaders);
+            $orders = Order::query()->whereIn('code', $orderNos)->get();
+            foreach ($orders as $order) {
+                $orders_map[$order['code']] = $order;
+            }
+        }
+        if(count($orders_map) !== 0){
+            foreach ($orders_map as $key=>$orderHeader) {
+                unset($orderHeaders[$key]);
+            }
+        }
+        return $orderHeaders;
+    }
+
+    public function filterNoCorrespondingOrder($orderHeaders_map,$orders_map = []){
+        if(count($orders_map) == 0){
+            $orderNos = array_keys($orderHeaders_map);
+            $orders = Order::query()->whereIn('code', $orderNos)->get();
+            foreach ($orders as $order) {
+                $orders_map[$order['code']] = $order;
+            }
+        }
+        if(count($orders_map) !== 0){
+            foreach ($orderHeaders_map as $key=>$orderHeader) {
+                if(!($orders_map[$key] ?? false)){
+                    unset($orderHeaders_map[$key]);
+                }
+            }
+        }
+        return $orderHeaders_map;
+
+    }
+
+    private function 根据WMS订单信息返回创建WAS订单需要信息($orderHeaders)
+    {
+        /** @var ShopService $shopService */
+        $shopService = app('shopService');
+        /** @var LogisticService $logisticService */
+        $logisticService = app('logisticService');
+        /** @var OwnerService $ownerService */
+        $ownerService = app('ownerService');
+        $owners = $ownerService->获取订单跟踪的货主();    // 监听的货主
+        $shops = $shopService->根据追踪的WMS订单返回商铺($orderHeaders);     // 商铺
+        $logistics = $logisticService->getWASLogisticsByWMSOrderHeaders($orderHeaders); // 承运商
+        return compact('owners', 'shops', 'logistics');
+    }
+
+    public function 根据WMS订单创建WAS订单($orderHeaders, $owners, $shops, $logistics)
+    {
+
+        $fillables = [];
+        $owners_map = [];
+        $shop_map = [];
+        $logistics_map = [];
+        foreach ($owners as $owner) {
+            $key = 'code='.$owner->code;
+            $owners_map[$key] = $owner;
+        }
+
+        foreach ($shops as $shop) {
+            $key = 'name='.$shop->name.' owner_id='.$shop->owner_id;
+            $shop_map[$key] =  $shop;
+        }
+
+        foreach ($logistics as $logistic) {
+            $key = 'code='.$logistic->code;
+            $logistics_map[$key] =  $logistic;
+        }
+
+        // XXX 循环 300 个元素 3s-5s
+        foreach ($orderHeaders as $orderHeader) {
+            $customerid = $orderHeader->customerid;
+
+            $owner_key = 'code='.$customerid;
+            $owner = $owners_map[$owner_key];
+
+            $shop_key = 'name='.$orderHeader->issuepartyname.' owner_id='.$owner->owner_id;
+            $shop = $shop_map[$shop_key] ?? '';
+
+            $logistic_key = 'code='.$customerid;
+            $logistic = $logistics_map[$logistic_key] ?? '';
+
+            $fillables[] = [
+                'code' => $orderHeader->orderno ,
+                'owner_id' => $owner->id ?? '',
+                'wms_status' => $orderHeader->oracleBASCode_codename_c,
+                'created_at' => $orderHeader->addtime,
+                'logistic_id' => $logistic->id ?? '',
+                'shop_id' => $shop->id ?? '',
+                'consignee_name' => $orderHeader->c_contact,
+                'consignee_phone' => $orderHeader->c_tel2,
+                'province' => $orderHeader->c_province,
+                'city' => $orderHeader->c_city,
+                'district' => $orderHeader->c_district,
+                'address' => $orderHeader->c_address1,
+                'client_code' => $orderHeader->soreference1,
+                'wms_edittime' => $orderHeader->edittime,
+            ];
+        }
+        try {
+            if (count($fillables) > 0) {
+                Order::query()->insert($fillables);
+                LogService::log(__METHOD__, __FUNCTION__, '批量创建Order' . count($fillables) . json_encode($fillables));
+            }
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__, $e->getMessage(), $e->getTraceAsString() . json_encode($fillables));
+        } finally {
+            unset($owners_map,$shop_map,$logistics_map,$fillables);
+        }
+    }
+
+    // XXX 业务逻辑待修改完善
+    public function 将WMS订单对应的WAS订单信息更新($orderHeaders,$ordersList)
+    {
+        /** @var CommodityService $commodityService */
+        $commodityService = app('commodityService');
+        /** @var OrderPackageService $orderPackageService */
+        $orderPackageService = app('orderPackageService');
+        /** @var OrderPackageCommoditiesService $orderPackageCommoditiesService */
+        $orderPackageCommoditiesService = app('orderPackageCommoditiesService');
+        if (count($orderHeaders) == 0) {
+            return [];
+        }
+        $commodities = $commodityService->getWASCommoditiesByWMSOrderHeaders($orderHeaders);     // 商品信息
+
+        $this->更新WMS订单对应的的WAS订单($orderHeaders, $ordersList);
+
+        $orderPackageService->更新WAS订单快递单号信息($orderHeaders, $ordersList);
+
+        $orderPackageCommoditiesService->更新WAS订单快递打包商品信息($orderHeaders, $ordersList, $commodities);
+
+        $orderNos = data_get($ordersList,'*.code');
+        $orderPackages = OrderPackage::query()
+            ->with('commodities','order')
+            ->whereHas('order', function ($query) use ($orderNos) {
+                $query->whereIn('code', $orderNos);
+            })
+            ->get();
+
+        $orders = Order::query()
+            ->with('packages.commodities')
+            ->where('code',$orderNos)
+            ->get();
+
+        unset($orderNos);
+        $orderPackages_map = [];
+        foreach ($orders as $order) {
+            $orderPackages_map[] = $order['packages'];
+        }
+        $orderPackageService->更新WAS订单的包裹的重量和体积($orderHeaders,$orderPackages_map);    // 同步包裹重量和体积
+
+    }
+
+    public function  更新WMS订单对应的的WAS订单($orderHeaders, $orders)
+    {
+        $multipleData = [[
+            'id', 'wms_status', 'consignee_name', 'consignee_phone', 'province', 'city', 'district', 'wms_edittime', 'address', 'client_code'
+        ]];
+
+        // XXX 循环 300个元素 3s - 5s
+        foreach ($orders as $key=>$order) {
+            $orderHeader = $orderHeaders[$key] ?? false;
+            if ($orderHeader) {
+
+                if($order->wms_status != $orderHeader->oracleBASCode_codename_c ||
+                    $order->consignee_name != $orderHeader->c_contact ||
+                    $order->consignee_phone != $orderHeader->c_tel2 ||
+                    $order->province != $orderHeader->c_province ||
+                    $order->city != $orderHeader->c_city ||
+                    $order->district != $orderHeader->c_district ||
+                    $order->wms_edittime != $orderHeader->edittime ||
+                    $order->address != $orderHeader->c_address1 ||
+                    $order->client_code != $orderHeader->soreference1 ){
+
+                    $multipleData[] =[
+                        'id' =>$order->id,
+                        'wms_status' => $orderHeader->oracleBASCode_codename_c,
+                        'consignee_name' => $orderHeader->c_contact,
+                        'consignee_phone' => $orderHeader->c_tel2,
+                        'province' => $orderHeader->c_province,
+                        'city' => $orderHeader->c_city,
+                        'district' => $orderHeader->c_district,
+                        'wms_edittime' => $orderHeader->edittime,
+                        'address' => $orderHeader->c_address1,
+                        'client_code' => $orderHeader->soreference1,
+                    ];
+
+
+
+                }
+            }
+        }
+        if(count($multipleData)  > 1){
+            try {
+                /** @var BatchUpdateService $batchUpdateService */
+                $batchUpdateService = app('batchUpdateService');
+                $batchUpdateService->batchUpdate('orders', $multipleData);
+                LogService::log(__METHOD__,__FUNCTION__,'批量更新'.count($multipleData).json_encode($multipleData));
+            } catch (\Exception $e) {
+                LogService::log(__METHOD__,__FUNCTION__,'批量更新失败'.json_encode($multipleData).$e->getMessage(),$e->getTraceAsString());
+            } finally {
+                unset($multipleData);
+            }
+        }
+    }
+
+    public function first(array $params)
+    {
         $order = Order::query();
-        foreach ($params as $column => $value){
+        foreach ($params as $column => $value) {
             $order->where($column, $value);
         }
         return $order->first();
@@ -412,7 +730,7 @@ class OrderService
                 $query->with('oracleBASCode');
             }]);
             $orderHeader = $actAllocationDetail->oracleDocOrderHeader ?? null;
-        }else{
+        } else {
             $orderHeader = app('oracleDocOrderHeaderService')->first(['soreference5' => $logistic_number]);
         }
 

+ 246 - 28
app/Services/OrderTrackingService.php

@@ -2,64 +2,282 @@
 
 namespace App\Services;
 
+use App\Exports\Export;
 use App\OrderTracking;
-use App\Owner;
+use App\Services\common\BatchUpdateService;
 use App\Services\common\QueryService;
+use Carbon\Carbon;
 use Illuminate\Support\Facades\Auth;
+use Maatwebsite\Excel\Facades\Excel;
 
-Class OrderTrackingService
+class OrderTrackingService
 {
-    public function getQuery($params){
+
+    public function getQuery($params)
+    {
         $user = Auth::user();
-        $owner_ids = $user ? $user-> getPermittingOwnerIdsAttribute() :[];
-        if($params['owner_id'] ?? false){
-            $owner_ids = array_intersect($owner_ids,$params['owner_id']) ;
+        $owner_ids = $user ? $user->getPermittingOwnerIdsAttribute() : [];
+        if ($params['owner_id'] ?? false) {
+            $ownerids = explode(",", $params['owner_id']);
+            $owner_ids = array_intersect($owner_ids, $ownerids);
         }
-        $query =  OrderTracking::query()->with(['owner','commodities'=>function($query){
-            $query->with(['commodity','package.order']);
-        },])->whereHas('owner',function($query) use ($owner_ids) {
-            $query->whereIn('id',$owner_ids);
-        });
+        $query = OrderTracking::query()->with(['owner', 'commodities' => function ($query) {
+            $query->with(['commodity', 'package.order.logistic']);
+        },])->whereHas('owner', function ($query) use ($owner_ids) {
+            $query->whereIn('id', $owner_ids); //货主
+        })->orderByDesc('created_at');
 
         $queryParam = [
-            'start_at' => ['alias'=>'created_at','startDate'=>' 00:00:00'],
-            'end_at' => ['alias'=>'created_at','endDate'=>' 23:59:59'],
+            'start_at' => ['alias' => 'pick_up_at', 'startDate' => ' 00:00:00'],
+            'end_at' => ['alias' => 'pick_up_at', 'endDate' => ' 23:59:59'],
         ];
         $param = [
             'start_at' => $params['start_at'] ?? '',
             'end_at' => $params['end_at'] ?? '',
         ];
-        $query = app(QueryService::class)->query($param,$query,$queryParam);
+
+        $query = app(QueryService::class)->query($param, $query, $queryParam);
+        return $query;
+    }
+
+    public function getConditionQuery($params)
+    {
+        $query = $this->getQuery($params);
+
+
+        if ($params['client_code'] ?? false)    // 订单号
+            $query->whereHas('commodities.package.order', function ($query) use ($params) {
+                $query->where('client_code', $params['client_code']);
+            });
+
+        if ($params['client'] ?? false)  // 客户
+            $query->where('client', 'like', $params['client']);
+
+        if ($params['sku'] ?? false) {
+            $query->whereHas('commodities.commodity', function ($query) use ($params) {
+                $query->where('sku', $params['sku']);
+            });
+        }  // sku
+
+        if ($params['logistic_number'] ?? false) {
+            $query->whereHas('commodities.package', function ($query) use ($params) {
+                $query->where('logistic_number', $params['logistic_number']);
+            });
+        }// 运输单号(快递单号)
+
+        if ($params['ids'] ?? false) {
+            $ids = explode(',', $params['ids']);
+            $query->whereIn('id', $ids);
+        }
+
         return $query;
     }
 
-    public function getConditionQuery($params){
-        $query =  $this->getQuery($params);
-        if($params['client_code'] ?? false ){
-            $query->whereHas('commodities.package',function($query) use ($params){$query->where('client_code',$params['client_code']);});
+    public function paginate($params)
+    {
+        return $this->getConditionQuery($params)->paginate($params['paginate'] ?? 50);
+    }
+
+    public function export($params)
+    {
+        if ($params['data'] ?? false) { // 按id
+            $trackOrders = $this->getConditionQuery($params);
+        } else {
+            $trackOrders = $this->getConditionQuery($params);
+        }
+        return $this->downLoadAsExec($trackOrders->get());
+    }
+
+    public function 根据设置从WMS同步追踪货主的订单($startDate)
+    {
+        $this->根据设置从WMS追踪货主的生成订单($startDate);
+        $this->根据设置从该时间段内获取WMS更新的订单($startDate);
+
+    }
+
+    public function 根据设置从WMS追踪货主的生成订单($startDate)
+    {
+        /** @var OrderService $orderService */
+        $orderService = app('orderService');
+        $params = $orderService->根据设置从WMS获取跟踪的订单($startDate);
+        $orders = $params['orders'];
+        $orderHeaders = $params['orderHeaders'];
+        $this->根据订单生成订单跟踪($orderHeaders, $orders);
+
+    }
+
+    public function 根据设置从该时间段内获取WMS更新的订单($startDate)
+    {
+        /** @var OrderService $orderService */
+        $orderService = app('orderService');
+        $params = $orderService->根据设置从WMS同步该时间段内更新的订单($startDate);
+        $orderPackageCommodities = $params['orderPackageCommodities'];
+        $orderHeaders = $params['orderHeaders'];
+        $this->更新创建的WAS订单商品跟踪($orderPackageCommodities, $orderHeaders);
+    }
+
+    //  XXX 代码逻辑有待纠正
+    public function 更新创建的WAS订单商品跟踪($updateOrderPackageCommodities, $updateOrderHeader)
+    {
+        if ($updateOrderPackageCommodities == null || $updateOrderPackageCommodities->count() == 0) {
+            return;
+        }
+        if ($updateOrderHeader == null || count($updateOrderHeader) == 0) {
+            return;
         }
+        $ids = data_get($updateOrderPackageCommodities, '*.id');
+
+        $orderTrackings = OrderTracking::query()->whereIn('order_package_commodity_id', $ids)->get();
+
+
+        $this->updateOrderTracking($orderTrackings, $updateOrderPackageCommodities); // 更新
 
-        if($params['client'] ?? false){
-            $query->where('client','like',$params['client']);
+        unset($updateOrderPackageCommodities, $updateOrderHeader);
+    }
+
+    public function 根据订单生成订单跟踪($orderHeaders, $orders)
+    {
+        $orderPackages = [];
+        $orderPackageCommodities = [];
+        $ordersList = [];
+        $fillables = [];
+        if($orders == null){
+            return;
+        }else if($orderHeaders == null){
+            return ;
         }
 
-        if($params['sku'] ?? false){
-            $query->whereHas('commodities.commodity',function($query) use ($params){$query->where('sku',$params['sku']);});
+        foreach ($orders as $order) {
+            $ordersList[$order['id']] = $order;
+            foreach ($order['packages'] as $packages) {
+                $orderPackages[$packages['id']] = $packages;
+                foreach ($packages['commodities'] as $item) {
+                    $orderPackageCommodities[] = $item;
+                }
+            }
+        }
+        if (count($orderPackageCommodities) == 0) {
+            return;
         }
 
-        if($params['logistic_number'] ?? false){
-            $query->whereHas('commodities.package',function($query) use ($params){$query->where('logistic_number',$params['logistic_number']);});
+        foreach ($orderPackageCommodities as $key=>$orderPackageCommodity) {
+            $order_package_id = $orderPackageCommodity['order_package_id'];
+            $orderPackage = $orderPackages[$order_package_id];
+            $order_id = $orderPackage['order_id'] ?? '';
+            $order = $ordersList[$order_id] ?? '';
+            $orderHeader = $orderHeaders[$order['code']];
+            $pick_up_at = $orderHeader['lastshipmenttime'] ?? null; // 提货时间
+
+            if ($orderHeader['notes'] ?? false) {
+                if (strstr($orderHeader['notes'], '[')) {
+                    $client = explode('[', $orderHeader['notes'])[0] ?? '';
+                }
+            }
+
+            $fillable = [
+                'order_package_commodity_id' => $orderPackageCommodity['id'],
+                'owner_id' => $order['owner_id'],
+                'client' => $client ?? '',
+                'created_at' => $order['created_at'],
+                'pick_up_at' => $pick_up_at, // 提货时间
+            ];
+            $fillables[] = $fillable;
+         }
+        try {
+            if (count($fillables) > 0) {
+                OrderTracking::query()->insert($fillables);
+                LogService::log(__METHOD__, __FUNCTION__, '批量创建订单跟踪成功' . count($fillables) . json_encode($fillables));
+            }
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__, '批量创建订单跟踪失败' . $e->getMessage() . $e->getTraceAsString());
+        } finally {
+            unset($fillables, $orderHeaders, $orders,$orderPackageCommodities);
         }
 
-        return $query;
     }
 
+    private function downLoadAsExec($trackOrders)
+    {
+        $row = [[
+            'owner_name' => '公司', 'order_client_code' => '订单号', 'web_order_number' => 'WEB+订单号', 'pick_up_at' => '提货日期', 'sale' => '销售',
+            'client' => '客户', 'sku' => 'sku', 'sku_name' => '物料描述', 'sku_amount' => '数量', 'order_remark' => '订单备注',
+            'package_weight' => '重量', 'package_bulk' => '体积', 'pallet_total' => '托盘合计', 'package_logistic' => '运输方式', 'package_logistic_number' => '运输单号',
+            'order_city' => '到达城市', 'planning_sent_at' => '应送达时间', 'is_on_duty_shift' => '是否赶上卡班', 'is_arrival' => '到货情况', 'signed_at' => '签收日期',
+            'receive_bill_status' => '签收单情况', 'remark' => '备注']];
 
-    public function paginate($params){
-       return  $this->getQuery($params)->paginate($params['paginate'] ?? 50);
+        $list = [];
+        $i = 0;
+
+        foreach ($trackOrders as $trackOrder) {
+            $list[$i]['owner_name'] = $trackOrder['owner']['name'] ?? '';
+            $list[$i]['order_client_code'] = $trackOrder['commodities']['package']['order']['client_code'] ?? '';
+            $list[$i]['web_order_number'] = $trackOrder['web_order_number'] ?? '';
+            $list[$i]['pick_up_at'] = $trackOrder['pick_up_at'] ?? '';
+            $list[$i]['sale'] = $trackOrder['sale'] ?? '';
+            $list[$i]['client'] = $trackOrder['client'] ?? '';
+            $list[$i]['sku'] = $trackOrder['commodities']['commodity']['sku'];
+            $list[$i]['sku_name'] = $trackOrder['commodities']['commodity']['name'];
+            $list[$i]['sku_amount'] = $trackOrder['commodities']['amount'];
+            $list[$i]['order_remark'] = $trackOrder['order_remark'];
+            $list[$i]['package_weight'] = $trackOrder['commodities']['package']['weight'];
+            $list[$i]['package_bulk'] = $trackOrder['commodities']['package']['bulk'];
+            $list[$i]['pallet_total'] = $trackOrder['commodities']['package']['pallet_total'];
+            $list[$i]['package_logistic'] = $trackOrder['commodities']['package']['order']['logistic']['name'];
+            $list[$i]['package_logistic_number'] = $trackOrder['commodities']['package']['logistic_number'];
+            $list[$i]['order_city'] = $trackOrder['commodities']['package']['order']['city'];
+            $list[$i]['planning_sent_at'] = $trackOrder['planning_sent_at'];
+            $list[$i]['is_on_duty_shift'] = $trackOrder['is_on_duty_shift'];
+            $list[$i]['is_arrival'] = $trackOrder['is_arrival'];
+            $list[$i]['signed_at'] = $trackOrder['signed_at'];
+            $list[$i]['receive_bill_status'] = $trackOrder['receive_bill_status'];
+            $list[$i]['remark'] = $trackOrder['remark'];
+            $i++;
+        }
+
+        return Excel::download(new Export($row, $list), date('YmdHis', time()) . '-订单跟踪.xlsx');
     }
 
-    public function export($params){
+    private function updateOrderTracking($orderTrackings, $orderPackagesCommodities)
+    {
+        $multipleData = [['id', 'owner_id', 'client', 'pick_up_at']];
+        $orderTrackings_list = [];
+
+        foreach ($orderPackagesCommodities as $item) {
+            $orderTrackings_list[$item['order_package_commodity_id']] = $item;
+        }
+
+        foreach ($orderTrackings as $orderTracking) {
+            $Commodities = $orderTrackings_list[$orderTracking['order_package_commodity_id']] ?? false;
+            $order = $Commodities['package']['order'] ?? '';
 
+            if ($order ?? false) {
+                $code = $order['code'];
+                $orderHeader = $orderPackagesCommodities[$code] ?? '';
+                $pick_up_at = $orderHeader['lastshipmenttime'] ?? null; // 提货时间
+
+                if ($orderHeader['Notes'] ?? false) {
+                    $client = explode('[', $orderHeader['notes'])[0] ?? '';
+                }
+
+                $data = [
+                    'id' => $orderTracking['id'],
+                    'owner_id' => $order['owner_id'] ?? '',
+                    'client' => $client ?? '',
+                    'pick_up_at' => $pick_up_at ?? null, // 提货时间
+                ];
+
+                if ($data['owner_id'] !== $orderTracking['owner_id'] ||
+                    $data['client'] !== $orderTracking['client'] ||
+                    $data['pick_up_at'] !== $orderTracking['pick_up_at']) {
+                    $multipleData[] = $data;
+                }
+            }
+        }
+
+        if (count($multipleData) > 1) {
+            /** @var BatchUpdateService $batchUpdateService */
+            $batchUpdateService = app('batchUpdateService');
+            $batchUpdateService->batchUpdate('order_trackings', $multipleData);
+        }
     }
 }

+ 58 - 18
app/Services/OwnerService.php

@@ -5,6 +5,7 @@ namespace App\Services;
 use App\OracleBasCustomer;
 use App\Owner;
 use Carbon\Carbon;
+use Illuminate\Support\Facades\Auth;
 
 Class OwnerService
 {
@@ -12,31 +13,33 @@ Class OwnerService
      * array | string $column
      * 默认一些select字段,可传递string 或 array来指定select字段
      */
-    public function getSelection($column = ['id','name']){
+    public function getSelection($column = ['id', 'name'])
+    {
         return Owner::filterAuthorities()->select($column)->get();
     }
     /**
      *同步WMS全部货主至WAS
      */
-    public  function syncOwnersData(){
-        $basCustomers=OracleBasCustomer::query()
-            ->select('CUSTOMERID','DESCR_C')
-            ->where('DESCR_C','not like','%换ERP%')
-            ->where('DESCR_C','not like','%退仓%')
-            ->where('CUSTOMER_TYPE','OW')
+    public function syncOwnersData()
+    {
+        $basCustomers = OracleBasCustomer::query()
+            ->select('CUSTOMERID', 'DESCR_C')
+            ->where('DESCR_C', 'not like', '%换ERP%')
+            ->where('DESCR_C', 'not like', '%退仓%')
+            ->where('CUSTOMER_TYPE', 'OW')
             ->get();
-        $ownerCount=Owner::count();
-        if(count($basCustomers)==$ownerCount)return null;
-        foreach ($basCustomers as $basCustomer){
-           $owner=Owner::query()->where('code',$basCustomer['customerid'])->first();
-           if (!isset($owner))
-               Owner::query()->create([
-              'code'=> $basCustomer['customerid'],
-               'name'=>$basCustomer['descr_c'],
-               'created_at'=>Carbon::now()->format('Y-m-d H:i:s'),
-           ]);
+        $ownerCount = Owner::count();
+        if (count($basCustomers) == $ownerCount) return null;
+        foreach ($basCustomers as $basCustomer) {
+            $owner = Owner::where('code', $basCustomer['customerid'])->first();
+            if (!isset($owner))
+                Owner::query()->create([
+                    'code' => $basCustomer['customerid'],
+                    'name' => $basCustomer['descr_c'],
+                    'created_at' => Carbon::now()->format('Y-m-d H:i:s'),
+                ]);
         }
-        $owners=Owner::query()->select('id','name')->get();
+        $owners = Owner::query()->select('id', 'name')->get();
         return $owners;
     }
 
@@ -57,4 +60,41 @@ Class OwnerService
         if (!$values) return Owner::query()->firstOrCreate($params);
         return Owner::query()->firstOrCreate($params,$values);
     }
+
+    //  XXX 代码逻辑有待纠正
+    public function 获取WMS订单列中对应的WAS货主列($WMSOrderHeaders)
+    {
+        $customerIds =  array_unique(data_get($WMSOrderHeaders, '*.customerid'));
+        $owners = Owner::query()->whereIn('code', $customerIds)->get();
+        $codes = data_get($owners, '*.code');
+        $codeDiff = array_diff($customerIds, $codes);
+        $logs = [];
+        $errs = [];
+
+        if (count($codes) > count($customerIds)) {
+            $basCustomer = OracleBasCustomer::query()->whereIn('customerid', $codeDiff)->get();
+            foreach ($basCustomer as $customer) {
+                if($customer['descr_c'] ?? false && $customer['customerid'] && false){
+                    try {
+                        $owner = Owner::query()->create(['name' => $customer['descr_c'], 'code' => $customer['customerid']]);
+                        $owners->push($owner);
+                        array_push($logs, ['info' => '创建「' . json_encode($owner) . '」']);
+                    } catch (\Exception $e) {
+                        array_push($errs, ['info' => '创建「' . json_encode($errs) . '」']);
+                    }
+                }
+            }
+        }
+        if(count($logs)>0)
+            LogService::log(__METHOD__, __FUNCTION__, '批量创建客户「:' . json_encode($logs) . '」', Auth::user()['id']);
+        if(count($errs)>0)
+            LogService::log(__METHOD__, __FUNCTION__, '批量创建客户失败「:' . json_encode($errs) . '」', Auth::user()['id']);
+        return $owners;
+    }
+
+    public function 获取订单跟踪的货主(){
+        return Owner::query()->with('orderTrackingOwner')->whereHas('orderTrackingOwner',function($query){
+            $query->where('status','启用');
+        })->get();
+    }
 }

+ 48 - 5
app/Services/ShopService.php

@@ -1,11 +1,11 @@
-<?php 
+<?php
 
-namespace App\Services; 
+namespace App\Services;
 
 use App\Shop;
 
-Class ShopService
-{ 
+class ShopService
+{
 
     function firstOrCreate(array $param, array $values = null){
         $shop = Shop::query();
@@ -13,4 +13,47 @@ Class ShopService
         return $shop->firstOrCreate($param);
     }
 
-}
+    public function 根据追踪的WMS订单返回商铺($WMSOrderHeaders, $owners = null)
+    {
+        if ($owners == null) {
+            /** @var $ownerService OwnerService */
+            $ownerService = app('ownerService');
+            $owners = $ownerService->获取订单跟踪的货主();
+        }
+        if(count($WMSOrderHeaders) == 0){
+            return [];
+        }
+        $issuePartyNames = [];
+        foreach ($WMSOrderHeaders as $WMSOrderHeader) {
+            $issuePartyNames[$WMSOrderHeader['issuepartyname']] = $WMSOrderHeader;
+        }
+        $issuePartyNames = array_unique($issuePartyNames);
+        $issuePartyNames = array_diff($issuePartyNames,['',null]);
+
+        $shops = Shop::query()->whereIn('name',array_keys($issuePartyNames))->get();
+        $fillables = [];
+        if (count($shops) < count($issuePartyNames)) {
+            $shopNames = data_get($shops, '*.name');
+            $shopDiff = array_diff($issuePartyNames, $shopNames);
+            foreach ($shopDiff as $key=>$item) {
+                if($key === '' ){
+                    continue;
+                }
+                $owner = $owners->where('code', $item['customerid'])->first();
+                if($owner === null || $item['issuepartyname'] ?? false)
+                    continue;
+                array_push($fillables,['owner_id' => $owner['id'], 'name' => $item['issuepartyname']]);
+            }
+        }
+        try {
+            if(count($fillables) > 0){
+                Shop::query()->insert($fillables);
+                LogService::log(__METHOD__, __FUNCTION__, '批量创建商铺:' .json_encode($fillables));
+            }
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__, '创建商铺失败:' . $e->getMessage(),$e->getTraceAsString());
+        }
+        return Shop::query()->whereIn('name',array_keys($issuePartyNames))->get();
+    }
+
+}

+ 4 - 2
app/Services/StoreCheckingReceiveItemService.php

@@ -2,10 +2,12 @@
 
 namespace App\Services; 
 
+use App\StoreCheckingReceiveItem;
+
 Class StoreCheckingReceiveItemService
 { 
-    public function insert(){
-
+    public function insert(array $params){
+        return StoreCheckingReceiveItem::query()->insert($params);
     }
 
 }

+ 12 - 0
app/Services/StoreCheckingReceiveService.php

@@ -30,4 +30,16 @@ Class StoreCheckingReceiveService
         return $query->paginate($params['paginate'] ?? 50);
     }
 
+
+    public function create(array $params){
+        return StoreCheckingReceive::query()->create($params);
+    }
+
+    public function find($id){
+        return StoreCheckingReceive::query()->with(['storeCheckingReceiveItems'=>function($query){
+            $query->with(['commodity'=>function($builder){
+                $builder->with('barcodes');
+            }]);
+        }])->find($id);
+    }
 }

+ 70 - 0
app/Services/common/BatchUpdateService.php

@@ -0,0 +1,70 @@
+<?php
+
+
+namespace App\Services\common;
+
+
+use App\Services\LogService;
+use Illuminate\Support\Facades\DB;
+
+class BatchUpdateService
+{
+    public function batchUpdate($tableName = '', $multipleData = array(), $connection = 'mysql')
+    {
+        if (count($multipleData) == 1) {
+            return false;
+        }
+        if ($tableName ?? false && !empty($multipleData)) {
+            // column of fields to update
+            $updateColumns = $multipleData[0];
+            // table primary key
+            $referenceColumn = $updateColumns[0];
+            unset($multipleData[0]);
+
+            if (count($multipleData) <= 200) {
+                return $this->batchHandle($tableName, $updateColumns, $referenceColumn, $multipleData, $connection);
+            } else {
+                $chunk_datas = array_chunk($multipleData, 200, true);
+                $bool = true;
+                foreach ($chunk_datas as $chunk_data) {
+                    $is_successful = $this->batchHandle($tableName, $updateColumns, $referenceColumn, $chunk_data, $connection);
+                    $bool = $is_successful && $bool;
+                }
+                return $bool;
+            }
+        } else {
+            return false;
+        }
+    }
+
+    private function batchHandle($tableName, $updateColumns, $referenceColumn, $multipleData, $connection = 'mysql')
+    {
+        $updateSql = "UPDATE " . $tableName . " SET ";
+        $sets = [];
+        $bindings = [];
+        foreach ($updateColumns as $updateColumn) {
+            $setSql = ' `' . $updateColumn . '` = CASE';
+            foreach ($multipleData as $multipleDatum) {
+                $setSql .= ' WHEN ' . $referenceColumn . ' =  ? THEN ? ';
+                $bindings[] = $multipleDatum[$referenceColumn];
+                $bindings[] = $multipleDatum[$updateColumn];
+            }
+            $setSql .= ' ELSE `' . $updateColumn . "` END";
+            $sets[] = $setSql;
+        }
+        $updateSql .= implode(',', $sets);
+        $whereIn = data_get($multipleData, '*.' . $referenceColumn);
+        $bindings = array_merge($bindings, $whereIn);
+        $whereIn = rtrim(str_repeat('?,', count($whereIn)), ',');
+        $updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")";
+        try {
+            // DB::update
+            $bool = DB::connection($connection)->update($updateSql, $bindings);
+            LogService::log(__METHOD__, __FUNCTION__, '批量更新' . count($multipleData) . $tableName . $updateSql . json_encode($bindings));
+            return $bool;
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__, '批量更新失败' . count($multipleData) . $tableName . $updateSql . json_encode($bindings) . $e->getMessage() . $e->getTraceAsString());
+            return false;
+        }
+    }
+}

+ 84 - 0
app/Services/common/DataHandlerService.php

@@ -0,0 +1,84 @@
+<?php
+
+
+namespace App\Services\common;
+
+
+class DataHandlerService
+{
+    public function dataHeader(array $mapKeys= [], $resultData =[]){
+        $handlerData = [];
+        foreach ($resultData as $data) {
+            $key =  $this->getKey($mapKeys,$data);
+            $handlerData[$key] = $data;
+        }
+        $handlerData['mapkey'] = $mapKeys;
+        return $handlerData;
+    }
+
+    /**
+     * 只支持三层的寻找
+     * @param array $mapKeyArr
+     * @param array $resultData
+     */
+    public function dataHeaders(array $mapKeyArr = [], $resultData =[]){
+        $handlerData_list = [];
+        $level_1_key = $mapKeyArr[0][0] ?? false; unset($mapKeyArr[0][0]);
+        $level_2_key = $mapKeyArr[1][0] ?? false; unset($mapKeyArr[1][0]);
+        $level_3_key = $mapKeyArr[2][0] ?? false; unset($mapKeyArr[2][0]);
+        $level_1_keys =$mapKeyArr[0] ?? false;
+        $level_2_keys =$mapKeyArr[1] ?? false;
+        $level_3_keys =$mapKeyArr[2] ?? false;
+
+        if($level_1_key || $level_1_key==''){
+            foreach ($resultData as $level_1_data) {
+                if(!$level_1_keys){continue;}
+                $key = $this->getKey($level_1_keys,$level_1_data);
+                if($level_1_key==''){
+                    $level_2_data_list = $level_1_data;
+                }else{
+                    $level_2_data_list = $level_1_data[$level_1_key];
+                }
+                if($level_2_key || $level_2_key==''){
+                    if(!$level_2_keys){continue;}
+                    foreach ($level_2_data_list as $level_2_data) {
+                        $key .= $this->getKey($level_2_keys, $level_2_data);
+                        $level_3_data_list = $level_2_data[$level_1_key];
+                        if ($level_3_key || $level_3_key=='') {
+                            if (!$level_3_keys) {
+                                continue;
+                            }
+                            foreach ($level_3_data_list as $level_3_data) {
+                                $key .=  $this->getKey($level_3_keys, $level_3_data);
+                                $handlerData_list[$key] =$level_3_data;
+                            }
+                        }else{
+                            $handlerData_list[$key] =$level_2_data;
+                        }
+                    }
+                }else{
+                    $handlerData_list[$key] =$level_1_data;
+                }
+            }
+        }
+        $handlerData['mapkey'] = array_merge($level_1_keys,$level_2_keys ?? [],$level_3_keys ?? []);
+        return $handlerData_list ?? null;
+    }
+
+    private function  getKey($keys,$object){
+        $mapKey = '';
+        foreach ($keys as $key){
+            $mapKey .= $key.'='.$object[$key];
+        }
+        return $mapKey;
+    }
+
+    public function getKeyValue($keyValues,$data){
+         $mapkeys =  $data['mapkey'];
+         $key = '';
+         foreach ($mapkeys as $mapkey) {
+             $key .=$mapkey.'='.$keyValues[$mapkey];
+         }
+         return $data[$key] ?? null;
+    }
+}

+ 1 - 1
app/Services/common/QueryService.php

@@ -60,7 +60,7 @@ Class QueryService
                     $isExecute = true;
                 }
                 if ($rule === 'like'){
-                    $query = $query->where($tableName.$column,'like',$value.$params[$param].$value);
+                    $query = $query->where($tableName.$column,'like',$value.$params[$param].$value.'%');
                     $isExecute = true;
                 }
                 if ($rule === 'multi'){

+ 3 - 0
app/StoreCheckingReceive.php

@@ -16,4 +16,7 @@ class StoreCheckingReceive extends Model
     public function owner(){
         return $this->hasOne('App\Owner','id','owner_id');
     }
+    public function storeCheckingReceiveItems(){
+        return $this->hasMany('App\StoreCheckingReceiveItem','store_checking_receive_id','id');
+    }
 }

+ 0 - 7
config/sync,php.php

@@ -1,7 +0,0 @@
-<?php
-return [
-    'order_tracking_import' => [
-        'import' => 20,
-        'start_at'=> '',
-    ],
-];

+ 7 - 0
config/sync.php

@@ -0,0 +1,7 @@
+<?php
+return [
+    'order_tracking_import' => [
+        'interval' => 1,   // 时间以分为单位
+        'start_at'=> '',    // 开始同步WMS的时间  时间格式: yyyy-MM-dd HH:mm:ss 如 2020-09-05 13:15:16
+    ],
+];

+ 1 - 1
database/migrations/2020_09_03_182051_create_order_trackings_table.php

@@ -18,7 +18,7 @@ class CreateOrderTrackingsTable extends Migration
             $table->integer('order_package_commodity_id')->index();
             $table->integer('owner_id')->index();
             $table->string('web_order_number')->nullable();
-            $table->timestamp('pick_up_at');
+            $table->timestamp('pick_up_at')->nullable();
             $table->string('sale')->nullable();
             $table->string('client')->nullable();
             $table->string('order_remark')->nullable();

+ 3 - 3
database/migrations/2020_09_16_090458_create_checking_store_receive_items_table.php → database/migrations/2020_09_16_090458_create_store_checking_receive_items_table.php

@@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration;
 use Illuminate\Database\Schema\Blueprint;
 use Illuminate\Support\Facades\Schema;
 
-class CreateCheckingStoreReceiveItemsTable extends Migration
+class CreateStoreCheckingReceiveItemsTable extends Migration
 {
     /**
      * Run the migrations.
@@ -23,8 +23,8 @@ class CreateCheckingStoreReceiveItemsTable extends Migration
             $table->integer('asn_amount')->nullable()->comment('ASN数量');
             $table->integer('imported_diff_amount')->nullable()->comment('导入差异');
             $table->integer('asn_diff_amount')->nullable()->comment('ASN差异');
-            $table->timestamp('produced_at')->nullable()->comment('生产日期');
-            $table->timestamp('invalid_at')->nullable()->comment('失效日期');
+            $table->date('produced_at')->nullable()->comment('生产日期');
+            $table->date('invalid_at')->nullable()->comment('失效日期');
             $table->string('batch_code')->nullable()->comment('批号');
             $table->string('unique_code')->nullable()->comment('唯一码');
         });

+ 2 - 2
public/js/app.js

@@ -61974,8 +61974,8 @@ module.exports = tempTip;
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 
-__webpack_require__(/*! D:\wamp64\www\bswas\resources\js\app.js */"./resources/js/app.js");
-module.exports = __webpack_require__(/*! D:\wamp64\www\bswas\resources\sass\app.scss */"./resources/sass/app.scss");
+__webpack_require__(/*! D:\Reald\desktop\BsWAS\src\resources\js\app.js */"./resources/js/app.js");
+module.exports = __webpack_require__(/*! D:\Reald\desktop\BsWAS\src\resources\sass\app.scss */"./resources/sass/app.scss");
 
 
 /***/ }),

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

@@ -519,7 +519,7 @@ const query = function getQueryForm(data) {
         div.append(select).append(label).append(select_div);
 
         fillMultipleSelectOption(ul, condition.data, condition.name);
-        
+
         input.bind('input propertychange', function () {
             let value = this.value;
             if (value === '') {

+ 3 - 3
resources/views/inventory/stockInventory/inventoryMission.blade.php

@@ -9,11 +9,11 @@
     @endcomponent
     <div id="list" class="d-none container-fluid" >
         <div class="mt-3">
-
             <span class="mt-3" >
-                 @can('库存管理-盘点-完结')
-                    <span><button class="btn btn-sm btn-outline-info" v-if="inventory.status==='复盘中' &&!listMode" @click="完结盘点任务(inventory.id,inventory.owner.name,inventory.type)">完结</button></span>
+                @can('库存管理-盘点-完结')
+                <span><button class="btn btn-sm btn-outline-info" v-if="inventory.status==='复盘中' &&!listMode" @click="完结盘点任务(inventory.id,inventory.owner.name,inventory.type)">完结</button></span>
                 @endcan
+
                 @can('库存管理-盘点-查看')
                     <button class="btn btn-sm" @click="listMode?listMode=false:listMode=true" :class="listMode?'btn-dark':'btn-outline-dark'" v-if="!listMode">切换为列表</button>
                 @endcan

+ 67 - 2
resources/views/maintenance/commodity/index.blade.php

@@ -6,13 +6,33 @@
         @component('maintenance.menu')@endcomponent
         @component('maintenance.commodity.menu')@endcomponent
     </span>
-    <div class="container-fluid">
+    <div class="container-fluid" id="list">
         <div class="card">
             <div class="card-body">
                 @if(Session::has('successTip'))
                     <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
                 @endif
-                <table class="table table-striped table-sm" id="list">
+                <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-hidden="true">
+                    <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
+                        <div class="modal-content">
+                            <div class="modal-body" style="text-align:center;height: 150px">
+                                <div class="row col-12 mt-5">
+                                    <label class="col-2 text-info">选择货主:</label>
+                                    <select class="form-control form-control-sm col-6" name="owner_code" v-model="owner_code">
+                                        <option v-for="owner in owners" :value="owner.code">@{{ owner.name }}</option>
+                                    </select>
+                                    <input placeholder="搜索货主" @input="seekOwner($event)" class="form-control form-control-sm col-3">
+                                </div>
+                            </div>
+                            <div class="modal-footer">
+                                <button class="col-12 btn btn-success" @click="syncCommodity()">开始同步</button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <button class="btn btn-sm btn-outline-info mb-1" @click="openModal()" >同步商品</button>
+                <table class="table table-striped table-sm">
                     <tr>
                         <th>ID</th>
                         <th>SKU</th>
@@ -56,6 +76,8 @@
                     },
                     @endforeach
                 ],
+                owners : [],
+                owner_code : '',
             },
             methods:{
                 edit:function(id){
@@ -86,6 +108,49 @@
                             tempTip.show('删除商品信息失败!'+'网络错误:' + err)
                         });
                 },
+                openModal(){
+                    axios.post('{{url('apiLocal/maintenance/owner/getOwners')}}')
+                        .then(res=>{
+                            this.owners = res.data;
+                            $("#modal").modal('show');
+                        });
+                },
+                syncCommodity(){
+                    if (!this.owner_code){
+                        tempTip.setDuration(3000);
+                        tempTip.show('未选择货主');
+                        return;
+                    }
+                    let owner_id = "";
+                    this.owners.some(owner => {
+                        if (owner.code === this.owner_code){
+                            owner_id = owner.id;
+                            return true;
+                        }
+                    });
+                    axios.post('{{url('maintenance/commodity/syncWMS')}}',{owner_code : this.owner_code, owner_id : owner_id})
+                        .then(res => {
+                            if (res.data.success){
+                                tempTip.setDuration(2000);
+                                tempTip.setIndex(1099);
+                                tempTip.showSuccess("同步成功");
+                                return true;
+                            }
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.data);
+                        }).catch(err => {
+                            tempTip.setDuration(3000);
+                            tempTip.showSuccess("网络错误:"+err);
+                        });
+                },
+                seekOwner(e){
+                    this.owners.some(owner => {
+                        if (owner.name.indexOf(e.target.value) !== -1){
+                            this.owner_code = owner.code;
+                            return true;
+                        }
+                    });
+                }
             }
         });
     </script>

+ 16 - 2
resources/views/maintenance/userLabor/index.blade.php

@@ -10,6 +10,7 @@
             @if(Session::has('successTip'))
                 <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
             @endif
+            <div id="form_div"></div>
             <div class="modal fade" id="workRecord" tabindex="-1" role="dialog" aria-hidden="true">
                 <div class="modal-dialog">
                     <div class="modal-content" style="width: 800px">
@@ -89,8 +90,8 @@
                 </tr>
                 <tr v-for="(userLabor,i) in userLabors">
                     <td>@{{ i+1 }}</td>
-                    <td class="text-muted" v-if="userLabor.user_detail">@{{userLabor.user_detail.full_name}}</td>
-                    <td v-if="userLabor.user_detail">@{{userLabor.user_detail.mobile_phone}}</td>
+                    <td class="text-muted"><span v-if="userLabor.user_detail">@{{userLabor.user_detail.full_name}}</span></td>
+                    <td><span v-if="userLabor.user_detail">@{{userLabor.user_detail.mobile_phone}}</span></td>
                     <td><u class="text-info" style="cursor:pointer" @click="show(userLabor.user_id)">查看详情</u></td>
                     <td>
                         @can('临时工-编辑')
@@ -115,6 +116,7 @@
 @endsection
 
 @section('lastScript')
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script>
         new Vue({
             el:"#list",
@@ -130,6 +132,18 @@
                 processDailyParticipants:[],
                 userDutyChecks:[],
             },
+            mounted(){
+                let data=[
+                   [
+                       {name: 'user_name', type: 'input', tip: '姓名:可在左侧增加百分号(%)进行模糊搜索', placeholder: '姓名'},
+                   ]
+                ];
+                this.form = new query({
+                    el: "#form_div",
+                    condition: data,
+                });
+                this.form.init();
+            },
             methods:{
                 show(user_id){
                     window.open("{{url('maintenance/userLabor')}}/"+user_id);

+ 1 - 1
resources/views/order/issue/edit.blade.php

@@ -254,8 +254,8 @@
                                 _this.rejectedBill.id_logistic_return = res.data.rejectedBill.id_logistic_return;
                                 _this.rejectedBill.id_owner = res.data.rejectedBill.id_owner;
                                 _this.orderIssues.rejected_bill_id = res.data.rejectedBill.id;
-                                _this.isSubmit = false;
                             }
+                            _this.isSubmit = false;
                             if(res.data.msg){
                                 tempTip.setDuration(2000);
                                 tempTip.showSuccess(res.data.msg);

+ 170 - 112
resources/views/order/issue/index.blade.php

@@ -34,104 +34,100 @@
                 <table class="table table-sm  table-bordered table-hover card-body table-responsive-sm p-0 m-0 "
                        style="background: #fff;min-width: 3000px;">
                     <tr class="tr-yellow" align="center">
-                        <th class=" font-weight-bolder "  @cannot('客户不可见')  colspan="7" @else colspan="4"    @endcannot></th>
-                        <th class="td-yellow  font-weight-bolder original-class table-head-warning "
-                            @cannot('客户不可见') :colspan="(isShowOrderInfo ? '16':'8' )" @else  :colspan="(isShowOrderInfo ? '15':'7' )"   @endcannot>
+                        <th class=" font-weight-bolder header-1" ></th>
+                        <th class="td-yellow  font-weight-bolder original-class table-head-warning  header-2">
                             <span>原始运单号</span>
                             <button class="btn btn-sm btn-outline-secondary float-right" v-if="isShowOrderInfo" @click="hideOrderInfo">
                                 隐藏运单列
                             </button>
                         </th>
 
-                        <th class="  font-weight-bolder"
-                            @cannot('客户不可见')
-                            :colspan="11 +  (isShowRejectedBill ? 5:1) + (isShowSecondOrderInfo ? 6: 1 )"
-                            @else
-                            colspan="8"
-                            @endcannot>
+                        <th class="font-weight-bolder header-3">
 
-                            @cannot('客户不可见')
+                            @cannot('订单管理-问题件-客户不可见')
                             <button class="btn btn-sm btn-outline-secondary float-left" v-if="isShowRejectedBill" @click="hideRejectedBill">
                                 隐藏退单列
                             </button>
                             @endcannot
                             情况说明
-                            @cannot('客户不可见')
+                            @cannot('订单管理-问题件-客户不可见')
                             <button class="btn btn-sm btn-outline-secondary" v-if="isShowSecondOrderInfo" @click="hideSecondOrder">
                                 隐藏运单列
                             </button>
                             @endcannot
                         </th>
-                        @cannot('客户不可见')
+                        @cannot('订单管理-问题件-客户不可见')
                         <th></th>
                         @endcannot
                     </tr>
 
                     <tr class="tr-yellow" align="center">
 
-                        <th rowspan="2" class="align-middle">
+                        <th rowspan="2" class="align-middle one-layer">
                             <label for="all">
                                 <input id="all" type="checkbox" @click="checkAll($event)"/>
                             </label>
                         </th>
-                        <th class=" align-middle" rowspan="2" style=" min-width: 50px;">序号</th>
-                        <th class=" align-middle" rowspan="2" style=" min-width: 25px;">ID</th>
-                        @cannot('客户不可见')
-                        <th class=" align-middle" rowspan="2" style=" min-width: 75px;">退件</th>
+                        <th class="one-layer align-middle" rowspan="2" style=" min-width: 50px;">序号</th>
+                        <th class="one-layer align-middle" rowspan="2" style=" min-width: 25px;">ID</th>
+                        @cannot('订单管理-问题件-客户不可见')
+                        <th class="one-layer align-middle" rowspan="2" style=" min-width: 75px;">退件</th>
                         @can("订单管理-问题件-置顶")
-                        <th class=" align-middle" rowspan="2" style=" min-width: 75px;">置顶</th>
+                        <th class="one-layer align-middle" rowspan="2" style=" min-width: 75px;">置顶</th>
                         @endcan
-                        <th class=" align-middle" rowspan="2" style=" min-width: 100px;">退单状态</th>
+                        <th class="one-layer align-middle" rowspan="2" style=" min-width: 100px;">退单状态</th>
                         @endcannot
-                        <th class=" align-middle" rowspan="2" style="min-width: 120px">最终状态</th>
-                        @cannot('客户不可见')
-                        <th class=" align-middle td-yellow" rowspan="2" style="min-width: 165px;">登记日期</th>
+                        <th class="one-layer align-middle" rowspan="2" style="min-width: 120px">最终状态</th>
+                        @cannot('订单管理-问题件-客户不可见')
+                        <th class="one-layer align-middle td-yellow" rowspan="2" style="min-width: 165px;">登记日期</th>
                         @endcannot
 
-                        <th class=" align-middle td-yellow" rowspan="2" style="min-width: 165px;">订单日期</th>
-                        <th class=" align-middle td-yellow" rowspan="2" style="min-width: 100px;">客户</th>
-                        <th class=" align-middle td-yellow" rowspan="2" style="min-width: 200px;">店铺</th>
-                        <th class=" align-middle td-yellow" rowspan="2" style="min-width: 200px;">客户订单号</th>
-                        <th class=" align-middle td-yellow" rowspan="2" style="min-width: 100px;">原始承运商</th>
-                        <th class=" align-middle td-yellow" rowspan="2" style="min-width: 150px;">原始运单号</th>
+                        <th class="tow-layer align-middle td-yellow" rowspan="2" style="min-width: 165px;">订单日期</th>
+                        <th class="tow-layer align-middle td-yellow" rowspan="2" style="min-width: 100px;">客户</th>
+                        <th class="tow-layer align-middle td-yellow" rowspan="2" style="min-width: 200px;">店铺</th>
+                        <th class="tow-layer align-middle td-yellow" rowspan="2" style="min-width: 200px;">客户订单号</th>
+                        <th class="tow-layer align-middle td-yellow" rowspan="2" style="min-width: 100px;">原始承运商</th>
+                        <th class="tow-layer align-middle td-yellow" rowspan="2" style="min-width: 150px;">原始运单号</th>
                         {{--原始商品明细 开始--}}
-                        <th class=" align-middle td-yellow" v-if="!isShowOrderInfo" rowspan="2" style="min-width:50px">展开</th>
-                        <th class=" align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width: 90px">收货人名称</th>
-                        <th class=" align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width: 120px;">收货人电话</th>
-                        <th class=" align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width: 70px">省</th>
-                        <th class=" align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width: 70px">市</th>
-                        <th class=" align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width: 70px">区</th>
-                        <th class=" align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width:300px">收货人地址</th>
-                        <th class=" align-middle td-yellow" v-if="isShowOrderInfo" colspan="3" style="min-width:300px">原始商品明细</th>
+                        <th class="tow-layer align-middle td-yellow" v-if="!isShowOrderInfo" rowspan="2" style="min-width:50px">展开</th>
+                        <th class="tow-layer align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width: 90px">收货人名称</th>
+                        <th class="tow-layer align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width: 120px;">收货人电话</th>
+                        <th class="tow-layer align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width: 70px">省</th>
+                        <th class="tow-layer align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width: 70px">市</th>
+                        <th class="tow-layer align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width: 70px">区</th>
+                        <th class="tow-layer align-middle td-yellow" v-if="isShowOrderInfo" rowspan="2" style="min-width:300px">收货人地址</th>
+                        <th class="tow-layer align-middle td-yellow" v-if="isShowOrderInfo" colspan="3" style="min-width:300px">原始商品明细</th>
+{{--                        <th class="three-layer  align-middle" rowspan="2" >退回单号</th>--}}
 {{--                        @cannot('客户不可见')--}}
-                        <th class="  align-middle" rowspan="2" v-if="!isShowRejectedBill" style="min-width:50px">展开</th>
+                        <th class="three-layer   align-middle" rowspan="2" v-if="!isShowRejectedBill" style="min-width:50px">展开</th>
+
                             <th class=" align-middle" rowspan="2" v-if="isShowRejectedBill" style="min-width:75px">退回单号</th>
-                        <th class="  align-middle" colspan="5" v-if="isShowRejectedBill" style="min-width: 450px">返回商品明细</th>
+                        <th class="three-layer   align-middle" colspan="5" v-if="isShowRejectedBill" style="min-width: 450px">返回商品明细</th>
 {{--                        @endcannot--}}
-                        <th class="bg-whit  align-middle" rowspan="2" style="min-width: 115px">情况说明</th>
-                        <th class="  align-middle" rowspan="2" style="min-width: 115px">问题类别</th>
-                        <th class="  align-middle" colspan="3" style="min-width: 115px">处理结果</th>
-                        @cannot('客户不可见')
-                        <th class="  align-middle" rowspan="2" v-if="!isShowSecondOrderInfo" style="width:50px">展开</th>
-                        <th class="  align-middle" rowspan="2" v-if="isShowSecondOrderInfo" style=" min-width: 120px;">二次客户订单号</th>
-                        <th class="  align-middle" rowspan="2" v-if="isShowSecondOrderInfo" style=" min-width: 100px;">二次承运商</th>
-                        <th class="  align-middle" rowspan="2" v-if="isShowSecondOrderInfo" style=" min-width: 200px;">二次运单号</th>
-                        <th  colspan="3" style="min-width: 300px" v-if="isShowSecondOrderInfo" style=" min-width: 350px;">二次商品明细</th>
+                        <th class=" bg-whit  align-middle" rowspan="2" style="min-width: 115px">情况说明</th>
+                        <th class="three-layer   align-middle" rowspan="2" style="min-width: 115px">问题类别</th>
+                        <th class="three-layer  align-middle" colspan="3" style="min-width: 115px">处理结果</th>
+                        @cannot('订单管理-问题件-客户不可见')
+                        <th class="three-layer  align-middle" rowspan="2" v-if="!isShowSecondOrderInfo" style="width:50px">展开</th>
+                        <th class="three-layer  align-middle" rowspan="2" v-if="isShowSecondOrderInfo" style=" min-width: 120px;">二次客户订单号</th>
+                        <th class="three-layer  align-middle" rowspan="2" v-if="isShowSecondOrderInfo" style=" min-width: 100px;">二次承运商</th>
+                        <th class="three-layer  align-middle" rowspan="2" v-if="isShowSecondOrderInfo" style=" min-width: 200px;">二次运单号</th>
+                        <th class="three-layer" colspan="3" style="min-width: 300px" v-if="isShowSecondOrderInfo" style=" min-width: 350px;">二次商品明细</th>
                         @endcannot
-                        <th class="  align-middle" rowspan="2" style="min-width: 120px">承运商赔偿金额</th>
-                        <th class="  align-middle" rowspan="2" style="min-width: 120px">承运商快递减免</th>
-                        @cannot('客户不可见')
-                        <th class="  align-middle" rowspan="2" style="min-width: 120px">宝时赔偿金额</th>
-                        <th class="  align-middle" rowspan="2" style="min-width: 120px">宝时快递减免</th>
-                        <th class="  align-middle" rowspan="2" style="min-width: 120px">事故责任方</th>
-                        <th class="  align-middle" rowspan="2" style="min-width: 120px">操作</th>
+                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">承运商赔偿金额</th>
+                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">承运商快递减免</th>
+                        @cannot('订单管理-问题件-客户不可见')
+                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">宝时赔偿金额</th>
+                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">宝时快递减免</th>
+                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">事故责任方</th>
+                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">操作</th>
                         @endcannot
                     </tr>
-                    <tr class="tr-yellow" align="center">
+                    <tr class=" tr-yellow" align="center">
                         <th class="td-yellow" v-if="isShowOrderInfo" style="min-width: 120px">条码</th>
                         <th class="td-yellow" v-if="isShowOrderInfo" style="min-width: 150px">商品名</th>
                         <th class="td-yellow" v-if="isShowOrderInfo" style="min-width: 75px">数量</th>
-                        @cannot('客户不可见')
+                        @cannot('订单管理-问题件-客户不可见')
                         <th  v-if="isShowRejectedBill" style="min-width: 75px">条码</th>
                         <th  v-if="isShowRejectedBill" style="min-width: 100px">商品名</th>
                         <th  v-if="isShowRejectedBill" style="min-width: 50px">数量</th>
@@ -141,7 +137,7 @@
                         <th  style="min-width: 75px">操作类型</th>
                         <th  style="min-width: 120px">说明</th>
                         <th  style="min-width: 100px">操作者</th>
-                        @cannot('客户不可见')
+                        @cannot('订单管理-问题件-客户不可见')
                         <th  v-if="isShowSecondOrderInfo" style="min-width: 100px">条码</th>
                         <th  v-if="isShowSecondOrderInfo" style="min-width: 100px">商品名</th>
                         <th  v-if="isShowSecondOrderInfo" style="min-width: 75px">数量</th>
@@ -149,18 +145,18 @@
                     </tr>
 
 
-                    <tr class="tr-yellow text-center"  v-if="orderIssues" v-for="(orderIssue,index) in orderIssues"
+                    <tr class="tr-yellow text-center table-body"  v-if="orderIssues" v-for="(orderIssue,index) in orderIssues"
                         @click="selectedColor(orderIssue.id)" :class="orderIssue.remark ? 'tr_top':''" v-on:mouseover="hidetop($event)" v-on:mouseleave="showtop($event)"
                         :style="[{'font-weight': orderIssue.id===selectedStyle?'bold':''}]">
-                        <td>
+                        <td class="child-layer-1">
                             <div class="m-0 p-0 " :style="[{'min-height':orderIssue.remark ?'72px':'45px'}]">
                                 <input class="checkItem" type="checkbox" :value="orderIssue.id" v-model="checkData">
                             </div>
                         </td>
-                        <td >@{{index+1}}</td>
-                        <td >@{{ orderIssue.id }}</td>
-                        @cannot('客户不可见')
-                        <td >
+                        <td class="child-layer-1">@{{index+1}}</td>
+                        <td class="child-layer-1">@{{ orderIssue.id }}</td>
+                        @cannot('订单管理-问题件-客户不可见')
+                        <td class="child-layer-1">
                             @can('订单管理-问题件-编辑')
                             <button type="button" class="btn btn-sm btn-outline-secondary"
                                     @click="disposeOrderIssue($event)" :data-value="orderIssue.id"
@@ -174,7 +170,7 @@
 
 
                         @can("订单管理-问题件-置顶")
-                        <td class="text-muted">
+                        <td class="text-muted child-layer-1">
                             <button type="button" class="btn btn-sm btn-outline-danger " @click="cancelOnTop($event)" :data-value="orderIssue.top.id" style="opacity: 0.75" v-if="orderIssue.top">
                                 取消
                             </button>
@@ -182,14 +178,14 @@
                                 置顶
                             </button>
                         </td>
-                        <td >@{{ orderIssue.rejecting_status }}</td>{{--退件状态--}}
+                        <td class="child-layer-1">@{{ orderIssue.rejecting_status }}</td>{{--退件状态--}}
                         @endcan
                         @endcannot
 
 
-                        <td >@{{ orderIssue.final_status }}</td>{{--最终状态--}}
-                        @cannot('客户不可见')  {{--登记日期--}}
-                        <td class="toptd td-yellow ">
+                        <td class="child-layer-1">@{{ orderIssue.final_status }}</td>{{--最终状态--}}
+                        @cannot('订单管理-问题件-客户不可见')  {{--登记日期--}}
+                        <td class="toptd td-yellow child-layer-2">
                             <div v-if="orderIssue.remark" class="bg-light-yellow  text-danger top text-left" data-toggle="tooltip" style="opacity: 0.1;position: absolute;z-index: 1">
                                 置顶备注:@{{ orderIssue.remark }}
                             </div>
@@ -197,8 +193,8 @@
                         </td>
                         @endcannot
 
-                        <td class="td-yellow">
-                            @cannot('客户不可见')
+                        <td class="td-yellow child-layer-2">
+                            @cannot('订单管理-问题件-客户不可见')
                             @else
                             <div v-if="orderIssue.remark" class="bg-light-yellow  text-danger top text-left" data-toggle="tooltip" style="opacity: 0.1;position: absolute;z-index: 1">
                                 置顶备注:@{{ orderIssue.remark }}
@@ -207,18 +203,18 @@
                             @{{ orderIssue.order.created_at }}
                         </td>
 
-                        <td class="td-yellow">
+                        <td class="td-yellow child-layer-2">
                             <span v-if='orderIssue.order.owner'>@{{ orderIssue.order.owner.name }}</span>
                         </td>
-                        <td class="td-yellow">
+                        <td class="td-yellow child-layer-2">
                             <template v-if="orderIssue.order.shop">@{{ orderIssue.order.shop.name }}</template>
                         </td>
-                        <td class="td-yellow">
+                        <td class="td-yellow child-layer-2">
                             <template v-if="orderIssue.order"> @{{ orderIssue.order.client_code }}</template>
-                        <td class="td-yellow">
+                        <td class="td-yellow child-layer-2">
                             <span v-if='orderIssue.order.logistic'>@{{ orderIssue.order.logistic.name }}</span>
                         </td>
-                        <td class=" hide-content p-0 td-yellow " valign="middle" align="center">
+                        <td class=" hide-content p-0 td-yellow child-layer-2" valign="middle" align="center">
                             <div :id="'logisticNumbers'+orderIssue.id" :class="orderIssue.order.logisticNumbers.length > 1 ?'collapse ':''">
                                 <p v-for="logisticNumber in orderIssue.order.logisticNumbers" class="m-0 p-0  text-muted ">@{{ logisticNumber }}</p>
                             </div>
@@ -229,20 +225,19 @@
                             </button>
                         </td>
                         {{--商品明细 开始--}}
-                        <td class="td-yellow  p-0 m-0" v-if="!isShowOrderInfo && index===0" style="width:50px" :rowspan="orderIssues.length">
+                        <td class="td-yellow p-0 m-0 child-layer-2" v-if="!isShowOrderInfo && index===0" style="width:50px" :rowspan="orderIssues.length">
                             <span class="btn btn-outline-secondary "  @click="showOrderInfo" :style="orderIssues.length>4 ?'{height: 200px;line-height: 100px':''" >展开运单列</span>
                         </td>
 
-
-                        <td class="td-yellow " v-if="isShowOrderInfo">@{{ orderIssue.order.consignee_name }}</td>
-                        <td class="td-yellow " v-if="isShowOrderInfo">@{{ orderIssue.order.consignee_phone }}</td>
-                        <td class="td-yellow " v-if="isShowOrderInfo">@{{ orderIssue.order.province }}</td>
-                        <td class="td-yellow " v-if="isShowOrderInfo">@{{ orderIssue.order.city }}</td>
-                        <td class="td-yellow " v-if="isShowOrderInfo">@{{ orderIssue.order.district }}</td>
-                        <td class="td-yellow " style="width: 400px" v-if="isShowOrderInfo">
+                        <td class="td-yellow child-layer-2-hide" v-if="isShowOrderInfo">@{{ orderIssue.order.consignee_name }}</td>
+                        <td class="td-yellow child-layer-2-hide" v-if="isShowOrderInfo">@{{ orderIssue.order.consignee_phone }}</td>
+                        <td class="td-yellow child-layer-2-hide" v-if="isShowOrderInfo">@{{ orderIssue.order.province }}</td>
+                        <td class="td-yellow child-layer-2-hide" v-if="isShowOrderInfo">@{{ orderIssue.order.city }}</td>
+                        <td class="td-yellow child-layer-2-hide" v-if="isShowOrderInfo">@{{ orderIssue.order.district }}</td>
+                        <td class="td-yellow child-layer-2-hide" style="width: 400px" v-if="isShowOrderInfo">
                             <span class="text-wrap m-0 p-0 " style="width: 400px">@{{ orderIssue.order.address }}</span>
                         </td>
-                        <td class="td-yellow p-0" :id="orderIssue.id+'items'" colspan="3"
+                        <td class="td-yellow p-0 child-layer-2-hide" :id="orderIssue.id+'items'" colspan="3"
                             v-if="isShowOrderInfo">
                             <div v-if="orderIssue.order">
                                 <table  class="table table-sm m-0" v-if="orderIssue.order.packages"
@@ -267,15 +262,17 @@
 
                         {{--退单商品明细 开始--}}
 {{--                        @cannot('客户不可见')--}}
-                        <td class="p-0 m-0" v-if="!isShowRejectedBill && index === 0 " style="width:50px;" :rowspan="orderIssues.length" >
-                            <span class="btn  btn-outline-secondary "  @click="showRejectedBill"  :style="orderIssues.length>4 ?'{height: 200px;line-height: 100px':''" >展开退单列</span>
-                        </td>
-                        <td class="text-muted" v-if="isShowRejectedBill">
+
+                        <td class="text-muted child-layer-3-hide" v-if="isShowRejectedBill">
                             <template v-if="orderIssue.rejected_bill">
                                 @{{ orderIssue.rejected_bill.logistic_number_return }}
                             </template>
                         </td>
-                        <td class="p-0" :id="orderIssue.id+'rejectedBill'" valign="middle" align="center" colspan="5"
+{{--                        @cannot('订单管理-问题件-客户不可见')--}}
+                        <td class="p-0 m-0 child-layer-3" v-if="!isShowRejectedBill && index === 0 " style="width:50px;" :rowspan="orderIssues.length" >
+                            <span class="btn  btn-outline-secondary "  @click="showRejectedBill"  :style="orderIssues.length>4 ?'{height: 200px;line-height: 100px':''" >展开退单列</span>
+                        </td>
+                        <td class="p-0 child-layer-3-hide" :id="orderIssue.id+'rejectedBill'" valign="middle" align="center" colspan="5"
                             v-if="isShowRejectedBill">
                             <div v-if="orderIssue.rejected_bill" class="m-0 p-0">
                                 <table v-if="orderIssue.rejected_bill.items" class="table table-sm  m-0" :class="orderIssue.rejected_bill.items.length > 1 ? 'collapse' : '' " :id="'rejectedBill'+orderIssue.id"
@@ -298,11 +295,11 @@
 {{--                        @endcannot--}}
                         {{--退单商品明细 结束--}}
 
-                        <td >@{{ orderIssue.result_explain}}</td>
-                        <td ><span v-if="orderIssue.issue_type">@{{ orderIssue.issue_type.name}}</span></td>
+                        <td class="child-layer-3">@{{ orderIssue.result_explain}}</td>
+                        <td class="child-layer-3"><span v-if="orderIssue.issue_type">@{{ orderIssue.issue_type.name}}</span></td>
 
                         {{--处理结果--}}
-                        <td class=" m-0 p-0 log-td " valign="middle" align="center" v-on:mouseover="showAddBtn($event)" v-on:mouseleave="hideAddBtn($event)" colspan="3">
+                        <td class=" m-0 p-0 log-td child-layer-3" valign="middle" align="center" v-on:mouseover="showAddBtn($event)" v-on:mouseleave="hideAddBtn($event)" colspan="3">
                             <div class="addLogD  v row m-0 p-0" :id="'AddLog_'+orderIssue.id" style="display: none">
                                 <input type="hidden" name="id" :value="orderIssue.id">
                                 <div class="form-group m-2">
@@ -342,16 +339,16 @@
                             </div>
                         </td>
                         @cannot('客户不可见')
-                        <td class="p-0 m-0 h-100" v-if="!isShowSecondOrderInfo && index === 0" style="width:50px;" :rowspan="orderIssues.length" >
+                        <td class="p-0 m-0 h-100 child-layer-3" v-if="!isShowSecondOrderInfo && index === 0" style="width:50px;" :rowspan="orderIssues.length" >
                             <span class="btn btn-outline-secondary " @click="showSecondeOrder"   :style="orderIssues.length>4 ?'{height: 200px;line-height: 100px':''">展开运单列</span>
                         </td>
-                        <td v-if="isShowSecondOrderInfo">
+                        <td class="child-layer-3-hide" v-if="isShowSecondOrderInfo">
                             <span v-if="orderIssue.second_order" class="p-0"> @{{ orderIssue.second_order.client_code }}</span>
                         </td>
-                        <td v-if="isShowSecondOrderInfo">
+                        <td class="child-layer-3-hide" v-if="isShowSecondOrderInfo">
                             <span v-if="orderIssue.second_order" class="p-0"> @{{ orderIssue.second_order.logistic.name }}</span>
                         </td>
-                        <td class=" p-0" valign="middle" align="center" v-if="isShowSecondOrderInfo">
+                        <td class="p-0 child-layer-3-hide" valign="middle" align="center" v-if="isShowSecondOrderInfo">
                             <template v-if="orderIssue.second_order">
                                 <div class=" m-0" :id="'secondOrderNumbers'+orderIssue.id"
                                      :class="orderIssue.seconderCount > 1 ? 'collapse':''"
@@ -369,7 +366,7 @@
                                 </button>
                             </template>
                         </td>
-                        <td class=" p-0" colspan="3"v-if="isShowSecondOrderInfo">
+                        <td class="child-layer-3-hide p-0" colspan="3"v-if="isShowSecondOrderInfo">
                             <template v-if="orderIssue.second_order" class=" p-0">
                                 <div class="m-0 p-0" :class="orderIssue.secondeOrderCount > 1 ? 'collapse':''"
                                      :id="'secondOrder'+orderIssue.id">
@@ -394,12 +391,12 @@
                             </template>
                         </td>
                         @endcannot
-                        <td >@{{ orderIssue.logistic_indemnity_money }}</td>
-                        <td >@{{ orderIssue.logistic_express_remission }}</td>
-                        @cannot('客户不可见')
-                        <td >@{{ orderIssue.baoshi_indemnity_money }}</td>
-                        <td >@{{ orderIssue.baoshi_express_remission }}</td>
-                        <td><span
+                        <td class="child-layer-3">@{{ orderIssue.logistic_indemnity_money }}</td>
+                        <td class="child-layer-3">@{{ orderIssue.logistic_express_remission }}</td>
+                        @cannot('订单管理-问题件-客户不可见')
+                        <td class="child-layer-3">@{{ orderIssue.baoshi_indemnity_money }}</td>
+                        <td class="child-layer-3">@{{ orderIssue.baoshi_express_remission }}</td>
+                        <td class="child-layer-3"><span
                                 v-if="orderIssue.user_work_group">@{{ orderIssue.user_work_group.name }}</span>
                         </td>
                         <td>
@@ -465,8 +462,7 @@
                     </div>
                     <div class="modal-body">
                         <input type="hidden" class="form-control" id="onTopId">
-                        <textarea type="text" class="form-control" required id="remark"
-                                  @change="changeRemark"></textarea>
+                        <textarea type="text" class="form-control" required id="remark" @change="changeRemark"></textarea>
                         <div class="invalid-feedback">
                             备注信息不能为空
                         </div>
@@ -561,13 +557,24 @@
                     prevPageUrl: {!! $orderIssues->toJson()  !!}['prev_page_url'],
                     lastPageUrl: {!!  $orderIssues->toJson() !!}['last_page_url'],
                 },
-                isShowOrderInfo:false,
-                isShowRejectedBill: false,
-                isShowSecondOrderInfo: false,
+                isShowOrderInfo:true,
+                isShowRejectedBill: true,
+                isShowSecondOrderInfo: true,
             },
             mounted: function () {
+                this.isShowOrderInfo = false;
+                this.isShowRejectedBill= false;
+                this.isShowSecondOrderInfo= false;
+
+                let tr = $('.table-body')[0];
+                let countShow = $(tr).children('.child-layer-1').length;
+                $('.header-1').attr('colspan',countShow);
+
+
                 $('.tooltipTarget').tooltip({'trigger': 'hover'});
                 $('#list').removeClass("d-none");
+
+                console.log(this.orderIssues);
                 let _this = this;
                 let final_status = [{name: '已解决', value: '已解决'}, {name: '待退回', value: '待退回'}, {
                     name: '退回中',
@@ -602,7 +609,7 @@
                     },
                 ],[
                     {name: 'logistic_indemnity_money', type: 'input', tip: '承运商赔偿金额', placeholder: '承运商赔偿金额'},
-                    @cannot('客户不可见')
+                    @cannot('订单管理-问题件-客户不可见')
                     {
                         name: 'baoshi_indemnity_money', type: 'input', tip: '宝时赔偿金额', placeholder: '宝时赔偿金额'
                     },
@@ -615,7 +622,7 @@
                         data: this.orderIssueType
                     },
                     {name: 'is_handle', type: 'checkbox', tip: '是否已处理', data: [{name: 'ture', value: '已解决'}]},
-                    @endcan
+                    @endcannot
                 ]];
                 this.form = new query({
                     el: '#form_div',
@@ -624,7 +631,6 @@
                 this.form.init();
                 let order = $('.table-head-warning')[0];
                 $('.top').css('min-width', $(order).outerWidth(true));
-
             },
             watch: {
                 checkData: {
@@ -637,6 +643,59 @@
                     },
                     deep: true
                 },
+                isShowOrderInfo(newValue){
+                    let tr = $('.table-body')[0];
+                    setTimeout(function(){
+                        let countShow = $(tr).children('.child-layer-2').length;
+                        let countHide = $(tr).children('.child-layer-2-hide').length;
+                        if(newValue){countHide+=2;}
+                        if(newValue===true){
+                            $('.header-2').attr('colspan',countHide+countShow);
+                        }else{
+                            $('.header-2').attr('colspan',countShow);
+                        }
+                    },2);
+                },
+                isShowRejectedBill(newValue){
+                    let tr = $('.table-body')[0];
+                    let _this = this;
+                    setTimeout(function(){
+                        let countShow = $(tr).children('.child-layer-3').length+2;
+                        let countHide = $(tr).children('.child-layer-3-hide').length;
+                        if(this.isShowRejectedBill){countHide+=4;}
+                        if(this.isShowSecondOrderInfo){countHide+=2;}
+                        if(newValue === true){
+                            countHide+=4;
+                        }
+                        if(_this.isShowSecondOrderInfo === true){
+                            countHide+=2;
+                        }
+                        if(newValue===true){
+                            $('.header-3').attr('colspan',countHide+countShow);
+                        }else{
+                            $('.header-3').attr('colspan',countShow);
+                        }
+                    },2);
+                },
+                isShowSecondOrderInfo(newValue){
+                    let tr = $('.table-body')[0];
+                    let _this = this;
+                    setTimeout(function(){
+                        let countShow = $(tr).children('.child-layer-3').length+2;
+                        let countHide = $(tr).children('.child-layer-3-hide').length;
+                        if(_this.isShowRejectedBill === true){
+                            countHide+=4;
+                        }
+                        if(newValue === true){
+                            countHide+=2;
+                        }
+                        if(newValue===true){
+                            $('.header-3').attr('colspan',countHide+countShow);
+                        }else{
+                            $('.header-3').attr('colspan',countShow+countHide);
+                        }
+                    },2);
+                },
             },
             methods: {
                 selectedColor(orderno) {
@@ -750,7 +809,6 @@
                         });
                     }
                 },
-
                 orderIssueExport(sign) {
                     let url = '{{url('order/issue/export')}}';
                     let token = '{{ csrf_token() }}';

+ 344 - 72
resources/views/order/tracking/index.blade.php

@@ -17,9 +17,9 @@
                             <div class="modal-body container row" style="text-align:center">
                                 <div class="col-2 mt-2" v-for="owner in owners">
                                     <div style="border: 1px solid #aac7ea;height: 80px;text-align: center;line-height: 80px;border-radius: 4px;cursor: pointer"
-                                         :style="[{'background': loggingOwners.includes(Number(owner.name)) ? '#00FF00' : ''},
-                                    {'box-shadow' : seekOwners.includes(owner.name) ? '0px 0px 10px 5px rgba(0,0,0,0.9)' : ''}]"
-                                         @click="addTrackingOwner( owner.id )">@{{ owner.value }}</div>
+                                         :style="[{'background': trackingOwner.includes(Number(owner.name)) ? '#00FF00' : ''},
+                                            {'box-shadow' : trackingOwner.includes(owner.name) ? '0px 0px 10px 5px rgba(0,0,0,0.9)' : ''}]"
+                                         @click="addTrackingOwner(owner.name,owner.value)">@{{ owner.value }}</div>
                                 </div>
                             </div>
                         </div>
@@ -46,67 +46,181 @@
                     @endif
                 </div>
 
-                <table class="table table-sm table-bordered table-hover card-body table-responsive-sm p-0 m-0">
-                    <tr class="text-center">
+                <table class="table table-bordered table-hover   p-0 m-0">
+                    <tr class="text-center" >
                         <th>
                             <input id="all" type="checkbox" @click="checkAll($event)"/>
                         </th>
                         <th>序号</th>
-                        <th>公司</th>
+                        <th style="min-width: 75px">公司</th>
                         <th>订单号</th>
-                        <th>WEB+订单号</th>
-                        <th>提货日期</th>
-                        <th>销售</th>
-                        <th>客户</th>
+                        <th style="min-width: 120px">WEB+订单号</th>
+                        <th style="min-width: 120px"> 提货日期</th>
+                        <th style="min-width: 120px">销售</th>
+                        <th style="min-width: 120px">客户</th>
                         <th>SKU</th>
-                        <th>物料描述</th>
+                        <th style="min-width: 120px">物料描述</th>
                         <th>数量</th>
-                        <th>订单备注</th>
+                        <th style="min-width: 120px">订单备注</th>
                         <th>重量</th>
                         <th>体积</th>
-                        <th>托盘合计</th>
-                        <th>运输方式</th>
+                        <th style="min-width: 120px">托盘合计</th>
+                        <th style="min-width: 120px">运输方式</th>
                         <th>运输单号</th>
-                        <th>到达城市</th>
-                        <th>到达城市</th>
-                        <th>应送达时间</th>
-                        <th>是否赶上卡班</th>
-                        <th>到货情况</th>
-                        <th>签收日期</th>
-                        <th>签收单情况</th>
-                        <th>备注</th>
+                        <th style="min-width: 120px">到达城市</th>
+                        <th style="min-width: 200px">应送达时间</th>
+                        <th style="min-width: 120px">是否赶上卡班</th>
+                        <th style="min-width: 120px">到货情况</th>
+                        <th style="min-width: 200px">签收日期</th>
+                        <th style="min-width: 120px">签收单情况</th>
+                        <th style="min-width: 120px">备注</th>
                     </tr>
+                    <tr v-for="(trackOrder,index) in trackOrders" class="text-center">
+                        <td>
+                            <input id="all" type="checkbox" :value="trackOrder.id" v-model="checkData">
+                        </td>
+                        <td>@{{ index+1 }}</td>
+                        <td>@{{ trackOrder.ownerName }}</td>
+                        <td>@{{ trackOrder.orderClientCode }}</td>
+                        <td>
+                            @can('订单管理-跟踪-仓库编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.web_order_number ?  trackOrder.web_order_number : '点击编辑' }}</button>
+                                <input class="form-control d-none"  @keyup.enter="warehouseUpdate($event,'web_order_number')" :value="trackOrder.web_order_number"  :data_value="trackOrder.id" @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.web_order_number }}
+                            @endcan
+                        </td>
+                        <td>
+                            @can('订单管理-跟踪-仓库编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.pick_up_at ? trackOrder.pick_up_at :'点击编辑' }}</button>
+                                <input class="form-control d-none" type="date"  @keyup.enter="warehouseUpdate($event,'pick_up_at')"  :value="trackOrder.pick_up_at" :data_value="trackOrder.id" @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.pick_up_at }}
+                            @endcan
+                        </td>
+                        <td>
+                            @can('订单管理-跟踪-仓库编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.sale ? trackOrder.sale:'点击编辑' }}</button>
+                                <input class="form-control d-none"  @keyup.enter="warehouseUpdate($event,'sale')"  :value="trackOrder.sale" :data_value="trackOrder.id" @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.sale }}
+                            @endcan
+                        </td>
+                        <td>
+                            @can('订单管理-跟踪-仓库编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.client  ? trackOrder.client:'点击编辑'}}</button>
+                                <input class="form-control d-none"  @keyup.enter="warehouseUpdate($event,'client')"  :value="trackOrder.client" :data_value="trackOrder.id" @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.client }}
+                            @endcan
+                        </td>
+                        <td>@{{ trackOrder.sku.sku }}</td>
+                        <td>@{{ trackOrder.sku.skuName }}</td>
+                        <td>@{{ trackOrder.sku.skuAmount }}</td>
+                        <td>
+                            @can('订单管理-跟踪-仓库编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.order_remark ? trackOrder.order_remark:'点击编辑' }}</button>
+                                <textarea class="form-control d-none"  @keyup.enter="warehouseUpdate($event,'order_remark')"  :value="trackOrder.order_remark" :data_value="trackOrder.id" @blur="hideInput($event)"></textarea>
+                            @else
+                                @{{ trackOrder.client }}
+                            @endcan
+                        </td>
+                        <td>@{{ trackOrder.packageWeight }}</td>
+                        <td>@{{ trackOrder.packageBulk }}</td>
+                        <td>
+                            @can('订单管理-跟踪-仓库编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.pallet_total ? trackOrder.pallet_total:'点击编辑' }}</button>
+                                <input class="form-control d-none" type="number"  @keyup.enter="warehouseUpdate($event,'pallet_total')" :value="trackOrder.pallet_total" :data_value="trackOrder.id" @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.pallet_total }}
+                            @endcan
+                        </td>
+                        <td>@{{ trackOrder.packageLogistic }}</td>
+                        <td>@{{ trackOrder.packageLogisticNumber}}</td>
+                        <td>@{{ trackOrder.orderCity}}</td>
 
-                    <tr v-for="(orderTracking,index) in orderTrackings">
                         <td>
-                            <input id="all" type="checkbox" @click="checkAll($event)"/>
+                            @can('订单管理-跟踪-物流公司编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.planning_sent_at ? trackOrder.planning_sent_at:'点击编辑' }}</button>
+                                <input class="form-control d-none" type="date"  @keyup.enter="logisticUpdate($event,'planning_sent_at')"  :value="trackOrder.planning_sent_at" :data_value="trackOrder.id" @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.planning_sent_at }}
+                            @endcan
+                        </td>
+                        <td>
+                            @can('订单管理-跟踪-物流公司编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.is_on_duty_shift ? trackOrder.is_on_duty_shift :'点击编辑'}}</button>
+                                <input class="form-control d-none"  @keyup.enter="logisticUpdate($event,'is_on_duty_shift')"  :value="trackOrder.is_on_duty_shift" :data_value="trackOrder.id" @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.is_on_duty_shift }}
+                            @endcan
+                        </td>
+                        <td>
+                            @can('订单管理-跟踪-物流公司编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.is_arrival ? trackOrder.is_arrival : '点击编辑' }}</button>
+                                <input class="form-control d-none"  @keyup.enter="logisticUpdate($event,'is_arrival')"  :value="trackOrder.is_arrival" :data_value="trackOrder.id"  @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.is_arrival }}
+                            @endcan
+                        </td>
+                        <td>
+                            @can('订单管理-跟踪-物流公司编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.signed_at ? trackOrder.signed_at : '点击编辑' }}</button>
+                                <input class="form-control d-none" type="date"  @keyup.enter="logisticUpdate($event,'signed_at')" :value="trackOrder.signed_at" :data_value="trackOrder.id"  @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.signed_at }}
+                            @endcan
+                        </td>
+
+                        <td>
+                            @can('订单管理-跟踪-仓库编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.receive_bill_status ? trackOrder.receive_bill_status:'点击编辑' }}</button>
+                                <input class="form-control d-none"  @keyup.enter="warehouseUpdate($event,'receive_bill_status')" :value="trackOrder.receive_bill_status" :data_value="trackOrder.id" @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.receive_bill_status }}
+                            @endcan
+                        </td>
+                        <td>
+                            @can('订单管理-跟踪-仓库编辑')
+                                <button class="btn btn-sm btn-outline-secondary border-50" @click="displayInput($event)">@{{ trackOrder.remark ? trackOrder.remark:'点击编辑'}}</button>
+                                <input class="form-control d-none"  @keyup.enter="warehouseUpdate($event,'remark')"  :value="trackOrder.remark" :data_value="trackOrder.id" @blur="hideInput($event)">
+                            @else
+                                @{{ trackOrder.remark }}
+                            @endcan
                         </td>
-                        <td>@{{ index }}</td>
-                        <td>公司</td>
-                        <td>订单号</td>
-                        <td>WEB+订单号</td>
-                        <td>提货日期</td>
-                        <td>销售</td>
-                        <td>客户</td>
-                        <td>SKU</td>
-                        <td>物料描述</td>
-                        <td>数量</td>
-                        <td>订单备注</td>
-                        <td>重量</td>
-                        <td>体积</td>
-                        <td>托盘合计</td>
-                        <td>运输方式</td>
-                        <td>运输单号</td>
-                        <td>到达城市</td>
-                        <td>到达城市</td>
-                        <td>应送达时间</td>
-                        <td>是否赶上卡班</td>
-                        <td>到货情况</td>
-                        <td>签收日期</td>
-                        <td>签收单情况</td>
-                        <td>备注</td>
                     </tr>
                 </table>
+
+                <button  class="btn btn-sm" :class="page.curPage === 1 ?'':'btn-outline-primary'"
+                         @click="goPage(page.curPage-1)"
+                         :disabled="page.curPage === 1">上一页</button>
+                <button  class="btn btn-sm" :class="page.curPage === page.lastPage ?'':'btn-outline-primary'"
+                         @click="goPage(page.curPage+1)"
+                         :disabled="page.curPage === page.lastPage">下一页</button>
+                <input @keyup.enter="pageTurning($event)" class="form-control-sm ml-3 tooltipTarget"
+                       :placeholder="'当前页数:'+page.curPage+'/'+page.lastPage" title="去往指定页">
+                <span class="text-muted m-1">共 @{{page.total}} 条 </span>
+
+                <div id="alert_modal" class="modal fade " tabindex="-1" aria-hidden="true" >
+                    <div class="modal-dialog modal-dialog-scrollable">
+                        <div class="modal-content">
+                            <div class="modal-header">
+                                <h5 class="modal-title">提示</h5>
+                                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                            </div>
+                            <div class="modal-body p-0">
+                                <div class="alert alert-info m-0" role="alert" >
+                                    是否将@{{ ownerName }} 监听 @{{ status==='启用'?'启用':'禁用' }}
+                                </div>
+                            </div>
+                            <div class="modal-footer ">
+                                <button type="button" class="btn btn-secondary" data-dismiss="modal" >取消</button>
+                                <button type="button" class="btn btn-primary" data-dismiss="modal" @click="changeOwnerTrackingStatus" >确认</button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
             </div>
         </div>
 
@@ -117,31 +231,54 @@
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
-
+    <style type="text/css">
+/*        .border-50 {
+            border: rgb(98, 104, 123);
+        }*/
+    </style>
     <script>
         let tracking_vue = new Vue({
             el:'#tracking_div',
             data:{
-                orderTrackings:[],
+                trackOrders:{!! $trackOrders->toJson() !!}['data'],
                 owners:[@foreach($owners as $owner){name: '{{ $owner->id }}', value: '{{ $owner->name}}'},@endforeach],
                 from:'',
-                checkData:'',
+                checkData:[],
                 seekOwners : [],
                 name : "",
-                loggingOwners : [],
+                trackingOwner : [],
+                status:'',
+                ownerName:'',
+                page: {
+                    lastPage: {!! $trackOrders->toJson() !!}['last_page'],
+                    curPage: {!!  $trackOrders->toJson() !!}['current_page'],
+                    total: {!!  $trackOrders->toJson() !!}['total'],
+                    nextPageUrl: {!! $trackOrders->toJson() !!}['next_page_url'],
+                    prevPageUrl: {!! $trackOrders->toJson()  !!}['prev_page_url'],
+                    lastPageUrl: {!! $trackOrders->toJson() !!}['last_page_url'],
+                },
             },
             mounted:function(){
+                let selectDate = [
+                    {name:'31',value:'近一月'},
+                    {name:'92',value:'近三月'},
+                    {name:'183',value:'近半年'},
+                    {name:'366',value:'近一年'},
+                    {name:'0',value: '不限'},
+                ];
+
+
                 $('.tooltipTarget').tooltip({'trigger': 'hover'});
                 $("#list").removeClass('d-none');
                 let _this = this;
                 let data = [
                     [
                         {name:'start_at',type:'dateTime',tip:'起始日期',placeholder:'起始日期'},
-                        {name:'owner_id',type:'select_multiple_select', tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的客户'],
-                            placeholder: ['货主', '定位或多选货主'],
-                            data: _this.owners},
+                        {name:'owner_id',type:'select_multiple_select', tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的客户'], placeholder: ['货主', '定位或多选货主'], data: _this.owners},
                         {name:'client_code',type:'input',tip:'订单号',placeholder:'订单号'},
-                        {name:'client',type:'input',tip:'货主',placeholder:'货主'},
+                        {name:['client','addtime'],type:'input_select',tip:['右侧选择查询范围,默认为一月内','查询范围,范围越短搜索越快'],placeholder: ['客户',''],
+                            data:selectDate, rules:[{son:{addtime:{default:'31',required_without_all_if:['orderdate_start','orderdate_end']}}},
+                                {date_relevance:{date:['start_at','end_at'],relevance:'addtime',killing:'date',default:[31,92,183,366]}}]},
                     ],
                     [
                         {name:'end_at',type:'dateTime',tip:'结束日期',placeholder: '结束日期'},
@@ -157,7 +294,7 @@
             watch:{
                 checkData: {
                     handler() {
-                        if (this.checkData.length === this.orderTrackings.length && this.checkData.length !== 0) {
+                        if (this.checkData.length === this.trackOrders.length && this.checkData.length !== 0) {
                             document.querySelector('#all').checked = true;
                         } else {
                             document.querySelector('#all').checked = false;
@@ -169,19 +306,25 @@
             methods:{
                 checkAll(e){
                     if (e.target.checked) {
-                        this.orderTrackings.forEach((el, i) => {
-                            if (this.checkData.indexOf(el.id) === -1) {
+                        this.trackOrders.forEach((el, i) => {
+                            if (this.checkData.indexOf(el.id) === -1)
                                 this.checkData.push(el.id);
-                            }
                         });
                     } else {
                         this.checkData = [];
                     }
                 },
+                selectedColor(id) {
+                    if (id === this.selectedStyle) {
+                        this.selectedStyle = '';
+                        return;
+                    }
+                    this.selectedStyle = id;
+                },
                 openModal(){
                     let url = "{{url('apiLocal/order/trackingOwner/all')}}";
                     axios.post(url).then(res=>{
-                        this.loggingOwners = res.data;
+                        this.trackingOwner = res.data;
                         $("#modal").modal('show');
                     });
                 },
@@ -190,27 +333,156 @@
                     let name = this.name;
                     let seekOwners = [];
                     this.owners.forEach(function (owner) {
-                        if ((owner.value).indexOf(name) !== -1){
-                            seekOwners.push(owner.name);
-                        }
+                        if ((owner.value).indexOf(name) !== -1){seekOwners.push(owner.name);}
                     });
                     if (seekOwners.length > 0)this.seekOwners = seekOwners;
                 },
-                addTrackingOwner(owner_id,name){
+                addTrackingOwner(owner_id,owner_name) {
+                    let status = '启用';
+                    owner_id = Number.parseInt(owner_id);
+                    if (this.trackingOwner.indexOf(owner_id) > -1) {status = '禁用';}
+                    this.status = status;
+                    this.ownerName = owner_name;
+                    this.ownerId = owner_id;
+                    $("#alert_modal").modal('show');
+                },
+                changeOwnerTrackingStatus(){
+                    let _this = this
+                    let data= {owner_id: this.ownerId,status: this.status };
+                    axios.post('{{url("apiLocal/order/trackingOwner/updateStatus")}}',data).then(function(res){
+                        if(res.data.success){
+                            if(_this.status === '启用'){_this.trackingOwner.push(_this.ownerId);
+                            }else{_this.trackingOwner.splice(_this.trackingOwner.indexOf(_this.ownerId),1);}
+                        }else{
+                            tempTip.setDuration(3000);
+                            tempTip.show(this.status+'货主'+owner_name+'监听失败')
+                        }
+                    }).catch(function(err){
+                        tempTip.setDuration(3000);
+                        tempTip.show('网络异常'+err);
+                    });
+                },
+                hideInput(e){
+                    let input = $(e.target);
+                    let button = input.prev('button').show();
+                    input.addClass('d-none');
+                },
+                warehouseUpdate(e,param){ // 仓库编辑
+                    let input = $(e.target);
+                    let id = input.attr('data_value'),value = input.val();
+                    let trackOrder = this.getTrackOrder(id);
+                    let data = {id:id,param:param,value:value}
 
+                    if(!trackOrder){
+                        return ;
+                    }else{
+                        if(trackOrder[param] === value){
+                            input.addClass('d-none');
+                            input.prev('button').show();
+                            return;
+                        }
+                    }
+                    // ajax 请求
+                    let _this = this;
+                    axios.post('{{url("apiLocal/order/tracking/warehouseUpdate")}}',data).then(function(res){
+                        if(res.data.success){
+                            tempTip.setDuration(2000);
+                            tempTip.showSuccess('更新成功');
+                            _this.setTrackOrder(data);
+                            input.addClass('d-none');
+                            input.prev('button').show();
+                        }else{
+                            tempTip.setDuration(2000);
+                            tempTip.show('更新失败');
+                            input.val(trackOrder[param]);
+                        }
+                    }).catch(function(err){
+                        tempTip.setDuration(4000);
+                        tempTip.show('更新失败:'+err);
+                        input.val(trackOrder[param]);
+                    })
                 },
-                selectedColor(id) {
-                    if (id === this.selectedStyle) {
-                        this.selectedStyle = '';
-                        return;
+                logisticUpdate(e,param){  // 物流公司编辑
+                    let input = $(e.target);
+                    let id = input.attr('data_value'),value = input.val();
+                    let trackOrder = this.getTrackOrder(id);
+                    if(!trackOrder ){
+                        return ;
+                    }else{
+                        if(trackOrder[param] === value){
+                            input.addClass('d-none');
+                            input.prev('button').show();
+                            return;
+                        }
                     }
-                    this.selectedStyle = id;
+                    let data = {id:id,param:param,value:value}
+                    // ajax 请求
+                    let _this = this;
+                    axios.post('{{url("apiLocal/order/tracking/logisticUpdate")}}',data).then(function(res){
+                        if(res.data.success){
+                            tempTip.setDuration(2000);
+                            tempTip.showSuccess('更新成功');
+                            _this.setTrackOrder(data);
+                            input.addClass('d-none');
+                            input.prev('button').show();
+                        }else{
+                            tempTip.setDuration(2000);
+                            tempTip.show('更新失败');
+                            input.val(trackOrder[param]);
+                        }
+                    }).catch(function(err){
+                        tempTip.setDuration(4000);
+                        tempTip.show('更新失败:'+err);
+                        input.val(trackOrder[param]);
+                    })
+                },
+                getTrackOrder(id){
+                    return this.trackOrders.filter(function(trackOrder){
+                        return parseInt(id) === trackOrder['id'];
+                    });
+                },
+                setTrackOrder(data){
+                    this.trackOrders.forEach(function(trackOrder){
+                        if(parseInt(data['id']) === trackOrder['id'] ){
+                            trackOrder[data['param']] = data['value'];
+                            return;
+                        }
+                    });
+                },
+                displayInput(e){
+                    let button = $(e.target);
+                    let input = button.next('.form-control');
+                    button.hide();
+                    input.removeClass('d-none').focus();
                 },
                 exportSelect:function(){
-
+                    let url = '{{url('order/tracking/export')}}';
+                    let token = '{{ csrf_token() }}';
+                    excelExport(false, this.checkData, url, this.page.total, token);
                 },
                 exportAll:function(){
-
+                    let url = '{{url('order/tracking/export')}}';
+                    let token = '{{ csrf_token() }}';
+                    excelExport(true, this.checkData, url, null, token);
+                },
+                pageTurning(e){
+                    let page = $(e.target).val();
+                    if (page > this.page.lastPage) {
+                        return;
+                    }
+                    this.goPage(page);
+                },
+                goPage(page){
+                    let href = window.location.href;
+                    if(href.indexOf('?')===-1){
+                        href+='?'
+                    }
+                    if(href.indexOf('page=')!==-1){
+                        href = href.replace('page='+this.page.curPage,'page='+page);
+                    }else{
+                        href+='&page='+page;
+                    }
+                    window.location = href;
                 },
             }
         });

+ 2 - 5
resources/views/store/checkingReceive/menu.blade.php

@@ -4,12 +4,9 @@
             <ul class="nav nav-pills">
                 @can('入库管理-盘收一体-任务')
                     <li class="nav-item">
-                        <a class="nav-link" href="{{url('store/checkReceive/mission')}}" :class="{active:isActive('checkReceive',2)}">任务</a>
-                    </li> @endcan
-                @can('入库管理-盘收一体-盘收')
-                    <li class="nav-item">
-                        <a class="nav-link" href="{{url('store/fast')}}" :class="{active:isActive('',3)}">记录</a>
+                        <a class="nav-link" href="{{url('store/checkReceive/mission')}}" :class="{active:isActive('',4)}">任务</a>
                     </li> @endcan
+                {{$slot}}
             </ul>
         </div>
     </div>

+ 67 - 23
resources/views/store/checkingReceive/mission.blade.php

@@ -11,16 +11,19 @@
         <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
             <div class="modal-content">
                 <div class="modal-body" style="text-align:center;height: 150px">
-                    <div class="custom-control custom-checkbox mt-2 mb-3">
-                        <input type="checkbox" class="custom-control-input" id="isCovering" v-model="excel.isCovering">
-                        <label class="custom-control-label" for="isCovering">覆盖原有已存在信息</label>
+                    <button type="button" id="popover" class="btn btn-danger"
+                            data-container="body" data-toggle="popover" data-placement="bottom"
+                            :data-content="popoverContent" data-html="true">
+                        部分数据导入失败
+                    </button>
+                    <div class="mt-5">
+                        <label>
+                            <input name="file" hidden type="file" class="col-5" id="excelFile" @change="getFile($event)"
+                                   accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">
+                        </label>
+                        <button class="btn btn-dark col-5" @click="$('#excelFile').trigger('click');">选择Excel文件</button><br>
+                        <small class="text-primary">@{{ excel.file ? excel.file.name : '' }}</small>
                     </div>
-                    <label>
-                        <input name="file" hidden type="file" class="col-5" id="excelFile" @change="getFile($event)"
-                               accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">
-                    </label>
-                    <button class="btn btn-dark col-5" @click="$('#excelFile').trigger('click');">选择Excel文件</button><br>
-                    <small class="text-primary">@{{ excel.file ? excel.file.name : '' }}</small>
                 </div>
                 <div class="modal-footer">
                     <button class="col-12 btn btn-success" @click="importMission()">开始导入</button>
@@ -31,7 +34,7 @@
 
     <div id="form_div"></div>
     <div class="ml-2">
-        <button class="btn btn-sm btn-outline-info" data-toggle="modal" data-target="#import">导入</button>
+        <button class="btn btn-sm btn-outline-info" @click="openImport()">导入</button>
     </div>
 
     <label for="all" class="d-none" id="cloneCheckAll">
@@ -45,13 +48,18 @@
                 <label><input class="checkItem" type="checkbox" :value="storeCheckingReceives.id" v-model="checkData" /></label>
             </td>
             <td>@{{ i+1 }}</td>
-            <td>@{{ storeCheckingReceives.owner_name }}</td>
-            <td>@{{ storeCheckingReceives.status }}</td>
-            <td>@{{ storeCheckingReceives.is_receive_diff }}</td>
-            <td>@{{ storeCheckingReceives.asn }}</td>
-            <td>@{{ storeCheckingReceives.is_asn_diff }}</td>
-            <td>@{{ storeCheckingReceives.created_at }}</td>
-            <td></td>
+            <td>@{{ storeCheckingReceive.id }}</td>
+            <td>@{{ storeCheckingReceive.owner_name }}</td>
+            <td>@{{ storeCheckingReceive.status }}</td>
+            <td>@{{ storeCheckingReceive.is_receive_diff }}</td>
+            <td>@{{ storeCheckingReceive.asn }}</td>
+            <td>@{{ storeCheckingReceive.is_asn_diff }}</td>
+            <td>@{{ storeCheckingReceive.created_at }}</td>
+            <td>
+                @can('入库管理-盘收一体-盘收')<a target="_blank" :href="'{{url('store/checkReceive/mission')}}/'+storeCheckingReceive.id">
+                    <button class="btn btn-sm btn-outline-success">盘收</button>
+                </a>@endcan
+            </td>
         </tr>
     </table>
     {{$storeCheckingReceives->appends($params)->links()}}
@@ -82,11 +90,9 @@
                 checkData:[],
                 sum:Number('{{$storeCheckingReceives->total()}}'),
                 excel : {
-                    isCovering:'',
                     file : null,
                 },
-
-
+                popoverContent:'',
             },
             mounted(){
                 $('#container').removeClass('d-none');
@@ -109,6 +115,7 @@
                     {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
                         dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
+                    {name:'id',value: 'ID', neglect: true},
                     {name:'owner_name',value: '货主'},
                     {name:'status',value: '状态'},
                     {name:'is_receive_diff',value: '收货差异'},
@@ -141,6 +148,10 @@
                 getFile(e){
                     this.excel.file = e.target.files[0];
                 },
+                openImport(){
+                    $("#popover").attr('hidden','hidden');
+                    $('#import').modal('show');
+                },
                 importMission(){
                     if (!this.excel.file){
                         tempTip.setDuration(3000);
@@ -149,16 +160,49 @@
                         return;
                     }
                     let formData = new FormData();
-                    formData.append("isCovering",this.excel.isCovering);
                     formData.append("file",this.excel.file);
                     axios.post('{{url('store/checkReceive/mission/import')}}',formData,{
                         'Content-Type':'multipart/form-data'
                     })
                     .then(res=>{
+                        if (res.data.success){
+                            let receive = res.data.data;
+                            let storeCheckingReceive = {
+                                id:receive.id,owner_name:receive.owner_name,created_at:receive.created_at,
+                                status:receive.status,is_receive_diff:receive.is_receive_diff,asn:receive.asn,
+                                is_asn_diff:receive.is_asn_diff
+                            };
+                            this.storeCheckingReceives.unshift(storeCheckingReceive);
+                            console.log(this.storeCheckingReceives);
+                            if (res.data.errors.length < 1) $("#import").modal('hide');
+                            else this.writeErrorText(res.data.errors);
 
-                    }).catch(err=>{
-
+                            tempTip.setDuration(2000);
+                            tempTip.setIndex(1099);
+                            tempTip.showSuccess("任务导入成功");
+                            return true;
+                        }
+                        if (res.data.errors && res.data.errors.length > 0){
+                            this.writeErrorText(res.data.errors)
+                            return true;
+                        }
+                        tempTip.setDuration(3000);
+                        tempTip.setIndex(1099);
+                        tempTip.show(res.data.data);
+                    }).catch(err=> {
+                        tempTip.setDuration(3000);
+                        tempTip.show("网络错误:"+err);
                     })
+                },
+                writeErrorText(errors){
+                    let content = '';
+                    for (let i in errors){
+                        content += errors[i]+"</br>";
+                    }
+                    this.popoverContent = content;
+                    setTimeout(function () {
+                        $("#popover").removeAttr('hidden').popover('show');
+                    },0);
                 }
             },
         });

+ 429 - 0
resources/views/store/checkingReceive/show.blade.php

@@ -0,0 +1,429 @@
+@extends('layouts.app')
+@section('title')盘收一体-任务@endsection
+
+@section('content')
+    <div id="container" class="d-none container-fluid">
+        <span>
+            @component('store.menu')@endcomponent
+            @component('store.checkingReceive.menu')
+                @can('入库管理-盘收一体-盘收')
+                <li class="nav-item">
+                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('mission',3)}">盘收</a>
+                </li>@endcan
+            @endcomponent
+        </span>
+        <div class="row m-2 card">
+            <audio src="{{asset('sound/warning_otherBarcode.mp3')}}" controls="controls" preload id="soundWarning" hidden>
+            </audio>
+            <audio src="{{asset('sound/ding.mp3')}}" controls="controls" preload id="soundDing" hidden>
+            </audio>
+            <div class="card-body col-12">
+                <div class="col-12">
+                    <p class="text-muted small" v-if="inputMode=='regular'">常规:可输入效期,相同条码记录不会合并</p>
+                    <p class="text-muted small" v-if="inputMode=='increasing'">逐一扫描:处理单一重复商品,每扫一次对应隔口总数量自动递增,扫到不同条码会提示</p>
+                    <p class="text-muted small" v-if="inputMode=='multiIncreasing'">边扫边分:处理多种商品,自动将扫到的不同条码数量递增到各自隔口号</p>
+                    <ul class="nav nav-tabs mb-4 mt-n3">
+                        <li class="nav-item"><a style="cursor: pointer" class="nav-link text-primary" :class="inputMode=='regular'?'active':''"
+                            @click="switchMenu('regular')">常规</a></li>
+                        <li class="nav-item"><a style="cursor: pointer" class="nav-link text-primary" :class="inputMode=='increasing'?'active':''"
+                            @click="switchMenu('increasing')">逐一扫描</a></li>
+                        <li class="nav-item"><a style="cursor: pointer" class="nav-link text-primary" :class="inputMode=='multiIncreasing'?'active':''"
+                            @click="switchMenu('multiIncreasing')">边扫边分</a></li>
+                    </ul>
+                </div>
+                <div class="col-12 row">
+                    <div class="col-6">
+                        <div v-if="inputMode=='regular'">
+                            <div class="btn btn-sm btn-outline-primary" v-if="status.barcodeDisable" @click="status.barcodeDisable=false">手动输入</div>
+                            <div class="btn btn-sm btn-outline-danger" v-if="!status.barcodeDisable" @click="status.barcodeDisable=true">扫描输入</div>
+                        </div>
+                        <input type="text" id="barcode" class="form-control"
+                               :placeholder="status.barcodeDisable ? '扫入条码' : '输入条码'" :disabled="status.barcodeDisable" v-model="inputting.barcode" :class="inputMode=='regular' ? '' : 'mt-4'" {{-- @focusin="focusOutDocument" @focusout="focusDocument" --}}>
+
+                        <div v-if="inputMode=='regular'">
+                        <div class="card-title">生产日期:</div>
+                        <input type="date" class="form-control mb-2"
+                               {{--v-model="inputting.produce_date" @focusin="focusOutDocument" @focusout="focusDocument" @keyup="oninputEnter"--}}>
+
+                        <div class="card-title">失效日期:</div>
+                        <input type="date" class="form-control mb-2"
+                               {{--v-model="inputting.valid_date" @focusin="focusOutDocument" @focusout="focusDocument" @keyup="oninputEnter"--}}>
+                        </div>
+                    </div>
+                    <div class="col-6">
+                        <div class="card-title" id="amountLabel">手动输入数量:</div>
+                        <div class="input-group mt-n2 mb-2">
+                            <input type="number" id="amount" style='height: 40px;font-size: 1.6em;color:blue;font-weight: bolder;padding: 3px;text-align: center' class="form-control" placeholder=""
+                                   :disabled="status.amountDisable" v-model="inputting.amount"{{--  @focusin="focusOutDocument" @focusout="focusDocument" @keyup="oninputEnter"--}}>
+                        </div>
+
+                        <div class="card-title">格口号:</div>
+                        <input type="number" id="bin" class="form-control mt-n2 mb-2" style='height: 80px;font-size: 5em;color:red;font-weight: bolder;padding: 3px;text-align: center'
+                               v-model="inputting.bin"{{-- :disabled="status.binDisable" @focusin="focusOutDocument" @focusout="focusDocument" @keyup="oninputEnter"--}}>
+
+                        <div v-if="inputMode=='regular'">
+                            <div class="card-title">批次号:</div>
+                            <input type="text" class="form-control mb-2"
+                                   v-model="inputting.batch_number"{{-- @focusin="focusOutDocument" @focusout="focusDocument" @keyup="oninputEnter"--}}>
+                        </div>
+                    </div>
+                    <div class="col-12" v-if="status.commitButtonVisible && inputMode=='regular'" >
+                        <button class="btn btn-success btn form-control" @click="commitGoods">确定</button>
+                    </div>
+                </div>
+                <p class="card-text text-muted mt-3 mb-n3 text-center">已完成:</p>
+                <hr>
+                <table class="table table-sm  table-striped" {{--v-if="goodses.length>0"--}}>
+                    <tr>
+                        <th>隔口号</th>
+                        <th>数量</th>
+                        <th>条码</th>
+                        <th>生产日期</th>
+                        <th>失效日期</th>
+                        <th>批次号</th>
+                        <th>操作</th>
+                    </tr>
+                    {{--<tr v-for="goods in goodses">
+                        <td>@{{ goods.bin }}</td>
+                        <td>@{{ goods.amount }}</td>
+                        <td>@{{ goods.barcode }}</td>
+                        <td>@{{ goods.produce_date }}</td>
+                        <td>@{{ goods.valid_date }}</td>
+                        <td>@{{ goods.batch_number }}</td>
+                        <td><button class="btn btn-outline-danger btn-sm" @click="removeGoods($event,goods.barcode)">删</button></td>
+                    </tr>--}}
+                </table>
+                <hr>
+                <span class="btn btn-outline-success btn form-control" style="cursor: pointer">确定生成该批盘收</span>
+            </div>
+        </div>
+        <div class="ml-2 mt-2">
+            <button class="btn btn-sm btn-outline-dark">导出</button>
+            <button class="btn btn-sm btn-outline-danger">重新清点</button>
+            <button class="btn btn-sm btn-outline-success">匹配ASN单据</button>
+        </div>
+        <div class="row text-primary ml-1 mr-2 mt-1 mb-1 w-100" style="background-color: #c3e3b5">
+            <span class="ml-1">任务ID: <b class="text-dark">@{{ storeCheckingReceive.id }}</b></span>
+            <span class="ml-3">货主: <b class="text-dark">@{{ storeCheckingReceive.owner_name }}</b></span>
+            <span class="ml-3">创建时间: <b class="text-dark">@{{ storeCheckingReceive.created_at }}</b></span>
+            <span class="ml-3">ASN号: <b class="text-dark">@{{ storeCheckingReceive.asn }}</b></span>
+        </div>
+        <table class="table table-sm text-nowrap table-bordered d-none" id="headerRoll"></table>
+        <table class="table table-striped table-sm text-nowrap table-hover mt-1" id="headerParent">
+            <tr id="header"></tr>
+            <tr v-for="(storeCheckingReceiveItem,i) in storeCheckingReceiveItems">
+                <td>@{{ i+1 }}</td>
+                <td>@{{ storeCheckingReceiveItem.id }}</td>
+                <td>@{{ storeCheckingReceiveItem.bin_number }}</td>
+                <td>@{{ storeCheckingReceiveItem.commodity_name }}</td>
+                <td>
+                    <span v-for="commodity_barcode in storeCheckingReceiveItem.commodity_barcodes">
+                        <small>@{{ commodity_barcode.code }}</small><br>
+                    </span>
+                </td>
+                <td>@{{ storeCheckingReceiveItem.imported_amount }}</td>
+                <td>@{{ storeCheckingReceiveItem.counted_amount }}</td>
+                <td>@{{ storeCheckingReceiveItem.asn_amount }}</td>
+                <td>@{{ storeCheckingReceiveItem.imported_diff_amount }}</td>
+                <td>@{{ storeCheckingReceiveItem.asn_diff_amount }}</td>
+                <td>@{{ storeCheckingReceiveItem.produced_at }}</td>
+                <td>@{{ storeCheckingReceiveItem.invalid_at }}</td>
+                <td>@{{ storeCheckingReceiveItem.batch_code }}</td>
+                <td>@{{ storeCheckingReceiveItem.unique_code }}</td>
+            </tr>
+        </table>
+    </div>
+@stop
+
+@section('lastScript')
+<script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
+<script>
+    new Vue({
+        el:"#container",
+        data:{
+            storeCheckingReceive:{id:'{{$storeCheckingReceive->id}}',owner_name:'{{$storeCheckingReceive->owner ? $storeCheckingReceive->owner->name : ''}}',
+                                created_at:'{{$storeCheckingReceive->created_at}}',asn:'{{$storeCheckingReceive->asn}}'},
+            storeCheckingReceiveItems:[
+                @foreach($storeCheckingReceive->storeCheckingReceiveItems as $storeCheckingReceiveItem)
+                {id:'{{$storeCheckingReceiveItem->id}}',bin_number:'{{$storeCheckingReceiveItem->bin_number}}',
+                commodity_name:"{{$storeCheckingReceiveItem->commodity ? $storeCheckingReceiveItem->commodity->name : ''}}",
+                commodity_barcodes:{!! $storeCheckingReceiveItem->commodity ? ($storeCheckingReceiveItem->commodity->barcodes ? $storeCheckingReceiveItem->commodity->barcodes : []) : [] !!},
+                imported_amount:'{{$storeCheckingReceiveItem->imported_amount}}',counted_amount:'{{$storeCheckingReceiveItem->counted_amount}}',
+                asn_amount:'{{$storeCheckingReceiveItem->asn_amount}}',imported_diff_amount:'{{$storeCheckingReceiveItem->imported_diff_amount}}',
+                asn_diff_amount:'{{$storeCheckingReceiveItem->asn_diff_amount}}',produced_at:'{{$storeCheckingReceiveItem->produced_at}}',
+                invalid_at:'{{$storeCheckingReceiveItem->invalid_at}}',batch_code:'{{$storeCheckingReceiveItem->batch_code}}',
+                unique_code:'{{$storeCheckingReceiveItem->unique_code}}'}
+                @endforeach
+            ],
+            inputMode : 'regular',
+            status:{
+                barcodeDisable : true,
+                commitButtonVisible:false,
+                scanEndInputted:false,
+                amountDisable : false,
+            },
+            focusing : 'document',
+            inputting:{
+                barcode : '',
+                amount : '',
+                bin : '',
+                batch_number : '',
+            },
+            goodses : [],
+        },
+        mounted(){
+            $('#container').removeClass('d-none');
+            $(".tooltipTarget").tooltip({'trigger':'hover'});
+            let column = [
+                {name:'index',value: '序号', neglect: true},
+                {name:'id',value: 'ID', neglect: true},
+                {name:'bin_number',value: '格口号'},
+                {name:'commodity_name',value: '商品名'},
+                {name:'commodity_barcode',value: '商品条码'},
+                {name:'imported_amount',value: '导入数量', neglect: true},
+                {name:'counted_amount',value: '实盘数量', neglect: true},
+                {name:'asn_amount',value: 'ASN数量', neglect: true},
+                {name:'imported_diff_amount',value: '导入差异数', neglect: true},
+                {name:'asn_diff_amount',value: 'ASN差异数', neglect: true},
+                {name:'produced_at',value: '生产日期'},
+                {name:'invalid_at',value: '有效期'},
+                {name:'batch_code',value: '批次号'},
+                {name:'unique_code',value: '唯一码'},
+            ];
+            let header = new Header({
+                el: "#header",
+                column: column,
+                data: this.storeCheckingReceiveItems,
+                restorationColumn: 'id',
+            });
+            header.init();
+            this.scanListening();
+        },
+        methods:{
+            switchMenu(menuName){
+                this.inputMode = menuName;
+                this.inputting.barcode='';
+                if (menuName === 'regular') {
+                    this.status.amountDisable = false;
+                    $('#amountLabel').text('输入数量:');
+                }else {
+                    this.status.amountDisable = true;
+                    $('#amountLabel').text('自动扫入数量:');
+                }
+            },
+            scanListening: function () {
+                let _this = this;
+                $(document).on('keypress', function (e) {
+                    if(_this.focusing!=='document'){return}
+                    if(!_this.status.barcodeDisable){return}
+                    if (e.keyCode !== 13) {
+                        if(_this.status.scanEndInputted){
+                            _this.inputting.barcode='';
+                            _this.status.scanEndInputted=false;
+                        }
+                        _this.inputting.barcode += String.fromCharCode(e.keyCode);
+                    } else {
+                        if(_this.inputting.barcode.length<=1){
+                            window.tempTip.setDuration(4500);
+                            window.tempTip.show('未扫入条码,请检查扫码枪设置,尝试调至“直接键盘输出”模式');
+                            return;
+                        }
+                        _this.status.scanEndInputted = true;
+                        _this.showCommitButton();
+                        _this.autoFillBin();
+                        switch(_this.inputMode){
+                            case 'increasing': _this.commitGoodsOnIncreasingMode();break;
+                            case 'multiIncreasing': _this.commitGoodsOnMultiIncreasingMode();break;
+                        }
+                    }
+                });
+            },
+            showCommitButton: function () {
+                if(this.inputting.barcode && this.inputting.amount && this.inputting.bin){
+                    if (this.status.commitButtonVisible){
+                        this.commitGoods();
+                        this.status.commitButtonVisible=false;
+                    }else this.status.commitButtonVisible=true;
+                }
+            },
+            commitGoods: function () {
+                window.tempTip.setDuration(3500);
+                if(!this.inputting.barcode){window.tempTip.show('请扫入条码');return;}
+                else if(!this.inputting.amount){window.tempTip.show('请输入数量');return;}
+                else if(!this.inputting.bin){window.tempTip.show('请输入隔口号');return;}
+                this.recordOrPlusGoods();
+                window.tempTip.setDuration(1500);
+                window.tempTip.showSuccess('成功提交:' + data.inputting.barcode);
+                this.cleanInputs();
+                this.audioDing();
+            },
+            cleanInputs: function () {
+                this.changeToScanInputBarcode();
+                this.inputting.barcode='';
+                this.inputting.amount='';
+                this.inputting.bin='';
+                this.inputting.produce_date='';
+                this.inputting.valid_date='';
+                this.inputting.batch_number='';
+                this.status.commitButtonVisible=false;
+                this.status.binDisable=false;
+            },
+            autoFillBin: function () {
+                let data = this;
+                let isNotRepeatingBarcode=this.goodses.every(function(goods){
+                    if(goods.barcode===data.inputting.barcode){
+                        data.inputting.bin=goods.bin;
+                        data.status.binDisable=true;
+                        return false;
+                    }
+                    return true;
+                });
+                if(isNotRepeatingBarcode){
+                    data.status.binDisable=false;
+                }
+            },
+            commitGoodsOnIncreasingMode: function () {
+                let data = this;
+
+                function doIt() {
+                    let repeatedBarcode = data.repeatedIncreasingBarcodeFromSaved();
+
+                    function increase() {
+                        data.inputting.bin = repeatedBarcode.bin;
+                        repeatedBarcode.amount++;
+                        data.inputting.amount = repeatedBarcode.amount;
+                        window.tempTip.setDuration(500);
+                        window.tempTip.showSuccess(repeatedBarcode.amount);
+                        data.focusDocument();
+                        data.audioDing();
+                    }
+
+                    if (!repeatedBarcode) {
+                        data.focusOutDocument();
+                        data.alertVibrate();
+                        window.tempTip.setInputType('number');
+                        window.tempTip.inputVal('该商品第一件递增请输入隔口号:', function (bin) {
+                            if (bin === '') {
+                                window.tempTip.setDuration(1500);
+                                window.tempTip.show('未输入隔口号,请重新扫描');
+                                data.alertVibrate();
+                                data.focusDocument();
+                                return
+                            }
+                            data.inputting.bin = bin;
+                            data.inputting.amount = 1;
+                            data.goodses.unshift(JSON.parse(JSON.stringify(data.inputting)));
+                            data.status.binDisable = true;
+                            window.tempTip.setDuration(500);
+                            window.tempTip.showSuccess('保存成功');
+                            data.focusDocument();
+                            data.audioDing();
+                        })
+                    } else {
+                        increase();
+                    }
+                }
+
+                if (data.lastScannedBarcode !== data.inputting.barcode && data.lastScannedBarcode) {
+                    data.audioWarning_otherBarcode();
+                    data.focusOutDocument();
+                    window.tempTip.confirm('扫到其它条码,是否切换至新条码并记录?', doIt, function () {
+                        data.inputting.barcode = data.lastScannedBarcode;
+                        data.focusDocument();
+                    })
+                } else {
+                    doIt()
+                }
+            },
+            commitGoodsOnMultiIncreasingMode: function () {
+                let data = this;
+                let repeatedBarcode=this.repeatedIncreasingBarcodeFromSaved();
+                function increase(){
+                    data.inputting.bin=repeatedBarcode.bin;
+                    repeatedBarcode.amount++;
+                    data.inputting.amount=repeatedBarcode.amount;
+                    window.tempTip.setDuration(500);
+                    window.tempTip.showSuccess(repeatedBarcode.amount);
+                    data.focusDocument();
+                    data.audioDing();
+                }
+                if(!repeatedBarcode){
+                    data.focusOutDocument();
+                    data.alertVibrate();
+                    window.tempTip.setInputType('number');
+                    window.tempTip.inputVal('该商品第一件递增请输入隔口号:',function(bin){
+                        if(bin===''){
+                            window.tempTip.setDuration(1500);
+                            window.tempTip.show('未输入隔口号,请重新扫描');
+                            data.alertVibrate();
+                            data.focusDocument();return}
+                        data.inputting.bin=bin;
+                        data.inputting.amount=1;
+                        data.goodses.unshift(JSON.parse(JSON.stringify(data.inputting)));
+                        data.status.binDisable=true;
+                        window.tempTip.setDuration(500);
+                        window.tempTip.showSuccess('保存成功');
+                        data.focusDocument();
+                        data.audioDing();
+                    })
+                }else{
+                    increase();
+                }
+            },
+            oninputEnter:function(e){
+                if (e.key === 'Enter') {
+                    this.focusDocument();
+                }
+            },
+            focusDocument: function () {
+                this.focusing = 'document';
+                this.showCommitButton();
+            },
+            focusOutDocument: function () {
+                this.focusing = '';
+                this.autoFillBin();
+            },
+            audioWarning_otherBarcode: function () {
+                let audio = document.getElementById('soundWarning');
+                audio.currentTime = 0;//重新播放
+                if(audio.paused){
+                    audio.play();// 播放
+                }
+                this.alertVibrate();
+
+            },
+            audioDing: function () {
+                let audio = document.getElementById('soundDing');
+                audio.currentTime = 0;//重新播放
+                audio.play();// 播放
+                //手机震动
+                function startVibrate(duration) {
+                    if (navigator.vibrate) {
+                        navigator.vibrate(duration);
+                    } else if (navigator.webkitVibrate) {
+                        navigator.webkitVibrate(duration);
+                    }
+                }
+                startVibrate(500);
+            },
+            recordOrPlusGoods: function () {
+                if(this.inputMode==='regular'){
+                    this.addGoods();
+                    return;
+                }
+                let isNotRepeating=this.goodses.every(goods => {
+                    if(goods.barcode===this.inputting.barcode){
+                        goods.amount=parseInt(goods.amount)+parseInt(this.inputting.amount);
+                        return false;
+                    }
+                    return true;
+                });
+                if(isNotRepeating)this.addGoods();
+            },
+            addGoods(){
+                this.goodses.unshift(JSON.parse(JSON.stringify(this.inputting)));
+            }
+        },
+    });
+</script>
+@stop

+ 12 - 1
routes/apiLocal.php

@@ -1,6 +1,7 @@
 <?php
 
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Route;
 
 /*
 地址前缀:/apiLocal/
@@ -48,8 +49,18 @@ Route::group(['prefix' => 'order'], function () {
 
 Route::group(['prefix' => 'order'], function () {
     Route::get('tracking/update','OrderTrackingController@updateApi');
-    Route::get('trackingOwner/updateStatus','OrderTrackingOwnerController@updateStatusApi');
+
+    Route::any('tracking/logisticUpdate','OrderTrackingController@logisticUpdateApi');
+    Route::any('tracking/warehouseUpdate','OrderTrackingController@warehouseUpdateApi');
     Route::any('trackingOwner/all','OrderTrackingOwnerController@getAllApi');
+    Route::any('trackingOwner/updateStatus','OrderTrackingOwnerController@updateStatusApi');
+
+});
+
+Route::group(['prefix'=>'maintenance'],function (){
+    Route::group(['prefix'=>'owner'],function (){
+        Route::post('getOwners','OwnerController@getOwners');
+    });
 });
 
 

+ 3 - 2
routes/web.php

@@ -37,8 +37,8 @@ Route::group(['prefix'=>'maintenance'],function(){
         Route::group(['prefix'=>'import'],function(){
             Route::post('excel', 'CommodityController@importExcel');
         });
-
         Route::get('import', 'CommodityController@import');
+        Route::post('syncWMS','CommodityController@syncWMS');
     });
     /** 货主 */
     Route::group(['prefix'=>'owners'],function(){
@@ -227,6 +227,7 @@ Route::group(['prefix'=>'store'],function(){
     Route::group(['prefix'=>'checkReceive'],function(){
         Route::group(['prefix'=>'mission'],function(){
             Route::post('import','StoreCheckingReceiveController@import');
+            Route::get('{id}','StoreCheckingReceiveController@show');
         });
         Route::get('mission','StoreCheckingReceiveController@mission');
     });
@@ -429,7 +430,7 @@ Route::group(['prefix'=>'order'],function(){
     /** 跟踪 */
     Route::group(['prefix'=>'tracking'],function(){
         Route::get('index',"OrderTrackingController@index");
-        Route::get('export',"OrderTrackingController@export");
+        Route::any('export',"OrderTrackingController@export");
         Route::get('update','OrderTrackingController@updateApi');
     });