Przeglądaj źródła

Merge branch 'Order_sync_tack' into zengjun

# Conflicts:
#	app/Http/Controllers/TestController.php
#	app/Services/OrderService.php
#	app/Services/StoreService.php
ajun 5 lat temu
rodzic
commit
70244d8b1f
40 zmienionych plików z 1177 dodań i 484 usunięć
  1. 5 4
      app/Console/Commands/SyncWMSOrderTask.php
  2. 2 2
      app/Http/Controllers/OrderIssueController.php
  3. 79 11
      app/Http/Controllers/TestController.php
  4. 1 1
      app/Services/LogisticService.php
  5. 1 1
      app/Services/OracleDOCOrderHeaderService.php
  6. 189 161
      app/Services/OrderCommodityService.php
  7. 35 29
      app/Services/OrderPackageCommoditiesService.php
  8. 9 8
      app/Services/OrderPackageService.php
  9. 45 12
      app/Services/OrderService.php
  10. 2 2
      app/Services/OwnerService.php
  11. 1 1
      app/Services/ShopService.php
  12. 3 1
      config/sync.php
  13. 4 4
      database/factories/OrcaleDOCOrderHeaderFactory.php
  14. 5 1
      database/factories/OrderCommodityFactory.php
  15. 67 0
      tests/Services/OrderCommodityService/GetReGroupActAllocationDetailsTest.php
  16. 0 65
      tests/Services/OrderCommodityService/SyncOrderCommoditiesTest.php
  17. 91 0
      tests/Services/OrderCommodityService/SyncOrderCommodityTest.php
  18. 0 1
      tests/Services/OrderPackageService/GetInnerParamsTest.php
  19. 64 11
      tests/Services/OrderPackageService/SyncOrderPackageTest.php
  20. 0 39
      tests/Services/OrderPackageService/SyncPackageByOrderHeadersTest.php
  21. 0 1
      tests/Services/OrderService/CreateOrFindOrderInfoTest.php
  22. 0 1
      tests/Services/OrderService/CreateOrFindOrderTest.php
  23. 0 2
      tests/Services/OrderService/FindOrCreateByClientCodeTest.php
  24. 53 0
      tests/Services/OrderService/GetByWmsOrdersTest.php
  25. 11 9
      tests/Services/OrderService/GetCreateOrderModelByWMSOrderHeadersTest.php
  26. 136 0
      tests/Services/OrderService/GetCreateOrderModelsTest.php
  27. 0 1
      tests/Services/OrderService/GetOrderSyncAtTest.php
  28. 0 1
      tests/Services/OrderService/GetParamByOrderHeaderTest.php
  29. 131 97
      tests/Services/OrderService/GetUpdateModelByWmsOrderHeadersTest.php
  30. 70 0
      tests/Services/OrderService/InsertTest.php
  31. 0 1
      tests/Services/OrderService/PushOrderCreatedCacheTest.php
  32. 0 2
      tests/Services/OrderService/PushOrderUpdateCacheTest.php
  33. 0 2
      tests/Services/OrderService/SetOrderSyncAtTest.php
  34. 164 0
      tests/Services/OrderService/SyncOrderByWMSOrderHeadersTest.php
  35. 9 2
      tests/Services/OrderTrackingService/FillInOrderTrackingTest.php
  36. 0 2
      tests/Services/OwnerService/GetOwnerByCodeTest.php
  37. 0 2
      tests/Services/OwnerService/GetOwnerByCodesTest.php
  38. 0 4
      tests/Services/ShopService/GetShopByCodeMapTest.php
  39. 0 2
      tests/Services/WarehouseService/GetWareHouseByCodeTest.php
  40. 0 1
      tests/Services/WarehouseService/GetWareHouseByCodesTest.php

+ 5 - 4
app/Console/Commands/SyncWMSOrderTask.php

@@ -39,7 +39,7 @@ class SyncWMSOrderTask extends Command
     public function handle()
     {
         $is_enabled= config('sync.order_sync.cache_prefix.enabled');
-        sleep(rand(5,10));
+        sleep(rand(2,3));
         if($is_enabled=='false')return;
         $this->syncCreatedOrder();
         $this->syncUpdatedOrder();
@@ -59,7 +59,7 @@ class SyncWMSOrderTask extends Command
         $orderService = app('OrderService');
         $oracleDOCOrderHeaderService = app('OracleDocOrderHeaderService');
 
-        $last_date = $orderService->getOrderSyncAt($newest,'newest');                             // 获取时间点
+        $last_date = $orderService->getOrderSyncAt($newest,'newest');                             // 获取创建时间点
 
         $orderHeaders = $oracleDOCOrderHeaderService->getWMSOrderOnStartDate($last_date);               // WMS订单
         if($orderHeaders->count()==0)return;
@@ -75,7 +75,7 @@ class SyncWMSOrderTask extends Command
             $orderService->pushOrderCache($newest_orders,$prefixKey,$hasKey,$newest_list);              //  添加缓存
             $orderService->setOrderSyncAt($newest,$last_order->addtime,count($orderHeaders)>0);   //  更新时间
         }
-
+        unset($orderHeaders,$newest_orders,$last_order);
     }
 
     public function syncUpdatedOrder()
@@ -93,7 +93,7 @@ class SyncWMSOrderTask extends Command
         $orderService = app('OrderService');
         $oracleDOCOrderHeaderService = app('OracleDocOrderHeaderService');
 
-        $last_date = $orderService->getOrderSyncAt($renewal,'renewal');                               // 获取时间点
+        $last_date = $orderService->getOrderSyncAt($renewal,'renewal');                               // 获取更新时间点
 
         $orderHeaders = $oracleDOCOrderHeaderService->getWMSOrderOnEditDate($last_date);                   // WMS订单
 
@@ -110,5 +110,6 @@ class SyncWMSOrderTask extends Command
             $orderService->pushOrderCache($renewal_orders,$prefixKey,$hasKey,$renewal_list);                // 添加缓存
             $orderService->setOrderSyncAt($renewal,$renewal_order->edittime,count($orderHeaders)>0);   // 更新时间
         }
+        unset($orderHeaders,$renewal_orders,$renewal_order);
     }
 }

+ 2 - 2
app/Http/Controllers/OrderIssueController.php

@@ -330,8 +330,8 @@ class OrderIssueController extends Controller
         }
         $orderNos = $request->input('orderNos');
         $orderIssues =OrderIssue::query()->with('order')
-            ->whereHas('order',function($query) use ($orderNos){
-                $query->whereIn('code',$orderNos);
+            ->whereIn('order_id',function($query) use ($orderNos){
+                $query->from('orders')->select('id')->whereIn('code',$orderNos);
             })->get();
 
         if($orderIssues->count() == 0){

+ 79 - 11
app/Http/Controllers/TestController.php

@@ -19,7 +19,6 @@ use App\OracleActAllocationDetails;
 use App\OracleDOCOrderHeader;
 use App\OracleDocOrderPackingSummary;
 use App\OracleDOCWaveDetails;
-use App\OracleDOCWaveHeader;
 use App\Order;
 use App\OrderBin;
 use App\OrderCommodity;
@@ -44,6 +43,7 @@ use App\Services\LogisticService;
 use App\Services\LogService;
 use App\Services\OracleDocAsnHerderService;
 use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderCommodityService;
 use App\Services\OrderPackageService;
 use App\Services\OrderService;
 use App\Services\OrderTrackingOwnerService;
@@ -65,6 +65,7 @@ use Illuminate\Http\Request;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Str;
 use Maatwebsite\Excel\Facades\Excel;
+use PhpMyAdmin\Server\Status\Data;
 use Ramsey\Collection\Collection;
 use Zttp\Zttp;
 
@@ -230,6 +231,7 @@ class TestController extends Controller
         Cache::put('storedTest', $today);
         return "cacheing:'$today'<script>localStorage.setItem('storedTest','{$today}')</script>";
     }
+
     function getCache(Request $request)
     {
         $cache = Cache::get('storedTest');
@@ -260,8 +262,11 @@ class TestController extends Controller
             oci_bind_by_name($stmt, ':IN_UserID', $IN_UserID);
             oci_bind_by_name($stmt, ':OUT_Return_Code', $OUT_Return_Code);
             return oci_execute($stmt);
+
         }
     }
+
+
     function packageT(Request $request)
     {
         $package = Package::where('created_at', '<', '2020-07-08')->whereNotNull('logistic_number')->first();
@@ -304,6 +309,29 @@ class TestController extends Controller
         }
     }
 
+    public function delme()
+    {
+        $fields = [
+            'doc_order_header.userdefine1',
+            'doc_order_header.userdefine2',
+            'doc_order_header.SOReference5',
+            'doc_order_header.waveno',
+            'doc_order_header.orderno',
+            'doc_order_header.customerid',
+            'doc_order_header.Consigneename'
+        ];
+        if ('') {
+            $resultOracleObj = OracleDOCOrderHeader::select($fields)->where('orderno', 'SO200603004708');
+        } else {
+            $resultOracleObj = OracleActAllocationDetails::select($fields);
+            $resultOracleObj->where('picktotraceid', '546152742096');
+            $resultOracleObj->leftJoin('DOC_Order_Header', 'act_allocation_details.orderno', 'doc_order_header.orderno');
+        }
+        $_temOracleInfo = $resultOracleObj->first();
+
+        dd($_temOracleInfo);
+    }
+
     public function mergerPackageData()
     {
         ini_set('max_execution_time', 36000);
@@ -635,14 +663,14 @@ where (c.code,c.commodity_id) in (select code,commodity_id from commodity_barcod
             dump($commodity);
         }
         die();
-        $commodityBuilder=Commodity::query();
-        $commodityBuilder->where('owner_id',4)->first();
-            $commodityBuilder->whereHas('barcodes', function (Builder $query)use($barcode,$codes){
-                foreach($codes as $code){
-                    $query->orWhere('code',$code);
-                }
-            });
-        dd($commodity, $codes,$commodityBuilder->get());
+        $commodityBuilder = Commodity::query();
+        $commodityBuilder->where('owner_id', 4)->first();
+        $commodityBuilder->whereHas('barcodes', function (Builder $query) use ($barcode, $codes) {
+            foreach ($codes as $code) {
+                $query->orWhere('code', $code);
+            }
+        });
+        dd($commodity, $codes, $commodityBuilder->get());
     }
 
     public function correctCommodity()
@@ -788,6 +816,26 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
     }
 
 
