Sfoglia il codice sorgente

Merge branch 'order_tarcking_add_serialize_no' into zengjun

ajun 5 anni fa
parent
commit
7b57d3db7b

+ 196 - 0
app/Filters/OrderTrackFilters.php

@@ -0,0 +1,196 @@
+<?php
+
+
+namespace App\Filters;
+
+
+use App\Commodity;
+use App\Order;
+use App\OrderPackage;
+use App\OrderPackageCommodities;
+use App\Services\UserService;
+use App\Traits\ModelSearchWay;
+use App\User;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Http\Request;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\Auth;
+
+class OrderTrackFilters
+{
+    use ModelSearchWay;
+
+    protected $request;
+    protected $queryBuilder;
+    protected $params = [];
+    protected $filters = ['client_code', 'order_client_code_wms',
+        'logistic_id', 'client', 'web_order_number', 'sku', 'logistic_number','remark','ids',
+        'start_at', 'end_at', 'start_planning_sent_at', 'end_planning_sent_at'];
+    protected $array_filter;
+
+    /** @var Builder $orderPackageCommodityQuery */
+    protected $commodityQuery;
+    /** @var Builder $orderPackageCommodityQuery */
+    protected $orderPackageCommodityQuery;
+    /** @var Builder $orderPackageQuery */
+    protected $orderPackageQuery;
+    /** @var Builder $orderQuery */
+    protected $orderQuery;
+
+    public function __construct(Request $request)
+    {
+        $this->request = $request;
+        $this->params = $request->all();
+        $this->array_filter = array_filter($this->request->only($this->filters));
+    }
+
+    public function apply($builder)
+    {
+        $this->queryBuilder = $builder;
+        $this->afterApply();
+        foreach ($this->array_filter as $filter => $value) {
+            if (method_exists($this, $filter)) {
+                $this->$filter($value, $this->queryBuilder);
+            }
+        }
+        $this->beforeApply();
+        return $this->queryBuilder;
+    }
+
+    public function afterApply()
+    {
+        if(isset($this->params['data']))
+            $this->id(explode(',',$this->params['data']));
+
+        // 货主
+        $user = Auth::user();
+        $owner_ids = $user ? app(UserService::class)->getPermittingOwnerIds($user) : [];
+        if (isset($this->params['owner_id'])) {
+            $ownerIds = explode(",", $this->params['owner_id']);
+            $owner_ids = array_intersect($owner_ids, $ownerIds);
+        }
+        $this->ownerId($owner_ids);
+    }
+
+    public function getCommodityQuery(): Builder
+    {
+        if(!$this->commodityQuery)
+            $this->commodityQuery = Commodity::query()->selectRaw('id');
+        return $this->commodityQuery;
+    }
+
+    public function getOrderPackageCommodityQuery(): Builder
+    {
+        if(!$this->orderPackageCommodityQuery)
+            $this->orderPackageCommodityQuery = OrderPackageCommodities::query()->selectRaw('id');
+        return $this->orderPackageCommodityQuery;
+    }
+
+    public function getOrderPackageQuery(): Builder
+    {
+        if(!$this->orderPackageQuery)
+            $this->orderPackageQuery = OrderPackage::query()->selectRaw('id');
+        return $this->orderPackageQuery;
+    }
+
+    public function getOrderQuery(): Builder
+    {
+        if(!$this->orderQuery)
+            $this->orderQuery = Order::query()->selectRaw('id');
+        return $this->orderQuery;
+    }
+
+    public function client_code($client_code)
+    {
+        $this->searchWay($this->queryBuilder,$client_code,'order_trackings.order_client_code');
+    }
+
+    public function order_client_code_wms($order_client_code_wms)
+    {
+        $this->searchWay($this->queryBuilder,$order_client_code_wms,'order_trackings.order_client_code_wms');
+    }
+
+    public function logistic_id($logistic_id)
+    {
+        $this->queryBuilder->where('order_trackings.logistic_id',$logistic_id);
+    }
+
+    public function client($client)
+    {
+        $this->queryBuilder->where('order_trackings.client','like',$client.'%');
+    }
+
+    public function web_order_number($web_order_number)
+    {
+        $this->searchWay($this->queryBuilder,$web_order_number,'order_trackings.web_order_number');
+    }
+
+    public function sku($sku)
+    {
+        $this->searchWay($this->getCommodityQuery(),$sku,'sku');
+        $this->getOrderPackageCommodityQuery()->whereIn('commodity_id',$this->getCommodityQuery());
+    }
+
+    public function logistic_number($logistic_number)
+    {
+        $this->searchWay($this->getOrderPackageQuery(),$logistic_number,'logistic_number');
+    }
+
+    public function remark($remark)
+    {
+        $this->queryBuilder->where('order_trackings.remark','like','%'.$remark.'%');
+        if(isset($this->params['remark_addtime'])){
+            $this->queryBuilder->where('order_trackings.created_at','>',Carbon::now()->subDays($this->params['remark_addtime']));
+        }else{
+            $this->queryBuilder->where('order_trackings.created_at','>=',Carbon::now()->subDays(15));
+        }
+    }
+
+    public function id($id)
+    {
+        if(is_array($id))$this->queryBuilder->whereIn('order_trackings.id',$id);
+        else $this->queryBuilder->where('order_trackings.id',$id);
+    }
+
+    public function ownerId($ids)
+    {
+        $this->getOrderQuery()->whereIn('orders.owner_id',$ids);
+    }
+
+
+    public function start_at($start_at)
+    {
+        $this->queryBuilder->where('order_trackings.pick_up_at','>=',$start_at.' 00:00:00');
+    }
+
+    public function end_at($end_at)
+    {
+        $this->queryBuilder->where('order_trackings.pick_up_at','<=',$end_at.' 23:59:59');
+    }
+
+    public function start_planning_sent_at($start_planning_sent_at)
+    {
+        $this->queryBuilder->where('order_trackings.planning_sent_at','>=',$start_planning_sent_at.' 00:00:00');
+    }
+
+    public function end_planning_sent_at($end_planning_sent_at)
+    {
+        $this->queryBuilder->where('order_trackings.planning_sent_at','<=',$end_planning_sent_at.' 23:59:59');
+    }
+
+    public function beforeApply()
+    {
+        if($this->orderQuery)
+            $this->getOrderPackageQuery()->whereIn('order_packages.order_id',$this->orderQuery);
+
+        if($this->orderPackageQuery)
+            $this->getOrderPackageCommodityQuery()->whereIn('order_package_commodities.order_package_id',$this->getOrderPackageQuery());
+
+        if($this->commodityQuery)
+            $this->getOrderPackageCommodityQuery()->whereIn('order_package_commodities.commodity_id',$this->commodityQuery);
+
+        if($this->orderPackageCommodityQuery)
+            $this->queryBuilder->whereIn('order_trackings.order_package_commodity_id',$this->getOrderPackageCommodityQuery());
+
+    }
+}

+ 85 - 0
app/Http/Controllers/OrderPackageCommoditySerialNumberController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\OrderPackageCommoditySerialNumber;
+use Illuminate\Http\Request;
+
+class OrderPackageCommoditySerialNumberController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        //
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * 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.
+     *
+     * @param  \App\OrderPackageCommoditySerialNumber  $orderPackageCommoditySerialNumber
+     * @return \Illuminate\Http\Response
+     */
+    public function show(OrderPackageCommoditySerialNumber $orderPackageCommoditySerialNumber)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\OrderPackageCommoditySerialNumber  $orderPackageCommoditySerialNumber
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(OrderPackageCommoditySerialNumber $orderPackageCommoditySerialNumber)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\OrderPackageCommoditySerialNumber  $orderPackageCommoditySerialNumber
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, OrderPackageCommoditySerialNumber $orderPackageCommoditySerialNumber)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\OrderPackageCommoditySerialNumber  $orderPackageCommoditySerialNumber
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(OrderPackageCommoditySerialNumber $orderPackageCommoditySerialNumber)
+    {
+        //
+    }
+}

