Browse Source

问题追踪件 部分修改

ajun 5 năm trước cách đây
mục cha
commit
5298c23af3

+ 0 - 2
app/Http/Controllers/OrderTrackingController.php

@@ -76,6 +76,4 @@ class OrderTrackingController extends Controller
         return $service->export($request->input());
     }
 
-
-
 }

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

@@ -25,11 +25,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;
@@ -465,4 +468,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);
+
+    }
+
 }

+ 3 - 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";

+ 4 - 0
app/Providers/AppServiceProvider.php

@@ -4,7 +4,9 @@ namespace App\Providers;
 
 use App\Http\Controllers\Controller;
 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\OracleDOCOrderHeaderService;
 use App\Services\OrderIssuePerformanceService;
@@ -129,6 +131,8 @@ class AppServiceProvider extends ServiceProvider
         //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(){

+ 54 - 35
app/Services/CommodityService.php

@@ -6,7 +6,9 @@ use App\Commodity;
 use App\Http\Controllers\Controller;
 use App\OracleBasSKU;
 use App\Owner;
+use App\Services\common\BatchUpdateService;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
 
 Class CommodityService
 {
@@ -35,30 +37,42 @@ Class CommodityService
         return Commodity::query()->insert($params);
     }
 
-    public function  getWASCommoditiesByWMSOrderHeaders($orderHeaders)
+    public function getWASCommoditiesByWMSOrderHeaders($orderHeaders)
     {
         $skus = [];
         $customerIDs = [];
         $logs = [];
         $errs = [];
+        $fillables = [];
+        $owners_list = [];
+
         foreach ($orderHeaders as $orderHeader) {
-            array_push($customerIDs,$orderHeader['customerid']);
+            $customerIDs[] = $orderHeader['customerid'];
             $oracleDOCOrderDetails = $orderHeader['oracleDOCOrderDetails'] ?? [];
             foreach ($oracleDOCOrderDetails as $detail) {
-                array_push($skus,$detail['sku']);
+                $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) {
-                $owner = $owners->where('code',$baseSKU['customerid'])->first();
-                $fillable = [
+                $key = 'code='.$baseSKU['customerid'];
+                $owner = $owners_list[$key] ?? '';
+                $fillables[] = [
                     'name' => $baseSKU['descr_c'],
                     'sku' => $baseSKU['sku'],
                     'owner_id' => $owner['id'] ?? '',
@@ -67,53 +81,58 @@ Class CommodityService
                     'height' => $baseSKU['skuhigh'] ?? '',
                     'volumn' => $baseSKU['cube'],
                 ];
-                try {
-                    Commodity::query()->create($fillable);
-                    array_push($logs,json_encode($fillable));
-                    LogService::log(__METHOD__,__FUNCTION__,'添加商品信息'.json_encode($fillable));
-                } catch (\Exception $e) {
-                    array_push($errs,json_encode($fillable).$e->getMessage().$e->getTraceAsString());
-                }
             }
         }
-        if(count($logs)>0)
-            LogService::log(__METHOD__,__FUNCTION__,'添加商品信息'.json_encode($logs));
-        if(count($errs)>0)
-            LogService::log(__METHOD__,__FUNCTION__,'添加商品信息'.json_encode($errs));
+        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){
-        $logs = [];$errs = [];
+        /** @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');
+            $SkuCode = data_get($noAttributeCommodity,'*.sku');
             $BasSKUs = OracleBasSKU::query()->whereIn('sku',$SkuCode)->get();
-
             foreach ($noAttributeCommodity as $commodity){
-                $BasSKU = $BasSKUs->where('sku',$commodity['code'])
+                $BasSKU = $BasSKUs
+                    ->where('sku',$commodity['code'])
                     ->where('CustomerID',$commodity['owner']['code'])
                     ->first();
                 $update = [
-                    'length' => $BasSKU['SKULength'],
-                    'width' => $BasSKU['SKUWidth'],
-                    'height' => $BasSKU['SKUHigh'],
-                    'volumn' => $BasSKU['Cube'],
+                    'id' => $commodity['id'],
+                    'length' =>  $BasSKU['skulength'] ?? 0,
+                    'width' => $BasSKU['skuwidth'] ?? 0,
+                    'height' => $BasSKU['skuhigh'] ?? 0,
+                    'volumn' => $BasSKU['cube'] ?? 0,
                 ];
-                try {
-                    $commodity->update($update);
-                    array_push($logs,['info' =>  '商品修改「' . json_encode($commodity->toArray()) . '」']);
-                } catch (\Exception $e) {
-                    array_push($errs,['info' =>  '商品修改异常「' . json_encode($e) . '」']);
+                if($commodity['length'] !==$update['length'] ||$commodity['width'] !==$update['width'] ||$commodity['height'] !==$update['height'] ||$commodity['volumn'] !==$update['volumn'] ){
+                    $multipleData[] = $update;
                 }
             }
         }
-
-        $user =  Auth::user();
-        if(count($logs) > 0)
-            Controller::logS(__METHOD__,__FUNCTION__,'批量修改商品「' . json_encode($logs) . '」'.$user['id']);
-        if(count($errs) > 0)
-            Controller::logS(__METHOD__,__FUNCTION__,'批量修改商品异常「' . json_encode($errs) . '」'.$user['id']);
+        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)

+ 2 - 2
app/Services/OracleDOCOrderHeaderService.php

@@ -20,7 +20,7 @@ Class OracleDOCOrderHeaderService
         $owners = $ownerService->获取订单跟踪的货主();
         $ownerIds = data_get($owners, '*.code');
         return OracleDOCOrderHeader::query()
-            ->with(['oracleDOCOrderDetails', 'actAllocationDetails', 'oracleBASCode'])
+            ->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCustomer'])
             ->where('addtime', '>=', $startDate)
             ->whereIn('customerID', $ownerIds)
             ->orderBy('addtime')
@@ -33,7 +33,7 @@ Class OracleDOCOrderHeaderService
         $owners = $ownerService->获取订单跟踪的货主();
         $ownerIds = data_get($owners, '*.code');
         return OracleDOCOrderHeader::query()
-            ->with(['oracleDOCOrderDetails', 'actAllocationDetails', 'oracleBASCode'])
+            ->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCustomer'])
             ->where('EditTime','>=',$startDate)
             ->whereColumn('EditTime','<>','addtime')
             ->whereIn('customerID', $ownerIds)

+ 34 - 16
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());
+            }
         }
-        LogService::log(__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)
@@ -398,6 +415,7 @@ class OrderIssueService
         $orderIssue->fill($arr['orderIssues']);
         $orderIssue->同步退单状态();
         $orderIssue->update();
+        unset($orderIssue,$arr);
     }
 
 }

+ 96 - 66
app/Services/OrderPackageCommoditiesService.php

@@ -3,7 +3,6 @@
 namespace App\Services;
 
 use App\Commodity;
-use App\Http\Controllers\Controller;
 use App\OracleActAllocationDetails;
 use App\OracleBasSKU;
 use App\OracleDOCOrderDetail;
@@ -12,8 +11,8 @@ use App\Order;
 use App\OrderPackage;
 use App\OrderPackageCommodities;
 use App\Owner;
+use App\Services\common\BatchUpdateService;
 use Carbon\Carbon;
-use Illuminate\Support\Arr;
 
 class OrderPackageCommoditiesService
 {
@@ -22,12 +21,14 @@ class OrderPackageCommoditiesService
         $details = OracleDOCOrderDetail::query()->where('orderNo', $orderNo)->get();
         $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();
         $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){
@@ -52,7 +53,7 @@ class OrderPackageCommoditiesService
                     $packageCommodity->update(['amount'=>intval($newItem['amount'])]);
                 }
                 $orderPackageCommodities =  $orderPackageCommodities->filter(function ($item) use ($packageCommodity){
-                    if($item['id'] ==  $packageCommodity['id']){
+                    if($item['id'] == $packageCommodity['id']){
                         return false;
                     }
                     return true;
@@ -68,7 +69,9 @@ class OrderPackageCommoditiesService
         }
         $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']){
+                if($item['order_package_id'] == $newItem['order_package_id'] &&
+                    $item['commodity_id'] == $newItem['commodity_id'] &&
+                    $item['amount'] == $newItem['amount']){
                     return false;
                 }
             }
@@ -81,6 +84,8 @@ class OrderPackageCommoditiesService
             }
         } catch (\Exception $e) {
             LogService::log(__METHOD__,__FUNCTION__,'添加包裹商品信息异常'.json_encode($newItems).$e->getMessage(),$e->getTraceAsString());
+        } finally {
+            unset($newItems,$orderPackageCommodities);
         }
     }
 
@@ -89,6 +94,7 @@ class OrderPackageCommoditiesService
         $details = OracleActAllocationDetails::query()->where('picktotraceid', $orderPackage->logistic_number)->get();
         $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)
@@ -160,11 +166,12 @@ class OrderPackageCommoditiesService
         /** @var CommodityService $commodityService */
         $commodityService = app('commodityService');
         $commodities = $commodityService->getWASCommoditiesByWMSOrderHeaders($orderHeaders); // 商品
+
         $orderPackages = [];
         $orderList = [];
         foreach ($orders as $order) {
             $orderList[$order['id']] = $order;
-            $packages = $order['packages'];
+            $packages = $order['packages'] ?? [];
             foreach ($packages as $package) {
                 $orderPackages[$package['logistic_number']]  = $package;
             }
@@ -181,11 +188,11 @@ class OrderPackageCommoditiesService
             if(count($details1) > 0 ||  count($details2) > 0){
                 $items = $this->根据订单分配详情返回创建数组($details1,$orderPackage,$commodities,$order);
                 foreach ($items as $item){
-                    array_push($fillables,$item);
+                    $fillables[] = $item;
                 }
                 $items = $this->根据订单分配详情返回创建数组($details2,$orderPackage,$commodities,$order);
                 foreach ($items as $item){
-                    array_push($fillables,$item);
+                    $fillables[] = $item;
                 }
                 continue;
              }
@@ -193,7 +200,7 @@ class OrderPackageCommoditiesService
             if($details->count() >0){
                 $items = $this->根据订单详情返回创建数组($details,$orderPackage,$commodities,$order);
                 foreach ($items as $item){
-                    array_push($fillables,$item);
+                    $fillables[] = $item;
                 }
             }
         }
@@ -214,42 +221,45 @@ class OrderPackageCommoditiesService
     public function 更新WAS订单快递打包商品信息($orderHeaders,$orders,$commodities)
     {
         $newItems = $this->获取WMS订单打包信息($orderHeaders,$commodities,$orders);
-        $orderPackagesCommodities = collect();
-        foreach ($orders as $order) {
-            $orderPackages = $order['packages'];
-            foreach ($orderPackages as  $orderPackage){
-                $commodities = $orderPackage['commodities'];
-                foreach ($commodities as $commodity) {
-                    $orderPackagesCommodities = $orderPackagesCommodities->push($commodity);
-                }
+        $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) {
-            $packageCommodity =  $orderPackagesCommodities
-                ->where('order_package_id',$newItem['order_package_id'])
-                ->where('commodity_id',$newItem['commodity_id'])
-                ->where('amount',$newItem['amount'])
-                ->first();
+            $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]);
-                $orderPackagesCommodities->diff($packageCommodity);
+                array_shift($packageCommodity_list_amount[$key1]);
             }else{
-                $packageCommodity =  $orderPackagesCommodities
-                    ->where('order_package_id',$newItem['order_package_id'])
-                    ->where('commodity_id',$newItem['commodity_id'])
-                    ->first();
+                $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){
-                        try {
-                            $packageCommodity->update(['amount' => $amount]);
-                            LogService::log(__METHOD__, __FUNCTION__, '修改packageCommodity详情' . json_encode($packageCommodity));
-                            unset($newItems[$key]);
-                            $orderPackagesCommodities->diff($packageCommodity);
-                        } catch (\Exception $e) {
-                            LogService::log(__METHOD__,__FUNCTION__,'修改packageCommodity详情失败'.json_encode($packageCommodity).$e->getMessage().$e->getTraceAsString());;
-                        }
+                        $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]);
                 }
             }
         }