+    public function test11()
+    {
+        $rejectedBills = RejectedBill::query()
+            ->where('created_at', '>=', '2020-11-10 18:00:22')
+            ->where('created_at', '<=', '2020-11-11 00:00:00')
+            ->get();
+        $update = [['id', 'logistic_number']];
+        $rejectedBills->each(function ($rejectedBill) use (&$update) {
+            if ($rejectedBill->logistic_number == '原单退回') {
+                $details = OracleActAllocationDetails::query()->with('oracleDocOrderHeader')->whereHas('oracleDocOrderHeader', function ($query) use ($rejectedBill) {
+                    $query->where('SOReference1', $rejectedBill->order_number);
+                })->get()->groupBy('picktotraceid');
+                if ($details->count() == 1) {
+                    $update[] = ['id' => $rejectedBill->id, 'logistic_number' => $rejectedBill->logistic_number_return];
+                }
+            }
+        });
+        app('RejectedBillService')->batchUpdate($update);
+    }
+
     public function output()
     {
         /** @var CacheService $cacheService */
@@ -1127,7 +1175,7 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         $orderService = app(OrderService::class);
         /*$owners = app(OrderTrackingOwnerService::class)->getTrackingOrderOwner();*/
         /*$startDate = \Illuminate\Support\Carbon::parse('2020-10-28 00:00:00')->toDateTimeString();*/
-        $orderNos = ['SO201205001735','SO201204003891','SO201204003706','SO201204002877','SO201203003771'];
+        $orderNos = ['SO201205001735', 'SO201204003891', 'SO201204003706', 'SO201204002877', 'SO201203003771'];
         $orderHeaders = OracleDOCOrderHeader::query()->with(['oracleDOCOrderDetails', 'actAllocationDetails', 'oracleBASCode'])
             ->whereIn('orderno',$orderNos)
             ->get();
@@ -1138,10 +1186,30 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
     public function testSyncOrderTask(){
         dump('hendle...');
         dump((string)Carbon::now());
+        dump(memory_get_usage()/1024/1024);
         $task = new SyncWMSOrderTask();
         $task->handle();
         dump((string)Carbon::now());
-        dd('hendle...end');
+        dump('hendle...end');
+        dump(memory_get_usage()/1024/1024);
+        dump(memory_get_peak_usage()/1024/1024);
+
+    }
+    function testUpdateStores(){
+        $stores=Store::query()->where('stored_method','快速入库')->get();
+        $updated_at=Carbon::now()->toDateTimeString();
+        $updateParams = [[
+            'id', 'is_fast_stored','updated_at'
+        ]];
+        foreach ($stores as $store){
+            if ($store->stored_method!='快速入库') continue;
+            $updateParams[] = [
+                'id' => $store->id,
+                'is_fast_stored' =>'快速入库',
+                'updated_at' =>$updated_at,
+            ];
+        }
+        if (count($updateParams) > 1) app(BatchUpdateService::class)->batchUpdate('stores', $updateParams);
     }
 
     public function testSyncWaveNo()

+ 1 - 1
app/Services/LogisticService.php

@@ -101,7 +101,7 @@ Class LogisticService
     }
 
     public function getLogisticByCode($code){
-        return Cache::remember("getLogisticByCode_{$code}", config('database.cache.expirations.rarelyChange'), function()use($code){
+        return Cache::remember("getLogisticByCode_{$code}", config('cache.expirations.rarelyChange'), function()use($code){
             $logistic = Logistic::query()->where('code',$code)->first();
             if($logistic)return $logistic;
             $baseCustomers = app('OracleBasCustomerService')->first(['Customer_Type'=>'CA','CustomerID'=>$code]);

+ 1 - 1
app/Services/OracleDOCOrderHeaderService.php

@@ -31,7 +31,7 @@ Class OracleDOCOrderHeaderService
             },'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');
             }, 'actAllocationDetails'=>function($query){
-                $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');
+                $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');
             },'oracleBASCode'=>function($query){
                 $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
             },'orderType'=>function($query){

+ 189 - 161
app/Services/OrderCommodityService.php

@@ -4,209 +4,237 @@ namespace App\Services;
 
 use App\Order;
 use App\OrderCommodity;
+use App\Services\common\BatchUpdateService;
+use App\Services\common\DataHandlerService;
 use Carbon\Carbon;
 
 Class OrderCommodityService
 {
-    public function syncOrderCommodities(&$orderHeaders)
+
+    public function insert($innerParams){
+        if(!$innerParams)return false;
+        if(count($innerParams)==0)return false;
+        try {
+            $bool = OrderCommodity::query()->insert($innerParams);
+            if ($bool) app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 OrderCommodities SUCCESS' . ' || ' . count($innerParams) . ' || ' . json_encode($innerParams));
+            else app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 OrderCommodities FAULT' . ' || ' . count($innerParams) . ' || ' . json_encode($innerParams));
+            return $bool;
+        } catch (\Exception $e) {
+            app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 OrderCommodities ERROR'. ' || ' . count($innerParams) . ' || ' . json_encode($innerParams).' || '.json_encode($e->getMessage()).' || '.json_encode($e->getTraceAsString()));
+            return false;
+        }
+    }
+
+    public function batchUpdate($updateParams){
+        return app(BatchUpdateService::class)->batchUpdate('order_commodities',$updateParams);
+    }
+
+    public function syncOrderCommodity(&$orderHeaders)
     {
         /**
-         * @var CommodityService $commodityService
          * @var OwnerService $ownerService
+         * @var CommodityService $commodityService
+         * @var DataHandlerService $dataHandlerService
          */
-        $commodityService = app('CommodityService');
         $ownerService = app('OwnerService');
-        if(count($orderHeaders) == 0)return ;
-        $order_nos = array_unique(data_get($orderHeaders,'*.orderno'));
-        $commodities_map = [];$owners_id_maps = [];
-        $owner_code_maps = (function()use(&$ownerService,&$orderHeaders,&$owners_id_maps){
-            $customer_ids= array_unique(data_get($orderHeaders,'*.customerid'));
-            $owners = $ownerService->getOwnerByCodes($customer_ids);
-            $owner_code_maps = [];
-            if(count($owners) == 0)return $owner_code_maps;
-            foreach ($owners as $owner) {
-                $owner_code_maps[$owner['code']]= $owner['id'];
-                $owners_id_maps[$owner['id']] =  $owner['code'];
-            }
-            return $owner_code_maps;
-        })();
-        // 重组OrderDetails
-        $orderDetails_map = (function()use(&$orderHeaders,&$owner_code_maps,&$commodities_map){
-            $map = [];
-            if(count($orderHeaders)==0)return $map;
-            foreach ($orderHeaders as $orderHeader) {
-                $Order_Details = $orderHeader->oracleDOCOrderDetails;
-                $Order_Details->each(function($item)use(&$map,&$owner_code_maps,&$commodities_map){
-                    if(!empty($item['customerid']) && !empty($item['sku'])){
-                        $key = "owner_code_{$item['customerid']}_sku_{$item['sku']}";
-                        $commodities_map[$key] =  ['owner_code'=>$item['customerid'],'sku'=>$item['sku']];
-                    }
-                    $key = "orderno_{$item['orderno']}_sku{$item['sku']}_each_{$item['qtyordered']}_location_{$item['location']}";
-                    if(empty($map[$key]))$map[$key]=[];
-                    $map[$key][] = [
-                        'code' => $item['orderno'],
-                        'sku' => $item['sku'],
-                        'owner_id'=>$owner_code_maps[$item['customerid']],
-                        'amount' => $item['qtyordered'],
-                        'location' => $item['location']
-                    ];
-                });
-            }
-            return $map;
-        })();
-        $commodities = $commodityService->getCommoditiesByMap($commodities_map);
-        $commodities_maps = (function()use($commodities,$owners_id_maps){
-            $map = [];
-            if(count($commodities) == 0)return $map;
-            foreach ($commodities as $commodity) {
-                $owner_code = $owners_id_maps[$commodity['owner_id']];
-                $key ="owner_code_{$owner_code}_sku_{$commodity['sku']}";
-                $map[$key] = $commodity;
+        $commodityService = app('CommodityService');
+        $dataHandlerService = app('DataHandlerService');
+        $orderNos = data_get($orderHeaders,'*.orderno');
+        $owner_codes = [];$sku_codes = [];
+        foreach ($orderHeaders as $orderHeader) {
+            $actAllocationDetails  = $orderHeader->actAllocationDetails;
+            foreach ($actAllocationDetails as $actAllocationDetail) {
+                $owner_codes[$actAllocationDetail['customerid']] = $actAllocationDetail['customerid'];
+                $sku_codes[$actAllocationDetail['sku']] = $actAllocationDetail['sku'];
             }
-            return $map;
-        })();
-        $order_id_map = [];
-        $orders_map = (function()use($order_nos,&$order_id_map){
-            $map = [];
-            if(count($order_nos)==0)return $map;
-            $orders = Order::query()->whereIn('code',$order_nos)->get();
-            $orders->each(function($item)use(&$map,&$order_id_map){
-                $map[$item['code']] = ['id'=>  $item['id'], 'owner_id' =>  $item['owner_id']];
-                $order_id_map[$item['id']] = ['code'=>  $item['code'], 'owner_id' =>  $item['owner_id']];
-            });
-            return $map;
-        })();
-        $orderCommodities = OrderCommodity::query()->with('commodity','order')->whereHas('order',function($query)use($order_nos){
-            $query->whereIn('code',$order_nos);
+        }
+        if(count($sku_codes) ==0)return;
+        $owners = $ownerService->getOwnerByCodes($owner_codes);
+        $owner_id_maps = $dataHandlerService->dataHeader(['id'],$owners);
+        $commodities = $commodityService->get_(data_get($owners,'*.id'),$sku_codes,[],true);
+        unset($owner_codes,$sku_codes);
+        $commodity_map = [];
+        foreach ($commodities as $commodity) {
+            $owner = $dataHandlerService->getKeyValue(['id'=>$commodity->owner_id],$owner_id_maps);
+            $key = "_owner_code_{$owner['code']}_sku_{$commodity['sku']}";
+            $commodity_map[$key] = $commodity;
+        }
+
+        $orderCommodities = OrderCommodity::query()->with(['order','commodity'])->whereIn('order_id',function ($query)use($orderNos){
+            $query->from('orders')->select('id')->whereIn('code',$orderNos);
         })->get();
+        $orders = Order::query()->with('packages.commodities')->whereIn('code',$orderNos)->get();
+        $order_code_map = $dataHandlerService->dataHeader(['code'],$orders);
+        $ActAllocationDetail_maps =  $this->getRegroupActAllocationDetails($orderHeaders);
+        $orderCommodity_maps = $this->getRegroupOrderCommodities($orderCommodities,$owner_id_maps);
+        unset($orderCommodities,$owner_id_maps,$owners,$orderNos);
+        $this->filterHasExist($ActAllocationDetail_maps,$orderCommodity_maps);
+        $delete_ids =  $this->getDeleteIds($ActAllocationDetail_maps,$orderCommodity_maps);
+        $create_params = $this->getCreateParams($ActAllocationDetail_maps,$orderCommodity_maps);
+        unset($orderCommodity_maps,$ActAllocationDetail_maps);
+
+        $inner_params = $this->getInnerParamsByParams($create_params,$order_code_map,$commodity_map);
+        unset($create_params,$order_code_map,$orders,$commodity_map);
+
+//        $update_params = $this->getUpdateParamsByParamsAndDeleteIds($inner_params,$delete_ids);
+//        if(count($update_params)>0)$this->batchUpdate($update_params);
+//        unset($update_params);
 
-        $orderCommodities_map = $this->regroupOrderCommodities($orderCommodities);              // 重组orderCommodities
-        $inner_params = $this->filterInnerParams($orderDetails_map,$orderCommodities_map);
-        $del_ids = $this->filterDeleteParams($orderDetails_map,$orderCommodities_map);
         if(count($inner_params)>0){
-            $inner_arr = array_chunk($inner_params,4000);
-            foreach ($inner_arr as $item) {
-                $created_params = $this->createByInnerParams($item,$orders_map,$commodities_maps,$owners_id_maps);
-                $this->insert($created_params);
-            }
+            $inner_params = array_chunk($inner_params,4000);
+            foreach ($inner_params as $inner_param) {$this->insert($inner_param);}
+            unset($inner_params);
         }
-        if(count($del_ids)>0){
-            $orderCommodities = OrderCommodity::query()->whereIn('id',$del_ids)->get();
-            $this->batchDelete($orderCommodities);
+
+        if(count($delete_ids)==0)return;
+        OrderCommodity::query()->whereIn('id',$delete_ids)->delete();
+        app('LogService')->log(__METHOD__,__FUNCTION__,"delete OrderCommodity ".json_encode($delete_ids));
+        unset($delete_ids);
+    }
+
+    public function getRegroupActAllocationDetails(&$orderHeaders)
+    {
+        $map = [];
+        if($orderHeaders->count()==0) return $map;
+        $orderHeaders->each(function($orderHeader)use(&$map){
+            $orderHeader->actAllocationDetails->each(function ($details)use(&$map){
+                $key = "order_{$details['orderno']}_owner_code_{$details['customerid']}_sku_{$details['sku']}_location_{$details['location']}_amount_{$details['qty_each']}";
+                if(empty($map[$key]))$map[$key]=[];
+                $map[$key][] = [
+                    'code' => $details['orderno'],
+                    'sku' => $details['sku'],
+                    'owner_code'=> $details['customerid'],
+                    'amount' => $details['qty_each'],
+                    'location' => $details['location']
+                ];
+            });
+        });
+        return $map;
+    }
+
+    public function filterHasExist(&$ActAllocationDetail_maps,&$orderCommodity_maps)
+    {
+        foreach ($ActAllocationDetail_maps as $key=>$actAllocationDetail_map) {
+            $orderCommodity_map = $orderCommodity_maps[$key] ?? null;
+            if($orderCommodity_map == null)continue;
+            foreach ($actAllocationDetail_map as $index=>$item) {
+                if(count($orderCommodity_map)==0)break;
+                array_shift($orderCommodity_map);
+                unset($actAllocationDetail_map[$index]);
+            }
         }
     }
 
-    private function regroupOrderCommodities(&$orderCommodities)
+    public function getRegroupOrderCommodities(&$orderCommodities,$owner_id_maps)
     {
+        /** @var DataHandlerService  $dataHandlerService */
+        $dataHandlerService = app(DataHandlerService::class);
         $map = [];
-        if(count($orderCommodities)==0)return $map;
-        foreach ($orderCommodities as $orderCommodity) {
-            $key = "orderno_{$orderCommodity['order']['code']}_sku{$orderCommodity['commodity']['sku']}_each_{$orderCommodity['amount']}_location_{$orderCommodity['location']}";
-            if(empty($map[$key]))$map[$key] =[];
-            $map[$key][] = [
-                'id' =>$orderCommodity['id'],
-                'code' => $orderCommodity['order']['orderno'],
-                'sku' => $orderCommodity['commodity']['sku'],
-                'owner_id' => $orderCommodity['order']['owner_id'],
-                'amount' => $orderCommodity['amount'],
-                'location' => $orderCommodity['location'] ?? ''
+        if($orderCommodities->count() == 0)return $map;
+        $orderCommodities->each(function($orderCommodity)use(&$map,$owner_id_maps,$dataHandlerService){
+            $order = $orderCommodity->order;
+            $owner  = $dataHandlerService->getKeyValue(['id'=>$order->owner_id ?? ''],$owner_id_maps);
+            $sku =  $orderCommodity->commodity->sku ?? '';
+            $key = "order_{$order->code}_owner_code_{$owner['code']}_sku_{ $sku}_location_{$orderCommodity->location}_amount_{$orderCommodity->amount}";
+            if(empty($map[$key]))$map[$key]=[];
+            $map[$key][]  =[
+                'id' => $orderCommodity->id,
+                'code' => $orderCommodity->order->code ?? '',
+                'sku' => $sku,
+                'owner_code' => $owner->code ?? '',
+                'amount' => $orderCommodity->amount,
+                'location' => $orderCommodity->location,
             ];
-        }
+        });
         return $map;
     }
 
-    private function filterInnerParams(&$orderDetails_map,&$orderCommodities_map)
+    public function getDeleteIds(&$ActAllocationDetail_maps,&$orderCommodity_maps)
     {
-        $inner_params = [];
-        if(count($orderDetails_map) == 0)return $inner_params;
-        foreach ($orderDetails_map as $key=>&$map) {
-            if(empty($orderCommodities_map[$key])){
-                foreach ($map as &$item) {
-                    $inner_params[] = $item;
+        $ids = [];
+        if(count($orderCommodity_maps)==0)return $ids;
+        foreach ($orderCommodity_maps as $key=>$orderCommodity_map) {
+            $ActAllocationDetail_map = $ActAllocationDetail_maps[$key]  ?? null;
+            if($ActAllocationDetail_map==null){
+                foreach ($orderCommodity_map as $index=>$orderCommodity) {
+                    $ids[] =$orderCommodity['id'];
+                    unset($orderCommodity_map[$index]);
                 }
-            }elseif(count($map)>count($orderCommodities_map[$key])){
-                foreach ($map as &$obj) {
-                    if($orderCommodities_map[$key]>0)array_shift($orderCommodities_map[$key]);
-                    elseif($orderCommodities_map[$key]==0)$inner_params[] = $obj;
+                continue;
+            }
+            if(count($ActAllocationDetail_map) == count($orderCommodity_map))continue;
+            if(count($ActAllocationDetail_map) < count($orderCommodity_map)){
+                foreach ($orderCommodity_map as $index=>$item) {
+                    if(count($ActAllocationDetail_map) == 0)$ids[] =$item['id'];
+                    array_shift($ActAllocationDetail_map);
+                    unset($orderCommodity_map[$index]);
                 }
-            } elseif(count($map)==count($orderCommodities_map[$key]))continue;
-            unset($orderDetails_map[$key]);
-            $map = null;
+            }
         }
-        return $inner_params;
+        return $ids;
     }
-    private function filterDeleteParams(&$orderDetails_map,&$orderCommodities_map)
+
+    public function getCreateParams(&$ActAllocationDetail_maps,&$orderCommodity_maps)
     {
-        $del_ids = [];
-        if(count($orderDetails_map) == 0)return $del_ids;
-        foreach ($orderCommodities_map as $key=>$map) {
-            if(empty($orderDetails_map[$key])){
-                foreach ($map as &$item) {
-                    $del_ids[] = $item['id'];
+        $params = [];
+        foreach ($ActAllocationDetail_maps as $key=>$actAllocationDetail_map) {
+            $orderCommodity_map = $orderCommodity_maps[$key] ?? null;
+            if($orderCommodity_map == null){
+                foreach ($actAllocationDetail_map as $index=>$actAllocationDetail) {
+                    $params[]  = $actAllocationDetail;
+                    unset($actAllocationDetail_map[$key]);
                 }
-            }elseif(count($map)>count($orderDetails_map[$key])){
-                foreach ($map as $key1=>&$obj) {
-                    if(count($orderDetails_map[$key]) == 0){
-                        $del_ids [] = $obj['id'];
-                        unset($map[$key1]);
-                    } else{
-                        array_shift($orderDetails_map[$key]);
-                    }
+                continue;
+            }elseif(count($actAllocationDetail_map) == count($orderCommodity_map)){
+                continue;
+            }elseif(count($actAllocationDetail_map) > count($orderCommodity_map)){
+                foreach ($actAllocationDetail_map as $index=>$item) {
+                    if(count($orderCommodity_map) == 0)$params[] = $item;
+                    array_shift($orderCommodity_map);
+                    unset($actAllocationDetail_map[$key]);
                 }
             }
         }
-        return $del_ids;
+        return $params;
     }
 
-    private function createByInnerParams(&$inner_params,&$orders_map,&$commodities_maps,&$owner_id_maps)
+    public function getInnerParamsByParams(&$create_params,&$order_code_map,&$commodity_map)
     {
-        $created_params = [];
-        if(count($inner_params) == 0)return $created_params;
-        $data = Carbon::now();
-        foreach ($inner_params as &$item) {
-            $order = $orders_map[$item['code']] ?? false;
-            if(!$order)continue;
-            $owner_code = $owner_id_maps[$item['owner_id']];
-            $key = "owner_code_{$owner_code}_sku_{$item['sku']}";
-            $commodity = $commodities_maps[$key];
-            $created_params[] = [
-                'order_id' =>$order['id'],
-                'commodity_id' =>$commodity['id'],
-                'amount' =>$item['amount'],
-                'location' =>$item['location'],
-                'created_at' =>$data,
-                'updated_at' => $data
+        /** @var DataHandlerService  $dataHandlerService */
+        $dataHandlerService = app(DataHandlerService::class);
+        $inner_params = [];
+        $date = (string) Carbon::now();
+        foreach ($create_params as $item) {
+            $order = $dataHandlerService->getKeyValue(['code'=>$item['code']],$order_code_map);
+            $key = "_owner_code_{$item['owner_code']}_sku_{$item['sku']}";
+            $commodity = $commodity_map[$key] ?? null;
+            $inner_params[] = [
+                'order_id' => $order['id'] ?? '',
+                'commodity_id' => $commodity['id'] ?? '',
+                'amount' => $item['amount'],
+                'location' => $item['location'],
+                'created_at' => $date,
+                'updated_at' => $date
             ];
         }
-        return $created_params;
+        return $inner_params;
     }
 
-    public function batchDelete($orderCommodities)
+    // TODO 更新后续添加进更新逻辑
+    public function getUpdateParamsByParamsAndDeleteIds(&$inner_params,&$ids)
     {
-        if(count($orderCommodities) == 0)return true;
-        try {
-            $bool =  OrderCommodity::destroy(data_get($orderCommodities, '*.id'));
-            if($bool)app('LogService')->log(__METHOD__,__FUNCTION__,'批量删除 OrderCommodities'.' || '.count($orderCommodities).' || '.json_encode($orderCommodities));
-            else app('LogService')->log(__METHOD__,__FUNCTION__,'批量删除 OrderCommodities FAULT'.' || '.count($orderCommodities).' || '.json_encode($orderCommodities).' || ');
-            return $bool;
-        } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__,__FUNCTION__,'批量删除 OrderCommodities ERROR'.' || '.count($orderCommodities).' || '.json_encode($orderCommodities).' || '.json_encode($e->getMessage()).' || '.json_encode($e->getTraceAsString()));
-            return false;
-        }
-    }
-
-    public function insert($innerParams){
-        if(!$innerParams)return false;
-        if(count($innerParams)==0)return false;
-        try {
-            $bool = OrderCommodity::query()->insert($innerParams);
-            if ($bool) app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 OrderCommodities SUCCESS' . ' || ' . count($innerParams) . ' || ' . json_encode($innerParams));
-            else app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 OrderCommodities FAULT' . ' || ' . count($innerParams) . ' || ' . json_encode($innerParams));
-            return $bool;
-        } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 OrderCommodities ERROR'. ' || ' . count($innerParams) . ' || ' . json_encode($innerParams).' || '.json_encode($e->getMessage()).' || '.json_encode($e->getTraceAsString()));
-            return false;
+        $update_params = [['id','order_id', 'commodity_id', 'amount', 'location', 'created_at', 'updated_at']];
+        if(count($inner_params)==0)return $update_params;
+        $date = (string)Carbon::now();
+        foreach ($inner_params as $key=>$inner_param) {
+            if(count($ids)==0)break;
+            $inner_param['id'] = array_shift($ids);
+            $inner_param['updated_at'] = $date;
+            $inner_param['created_at'] = $date;
+            $update_params[] = $inner_param;
+            unset($inner_params[$key]);
         }
+        return $update_params;
     }
 }
 

+ 35 - 29
app/Services/OrderPackageCommoditiesService.php

@@ -207,8 +207,10 @@ class OrderPackageCommoditiesService
         $order_no =  data_get($orderHeaders,'*.orderno');
         return OrderPackageCommodities::query()
             ->with('package.order','commodity')
-            ->whereHas('package.order',function($query) use ($order_no){
-                $query->whereIn('code',$order_no);
+            ->whereIn('order_package_id',function($query) use ($order_no){
+                $query->from('order_packages')->select('id')->whereIn('order_id',function($query)use($order_no){
+                    $query->from('orders')->select('id')->whereIn('code',$order_no);
+                });
             })->get();
     }
 
@@ -223,9 +225,11 @@ class OrderPackageCommoditiesService
      */
     public function 删除包裹商品信息_根据快递单号($logistic_numbers)
     {
-        $orderPackageCommodities = OrderPackageCommodities::query()->with('package')->whereHas('package',function($query)use($logistic_numbers){
-            $query->whereIn('logistic_number',$logistic_numbers);
-        })->get();
+        $orderPackageCommodities = OrderPackageCommodities::query()
+            ->with('package')
+            ->whereIn('order_package_id',function($query)use($logistic_numbers){
+                $query->from('order_packages')->select('id')->whereIn('logistic_number',$logistic_numbers);
+            })->get();
         $ids = data_get($orderPackageCommodities, '*.id');
         if(count($ids) == 0){return [];}
         try {
@@ -245,8 +249,10 @@ class OrderPackageCommoditiesService
     public function getByOrderNos($orderNos)
     {
         return OrderPackageCommodities::query()->with('package.order','commodity')
-            ->whereHas('package.order',function($query) use ($orderNos){
-                $query->whereIn('code',$orderNos);
+            ->whereIn('order_package_id',function($query) use ($orderNos){
+                $query->from('order_packages')->select('id')->whereIn('order_id',function($query)use($orderNos){
+                    $query->from('orders')->select('id')->whereIn('code',$orderNos);
+                });
             })->get();
     }
 
@@ -613,30 +619,24 @@ class OrderPackageCommoditiesService
         $ownerService  = app( 'OwnerService');
         if(!$orderHeaders)return ;
 
-        $map = [];
+        $owner_codes = [];$sku_codes = [];
         foreach ($orderHeaders as $orderHeader) {
             $Order_Details = $orderHeader->oracleDOCOrderDetails;
-            $Order_Details->each(function($item)use(&$map){
-                if(!empty($item['customerid']) && !empty($item['sku'])){
-                    $key = "owner_code_{$item['customerid']}_sku_{$item['sku']}";
-                    $map[$key] =  ['owner_code'=>$item['customerid'],'sku'=>$item['sku']];  // 货主编码 sku编码
-                }
+            $Order_Details->each(function($item)use(&$owner_codes,&$sku_codes){
+                $owner_codes[$item['customerid']] = $item['customerid'];
+                $sku_codes[$item['sku']] = $item['sku'];
             });
         }
-        $commodities = $commodityService->getCommoditiesByMap($map);   // 预先处理     3s
+        if(count($owner_codes) ==0 || count($sku_codes) == 0)return ;
+        $owners = $ownerService->getOwnerByCodes($owner_codes);
+//        $commodities = $commodityService->getCommoditiesByMap($map);   // 预先处理     3s
+        $commodities = $commodityService->get_(data_get($owners,'*.id'),$sku_codes,[],true);   // 预先处理     3s
         $orderPackages = $orderPackageService->getByWmsOrders($orderHeaders);
         $orderCommodities = $this->getByWmsOrder($orderHeaders);
-        $owner_code_map = [];
-        $owner_id_map = (function()use(&$orderHeaders,&$ownerService,&$owner_code_map){
-            $owner_id_map = [];
-            $owners = $ownerService->getOwnerByCodes(array_unique(data_get($orderHeaders,'*.customerid')));
-            if(count($owners) == 0) return $owner_id_map;
-            foreach ($owners as $owner) {
-                $owner_id_map[$owner['id']] = $owner;
-                $owner_code_map[$owner['code']]  = $owner;
-            }
-            return $owner_id_map;
-        })();
+        $owner_id_map=[];
+        foreach ($owners as $owner) {
+            $owner_id_map[$owner['id']] = $owner;
+        }
 
         $package_map = $dataHandService->dataHeader(['logistic_number'],$orderPackages);
         $orderCommodities = $this->regroupOrderCommodities($orderCommodities);
@@ -645,17 +645,20 @@ class OrderPackageCommoditiesService
         $update_params =$this->filterUpdateParams($orderAllocationDetails,$orderCommodities,$del_orderCommodities);                  // 修改
         $inner_params = $this->filterInnerParams($orderAllocationDetails,$orderCommodities);                                            // 创建
         $delete_params = $this->filterDeleteParams($orderAllocationDetails,$orderCommodities);                                           // 删除
+        unset($orderAllocationDetails,$orderCommodities);
+
         if(count($inner_params)>0)
             $this->createOrderCommodities($inner_params,$package_map,$commodities,$owner_id_map);  // 创建 3s
-
+        unset($inner_params,$package_map,$commodities,$owner_id_map);
         if(count($update_params)>0)
             $this->updateOrderCommodities($update_params);              // 更新
-
+        unset($update_params);
         if(count($delete_params)>0)
             $this->deleteOrderCommodities($delete_params);              // 删除
-
+        unset($delete_params);
         if(count($del_orderCommodities)>0)
             $this->deleteOrderCommodities($del_orderCommodities);       // 删除
+        unset($del_orderCommodities);
     }
     // TODO 重组已有的OrderCommodities
     public function regroupOrderCommodities(&$orderCommodities)
@@ -808,6 +811,7 @@ class OrderPackageCommoditiesService
                 }
             }
         }
+        unset($create_params,$commodity_map);
     }
     // TODO
     public function updateOrderCommodities(&$orderCommodities)
@@ -826,6 +830,8 @@ class OrderPackageCommoditiesService
         }
         if(count($update_params)>1)
             $this->batchUpdate($update_params);
+
+        unset($update_params);
     }
     // TODO 删除
     public function deleteOrderCommodities(&$orderCommodities){
@@ -840,6 +846,6 @@ class OrderPackageCommoditiesService
         } catch (\Exception $e) {
             LogService::log(__METHOD__, __FUNCTION__.' error', '批量删除 OrderCommodity Error' . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
         }
-
+        unset($orderCommodities);
     }
 }

+ 9 - 8
app/Services/OrderPackageService.php

@@ -301,8 +301,8 @@ class OrderPackageService
     public function getByWmsOrders($orderHeaders){
         $order_nos = data_get($orderHeaders,'*.orderno');
         return OrderPackage::query()->with('order')
-            ->whereHas('order',function($query) use ($order_nos){
-                $query->whereIn('code',$order_nos);
+            ->whereIn('order_id',function($query) use ($order_nos){
+                $query->from('orders')->select('id')->whereIn('code',$order_nos);
             })->get();
     }
 
@@ -352,8 +352,8 @@ class OrderPackageService
     public function getByOrderNos($orderNos)
     {
         return OrderPackage::query()->with('order')
-            ->whereHas('order',function($query)use($orderNos){
-                $query->whereIn('code',$orderNos);
+            ->whereIn('order_id',function($query)use($orderNos){
+                $query->from('orders')->select('id')->whereIn('code',$orderNos);
             })->get();
     }
 
@@ -417,15 +417,16 @@ class OrderPackageService
         $this->createOrderPackage($orderHeaders,$orders,$packages);                     // 创建package
 
         $del_ids = $this->deleteUnnecessaryPackage($orderHeaders,$packages);     // 删除package
-
+        unset($orders,$packages);       // 手动清除
         $orderPackageCommodityService->deleteUnnecessaryOrderCommodities($del_ids);     // 删除 orderCommodity
 
-        $orderTracking = OrderTracking::query()->whereHas('commodities',function($query)use($del_ids){
-            $query->whereIn('order_package_id',$del_ids);
+        $orderTracking = OrderTracking::query()->whereIn('order_package_commodity_id',function($query)use($del_ids){
+            $query->from('order_package_commodities')->select('order_package_commodities.id')->whereIn('order_package_id',$del_ids);
         })->get();
         if($orderTracking->count()==0)return;
 
-        $orderTrackingService->deleteOrderTracings($orderTracking);                     // 删除追踪件
+        $orderTrackingService->deleteOrderTracings($orderTracking);                     // 删除追踪件+
+        unset($orderTracking);      // 手动清除
     }
     // TODO
     public function createOrderPackage($orderHeaders,$orders,$packages)

+ 45 - 12
app/Services/OrderService.php

@@ -360,7 +360,7 @@ class OrderService
         $orderPackageService = app('OrderPackageService');
         $order = Order::query()->where('client_code', $clientCode)->first();
 
-        $orderHeader = OracleDOCOrderHeader::query()->where('SOReference1', $clientCode)->first();
+        $orderHeader = app('OracleDocOrderHeaderService')->first(['SOReference1'=> $clientCode]);
 
         if ($orderHeader == null) {
             return null;
@@ -712,8 +712,8 @@ class OrderService
         if(!isset($orders)){return [];}
         $orderNo =  data_get($orders,'*.orderno');
         $orderIssues = OrderIssue::query()->with('order')
-            ->whereHas('order',function($query)use($orderNo){
-                $query->whereIn('code',$orderNo);
+            ->whereIn('order_id',function($query)use($orderNo){
+                $query->from('orders')->select('id')->whereIn('code',$orderNo);
             })->get();
 
         return $orderIssues->map(function($orderIssue){
@@ -808,11 +808,13 @@ class OrderService
 
         $this->syncOrderByWMSOrderHeaders($orderHeaders);
 
-        $orderCommodityService->syncOrderCommodities($orderHeaders);
+        $orderCommodityService->syncOrderCommodity($orderHeaders);
 
         $packageService->syncOrderPackage($orderHeaders);
 
-        $this->pushQueue($orderHeaders);
+//        $this->pushQueue($orderHeaders);
+
+        unset($orderHeaders);
     }
 
     public function pushQueue($orderHeaders){
@@ -823,7 +825,6 @@ class OrderService
         });
     }
 
-
     public function syncOrderByWMSOrderHeaders(&$orderHeaders)
     {
         if($orderHeaders->isEmpty())return;
@@ -856,21 +857,25 @@ class OrderService
         $owners = $ownerService->getOwnerByCodes($owner_codes);
         $logistics = $logisticService->getLogisticByCodes($logistic_codes);
         $shops = $shopService->getShopByCodeMap($shop_names);
-        $warehouses = $warehouseService->getWareHouseByCode($warehouse_codes);
+        $warehouses = $warehouseService->getWareHouseByCodes($warehouse_codes);
         $batches = $this->batchService->getBatchByCodes($batch_codes);
 
+        unset($owner_codes,$logistic_codes,$shop_names,$warehouse_codes,$batch_codes);
+
         $orders = $this->getByWmsOrders($orderHeaders);
 
         $created_params = $this->getCreateOrderModelsByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops,$batches); //3s
 
         $update_order = $this->getUpdateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops,$batches);
 
+        unset($owners,$logistics,$shops,$warehouses,$batches);
 
         // 转换插入 3s
         if(count($created_params) > 0){
             collect($created_params)->chunk(3500)->each(function($inner_params){
                 $this->insert($inner_params->toArray());
             });
+            unset($created_params);
         }
         $update_params = [
             ['id','code','warehouse_id','owner_id','batch_id','shop_id','logistic_id','consignee_name','consignee_phone','province','city','district','address','client_code','wms_status','created_at','updated_at','wms_edittime','order_type']
@@ -879,9 +884,10 @@ class OrderService
         $update_order->each(function($item)use(&$update_params){
             $update_params[] = $item->toArray();
         });
-        if(count($update_order)==0)return;
-
+        unset($update_order);
+        if(count($update_params)==0)return;
         $this->batchUpdate($update_params);
+        unset($update_params);
     }
 
     public function getCreateOrderModelsByWMSOrderHeaders(&$orderHeaders,&$orders,&$warehouses,&$owners,&$logistics,&$shops,&$batches)
@@ -904,6 +910,7 @@ class OrderService
             $order_model = $this->getCreateOrderModels($orderHeader,$warehouse_map,$owner_map,$logistic_map,$shop_map,$batch_map,$date);
             $inner_params[] = $order_model;
         }
+        unset($warehouse_map,$owner_map,$logistic_map,$shop_map,$order_map,$batch_map);
         return $inner_params;
     }
 
@@ -931,6 +938,7 @@ class OrderService
                 $collect->push($order);
             }
         }
+        unset($orderHeader_map,$warehouse_map,$owner_map,$logistic_map,$shop_map,$batch_map);
         return $collect;
     }
 
@@ -1075,7 +1083,7 @@ class OrderService
     public function pushOrderCache($orderHeaders,$prefixKey,$hasKey,$list_key){
         $list = [];
         try {
-            Redis::LLEN($list_key);
+            Cache::get($hasKey);
             collect($orderHeaders)->each(function($item)use(&$list,$prefixKey){
                 $list[] =$item->orderno;
                 Cache::put($prefixKey.$item->orderno,true);
@@ -1097,7 +1105,7 @@ class OrderService
         if(!$orderHeaders)return $orderHeaders;
         if(!$key)return $orderHeaders;
         try {
-            Redis::LLEN($key);
+            Cache::get($key);
             return array_filter($orderHeaders,function($item)use($key){
                 $bool = Cache::get($key.$item->orderno);
                 return !$bool;
@@ -1110,7 +1118,7 @@ class OrderService
     public function cancelOrderCache($key,string $prefix)
     {
         try {
-            Redis::LLEN($key);
+            Cache::get($prefix);
             $list = Cache::get($key);
             collect($list)->each(function ($item)use($prefix) {
                 Cache::forget($prefix.$item);
@@ -1126,9 +1134,17 @@ class OrderService
          * @var OrderService $orderService
          */
         $newest         = config('sync.order_sync.cache_prefix.created_at');
+        $have_task_is_running_key  = config('sync.order_sync.cache_prefix.newest_is_running');
         $newest_list    = config('sync.order_sync.cache_prefix.newest_list');
         $hasKey         = config('sync.order_sync.cache_prefix.newest_has');
         $prefixKey      = config('sync.order_sync.cache_prefix.newest');
+
+        $have_task_is_running = Cache::get($have_task_is_running_key);
+        if($have_task_is_running)return;
+        Cache::remember($have_task_is_running_key,config('cache.expirations.forever'),function (){
+            return true;
+        });
+
         ini_set('memory_limit', '512M');
         $orderService = app('OrderService');
         $oracleDOCOrderHeaderService = app('OracleDocOrderHeaderService');
@@ -1149,6 +1165,10 @@ class OrderService
             $orderService->pushOrderCache($newest_orders,$prefixKey,$hasKey,$newest_list);              //  添加缓存
             $orderService->setOrderSyncAt($newest,$last_order->addtime,count($orderHeaders)>0);   //  更新时间
         }
+
+        Cache::remember($have_task_is_running_key,config('cache.expirations.forever'),function (){
+            return false;
+        });
     }
 
     public function syncUpdatedOrder(){
@@ -1157,9 +1177,17 @@ class OrderService
          * @var OrderService $orderService
          */
         $renewal        = config('sync.order_sync.cache_prefix.updated_at');
+        $have_task_is_running_key  = config('sync.order_sync.cache_prefix.renewal_is_running');
         $renewal_list   = config('sync.order_sync.cache_prefix.renewal_list');
         $hasKey         = config('sync.order_sync.cache_prefix.renewal_has');
         $prefixKey      = config('sync.order_sync.cache_prefix.renewal');
+
+        $have_task_is_running = Cache::get($have_task_is_running_key);
+        if($have_task_is_running)return;
+        Cache::remember($have_task_is_running_key,config('cache.expirations.forever'),function (){
+            return true;
+        });
+
         ini_set('memory_limit', '512M');
 
         $orderService = app('OrderService');
@@ -1167,6 +1195,7 @@ class OrderService
 
         $last_date = $orderService->getOrderSyncAt($renewal,'renewal');                               // 获取时间点
 
+
         $orderHeaders = $oracleDOCOrderHeaderService->getWMSOrderOnEditDate($last_date);                   // WMS订单
 
         if($orderHeaders->count()==0)return;
@@ -1182,6 +1211,10 @@ class OrderService
             $orderService->pushOrderCache($renewal_orders,$prefixKey,$hasKey,$renewal_list);                // 添加缓存
             $orderService->setOrderSyncAt($renewal,$renewal_order->edittime,count($orderHeaders)>0);   // 更新时间
         }
+
+        Cache::remember($have_task_is_running_key,config('cache.expirations.forever'),function (){
+            return false;
+        });
     }
 
     public function syncOrderByWmsOrderNos($orderNos)

+ 2 - 2
app/Services/OwnerService.php

@@ -225,7 +225,7 @@ Class OwnerService
         $collect = collect();
         if(count($codes) == 0)return $collect;
         foreach ($codes as $code) {
-            $collect->push($this->getOwnerByCode($code));
+            $collect = $collect->push($this->getOwnerByCode($code));
         }
         return $collect;
     }
@@ -234,7 +234,7 @@ Class OwnerService
         return Cache::remember("getOwnerByCode_{$code}", config('cache.expirations.owners'), function ()use($code){
             $owner = Owner::query()->where('code',$code)->first();
             if($owner) return $owner;
-            $basCustomer = app('OracleBasCustomerService')->first(['Customer_Type'=>'OW','CustomerID'=>$code]);
+             $basCustomer = app('OracleBasCustomerService')->first(['Customer_Type'=>'OW','CustomerID'=>$code]);
             if(!$basCustomer)return null;
             return Owner::query()->create(['name'=>$basCustomer['descr_c'],'code'=>$basCustomer['customerid']]);
         });

+ 1 - 1
app/Services/ShopService.php

@@ -110,7 +110,7 @@ class ShopService
         $collect = collect();
         if(count($map)==0)return $collect;
         foreach ($map as $item) {
-            $collect->push(Cache::remember("getShopByCodeMap_{$item['owner_code']}_{$item['issuepartyname']}", config('database.cache.expirations.rarelyChange'), function()use($item,$owner_map){
+            $collect->push(Cache::remember("getShopByCodeMap_{$item['owner_code']}_{$item['issuepartyname']}", config('cache.expirations.rarelyChange'), function()use($item,$owner_map){
                 $owner = $owner_map[$item['owner_code']] ;
                 $shop = Shop::query()->where('owner_id',$owner['id'])->where('name',$item['issuepartyname'])->first();
                 if($shop)return $shop;

+ 3 - 1
config/sync.php

@@ -44,7 +44,9 @@ return [
             'created_at' => 'order_last_created_sync_at',       // 最后创建时间
             'updated_at' => 'order_last_updated_sync_at',       // 最后更新时间
             'newest_list' => 'order_newest_cache_keys',               // 新增保存记录
-            'renewal_list' => 'order_renewal_cache_keys'              // 创建保存记录
+            'renewal_list' => 'order_renewal_cache_keys',              // 创建保存记录
+            'newest_is_running' =>  'order_newest_task_is_running',     // 同步创建任务是否在进行 true 为正在进行
+            'renewal_is_running' =>  'order_renewal_task_is_running',     // 同步更新任务是否在进行 true 为正在进行
         ]
     ]
 ];

+ 4 - 4
database/factories/OrcaleDOCOrderHeaderFactory.php

@@ -8,11 +8,11 @@ use Faker\Generator as Faker;
 $factory->define(OracleDOCOrderHeader::class, function (Faker $faker) {
     return [
         'orderno' => $faker->uuid,
-        'customerid' => '',
-        'waveno' => '',
+        'customerid' => $faker->name,
+        'waveno' => $faker->name,
         'ordertime' =>$faker->time(),
         'soreference1' => $faker->uuid,
-        'consigneeid' => '',
+        'consigneeid' => $faker->name,
         'c_contact' =>$faker->title(10),
         'consigneename' => $faker->title(11),
         'c_address1' => $faker->address,
@@ -27,7 +27,7 @@ $factory->define(OracleDOCOrderHeader::class, function (Faker $faker) {
         'soreference5' => $faker->uuid,
         'c_tel2' => $faker->phoneNumber,
         'transportation' => $faker->phoneNumber,
-        'warehouseid' => '',
+        'warehouseid' => $faker->name,
         'sostatus' => '99',
         'c_tel1' => $faker->phoneNumber,
         'c_district' => $faker->city,

+ 5 - 1
database/factories/OrderCommodityFactory.php

@@ -7,6 +7,10 @@ use Faker\Generator as Faker;
 
 $factory->define(OrderCommodity::class, function (Faker $faker) {
     return [
-        //
+        'order_id' => 1,
+        'commodity_id' => 1,
+        'amount' => rand(1,100),
+        'wms_ptltaskid' => $faker->name,
+        'location' => $faker->name
     ];
 });

+ 67 - 0
tests/Services/OrderCommodityService/GetReGroupActAllocationDetailsTest.php

@@ -0,0 +1,67 @@
+<?php
+
+namespace Tests\Services\OrderCommodityService;
+
+use App\OracleActAllocationDetails;
+use App\OracleDOCOrderHeader;
+use App\Owner;
+use App\Services\OrderCommodityService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetReGroupActAllocationDetailsTest extends TestCase
+{
+//    use RefreshDatabase;
+
+    /** @var OrderCommodityService  $service */
+    private $service;
+    private $data;
+
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app('OrderCommodityService');
+//        $owner = factory(Owner::class)->create();
+        $orderHeaders  = collect();
+        $orderHeader = factory(OracleDOCOrderHeader::class)->make();
+        $oracleActAllocationDetails = collect();
+        for ($i=0;$i<=10;$i++){
+            $oracleActAllocationDetails->push( factory(OracleActAllocationDetails::class)->make(['orderno'=>$orderHeader['orderno'],'customerid' => $orderHeader['customerid']]));
+        }
+        $orderHeader->setRelation('actAllocationDetails',$oracleActAllocationDetails);
+        $orderHeaders->push($orderHeader);
+        $this->data['orderHeaders'] = $orderHeaders;
+    }
+
+    /**
+     * @test
+     */
+    public function getRegroupActAllocationDetails()
+    {
+        $orderHeaders = $this->data['orderHeaders'];
+        $oracleActAllocationDetails = $orderHeaders->first()->actAllocationDetails;
+
+        $regroupActAllocationDetails = $this->service->getRegroupActAllocationDetails($orderHeaders);
+
+        $this->assertNotNull($oracleActAllocationDetails);
+        $this->assertNotNull($regroupActAllocationDetails);
+
+        $this->assertEquals(count($orderHeaders),$this->count($regroupActAllocationDetails));
+        foreach ($regroupActAllocationDetails as $items) {
+            foreach ($items as $item) {
+                $details = $oracleActAllocationDetails
+                    ->where('location',$item['location'])
+                    ->where('customerid',$item['owner_code'])
+                    ->where('sku',$item['sku']);
+                $this->assertNotEmpty($details);
+                $this->assertEquals(1, $details->count());
+            }
+        }
+    }
+
+    public function tearDown(): void
+    {
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 0 - 65
tests/Services/OrderCommodityService/SyncOrderCommoditiesTest.php

@@ -1,65 +0,0 @@
-<?php
-
-
-namespace Tests\Services\OrderCommodityService;
-
-use Carbon\Carbon;
-use Tests\TestCase;
-use App\OracleDOCOrderHeader;
-use App\Order;
-use App\OrderCommodity;
-use App\Services\OrderCommodityService;
-use App\Services\OrderService;
-use Illuminate\Foundation\Testing\RefreshDatabase;
-
-class SyncOrderCommoditiesTest extends TestCase
-{
-    use RefreshDatabase;
-
-    /**
-     * @var OrderService $orderService
-     * @var OrderCommodityService $service
-     */
-    private $service;
-    private $orderService;
-    private $data = [];
-
-    public function setUp(): void
-    {
-        parent::setUp();
-        $this->service = app('OrderCommodityService');
-        $this->orderService = app('OrderService');
-    }
-
-    /**
-     * @test
-     */
-    public function syncOrderCommodities()
-    {
-        $orderHeader  = OracleDOCOrderHeader::query()->with('oracleDOCOrderDetails')->where('sostatus','99')->orderByDesc('addTime')->first();
-        $orderHeaders = collect();
-        $orderHeaders->push($orderHeader);
-
-        $this->orderService->syncOrderByWMSOrderHeaders($orderHeaders);
-        $this->service->syncOrderCommodities($orderHeaders);
-
-        $order = Order::query()->where('code',$orderHeader->orderno)->first();
-        $orderCommodities = OrderCommodity::query()->with('commodity')->where('order_id',$order['id'])->get();
-        $oracleDOCOrderDetails =  $orderHeader->oracleDOCOrderDetails;
-        $oracleDOCOrderDetails->each(function($detail)use($orderCommodities){
-            $orderCommodity = $orderCommodities->where('commodity.sku',$detail['sku'])->where('amount',$detail['qtyordered'])->first();
-            $this->assertNotNull($orderCommodity);
-        });
-
-        $orderCommodities->each(function($orderCommodity)use($oracleDOCOrderDetails){
-            $detail = $oracleDOCOrderDetails->where('sku',$orderCommodity->commodity->sku)->where('qtyordered',$orderCommodity->amount)->first();
-            $this->assertNotNull($detail);
-        });
-    }
-
-    public function tearDown(): void
-    {
-        cache()->flush();
-        parent::tearDown(); // TODO: Change the autogenerated stub
-    }
-}

+ 91 - 0
tests/Services/OrderCommodityService/SyncOrderCommodityTest.php

@@ -0,0 +1,91 @@
+<?php
+
+namespace Tests\Services\OrderCommodityService;
+
+use App\Commodity;
+use App\OracleActAllocationDetails;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\OrderCommodity;
+use App\Owner;
+use App\Services\CommodityService;
+use App\Services\OrderCommodityService;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class SyncOrderCommodityTest extends TestCase
+{
+//    use RefreshDatabase;
+
+    /** @var OrderCommodityService $service */
+    private $service;
+    private $data = [];
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app('OrderCommodityService');
+
+        $owners = factory(Owner::class)->times(5)->create();
+        $this->data['owners'] = $owners;
+        $commodities = collect();
+        foreach ($owners as $owner) {
+            $commodities = $commodities->concat(factory(Commodity::class)->times(rand(5,20))->create(['owner_id'=>$owner->id]));
+        }
+        $this->data['commodities'] = $commodities;
+
+        $orderHeaders = collect();$orders = collect();
+        for ($i=0;$i<2000;$i++) {
+            $owner = $owners->random();
+            $commodity_list = $commodities->where('owner_id',$owner->id);
+            $order = factory(Order::class)->create(['owner_id'=>$owner->id]);
+            $orderHeader = factory(OracleDOCOrderHeader::class)->make(['orderno' => $order->code, 'customerid' => $owner->code]);
+            $oracleActAllocationDetails = collect();
+            for($count=1;$count<=4;$count++){
+                $commodity = $commodity_list->random();
+                $oracleActAllocationDetail  = factory(OracleActAllocationDetails::class)->make([
+                    'orderno'=>$orderHeader['orderno'],
+                    'customerid' => $orderHeader['customerid'],
+                    'sku' => $commodity->sku
+                    ]);
+                $oracleActAllocationDetails->push($oracleActAllocationDetail);
+            }
+            $orderHeader->setRelation('actAllocationDetails',$oracleActAllocationDetails);
+            $orderHeaders->push($orderHeader);
+            $orders->push($order);
+        }
+        $this->data['orders'] = $orders;
+        $this->data['orderHeaders'] = $orderHeaders;
+
+        $this->mock(CommodityService::class,function($mock)use($commodities){
+            $mock->shouldReceive('get_')->andReturn($commodities);
+        });
+    }
+
+    /**
+     * @test
+     */
+    public function syncOrderCommodity()
+    {
+        for ($i = 0 ;$i<4; $i++) {
+            $this->service->syncOrderCommodity($this->data['orderHeaders']);
+        }
+        $counts = OrderCommodity::query()->whereIn('order_id',data_get($this->data['orders'],'*.id'))->get()->count();
+        $actAllocationDetailsCounts  = 0;
+         foreach ($this->data['orderHeaders'] as $orderHeader) {
+            $actAllocationDetails = $orderHeader->actAllocationDetails;
+            $actAllocationDetailsCounts  += $actAllocationDetails->count();
+        }
+        $this->assertEquals($counts,$actAllocationDetailsCounts);
+     }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        Order::query()->whereIn('id',data_get($this->data['orders'],'*.id'))->delete();
+        Owner::query()->whereIn('id',data_get($this->data['owners'],'*.id'))->delete();
+        Commodity::query()->whereIn('id',data_get($this->data['commodities'],'*.id'))->delete();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 0 - 1
tests/Services/OrderPackageService/GetInnerParamsTest.php

@@ -16,7 +16,6 @@ use Tests\TestCase;
 
 class GetInnerParamsTest extends TestCase
 {
-    use RefreshDatabase;
     /**
      * @var OrderPackageService $service
      */

+ 64 - 11
tests/Services/OrderPackageService/SyncOrderPackageTest.php

@@ -7,6 +7,7 @@ use App\OracleActAllocationDetails;
 use App\OracleBasSKU;
 use App\OracleDOCOrderHeader;
 use App\Order;
+use App\OrderPackage;
 use App\Owner;
 use App\Services\OracleDOCOrderHeaderService;
 use App\Services\OrderPackageService;
@@ -14,11 +15,11 @@ use App\Services\OrderService;
 use Carbon\Carbon;
 use Illuminate\Foundation\Testing\RefreshDatabase;
 use Illuminate\Foundation\Testing\WithFaker;
+use Illuminate\Support\Str;
 use Tests\TestCase;
 
 class SyncOrderPackageTest extends TestCase
 {
-    use RefreshDatabase;
 
     /**
      * @var OrderPackageService $service
@@ -38,24 +39,25 @@ class SyncOrderPackageTest extends TestCase
         $this->orderHeaderService = app('OracleDocOrderHeaderService');
 
         $orderHeader = factory(OracleDOCOrderHeader::class)->make(['userdefine1' =>'TEST_OW' ]);
-        $this->data['orderHeader'] = $orderHeader;
-        $order = factory(Order::class)->create([
-            'code'=>$orderHeader['orderno'],
-        ]);
-
+        $order = factory(Order::class)->create(['code'=>$orderHeader['orderno'],]);
         $basSku = factory(OracleBasSKU::class)->make(['customerid' => 'TEST_OW']);
-        $this->data['sku'] = $basSku;
         $OracleActAllocationDetail1 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$orderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku->sku]);
         $OracleActAllocationDetail2 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$orderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku->sku]);
         $OracleActAllocationDetail3 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$orderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku->sku]);
         $OracleActAllocationDetails = collect([$OracleActAllocationDetail1,$OracleActAllocationDetail2,$OracleActAllocationDetail3]);
         $orderHeader->setRelation('actAllocationDetails',$OracleActAllocationDetails);
-        $this->data['actAllocationDetails'] = $OracleActAllocationDetails;
+
         $owner = factory(Owner::class)->create(['code'=>'TEST_OW']);
         $commodity = factory(Commodity::class)->create(['sku'=>$basSku['sku'],'owner_id' => $owner]);
-        $this->data['owner'] = $owner;
-        $this->data['commodity'] = $commodity;
-        $this->data['order'] = $order;
+        $this->data = [
+            'owner' => $owner,
+            'commodity' => $commodity,
+            'order' => $order,
+            'orderHeader' =>  $orderHeader,
+            'sku' => $basSku,
+            'actAllocationDetails' => $OracleActAllocationDetails,
+        ];
+
     }
 
     /**
@@ -63,6 +65,57 @@ class SyncOrderPackageTest extends TestCase
      */
     public function syncOrderPackage()
     {
+        $orderHeaders = collect([$this->data['orderHeader']]);
+        $this->service->syncOrderPackage($orderHeaders);
+        $orderPackages = OrderPackage::query()->where('order_id',$this->data['order']['id'])->get();
+        $this->assertEquals($orderPackages->count(),count($this->data['orderHeader']->actAllocationDetails));
+    }
 
+    /**
+     * @test
+     */
+    public function orderPackageUnnecessary()
+    {
+        OrderPackage::query()->create(['order_id'=>$this->data['order']['id'],'logistic_number'=>Str::uuid()]);
+        OrderPackage::query()->create(['order_id'=>$this->data['order']['id'],'logistic_number'=>Str::uuid()]);
+        $orderHeaders = collect([$this->data['orderHeader']]);
+        $this->service->syncOrderPackage($orderHeaders);
+        $orderPackages = OrderPackage::query()->where('order_id',$this->data['order']['id'])->get();
+        $this->assertEquals($orderPackages->count(),count($this->data['orderHeader']->actAllocationDetails));
     }
+
+    /**
+     * @test
+     */
+    public function orderPackagesLack()
+    {
+        $orderHeaders = collect([$this->data['orderHeader']]);
+        $this->service->syncOrderPackage($orderHeaders);
+        $actAllocationDetails = $this->data['actAllocationDetails']->random(2);
+        $this->data['orderHeader']->setRelation('actAllocationDetails', $actAllocationDetails);
+        $orderHeaders = collect([$this->data['orderHeader']]);
+        $this->service->syncOrderPackage($orderHeaders);
+        $orderPackages = OrderPackage::query()->where('order_id',$this->data['order']['id'])->get();
+        $this->assertEquals($orderPackages->count(),count($this->data['orderHeader']->actAllocationDetails));
+        $this->assertOrderPackage($orderHeaders,$orderPackages);
+    }
+
+    public function assertOrderPackage($orderHeaders,$orderPackages)
+    {
+        foreach ($orderHeaders->first()->actAllocationDetails as $actAllocationDetail) {
+            $orderPackage = $orderPackages->where('logistic_number',$actAllocationDetail->picktotraceid)->first();
+            $this->assertNotEmpty($orderPackage);
+        }
+    }
+
+    protected function tearDown(): void
+    {
+        $this->data['owner']->delete();
+        $this->data['commodity']->delete();
+        $this->data['order']->delete();
+
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+
+
 }

+ 0 - 39
tests/Services/OrderPackageService/SyncPackageByOrderHeadersTest.php

@@ -1,39 +0,0 @@
-<?php
-
-namespace Tests\Services\OrderPackageService\SyncPackageByOrderHeadersTest;
-
-use App\Logistic;
-use App\OracleDOCOrderHeader;
-use App\Owner;
-use App\Services\OracleDOCOrderHeaderService;
-use App\Services\OrderPackageService;
-use App\Services\OrderService;
-use App\Shop;
-use Illuminate\Foundation\Testing\RefreshDatabase;
-use Tests\TestCase;
-
-class SyncPackageByOrderHeadersTest extends TestCase
-{
-    use RefreshDatabase;
-
-    /**
-     * @var OrderPackageService $service
-     * @var OracleDOCOrderHeaderService $orderHeaderService
-     * @var OrderService $orderService
-     */
-    public $service;
-    public $orderService;
-    public $orderHeaderService;
-
-    public function setUp(): void
-    {
-        parent::setUp();
-        $this->service = app('OrderPackageService');
-        $this->orderService = app('OrderService');
-        $this->orderHeaderService = app('OracleDocOrderHeaderService');
-    }
-    public function testSyncPackageByOrderHeaders()
-    {
-
-    }
-}

+ 0 - 1
tests/Services/OrderService/CreateOrFindOrderInfoTest.php

@@ -22,7 +22,6 @@ use Tests\TestCase;
 
 class CreateOrFindOrderInfoTest extends TestCase
 {
-    use RefreshDatabase;
 
     /**
      * @var OrderService $orderService

+ 0 - 1
tests/Services/OrderService/CreateOrFindOrderTest.php

@@ -19,7 +19,6 @@ use Tests\TestCase;
 
 class CreateOrFindOrderTest extends TestCase
 {
-    use RefreshDatabase;
     /**
      * @var OrderService $orderService
      */

+ 0 - 2
tests/Services/OrderService/FindOrCreateByClientCodeTest.php

@@ -18,8 +18,6 @@ use Tests\TestCase;
 
 class FindOrCreateByClientCodeTest extends TestCase
 {
-    use RefreshDatabase;
-
     /** @var OrderService $service */
     public $service;
     private $data;

+ 53 - 0
tests/Services/OrderService/GetByWmsOrdersTest.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace Tests\Services\OrderService;
+
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\Services\OrderService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetByWmsOrdersTest extends TestCase
+{
+    /**
+     * @var OrderService $service
+     */
+    private $service;
+    private $data = [];
+
+    protected function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated
+        $this->service = app('OrderService');
+        $orders = factory(Order::class)->times(1000)->create();
+        $orderHeaders = collect();
+        foreach ($orders as $order) {
+            $orderHeader = factory(OracleDOCOrderHeader::class)->make(['orderno'=>$order->code]);
+            $orderHeaders->push($orderHeader);
+        }
+        $this->data =[
+            'orders' => $orders,
+            'orderHeaders' => $orderHeaders
+        ];
+    }
+
+    /**
+     * @test
+     */
+    public function getByWmsOrders()
+    {
+        $orders = $this->service->getByWmsOrders($this->data['orderHeaders']);
+        $this->assertNotEmpty($orders);
+        $this->assertEquals(count($this->data['orders']),$orders->count());
+    }
+
+    protected function tearDown(): void
+    {
+        Order::query()->whereIn('id',data_get($this->data['orders'],'*.id'))->delete();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+
+
+}

+ 11 - 9
tests/Services/OrderService/GetCreateOrderModelByWMSOrderHeadersTest.php

@@ -29,7 +29,7 @@ use Tests\TestCase;
 class GetCreateOrderModelByWMSOrderHeadersTest extends TestCase
 {
 
-    use  RefreshDatabase;
+//    use  RefreshDatabase;
 
     /**
      * @var OrderService $service
@@ -75,7 +75,6 @@ class GetCreateOrderModelByWMSOrderHeadersTest extends TestCase
         $wmsOrderHeader->setRelation('oracleBASCode',$code_BasCode);
         $this->data['orderHeader'] = $wmsOrderHeader;
 
-
     }
 
     /**
@@ -86,12 +85,15 @@ class GetCreateOrderModelByWMSOrderHeadersTest extends TestCase
 
         $orderHeaders = collect([$this->data['orderHeader']]);
         $warehouses = $this->getWareHouses($orderHeaders);
+
         $owners = $this->getOwners($orderHeaders);
         $logistics = $this->getLogistics($orderHeaders);
         $shops = $this->getShops($orderHeaders);
-
+        $batches = [];
         $orders = $this->service->getByWmsOrders($orderHeaders);
-        $crate_orders = $this->service->getCreateOrderModelsByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops);
+
+        $crate_orders = $this->service->getCreateOrderModelsByWMSOrderHeaders($orderHeaders, $orders, $warehouses, $owners, $logistics, $shops, $batches);
+
         if($orders->count() == $orderHeaders->count() ){
             $this->assertEquals($orders->count(),$orderHeaders->count());
         }
@@ -124,10 +126,10 @@ class GetCreateOrderModelByWMSOrderHeadersTest extends TestCase
             $this->assertEquals($order->client_code ,$orderHeader->soreference1);
             $this->assertEquals($order->wms_edittime ,(string)$orderHeader->edittime);
             $this->assertEquals($order->wms_status ,$orderHeader->oracleBASCode_codename_c);
-//            $this->assertEquals((string)$order->created_at ,(string)$orderHeader->addtime);
         }
     }
 
+
     public function getWareHouses($orderHeaders)
     {
         return $this->warehouseService->getByWmsOrders($orderHeaders);
@@ -151,10 +153,10 @@ class GetCreateOrderModelByWMSOrderHeadersTest extends TestCase
         cache()->forget("getOwnerByCode_{$this->data['owner']}");
         cache()->forget("getShopByCodeMap_{$this->data['shop']}");
         cache()->forget("WareHouse_{$this->data['warehouse']}");
-        $this->data['warehouse']->delte();
-        $this->data['logistic']->delte();
-        $this->data['owner']->delte();
-        $this->data['shop']->delte();
+        $this->data['warehouse']->delete();
+        $this->data['logistic']->delete();
+        $this->data['owner']->delete();
+        $this->data['shop']->delete();
         parent::tearDown(); // TODO: Change the autogenerated stub
     }
 

+ 136 - 0
tests/Services/OrderService/GetCreateOrderModelsTest.php

@@ -0,0 +1,136 @@
+<?php
+
+namespace Tests\Services\OrderService;
+
+use App\Batch;
+use App\Logistic;
+use App\OracleBasCode;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\Owner;
+use App\Services\common\DataHandlerService;
+use App\Services\OrderService;
+use App\Shop;
+use App\Warehouse;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetCreateOrderModelsTest extends TestCase
+{
+
+    /**
+     * @var OrderService $service
+     * @var DataHandlerService $dataHandlerService
+     */
+    private $service;
+    private $dataHandlerService;
+    private $data = [];
+
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app('OrderService');
+        $this->dataHandlerService = app('DataHandlerService');
+
+        $owners = factory(Owner::class)->times(20)->create();
+        $this->data['owners'] = $owners;
+        $logistics = factory(Logistic::class)->times(30)->create();
+        $wareHouses = factory(Warehouse::class)->times(2)->create();
+        $batches = factory(Batch::class)->times(10)->create();
+        $this->data['logistics'] = $logistics;
+        $this->data['wareHouses'] = $wareHouses;
+        $shops = collect();
+        foreach ($owners as $owner) {
+            $shops = $shops->concat(factory(Shop::class)->times(rand(1,11))->create(['owner_id'=>$owner->id]));
+        }
+        $this->data['shops'] = $shops;
+        $orderHeaders = collect();
+
+        $basBack = factory(OracleBasCode::class)->times(5)->make();
+
+        for ($i=0;$i<= 30;$i++) {
+            $owner = $owners->random();
+            $shop = $shops->where('owner_id',$owner->id)->random();
+            $logistic = $logistics->random();
+            $wareHouse = $wareHouses->random();
+            $batch = $batches->random();
+            $orderHeader = factory(OracleDOCOrderHeader::class)->make();
+            $orderHeader->customerid = $owner->code;
+            $orderHeader->waveno = $batch->code;
+            $orderHeader->warehouseid = $wareHouse->code;
+            $orderHeader->userdefine1 = $logistic->code;
+            $orderHeader->issuepartyname =  $shop->code;
+            $orderType = $basBack->random();
+            $oracleBASCode = $basBack->random();
+            $orderHeader->setRelation('orderType',$orderType);
+            $orderHeader->setRelation('oracleBASCode',$oracleBASCode);
+            $orderHeaders->push($orderHeader);
+        }
+        $this->data = [
+            'owners'  => $owners,
+            'logistics' => $logistics,
+            'wareHouses' => $wareHouses,
+            'shops' => $shops,
+            'orderHeaders' => $orderHeaders,
+            'batches' => $batches,
+        ];
+    }
+
+    /**
+     * @test
+     */
+    public function getCreateOrderModels()
+    {
+        // is progressing
+        // Mission in progress
+        $orderHeader_map =$this->data['orderHeaders'];
+        $warehouse_map = $this->dataHandlerService->dataHeader(['code'],$this->data['wareHouses']);
+        $owner_map = $this->dataHandlerService->dataHeader(['code'],$this->data['owners']);
+        $logistic_map = $this->dataHandlerService->dataHeader(['code'],$this->data['logistics']);
+        $shop_map = $this->dataHandlerService->dataHeader(['name','owner_id'],$this->data['shops']);
+        $batch_map =  $this->dataHandlerService->dataHeader(['code'],$this->data['batches']);
+        $date = (string)Carbon::now();
+        foreach ($orderHeader_map as $orderHeader) {
+            $param = $this->service->getCreateOrderModels($orderHeader,$warehouse_map,$owner_map,$logistic_map,$shop_map,$batch_map,$date);
+            $warehouse = $this->dataHandlerService->getKeyValue(['code'=>$orderHeader->warehouseid],$warehouse_map);
+            $owner = $this->dataHandlerService->getKeyValue(['code'=>$orderHeader->customerid],$owner_map);
+            $logistic = $this->dataHandlerService->getKeyValue(['code'=>$orderHeader->userdefine1],$logistic_map);
+            $batch = $this->dataHandlerService->getKeyValue(['code'=>$orderHeader->waveno],$batch_map);
+            $shop['id'] = null;
+            if($orderHeader->issuepartyname != null && $orderHeader->issuepartyname != '' ){
+                $shop = $this->dataHandlerService->getKeyValue(['name'=>$orderHeader->issuepartyname ?? '','owner_id'=>$owner->id??''],$shop_map);
+            }
+
+            $this->assertEquals($param['code'],$orderHeader['orderno']);
+            $this->assertEquals($param['batch_id'],$batch['id'] ?? null);
+            $this->assertEquals($param['warehouse_id'],$warehouse['id'] ?? null);
+            $this->assertEquals($param['owner_id'],$owner['id'] ?? null);
+            $this->assertEquals($param['shop_id'],$shop['id'] ?? null);
+            $this->assertEquals($param['logistic_id'],$logistic['id'] ?? null);
+            $this->assertEquals($param['consignee_name'],  $orderHeader['c_contact']);
+            $this->assertEquals($param['consignee_phone'],$orderHeader['c_tel2'] ?? $orderHeader['c_tel1']);
+            $this->assertEquals($param['city'],$orderHeader['c_city']);
+            $this->assertEquals($param['district'],$orderHeader['c_district']);
+            $this->assertEquals($param['address'],$orderHeader['c_address1']);
+            $this->assertEquals($param['client_code'],$orderHeader['soreference1']);
+            $this->assertEquals($param['wms_edittime'], $orderHeader['edittime']);
+            $this->assertEquals($param['wms_status'],$orderHeader->oracleBASCode->codename_c??'');
+            $this->assertEquals($param['order_type'],$orderHeader->orderType->codename_c??'');
+        }
+    }
+
+    public function tearDown(): void
+    {
+        Order::query()->whereIn('code',data_get($this->data['orderHeaders'],'*.orderno'));
+
+        Warehouse::query()->whereIn('id',data_get($this->data['wareHouses'],'*.id'));
+        Owner::query()->whereIn('id',data_get($this->data['owners'],'*.id'));
+        Logistic::query()->whereIn('id',data_get($this->data['logistics'],'*.id'));
+        Shop::query()->whereIn('id',data_get($this->data['shops'],'*.id'));
+        Batch::query()->whereIn('id',data_get($this->data['batches'],'*.id'));
+
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 0 - 1
tests/Services/OrderService/GetOrderSyncAtTest.php

@@ -8,7 +8,6 @@ use Tests\TestCase;
 
 class GetOrderSyncAtTest extends TestCase
 {
-    use RefreshDatabase;
     /**
      * @var OrderService $service
      */

+ 0 - 1
tests/Services/OrderService/GetParamByOrderHeaderTest.php

@@ -23,7 +23,6 @@ use Tests\TestCase;
 
 class GetParamByOrderHeaderTest extends TestCase
 {
-    use RefreshDatabase;
 
     /** @var OrderService $service */
     private $service;

+ 131 - 97
tests/Services/OrderService/GetUpdateModelByWmsOrderHeadersTest.php

@@ -2,132 +2,166 @@
 
 namespace Tests\Services\OrderService\GetUpdateOrderModelByWMSOrderHeadersTest;
 
+use App\Batch;
 use App\Logistic;
 use App\OracleBasCode;
 use App\OracleDOCOrderHeader;
 use App\Order;
 use App\Owner;
-use App\Services\LogisticService;
-use App\Services\OracleDOCOrderHeaderService;
 use App\Services\OrderService;
-use App\Services\OwnerService;
-use App\Services\ShopService;
-use App\Services\WarehouseService;
 use App\Shop;
 use App\Warehouse;
-use Carbon\Carbon;
-use Illuminate\Foundation\Testing\RefreshDatabase;
-use Illuminate\Foundation\Testing\WithFaker;
-use Illuminate\Support\Str;
 use Tests\TestCase;
 
 class GetUpdateModelByWmsOrderHeadersTest extends TestCase
 {
-    use RefreshDatabase;
     /**
      * @var OrderService $service
-     * @var OracleDOCOrderHeaderService $orderHeaderService
      */
-    public $service;
-    public $orderHeaderService;
+    private $service;
     private $data = [];
 
     public function setUp(): void
     {
         parent::setUp();
         $this->service = app('OrderService');
-        $this->orderHeaderService = app('OracleDocOrderHeaderService');
-
-        $wmsOrderHeader = factory(OracleDOCOrderHeader::class)->make([
-            'customerid'=>'TEST_OW','sostatus'=>99,'userdefine1'=>'TEST_CA','warehouseid'=>'WH_TEST'
-        ]);
-
-        $orderType = factory(OracleBasCode::class)->make(['code'=>'sysy', 'codeid'=>'SO_TYP', 'codename_c'=>'测试状态']);
-        $wmsOrderHeader->setRelation('orderType',$orderType);
-
-        $code_BasCode  = factory(OracleBasCode::class)->make(['codeid'=>'OW','code'=>'99','descr_c'=>'订单完成']);
-        $wmsOrderHeader->setRelation('oracleBASCode',$code_BasCode);
-
-        $this->data['warehouse']    = factory(Warehouse::class)->create(['code'=>'WH_TEST']);
-        $this->data['logistic']     = factory(Logistic::class)->create(['code'=>'TEST_CA','name'=>'测试承运商']);
-        $this->data['owner']        = factory(Owner::class)->create(['code'=>'TEST_OW','name'=>'测试货主']);
-        $this->data['shop']         = factory(Shop::class)->create(['owner_id'=>$this->data['owner']['id']]);
-
-        $this->data['orderHeader'] = $wmsOrderHeader;
+        $owners = factory(Owner::class)->times(10)->create();
+        $logistics = factory(Logistic::class)->times(20)->create();
+        $wareHouses = factory(Warehouse::class)->times(3)->create();
+        $shops = collect();
+        foreach ($owners as $owner) {
+            $shops = $shops->concat(factory(Shop::class)->times(rand(3,5))->create(['owner_id'=>$owner->id]));
+        }
+        $batches = factory(Batch::class)->times(10)->create();
+        $orders = collect();
+        $orderHeaders = collect();
+        foreach ($owners as $owner) {
+            $count = rand(2,10);
+            for ($i =0 ;$i<=$count;$i++){
+                $shop = $shops->where('owner_id',$owner->id)->random();
+                $warehouse = $wareHouses->random();
+                $logistic = $logistics->random();
+                $batch = $batches->random();
+
+                $orderHeader = factory(OracleDOCOrderHeader::class)->make([
+                        'warehouseid'=>$warehouse->code,
+                        'waveno'=>$batch->code,
+                        'customerid'=>$owner->code,
+                        'userdefine1'=>$logistic->code,
+                        'issuepartyname' => $shop->name,
+                    ]);
+                $oracleBASCode = factory(OracleBasCode::class)->make();
+                $orderType = factory(OracleBasCode::class)->make();
+                $orderHeader->setRelation('oracleBASCode',$oracleBASCode);
+                $orderHeader->setRelation('orderType',$orderType);
+                $orderHeaders = $orderHeaders->push($orderHeader);
+
+                $order = factory(Order::class)->create([
+                    'code' => $orderHeader->orderno,
+                    'batch_id' =>$batch->id,
+                    'warehouse_id' => $warehouse->id,
+                    'logistic_id' => $logistic->id,
+                    'shop_id' => $shop->id,
+                    'owner_id' => $owner->id
+                ]);
+                $orders->push($order);
+            }
+        }
+        $this->data = [
+            'warehouses' => $wareHouses,
+            'batches' => $batches,
+            'owners' => $owners,
+            'logistics' => $logistics,
+            'shops' => $shops,
+            'orders' => $orders,
+            'orderHeaders' => $orderHeaders
+        ];
     }
 
     /**
-     * @test
+     * @test 测试
      */
-    public function getUpdateOrderModelByWMSOrderHeaders()
+    public function getUpdateModelByWmsOrderHeader()
     {
+        $update_models = $this->service->getUpdateOrderModelByWMSOrderHeaders(
+            $this->data['orderHeaders'],
+            $this->data['orders'],
+            $this->data['warehouses'],
+            $this->data['owners'],
+            $this->data['logistics'],
+            $this->data['shops'],
+            $this->data['batches']
+        );
+        $this->assertEquals($update_models->count(),count($this->data['orders']));
+        $this->assertEquals(count($this->data['orders']),count($update_models));
+    }
 
-        $orderHeaders = collect([$this->data['orderHeader']]);
-        /**
-         * @var OwnerService $ownerService
-         * @var LogisticService $logisticService
-         * @var ShopService $shopService
-         * @var WarehouseService $warehouseService
-         * @var OrderService $orderService
-         */
-        $ownerService = app("OwnerService");
-        $logisticService = app("LogisticService");
-        $shopService = app('ShopService');
-        $warehouseService = app('WarehouseService');
-        $orderService = app('OrderService');
-        $owners = $ownerService->getByWmsOrders($orderHeaders);
-        $logistics = $logisticService->getByWmsOrders($orderHeaders);
-        $shops = $shopService->getByWmsOrders($orderHeaders);
-        $warehouses = $warehouseService->getByWmsOrders($orderHeaders);
-        $orderService->syncOrderByWMSOrderHeaders($orderHeaders);
-
-        $orders = Order::query()->whereIn('code',data_get($orderHeaders,'*.orderno'))->get();
-        $orders->each(function(&$item){
-            $item->warehouse_id = 1;
-            $item->owner_id = 1;
-            $item->shop_id = 1;
-            $item->logistic_id = 1;
-            $item->consignee_name = Str::random(50);
-            $item->consignee_phone = Str::random(50);
-            $item->province = Str::random(50);
-            $item->city = Str::random(50);
-            $item->district = Str::random(50);
-            $item->address = Str::random(50);
-            $item->client_code = Str::random(52);
-            $item->wms_edittime = Carbon::now();
-            $item->wms_status = Str::random(10);
-            $item->updated_at = Carbon::now();
-            $item->created_at = Carbon::now();
-        });
-        $update_orders = $this->service->getUpdateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops);
+    /**
+     * @test 部分Order与OrderHeaders相同
+     */
+    public function orderPortionIsEquals()
+    {
+        $orders  = $this->data['orders']->random(10);
+        foreach ($orders as $order) {
+            $orderHeader = $this->data['orderHeaders']->where('orderno',$order->code)->first();
+            $orderHeader->oracleBASCode->codename_c = '订单完成';
+            $order->update([
+                'consignee_name' => $orderHeader['c_contact'],
+                'consignee_phone' =>$orderHeader['c_tel2'] ?? $orderHeader['c_tel1'] ,
+                'province' =>$orderHeader['c_province'] ,
+                'city' =>$orderHeader['c_city'] ,
+                'district' =>$orderHeader['c_district'] ,
+                'address' => $orderHeader['c_address1'],
+                'client_code' =>$orderHeader['soreference1'] ,
+                'wms_edittime' => $orderHeader['edittime'] ,
+                'wms_status' =>$orderHeader->oracleBASCode->codename_c?? "",
+                'order_type' =>$orderHeader->orderType->codename_c?? "",
+                'created_at' =>  $orderHeader['addtime'],
+            ]);
+        }
+        $orders = Order::query()->whereIn('code',data_get($this->data['orderHeaders'],'*.orderno'))->get();
+        $update_params = $this->service->getUpdateOrderModelByWMSOrderHeaders(
+            $this->data['orderHeaders'],
+            $orders,
+            $this->data['warehouses'],
+            $this->data['owners'],
+            $this->data['logistics'],
+            $this->data['shops'],
+            $this->data['batches']
+        );
+        $this->assertEquals($update_params->count(),$orders->count());
+        $this->assertOrderHeadersAndUpdateParams($this->data['orderHeaders'],$update_params);
+    }
 
-        foreach ($orderHeaders as $orderHeader) {
-            $order = $update_orders->where('code',$orderHeader->orderno)->first();
-            $this->assertNotNull($order);
+    public function assertOrderHeadersAndUpdateParams($orderHeaders,$update_params){
+        foreach ($update_params as $update_param) {
+            $warehouse = Warehouse::find($update_param['warehouse_id']);
+            $batch = Batch::find($update_param['batch_id']);
+            $owner = Owner::find($update_param['owner_id']);
+            $logistic = Logistic::find($update_param['logistic_id']);
+            $shop = Shop::find($update_param['shop_id']);
+            $orderHeader = $orderHeaders->where('orderno',$update_param['code'])->first();
+            $this->assertNotEmpty($orderHeader);
+            $this->assertEquals($orderHeader['warehouseid'], $warehouse->code);
+            $this->assertEquals($orderHeader['waveno'],$batch->code);
+            $this->assertEquals($orderHeader['customerid'],$owner->code);
+            $this->assertEquals($orderHeader['userdefine1'],$logistic->code);
+            $this->assertEquals($orderHeader['issuepartyname'],$shop->name);
+            $this->assertEquals($orderHeader->oracleBASCode->codename_c ?? '',$update_param['wms_status']);
+            $this->assertEquals($orderHeader->orderType->codename_c ?? '',$update_param['order_type']);
+        }
+    }
 
-            $warehouse = Warehouse::query()->where('code',$orderHeader->warehouseid)->first();
-            if($orderHeader->warehouseid ?? false)
-                $this->assertEquals($warehouse->id ?? '',$order->warehouse_id ?? '');
+    protected function tearDown(): void
+    {
+        Order::query()->whereIn('code',data_get($this->data['orderHeaders'],'*.orderno'))->delete();
+        Warehouse::destroy(data_get($this->data['warehouses'],'*.id'));
+        Batch::destroy(data_get($this->data['batches'],'*.id'));
+        Owner::destroy(data_get($this->data['owners'],'*.id'));
+        Logistic::destroy(data_get($this->data['logistics'],'*.id'));
+        Shop::destroy(data_get($this->data['shops'],'*.id'));
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
 
-            $owner = Owner::query()->where('code',$orderHeader->customerid)->first();
-            if($orderHeader->customerid ?? false)
-                $this->assertEquals($order->owner_id ?? '',$owner->id??'');
 
-            $logistic = Logistic::query()->where('code',$orderHeader->userdefine1??'')->first();
-            if($orderHeader->userdefine1 ?? false)
-                $this->assertEquals($logistic->id ?? '',$logistic->id ?? '');
-            $shop = Shop::query()->where('name',$orderHeader->issuepartyname)->where('owner_id',$owner->id)->first();
-            if($orderHeader->issuepartyname ?? false)
-                $this->assertEquals($shop->name,$orderHeader->issuepartyname);
-            $this->assertEquals($order->consignee_name ,$orderHeader->c_contact);
-            $this->assertEquals($order->consignee_phone ,empty($orderHeader->c_tel2)?$orderHeader->c_tel1:$orderHeader->c_tel2);
-            $this->assertEquals($order->province ,$orderHeader->c_province);
-            $this->assertEquals($order->city ,$orderHeader->c_city);
-            $this->assertEquals($order->district ,$orderHeader->c_district);
-            $this->assertEquals($order->client_code ,$orderHeader->soreference1);
-            $this->assertEquals($order->wms_edittime ,(string)$orderHeader->edittime);
-            $this->assertEquals($order->wms_status ,$orderHeader->oracleBASCode_codename_c);
-//            $this->assertEquals((string)$order->created_at ,(string)$orderHeader->addtime);
-        }
-    }
 }

+ 70 - 0
tests/Services/OrderService/InsertTest.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace Tests\Services\OrderService;
+
+use App\Order;
+use App\Services\OrderService;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class InsertTest extends TestCase
+{
+
+    /** @var OrderService $service */
+    private $service;
+    private $data = [];
+
+    protected function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app('OrderService');
+        $orders = factory(Order::class)->times(3000)->make();
+        $this->data['orders'] = $orders->map(function ($item){
+            return [
+            'batch_id' =>$item->batch_id,
+            'owner_id' =>$item->owner_id,
+            'status' =>$item->status,
+            'created_at' =>$item->created_at,
+            'code' =>$item->code,
+            'shop_id' =>$item->shop_id,
+            'client_code' =>$item->client_code,
+            'logistic_id' =>$item->logistic_id,
+            'consignee_name' =>$item->consignee_name,
+            'consignee_phone' =>$item->consignee_phone,
+            'province' =>$item->province,
+            'city' =>$item->city,
+            'district' =>$item->district,
+            'address' =>$item->address,
+            'warehouse_id' =>$item->warehouse_id,
+            'wms_edittime' =>$item->wms_edittime,
+            'wms_status' =>$item->wms_status,
+            'order_type' =>$item->order_type,
+            ];
+        })->toArray();
+    }
+
+    /**
+     * @test
+     */
+    public function insert()
+    {
+        $insert_params = array_chunk($this->data['orders'],1000);
+        foreach ($insert_params as $insert_param){
+            $this->service->insert($insert_param);
+        }
+        $this->data['order_codes'] = data_get($this->data['orders'],'*.code');
+
+        $orders = Order::query()->whereIn('code',$this->data['order_codes'])->get();
+        $this->assertEquals($orders->count(),count($this->data['orders']));
+    }
+
+    protected function tearDown(): void
+    {
+        Order::query()->whereIn('code',$this->data['order_codes'])->delete();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+
+    }
+
+}

+ 0 - 1
tests/Services/OrderService/PushOrderCreatedCacheTest.php

@@ -12,7 +12,6 @@ use Tests\TestCase;
 
 class PushOrderCreatedCacheTest extends TestCase
 {
-    use RefreshDatabase;
     /** @var OrderService $service */
     public $service;
     public $data = [];

+ 0 - 2
tests/Services/OrderService/PushOrderUpdateCacheTest.php

@@ -11,8 +11,6 @@ use Tests\TestCase;
 
 class PushOrderUpdateCacheTest extends TestCase
 {
-    use RefreshDatabase;
-
     /** @var OrderService $service */
     public $service;
     public $data;

+ 0 - 2
tests/Services/OrderService/SetOrderSyncAtTest.php

@@ -12,8 +12,6 @@ use Tests\TestCase;
 
 class SetOrderSyncAtTest extends TestCase
 {
-    use RefreshDatabase;
-
     /** @var OrderService $service */
     private $service;
     private $data = [];

+ 164 - 0
tests/Services/OrderService/SyncOrderByWMSOrderHeadersTest.php

@@ -0,0 +1,164 @@
+<?php
+
+namespace Tests\Services\OrderService;
+
+use App\Batch;
+use App\Logistic;
+use App\OracleBasCode;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\Owner;
+use App\Services\OrderService;
+use App\Shop;
+use App\Warehouse;
+use Tests\TestCase;
+
+class SyncOrderByWMSOrderHeadersTest extends TestCase
+{
+
+    /** @var OrderService $service */
+    private $service;
+    private $data = [];
+
+    protected function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app('OrderService');
+        $owners = factory(Owner::class)->times(10)->create();
+        $logistics = factory(Logistic::class)->times(20)->create();
+        $wareHouses = factory(Warehouse::class)->times(3)->create();
+        $shops = collect();
+        foreach ($owners as $owner) {
+            $shops = $shops->concat(factory(Shop::class)->times(rand(3,5))->create(['owner_id'=>$owner->id]));
+        }
+        $batches = factory(Batch::class)->times(10)->create();
+        $orderHeaders = collect();
+        foreach ($owners as $owner) {
+            $count = rand(1,10);
+            for ($i=0;$i<=$count;$i++) {
+                $shop = $shops->where('owner_id',$owner->id)->random();
+                $warehouse = $wareHouses->random();
+                $logistic = $logistics->random();
+                $batch = $batches->random();
+                $orderHeader = factory(OracleDOCOrderHeader::class)->make([
+                    'warehouseid'=>$warehouse->code,
+                    'waveno'=>$batch->code,
+                    'customerid'=>$owner->code,
+                    'userdefine1'=>$logistic->code,
+                    'issuepartyname' => $shop->name,
+                ]);
+                $oracleBASCode = factory(OracleBasCode::class)->make();
+                $orderType = factory(OracleBasCode::class)->make();
+                $orderHeader->setRelation('oracleBASCode',$oracleBASCode);
+                $orderHeader->setRelation('orderType',$orderType);
+                $orderHeaders = $orderHeaders->push($orderHeader);
+            }
+        }
+        $this->data = [
+            'warehouses' => $wareHouses,
+            'batches' => $batches,
+            'owners' => $owners,
+            'logistics' => $logistics,
+            'shops' => $shops,
+            'orderHeaders' => $orderHeaders
+        ];
+    }
+
+    /**
+     * @test
+     */
+    public function syncOrderByWMSOrderHeaders()
+    {
+        $this->service->syncOrderByWMSOrderHeaders($this->data['orderHeaders']);
+        $orders = Order::query()->whereIn('code',data_get($this->data['orderHeaders'],'*.orderno'))->get();
+        $this->data['orders'] = $orders;
+        $this->assertEquals(count($orders),count($this->data['orderHeaders']));
+        $this->assertOrderHeadersAndOrder($this->data['orderHeaders'],$orders);
+
+    }
+
+    /**
+     * @test 订单已存在
+     */
+    public function orderExisting()
+    {
+
+        $this->service->syncOrderByWMSOrderHeaders($this->data['orderHeaders']);
+        $this->service->syncOrderByWMSOrderHeaders($this->data['orderHeaders']);
+        $orders = Order::query()->whereIn('code',data_get($this->data['orderHeaders'],'*.orderno'))->get();
+        $this->data['orders'] = $orders;
+        $this->assertEquals(count($orders),count($this->data['orderHeaders']));
+        $this->assertOrderHeadersAndOrder($this->data['orderHeaders'],$orders);
+    }
+
+    /**
+     * @test 订单部分存在
+     */
+    public function orderPortionExisting()
+    {
+        $orderHeaders = $this->data['orderHeaders']->random(30);
+        $this->service->syncOrderByWMSOrderHeaders($orderHeaders);
+        $this->service->syncOrderByWMSOrderHeaders($this->data['orderHeaders']);
+        $orders = Order::query()->whereIn('code',data_get($this->data['orderHeaders'],'*.orderno'))->get();
+        $this->data['orders'] = $orders;
+        $this->assertEquals(count($orders),count($this->data['orderHeaders']));
+        $this->assertOrderHeadersAndOrder($this->data['orderHeaders'],$orders);
+    }
+
+    /**
+     * @test 订单部分在且有修改
+     */
+    public function orderPortingExistingAndModified()
+    {
+        $orderHeaders = $this->data['orderHeaders']->random(20);
+        foreach ($orderHeaders as $orderHeader) {
+            $owner = $this->data['owners']->random();
+            $shop = $this->data['shops']->where('owner_id',$owner->id)->random();
+            $warehouse = $this->data['warehouses']->random();
+            $logistic = $this->data['logistics']->random();
+            $batch = $this->data['batches']->random();
+            $orderHeader['warehouseid']=$warehouse->code;
+            $orderHeader['waveno']=$batch->code;
+            $orderHeader['customerid']=$owner->code;
+            $orderHeader['userdefine1']=$logistic->code;
+            $orderHeader['issuepartyname'] = $shop->name;
+        }
+        $this->service->syncOrderByWMSOrderHeaders($orderHeaders);
+        $this->service->syncOrderByWMSOrderHeaders($this->data['orderHeaders']);
+        $orders = Order::query()->whereIn('code',data_get($this->data['orderHeaders'],'*.orderno'))->get();
+        $this->data['orders'] = $orders;
+        $this->assertEquals(count($orders),count($this->data['orderHeaders']));
+        $this->assertOrderHeadersAndOrder($this->data['orderHeaders'],$orders);
+    }
+
+    public function assertOrderHeadersAndOrder($orderHeaders,$orders){
+        foreach ($orderHeaders as $orderHeader) {
+            $warehouse = Warehouse::query()->where('code',$orderHeader['warehouseid'])->first();
+            $batch = Batch::query()->where('code',$orderHeader['waveno'])->first();
+            $owner = Owner::query()->where('code',$orderHeader['customerid'])->first();
+            $logistic = Logistic::query()->where('code',$orderHeader['userdefine1'])->first();
+            $shop = Shop::query()->where('name',$orderHeader['issuepartyname'])->first();
+            $order = $orders->where('code',$orderHeader['orderno'])->first();
+            $this->assertNotEmpty($order);
+            $this->assertEquals($order->warehouse_id, $warehouse->id);
+            $this->assertEquals($order->batch_id,$batch->id);
+            $this->assertEquals($order->owner_id,$owner->id);
+            $this->assertEquals($order->logistic_id,$logistic->id);
+            $this->assertEquals($order->shop_id,$shop->id);
+            $this->assertEquals($order->wms_status,$orderHeader->oracleBASCode->codename_c ?? '');
+            $this->assertEquals($order->order_type,$orderHeader->orderType->codename_c ?? '');
+        }
+    }
+
+
+    protected function tearDown(): void
+    {
+        Warehouse::destroy(data_get($this->data['warehouses'],'*.id'));
+        Batch::destroy(data_get($this->data['batches'],'*.id'));
+        Owner::destroy(data_get($this->data['owners'],'*.id'));
+        Logistic::destroy(data_get($this->data['logistics'],'*.id'));
+        Shop::destroy(data_get($this->data['shops'],'*.id'));
+        Order::destroy(data_get($this->data['orders'],'*.id'));
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 9 - 2
tests/Services/OrderTrackingService/FillInOrderTrackingTest.php

@@ -11,10 +11,10 @@ use Tests\TestCase;
 
 class FillInOrderTrackingTest extends TestCase
 {
-    use RefreshDatabase;
 
     /** @var OrderTrackingService $service */
     public $service;
+    private $data = [];
     public function setUp(): void
     {
         parent::setUp(); // TODO: Change the autogenerated stub
@@ -35,8 +35,15 @@ class FillInOrderTrackingTest extends TestCase
             if ($item->created_at != '0000-00-00 00:00:00' &&
                 $item->planning_sent_at !== '0000-00-00 00:00:00' &&
                 $item->planning_sent_at < $data) {
-                $this->assertEquals($tracking->planning_sent_at, $item->signed_at);
+                $this->assertEquals(date_format($tracking->planning_sent_at,"Y-m-d H:i:s"), (string)$item->signed_at);
             }
         });
+        $this->data['orderTrackings'] = $orderTracking;
+    }
+
+    public function tearDown(): void
+    {
+        OrderTracking::query()->where('id',data_get($this->data['orderTrackings'],'*.id'))->delete();
+        parent::tearDown(); // TODO: Change the autogenerated stub
     }
 }

+ 0 - 2
tests/Services/OwnerService/GetOwnerByCodeTest.php

@@ -11,8 +11,6 @@ use Tests\TestCase;
 
 class GetOwnerByCodeTest extends TestCase
 {
-    use RefreshDatabase;
-
     /** @var OwnerService $service */
     private $service;
     private $data = [];

+ 0 - 2
tests/Services/OwnerService/GetOwnerByCodesTest.php

@@ -11,8 +11,6 @@ use Tests\TestCase;
 
 class GetOwnerByCodesTest extends TestCase
 {
-    use RefreshDatabase;
-
     /** @var OwnerService $service */
     private $service;
     private $data;

+ 0 - 4
tests/Services/ShopService/GetShopByCodeMapTest.php

@@ -13,8 +13,6 @@ use Tests\TestCase;
 
 class GetShopByCodeMapTest extends TestCase
 {
-    use RefreshDatabase;
-
     /** @var OwnerService $service */
     private $service;
     private $data;
@@ -40,8 +38,6 @@ class GetShopByCodeMapTest extends TestCase
         ];
     }
 
-
-
     /**
      * @test
      */

+ 0 - 2
tests/Services/WarehouseService/GetWareHouseByCodeTest.php

@@ -11,8 +11,6 @@ use Tests\TestCase;
 
 class GetWareHouseByCodeTest extends TestCase
 {
-    use RefreshDatabase;
-
     /** @var WarehouseService $service */
     private $service;
     private $data;

+ 0 - 1
tests/Services/WarehouseService/GetWareHouseByCodesTest.php

@@ -13,7 +13,6 @@ use Tests\TestCase;
 
 class GetWareHouseByCodesTest extends TestCase
 {
-    use RefreshDatabase;
     /** @var WarehouseService $service */
     private $service;
     private $data = [];