+ 25 - 24
app/Http/Controllers/OrderTrackingController.php

@@ -2,8 +2,8 @@
 
 namespace App\Http\Controllers;
 
+use App\Filters\OrderTrackFilters;
 use App\Logistic;
-use App\Order;
 use App\OrderTracking;
 use App\Services\common\ExportService;
 use App\Services\OrderTrackingService;
@@ -18,25 +18,25 @@ use Ramsey\Uuid\Uuid;
 class OrderTrackingController extends Controller
 {
 
-    public function index(Request $request)
+    public function index(Request $request,OrderTrackFilters $filters)
     {
-        /**
-         * @var OrderTrackingService $service
-         */
-        if (!Gate::allows('订单管理-跟踪'))
-            return redirect(url('/'));
-        $owners =  app(OwnerService::class)->getAuthorizedOwners();
-        $service = app('OrderTrackingService');
+        if (!Gate::allows('订单管理-跟踪')) return redirect(url('/'));
+
+        /** @var OrderTrackingService $service */
+        $service = app(OrderTrackingService::class);
         $service->fillInOrderTracking();
-        $trackOrders = $service->paginate($request->input());
+
+        $trackOrders = OrderTracking::query()->filter($filters)->defaultQuery()->defaultWith()->paginate($request['paginate'] ?? 50);
+
         $trackOrders->map(function($trackOrder){
             if($trackOrder->uploadFile){
-                if(!str_starts_with($trackOrder->uploadFile->url,'http')){
+                if(!str_starts_with($trackOrder->uploadFile->url,'http'))
                     $trackOrder->uploadFile->url = asset('/storage'.$trackOrder->uploadFile->url);
-                }
             }
         });
+
         $logistics = Logistic::all();
+        $owners =  app(OwnerService::class)->getAuthorizedOwners();
         return view('order.tracking.index', compact('owners', 'trackOrders','logistics'));
     }
 
@@ -140,20 +140,14 @@ class OrderTrackingController extends Controller
         return ['success'=>false,'error'=>'图片上传失败'];
     }
 
-    public function export(Request $request)
+    public function export(Request $request,OrderTrackFilters  $filters)
     {
-        if (!Gate::allows('订单管理-跟踪'))
-            return redirect(url('/'));
-        /** @var OrderTrackingService $service */
-        $service = app(OrderTrackingService::class);
-        $orderTrackings = $service->getOrderTrackings($request->input());
-//        $column = ['owners_name','order_client_code','web_order_number','pick_up_at','sale','client','sku','sku_name','amount','order_remark',
-//            'gross_weight','bulk','pallet_total','logistic_name','logistic_number','city','planning_sent_at','is_on_duty_shift','is_arrival','signed_at','receive_bill_status','remark'];
-        $rule = ["pick_up_at"=> "mysqlDate",'planning_sent_at'=>"mysqlDate"];
+        if (!Gate::allows('订单管理-跟踪')) return redirect(url('/'));
+
+        $orderTrackings = OrderTracking::query()->filter($filters)->defaultQuery()->defaultWith()->get();
 
         $row = ['公司','订单号','WEB+订单号','提货日期','销售','客户','SKU','物料描述','数量','订单备注','重量','体积',
-            '托盘合计','运输方式','运输单号','到达城市','应送达时间','是否赶上卡班','到货情况','签收日期','签收单情况','备注'];
-        $mergeColumn = ['A','B','C','D','E','F','J','N','P','P','Q','R','S','T','U','V','M'];
+            '托盘合计','运输方式','运输单号','到达城市','序列号','应送达时间','是否赶上卡班','到货情况','签收日期','签收单情况','备注'];
         $mergeRow = [];
         $list=[];
         $start_row = 0;
@@ -183,6 +177,12 @@ class OrderTrackingController extends Controller
                 $row_count=1;
                 $order_client_code_temp = $orderTracking->order_client_code;
             }
+            $serialNumberStr = '';
+            if($orderTracking['commodities']['serialNumbers']){
+                foreach ($orderTracking['commodities']['serialNumbers'] as $serialNumber){
+                    $serialNumberStr.=$serialNumber['serial_number'].",\r\n";;
+                }
+            }
 
             $order_client_code = $orderTracking->web_order_number?'':$orderTracking->order_client_code;
             $web_order_number = $orderTracking->web_order_number??'';
@@ -213,6 +213,7 @@ class OrderTrackingController extends Controller
                 $logistic,
                 $logistic_number,
                 $orderTracking->commodities->package->order->city ?? '',
+                rtrim($serialNumberStr,",\r\n"),              //原始运单号
                 $planning_sent_at=='0000-00-00'?'':$planning_sent_at,
                 $orderTracking->is_on_duty_shift,
                 $orderTracking->is_arrival,
@@ -221,7 +222,7 @@ class OrderTrackingController extends Controller
                 $orderTracking->remark,
             ];
         }
-        return app(ExportService::class)->json($row,$list,'订单跟踪件','merge',$mergeColumn,$mergeRow);
+        return app(ExportService::class)->json($row,$list,'订单跟踪件');
     }
 
     public function destroyImg(Request $request)

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

@@ -49,6 +49,7 @@ use App\OracleDOCASNHeader;
 use App\OracleDOCOrderDetail;
 use App\OracleDOCOrderHeader;
 use App\OracleDocOrderPackingSummary;
+use App\OracleDocOrderSerialNo;
 use App\OracleDOCWaveDetails;
 use App\OracleDOCWaveHeader;
 use App\OracleInvLotLocId;
@@ -1367,4 +1368,25 @@ where purch.islower=1 and deliver.id>'.$id);
         $service->createByWmsOrderHeader($orderHeaders);
         $service->updateByWmsOrderHeaders($orderHeaders);
     }
+
+    public function testArr()
+    {
+        $serialNos = OracleDocOrderSerialNo::query()->selectRaw('OrderNo')->get();
+        $orderNos  = data_get($serialNos,'*.orderno');
+        $service = app(OrderTrackingService::class);
+        $orderHeadService = app(OracleDOCOrderHeaderService::class);
+        $orderHeaders = $orderHeadService->getOrderTracking()->whereIn('DOC_Order_Header.OrderNo',$orderNos)->get();
+        app(OrderService::class)->syncOrderByWMSOrderHeaders($orderHeaders);
+        app("OrderCommodityService")->syncOrderCommodity($orderHeaders);
+        app('OrderPackageService')->syncOrderPackage($orderHeaders);
+        app("OrderPackageCommoditiesService")->syncOrderPackageCommodities($orderHeaders);
+        app('OrderPackageCommoditySerialNumberService')->syncOrderPackageCommoditySerialNumbers($orderHeaders);
+        $service->createByWmsOrderHeader($orderHeaders);
+    }
+    public function testArray1()
+    {
+        $arr = (array)'update_at';
+        dd($arr);
+    }
 }
+

+ 12 - 1
app/OracleActAllocationDetails.php

@@ -2,13 +2,17 @@
 
 namespace App;
 