@@ -261,12 +271,30 @@ class OrderPackageCommoditiesService
         }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->where('code',$orderHeader['orderno'])->first();
+            $order = $orders[$orderHeader['orderno']] ?? '';
             if(!($order ?? false)){
                 continue;
             }
@@ -275,29 +303,23 @@ class OrderPackageCommoditiesService
             $actAllocationDetails = $orderHeader['actAllocationDetails'] ?? [];
             if($actAllocationDetails->count() > 0){
                 foreach ($orderPackages as $orderPackage) {
-
+                    $details = [];
                     if($orderPackage['logistic_number'] == $orderHeader['soreference5'] ){
-                        $details = [];
                         foreach ($actAllocationDetails as $detail) {
-                            if($detail['picktotraceid'] == '*' || $detail['picktotraceid'] == $orderHeader['soreference5']){
-                                array_push($details,$detail);
-                            }
+                            if($detail['picktotraceid'] == '*' || $detail['picktotraceid'] == $orderHeader['soreference5'])
+                                $details[] = $detail;
                         }
-                        $addArr = $this->根据订单分配详情返回创建数组($details,$orderPackage,$commodities,$order);
-                        $newItems = $this->addArrByNewItems($newItems,$addArr);
                     }else{
-                        $details = [];
                         $logistic_number = $orderPackage['logistic_number'];
                         foreach ($actAllocationDetails as $detail) {
-                            if($detail['picktotraceid'] == $logistic_number){
-                                array_push($details,$detail);
-                            }
+                            if($detail['picktotraceid'] == $logistic_number)
+                                $details[] = $detail;
                         }
-                        $addArr = $this->根据订单分配详情返回创建数组($details,$orderPackage,$commodities,$order);
-                        $newItems = $this->addArrByNewItems($newItems,$addArr);
                     }
+                    $addArr = $this->basedDetailsReturnFillables($details,$orderPackage,$commodities_list,$order,'qty');
+                    $newItems = array_merge($newItems,$addArr);
                 }
-            }elseif($oracleDOCOrderDetails->count()>0){
+            }elseif($oracleDOCOrderDetails->count() > 0){
                 foreach ($orderPackages as $orderPackage) {
                     $details = [];
                     $logistic_number = $orderPackage['logistic_number'];
@@ -306,8 +328,8 @@ class OrderPackageCommoditiesService
                             array_push($details,$detail);
                         }
                     }
-                    $addArr = $this->根据订单详情返回创建数组($details,$orderPackage,$commodities,$order);
-                    $newItems = $this->addArrByNewItems($newItems,$addArr);
+                    $addArr = $this->basedDetailsReturnFillables($details,$orderPackage,$commodities_list,$order,'qtyordered');
+                    $newItems = array_merge($newItems,$addArr);
                 }
             }
         }
@@ -323,8 +345,7 @@ class OrderPackageCommoditiesService
                 'commodity_id' => $commodity['id'] ?? '',
                 'amount' => $detail['qtyordered'],
             ];
-
-            array_push($orderPackagerCommodities,$fillable);
+            $orderPackagerCommodities[] = $fillable;
         }
         return $orderPackagerCommodities;
     }
@@ -339,26 +360,35 @@ class OrderPackageCommoditiesService
                 'commodity_id' => $commodity['id'] ?? '',
                 'amount' => $detail['qty'] ?? '',
             ];
-
             array_push($orderPackagerCommodities,$fillable);
         }
         return $orderPackagerCommodities;
     }
 
-    private function 根据数组返回模型对象($arr){
-        $orderPackagerCommodities = new OrderPackageCommodities();
-        $orderPackagerCommodities->order_package_id  = $arr['order_package_id'];
-        $orderPackagerCommodities->commodity_id  = $arr['commodity_id'];
-        $orderPackagerCommodities->amount  = $arr['amount'];
-        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;
     }
 