+use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 
 use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\HasMany;
 
 class OracleActAllocationDetails extends Model
 {
     use ModelLogChanging;
+    use ModelTimeFormat;
 
     protected $connection="oracle";
     protected $primaryKey="ALLOCATIONDETAILSID";
@@ -16,7 +20,14 @@ class OracleActAllocationDetails extends Model
     public $timestamps=false;
     public function getIncrementing(){ return false;}
 
-    public function oracleDocOrderHeader(){
+    public function oracleDocOrderHeader(): BelongsTo
+    {
         return $this->belongsTo('App\OracleDOCOrderHeader','orderno','orderno');
     }
+
+    public function oracleDocOrderSerialNos(): HasMany
+    {
+        return $this->hasMany(OracleDocOrderSerialNo::class,'allocationdetailsid','allocationdetailsid');
+    }
+
 }

+ 28 - 0
app/OracleDocOrderSerialNo.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations;
+use App\Traits\ModelLogChanging;
+
+class OracleDocOrderSerialNo extends Model
+{
+    use ModelLogChanging;
+    use ModelLogChanging;
+    use ModelTimeFormat;
+
+    protected $connection="oracle";
+    protected $table="Doc_Order_SerialNo";
+    protected $primaryKey="SerialNo";
+    public $timestamps=false;
+
+    public function getIncrementing(){ return false;}
+
+    public function actAllocationDetail(): Relations\HasOne
+    {
+        return $this->hasOne(OracleActAllocationDetails::class,'allocationdetailsid','allocationdetailsid');
+    }
+    //
+}

+ 13 - 3
app/OrderPackageCommodities.php

@@ -6,6 +6,9 @@ use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 
 use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
+use Illuminate\Database\Eloquent\Relations\HasMany;
 
 class OrderPackageCommodities extends Model
 {
@@ -22,16 +25,23 @@ class OrderPackageCommodities extends Model
     ];
 
 
-    public function package(){
+    public function package(): BelongsTo
+    {
         return $this->belongsTo(OrderPackage::class,'order_package_id','id');
     }
 
-    public function commodity(){
+    public function commodity(): BelongsTo
+    {
         return $this->belongsTo(Commodity::class,'commodity_id','id');
     }
 
-    public function orderTracking(){
+    public function orderTracking(): BelongsTo
+    {
         return $this->belongsTo(OrderTracking::class,'id','order_package_commodity_id');
     }
 
+    public function serialNumbers(): HasMany
+    {
+        return $this->hasMany(OrderPackageCommoditySerialNumber::class,'order_package_commodity_id','id');
+    }
 }

+ 23 - 0
app/OrderPackageCommoditySerialNumber.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use App\Traits\ModelLogChanging;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\HasOne;
+
+class OrderPackageCommoditySerialNumber extends Model
+{
+    use ModelLogChanging;
+    use ModelTimeFormat;
+
+    protected $fillable = ['order_package_commodity_id','serial_number'];
+    //
+
+    public function orderPackageCommodity(): HasOne
+    {
+        return $this->hasOne(OrderPackageCommodities::class);
+    }
+}

+ 21 - 3
app/OrderTracking.php

@@ -4,15 +4,14 @@ namespace App;
 
 use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
-
+use Illuminate\Database\Eloquent\Builder;
 use App\Traits\ModelLogChanging;
 
 class OrderTracking extends Model
 {
     use ModelLogChanging;
-
-
     use ModelTimeFormat;
+
     protected $fillable = [
         'order_package_commodity_id','owner_id','logistic_id',
         'web_order_number',
@@ -85,4 +84,23 @@ class OrderTracking extends Model
     public function getOrderClientNumberAttribute(){
         return $this->commodities->package->order['client_code'] ?? '';
     }
+
+    public function scopeFilter($query, $filters)
+    {
+        return $filters->apply($query);
+    }
+
+    public function scopeDefaultQuery($query): Builder
+    {
+        return $query->orderByDesc('order_trackings.pick_up_at')
+            ->orderBy('order_trackings.order_client_code');
+    }
+
+    public function scopeDefaultWith($query)
+    {
+        return $query->with(['commodities'=>function($query){
+            $query->with(['commodity.barcodes','serialNumbers','package.order']);
+        },'owner','logistic','uploadFile']);
+    }
+
 }

+ 2 - 1
app/Providers/AppServiceProvider.php

@@ -19,7 +19,6 @@ use App\Services\DepositoryService;
 use App\Services\FacilitatorService;
 use App\Services\DemandService;
 use App\Services\DemandProcessService;
-use App\Services\DischargeTaskDossierService;
 use App\Services\FeatureService;
 use App\Services\ForeignHaiRoboticsService;
 use App\Services\InventoryAccountMissionService;
@@ -111,6 +110,7 @@ use Illuminate\Support\ServiceProvider;
 use Ramsey\Uuid\Uuid;
 use Illuminate\Support\Facades\Validator;
 use App\Services\SupplierService;
+use App\Services\OrderPackageCommoditySerialNumberService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -200,6 +200,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OrderIssueService',OrderIssueService::class);
         app()->singleton('OrderIssueWorkLoadService',OrderIssueWorkLoadService::class);
         app()->singleton('OrderPackageCommoditiesService',OrderPackageCommoditiesService::class);
+        app()->singleton('OrderPackageCommoditySerialNumberService',OrderPackageCommoditySerialNumberService::class);
         app()->singleton('OrderPackageReceivedSyncService',OrderPackageReceivedSyncService::class);
         app()->singleton('OrderPackageService',OrderPackageService::class);
         app()->singleton('OrderService',OrderService::class);

+ 1 - 0
app/Services/CityService.php

@@ -32,6 +32,7 @@ class CityService
     {
         $city = City::query()->where('name',$name)->first();
         if(isset($city))return $city;
+        if(!$name)return null;
         foreach (CityService::$cities as $city) {
             if(strstr($city,$name) != null){
                return City::query()->where('name','like',$city.'%')->first();

+ 19 - 0
app/Services/OracleDOCOrderHeaderService.php

@@ -44,6 +44,25 @@ class OracleDOCOrderHeaderService
             }]);
     }
 
+    public function getOrderTracking()
+    {
+        return OracleDOCOrderHeader::query()->selectRaw(implode(',',self::$columns))
+            ->with(['oracleBASCustomer'=>function($query){
+                $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
+            },'oracleDOCOrderDetails'=>function($query){
+                $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered,doc_order_details.Location,doc_order_details.OrderLineNo,doc_order_details.d_edi_03');
+            }, 'actAllocationDetails'=>function($query){
+                $query->with(['oracleDocOrderSerialNos'=>function($query){
+                    $query->selectRaw('SerialNo,OrderNo,Sku,AllocationDetailsId');
+                }]);
+                $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID,ACT_Allocation_Details.Sku,ACT_Allocation_Details.Location,ACT_Allocation_Details.SkuLineNo,ACT_Allocation_Details.OrderLineno,ACT_Allocation_Details.CheckTime');
+            },'oracleBASCode'=>function($query){
+                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
+            },'orderType'=>function($query){
+                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
+            }]);
+    }
+
     function first(array $params){
         $order = OracleDOCOrderHeader::query();
         foreach ($params as $column => $value){

+ 153 - 0
app/Services/OrderPackageCommoditySerialNumberService.php

@@ -0,0 +1,153 @@
+<?php
+
+namespace App\Services;
+
+use App\Order;
+use App\OrderPackage;
+use App\Services\common\BatchUpdateService;
+use App\Services\common\DataHandlerService;
+use App\Traits\ServiceAppAop;
+use App\OrderPackageCommoditySerialNumber;
+use Illuminate\Support\Carbon;
+
+class OrderPackageCommoditySerialNumberService
+{
+    use ServiceAppAop;
+
+    protected $modelClass = OrderPackageCommoditySerialNumber::class;
+
+    public function batchUpdate(array $params)
+    {
+        return app(BatchUpdateService::class)->batchUpdate('order_packages_commodity_serial_numbers',$params);
+    }
+
+    public function syncOrderPackageCommoditySerialNumbers($orderHeaders)
+    {
+        $orderQuery = Order::query()->selectRaw('id')->whereIn('code', data_get($orderHeaders, '*.orderno'));
+        $orderPackages = OrderPackage::query()->with(['commodities' => function ($query) {
+            $query->with('commodity', 'serialNumbers');
+        }])->whereIn('Order_Packages.Order_id', $orderQuery)->get();
+
+        $createdModels = $this->getCreateModelBy($orderHeaders, $orderPackages);
+
+        $regroupParams = $this->regroupOrderPackage($orderPackages);
+
+        $this->deletedModelBy($createdModels,$regroupParams);
+        $this->createdModelBy($createdModels,$regroupParams);
+    }
+
+    public function regroupOrderPackage($orderPackages): array
+    {
+        $regroupArr = [];
+        if (!$orderPackages) return $regroupArr;
+        foreach ($orderPackages as $orderPackage) {
+            $logistic_number = $orderPackage['logistic_number'];
+            $regroupArr[$logistic_number] = [];
+            foreach ($orderPackage['commodities'] as $commodity) {
+                $sku = $commodity['commodity']['sku'] ?? null;
+                $regroupArr[$logistic_number][$sku] = [];
+                foreach ($commodity['serialNumbers'] as $serialNumber) {
+                    $serial_number = $serialNumber['serial_number'];
+                    $id = $serialNumber['id'];
+                    $regroupArr[$logistic_number][$sku][$serial_number]
+                        = ['id'=>$id,'order_package_commodity_id' => $commodity['id'], 'serial_number' => $serial_number];
+                }
+            }
+        }
+        return $regroupArr;
+    }
+
+    public function createdModelBy($createdModels, $regroupParams)
+    {
+        $innerParams = [];
+        foreach ($createdModels as $key => $createdParams) {
+            foreach ($createdParams as $sku => $params) {
+                foreach ($params as $serialNumber =>$param) {
+                    if(!isset($regroupParams[$key][$sku][$serialNumber])){
+                        $innerParams[] = $param;
+                    }
+                }
+            }
+        }
+        OrderPackageCommoditySerialNumber::query()->insert($innerParams);
+    }
+
+//    public function updatedModelBy($createdModels, $regroupParams)
+//    {
+//        $updateParams = [['id','serial_number']];
+//        if (count($updateParams) == 0) return;
+//        $this->batchUpdate($updateParams);
+//    }
+
+    public function deletedModelBy($createdModels, $regroupParams)
+    {
+        $deleteParams = [];
+        foreach ($regroupParams as $key => $params) {
+            if (!isset($regroupParams[$key])) continue;
+            foreach ($params as $sku => $items) {
+                foreach ($items as $serialNumber=>$item) {
+                    if (!isset($createdModels[$key][$sku][$serialNumber])){
+                        $deleteParams[] = $item;
+                    }
+                }
+            }
+        }
+        if (count($deleteParams)==0) return;
+        $delete = OrderPackageCommoditySerialNumber::query()->whereIn('id',data_get($deleteParams,'*.id'))->delete();
+        if($delete>0)LogService::log(__CLASS__,'Delete OrderPackageCommoditySerialNumber',json_encode($deleteParams));
+    }
+
+    public function getCreateModelBy($orderHeaders, $orderPackages): array
+    {
+        /** @var DataHandlerService $dataHandlerService */
+        $dataHandlerService = app(DataHandlerService::class);
+
+        $orderPackageMaps = $dataHandlerService->dataHeader(['logistic_number'], $orderPackages);
+
+        $orderPackageSerialNumbers = [];
+
+        foreach ($orderHeaders as $orderHeader) {
+            if(!isset($orderHeader['actAllocationDetails']))continue;
+            foreach ($orderHeader['actAllocationDetails'] as $actAllocationDetail) {
+                $logisticNumber = $actAllocationDetail['picktotraceid'];
+
+                if (!$logisticNumber) continue;
+                $orderPackage = $dataHandlerService->getKeyValue(['logistic_number' => $logisticNumber], $orderPackageMaps) ??
+                    $dataHandlerService->getKeyValue(['logistic_number' => $orderHeader['soreference5']], $orderPackageMaps);
+
+                if (!$orderPackage) continue;
+                $orderPackageCommodityMap = [];
+                if(!isset($orderPackage['commodities']))continue;
+                foreach ($orderPackage['commodities'] as $orderPackageCommodity) {
+                    $sku = $orderPackageCommodity['commodity']['sku'] ?? '';
+                    if($sku === '')continue;
+                    $orderPackageCommodityMap[$sku] = $orderPackageCommodity;
+                }
+                foreach ($actAllocationDetail['oracleDocOrderSerialNos'] as $oracleDocOrderSerialNo) {
+                    $sku = $oracleDocOrderSerialNo['sku'];
+                    $createParams = $this->getCreateModel($oracleDocOrderSerialNo, $orderPackageCommodityMap);
+                    if (count($createParams) == 0) continue;
+                    if (!isset($orderPackageSerialNumbers[$logisticNumber])) $orderPackageSerialNumbers[$logisticNumber] = [];
+                    if (!isset($orderPackageSerialNumbers[$logisticNumber][$sku])) $orderPackageSerialNumbers[$logisticNumber][$sku] = [];
+                    $orderPackageSerialNumbers[$logisticNumber][$sku][$createParams['serial_number']] = $createParams;
+                }
+            }
+        }
+        return $orderPackageSerialNumbers;
+    }
+
+    public function getCreateModel($oracleDocOrderSerialNo, $orderPackageCommodityMap)
+    {
+        $orderPackageCommodity = $orderPackageCommodityMap[$oracleDocOrderSerialNo['sku']] ?? null;
+        if (!$orderPackageCommodity) return [];
+        $created_At = Carbon::now()->format(Carbon::DEFAULT_TO_STRING_FORMAT);
+        return [
+            'order_package_commodity_id' => $orderPackageCommodity['id'],
+            'serial_number' => $oracleDocOrderSerialNo['serialno'],
+            'created_at' => $created_At,
+            'updated_at' => $created_At
+        ];
+    }
+
+
+}

+ 2 - 130
app/Services/OrderTrackingService.php

@@ -28,136 +28,6 @@ class OrderTrackingService
         return app(BatchUpdateService::class)->batchUpdate('order_trackings',$params);
     }
 
-    public function getQuery($params)
-    {
-        $user = Auth::user();
-        $owner_ids = $user ? app('UserService')->getPermittingOwnerIds($user) : [];
-        if ($params['owner_id'] ?? false) {
-            $ownerids = explode(",", $params['owner_id']);
-            $owner_ids = array_intersect($owner_ids, $ownerids);
-        }
-        $query = OrderTracking::query()->with(['logistic','owner','uploadFile', 'commodities' => function ($query) {
-            $query->with(['commodity'=>function($query){
-                $query->with('barcodes');
-            }, 'package.order']);
-        },])->whereHas('owner', function ($query) use ($owner_ids) {
-            $query->whereIn('id', $owner_ids); //货主
-        });
-
-        $queryParam = [
-            'start_at' => ['alias' => 'pick_up_at', 'startDate' => ' 00:00:00'],
-            'end_at' => ['alias' => 'pick_up_at', 'endDate' => ' 23:59:59'],
-            'start_planning_sent_at' => ['alias' => 'planning_sent_at', 'startDate' => ' 00:00:00'],
-            'end_planning_sent_at' => ['alias' => 'planning_sent_at', 'endDate' => ' 23:59:59'],
-        ];
-
-        $param = [
-            'start_at' => $params['start_at'] ?? '',
-            'end_at' => $params['end_at'] ?? '',
-            'start_planning_sent_at' => $params['start_planning_sent_at'] ?? '',
-            'end_planning_sent_at' => $params['end_planning_sent_at'] ?? '',
-        ];
-
-        $query = app(QueryService::class)->query($param, $query, $queryParam);
-        return $query;
-    }
-
-    public function getConditionQuery($params)
-    {
-        $query = $this->getQuery($params);
-
-        if (isset($params['client_code'])){     // client_code logistic
-            $query->where('order_client_code','like',$params['client_code']);
-//            $query->whereHas('commodities.package.order', function ($query) use ($params) {
-//                if($params['client_code'] ?? false){
-//                    $query->where('client_code','like', $params['client_code']);
-//                }
-//            });
-        }
-
-        if(isset($params['order_client_code_wms'])){
-            $query->where('order_client_code_wms','like',$params['order_client_code_wms']);
-        }
-
-        if(isset($params['logistic_id']))$query->where('logistic_id',$params['logistic_id']);   // 快递
-
-        if ($params['client'] ?? false) $query->where('client', 'like', $params['client']);  // 客户
-
-        if(!empty($params['web_order_number'])) $query->where('web_order_number', 'like', $params['web_order_number'].'%'); // web+订单好
-
-        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(isset($params['remark'])){
-            $query->where('remark','like','%'.$params['remark'].'%');
-            if(isset($params['remark_addtime'])){
-                $query->where('created_at','>',Carbon::now()->subDays($params['remark_addtime']));
-            }else{
-                $query->where('created_at','>=',Carbon::now()->subDays(15));
-            }
-        }
-
-        if ($params['ids'] ?? false) {
-            $ids = explode(',', $params['ids']);
-            $query->whereIn('order_trackings.id', $ids);
-        }
-        return $query;
-    }
-
-    public function paginate($params)
-    {
-        return $this->getConditionQuery($params)
-            ->orderByDesc('order_trackings.pick_up_at')
-            ->orderBy('order_trackings.order_client_code')
-            ->paginate($params['paginate'] ?? 50);
-    }
-
-    public function getSql($params)
-    {
-        if($params['data'] ?? false){
-            $params['ids'] = $params['data'];
-        }
-        $order_tracking_colnums = "case order_trackings.order_client_code when  order_trackings.web_order_number then '' when order_trackings.order_client_code then  order_trackings.order_client_code end order_client_code,";
-        $order_tracking_colnums .= 'order_trackings.web_order_number,order_trackings.pick_up_at,order_trackings.sale,order_trackings.client,order_trackings.order_remark,order_trackings.gross_weight,order_trackings.bulk,';
-        $order_tracking_colnums .= "case order_trackings.planning_sent_at when '0000-00-00 00:00:00' then null else order_trackings.planning_sent_at end planning_sent_at,";
-        $order_tracking_colnums .= 'order_trackings.pallet_total,order_trackings.is_on_duty_shift,order_trackings.is_arrival,order_trackings.signed_at,order_trackings.receive_bill_status,order_trackings.remark';
-        return  $this->getConditionQuery($params)
-            ->orderBy('order_trackings.order_client_code')
-            ->orderByDesc('order_trackings.pick_up_at')
-            ->selectRaw($order_tracking_colnums)
-            ->leftJoin('order_package_commodities','order_trackings.order_package_commodity_id','order_package_commodities.id')
-                ->selectRaw('order_package_commodities.amount amount')
-            ->leftJoin('order_packages','order_package_commodities.order_package_id','order_packages.id')
-                ->selectRaw('order_packages.logistic_number logistic_number')
-            ->leftJoin('orders','order_packages.order_id','orders.id')
-                ->selectRaw('orders.city city')
-            ->leftJoin('logistics','orders.logistic_id','logistics.id')
-                ->selectRaw("case logistics.code when 'ZT' then '新杰物流' else  logistics.name end  logistic_name")
-            ->leftJoin('commodities','order_package_commodities.commodity_id','commodities.id')
-                ->selectRaw('commodities.sku sku,commodities.name sku_name')
-            ->leftJoin('owners','orders.owner_id','owners.id')
-               ->selectRaw('owners.name owners_name')
-            ->sql();
-    }
-
-    public function getOrderTrackings($params)
-    {
-        if($params['data'] ?? false){
-            $params['ids'] = $params['data'];
-        }
-        return  $this->getConditionQuery($params)
-            ->orderByDesc('order_trackings.pick_up_at')->orderBy('order_trackings.order_client_code')->get();
-    }
-
     /**
      * @param $startData
      */
@@ -172,6 +42,7 @@ class OrderTrackingService
         app("OrderCommodityService")->syncOrderCommodity($orderHeaders);
         app('OrderPackageService')->syncOrderPackage($orderHeaders);
         app("OrderPackageCommoditiesService")->syncOrderPackageCommodities($orderHeaders);
+        app('OrderPackageCommoditySerialNumberService')->syncOrderPackageCommoditySerialNumbers($orderHeaders);
         $this->createByWmsOrderHeader($orderHeaders);
     }
 
@@ -182,6 +53,7 @@ class OrderTrackingService
         app("OrderCommodityService")->syncOrderCommodity($orderHeaders);
         app('OrderPackageService')->syncOrderPackage($orderHeaders);
         app("OrderPackageCommoditiesService")->syncOrderPackageCommodities($orderHeaders);
+        app('OrderPackageCommoditySerialNumberService')->syncOrderPackageCommoditySerialNumbers($orderHeaders);
         $this->updateByWmsOrderHeaders($orderHeaders);
     }
 

+ 2 - 0
app/Services/ProvinceService.php

@@ -16,8 +16,10 @@ class ProvinceService
 
     public function findByName($name)
     {
+        if(!$name)return null;
         $province = Province::query()->where('name',$name)->first();
         if(isset($province))return $province;
+
         foreach (ProvinceService::$provinces as $province) {
             if(strstr($province,$name) != null){
                 return Province::query()->where('name',$province)->first();

+ 1 - 0
database/factories/OracleActAllocationDetailsFactory.php

@@ -7,6 +7,7 @@ use Faker\Generator as Faker;
 
 $factory->define(OracleActAllocationDetails::class, function (Faker $faker) {
     return [
+        'allocationdetailsid'=>$faker->uuid,
         'orderno' => $faker->uuid,
         'customerid' => $faker->name,
         'sku'=>$faker->name,

+ 14 - 0
database/factories/OracleDocOrderSerialNoFactory.php

@@ -0,0 +1,14 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OracleDocOrderSerialNo;
+use Faker\Generator as Faker;
+
+$factory->define(OracleDocOrderSerialNo::class, function (Faker $faker) {
+    return [
+        'serialno' => $faker->uuid,
+        'sku' => $faker->name,
+        'allocationdetailsid' => $faker->uuid,
+    ];
+});

+ 12 - 0
database/factories/OrderPackageCommoditySerialNumberFactory.php

@@ -0,0 +1,12 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OrderPackageCommoditySerialNumber;
+use Faker\Generator as Faker;
+
+$factory->define(OrderPackageCommoditySerialNumber::class, function (Faker $faker) {
+    return [
+        //
+    ];
+});

+ 33 - 0
database/migrations/2021_04_23_174700_create_order_package_commodity_serial_numbers_table.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderPackageCommoditySerialNumbersTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_package_commodity_serial_numbers', function (Blueprint $table) {
+            $table->id();
+            $table->bigInteger('order_package_commodity_id')->comment('快递包裹');
+            $table->string('serial_number')->unique()->default(null)->comment('序列号');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_package_commodity_serial_numbers');
+    }
+}

+ 16 - 0
database/seeds/OrderPackageCommoditySerialNumberSeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class OrderPackageCommoditySerialNumberSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}

+ 1 - 1
resources/views/demand/_create.blade.php

@@ -1,5 +1,5 @@
 @auth
-<div id="demand-div">
+<div id="demand-div" class="d-none">
     <div class="container-fluid position-absolute" style="min-width:10px;z-index:300;top: 100px;">
         <div class="float-right position-absolute" style="right: 50px" >
             <button class="btn-circle btn-outline-primary" type="button" id="dropdownMenu2" data-toggle="dropdown" style="width: 45px;height: 45px"

+ 1 - 2
resources/views/demand/_createjs.blade.php

@@ -17,9 +17,9 @@
             this.authoritiesFilter = JSON.parse(JSON.stringify(this.authorities));
             this.getAuthority();
             this.setUnClaimDemandRatio();
+            $('#demand-div').removeClass('d-none');
         },
         mounted() {
-            // this.setUnClaimDemandRatio();
         },
         methods: {
             /** 筛选 */
@@ -88,7 +88,6 @@
                 });
             },
             setUnClaimDemandRatio(){
-                console.log('setUnClaimDemandRatio');
                 let url = '{{url('apiLocal/demand/unClaimDemandRatio')}}';
                 window.axios.get(url).then(res=>{
                     if(res.data.data){

+ 78 - 34
resources/views/order/tracking/index.blade.php

@@ -11,7 +11,9 @@
                     <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
                         <div class="modal-content">
                             <div class="modal-header row form-inline">
-                                <input type="text" v-model="name" class="form-control form-control-sm col-5 offset-3" placeholder="搜索货主,点击下方块添加" />
+                                <label>
+                                    <input type="text" v-model="name" class="form-control form-control-sm col-5 offset-3" placeholder="搜索货主,点击下方块添加">
+                                </label>
                                 <button class="btn btn-sm btn-info col-2" @click="seekOwner()">搜索</button>
                                 <label class="col-2"></label>
                             </div>
@@ -50,7 +52,9 @@
                 <table class="table table-sm table-striped table-bordered table-hover card-body p-0 m-0" id="headerParent">
                     <tr class="text-center" >
                         <th>
-                            <input id="all" type="checkbox" @click="checkAll($event)"/>
+                            <label>
+                                <input id="all" type="checkbox" @click="checkAll($event)">
+                            </label>
                         </th>
                         <th style="min-width: 50px">序号</th>
                         <th class="td-warm" style="min-width: 75px">公司</th>
@@ -71,6 +75,7 @@
                         <th class="td-yellow">运输单号</th>
                         <th class="td-yellow" style="min-width: 120px">到达城市</th>
                         <th class="td-yellow" style="min-width: 120px">照片</th>
+                        <th class="td-yellow" style="min-width: 120px">序列号</th>
                         <th class="td-calm" style="min-width: 200px">应送达时间</th>
                         <th class="td-calm" style="min-width: 120px">是否赶上卡班</th>
                         <th class="td-calm" style="min-width: 120px">到货情况</th>
@@ -81,13 +86,16 @@
                     <tr v-for="(trackOrder,index) in trackOrders" class="table-body text-center"  :key="trackOrder.id"
                         @click="selectTr===index+1?selectTr=0:selectTr=index+1" :class="selectTr===index+1?'focusing' : ''">
                         <td>
+                            <label for="all"></label>
                             <input id="all" type="checkbox" :value="trackOrder.id" v-model="checkData">
                         </td>
                         <td>@{{ index+1 }}</td>
                         <td class="text-decoration-none td-warm">@{{ trackOrder.ownerName }}</td>
                         <td class="td-warm">
                             <span v-if="trackOrder.web_order_number">
-                                <input class="form-control form-control-sm" :value="trackOrder.order_client_code === trackOrder.web_order_number ? '' : trackOrder.order_client_code " @change="warehouseUpdate($event,'order_client_code',trackOrder)" >
+                                <label>
+                                    <input class="form-control form-control-sm" :value="trackOrder.order_client_code === trackOrder.web_order_number ? '' : trackOrder.order_client_code " @change="warehouseUpdate($event,'order_client_code',trackOrder)" >
+                                </label>
                             </span>
                             <span v-else>@{{ trackOrder.order_client_code }}</span>
 {{--                            <span v-else>--}}
@@ -104,14 +112,18 @@
 
                         <td class="td-warm">
                             @can('订单管理-跟踪-仓库编辑')
-                                <input class="form-control form-control-sm" :value="trackOrder.web_order_number" @change="warehouseUpdate($event,'web_order_number',trackOrder)" >
+                                <label>
+                                    <input class="form-control form-control-sm" :value="trackOrder.web_order_number" @change="warehouseUpdate($event,'web_order_number',trackOrder)" >
+                                </label>
                             @else
                                 @{{ trackOrder.web_order_number }}
                             @endcan
                         </td>
                         <td class="td-warm">
                             @can('订单管理-跟踪-仓库编辑')
-                                <input class="form-control form-control-sm" type="datetime-local" :value="trackOrder.pick_up_at | dateLocal" @change="warehouseUpdate($event,'pick_up_at',trackOrder)" >
+                                <label>
+                                    <input type="datetime-local" class="form-control form-control-sm"  :value="trackOrder.pick_up_at | dateLocal" @change="warehouseUpdate($event,'pick_up_at',trackOrder)" >
+                                </label>
                             @else
                                 @{{ trackOrder.pick_up_at }}
                             @endcan
@@ -127,7 +139,9 @@
 {{--                        </td>--}}
                         <td class="td-yellow">
                             @can('订单管理-跟踪-仓库编辑')
+                            <label>
                                 <input class="form-control form-control-sm" :value="trackOrder.client" @change="warehouseUpdate($event,'client',trackOrder)" >
+                            </label>
                             @else
                                 @{{ trackOrder.client }}
                             @endcan
@@ -137,7 +151,9 @@
                         <td class="td-yellow">@{{ trackOrder.sku.skuAmount }}</td>
                         <td class="td-yellow " data-toggle="tooltip" >
                             @can('订单管理-跟踪-仓库编辑')
-                                <input class="form-control form-control-sm" :value="trackOrder.order_remark" @change="warehouseUpdate($event,'order_remark',trackOrder)" data-toggle="tooltip" data-placement="bottom" :title="trackOrder.order_remark">
+                                <label>
+                                    <input class="form-control form-control-sm" :value="trackOrder.order_remark" @change="warehouseUpdate($event,'order_remark',trackOrder)" data-toggle="tooltip" data-placement="bottom" :title="trackOrder.order_remark">
+                                </label>
                             @else
                                 @{{ trackOrder.order_remark }}
                             @endcan
@@ -146,7 +162,9 @@
                         <td class="td-yellow">@{{ trackOrder.bulk |millimeterToCubic}}</td>
                         <td class="td-yellow">
                             @can('订单管理-跟踪-仓库编辑')
-                                <input class="form-control form-control-sm" :value="trackOrder.pallet_total" @change="warehouseUpdate($event,'pallet_total',trackOrder)" >
+                                <label>
+                                    <input class="form-control form-control-sm" :value="trackOrder.pallet_total" @change="warehouseUpdate($event,'pallet_total',trackOrder)" >
+                                </label>
                             @else
                                 @{{ trackOrder.pallet_total }}
                             @endcan
@@ -178,57 +196,80 @@
                         <td class="td-yellow">
                             <div class="text-center" @mouseleave="removeCommonImg('common_img_'+trackOrder.id)" @mouseenter="commonImg('img_'+trackOrder.id,trackOrder)">
                             @can('订单管理-跟踪-物流公司编辑')
-                                <img v-if="trackOrder.upload_file" :id="'img_'+trackOrder.id" :data-src="trackOrder.upload_file.url+'-thumbnail.'+trackOrder.upload_file.type" src="{{url('icon/img404-thumbnail.jpg')}}">
+                                <img v-if="trackOrder.upload_file" :id="'img_'+trackOrder.id" :data-src="trackOrder.upload_file.url+'-thumbnail.'+trackOrder.upload_file.type" src="{{url('icon/img404-thumbnail.jpg')}}" alt="">
                                 <input v-else class="btn btn-sm btn-outline-secondary" type="button" @click="certiimg(trackOrder.id)" value="上传照片">
-                                <input type="file" @change="submitFile($event,trackOrder)" :id="trackOrder.id+'input'"
-                                       style="display: none" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"/>
+                                <input type="file" @change="submitFile($event,trackOrder)" :id="trackOrder.id+'input'" alt=""
+                                       style="display: none" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg">
                             @else
-                                <img v-if="trackOrder.upload_file" :id="'img_'+trackOrder.id" :data-scr="trackOrder.upload_file.url" src="{{url('icon/img404-thumbnail.jpg')}}">
+                                <img v-if="trackOrder.upload_file" :id="'img_'+trackOrder.id" :data-scr="trackOrder.upload_file.url" src="{{url('icon/img404-thumbnail.jpg')}}" alt="">
                             @endcan
                             </div>
                         </td>
+                        <td class="td-yellow">
+                            <template v-if="trackOrder.commodities['serial_numbers'].length > 0">
+                                    <template v-for="serialNumber in trackOrder.commodities['serial_numbers']">
+                                        <transition name="fade">
+                                        <p v-show="trackOrder.displayed || trackOrder.commodities['serial_numbers'].length === 1">@{{ serialNumber.serial_number }}</p>
+                                        </transition>
+                                    </template>
+                                <p class="text-primary m-0 p-0" v-if="trackOrder.commodities.serial_numbers.length !== 1" @click="trackOrder.displayed = !trackOrder.displayed" style="cursor: pointer">@{{ trackOrder.displayed ? '点击隐藏' : '点击展开' }}</p>
+                            </template>
+                        </td>
                         <td class="td-calm">
                             @can('订单管理-跟踪-物流公司编辑')
-                                <input class="form-control form-control-sm" type="date"  @change="logisticUpdate($event,'planning_sent_at',trackOrder)"  :value="trackOrder.planning_sent_at | date" >
+
+                                <label>
+                                    <input class="form-control form-control-sm" type="date"  @change="logisticUpdate($event,'planning_sent_at',trackOrder)"  :value="trackOrder.planning_sent_at | date" >
+                                </label>
                             @else
                                 @{{ trackOrder.planning_sent_at }}
                             @endcan
                         </td>
                         <td class="td-calm">
                             @can('订单管理-跟踪-物流公司编辑')
-                                <select class="form-control form-control-sm" :value="trackOrder.is_on_duty_shift" @change="logisticUpdate($event,'is_on_duty_shift',trackOrder)" >
-                                    <option v-for="item in isOnDutyShift" :value="item">@{{ item }}</option>
-                                </select>
+                                <label>
+                                    <select class="form-control form-control-sm" :value="trackOrder.is_on_duty_shift" @change="logisticUpdate($event,'is_on_duty_shift',trackOrder)" >
+                                        <option v-for="item in isOnDutyShift" :value="item">@{{ item }}</option>
+                                    </select>
+                                </label>
                             @else
                                 @{{ trackOrder.is_on_duty_shift }}
                             @endcan
                         </td>
                         <td class="td-calm">
                             @can('订单管理-跟踪-物流公司编辑')
+                                <label>
                                 <select class="form-control form-control-sm" :value="trackOrder.is_arrival" @change="logisticUpdate($event,'is_arrival',trackOrder)" >
                                     <option v-for="item in isArrival" :value="item">@{{ item }}</option>
                                 </select>
+                                </label>
                             @else
                                 @{{ trackOrder.is_arrival }}
                             @endcan
                         </td>
                         <td class="td-calm">
                             @can('订单管理-跟踪-物流公司编辑')
-                                <input class="form-control form-control-sm" type="date"  @change="logisticUpdate($event,'signed_at',trackOrder)" :value="trackOrder.signed_at | date">
+                                <label >
+                                    <input class="form-control form-control-sm" type="date"  @change="logisticUpdate($event,'signed_at',trackOrder)" :value="trackOrder.signed_at | date">
+                                </label>
                             @else
                                 @{{ trackOrder.signed_at }}
                             @endcan
                         </td>
                         <td class="td-calm">
                             @can('订单管理-跟踪-物流公司编辑')
-                                <input class="form-control form-control-sm" @change="logisticUpdate($event,'receive_bill_status',trackOrder)" :value="trackOrder.receive_bill_status">
+                                <label>
+                                    <input class="form-control form-control-sm" @change="logisticUpdate($event,'receive_bill_status',trackOrder)" :value="trackOrder.receive_bill_status">
+                                </label>
                             @else
                                 @{{ trackOrder.receive_bill_status }}
                             @endcan
                         </td>
                         <td class="td-calm" data-toggle="tooltip">
                             @can('订单管理-跟踪-物流公司编辑')
-                                <input class="form-control form-control-sm" @change="logisticUpdate($event,'remark',trackOrder)" :value="trackOrder.remark" data-toggle="tooltip" data-placement="bottom" :title="trackOrder.remark">
+                                <label>
+                                    <input class="form-control form-control-sm" @change="logisticUpdate($event,'remark',trackOrder)" :value="trackOrder.remark" data-toggle="tooltip" data-placement="bottom" :title="trackOrder.remark">
+                                </label>
                             @else
                                 @{{ trackOrder.remark }}
                             @endcan
@@ -267,10 +308,17 @@
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
+
     <style>
         .btn-border{
             border:1px solid rgba(108, 117, 125,0.3);
         }
+        .fade-enter-active, .fade-leave-active {
+            transition: opacity .3s;
+        }
+        .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
+            opacity: 0;
+        }
     </style>
     <script>
         let tracking_vue = new Vue({
@@ -300,6 +348,9 @@
                 selectTr:''
             },
             mounted:function(){
+                this.trackOrders.forEach(function(item,index,self){
+                    self[index]['displayed'] = false;
+                });
                 this.imgs=Array.from(document.getElementById('tracking_div').querySelectorAll('img'));
                 this.lazy();
                 if (this.imgs&&this.imgs.length>0){
@@ -356,11 +407,7 @@
             watch:{
                 checkData: {
                     handler() {
-                        if (this.checkData.length === this.trackOrders.length && this.checkData.length !== 0) {
-                            document.querySelector('#all').checked = true;
-                        } else {
-                            document.querySelector('#all').checked = false;
-                        }
+                        document.querySelector('#all').checked = this.checkData.length === this.trackOrders.length && this.checkData.length !== 0;
                     },
                     deep: true
                 },
@@ -368,9 +415,9 @@
             methods:{
                 checkAll(e){
                     if (e.target.checked) {
-                        this.trackOrders.forEach((el, i) => {
-                            if (this.checkData.indexOf(el.id) === -1)
-                                this.checkData.push(el.id);
+                        this.trackOrders.forEach((el) => {
+                            if (this.checkData.indexOf(el['id']) === -1)
+                                this.checkData.push(el['id']);
                         });
                     } else {
                         this.checkData = [];
@@ -426,7 +473,7 @@
                 },
                 hideInput(e){
                     let input = $(e.target);
-                    let button = input.prev('button').show();
+                    input.prev('button').show();
                     input.addClass('d-none');
                 },
                 warehouseUpdate(e,param,trackingOrder){
@@ -497,7 +544,6 @@
                     this.trackOrders.forEach(function(trackOrder){
                         if(parseInt(data['id']) === trackOrder['id'] ){
                             trackOrder[data['param']] = data['value'];
-                            return;
                         }
                     });
                 },
@@ -525,7 +571,7 @@
                         value='新杰物流'
                     }
                     let data = {id:tackOrder.id,param:'logistic_id',value:value}
-                    let _this = this
+
                     axios.post('{{url('apiLocal/order/tracking/updateLogisticId')}}',data).then(function (response) {
                         tempTip.setDuration(2000);
                         if(response.data.success){
@@ -570,7 +616,6 @@
                                     },1);
                                 }
                             })
-                            console.log(_this.imgs);
                             tempTip.showSuccess('上传成功!')
                         }else{
                             tempTip.show(response.data.error)
@@ -630,7 +675,7 @@
                         if(response.data.success){
                             tempTip.showSuccess('删除成功!')
                             let _orderTracking = _this.trackOrders.find(function(_orderTrack){
-                                return id ==_orderTrack.id;
+                                return id === _orderTrack['id'];
                             });
                             if(_orderTracking===null){return}
                             _this.trackOrders.forEach(function (_orderTrack) {
@@ -669,9 +714,8 @@
                     return value
                 },
                 number:function(value){
-                    var toFixedNum = Number(value).toFixed(3);
-                    var realVal = toFixedNum.substring(0, toFixedNum.toString().length - 1);
-                    return realVal;
+                    let toFixedNum = Number(value).toFixed(3);
+                    return toFixedNum.substring(0, toFixedNum.toString().length - 1);
                 }
             },
 

+ 94 - 0
tests/Services/OrderPackageCommoditySerialNumberService/GetCreateModelBy.php

@@ -0,0 +1,94 @@
+<?php
+
+
+namespace Tests\Services\OrderPackageCommoditySerialNumberService;
+
+use App\Commodity;
+use App\OracleActAllocationDetails;
+use App\OracleDOCOrderHeader;
+use App\OracleDocOrderSerialNo;
+use App\Order;
+use App\OrderPackage;
+use App\OrderPackageCommodities;
+use App\Services\OrderPackageCommoditySerialNumberService;
+use \Tests\TestCase;
+
+class GetCreateModelBy extends TestCase
+{
+    /** @var OrderPackageCommoditySerialNumberService $service */
+    protected $service ;
+    public $data = [];
+
+    protected function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app(OrderPackageCommoditySerialNumberService::class);
+        $orderHeaders = factory(OracleDOCOrderHeader::class)->times(3)->make();
+        $count= 0;
+
+        foreach ($orderHeaders as $orderHeader) {
+            $actAllocationDetails =  factory(OracleActAllocationDetails::class)->times(3)->make(['orderno'=>$orderHeader['orderno']]);
+            foreach ($actAllocationDetails as $actAllocationDetail) {
+                $oracleDocOrderSerialNos = factory(OracleDocOrderSerialNo::class)->times(3)
+                    ->make(['allocationdetailsid'=>$actAllocationDetail['allocationdetailsid'],'sku'=>$actAllocationDetail['sku']]);
+                $count+=3;
+                $actAllocationDetail->setRelation('oracleDocOrderSerialNos',$oracleDocOrderSerialNos);
+            }
+            $orderHeader->setRelation('actAllocationDetails',$actAllocationDetails);
+        }
+        $orders = [];
+        $orderPackages = [];
+        $commodities = [];
+        $orderPackageCommodities = [];
+        foreach ($orderHeaders as $orderHeader) {
+            $order = factory(Order::class)->create(['code'=>$orderHeader['orderno']]);
+            $orders[] = $order;
+            foreach ($orderHeader['actAllocationDetails'] as $actAllocationDetail) {
+                $commodity = factory(Commodity::class)->create(['sku'=>$actAllocationDetail['sku']]);
+                $orderPackage =  factory(OrderPackage::class)->create(['order_id' => $order['id'],'logistic_number'=> $actAllocationDetail['picktotraceid']]);
+                $orderPackageCommodity = factory(OrderPackageCommodities::class)
+                    ->create(['order_package_id'=>$orderPackage['id'],'commodity_id'=>$commodity['id'],'amount'=>$actAllocationDetail['qty_each']]);
+                $orderPackageCommodities[] = $orderPackageCommodity;
+                $orderPackages[] =$orderPackage;
+                $commodities[] = $commodity;
+            }
+        }
+        $this->data['count'] = $count;
+        $this->data['orders'] = $orders;
+        $this->data['orderPackages'] = $orderPackages;
+        $this->data['orderPackages'] = $orderPackages;
+        $this->data['commodities'] = $commodities;
+        $this->data['orderPackageCommodities'] = $orderPackageCommodities;
+        $this->data['orderHeaders'] = $orderHeaders;
+    }
+
+    public function testGetInnerParams()
+    {
+        $orderQuery = Order::query()->selectRaw('id')->whereIn('code', data_get($this->data['orderHeaders'], '*.orderno'));
+        $orderPackages = OrderPackage::query()->with(['commodities' => function ($query) {
+            $query->with('commodity', 'serialNumbers');
+        }])->whereIn('Order_Packages.Order_id', $orderQuery)->get();
+//        $this->tearDown();
+        $innerParams = $this->service->getCreateModelBy($this->data['orderHeaders'],$orderPackages);
+        foreach ($this->data['orderHeaders'] as $orderHeader){
+            foreach ($orderHeader['actAllocationDetails'] as $actAllocationDetail) {
+                $logisticNumber = $actAllocationDetail['picktotraceid'];
+                $sku = $actAllocationDetail['sku'];
+                foreach ($actAllocationDetail['oracleDocOrderSerialNos'] as $oracleDocOrderSerialNo){
+                    $serialno = $oracleDocOrderSerialNo['serialno'];
+                    $this->assertNotEmpty($innerParams[$logisticNumber][$sku][$serialno]);
+                }
+            }
+        }
+        $this->assertNotEmpty($innerParams);
+    }
+
+    protected function tearDown():void
+    {
+        Order::query()->whereIn('id',data_get($this->data['orders'],'*.id'))->delete();
+        OrderPackage::query()->whereIn('logistic_number',data_get($this->data['orderPackages'],'*.logistic_number'))->delete();
+        OrderPackageCommodities::query()->whereIn('id',data_get($this->data['orderPackageCommodities'],'*.id'))->delete();
+        Commodity::query()->whereIn('id',data_get($this->data['commodities'],'*.id'))->delete();
+        parent::tearDown();
+    }
+}