-    private function addArrByNewItems($newItems,$fillailes){
-        foreach ( $fillailes as $fillaile){
-            $orderPackagerCommodities = $this->根据数组返回模型对象($fillaile);
-            array_push($newItems,$orderPackagerCommodities);
+    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 $newItems;
+        return $orderPackagerCommodities;
     }
-
 }

+ 81 - 54
app/Services/OrderPackageService.php

@@ -8,7 +8,8 @@ use App\OracleDOCOrderHeader;
 use App\Order;
 use App\OrderPackage;
 use App\OrderPackageCommodities;
-use function GuzzleHttp\Promise\all;
+use App\Services\common\BatchUpdateService;
+use Carbon\Carbon;
 
 class OrderPackageService
 {
@@ -91,6 +92,7 @@ class OrderPackageService
                 }
             }
         }
+        unset($oracleActAllocationDetails,$oracleDOCOrderDetail);
     }
 
     public function updateOrderPackageInfo(Order $order)
@@ -162,54 +164,61 @@ class OrderPackageService
             ->paginate($paginate);
     }
 
+
     public function 根据WMS订单创建WAS包裹($orderHeaders, $orders)
     {
         $orderPackagesFillables = [];
-        $order_ids = [];
         foreach ($orders as $order) {
-            $orderHeader = $orderHeaders[strval($order['code'])];
-            if($orderHeader == null){
+            $orderHeader = $orderHeaders[strval($order['code'])] ?? false;
+            if(!$orderHeader){
                 continue;
             }
             $fillables = $this->根据WMS订单生成包裹信息($orderHeader, $order);
             foreach ($fillables as $fillable) {
-                array_push($order_ids,$fillable['order_id'] ?? '');
-                array_push($orderPackagesFillables,$fillable);
+                $orderPackagesFillables[] = $fillable;
             }
         }
-
         try {
             if(count($orderPackagesFillables) > 0){
                 OrderPackage::query()->insert($orderPackagesFillables);
-                LogService::log(__METHOD__, __FUNCTION__, '批量订单包裹信息' .count($orderPackagesFillables).'「'. json_encode($orderPackagesFillables) . '」');
+                LogService::log(__METHOD__, __FUNCTION__, '批量订单包裹信息' .count($orderPackagesFillables). json_encode($orderPackagesFillables) );
             }
         } catch (\Exception $e) {
-            LogService::log(__METHOD__, __FUNCTION__, '订单创建失败「' .  $e->getMessage().$e->getTraceAsString().json_encode($orderPackagesFillables));
+            LogService::log(__METHOD__, __FUNCTION__, '批量订单包裹信息 error' .json_encode($orderPackagesFillables) .  $e->getMessage().$e->getTraceAsString());
         } finally {
-            return Order::query()->with('packages')->whereIn('id',data_get($orders,'*.id'))->get();
+            $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)
     {
-        $orderPackages= [];
+
         $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,
                 ];
-                array_push($orderPackages, $fillable);
+                $orderPackages[] = $fillable;
             }
         }
         return $orderPackages;
@@ -217,68 +226,84 @@ class OrderPackageService
 
     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 $orderPackage) {
-            $orderPackageCommodities =   $orderPackage['commodities'] ?? [];
-            $updateArr = [
-                'weight' => 0,
-                'bulk' => 0,
-            ];
-            foreach ($orderPackageCommodities as $packageCommodity) {
-                $commodity = $commodities->where('id')->first();
-                if(!($commodity['weight'] ?? false) ||!($packageCommodity['amount'] ?? false) ){
-                    array_push($noAttributeCommodity,$commodity);
+        foreach ($orderPackages as $packages) {
+            foreach ($packages as $package) {
+                $orderPackageCommodities =   $orderPackage['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);
                 }
-                $updateArr['weight'] +=(intval($commodity['weight']) ?? 0)  * ( intval($packageCommodity['amount']) ?? 0);
-                $updateArr['bulk'] += (intval($commodity['bulk']) ?? 0) * (intval($packageCommodity['amount']) ?? 0);
-            }
-            if($updateArr['weight']== 0 &&$updateArr['bulk'] ==0 ){
-                continue;
-            }
-            try {
-                $orderPackage->update($updateArr);
-                LogService::log(__METHOD__,__FUNCTION__,'同步订单包裹重量体积'.json_encode($updateArr));
-            } catch (\Exception $e) {
-                LogService::log(__METHOD__,__FUNCTION__,'同步订单包裹重量体积失败'.json_encode($updateArr).$e->getMessage().$e->getTraceAsString());
+                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){
+
+    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] ?? null;
-            if(!$order?? false){continue;}
-            $orderPackages = $order['packages'] ?? [];
-            $logistic_numbers = [];
-            foreach ($orderPackages as $orderPackage) {
-                array_push($logistic_numbers,$orderPackage['logistic_number']);
+            $order = $orders[$key] ?? false;
+            if(!$order){
+                continue;
             }
-            $logistic_numbers = array_unique($logistic_numbers) ;
-            $actAllocationDetails = $orderHeader->actAllocationDetails;
-            $picktotraceIds = [];
-            foreach ($actAllocationDetails as $actAllocationDetail) {
-                array_push($picktotraceIds,$actAllocationDetail['picktotraceid']);
+            $packages = $orders_package_map[$key] ?? false;
+            $pickToTraceIds = [];
+            foreach ($orderHeader->actAllocationDetails as $actAllocationDetail) {
+                $pickToTraceIds[] = $actAllocationDetail['picktotraceid'];
             }
-            $picktotraceIds = array_unique($picktotraceIds);
-            $picktotraceIds = array_diff($picktotraceIds,['','*',null]);
+            $pickToTraceIds = array_unique(array_diff($pickToTraceIds,['','*',null]));
 
-            $logistic_number_list = array_diff($picktotraceIds,$logistic_numbers);
-
-            foreach ($logistic_number_list as $item) {
-                $orderPackage =  $orderPackages->where('logistic_number',$item)->first();
-                if(!$orderPackage ?? false){
-                    $fillable = ['order_id'=>$order['id'],'logistic_number' => $item];
-                    array_push($fillables, $fillable);
+            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);
@@ -286,6 +311,8 @@ class OrderPackageService
             }
         } catch (\Exception $e) {
             LogService::log(__METHOD__,__FUNCTION__,'创建orderPackage 失败:'.json_encode($fillables).$e->getMessage().$e->getTraceAsString());
+        } finally {
+            unset($fillables);
         }
     }
 

+ 189 - 109
app/Services/OrderService.php

@@ -2,7 +2,6 @@
 
 namespace App\Services;
 
-use App\Http\Controllers\Controller;
 use App\Logistic;
 use App\OracleActAllocationDetails;
 use App\OracleDOCASNHeader;
@@ -12,10 +11,11 @@ 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;
-use Carbon\Carbon;
 
 class OrderService
 {
@@ -356,8 +356,9 @@ 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();
     }
 
@@ -389,24 +390,26 @@ class OrderService
 
     public function 根据设置从WMS获取跟踪的订单($startDate)
     {
+
         /** @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService */
         $oracleDOCOrderHeaderService = app('oracleDOCOrderHeaderService');
         $orderHeadersResult = $oracleDOCOrderHeaderService->根据时间获取在这段时间内创建的WMS订单($startDate);
-        LogService::log('111','111',json_encode($orderHeadersResult));
+
         if ($orderHeadersResult->count() == 0) {
             return null;
         }
-        // 数据重组
-        $orderHeaders = [];
+
+        $orderHeaders_map = [];
         $oracleDOCOrderDetails = [];
         $actAllocationDetails = [];
-        foreach ($orderHeadersResult as $item) {
-            $orderHeaders[$item['orderno']] = $item;
-            $oracleDOCOrderDetails[$item['orderno']] = $item['oracleDOCOrderDetails'];
-            $details = $item['actAllocationDetails'];
+
+        foreach ($orderHeadersResult as $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']);
-                $orderno = strval($detail['orderno']);
                 if ($picktotraceid == '*') {
                     if (!($actAllocationDetails[$orderno] ?? false)) {
                         $actAllocationDetails[$orderno] = [];
@@ -417,29 +420,62 @@ class OrderService
                 if (!($actAllocationDetails[$picktotraceid] ?? false)) {
                     $actAllocationDetails[$picktotraceid] = [];
                 }
-                array_push($actAllocationDetails[$picktotraceid], $detail);
+                $actAllocationDetails[$picktotraceid][] =$detail;
             }
         }
+        unset($orderHeadersResult);
 
-        return $this->根据WMS订单生成WAS订单($orderHeaders, $oracleDOCOrderDetails, $actAllocationDetails);
+        return $this->根据WMS订单生成WAS订单($orderHeaders_map, $oracleDOCOrderDetails, $actAllocationDetails);
     }
 
     public function 根据设置从WMS同步该时间段内更新的订单($startDate)
     {
         /** @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService */
         $oracleDOCOrderHeaderService = app('oracleDOCOrderHeaderService');
+
         $editedOrderHeaders = $oracleDOCOrderHeaderService->根据时间获取在这段时间内更新的WMS订单($startDate);
-        $orderHeaders = [];
+        $orderHeaders_map = [];
         foreach ($editedOrderHeaders as $editedOrderHeader) {
-            $orderHeaders[$editedOrderHeader['orderno']] = $editedOrderHeader;
+            $orderHeaders_map[$editedOrderHeader['orderno']] = $editedOrderHeader;
         }
-        $updateCommodities = $this->将WMS订单对应的WAS订单信息更新($orderHeaders);
-        return compact('updateCommodities', 'editedOrderHeaders');
+
+        $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 [];
         }
@@ -447,12 +483,10 @@ class OrderService
         $owners = $params['owners'];
         $shops = $params['shops'];
         $logistics = $params['logistics'];
-        /** @var OrderPackageService $orderPackageService */
-        $orderPackageService = app('orderPackageService');
-        /** @var OrderPackageCommoditiesService $orderCommoditiesService */
-        $orderCommoditiesService = app('orderPackageCommoditiesService');
         $orderHeaders = $this->过滤已有的WAS订单($orderHeaders);
-        $orders = $this->根据WMS订单创建WAS订单($orderHeaders, $owners, $shops, $logistics);
+        $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);
 
@@ -465,29 +499,51 @@ class OrderService
         return compact('orders', 'orderHeaders', 'actAllocationDetails', 'oracleDOCOrderDetails');
     }
 
-    public function 过滤已有的WAS订单($orderHeaders)
+    public function 过滤已有的WAS订单($orderHeaders,$orders_map = [])
     {
-        $orderNos = array_keys($orderHeaders);
-        $orders = Order::query()->whereIn('code', $orderNos)->get();
-        if ($orders->count() > 0) {
+
+        if(count($orders_map) == 0){
+            $orderNos = array_keys($orderHeaders);
+            $orders = Order::query()->whereIn('code', $orderNos)->get();
             foreach ($orders as $order) {
-                unset($orderHeaders[$order['code']]);
+                $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); // 承运商
@@ -496,45 +552,70 @@ class OrderService
 
     public function 根据WMS订单创建WAS订单($orderHeaders, $owners, $shops, $logistics)
     {
+
         $fillables = [];
-        $client_code = [];
+        $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) {
-            $owner = $owners->where('code', $orderHeader['customerid'])->first();
-            $shop = $shops->where('name', $orderHeader['issuepartyname'])->where('owner_id', $owner['id'])->first();
-            $logistic = $logistics->where('code', $orderHeader['carrierid'])->first();
-
-            $fillable = [
-                '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'] ?? '',
+            $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,
             ];
-            array_push($fillables, $fillable);
-            array_push($client_code, $fillable['client_code']);
         }
         try {
             if (count($fillables) > 0) {
                 Order::query()->insert($fillables);
-                LogService::log(__METHOD__, __FUNCTION__, '批量创建' . count($fillables) . json_encode($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);
         }
-        return Order::query()->whereIn('client_code', $client_code)->get();
     }
 
     // XXX 业务逻辑待修改完善
-    public function 将WMS订单对应的WAS订单信息更新($orderHeaders)
+    public function 将WMS订单对应的WAS订单信息更新($orderHeaders,$ordersList)
     {
         /** @var CommodityService $commodityService */
         $commodityService = app('commodityService');
@@ -542,33 +623,18 @@ class OrderService
         $orderPackageService = app('orderPackageService');
         /** @var OrderPackageCommoditiesService $orderPackageCommoditiesService */
         $orderPackageCommoditiesService = app('orderPackageCommoditiesService');
-
         if (count($orderHeaders) == 0) {
             return [];
         }
-
-        $orderNos = array_keys($orderHeaders);
-
-        $orders = Order::query()
-            ->with('packages.commodities')
-            ->whereIn('code', $orderNos)
-            ->get();
-
-        if ($orders->count() == 0) {
-            return [];
-        }
-
         $commodities = $commodityService->getWASCommoditiesByWMSOrderHeaders($orderHeaders);     // 商品信息
 
-        $ordersList = [];
-        foreach ($orders as $order) {
-            $ordersList[$order['code']] = $order;
-        }
-
-        $this->更新WMS订单对应的的WAS订单($orderHeaders, $orders);
+        $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) {
@@ -576,47 +642,61 @@ class OrderService
             })
             ->get();
 
-        $orderHeadersList = [];
-        foreach ($orderHeaders as $item) {
-            if (in_array($item['orderno'], $orderNos)) {
-                $orderHeadersList[$item['orderno']] = $item;
-            }
-        }
-        $orders = Order::query()
-            ->with('packages.commodities')
-            ->whereIn('code', $orderNos)
-            ->get();
-
-        $orderPackageCommoditiesService->更新WAS订单快递打包商品信息($orderHeadersList, $orders, $commodities);
-
-        $orderPackageCommodities = OrderPackageCommodities::query()
-            ->whereHas('package.order', function ($query) use ($orderNos) {
-                $query->whereIn('code',$orderNos);
-            })->get();
+        unset($orderNos);
 
         $orderPackageService->更新WAS订单的包裹的重量和体积($orderHeaders,$orderPackages);    // 同步包裹重量和体积
 
-        return $orderPackageCommodities;
     }
 
-    public function 更新WMS订单对应的的WAS订单($orderHeaders, $orders)
+    public function  更新WMS订单对应的的WAS订单($orderHeaders, $orders)
     {
-        foreach ($orders as $order) {
-            $orderNo = $order['code'];
-            $orderHeader = $orderHeaders[$orderNo];
-            if ($orderHeader ?? false) {
-                $updateFillable = [
-                    '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'] ?? '',
-                ];
-                $order->update($updateFillable);
+        $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);
             }
         }
     }

+ 88 - 83
app/Services/OrderTrackingService.php

@@ -3,8 +3,8 @@
 namespace App\Services;
 
 use App\Exports\Export;
-use App\Http\Controllers\Controller;
 use App\OrderTracking;
+use App\Services\common\BatchUpdateService;
 use App\Services\common\QueryService;
 use Carbon\Carbon;
 use Illuminate\Support\Facades\Auth;
@@ -53,7 +53,7 @@ class OrderTrackingService
         if ($params['client'] ?? false)  // 客户
             $query->where('client', 'like', $params['client']);
 
-        if ($params['sku'] ?? false){
+        if ($params['sku'] ?? false) {
             $query->whereHas('commodities.commodity', function ($query) use ($params) {
                 $query->where('sku', $params['sku']);
             });
@@ -65,8 +65,8 @@ class OrderTrackingService
             });
         }// 运输单号(快递单号)
 
-        if ($params['ids'] ?? false){
-            $ids = explode(',',$params['ids']);
+        if ($params['ids'] ?? false) {
+            $ids = explode(',', $params['ids']);
             $query->whereIn('id', $ids);
         }
 
@@ -89,16 +89,21 @@ class OrderTrackingService
     }
 
     public function 根据设置从WMS同步追踪货主的订单($startDate)
+    {
+        $this->根据设置从WMS追踪货主的生成订单($startDate);
+        $this->根据设置从该时间段内获取WMS更新的订单($startDate);
+
+    }
+
+    public function 根据设置从WMS追踪货主的生成订单($startDate)
     {
         /** @var OrderService $orderService */
         $orderService = app('orderService');
         $params = $orderService->根据设置从WMS获取跟踪的订单($startDate);
-        $orderHeaders = $params['orderHeaders'];
         $orders = $params['orders'];
-        $actAllocationDetails = $params['actAllocationDetails'];
-        $oracleDOCOrderDetails = $params['oracleDOCOrderDetails'];
+        $orderHeaders = $params['orderHeaders'];
         $this->根据订单生成订单跟踪($orderHeaders, $orders);
-        $this->根据设置从该时间段内获取WMS更新的订单($startDate);
+
     }
 
     public function 根据设置从该时间段内获取WMS更新的订单($startDate)
@@ -106,78 +111,28 @@ class OrderTrackingService
         /** @var OrderService $orderService */
         $orderService = app('orderService');
         $params = $orderService->根据设置从WMS同步该时间段内更新的订单($startDate);
-        $this->更新创建的WAS订单商品跟踪($params['updateCommodities'], $params['editedOrderHeaders']);
+        $orderPackageCommodities = $params['orderPackageCommodities'];
+        $orderHeaders = $params['orderHeaders'];
+        $this->更新创建的WAS订单商品跟踪($orderPackageCommodities, $orderHeaders);
     }
 
     //  XXX 代码逻辑有待纠正
-    public function 更新创建的WAS订单商品跟踪($updateCommodities, $updateOrderHeader)
+    public function 更新创建的WAS订单商品跟踪($updateOrderPackageCommodities, $updateOrderHeader)
     {
-        if ($updateCommodities == null || $updateCommodities->count() == 0) {
+        if ($updateOrderPackageCommodities == null || $updateOrderPackageCommodities->count() == 0) {
             return;
         }
-        if ($updateOrderHeader == null || $updateOrderHeader->count() == 0) {
+        if ($updateOrderHeader == null || count($updateOrderHeader) == 0) {
             return;
         }
-        $ids = $updateCommodities->map(function ($items) {
-            return $items['id'];
-        })->toArray();
+        $ids = data_get($updateOrderPackageCommodities, '*.id');
 
         $orderTrackings = OrderTracking::query()->whereIn('order_package_commodity_id', $ids)->get();
 
-        if ($orderTrackings->count() > 0) { //需要更新
-            foreach ($orderTrackings as $item) {
-                $Commodities = $updateCommodities->where('id', $item['order_package_commodity_id'])->first();
-                $order = $Commodities['package']['order'] ?? '';
-                if ($order ?? false) {
-                    $code = $order['code'];
-                    $orderHeader = $updateOrderHeader->where('orderno', $code)->first();
-                    $pick_up_at = $orderHeader['lastshipmenttime'] ?? null; // 提货时间
-                    if ($orderHeader['Notes'] ?? false) {
-                        $client = explode('[', $orderHeader['notes'])[0] ?? '';
-                    }
-                    $item->update([
-                        'owner_id' => $order['owner_id'],
-                        'client' => $client ?? '',
-                        'created_at' => $order['created_at'],
-                        'pick_up_at' => $pick_up_at, // 提货时间
-                    ]);
-                }
-            }
-            $items_commodities_ids = $orderTrackings->map(function ($item) {
-                return $item['id'];
-            })->toArray();
-            $ids = array_diff($ids, $items_commodities_ids);
-        }
-        $fillables = [];
-        foreach ($ids as $id) { // 需要创建
-            $orderPackageCommodity = $updateCommodities->where('id', $id)->first();
-            $order = $Commodities['package']['order'] ?? '';
-            if(!($order ?? false)){
-                continue;
-            }
-            $orderHeader = $updateOrderHeader->where('orderno', strval($order['code']))->first();
 
-            $pick_up_at = $orderHeader['lastshipmenttime'] ?? null; // 提货时间
-            if ($orderHeader['Notes'] ?? false) {
-                $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, // 提货时间
-            ];
-            array_push($fillables, $fillable);
-        }
-        try {
-            if (count($fillables) > 0) {
-                OrderTracking::query()->insert($fillables);
-                LogService::log(__METHOD__, __FUNCTION__, '批量创建订单跟踪成功' . json_encode($fillables));
-            }
-        } catch (\Exception $e) {
-            LogService::log(__METHOD__, __FUNCTION__, '批量创建订单跟踪失败' . $e->getMessage() . $e->getTraceAsString());
-        }
+        $this->updateOrderTracking($orderTrackings, $updateOrderPackageCommodities); // 更新
+
+        unset($updateOrderPackageCommodities, $updateOrderHeader);
     }
 
     public function 根据订单生成订单跟踪($orderHeaders, $orders)
@@ -185,33 +140,34 @@ class OrderTrackingService
         $orderPackages = [];
         $orderPackageCommodities = [];
         $ordersList = [];
+        $fillables = [];
         foreach ($orders as $order) {
-            $ordersList[$order['id']]= $order;
+            $ordersList[$order['id']] = $order;
             foreach ($order['packages'] as $packages) {
-                $orderPackages[$packages['id']] =  $packages;
+                $orderPackages[$packages['id']] = $packages;
                 foreach ($packages['commodities'] as $item) {
-                    array_push($orderPackageCommodities,$item);
+                    $orderPackageCommodities[] = $item;
                 }
             }
         }
-        $fillables = [];
-        if ($orderPackageCommodities == null || count($orderPackageCommodities) == 0) {
+        if (count($orderPackageCommodities) == 0) {
             return;
         }
-        foreach ($orderPackageCommodities as $orderPackageCommodity) {
-            $order_package_id = $orderPackageCommodity['order_package_id'] ?? '';
-            $orderPackage = $orderPackages[$order_package_id];
 
+        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] ?? '';
+            $order = $ordersList[$order_id] ?? '';
             $orderHeader = $orderHeaders[$order['code']];
-            $pick_up_at = $orderHeader['lastshipmenttime'] ?? ''; // 提货时间
+            $pick_up_at = $orderHeader['lastshipmenttime'] ?? null; // 提货时间
+
             if ($orderHeader['notes'] ?? false) {
-                if(strstr($orderHeader['notes'],'[')){
+                if (strstr($orderHeader['notes'], '[')) {
                     $client = explode('[', $orderHeader['notes'])[0] ?? '';
-
                 }
             }
+
             $fillable = [
                 'order_package_commodity_id' => $orderPackageCommodity['id'],
                 'owner_id' => $order['owner_id'],
@@ -219,16 +175,19 @@ class OrderTrackingService
                 'created_at' => $order['created_at'],
                 'pick_up_at' => $pick_up_at, // 提货时间
             ];
-            array_push($fillables, $fillable);
-        }
+            $fillables[] = $fillable;
+         }
         try {
             if (count($fillables) > 0) {
                 OrderTracking::query()->insert($fillables);
-                LogService::log(__METHOD__, __FUNCTION__, '批量创建订单跟踪成功'.count($fillables) . json_encode($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);
         }
+
     }
 
     private function downLoadAsExec($trackOrders)
@@ -239,8 +198,10 @@ class OrderTrackingService
             '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' => '备注']];
+
         $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'] ?? '';
@@ -266,7 +227,51 @@ class OrderTrackingService
             $list[$i]['remark'] = $trackOrder['remark'];
             $i++;
         }
+
         return Excel::download(new Export($row, $list), date('YmdHis', time()) . '-订单跟踪.xlsx');
     }
 
+    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);
+        }
+    }
 }

+ 1 - 3
app/Services/OwnerService.php

@@ -2,9 +2,7 @@
 
 namespace App\Services;
 
-use App\Http\Controllers\Controller;
 use App\OracleBasCustomer;
-use App\OrderTrackingOwner;
 use App\Owner;
 use Carbon\Carbon;
 use Illuminate\Support\Facades\Auth;
@@ -72,6 +70,7 @@ Class OwnerService
         $codeDiff = array_diff($customerIds, $codes);
         $logs = [];
         $errs = [];
+
         if (count($codes) > count($customerIds)) {
             $basCustomer = OracleBasCustomer::query()->whereIn('customerid', $codeDiff)->get();
             foreach ($basCustomer as $customer) {
@@ -82,7 +81,6 @@ Class OwnerService
                         array_push($logs, ['info' => '创建「' . json_encode($owner) . '」']);
                     } catch (\Exception $e) {
                         array_push($errs, ['info' => '创建「' . json_encode($errs) . '」']);
-
                     }
                 }
             }

+ 1 - 4
app/Services/ShopService.php

@@ -2,10 +2,7 @@
 
 namespace App\Services;
 
-use App\Http\Controllers\Controller;
-use App\Owner;
 use App\Shop;
-use Illuminate\Support\Facades\Auth;
 
 class ShopService
 {
@@ -50,7 +47,7 @@ class ShopService
         }
         try {
             if(count($fillables) > 0){
-                Shop::query()->create($fillables);
+                Shop::query()->insert($fillables);
                 LogService::log(__METHOD__, __FUNCTION__, '批量创建商铺:' .json_encode($fillables));
             }
         } catch (\Exception $e) {

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

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
public/js/app.js


+ 1 - 1
resources/views/order/tracking/index.blade.php

@@ -52,7 +52,7 @@
                             <input id="all" type="checkbox" @click="checkAll($event)"/>
                         </th>
                         <th>序号</th>
-                        <th  style="min-width: 75px">公司</th>
+                        <th style="min-width: 75px">公司</th>
                         <th>订单号</th>
                         <th style="min-width: 120px">WEB+订单号</th>
                         <th style="min-width: 120px"> 提货日期</th>

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác