Преглед изворни кода

Merge branch 'haozi_test' into Order_sync_tack

# Conflicts:
#	app/Http/Controllers/TestController.php
#	app/Services/OrderService.php
#	app/Services/StoreService.php
ajun пре 5 година
родитељ
комит
095b6e058e
53 измењених фајлова са 2732 додато и 771 уклоњено
  1. 52 0
      app/Console/Commands/SyncWmsCommoditiesInformation.php
  2. 4 20
      app/Console/Commands/WasSyncWmsAsnInformation.php
  3. 14 5
      app/Http/Controllers/CommodityController.php
  4. 17 17
      app/Http/Controllers/RejectedBillItemController.php
  5. 7 2
      app/Http/Controllers/StoreController.php
  6. 5 1
      app/Http/Controllers/StoreItemsController.php
  7. 360 262
      app/Http/Controllers/TestController.php
  8. 0 2
      app/Http/Controllers/UserWorkgroupController.php
  9. 218 0
      app/Services/CommodityBarcodeService.php
  10. 555 124
      app/Services/CommodityService.php
  11. 20 0
      app/Services/OracleBasSkuService.php
  12. 2 0
      app/Services/OracleDocAsnHerderService.php
  13. 0 1
      app/Services/OrderService.php
  14. 98 72
      app/Services/RejectedBillService.php
  15. 21 9
      app/Services/StoreItemService.php
  16. 210 95
      app/Services/StoreService.php
  17. 1 37
      app/Services/WarehouseService.php
  18. 1 1
      app/Store.php
  19. 24 0
      config/sync.php
  20. 1 1
      database/migrations/2020_10_27_142647_create_owner_storage_price_models_table.php
  21. 32 0
      database/migrations/2020_12_10_113555_add_stores_is_fast_stored_column.php
  22. 1 1
      package-lock.json
  23. 2 2
      phpunit.xml
  24. 38 14
      resources/views/maintenance/commodity/create.blade.php
  25. 42 13
      resources/views/maintenance/commodity/edit.blade.php
  26. 1 1
      resources/views/personnel/checking-in/importAndExportQRCode.blade.php
  27. 1 1
      resources/views/personnel/checking-in/importAndExportSuccess.blade.php
  28. 1 1
      resources/views/personnel/checking-in/success.blade.php
  29. 55 0
      tests/Services/CommodityBarcodeService/CreateBarcodeByWmsTest.php
  30. 55 0
      tests/Services/CommodityBarcodeService/GetByWmsTest.php
  31. 39 0
      tests/Services/CommodityService/GetAsnSyncAtTest.php
  32. 45 0
      tests/Services/CommodityService/GetParamsByBasSkusTest.php
  33. 52 0
      tests/Services/CommodityService/SetAsnSyncAtTest.php
  34. 75 0
      tests/Services/CommodityService/SyncCommodityCreatedTest.php
  35. 102 0
      tests/Services/CommodityService/SyncCommodityUpdatedTest.php
  36. 75 0
      tests/Services/CommodityService/SyncCreateCommodityByBasSkusTest.php
  37. 102 0
      tests/Services/CommodityService/SyncUpdateCommodityBasSkusTest.php
  38. 2 2
      tests/Services/RejectedBillService/GetLogisticNumberTest.php
  39. 4 4
      tests/Services/RejectedBillService/GetUpdateCollectTest.php
  40. 40 6
      tests/Services/RejectedBillService/SyncLoadedStatusByAsnHeaderTest.php
  41. 1 1
      tests/Services/StoreItemService/GetAsnDetailsByAsnHerderTest.php
  42. 1 1
      tests/Services/StoreItemService/GetByWmsTest.php
  43. 1 1
      tests/Services/StoreItemService/GetParamsByAsnDetailsTest.php
  44. 4 1
      tests/Services/StoreService/CreateStoreTest.php
  45. 41 0
      tests/Services/StoreService/GetAsnSyncAtTest.php
  46. 1 1
      tests/Services/StoreService/GetParamsByAsnHeaderTest.php
  47. 1 2
      tests/Services/StoreService/InsertStoreTest.php
  48. 52 0
      tests/Services/StoreService/SetAsnSyncAtTest.php
  49. 91 0
      tests/Services/StoreService/SetLastRecordsByRedisTest.php
  50. 81 0
      tests/Services/StoreService/SyncStoreCreateByWmsTest.php
  51. 82 0
      tests/Services/StoreService/SyncStoreUpdateByWmsTest.php
  52. 0 69
      tests/Services/StoreService/SyncWmsAsnDataTest.php
  53. 2 1
      tests/Services/StoreService/UpdateStoreTest.php

+ 52 - 0
app/Console/Commands/SyncWmsCommoditiesInformation.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace App\Console\Commands;
+
+
+use App\Services\CommodityService;
+use Illuminate\Console\Command;
+
+class SyncWmsCommoditiesInformation extends Command
+{
+
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'SyncWmsCommoditiesInformation';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '同步WMS的商品信息';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        $this->SyncWmsCommoditiesInformation();
+    }
+
+    public function SyncWmsCommoditiesInformation(){
+        /** @var CommodityService $commodityService */
+        $commodityService  = app(CommodityService::class);
+        $commodityService->syncCommodityCreated();
+        $commodityService->syncCommodityUpdated();
+    }
+}

+ 4 - 20
app/Console/Commands/WasSyncWmsAsnInformation.php

@@ -2,12 +2,9 @@
 
 namespace App\Console\Commands;
 
-use App\Services\LogService;
-use App\Services\OrderTrackingService;
+
 use App\Services\StoreService;
 use Illuminate\Console\Command;
-use Illuminate\Support\Carbon;
-use Illuminate\Support\Facades\Auth;
 
 class WasSyncWmsAsnInformation extends Command
 {
@@ -47,22 +44,9 @@ class WasSyncWmsAsnInformation extends Command
     }
 
     public function WasSyncWmsAsn(){
-
         /** @var StoreService $storeService */
-        $storeService  = app('storeService');
-
-        $dataInterval = intval(data_get(config('sync'), 'asn_sync.interval')) * 60 + 5;
-
-        $startDate = Carbon::now()->subSeconds($dataInterval);
-
-        $syncStartDate = data_get(config('sync'), 'asn_sync.start_at');
-
-        if($syncStartDate ?? false){
-            $syncStartDate = Carbon::parse($syncStartDate);
-            if ($startDate->lt($syncStartDate)) {
-                $startDate = $syncStartDate;
-            }
-        }
-        //$storeService->syncWmsAsnData($startDate);
+        $storeService  = app(StoreService::class);
+        $storeService->storeCreateByWms();
+        $storeService->storeUpdateByWms();
     }
 }

+ 14 - 5
app/Http/Controllers/CommodityController.php

@@ -8,6 +8,7 @@ use App\Services\CommodityBarcodeService;
 use App\Services\CommodityService;
 use App\Services\LogService;
 use App\Services\OracleBasSkuService;
+use App\Services\OwnerService;
 use Exception;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
@@ -39,7 +40,9 @@ class CommodityController extends Controller
     public function create()
     {
         if(!Gate::allows('商品信息-录入')){ return redirect(url('denied'));  }
-        return view('maintenance.commodity.create');
+        $ownerService=app(OwnerService::class);
+        $owners = $ownerService->getSelection();
+        return view('maintenance.commodity.create',compact('owners'));
     }
 
     /**
@@ -56,21 +59,25 @@ class CommodityController extends Controller
         $commodity->save();
         $commodity->newBarcode($request->input('barcode'));
 
-        app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        app('LogService')->log(__METHOD__,'录入商品'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return redirect('maintenance/commodity/create')->with('successTip',"成功录入商品信息:“{$request->input('name')}”");
     }
     protected function validatorCreate(array $data)
     {
         return Validator::make($data, [
+            'sku'=>['required', 'string', 'max:50'],
             'name' => ['required', 'string', 'max:50'],
-//            'barcode' => ['required', 'string', 'max:50', 'unique:commodities'],
+            'barcode' => ['required', 'string', 'max:50'],
+            'owner_id' => ['required', 'string', 'max:50'],
         ]);
     }
     protected function validatorUpdate(array $data)
     {
         return Validator::make($data, [
+            'sku'=>['required', 'string', 'max:50'],
             'name' => ['required', 'string', 'max:50'],
             'barcode' => ['required', 'string', 'max:50'],
+            'owner_id' => ['required', 'string', 'max:50'],
         ]);
     }
     /**
@@ -93,7 +100,9 @@ class CommodityController extends Controller
     public function edit(Commodity $commodity)
     {
         if(!Gate::allows('商品信息-编辑')){ return redirect(url('denied'));  }
-        return view('maintenance.commodity.edit',['commodity'=>$commodity]);
+        $ownerService=app(OwnerService::class);
+        $owners = $ownerService->getSelection();
+        return view('maintenance.commodity.edit',['commodity'=>$commodity,'owners'=>$owners]);
     }
 
     /**
@@ -109,7 +118,7 @@ class CommodityController extends Controller
         $this->validatorUpdate($request->all())->validate();
         $commodity->fill($request->all());
         $commodity->update();
-        app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        app('LogService')->log(__METHOD__,'修改商品信息'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return redirect('maintenance/commodity/')->with('successTip',"成功修改商品信息:“{$commodity['name']}”!");
     }
 

+ 17 - 17
app/Http/Controllers/RejectedBillItemController.php

@@ -76,22 +76,22 @@ class RejectedBillItemController extends Controller
 
         if (!$rejectedBillItem->rejectedBill || !$rejectedBillItem->rejectedBill->owner)return ['success'=>'false','failure_info'=>'退货单或货主不存在'];
 
-        /** @var CommodityService $commodityService */
-        $commodityService = app('CommodityService');
-        $commodity = $commodityService->ownerBarcodeSeekCommodityFirst(['name'=>$rejectedBillItem->rejectedBill->owner->name],$rejectedBillItem->barcode_goods);
-        if (!$commodity){
-            $commodity = $commodityService->ownerAndBarcodeFirstOrCreate($rejectedBillItem->rejectedBill->owner,$rejectedBillItem->barcode_goods);
-            if (!$commodity){
-                $commodity = $commodityService->create([
-                    "name" => $rejectedBillItem->name_goods,
-                    "owner_id" => $rejectedBillItem->rejectedBill->owner->id,
-                ]);
-                app('CommodityBarcodeService')->first([
-                    'commodity_id' => $commodity->id,
-                    'code' => $rejectedBillItem->barcode_goods,
-                ]);
-            }
-        }
+//        /** @var CommodityService $commodityService */
+//        $commodityService = app('CommodityService');
+//        $commodity = $commodityService->ownerBarcodeSeekCommodityFirst(['name'=>$rejectedBillItem->rejectedBill->owner->name],$rejectedBillItem->barcode_goods);
+//        if (!$commodity){
+//            $commodity = $commodityService->ownerAndBarcodeFirstOrCreate($rejectedBillItem->rejectedBill->owner,$rejectedBillItem->barcode_goods);
+//            if (!$commodity){
+//                $commodity = $commodityService->create([
+//                    "name" => $rejectedBillItem->name_goods,
+//                    "owner_id" => $rejectedBillItem->rejectedBill->owner->id,
+//                ]);
+//                app('CommodityBarcodeService')->first([
+//                    'commodity_id' => $commodity->id,
+//                    'code' => $rejectedBillItem->barcode_goods,
+//                ]);
+//            }
+//        }
 
 
         $rejectedBill = RejectedBill::query()->where('id',$request->input('id_rejected_bill'))->first();
@@ -117,7 +117,7 @@ class RejectedBillItemController extends Controller
         }else{
             $rejectedBillItem->fill($request->all());
             $rejectedBillItem->update();
-            $rejectedBillItem->injectCommodityName();
+            //$rejectedBillItem->injectCommodityName();  Haozi 2020-12-09
             $rejectedBill = RejectedBill::query()->where('id',$rejectedBillItem->id_rejected_bill)->with('orderIssue')->first();
 //            $rejectedBill->同步问题件退件状态();
             app(RejectedBillService::class)->syncOrderIssue($rejectedBill);

+ 7 - 2
app/Http/Controllers/StoreController.php

@@ -47,7 +47,9 @@ class StoreController extends Controller
     public function index()
     {
         if(!Gate::allows('入库管理-快速入库-查询')){ return redirect(url('/'));  }
-        $stores=Store::query()->with(['warehouse','owner'])->orderBy('id','DESC')->paginate(50);
+        $stores=Store::query()->with(['warehouse','owner'])
+            ->where('is_fast_stored','快速入库')
+            ->orderBy('id','DESC')->paginate(50);
         return view('store.fast.index',['stores'=>$stores]);
     }
 
@@ -107,6 +109,7 @@ class StoreController extends Controller
                 'stored_method'=>'快速入库',
                 'status'=>'未入库',
                 'remark'=>$WMSReflectReceive->NOTES,
+                'is_fast_stored'=>'快速入库',
             ]);
             $store->save();
 
@@ -178,7 +181,9 @@ class StoreController extends Controller
 
     public function quickStorage($asnno,$quality,$depository_code,$isVerification = true)
     {
-        $task = Store::query()->where("asn_code",$asnno)->where("stored_method","快速入库")
+        $task = Store::query()->where("asn_code",$asnno)
+            ->where("stored_method","快速入库")
+            ->orWhere('is_fast_stored','快速入库')
             ->where("status","已入库")->first();
         if ($task)return ['success'=>false, 'data'=>"已被快速入库"];
         $db = DB::connection('oracle');

+ 5 - 1
app/Http/Controllers/StoreItemsController.php

@@ -17,7 +17,11 @@ class StoreItemsController extends Controller
      */
     public function index()
     {
-        $storeItems=StoreItems::query()->with('store')->orderBy('id','DESC')->paginate(50);
+        $storeItems=StoreItems::query()->with('store')
+            ->whereHas('store',function($query){
+                $query->where('is_fast_stored','快速入库');
+            })
+            ->orderBy('id','DESC')->paginate(50);
         return view('store.fast.storeItem',['storeItems'=>$storeItems]);
     }
 }

+ 360 - 262
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;
@@ -35,6 +34,7 @@ use App\ProcessStatistic;
 use App\RejectedBill;
 use App\RejectedBillItem;
 use App\Services\CacheService;
+use App\Services\CommodityService;
 use App\Services\common\BatchUpdateService;
 use App\Services\common\DataHandlerService;
 use App\Services\DocWaveHeaderService;
@@ -52,6 +52,7 @@ use App\Services\OwnerService;
 use App\Services\ShopService;
 use App\Services\StoreService;
 use App\Services\WarehouseService;
+use App\Store;
 use App\StoreCheckingReceiveItem;
 use App\User;
 use App\Warehouse;
@@ -82,49 +83,39 @@ class TestController extends Controller
     {
         return call_user_func([$this, $method], $request);
     }
-    public function updateInventory(){
-        $inventoryAccounts=InventoryAccount::query()->get();
+
+    public function updateInventory()
+    {
+        $inventoryAccounts = InventoryAccount::query()->get();
         $updateParams = [[
-            'id','processed','ignored','updated_at'
+            'id', 'processed', 'ignored', 'updated_at'
         ]];
-        $updated_at=Carbon::now()->toDateTimeString();
-        foreach ($inventoryAccounts as $inventoryAccount){
-            if ($inventoryAccount->getIgnoredAmount()>0){
+        $updated_at = Carbon::now()->toDateTimeString();
+        foreach ($inventoryAccounts as $inventoryAccount) {
+            if ($inventoryAccount->getIgnoredAmount() > 0) {
                 $updateParams[] = [
-                    'id'=>$inventoryAccount->id,
-                    'processed'=>$inventoryAccount->getProcessedAmount(),
+                    'id' => $inventoryAccount->id,
+                    'processed' => $inventoryAccount->getProcessedAmount(),
                     'ignored' => $inventoryAccount->getIgnoredAmount(),
-                    'updated_at'=>$updated_at,
+                    'updated_at' => $updated_at,
                 ];
             }
         }
-        if(count($updateParams) > 1){
-            app(BatchUpdateService::class)->batchUpdate('inventory_accounts',$updateParams);
+        if (count($updateParams) > 1) {
+            app(BatchUpdateService::class)->batchUpdate('inventory_accounts', $updateParams);
         }
     }
-    public function zzd()
-    {
-        $a = DB::connection("oracle")->select(DB::raw("select * from DOC_WAVE_DETAILS where WAVENO = 'W201210000112'"));
-        $str="";
-        $a = array_column($a,"orderno");
-        foreach ($a as $t){
-            $str.="'".$t."',";
-        }
-        dd($str);
-        $str = rtrim($str,",");
-        $c = DB::connection("oracle")->select(DB::raw("select SUM(qtyordered) s from DOC_ORDER_DETAILS where ORDERNO IN (".$str.")"));
-        dd($c);
-    }
 
-    public function mergeCarrier(){
+    public function mergeCarrier()
+    {
         $carriers = Carrier::query()->get();
         $logistics = [];
         $map = [];
-        foreach ($carriers as $carrier){
+        foreach ($carriers as $carrier) {
             $map[$carrier->name] = $carrier->id;
-            $lo = Logistic::query()->where("name",$carrier->name)->first();
-            if ($lo){
-                if ($lo->type == '快递'){
+            $lo = Logistic::query()->where("name", $carrier->name)->first();
+            if ($lo) {
+                if ($lo->type == '快递') {
 //                    $lo->update(["type"=>"全部"]);$lo->save();
                 }
                 continue;
@@ -132,64 +123,68 @@ class TestController extends Controller
             $logistics[] = [
                 "name" => $carrier->name,
                 'mobile' => $carrier->mobile,
-                'delivery_fee'=> $carrier->delivery_fee,
-                'remark'=> $carrier->remark,
+                'delivery_fee' => $carrier->delivery_fee,
+                'remark' => $carrier->remark,
                 "type" => "物流"
             ];
         }
         Logistic::query()->insert($logistics);
-        $ls = Logistic::query()->where("type","物流")->get();
+        $ls = Logistic::query()->where("type", "物流")->get();
         $result = [];
-        foreach ($ls as $l)
-        {
-            if (isset($map[$l->name]))$result[$map[$l->name]] = $l->id;
+        foreach ($ls as $l) {
+            if (isset($map[$l->name])) $result[$map[$l->name]] = $l->id;
         }
-        LogService::log(__METHOD__,"同步承运商",json_encode($result));
-        foreach ($result as $tag => $val){
-            Waybill::query()->where("logistic_id",$tag)->update([
+        LogService::log(__METHOD__, "同步承运商", json_encode($result));
+        foreach ($result as $tag => $val) {
+            Waybill::query()->where("logistic_id", $tag)->update([
                 "logistic_id" => $val
             ]);
-            WaybillPriceModel::query()->where("logistic_id",$tag)->update([
+            WaybillPriceModel::query()->where("logistic_id", $tag)->update([
                 "logistic_id" => $val
             ]);
-            DB::table("logistic_user")->where("logistic_id",$tag)->update([
+            DB::table("logistic_user")->where("logistic_id", $tag)->update([
                 "logistic_id" => $val
             ]);
         }
     }
-    public function updateLaborRemark(){
-        $laborReports=LaborReport::query()->with(['remarks'=>function($query){
+
+    public function test4()
+    {
+        $arr = [['id' => 3], ['id' => 33],];
+        dd(data_get($arr, '*.id'));
+    }
+
+    public function t($a)
+    {
+        $r = new \ReflectionClass('App\Http\Controllers\UnitsController');
+        dd($r->getMethods(), $r->getConstants());
+    }
+
+    public function updateLaborRemark()
+    {
+        $laborReports = LaborReport::query()->with(['remarks' => function ($query) {
             return $query->whereNotNull('mark');
         }])->get();
         $updateParams = [[
-            'id','remark','updated_at'
+            'id', 'remark', 'updated_at'
         ]];
-        $updated_at=Carbon::now()->toDateTimeString();
-        foreach ($laborReports as $laborReport){
-            if ($laborReport->remarks){
+        $updated_at = Carbon::now()->toDateTimeString();
+        foreach ($laborReports as $laborReport) {
+            if ($laborReport->remarks) {
                 $updateParams[] = [
-                    'id'=>$laborReport->id,
-                    'remark'=>$laborReport->remarks->mark,
-                    'updated_at'=>$updated_at,
+                    'id' => $laborReport->id,
+                    'remark' => $laborReport->remarks->mark,
+                    'updated_at' => $updated_at,
                 ];
             }
         }
-        if(count($updateParams) > 1){
-            app(BatchUpdateService::class)->batchUpdate('labor_reports',$updateParams);
+        if (count($updateParams) > 1) {
+            app(BatchUpdateService::class)->batchUpdate('labor_reports', $updateParams);
         }
     }
-    public function test2(){
-        $b = Logistic::query()->first();
-        $a = OrderPackage::query()->with("order")->first();
-        $a->bulk = 521;
-        $a->save();
-        if (!$a->order) $a->order = new Order();
-        dd($a);
-        if (!$a->order->logistic)$a->order->logistic = $b;
-        dd($a->order->logistic);
-        dd($a);
-        $a->save();
-        dd($a);
+
+    public function test2()
+    {
     }
 
     function packageFromLog(Request $request)
@@ -218,6 +213,15 @@ class TestController extends Controller
         });
         dd($uploaded . '/' . $count);
     }
+
+    function wmsSql()
+    {
+        $owner = Owner::first();
+//        $owner['phone_number'] ?? $owner['phone_number'] = '31115';
+//        $owner->update();
+        dd($owner);
+    }
+
     function issues()
     {
         /** @var OrderPackageService $orderPackageService */
@@ -230,16 +234,30 @@ class TestController extends Controller
             $orderPackageService->createdByOrder($item);
         }
     }
+
+    function t2(Request $request)
+    { //x        $packagesBatch=Package::where('batch_number',$batch_number)->first();
+
+
+        $inventoryCompareService = new InventoryCompareService();
+        echo ($inventoryCompareService)->getCreatingMissionCode('安桥主品');
+        echo ($inventoryCompareService)->getCreatingMissionCode('安桥主品');
+        echo ($inventoryCompareService)->getCreatingMissionCode('安桥主品');
+        echo ($inventoryCompareService)->getCreatingMissionCode('安桥主品');
+    }
+
     function tlog(Request $request)
     {
-        app('LogService')->log(__METHOD__,'cczdelme'.__FUNCTION__,json_encode($request->all()),null);
+        app('LogService')->log(__METHOD__, 'cczdelme' . __FUNCTION__, json_encode($request->all()), null);
     }
+
     function setCache(Request $request)
     {
         $today = now();
         Cache::put('storedTest', $today);
         return "cacheing:'$today'<script>localStorage.setItem('storedTest','{$today}')</script>";
     }
+
     function getCache(Request $request)
     {
         $cache = Cache::get('storedTest');
@@ -270,8 +288,13 @@ 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();
@@ -567,56 +590,57 @@ class TestController extends Controller
         }
     }
 
-    public function test5(){
-        ini_set('max_execution_time',2500);
-        ini_set('memory_limit','1526M');
+    public function test5()
+    {
+        ini_set('max_execution_time', 2500);
+        ini_set('memory_limit', '1526M');
         //清理冗余条码
 //        $this->cleanBarcode();
 
-        while(true){
+        while (true) {
             $toDay = Carbon::now();
             $skus = DB::select(DB::raw('select sku from commodities group by sku,owner_id having count(*)>1 limit 500 '));
             $skus = array_column($skus,'sku');
 
-            $commodities = Commodity::query()->with('barcodes')->whereNotNull('owner_id')->whereIn('sku',$skus)->get();
+            $commodities = Commodity::query()->with('barcodes')->whereNotNull('owner_id')->whereIn('sku', $skus)->get();
 
 
-            if (count($commodities) < 1)return "SUCCESS";
+            if (count($commodities) < 1) return "SUCCESS";
             $commodityMap = [];
             $commodityDel = [];
             $commodityTag = [];
             $commodityBar = [];
             $createBarcodes = [];
             $logs = [];
-            foreach ($commodities as $commodity){
-                if ($commodityMap[$commodity->sku.'_'.$commodity->owner_id] ?? false){
-                    $codes = $commodity->barcodes ? array_column($commodity->barcodes->toArray(),'code') : [];
+            foreach ($commodities as $commodity) {
+                if ($commodityMap[$commodity->sku . '_' . $commodity->owner_id] ?? false) {
+                    $codes = $commodity->barcodes ? array_column($commodity->barcodes->toArray(), 'code') : [];
                     $logs[] = [
                         'id' => $commodity->id,
                         'sku' => $commodity->sku,
-                        'owner_id'=>$commodity->owner_id,
-                        'code'=>$codes,
+                        'owner_id' => $commodity->owner_id,
+                        'code' => $codes,
                     ];
                     $commodityDel[] = $commodity->id;
-                    $commodityTag[$commodity->id] = $commodityMap[$commodity->sku.'_'.$commodity->owner_id];
+                    $commodityTag[$commodity->id] = $commodityMap[$commodity->sku . '_' . $commodity->owner_id];
 
-                    $arr = array_diff($codes,$commodityBar[$commodity->sku.'_'.$commodity->owner_id]);
-                    foreach ($arr as $code){
-                        if (!$code)continue;
+                    $arr = array_diff($codes, $commodityBar[$commodity->sku . '_' . $commodity->owner_id]);
+                    foreach ($arr as $code) {
+                        if (!$code) continue;
                         $createBarcodes[] = [
                             'code' => $code,
-                            'commodity_id' => $commodityMap[$commodity->sku.'_'.$commodity->owner_id],
+                            'commodity_id' => $commodityMap[$commodity->sku . '_' . $commodity->owner_id],
                             'created_at' => $toDay,
                         ];
                     }
-                }else{
-                    $commodityMap[$commodity->sku.'_'.$commodity->owner_id] = $commodity->id;
-                    $commodityBar[$commodity->sku.'_'.$commodity->owner_id] = $commodity->barcodes ? array_column($commodity->barcodes->toArray(),'code') : [];
+                } else {
+                    $commodityMap[$commodity->sku . '_' . $commodity->owner_id] = $commodity->id;
+                    $commodityBar[$commodity->sku . '_' . $commodity->owner_id] = $commodity->barcodes ? array_column($commodity->barcodes->toArray(), 'code') : [];
                 }
             }
-            dd($commodityMap,$commodityDel,$commodityTag);
-            app('LogService')->log(__METHOD__,'清理商品',json_encode($logs,JSON_UNESCAPED_UNICODE));
-            app('LogService')->log(__METHOD__,'重新分配商品',json_encode($commodityTag,JSON_UNESCAPED_UNICODE));
+            dd($commodityMap, $commodityDel, $commodityTag);
+            app('LogService')->log(__METHOD__, '清理商品', json_encode($logs, JSON_UNESCAPED_UNICODE));
+            app('LogService')->log(__METHOD__, '重新分配商品', json_encode($commodityTag, JSON_UNESCAPED_UNICODE));
 
             app('InventoryAccountMissionService')->batchUpdateItself('commodity_id', $commodityTag);//批量更新库存盘点任务
             app('InventoryCompareService')->batchUpdateItself('commodity_id', $commodityTag);//批量更新库存对比
@@ -625,13 +649,14 @@ class TestController extends Controller
             app('StoreCheckingReceiveItemService')->batchUpdateItself('commodity_id', $commodityTag);//批量更新入库盘收一体
             app('OrderPackageCommoditiesService')->batchUpdateItself('commodity_id', $commodityTag);//批量更新订单商品
 
-            app('LogService')->log(__METHOD__,'删除商品与对应条码',json_encode($commodityDel,JSON_UNESCAPED_UNICODE));
-            CommodityBarcode::query()->whereIn('commodity_id',$commodityDel)->delete();
+            app('LogService')->log(__METHOD__, '删除商品与对应条码', json_encode($commodityDel, JSON_UNESCAPED_UNICODE));
+            CommodityBarcode::query()->whereIn('commodity_id', $commodityDel)->delete();
             Commodity::destroy($commodityDel);
         }
     }
 
-    private function cleanBarcode(){
+    private function cleanBarcode()
+    {
 
         $logCommodityBarcodes = CommodityBarcode::query()->where('code', "")->get();
         if (count($logCommodityBarcodes) > 0) app('LogService')->log(__METHOD__, "纠正商品-删除空条码", json_encode($logCommodityBarcodes, JSON_UNESCAPED_UNICODE));
@@ -652,30 +677,31 @@ where (c.code,c.commodity_id) in (select code,commodity_id from commodity_barcod
         CommodityBarcode::destroy($barcodeDelete);
     }
 
-    private function multiCodes(){
+    private function multiCodes()
+    {
 
-        $barcode='BG10B1014C002100';
-        $commodity=Commodity::whereHas('barcodes', function (Builder $query)use($barcode){
-            $query->where('code',$barcode);
-        })->where('owner_id',4)->first();
+        $barcode = 'BG10B1014C002100';
+        $commodity = Commodity::whereHas('barcodes', function (Builder $query) use ($barcode) {
+            $query->where('code', $barcode);
+        })->where('owner_id', 4)->first();
         $codes = $commodity->barcodes->map(function ($barcode) {
-            return $barcode->code??'';
+            return $barcode->code ?? '';
         });
-        foreach($codes as $code){
-            $commodity=Commodity::whereHas('barcodes', function (Builder $query)use($barcode){
-                $query->where('code',$barcode);
-            })->where('owner_id',4)->get();
+        foreach ($codes as $code) {
+            $commodity = Commodity::whereHas('barcodes', function (Builder $query) use ($barcode) {
+                $query->where('code', $barcode);
+            })->where('owner_id', 4)->get();
             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()
@@ -742,7 +768,7 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
             }
             $updateCommodities[$del->commodity_id] = $target->commodity_id;
         }
-        if (count($updateCommodities) > 0){
+        if (count($updateCommodities) > 0) {
             app('InventoryAccountMissionService')->batchUpdateItself('commodity_id', $updateCommodities);//批量更新库存盘点任务
             app('InventoryCompareService')->batchUpdateItself('commodity_id', $updateCommodities);//批量更新库存对比
             app('InventoryDailyLogService')->batchUpdateItself('commodity_id', $updateCommodities);//批量更新库存每日记录
@@ -764,6 +790,7 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
 
         Commodity::destroy($deleteCommodities);
     }
+
     /*1*/
     function socket(Request $request)
     {/**/
@@ -821,27 +848,50 @@ 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 */
         $cacheService = app('CacheService');
-        $authorities=$cacheService->getOrExecute('userxx',function (){
+        $authorities = $cacheService->getOrExecute('userxx', function () {
             return Authority::with('roles')->get();
         });
         dd($authorities);
     }
+
     public function output2()
     {
         dump(Cache::get('aa'));
         Cache::put('aa', '2223', 5);
     }
+
     public function usage()
     {
         dd(Request::all());
     }
+
     public function relating()
     {
-        dd(OrderIssue::query()->where('id',182)->paginate()->total());
+        dd(OrderIssue::query()->where('id', 182)->paginate()->total());
     }
 
     public function updateOrdersWarehouse()
@@ -857,10 +907,11 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         $warehouse = Warehouse::query()->get();
         $warehouse_map = $dataHandlerService->dataHeader(['code'], $warehouse);
         for ($i = 0; $i < $count; $i += $page) {
-            $min = $i;$max = $i + $page;
+            $min = $i;
+            $max = $i + $page;
             $orders = Order::query()->where('id', '>=', $min)->where('id', '<=', $max)->get();
             $orderNos = array_diff(array_unique(data_get($orders, '*.code')), ['', ' ', '*', null]);
-            if (count($orderNos)==0) continue;
+            if (count($orderNos) == 0) continue;
             /** @var Collection $orderHeaders */
             $orderHeaders = OracleDOCOrderHeader::query()->whereIn('orderno', $orderNos)->get();
             if ($orderHeaders->count() == 0) continue;
@@ -886,54 +937,57 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
     public function syncSendOrder()
     {
         $order_issues = OrderIssue::query()->whereNotNull('second_client_no')->get();
-        $client_nos = data_get($order_issues,'*.second_client_no');
-        $orderHeaders = OracleDOCOrderHeader::query()->selectRaw(implode(',',OracleDOCOrderHeaderService::$columns))
-            ->whereIn('SOReference1',$client_nos)
-            ->with(['oracleBASCustomer'=>function($query){
+        $client_nos = data_get($order_issues, '*.second_client_no');
+        $orderHeaders = OracleDOCOrderHeader::query()->selectRaw(implode(',', OracleDOCOrderHeaderService::$columns))
+            ->whereIn('SOReference1', $client_nos)
+            ->with(['oracleBASCustomer' => function ($query) {
                 $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
-            },'oracleDOCOrderDetails'=>function($query){
+            }, 'oracleDOCOrderDetails' => function ($query) {
                 $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered');
-            }, 'actAllocationDetails'=>function($query){
+            }, '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');
-            },'oracleBASCode'=>function($query){
+            }, 'oracleBASCode' => function ($query) {
                 $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
             }])
             ->get();
         $service = app('OrderIssueService');
         $service->updateByWmsOrders($orderHeaders);
     }
+
     public function testCollectMethod()
     {
-        $startDate=Carbon::parse('2020-11-11 23:59:59')->subSeconds(65)->format('Y-m-d H:i:s');
-        $asnHerders=app(OracleDocAsnHerderService::class)->getWmsAsnOnStartDateCreate($startDate);
-        if ($asnHerders->isEmpty())return null;
+        $startDate = Carbon::parse('2020-11-11 23:59:59')->subSeconds(65)->format('Y-m-d H:i:s');
+        $asnHerders = app(OracleDocAsnHerderService::class)->getWmsAsnOnStartDateCreate($startDate);
+        if ($asnHerders->isEmpty()) return null;
         /**
          * @var OwnerService $ownerService
          * @var WarehouseService $wareHouseService
          */
         $ownerService = app(OwnerService::class);
-        $owners=$ownerService->getByWmsOrders($asnHerders);
-        $wareHouseService=app(WarehouseService::class);
-        $warehouses=$wareHouseService->getByWms($asnHerders);
+        $owners = $ownerService->getByWmsOrders($asnHerders);
+        $wareHouseService = app(WarehouseService::class);
+        $warehouses = $wareHouseService->getByWms($asnHerders);
         foreach ($owners as $owner) {
             $owners_code_map[$owner->code] = $owner;
         }
         foreach ($warehouses as $warehouse) {
             $warehouses_code_map[$warehouse->code] = $warehouse;
         }
-        var_dump('createStoreParam_start',Carbon::now());
-        $params=app(StoreService::class)->getParamsByAsnHeader($asnHerders,$owners_code_map,$warehouses_code_map);
-        var_dump('createStoreParam_end',Carbon::now());
+        var_dump('createStoreParam_start', Carbon::now());
+        $params = app(StoreService::class)->getParamsByAsnHeader($asnHerders, $owners_code_map, $warehouses_code_map);
+        var_dump('createStoreParam_end', Carbon::now());
 
-        var_dump('insertStore_start',Carbon::now());
-        if(count($params)> 0){
+        var_dump('insertStore_start', Carbon::now());
+        if (count($params) > 0) {
             //app(StoreService::class)->insertStore($params);
             DB::table('stores')->insert($params);
         }
-        var_dump('insertStore_end',Carbon::now());
+        var_dump('insertStore_end', Carbon::now());
     }
-    public function testMethodSecond(){
-        $param=[
+
+    public function testMethodSecond()
+    {
+        $param = [
             "asn_code" => "ASN2011120516",
             "warehouse_id" => 2,
             "owner_id" => 35,
@@ -942,11 +996,19 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
             "remark" => null,
             "created_at" => "2020-11-12 14:12:42",
             "updated_at" => "2020-11-12 14:12:42",
-            ];
-        var_dump('start',Carbon::now());
+        ];
+        var_dump('start', Carbon::now());
         //Store::query()->insert($param);
         app(StoreService::class)->insertStore($param);
-        var_dump('end',Carbon::now());
+        var_dump('end', Carbon::now());
+    }
+
+    public function testSyncAsn()
+    {
+        dump('start'.(string)Carbon::now());
+        app(StoreService::class)->storeCreateByWms();
+        app(StoreService::class)->storeUpdateByWms();
+        dump('end'.(string)Carbon::now());
     }
 
     public function changeOrder()
@@ -954,19 +1016,19 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         /**
          * @var OrderService $orderService
          */
-        $carbon =Carbon::now()->subMinutes(30);
-        var_dump('$orderHeader',new Carbon());
-        $orderHeader_start = OracleDOCOrderHeader::query()->selectRaw(implode(',',OracleDOCOrderHeaderService::$columns))
-            ->with(['oracleBASCustomer'=>function($query){
+        $carbon = Carbon::now()->subMinutes(30);
+        var_dump('$orderHeader', new Carbon());
+        $orderHeader_start = OracleDOCOrderHeader::query()->selectRaw(implode(',', OracleDOCOrderHeaderService::$columns))
+            ->with(['oracleBASCustomer' => function ($query) {
                 $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
-            },'oracleDOCOrderDetails'=>function($query){
+            }, 'oracleDOCOrderDetails' => function ($query) {
                 $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered');
-            }, 'actAllocationDetails'=>function($query){
+            }, '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');
-            },'oracleBASCode'=>function($query){
+            }, 'oracleBASCode' => function ($query) {
                 $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
             }])
-            ->where('DOC_Order_Header.addTime','>=',$carbon)
+            ->where('DOC_Order_Header.addTime', '>=', $carbon)
 //            ->where('DOC_Order_Header.editTime','>=',$carbon)
             ->get();
         var_dump((string)Carbon::now());
@@ -978,88 +1040,109 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
 //      orderService  getCreateOrderModelsByWMSOrderHeaders
     }
 
-    public function testOrderPackages(){
+    public function testOrderPackages()
+    {
         $batch_number = 'W201114000104';
         $weight = 0.3;
-        OrderPackage::createPackagesFromBatchCode($batch_number,$weight);
+        OrderPackage::createPackagesFromBatchCode($batch_number, $weight);
     }
 
-    public function view(){
+    public function view()
+    {
         return view('test');
     }
 
-    public function cleanOrderRepeat(){
+    public function tdel()
+    {
+        echo '223232323';
+        return 'asdfsadfsdf';
+    }
+
+    public function cleanOrderRepeat()
+    {
 
-        ini_set('max_execution_time',6500);
-        ini_set('memory_limit','1526M');
-        for($i=0;true;$i++){
-            $orders_repeating=Order::query()
+        ini_set('max_execution_time', 6500);
+        ini_set('memory_limit', '1526M');
+        for ($i = 0; true; $i++) {
+            $orders_repeating = Order::query()
                 ->selectRaw('count(*) as count, code, id')
                 ->whereNotNull('code')
                 ->groupBy('code')
                 ->having('count', '>', 1)
                 ->limit(100)
                 ->get();
-            if($orders_repeating->count()==0)break;
-            $orders_repeating->each(function ($order){
-                $code_repeating=$order['code'];
-                $orders_toCombine=Order::query()
-                    ->where('code',$code_repeating)
+            if ($orders_repeating->count() == 0) break;
+            $orders_repeating->each(function ($order) {
+                $code_repeating = $order['code'];
+                $orders_toCombine = Order::query()
+                    ->where('code', $code_repeating)
                     ->orderByDesc('updated_at')
                     ->get();
-                $orderId_unique=(function()use($orders_toCombine){
-                    $order_toLive=$orders_toCombine->first();
-                    foreach($orders_toCombine as $key=>$order_toEliminate){
-                        if($key==0)continue;
-                        if(!$order_toLive['batch_id'])$order_toLive['batch_id']=$order_toEliminate['batch_id'];
-                        if(!$order_toLive['owner_id'])$order_toLive['owner_id']=$order_toEliminate['owner_id'];
-                        if(!$order_toLive['status'])$order_toLive['status']=$order_toEliminate['status'];
-                        if(!$order_toLive['created_at'])$order_toLive['created_at']=$order_toEliminate['created_at'];
-                        if(!$order_toLive['code'])$order_toLive['code']=$order_toEliminate['code'];
-                        if(!$order_toLive['shop_id'])$order_toLive['shop_id']=$order_toEliminate['shop_id'];
-                        if(!$order_toLive['owner_id'])$order_toLive['owner_id']=$order_toEliminate['owner_id'];
-                        if(!$order_toLive['client_code'])$order_toLive['client_code']=$order_toEliminate['client_code'];
-                        if(!$order_toLive['logistic_id'])$order_toLive['logistic_id']=$order_toEliminate['logistic_id'];
-                        if(!$order_toLive['consignee_name'])$order_toLive['consignee_name']=$order_toEliminate['consignee_name'];
-                        if(!$order_toLive['consignee_phone'])$order_toLive['consignee_phone']=$order_toEliminate['consignee_phone'];
-                        if(!$order_toLive['province'])$order_toLive['province']=$order_toEliminate['province'];
-                        if(!$order_toLive['city'])$order_toLive['city']=$order_toEliminate['city'];
-                        if(!$order_toLive['district'])$order_toLive['district']=$order_toEliminate['district'];
-                        if(!$order_toLive['address'])$order_toLive['address']=$order_toEliminate['address'];
-                        if(!$order_toLive['wms_status'])$order_toLive['wms_status']=$order_toEliminate['wms_status'];
-                        if(!$order_toLive['status'])$order_toLive['status']=$order_toEliminate['status'];
-                        if(!$order_toLive['warehouse_id'])$order_toLive['warehouse_id']=$order_toEliminate['warehouse_id'];
-                        if(!$order_toLive['wms_edittime'])$order_toLive['wms_edittime']=$order_toEliminate['wms_edittime'];
+                $orderId_unique = (function () use ($orders_toCombine) {
+                    $order_toLive = $orders_toCombine->first();
+                    foreach ($orders_toCombine as $key => $order_toEliminate) {
+                        if ($key == 0) continue;
+                        if (!$order_toLive['batch_id']) $order_toLive['batch_id'] = $order_toEliminate['batch_id'];
+                        if (!$order_toLive['owner_id']) $order_toLive['owner_id'] = $order_toEliminate['owner_id'];
+                        if (!$order_toLive['status']) $order_toLive['status'] = $order_toEliminate['status'];
+                        if (!$order_toLive['created_at']) $order_toLive['created_at'] = $order_toEliminate['created_at'];
+                        if (!$order_toLive['code']) $order_toLive['code'] = $order_toEliminate['code'];
+                        if (!$order_toLive['shop_id']) $order_toLive['shop_id'] = $order_toEliminate['shop_id'];
+                        if (!$order_toLive['owner_id']) $order_toLive['owner_id'] = $order_toEliminate['owner_id'];
+                        if (!$order_toLive['client_code']) $order_toLive['client_code'] = $order_toEliminate['client_code'];
+                        if (!$order_toLive['logistic_id']) $order_toLive['logistic_id'] = $order_toEliminate['logistic_id'];
+                        if (!$order_toLive['consignee_name']) $order_toLive['consignee_name'] = $order_toEliminate['consignee_name'];
+                        if (!$order_toLive['consignee_phone']) $order_toLive['consignee_phone'] = $order_toEliminate['consignee_phone'];
+                        if (!$order_toLive['province']) $order_toLive['province'] = $order_toEliminate['province'];
+                        if (!$order_toLive['city']) $order_toLive['city'] = $order_toEliminate['city'];
+                        if (!$order_toLive['district']) $order_toLive['district'] = $order_toEliminate['district'];
+                        if (!$order_toLive['address']) $order_toLive['address'] = $order_toEliminate['address'];
+                        if (!$order_toLive['wms_status']) $order_toLive['wms_status'] = $order_toEliminate['wms_status'];
+                        if (!$order_toLive['status']) $order_toLive['status'] = $order_toEliminate['status'];
+                        if (!$order_toLive['warehouse_id']) $order_toLive['warehouse_id'] = $order_toEliminate['warehouse_id'];
+                        if (!$order_toLive['wms_edittime']) $order_toLive['wms_edittime'] = $order_toEliminate['wms_edittime'];
                     }
                     $order_toLive->save();
                     return $order_toLive['id'];
                 })();
-                $orderIds_toRemove=(function()use($orders_toCombine){
+                $orderIds_toRemove = (function () use ($orders_toCombine) {
                     $orders_toCombine->shift();
-                    return $orders_toCombine->map(function($order){return $order['id'];});
+                    return $orders_toCombine->map(function ($order) {
+                        return $order['id'];
+                    });
                 })();
-                OrderPackage::query()->whereIn('order_id',$orderIds_toRemove)->update(['order_id'=>$orderId_unique]);
-                OrderIssue::query()->whereIn('order_id',$orderIds_toRemove)->update(['order_id'=>$orderId_unique]);
-                OrderCommodity::query()->whereIn('order_id',$orderIds_toRemove)->update(['order_id'=>$orderId_unique]);
-                OrderBin::query()->whereIn('order_id',$orderIds_toRemove)->update(['order_id'=>$orderId_unique]);
+                OrderPackage::query()->whereIn('order_id', $orderIds_toRemove)->update(['order_id' => $orderId_unique]);
+                OrderIssue::query()->whereIn('order_id', $orderIds_toRemove)->update(['order_id' => $orderId_unique]);
+                OrderCommodity::query()->whereIn('order_id', $orderIds_toRemove)->update(['order_id' => $orderId_unique]);
+                OrderBin::query()->whereIn('order_id', $orderIds_toRemove)->update(['order_id' => $orderId_unique]);
                 Order::destroy($orderIds_toRemove);
-                app('LogService')->log(__METHOD__,__FUNCTION__,'orders_toCombine:'.json_encode($orderIds_toRemove).'|toBe OrderId: '.json_encode($orderId_unique));
+                app('LogService')->log(__METHOD__, __FUNCTION__, 'orders_toCombine:' . json_encode($orderIds_toRemove) . '|toBe OrderId: ' . json_encode($orderId_unique));
             });
-            app('LogService')->log(__METHOD__,__FUNCTION__,'orders_repeating:'.$orders_repeating->toJson());
+            app('LogService')->log(__METHOD__, __FUNCTION__, 'orders_repeating:' . $orders_repeating->toJson());
         }
         echo $i;
     }
 
+    public function orderTrackingImportTest(Request $request)
+    {
+        $file = $request->file('file');
+        ini_set('max_execution_time', 4000);
+        ini_set('memory_limit', '1024M');
+        $extension = $request->file()['file']->getClientOriginalExtension();
+        $extension[0] = strtoupper($extension[0]);
+        Excel::import(new OrderTrackingImport(), $request->file('file')->path(), null, $extension);
+    }
+
     public function testImp()
     {
         $client_no = null;
         $items = null;
-        $order=(new OrderTrackingImport())->getOrder($client_no,$items);
-        if($order['id']) echo 'yes1';
+        $order = (new OrderTrackingImport())->getOrder($client_no, $items);
+        if ($order['id']) echo 'yes1';
 
 
         $order = Order::query()->create([
-            'code'=>'null'.Str::uuid(),'client_code' => 'asdfdfdg','web_order_number' => 'sadfdsf'
+            'code' => 'null' . Str::uuid(), 'client_code' => 'asdfdfdg', 'web_order_number' => 'sadfdsf'
         ]);
         dd($order);
 //        $order=(new OrderTrackingImport())->getOrder('92024765871-SDO130000986796QX',$items);
@@ -1108,21 +1191,19 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
 //    }
 
     public function testSyncOrder()
-     {
-        $carbon =Carbon::now()->subHours(1);
+    {
+        $carbon = Carbon::now()->subHours(1);
         $date = '2020-05-18 18:13:50';
-        $orderHeader = OracleDOCOrderHeader::query()->selectRaw(implode(',',OracleDOCOrderHeaderService::$columns))
-            ->with(['oracleBASCustomer'=>function($query){
+        $orderHeader = OracleDOCOrderHeader::query()->selectRaw(implode(',', OracleDOCOrderHeaderService::$columns))
+            ->with(['oracleBASCustomer' => function ($query) {
                 $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
-            },'oracleDOCOrderDetails'=>function($query){
+            }, 'oracleDOCOrderDetails' => function ($query) {
                 $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered');
-            }, 'actAllocationDetails'=>function($query){
+            }, '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');
-            },'oracleBASCode'=>function($query){
+            }, 'oracleBASCode' => function ($query) {
                 $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
             }])
-//            ->where('DOC_Order_Header.addTime','>=',$startDate)
-//            ->where('orderno','SO201112029795')
             ->where('DOC_Order_Header.addTime','>=',$carbon)
             ->get();
         /** @var OrderService $service */
@@ -1130,35 +1211,64 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         $service->syncOrder($orderHeader);
     }
 
-    public function OrderSync(){
+    public function OrderSync()
+    {
+        dump(Carbon::now());
         $tack = new SyncWMSOrderTask();
         $tack->handle();
-        dump(11);
+        dump(Carbon::now());
     }
-    //按日志恢复富勒发过的波次下发,不要删
+
+    public function testSyncCommodity()
+    {
+        /**
+         * @var CommodityService $commodityService
+         */
+        $commodityService = app(CommodityService::class);
+        dump('start'.(string)Carbon::now());
+        $commodityService->syncCommodityCreated();
+        $commodityService->syncCommodityUpdated();
+        dump('end'.(string)Carbon::now());
+    }
+
     public function reNewBatches3()
     {
-        $batches=Batch::query()->where('id','>',5338)->get('code');
-        $batchCodes = $batches->map(function($batch){
-            return $batch['code'];
-        })->toArray();
-        $requests=[];
+        $batches = Batch::query()->where('id', '>', 324)->get('code');
+//        $batchCodes = $batches->map(function($batch){
+//            return $batch['code'];
+//        })->toArray();
+        $batchCodes = ['W201201000037',
+            'W201201000038',
+            'W201201000039',
+            'W201201000040',
+            'W201201000041',
+            'W201201000052',
+            'W201201000053',
+            'W201201000054',
+            'W201201000055',
+            'W201201000056',
+            'W201201000057',
+            'W201201000071',
+            'W201201000074',
+            'W201201000075',
+            'W201201000076',];
+        $requests = [];
 //        $logs=Log::query()->select('description')->where('CREATED_AT','>','2020-11-11')
 //            ->where('type',"issued_newBatch")
 //            ->get();
 //        dd($logs);
-        foreach($batchCodes as $code){
+        foreach ($batchCodes as $code) {
 //            $request=Cache::get('temp'.$code)['description'];
-            $request=Log::query()->select('description')->where('CREATED_AT','>','2020-12-01')
-                ->where('type',"issued_newBatch")
-                ->where('description','like',"%{$code}%")
+            $request = Log::query()->select('description')->where('CREATED_AT', '>', '2020-12-01')
+                ->where('type', "issued_newBatch")
+                ->where('description', 'like', "%{$code}%")
                 ->first();
-            if($request){
-                $response=Zttp::post('https://wcs.baoshi56.com/api/thirdPart/flux/sorting/newBatch',
+            if ($request) {
+                $response = Zttp::post('https://wcs.baoshi56.com/api/thirdPart/flux/sorting/newBatch',
                     json_decode($request['description'])
                 );
-                app('LogService')->log(__METHOD__,__FUNCTION__,$response->body());
-                $requests[]=$response->body();
+                app('LogService')->log(__METHOD__, __FUNCTION__, $response->body());
+                $requests[] = $response->body();
             }
 //            Cache::put('temp'.$code,$request);
 //            $requests[]=$request;
@@ -1166,6 +1276,23 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         dd($requests);
     }
 
+    public function testGetCommodity()
+    {
+        /**
+         * @var CommodityService $commodityService
+         */
+        $ownerIds=['13'];
+        $barcodes = 'BH08B4029E027110';
+        $skus = ['BH08B4029E027110'];
+        $commodityService = app(CommodityService::class);
+        //$commodities=$commodityService->get_($ownerIds,$skus,[],true);
+//        dd($commodities->first());
+        $ownerId=13;
+        $sku='BH08B4029E027110';
+        $commodity=$commodityService->syncBarcodes($barcodes,$ownerId,$sku);
+        dd($commodity);
+    }
+
     public function syncOrderTracking()
     {
         /** @var OrderTrackingService $orderTrackingService */
@@ -1174,9 +1301,9 @@ 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)
+            ->whereIn('orderno', $orderNos)
             ->get();
         $orderService->updateByWmsOrders($orderHeaders);
         $orderTrackingService->createByWmsOrderHeader($orderHeaders);
@@ -1190,49 +1317,20 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         dump((string)Carbon::now());
         dd('hendle...end');
     }
-
-    public function testSyncWaveNo()
-    {
-        $waveHeader = OracleDOCWaveHeader::query()->where('waveno','W201209000024')->first();
-//        Batch::query()->create([
-//            'code' => $waveHeader->waveno,
-//            'wms_created_at' => $waveHeader->addtime,
-//            'remark' => $waveHeader->descr,
-//            'wms_status' => '99',
-//        ]);
-        $waveHeaderDetails = OracleDOCWaveDetails::query()->where('waveno',$waveHeader->waveno)->get();
-        $orderNos = $waveHeaderDetails->map(function($item){
-            return $item->orderno;
-        });
-        $orderHeaderService = new OracleDOCOrderHeaderService();
-        $orderHeaders = $orderHeaderService->getOrderInfoByOrderNos($orderNos);
-        $orderService = new OrderService();
-        $orderService->syncOrderByWMSOrderHeaders($orderHeaders);
-    }
-
-    public function testSyncOrderTracking(){
-        $orderTrackingService = new OrderTrackingService();
-        $items = OrderTracking::query()->with('commodities.package.order')->where('created_at','>=','2020-12-01 00:00:00')->get();
-        $orderNos = $items->map(function ($orderTracking){
-            return   $orderTracking->commodities->package->order->code;
-        });
-        $update_params =[['id','client','order_remark']];
-        $orderHeaders = OracleDOCOrderHeader::query()->whereIn('OrderNo',$orderNos)->get();
-        foreach ($items as $orderTracking) {
-            $order = $orderTracking->commodities->package->order;
-            $orderHeader = $orderHeaders->where('orderno',$order->code)->first();
-            if(!$orderHeader)continue;
-            if(empty($order))continue;
-            $params =  $orderTrackingService->getParamsByOrderHeaderAndOrder($orderHeader,$order);
-            if($params['client'] != $orderTracking->client || $params['order_remark'] != $orderTracking->order_remark ){
-                 $update_params[] = [
-                     'id' => $orderTracking->id,
-                     'client' => $params['client'] ,
-                     'order_remark'  =>$params['order_remark']
-                 ];
-            }
+    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($update_params) == 0)return ;
-        $orderTrackingService->batchUpdate($update_params);
+        if (count($updateParams) > 1) app(BatchUpdateService::class)->batchUpdate('stores', $updateParams);
     }
 }

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

@@ -117,8 +117,6 @@ class UserWorkgroupController extends Controller
         if(!Gate::allows('工作组-删除')){ return redirect(url('/'));  }
         $UserWorkgroup=UserWorkgroup::with('signs')->find($id);
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($UserWorkgroup),Auth::user()['id']);
-        $sign=$UserWorkgroup->signs;
-        $sign->delete();
         $result=$UserWorkgroup->delete();
         return ['success'=>$result];
     }

+ 218 - 0
app/Services/CommodityBarcodeService.php

@@ -2,8 +2,11 @@
 
 namespace App\Services;
 
+use App\Commodity;
 use App\CommodityBarcode;
+use App\Services\common\DataHandlerService;
 use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Cache;
 
 Class CommodityBarcodeService
 {
@@ -73,4 +76,219 @@ Class CommodityBarcodeService
         });
         return CommodityBarcode::destroy($ids);
     }
+
+    public function createBarcodeByWms($bas_skus)
+    {
+
+        if (count($bas_skus)<1)return;
+        $owner_sku_map = [];
+        $sku = [];
+        $bas_skus->each(function ($addBasSku) use (&$owner_sku_map, &$sku) {
+            if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
+                $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
+                $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
+                $sku[] = $addBasSku['sku'];
+            }
+        });
+        /**
+         * @var OwnerService $ownerService
+         * @var DataHandlerService $dataHandlerService
+         */
+        $ownerService = app(OwnerService::class);
+        $dataHandlerService=app(DataHandlerService::class);
+        $owner_codes = (function () use ($owner_sku_map) {
+            $owner_codes = [];
+            if (count($owner_sku_map) == 0) return $owner_codes;
+            foreach ($owner_sku_map as $item) {
+                $owner_codes[$item['owner_code']] = $item['owner_code'];
+            }
+            return $owner_codes;
+        })();
+        $owner_map = (function () use ($ownerService, $owner_codes) {
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner) use (&$map) {
+                $map[$owner['code']] = $owner['id'];
+            });
+            return $map;
+        })();
+        $owner_id = (function () use ($ownerService, $owner_codes) {
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner) use (&$map) {
+                $map[] = $owner['id'];
+            });
+            return $map;
+        })();
+        $commodityBarcodes=$this->getByWms($bas_skus);
+        $commodityBarcodes_map=$dataHandlerService->dataHeader(['commodity_id','code'], $commodityBarcodes);
+        $insert_params=$this->getInsertParams($bas_skus, $commodityBarcodes_map,$owner_id,$sku,$owner_map);
+        if (count($insert_params)>0) {
+            foreach (array_chunk($insert_params, 1000) as $item) {
+                try {
+                    $bool = $this->insert($item);
+                    if ($bool) {
+                        app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 CommodityBarcode Success " . count($insert_params) . ' || ' . json_encode($insert_params));
+                    } else app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 CommodityBarcode FAILED " . ' || ' . json_encode($insert_params));
+                } catch (\Exception $e) {
+                    app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 CommodityBarcode ERROR " . ' || ' . json_encode($insert_params) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
+                }
+            }
+        }
+
+    }
+    public function getInsertParams($bas_skus, $commodityBarcodes_map,$owner_id,$sku,$owner_map)
+    {
+        /**
+         * @var DataHandlerService $dataHandlerService
+         */
+        $dataHandlerService = app(DataHandlerService::class);
+        $commodities = Commodity::query()
+            ->whereIn('owner_id', array_unique($owner_id))
+            ->whereIn('sku', array_unique($sku))
+            ->groupBy('owner_id', 'sku')
+            ->get();
+        $commodities_map = $dataHandlerService->dataHeader(['owner_id','sku'], $commodities);
+        $params = [];
+        foreach ($bas_skus as $bas_sku) {
+            $commodity = Cache::get("owner_code_{$bas_sku['customerid']}_sku_{$bas_sku['sku']}");
+            if (!$commodity) {
+                $commodity = $dataHandlerService->getKeyValue(['owner_id' => $owner_map[$bas_sku['customerid']], 'sku' => $bas_sku['sku']], $commodities_map);
+                if (!$commodity) continue;
+            }
+            if ($bas_sku->alternate_sku1){
+                $commodityBarcode1 = $dataHandlerService->getKeyValue(['commodity_id' => $commodity->id, 'code' => $bas_sku->alternate_sku1], $commodityBarcodes_map);
+                if(!$commodityBarcode1) $params[]=[
+                    'code'=>$bas_sku->alternate_sku1,
+                    'commodity_id' => $commodity->id,
+                    'created_at'=>$bas_sku->addtime,
+                    'updated_at'=>$bas_sku->edittime,
+                ];
+            }
+            if ($bas_sku->alternate_sku2){
+                $commodityBarcode2 = $dataHandlerService->getKeyValue(['commodity_id' => $commodity->id, 'code' => $bas_sku->alternate_sku2], $commodityBarcodes_map);
+                if(!$commodityBarcode2) $params[]=[
+                    'code'=>$bas_sku->alternate_sku2,
+                    'commodity_id' => $commodity->id,
+                    'created_at'=>$bas_sku->addtime,
+                    'updated_at'=>$bas_sku->edittime,
+                ];
+            }
+            if ($bas_sku->alternate_sku3){
+                $commodityBarcode3 = $dataHandlerService->getKeyValue(['commodity_id' => $commodity->id, 'code' => $bas_sku->alternate_sku3], $commodityBarcodes_map);
+                if(!$commodityBarcode3) $params[]=[
+                    'code'=>$bas_sku->alternate_sku3,
+                    'commodity_id' => $commodity->id,
+                    'created_at'=>$bas_sku->addtime,
+                    'updated_at'=>$bas_sku->edittime,
+                ];
+            }
+        }
+        return $params;
+    }
+    public function updateBarcodeByWms($bas_skus)
+    {
+        if (!$bas_skus || $bas_skus->count() == 0) return;
+        $this->createBarcodeByWms($bas_skus);
+        $owner_sku_map = [];
+        $sku = [];
+        $bas_skus->each(function ($addBasSku) use (&$owner_sku_map, &$sku) {
+            if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
+                $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
+                $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
+                $sku[] = $addBasSku['sku'];
+            }
+        });
+        /**
+         * @var OwnerService $ownerService
+         * @var DataHandlerService $dataHandlerService
+         */
+        $ownerService = app(OwnerService::class);
+        $dataHandlerService=app(DataHandlerService::class);
+        $owner_codes = (function () use ($owner_sku_map) {
+            $owner_codes = [];
+            if (count($owner_sku_map) == 0) return $owner_codes;
+            foreach ($owner_sku_map as $item) {
+                $owner_codes[$item['owner_code']] = $item['owner_code'];
+            }
+            return $owner_codes;
+        })();
+        $owner_map = (function () use ($ownerService, $owner_codes) {
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner) use (&$map) {
+                $map[$owner['id']] = $owner['code'];
+            });
+            return $map;
+        })();
+        $commodityBarcodes=$this->getByWms($bas_skus);
+        $bas_skus_map_one = $dataHandlerService->dataHeader(['customerid', 'sku','alternate_sku1',], $bas_skus);
+        $bas_skus_map_two = $dataHandlerService->dataHeader(['customerid', 'sku','alternate_sku2',], $bas_skus);
+        $bas_skus_map_three = $dataHandlerService->dataHeader(['customerid', 'sku','alternate_sku3',], $bas_skus);
+        $delete_Items = [];
+        foreach ($commodityBarcodes as $commodityBarcode) {
+            $bas_sku_one = $dataHandlerService
+                ->getKeyValue(['customerid'=>$owner_map[$commodityBarcode->commodity['owner_id']],'sku'=>$commodityBarcode->commodity['sku'],'alternate_sku1'=>$commodityBarcode->code], $bas_skus_map_one);
+            if ($bas_sku_one) continue;
+            $bas_sku_two = $dataHandlerService
+                ->getKeyValue(['customerid'=>$owner_map[$commodityBarcode->commodity['owner_id']],'sku'=>$commodityBarcode->commodity['sku'],'alternate_sku2'=>$commodityBarcode->code], $bas_skus_map_two);
+            if ($bas_sku_two) continue;
+            $bas_sku_three = $dataHandlerService
+                ->getKeyValue(['customerid'=>$owner_map[$commodityBarcode->commodity['owner_id']],'sku'=>$commodityBarcode->commodity['sku'],'alternate_sku3'=>$commodityBarcode->code], $bas_skus_map_three);
+            if ($bas_sku_three) continue;
+            if (!$bas_sku_one&& !$bas_sku_two&& !$bas_sku_three){
+                $delete_Items[]=$commodityBarcode;
+            }
+        }
+        if (count($delete_Items)>0) $this->deleteCommodityBarcode($delete_Items);
+    }
+    public function getByWms($bas_skus)
+    {
+        if (!$bas_skus) return null;
+        $owner_sku_map = [];
+        $sku = [];
+        $bas_skus->each(function ($addBasSku) use (&$owner_sku_map, &$sku) {
+            if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
+                $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
+                $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
+                $sku[] = $addBasSku['sku'];
+            }
+        });
+        /**
+         * @var OwnerService $ownerService
+         */
+        $ownerService = app(OwnerService::class);
+        $owner_codes = (function () use ($owner_sku_map) {
+            $owner_codes = [];
+            if (count($owner_sku_map) == 0) return $owner_codes;
+            foreach ($owner_sku_map as $item) {
+                $owner_codes[$item['owner_code']] = $item['owner_code'];
+            }
+            return $owner_codes;
+        })();
+        $owner_id = (function () use ($ownerService, $owner_codes) {
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner) use (&$map) {
+                $map[] = $owner['id'];
+            });
+            return $map;
+        })();
+        return CommodityBarcode::query()->with('commodity')->whereHas('commodity', function ($query) use ($owner_id,$sku) {
+            $query->whereIn('owner_id', array_unique($owner_id))->whereIn('sku',array_unique($sku));
+        })->get();
+    }
+    public function deleteCommodityBarcode(array $delete_params)
+    {
+        $itemIds = [];
+        foreach ($delete_params as $item) {
+            array_push($itemIds, $item->id);
+        }
+        try {
+            CommodityBarcode::query()->whereIn('id', $itemIds)->delete();
+            LogService::log(__METHOD__, __FUNCTION__, '删除多余CommodityBarcode ' . count($delete_params) . json_encode($delete_params), null);
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__, '删除多余CommodityBarcode error' . count($delete_params) . json_encode($delete_params) . $e->getMessage() . $e->getTraceAsString(), null);
+        }
+    }
 }

+ 555 - 124
app/Services/CommodityService.php

@@ -8,7 +8,8 @@ use App\CommodityBarcode;
 use App\OracleBasSKU;
 use App\Owner;
 use App\Services\common\BatchUpdateService;
-use App\Shop;
+use App\Services\common\DataHandlerService;
+use App\ValueStore;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
@@ -23,93 +24,109 @@ Class CommodityService
      */
     private $cacheService;
     private $ownerService;
-    function __construct(){
-        $this->cacheService=app('CacheService');
-        $this->ownerService=app('OwnerService');
+
+    function __construct()
+    {
+        $this->cacheService = app('CacheService');
+        $this->ownerService = app('OwnerService');
     }
 
-    public function firstOrCreate($param,$column = null):Commodity{
-        if ($column) return Commodity::query()->firstOrCreate($param,$column);
+    public function firstOrCreate($param, $column = null): Commodity
+    {
+        if ($column) return Commodity::query()->firstOrCreate($param, $column);
         return Commodity::query()->firstOrCreate($param);
     }
-    public function updateOrCreate($param,$column = null){
-        if ($column) return Commodity::query()->updateOrCreate($param,$column);
+
+    public function updateOrCreate($param, $column = null)
+    {
+        if ($column) return Commodity::query()->updateOrCreate($param, $column);
         return Commodity::query()->updateOrCreate($param);
     }
 
-    public function first(array $params, $with = null){
+    public function first(array $params, $with = null)
+    {
         $commodity = Commodity::query();
-        if ($with)$commodity->with($with);
-        foreach ($params as $column => $value){
-            if (!is_array($value))$commodity->where($column,$value);
-            else $commodity->whereIn($column,$value);
+        if ($with) $commodity->with($with);
+        foreach ($params as $column => $value) {
+            if (!is_array($value)) $commodity->where($column, $value);
+            else $commodity->whereIn($column, $value);
         }
         return $commodity->first();
     }
 
-    public function get(array $params){
+    public function get(array $params)
+    {
         $query = Commodity::query()->with('barcodes');
-        if ($params["owner_id"] ?? false){
+        if ($params["owner_id"] ?? false) {
             $query->where("owner_id", $params["owner_id"]);
         }
-        if ($params["sku"] ?? false){
-            if (!is_array($params["sku"]))$params["sku"] = [$params["sku"]];
+        if ($params["sku"] ?? false) {
+            if (!is_array($params["sku"])) $params["sku"] = [$params["sku"]];
             $query->whereIn('sku', $params["sku"]);
         }
         return $query->get();
     }
 
-    public function insert(array $params){
+    public function insert(array $params)
+    {
         return Commodity::query()->insert($params);
     }
 
 
-    public function getOwnerCommodities(array $params){
+    public function getOwnerCommodities(array $params)
+    {
         $query = Commodity::query();
-        foreach ($params as $column => $value){
-            if (!is_array($value)) $query->where($column,$value);
-            else $query->whereIn($column,$value);
+        foreach ($params as $column => $value) {
+            if (!is_array($value)) $query->where($column, $value);
+            else $query->whereIn($column, $value);
         }
         return $query->get();
     }
 
     /* 批量更新 */
-    public function batchUpdate(array $params){
+    public function batchUpdate(array $params)
+    {
         return app(BatchUpdateService::class)->batchUpdate('commodities', $params);
     }
 
     /* 根据货主条形码查找商品 */
-    private function ownerBarcodeSeekCommodityQuery(Builder $query, array $ownerParam, $barcode){
-        $query->whereHas('owner',function ($builder)use($ownerParam){
-            foreach ($ownerParam as $column => $param){
+    private function ownerBarcodeSeekCommodityQuery(Builder $query, array $ownerParam, $barcode)
+    {
+        $query->whereHas('owner', function ($builder) use ($ownerParam) {
+            foreach ($ownerParam as $column => $param) {
                 $builder->where($column, $param);
             }
         });
-        $query->whereHas('barcodes',function ($builder)use($barcode){
-            if (is_array($barcode))$builder->whereIn('code',$barcode);
-            else $builder->where('code',$barcode);
+        $query->whereHas('barcodes', function ($builder) use ($barcode) {
+            if (is_array($barcode)) $builder->whereIn('code', $barcode);
+            else $builder->where('code', $barcode);
         });
         return $query;
     }
-    public function ownerBarcodeSeekCommodityFirst(array $ownerParam, $barcode, $with = null){
+
+    public function ownerBarcodeSeekCommodityFirst(array $ownerParam, $barcode, $with = null)
+    {
         $commodity = Commodity::query();
         if ($with) $commodity->with($with);
         $commodity = $this->ownerBarcodeSeekCommodityQuery($commodity, $ownerParam, $barcode);
         return $commodity->first();
     }
-    public function ownerBarcodeSeekCommodityGet(array $ownerParam, $barcode, $isNullSku = false){
+
+    public function ownerBarcodeSeekCommodityGet(array $ownerParam, $barcode, $isNullSku = false)
+    {
         $commodities = Commodity::query()->with('barcodes');
-        if ($isNullSku)$commodities->whereNull('sku');
+        if ($isNullSku) $commodities->whereNull('sku');
         $commodities = $this->ownerBarcodeSeekCommodityQuery($commodities, $ownerParam, $barcode);
         return $commodities->get();
     }
 
     /* 通过货主代码与条形码寻找FLUX商品补充至WMS 单条*/
-    public function ownerAndBarcodeFirstOrCreate(Owner $owner,$barcode){
-        $wmsCommodity = app('OracleBasSkuService')->first(['customerid'=>$owner->code, 'barcode'=>$barcode]);
+    public function ownerAndBarcodeFirstOrCreate(Owner $owner, $barcode)
+    {
+        $wmsCommodity = app('OracleBasSkuService')->first(['customerid' => $owner->code, 'barcode' => $barcode]);
         if (!$wmsCommodity) return null;
 
-        $commodity = $this->firstOrCreate(['owner_id'=>$owner->id, 'sku'=>$wmsCommodity->sku],[
+        $commodity = $this->firstOrCreate(['owner_id' => $owner->id, 'sku' => $wmsCommodity->sku], [
             "name" => $wmsCommodity->descr_c,
             "sku" => $wmsCommodity->sku,
             "owner_id" => $owner->id,
@@ -118,41 +135,43 @@ Class CommodityService
             "height" => $wmsCommodity->skuhigh,
             "volumn" => $wmsCommodity->cube,
         ]);
-        if ($wmsCommodity->alternate_sku1)app('CommodityBarcodeService')->first([
+        if ($wmsCommodity->alternate_sku1) app('CommodityBarcodeService')->first([
             'commodity_id' => $commodity->id,
             'code' => $wmsCommodity->alternate_sku1,
         ]);
-        if ($wmsCommodity->alternate_sku2)app('CommodityBarcodeService')->first([
+        if ($wmsCommodity->alternate_sku2) app('CommodityBarcodeService')->first([
             'commodity_id' => $commodity->id,
             'code' => $wmsCommodity->alternate_sku2,
         ]);
         return $commodity;
     }
 
-    public function create(array $params){
+    public function create(array $params)
+    {
         return Commodity::query()->create($params);
     }
 
-    public function getByWmsOrders($orderHeaders){
-        if(!$orderHeaders) return null;
+    public function getByWmsOrders($orderHeaders)
+    {
+        if (!$orderHeaders) return null;
         $customerId_sku_map = [];
         foreach ($orderHeaders as $orderHeader) {
             $oracleDOCOrderDetails = $orderHeader->oracleDOCOrderDetails;
             foreach ($oracleDOCOrderDetails as $oracleDOCOrderDetail) {
                 $value = [
                     'owner_code' => $oracleDOCOrderDetail->customerid,
-                    'sku'=> $oracleDOCOrderDetail->sku
+                    'sku' => $oracleDOCOrderDetail->sku
                 ];
-                if(!in_array($value,$customerId_sku_map)){
+                if (!in_array($value, $customerId_sku_map)) {
                     $customerId_sku_map[] = $value;
                 }
             }
         }
 
-        $owner_codes = array_diff(array_unique(data_get($customerId_sku_map,'*.owner_code')),['','*',null]) ;
-        if(!$owner_codes) return null;
+        $owner_codes = array_diff(array_unique(data_get($customerId_sku_map, '*.owner_code')), ['', '*', null]);
+        if (!$owner_codes) return null;
 
-        $owners = Owner::query()->whereIn('code',$owner_codes)->get();
+        $owners = Owner::query()->whereIn('code', $owner_codes)->get();
 
         $owners_code_map = [];
         $owners_id_map = [];
@@ -160,70 +179,70 @@ Class CommodityService
             $owners_code_map[$owner->code] = $owner;
             $owners_id_map[$owner->id] = $owner;
         }
-        $orderHeader_sku = array_diff(array_unique(data_get($customerId_sku_map,'*.sku')),['','*',null]) ;
+        $orderHeader_sku = array_diff(array_unique(data_get($customerId_sku_map, '*.sku')), ['', '*', null]);
         $commodities = Commodity::query()
-            ->whereIn('owner_id',data_get($owners,'*.id'))
-            ->whereIn('sku',$orderHeader_sku)
-            ->groupBy('owner_id','sku')  //*!!!!!!!!
+            ->whereIn('owner_id', data_get($owners, '*.id'))
+            ->whereIn('sku', $orderHeader_sku)
+            ->groupBy('owner_id', 'sku')  //*!!!!!!!!
             ->get();
 
-        if($commodities->count() < count($customerId_sku_map)){
+        if ($commodities->count() < count($customerId_sku_map)) {
             $commoditiesInWAS索引_sku = [];
             foreach ($commodities as $commodityInWms) {
                 $owner = $owners_id_map[$commodityInWms->owner_id] ?? '';
-                if(!$owner)continue;
-                $key ='owner_cod='.$owner['code'].' sku='.$commodityInWms->sku;
-                $commoditiesInWAS索引_sku[$key]=$commodityInWms;
+                if (!$owner) continue;
+                $key = 'owner_cod=' . $owner['code'] . ' sku=' . $commodityInWms->sku;
+                $commoditiesInWAS索引_sku[$key] = $commodityInWms;
             }
-            $commodities需要新增=[];
+            $commodities需要新增 = [];
             foreach ($customerId_sku_map as $commodityInWms) {
-                $key ='owner_cod='.$commodityInWms['owner_code'].' sku='.$commodityInWms['sku'];
-                if($commoditiesInWAS索引_sku[$key] ?? false) continue;
+                $key = 'owner_cod=' . $commodityInWms['owner_code'] . ' sku=' . $commodityInWms['sku'];
+                if ($commoditiesInWAS索引_sku[$key] ?? false) continue;
                 $commodities需要新增[$key] = $commodityInWms;
             }
-            $commodity_set = $this->createCommodities($commodities需要新增,$owners_code_map);
+            $commodity_set = $this->createCommodities($commodities需要新增, $owners_code_map);
             $commodities = $commodities->concat($commodity_set);
         }
-        return  $commodities;
+        return $commodities;
     }
 
-    public function createCommodities($params,$owners_code_map)
+    public function createCommodities($params, $owners_code_map)
     {
-        if(!$params) return [];
+        if (!$params) return [];
         $bas_sku_arr = OracleBasSKU::query()
             ->selectRaw('customerid,sku,descr_c,skulength,skuwidth,skuhigh,cube')
-            ->whereIn('CustomerID',data_get($params,'*.owner_code'))
-            ->whereIn('Sku',data_get($params,'*.sku'))
+            ->whereIn('CustomerID', data_get($params, '*.owner_code'))
+            ->whereIn('Sku', data_get($params, '*.sku'))
             ->get();
         $insert_params = [];
         $created_at = Carbon::now()->format('Y-m-d H:i:s');
         foreach ($bas_sku_arr as $bas_sku) {
             $owner = $owners_code_map[$bas_sku->customerid] ?? '';
-            if(!$owner)continue;
-            if($bas_sku->sku==null)continue;
-            if($bas_sku->descr_c=='')continue;
+            if (!$owner) continue;
+            if ($bas_sku->sku == null) continue;
+            if ($bas_sku->descr_c == '') continue;
             $insert_params[] = [
                 'owner_id' => $owner->id,
                 'sku' => $bas_sku->sku,
-                'name' =>$bas_sku->descr_c,
+                'name' => $bas_sku->descr_c,
                 'created_at' => $created_at,
-                'length' =>$bas_sku->skulength,
+                'length' => $bas_sku->skulength,
                 'width' => $bas_sku->skuwidth,
                 'height' => $bas_sku->skuhigh,
                 'volumn' => $bas_sku->cube
             ];
         }
-        if(count($insert_params) > 0){
+        if (count($insert_params) > 0) {
             try {
                 $this->insert($insert_params);
-                app('LogService')->log(__METHOD__,__FUNCTION__,'批量添加 commodity ' . count($insert_params) .json_encode($insert_params) );
+                app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 commodity ' . count($insert_params) . json_encode($insert_params));
             } catch (\Exception $e) {
-                app('LogService')->log(__METHOD__,__FUNCTION__,'批量添加 commodity error' .json_encode($insert_params) ."||".$e->getMessage().'||'.$e->getTraceAsString());
+                app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 commodity error' . json_encode($insert_params) . "||" . $e->getMessage() . '||' . $e->getTraceAsString());
             }
         }
         return Commodity::query()
-            ->whereIn('owner_id',data_get($owners_code_map,'*.id'))
-            ->whereIn('sku',data_get($params,'*.sku'))
+            ->whereIn('owner_id', data_get($owners_code_map, '*.id'))
+            ->whereIn('sku', data_get($params, '*.sku'))
             ->get();
     }
 
@@ -234,93 +253,100 @@ Class CommodityService
     }
 
 
-
-    public function syncBarcodes($barcodesStr,$ownerId,$sku):Commodity
+    public function syncBarcodes($barcodesStr, $ownerId, $sku): Commodity
     {
-        $barcodes=(function()use($barcodesStr){
-            $barcodes=rtrim($barcodesStr,',');
-            $barcodes=explode(',',$barcodes);
-            foreach ($barcodes as $k=>$barcode){
-                if(!trim($barcode)) unset($barcodes[$k]);
+        $barcodes = (function () use ($barcodesStr) {
+            $barcodes = rtrim($barcodesStr, ',');
+            $barcodes = explode(',', $barcodes);
+            foreach ($barcodes as $k => $barcode) {
+                if (!trim($barcode)) unset($barcodes[$k]);
             }
             return $barcodes;
         })();
-        $commodity=$this->firstOrCreate(['owner_id'=>$ownerId,'sku'=>$sku]);
-        $commodityBarcodes=$commodity['barcodes']??new Collection();
+        //
+        $commodities=$this->get_([$ownerId],[$sku],[],true);
+        if ($commodities->first()){
+            $commodity=$commodities->first();
+        }else{
+            $commodity = $this->firstOrCreate(['owner_id' => $ownerId, 'sku' => $sku]);
+        }
+        $commodityBarcodes = $commodity['barcodes'] ?? new Collection();
 
 
         /** @var CommodityBarcodeService $commodityBarcodeService */
-        $commodityBarcodeService=app('CommodityBarcodeService');
-        $redundantCommodityBarcodes=new Collection();
-        foreach($commodityBarcodes as $commodityBarcode){//清除数组中 已经在商品有的条码,清除商品条码中,不在数组中的条码
-            $hasMatch=false;
-            foreach($barcodes as $key=>$barcode){
-                if($barcodes[$key]==$commodityBarcode['code']){
-                    $hasMatch=true;
+        $commodityBarcodeService = app('CommodityBarcodeService');
+        $redundantCommodityBarcodes = new Collection();
+        foreach ($commodityBarcodes as $commodityBarcode) {//清除数组中 已经在商品有的条码,清除商品条码中,不在数组中的条码
+            $hasMatch = false;
+            foreach ($barcodes as $key => $barcode) {
+                if ($barcodes[$key] == $commodityBarcode['code']) {
+                    $hasMatch = true;
                     unset($barcodes[$key]);
                     break;
                 }
             }
-            if(!$hasMatch){
+            if (!$hasMatch) {
                 $redundantCommodityBarcodes->push($commodityBarcode);
             }
         }
-        if(!empty($redundantCommodityBarcodes)){
+        if (!empty($redundantCommodityBarcodes)) {
             $commodityBarcodeService->destroyCollections($redundantCommodityBarcodes);
         }
-        if(!empty($barcodes)){
-            $commodityBarcodeService->insertMany_onCommodities([['commodity_id'=>$commodity['id'],'barcodes'=>$barcodes]]);
+        if (!empty($barcodes)) {
+            $commodityBarcodeService->insertMany_onCommodities([['commodity_id' => $commodity['id'], 'barcodes' => $barcodes]]);
         }
         return $commodity;
     }
+
     public function destroyWithOffspring(Commodity $commodity)
     {
-        $barcodesIds=$commodity->barcodes->map(function ($barcode){
+        $barcodesIds = $commodity->barcodes->map(function ($barcode) {
             return $barcode['id'];
         });
         CommodityBarcode::destroy($barcodesIds);
         $commodity->delete();
     }
 
-    public function syncWMSOrderCode($owner,$skus)
+    public function syncWMSOrderCode($owner, $skus)
     {
-        $basSku = OracleBasSKU::query()->whereIn('SKU',$skus)->where('CustomerID',$owner->code)->get();
+        $basSku = OracleBasSKU::query()->whereIn('SKU', $skus)->where('CustomerID', $owner->code)->get();
         $inner_params = [];
         $created_at = new Carbon();
-        $basSku->each(function($bas_sku)use(&$inner_params,$owner,$created_at){
+        $basSku->each(function ($bas_sku) use (&$inner_params, $owner, $created_at) {
             $inner_params = [
                 'owner_id' => $owner->id,
                 'sku' => $bas_sku->sku,
-                'name' =>$bas_sku->descr_c,
+                'name' => $bas_sku->descr_c,
                 'created_at' => $created_at,
-                'length' =>$bas_sku->skulength,
+                'length' => $bas_sku->skulength,
                 'width' => $bas_sku->skuwidth,
                 'height' => $bas_sku->skuhigh,
                 'volumn' => $bas_sku->cube
             ];
         });
-        if(count($inner_params) > 0){
+        if (count($inner_params) > 0) {
             try {
                 $this->insert($inner_params);
                 app('LogService')->log(__METHOD__, __FUNCTION__, json_encode($inner_params));
             } catch (\Exception $e) {
-                app('LogService')->log(__METHOD__, 'Error '.__FUNCTION__, json_encode($inner_params).' || '.$e->getMessage());
+                app('LogService')->log(__METHOD__, 'Error ' . __FUNCTION__, json_encode($inner_params) . ' || ' . $e->getMessage());
             }
         }
     }
+
     //获取箱规
     public function getPack($owner_id, $sku)
     {
         $that = $this;
-        return app("CacheService")->getOrExecute("pack_{$owner_id}_{$sku}",function ()use($owner_id,$sku,$that){
+        return app("CacheService")->getOrExecute("pack_{$owner_id}_{$sku}", function () use ($owner_id, $sku, $that) {
             $commodity = $that->first([
                 "owner_id" => $owner_id,
                 "sku" => $sku
             ]);
-            if (!$commodity || $commodity->pack_spec === null){
+            if (!$commodity || $commodity->pack_spec === null) {
                 $owner = app("OwnerService")->find($owner_id);
                 $action = new CommodityController();
-                $action->syncOwnerCommodities($owner->id,$owner->code,$sku);
+                $action->syncOwnerCommodities($owner->id, $owner->code, $sku);
             }
             return $that->first([
                 "owner_id" => $owner_id,
@@ -334,65 +360,470 @@ Class CommodityService
     {
         $query = Commodity::query();
         if ($params["barcode"] ?? false) {
-            $query->whereHas("barcodes",function ($query)use($params){
+            $query->whereHas("barcodes", function ($query) use ($params) {
                 /** @var Builder $query */
-                $query->where("code",$params["barcode"]);
+                $query->where("code", $params["barcode"]);
             });
             unset($params["barcode"]);
         }
-        foreach ($params as $column => $param){
-            $query->where($column,$param);
+        foreach ($params as $column => $param) {
+            $query->where($column, $param);
         }
-        if ($query->count() > 0)return true;
+        if ($query->count() > 0) return true;
         return false;
     }
 
     public function getCommoditiesByMap($map)
     {
         $collect = collect();
-        if(count($map)==0)return $collect;
+        if (count($map) == 0) return $collect;
         foreach ($map as $item) {
-            $commodity = $this->getCommodityByOwnerCodeAndSKU($item['owner_code'],$item['sku']);
+            $commodity = $this->getCommodityByOwnerCodeAndSKU($item['owner_code'], $item['sku']);
             $collect->push($commodity);
         }
         return $collect;
     }
 
-    public function getCommodityByOwnerCodeAndSKU($ownerCode,$sku){
+    public function getCommodityByOwnerCodeAndSKU($ownerCode, $sku)
+    {
         $commodity_key = "owner_code_{$ownerCode}_sku_{$sku}";
-        return Cache::remember($commodity_key,config('cache.expirations.forever'),function()use($ownerCode,$sku){
-            $commodity = Commodity::query()->where('sku',$sku)->whereHas('owner',function($query)use($ownerCode){
-                $query->where('code',$ownerCode);
+        return Cache::remember($commodity_key, config('cache.expirations.forever'), function () use ($ownerCode, $sku) {
+            $commodity = Commodity::query()->where('sku', $sku)->whereHas('owner', function ($query) use ($ownerCode) {
+                $query->where('code', $ownerCode);
             })->first();
-            if(isset($commodity))return $commodity;
-            $basSKu =  app('OracleBasSkuService')->first(['sku'=>$sku,'customerid'=>$ownerCode]);
+            if (isset($commodity)) return $commodity;
+            $basSKu = app('OracleBasSkuService')->first(['sku' => $sku, 'customerid' => $ownerCode]);
             return Commodity::query()->create($this->getParamsByBasSku($basSKu));
         });
     }
 
-    public function getParamsByBasSku($basSku,$owner = null){
-        if(empty($owner)){
+    public function getParamsByBasSku($basSku, $owner = null)
+    {
+        if (empty($owner)) {
             $owner = app('OwnerService')->getOwnerByCode($basSku['customerid']);
         }
-        return  [
+        return [
             'owner_id' => $owner['id'] ?? '',
             'sku' => $basSku['sku'],
-            'name' =>$basSku['descr_c'],
-            'length' =>$basSku['skulength'],
+            'name' => $basSku['descr_c'],
+            'length' => $basSku['skulength'],
             'width' => $basSku['skuwidth'],
             'height' => $basSku['skuhigh'],
             'volumn' => $basSku['cube']
         ];
     }
 
+    public function syncCommodityCreated()
+    {
+        $created_at = config('sync.commodity_sync.created_at');
+        $create_set = config('sync.commodity_sync.cache_prefix.create_set');
+        $create_keys = config('sync.commodity_sync.cache_prefix.create_keys');
+        $create_key = config('sync.commodity_sync.cache_prefix.create');
+        /** @var OracleBasSkuService $oracleBasSkuService */
+        $oracleBasSkuService = app(OracleBasSkuService::class);
+        $last_time = $this->getAsnLastSyncAt($created_at, 'create');
+        $basSkus = $oracleBasSkuService->getWmsCreatedCommodities($last_time);
+        $last_time = $basSkus->first()['addtime'];
+        $last_records = $basSkus->where('addtime', $last_time);
+        if (!$basSkus) return;
+            $this->syncCreateCommodity($basSkus);
+            $this->deleteCacheKey($create_set, $create_keys);
+            $this->setLastRecordsByRedis($create_key, $create_set, $create_keys, $last_records);
+            $this->setAsnLastSyncAt($created_at, $last_time);
+    }
+
+    public function syncCommodityUpdated()
+    {
+        $updated_at = config('sync.commodity_sync.updated_at');
+        $update_set = config('sync.commodity_sync.cache_prefix.update_set');
+        $update_keys = config('sync.commodity_sync.cache_prefix.update_keys');
+        $update_key = config('sync.commodity_sync.cache_prefix.update');
+        /** @var OracleBasSkuService $oracleBasSkuService */
+        $oracleBasSkuService = app(OracleBasSkuService::class);
+        $last_time = $this->getAsnLastSyncAt($updated_at, 'update');
+        $basSkus = $oracleBasSkuService->getWmsUpdatedCommodities($last_time);
+        $last_time = $basSkus->first()['edittime'];
+        $last_records = $basSkus->where('edittime', $last_time);
+        if (!$basSkus) return;
+            $this->syncUpdateCommodity($basSkus);
+            $this->deleteCacheKey($update_set, $update_keys);
+            $this->setLastRecordsByRedis($update_key, $update_set, $update_keys, $last_records);
+            $this->setAsnLastSyncAt($updated_at, $last_time);
+    }
+
+    public function syncCreateCommodity($addBasSkus)
+    {
+        if (count($addBasSkus) < 1) return null;
+        $insert_params = $this->getParamsByBasSkus($addBasSkus);
+        if (!$insert_params) return;
+        $this->insertCommodities($insert_params);
+        /** @var CommodityBarcodeService $commodityBarcodeService */
+        $commodityBarcodeService = app(CommodityBarcodeService::class);
+        $commodityBarcodeService->createBarcodeByWms($addBasSkus);
+    }
+
+    public function insertCommodities($insert_params)
+    {
+        if (count($insert_params) < 1) return;
+        $ownerIds = array_unique(data_get($insert_params, '*.owner_id'));
+        sort($ownerIds);
+        $skus = array_unique(data_get($insert_params, '*.sku'));
+        sort($skus);
+        try {
+            $bool = Commodity::query()->insert($insert_params);
+            if ($bool) {
+                app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 Commodity Success " . count($insert_params) . ' || ' . json_encode($insert_params));
+                $commodities = Commodity::query()->with('owner')->whereIn('owner_id', $ownerIds)->whereIn('sku', $skus)->get();
+                $md5 = md5(json_encode([$skus, $ownerIds]));
+                if (Cache::has('commodity_' . $md5)) Cache::forget('commodity_' . $md5);
+                $this->pushToCache($commodities);
+            } else app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 Commodity FAILED " . ' || ' . json_encode($insert_params));
+        } catch (\Exception $e) {
+            app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 Commodity ERROR " . ' || ' . json_encode($insert_params) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
+        }
+    }
+
+    public function getParamsByBasSkus($addBasSkus)
+    {
+        $owner_sku_map = [];
+        $sku = [];
+        $owner_code = [];
+        $owner_codes = [];
+        $addBasSkus->each(function ($addBasSku) use (&$owner_sku_map, &$sku, &$owner_codes, &$owner_code) {
+            if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
+                $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
+                $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
+                $sku[] = $addBasSku['sku'];
+                $owner_code[] = $addBasSku['customerid'];
+                $owner_codes[$addBasSku['customerid']] = $addBasSku['customerid'];
+            }
+        });
+        /** @var OwnerService $ownerService */
+        $ownerService = app(OwnerService::class);
+        $owner_id = (function () use ($ownerService, $owner_codes) {
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner) use (&$map) {
+                $map[] = $owner['id'];
+            });
+            return $map;
+        })();
+        $owner_map = (function () use ($ownerService, $owner_codes) {
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner) use (&$map) {
+                $map[$owner['code']] = $owner['id'];
+            });
+            return $map;
+        })();
+        if (count($owner_sku_map) == 0) return null;
+        $commodities = Commodity::query()
+            ->whereIn('owner_id', array_unique($owner_id))
+            ->whereIn('sku', array_unique($sku))
+            ->groupBy('owner_id', 'sku')
+            ->get();
+        $unexists = [];
+        foreach ($owner_sku_map as $item) {
+            $commodity = Cache::get("owner_code_{$item['owner_code']}_sku_{$item['sku']}");
+            if ($commodity) continue;
+            $commodity = $commodities->where('sku', $item['sku'])->where('owner_id', $owner_map[$item['owner_code']])->first();
+            if ($commodity) continue;
+            $items = [
+                'owner_code' => $item['owner_code'],
+                'sku' => $item['sku']
+            ];
+            $unexists[json_encode($items)] = true;
+        }
+        if (count($unexists) == 0) return null;
+        $BasSKUs = $addBasSkus->filter(function ($bas_sku) use ($unexists) {
+            $arr = [
+                'owner_code' => $bas_sku['customerid'],
+                'sku' => $bas_sku['sku']
+            ];
+            return $unexists[json_encode($arr)] ?? false;
+        });
+        $inner_params = (function () use ($BasSKUs, $owner_map) {
+            $map = [];
+            $BasSKUs->each(function ($basSku) use (&$map, $owner_map) {
+                $map[] = [
+                    'owner_id' => $owner_map[$basSku['customerid']] ?? '',
+                    'sku' => $basSku->sku,
+                    'name' => $basSku->descr_c,
+                    'length' => $basSku->skulength,
+                    'width' => $basSku->skuwidth,
+                    'height' => $basSku->skuhigh,
+                    'volumn' => $basSku->cube,
+                    'created_at' => $basSku->addtime,
+                    'updated_at' => $basSku->edittime,
+                    'pack_spec' => $basSku->packid == 'STANDARD' ? 0 : explode("/", $basSku->packid)[1],
+                ];
+            });
+            return $map;
+        })();
+        if (count($inner_params) == 0) return null;
+        return $inner_params;
+    }
+
+    public function syncUpdateCommodity($addBasSkus)
+    {
+        $sku = [];
+        $owner_codes = [];
+        $addBasSkus->each(function ($addBasSku) use (&$sku, &$owner_codes) {
+            if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
+                $sku[] = $addBasSku['sku'];
+                $owner_codes[$addBasSku['customerid']] = $addBasSku['customerid'];
+            }
+        });
+        /**
+         * @var OwnerService $ownerService
+         * @var DataHandlerService $dataHandlerService
+         */
+        $ownerService = app(OwnerService::class);
+        $dataHandlerService = app(DataHandlerService::class);
+        $owner_map = (function () use ($ownerService, $owner_codes) {
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner) use (&$map) {
+                $map[$owner['code']] = $owner['id'];
+            });
+            return $map;
+        })();
+        $owner_id = (function () use ($ownerService, $owner_codes) {
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner) use (&$map) {
+                $map[] = $owner['id'];
+            });
+            return $map;
+        })();
+        $commodities = Commodity::query()
+            ->whereIn('owner_id', array_unique($owner_id))
+            ->whereIn('sku', array_unique($sku))
+            ->groupBy('owner_id', 'sku')
+            ->get();
+        $commodities_map = $dataHandlerService->dataHeader(['owner_id', 'sku'], $commodities);
+        $updateParams = [[
+            'id', 'name', 'sku', 'owner_id', 'length', 'width', 'height', 'volumn', 'pack_spec', 'updated_at', 'created_at'
+        ]];
+        $insert_params = [];
+        foreach ($addBasSkus as $basSku) {
+            $commodity = Cache::get("owner_code_{$basSku['customerid']}_sku_{$basSku['sku']}");
+            if (!$commodity) {
+                $commodity = $dataHandlerService->getKeyValue(['owner_id' => $owner_map[$basSku['customerid']], 'sku' => $basSku['sku']], $commodities_map);
+                if (!$commodity) {
+                    $insert_params[] = [
+                        'owner_id' => $owner_map[$basSku['customerid']] ?? '',
+                        'sku' => $basSku->sku,
+                        'name' => $basSku->descr_c,
+                        'length' => $basSku->skulength,
+                        'width' => $basSku->skuwidth,
+                        'height' => $basSku->skuhigh,
+                        'volumn' => $basSku->cube,
+                        'created_at' => $basSku->addtime,
+                        'updated_at' => $basSku->edittime,
+                        'pack_spec' => $basSku->packid == 'STANDARD' ? 0 : explode("/", $basSku->packid)[1],
+                    ];
+                    continue;
+                };
+            }
+            if ($commodity->sku != $basSku->sku ||
+                $commodity->name != $basSku->descr_c ||
+                $commodity->length != $basSku->skulength ||
+                $commodity->width != $basSku->skuwidth ||
+                $commodity->height != $basSku->skuhigh ||
+                $commodity->volumn != $basSku->cube ||
+                $commodity->created_at != $basSku->addtime ||
+                $commodity->updated_at != $basSku->edittime ||
+                $commodity->pack_spec != $basSku->pickid) {
+                $updateParams[] = [
+                    'id' => $commodity->id,
+                    'owner_id' => $owner_map[$basSku['customerid']] ?? '',
+                    'sku' => $basSku->sku,
+                    'name' => $basSku->descr_c,
+                    'length' => $basSku->skulength,
+                    'width' => $basSku->skuwidth,
+                    'height' => $basSku->skuhigh,
+                    'volumn' => $basSku->cube,
+                    'created_at' => $basSku->addtime,
+                    'updated_at' => $basSku->edittime,
+                    'pack_spec' => $basSku->packid == 'STANDARD' ? 0 : explode("/", $basSku->packid)[1],
+                ];
+            }
+        }
+        if (count($insert_params) > 0) $this->insertCommodities($insert_params);
+        if (count($updateParams) > 0) $this->updateCommodities($updateParams);
+        /** @var CommodityBarcodeService $commodityBarcodeService */
+        $commodityBarcodeService = app(CommodityBarcodeService::class);
+        $commodityBarcodeService->updateBarcodeByWms($addBasSkus);
+    }
+
     private function pushToCache($commodities)
     {
         if (count($commodities) < 1) return null;
         foreach ($commodities as $commodity) {
             $commodity_key = "owner_code_{$commodity['owner']['code']}_sku_{$commodity['sku']}";
-            Cache::remember($commodity_key, config('cache.expirations.forever'), function () use ($commodity) {
-                return $commodity;
-            });
+            Cache::put($commodity_key, $commodity);
+        }
+    }
+
+    public function getAsnLastSyncAt($key, $type)
+    {
+        $last_time = ValueStore::query()->where('name', $key)->value('value');
+        if ($last_time) return $last_time;
+        if ($type == 'create') {
+            $store = Commodity::query()->orderByDesc('created_at')->first();
+            if ($store) return $store->created_at;
+        } else {
+            $store = Commodity::query()->orderByDesc('updated_at')->first();
+            if ($store) return $store->updated_at;
+        }
+        return Carbon::now()->subSeconds(65);
+    }
+
+    public function setAsnLastSyncAt($key, $last_time)
+    {
+        $asnLastSyncAt = ValueStore::query()->updateOrCreate([
+            'name' => $key,
+        ], [
+            'name' => $key,
+            'value' => $last_time,
+        ]);
+        LogService::log(__METHOD__, __FUNCTION__, '修改或更新' . $key . json_encode($asnLastSyncAt));
+        return $asnLastSyncAt;
+    }
+    public function deleteCacheKey($set, $keys)
+    {
+        if (Cache::get($set)) {
+            $cacheKeys = Cache::get($keys);
+            if (!$cacheKeys) return;
+            foreach ($cacheKeys as $cacheKey) {
+                Cache::forget($cacheKey);
+            }
+            Cache::forget($keys);
+        }
+    }
+
+    public function setLastRecordsByRedis($prefixKey, $set, $keys, $last_records)
+    {
+        $cacheKeys = [];
+        foreach ($last_records as $last_record) {
+            Cache::put($prefixKey . $last_record->customerid . '_' . $last_record->sku, true);
+            array_push($cacheKeys, $prefixKey . $last_record->customerid . '_' . $last_record->sku);
+        }
+        Cache::put($keys, $cacheKeys);
+        Cache::put($set, true);
+    }
+
+    function updateCommodities($updateParams)
+    {
+        if (count($updateParams) < 1) return;
+        $ownerIds = array_unique(data_get($updateParams, '*.owner_id'));
+        sort($ownerIds);
+        $skus = array_unique(data_get($updateParams, '*.sku'));
+        sort($skus);
+        $this->batchUpdate($updateParams);
+        $md5 = md5(json_encode([$skus, $ownerIds]));
+        if (Cache::has('commodity_' . $md5)) Cache::forget('commodity_' . $md5);
+        $commodities = Commodity::query()->with('owner')->whereIn('owner_id', $ownerIds)->whereIn('sku', $skus)->get();
+        $this->pushToCache($commodities);
+    }
+
+    // TODO
+
+    /**
+     * @param array $ownerIds
+     * @param array $skus
+     * @param array $barcodes
+     * @param bool $isSyncWms 是否开启同步wms数据  开启则必须给定 $ownerIds 和 $skus
+     * @param int $paginate   分页只对  货主$ownerIds 条件
+     * @param int $page
+     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|mixed|null
+     */
+    function get_(array $ownerIds = [], array $skus = [], array $barcodes = [], $isSyncWms = false, $paginate = 100, $page = 1)
+    {
+        if ($paginate < 100 || fmod($paginate, 100) != 0) return null; //$paginate小于100,或取余数100不为0,异常 //取余函数fmod()
+        $time = config('cache.expirations.forever');
+        $status = null;
+        if ($ownerIds && !$skus && !$barcodes) $status = '只有货主条件';
+        if ($skus) $status = '有SKU';
+        if ($barcodes && !$skus) $status = '有条码没SKU';
+        if (!$status) return null;
+
+        switch ($status) {
+
+            case $status == '有SKU':
+                if ($isSyncWms) {
+                    if (!$ownerIds) return null;
+                    $owners = Owner::query()->whereIn('id', $ownerIds)->select('id', 'code')->get();
+                    if (!$owners) return null;
+                    foreach ($owners as $owner) {
+                        $ownerCodes[] = $owner->code;
+                    }
+                    $bas_skus = OracleBasSKU::query()
+                        ->select('customerid', 'sku', 'descr_c', 'alternate_sku1', 'alternate_sku2', 'alternate_sku3', 'skulength', 'skuwidth', 'skuhigh', 'cube', 'packid', 'addtime', 'edittime')
+                        ->whereIn('customerid', $ownerCodes)->whereIn('sku', $skus)
+                        ->get();
+                    if (!$bas_skus) return null;
+                    $this->syncUpdateCommodity($bas_skus);
+                }
+                sort($skus);
+                //在取出的记录用 $ownerIds和$barcodes筛选
+                $commodities = Commodity::query()
+                    ->with(['barcodes', 'owner'])
+                    ->whereIn('sku', $skus)->get();
+                if ($ownerIds) {
+                    sort($ownerIds);
+//                    $md5 = md5(json_encode([$skus, $ownerIds]));
+//                    return Cache::remember('commodity_' . $md5, $time, function () use ($skus, $ownerIds, $commodities) {
+                        return $commodities->whereIn('owner_id', $ownerIds);
+//                    });
+                }
+                if ($barcodes && !$ownerIds) {
+                    sort($barcodes);
+                    $md5 = md5(json_encode([$skus, $barcodes]));
+                    return Cache::remember('commodity_' . $md5, $time, function () use ($skus, $barcodes) {
+                        return Commodity::query()
+                            ->with(['barcodes', 'owner'])
+                            ->whereHas('barcodes', function ($query) use ($barcodes) {
+                                $query->whereIn('code', $barcodes);
+                            })
+                            ->whereIn('sku', $skus)->get();
+                    });
+                }
+                return $commodities;
+
+            case $status == '有条码没SKU':
+                sort($barcodes);
+                $commodities = Commodity::query()
+                    ->with(['barcodes', 'owner'])
+                    ->whereHas('barcodes', function ($query) use ($barcodes) {
+                        $query->whereIn('code', $barcodes);
+                    })->get();
+                if ($ownerIds) {
+                    sort($ownerIds);
+                    $barcodes_ownerIds_md5 = md5(json_encode([$barcodes, $ownerIds]));
+                    return Cache::remember('commodity_' . $barcodes_ownerIds_md5, $time, function () use ($ownerIds) {
+                        return Commodity::query()->whereIn('owner_id', $ownerIds);
+                    });
+                }
+                return $commodities;
+
+            case $status == '只有货主条件':
+                sort($ownerIds);
+                $md5 = md5(json_encode([$ownerIds, $paginate, $page]));
+                $key = 'commodity_' . $md5;
+                $commodities = Cache::get($key);
+                if (is_null($commodities))//如果缓存已失效或者无缓存则重新缓存
+                {
+                    $commodities = Commodity::query()
+                        ->with(['barcodes', 'owner'])
+                        ->whereIn('owner_id', $ownerIds)
+                        ->orderBy('owner_id', 'asc')
+                        ->paginate($paginate, '*', 'page', $page);
+                    Cache::add($key, $commodities->items());
+                    return $commodities;
+                }
+                return $commodities;
         }
     }
 }

+ 20 - 0
app/Services/OracleBasSkuService.php

@@ -71,4 +71,24 @@ Class OracleBasSkuService
         if(!$customer_Ids || !$sku_s){return null;}
         return OracleBasSKU::query()->whereIn('customerid',$customer_Ids)->whereIn('sku',$sku_s)->get();
     }
+    public function getWmsCreatedCommodities($startDate)
+    {
+        if (!$startDate) return null;
+        return OracleBasSKU::query()
+            ->select('customerid','sku','descr_c','alternate_sku1','alternate_sku2','alternate_sku3','skulength','skuwidth','skuhigh','cube','packid','addtime','edittime')
+            ->where('addTime', '>=', $startDate)
+            ->orderByDesc('addtime')
+            ->get();
+    }
+
+    public function getWmsUpdatedCommodities($startDate)
+    {
+        if (!$startDate) return null;
+        return OracleBasSKU::query()
+            ->select('customerid','sku','descr_c','alternate_sku1','alternate_sku2','alternate_sku3','skulength','skuwidth','skuhigh','cube','packid','addtime','edittime')
+            ->where('EditTime', '>=', $startDate)
+            ->whereColumn('EditTime', '<>', 'addTime')
+            ->orderByDesc('EditTime')
+            ->get();
+    }
 }

+ 2 - 0
app/Services/OracleDocAsnHerderService.php

@@ -15,6 +15,7 @@ Class OracleDocAsnHerderService
             }])
             ->select('asnno','asnstatus','asntype','addtime','edittime','customerid','notes','warehouseid','asnreference3')
             ->where('addTime', '>=', $startDate)
+            ->orderByDesc('addtime')
             ->get();
     }
 
@@ -28,6 +29,7 @@ Class OracleDocAsnHerderService
             ->select('asnno','asnstatus','asntype','addtime','edittime','customerid','notes','warehouseid','asnreference3')
             ->where('EditTime', '>=', $startDate)
             ->whereColumn('EditTime', '<>', 'addTime')
+            ->orderByDesc('EditTime')
             ->get();
         return $oracleDocAsnHerder;
     }

+ 0 - 1
app/Services/OrderService.php

@@ -916,7 +916,6 @@ class OrderService
         $owner_map = $dataHandlerService->dataHeader(['code'],$owners);
         $logistic_map = $dataHandlerService->dataHeader(['code'],$logistics);
         $shop_map = $dataHandlerService->dataHeader(['name','owner_id'],$shops);
-        $batch_map = $dataHandlerService->dataHeader(['code'],$batches);
         $collect = collect();
         $date = (string)Carbon::now();
         foreach ($orders as $order) {

+ 98 - 72
app/Services/RejectedBillService.php

@@ -11,19 +11,22 @@ use Carbon\Carbon;
 
 Class RejectedBillService
 {
-    private function conditionQuery(array $params){
+    private function conditionQuery(array $params)
+    {
         $query = RejectedBill::query();
-        if ($params['order_number'] ?? false){
-            $query->whereIn('order_number',$params['order_number']);
+        if ($params['order_number'] ?? false) {
+            $query->whereIn('order_number', $params['order_number']);
         }
         return $query;
     }
 
-    public function get(array $params){
+    public function get(array $params)
+    {
         return $this->conditionQuery($params)->get();
     }
 
-    public function create(array $params){
+    public function create(array $params)
+    {
         return RejectedBill::query()->create($params);
     }
 
@@ -33,108 +36,131 @@ Class RejectedBillService
          * @var OrderIssue $orderIssue
          */
         $orderIssue = $rejectedBill->orderIssue()->first();
-        if(!$orderIssue && $rejectedBill['logistic_number'] === '原单退回'){   // 原单退回
-            $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($rejectedBill){
-                $query->where('client_code',$rejectedBill['order_number']);
+        if (!$orderIssue && $rejectedBill['logistic_number'] === '原单退回') {   // 原单退回
+            $orderIssue = OrderIssue::query()->with('order')->whereHas('order', function ($query) use ($rejectedBill) {
+                $query->where('client_code', $rejectedBill['order_number']);
             })->first();
-        }else if(!$orderIssue  && isset($rejectedBill->logistic_number_return)){
-            $orderIssue = OrderIssue::query()->with('order.packages')->whereHas('order.packages',function($query)use($rejectedBill){
-                $query->where('logistic_number',$rejectedBill->logistic_number_return);
+        } else if (!$orderIssue && isset($rejectedBill->logistic_number_return)) {
+            $orderIssue = OrderIssue::query()->with('order.packages')->whereHas('order.packages', function ($query) use ($rejectedBill) {
+                $query->where('logistic_number', $rejectedBill->logistic_number_return);
             })->first();
         }
-        if(!isset($orderIssue)){ // 没有对应的问题发货订单
-            $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($rejectedBill){
-                $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$rejectedBill->logistic_number_return)->first();
+        if (!isset($orderIssue)) { // 没有对应的问题发货订单
+            $orderHeader = OracleDOCOrderHeader::query()->where('soreference1', function ($query) use ($rejectedBill) {
+                $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3', $rejectedBill->logistic_number_return)->first();
             })->first();
 //                $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($rejectedBill){
 //                    $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$rejectedBill->logistic_number_return)->first();
 //                })->first();
-            if(!isset($orderHeader))return;
-            $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderHeader){
-                $query->where('code',$orderHeader->orderno);
+            if (!isset($orderHeader)) return;
+            $orderIssue = OrderIssue::query()->with('order')->whereHas('order', function ($query) use ($orderHeader) {
+                $query->where('code', $orderHeader->orderno);
             })->first();
         }
-        if(isset($orderIssue)){
+        if (isset($orderIssue)) {
             // 更新问题件的退回单号
-            if($orderIssue['logistic_number_return']!=$rejectedBill['logistic_number_return'])
-                $orderIssue->update(['logistic_number_return'=>$rejectedBill['logistic_number_return']]);
+            if ($orderIssue['logistic_number_return'] != $rejectedBill['logistic_number_return'])
+                $orderIssue->update(['logistic_number_return' => $rejectedBill['logistic_number_return']]);
             //确认问题件有的时候需要更新状态和提示
             $orderIssue->同步退单状态();
             $orderIssue->update(['is_new_rejecting' => '有']);
-            app('LogService')->log(__METHOD__,__FUNCTION__,'退回单同步问题件'.json_encode($rejectedBill).json_encode($orderIssue));
+            app('LogService')->log(__METHOD__, __FUNCTION__, '退回单同步问题件' . json_encode($rejectedBill) . json_encode($orderIssue));
         }
     }
-    public function syncLoadedStatusByAsnHerder($asnHerders){
-        if ($asnHerders->isEmpty())return null;
-        $updateCollect=$this->getUpdateCollect($asnHerders);
-        if ($updateCollect->isEmpty())return null;
-        $logisticNumberReturn=$this->getLogisticNumberReturn($updateCollect);
-        $rejectedBills=$this->getRejectedBills($logisticNumberReturn);
-        if ($rejectedBills->isEmpty())return null;
+
+    public function syncLoadedStatusByAsnHerder($asnHerders)
+    {
+        $updateParams=$this->getNeedUpdateLoadedStatusByWms($asnHerders);
+        if (!$updateParams)return;
+        if (count($updateParams) > 1) {
+            $this->batchUpdate($updateParams);
+        }
+    }
+
+    public function getNeedUpdateLoadedStatusByWms($asnHerders)
+    {
+        if ($asnHerders->isEmpty()) return null;
+        $updateCollect = $this->getUpdateCollect($asnHerders);
+        if ($updateCollect->isEmpty()) return null;
+        $logisticNumberReturn = $this->getLogisticNumberReturn($updateCollect);
+        $rejectedBills = $this->getRejectedBills($logisticNumberReturn);
+        if ($rejectedBills->isEmpty()) return null;
         $updateParams = [[
-            'logistic_number_return','is_loaded','updated_at'
+            'logistic_number_return', 'is_loaded', 'updated_at'
         ]];
-        $updated_at=Carbon::now()->toDateTimeString();
+        $updated_at = Carbon::now()->toDateTimeString();
         /** @var DataHandlerService $dataHandlerService */
-        $dataHandlerService =  app(DataHandlerService::class);
-        $rejectedBills_map =  $dataHandlerService->dataHeader(['logistic_number_return'],$rejectedBills);
-        foreach ($updateCollect as $data){
-            if(!$data->asnreference3&&!$data->notes){continue;}
-            $result=[];
-            if ($data->asnreference3){
-                $rejectedBill=$dataHandlerService->getKeyValue(['logistic_number_return'=>$data->asnreference3],$rejectedBills_map);
-                if ($rejectedBill&&$rejectedBill->is_loaded!=1) $updateParams[] = [
-                    'logistic_number_return'=>$data->asnreference3,
+        $dataHandlerService = app(DataHandlerService::class);
+        $rejectedBills_map = $dataHandlerService->dataHeader(['logistic_number_return'], $rejectedBills);
+        foreach ($updateCollect as $data) {
+            if (!$data->asnreference3 && !$data->notes) {
+                continue;
+            }
+            $result = [];
+            if ($data->asnreference3) {
+                $rejectedBill = $dataHandlerService->getKeyValue(['logistic_number_return' => $data->asnreference3], $rejectedBills_map);
+                if ($rejectedBill && $rejectedBill->is_loaded != 1) $updateParams[] = [
+                    'logistic_number_return' => $data->asnreference3,
                     'is_loaded' => 1,
-                    'updated_at' =>$updated_at,
+                    'updated_at' => $updated_at,
                 ];
-            }else{
-                preg_match("/[a-zA-Z]{0,5}\d{6,20}/",$data->notes, $result);
-                $rejectedBill=$dataHandlerService->getKeyValue(['logistic_number_return'=>$result[0]],$rejectedBills_map);
-                if ($rejectedBill&&$rejectedBill->is_loaded!=1) $updateParams[] = [
-                    'logistic_number_return'=>$result[0],
+            } else {
+                preg_match("/[a-zA-Z]{0,5}\d{6,20}/", $data->notes, $result);
+                if (count($result)<1) continue;
+                $rejectedBill = $dataHandlerService->getKeyValue(['logistic_number_return' => $result[0]], $rejectedBills_map);
+                if ($rejectedBill && $rejectedBill->is_loaded != 1) $updateParams[] = [
+                    'logistic_number_return' => $result[0],
                     'is_loaded' => 1,
-                    'updated_at' =>$updated_at,
+                    'updated_at' => $updated_at,
                 ];
-                $result=[];
+                $result = [];
             }
         }
-        if(count($updateParams) > 1){
-            $this->batchUpdate($updateParams);
-        }
+        return $updateParams;
     }
-    public function getUpdateCollect($asnHerders){
-        $updateCollect=collect();
-        foreach ($asnHerders as $asnHerder){
-            if (($asnHerder->asnType->codename_c=='退货入库'
-                    || $asnHerder->asnType->codename_c=='其他入库')
-                &&$asnHerder->asnStatus->codename_c=='完全收货'){
+    public function getUpdateCollect($asnHerders)
+    {
+        $updateCollect = collect();
+        foreach ($asnHerders as $asnHerder) {
+            if (($asnHerder->asnType->codename_c == '退货入库'
+                    || $asnHerder->asnType->codename_c == '其他入库')
+                && ($asnHerder->asnStatus->codename_c == '已入库'
+                    ||$asnHerder->asnStatus->codename_c == 'ASN关闭')) {
                 $updateCollect->add($asnHerder);
             }
         }
         return $updateCollect;
     }
-    public function getLogisticNumberReturn($updateCollect){
-        $logisticNumberReturn=[];
-        foreach ($updateCollect as $data){
-            if(!$data->asnreference3&&!$data->notes){continue;}
-            $result=[];
-            if ($data->asnreference3){
-                array_push($logisticNumberReturn,$data->asnreference3);
-            }else{
-                preg_match("/[a-zA-Z]{0,5}\d{6,20}/",$data->notes, $result);
-                if (count($result)>0)array_push($logisticNumberReturn,$result[0]);
-                $result=[];
+
+    public function getLogisticNumberReturn($updateCollect)
+    {
+        $logisticNumberReturn = [];
+        foreach ($updateCollect as $data) {
+            if (!$data->asnreference3 && !$data->notes) {
+                continue;
+            }
+            $result = [];
+            if ($data->asnreference3) {
+                array_push($logisticNumberReturn, $data->asnreference3);
+            } else {
+                preg_match("/[a-zA-Z]{0,5}\d{6,20}/", $data->notes, $result);
+                if (count($result) > 0) array_push($logisticNumberReturn, $result[0]);
+                $result = [];
             }
         }
         return $logisticNumberReturn;
     }
 
-    public function batchUpdate($params){
-        return app(BatchUpdateService::class)->batchUpdate('rejected_bills',$params);
+    public function batchUpdate($params)
+    {
+        return app(BatchUpdateService::class)->batchUpdate('rejected_bills', $params);
     }
-    public function getRejectedBills(array $logisticNumberReturn){
-        if(count($logisticNumberReturn)<1){return null;}
-        return RejectedBill::query()->whereIn('logistic_number_return',$logisticNumberReturn)->get();
+
+    public function getRejectedBills(array $logisticNumberReturn)
+    {
+        if (count($logisticNumberReturn) < 1) {
+            return null;
+        }
+        return RejectedBill::query()->whereIn('logistic_number_return', $logisticNumberReturn)->get();
     }
 }

+ 21 - 9
app/Services/StoreItemService.php

@@ -18,14 +18,17 @@ Class StoreItemService
 
     public function storeItemCreateByWms($asnHerders)
     {
-        if ($asnHerders->isEmpty()) return null;
+        if (!$asnHerders) return null;
         $asnDetails = $this->getAsnDetailsByAsnHerder($asnHerders);
         $this->createStoreItem($asnDetails);
     }
 
     public function storeItemUpdateByWms($asnHerders)
     {
-        if ($asnHerders->isEmpty()) return null;
+        if (!$asnHerders) return null;
+//        if (count($KSRK)>0) $asnHerders=$asnHerders->filter(function ($asnHerder)use($KSRK){
+//            return !in_array($asnHerder->asnno,$KSRK);
+//        });
         $asnDetails = $this->getAsnDetailsByAsnHerder($asnHerders);
         $this->updateStoreItem($asnDetails);
     }
@@ -43,16 +46,18 @@ Class StoreItemService
 
     public function createStoreItem($asnDetails)
     {
+
         if ($asnDetails->isEmpty()) return null;
         ini_set('memory_limit','512M');
         $stores = Store::query()->whereIn('asn_code', array_unique(data_get($asnDetails, '*.asnno')))->get();
         $store_asn_code_map = [];
+
         foreach ($stores as $store) {
             $store_asn_code_map[$store->asn_code] = $store;
         }
         $params = $this->getParamsByAsnDetails($asnDetails, $store_asn_code_map);
         if (count($params) > 0) {
-                $this->insertStoreItem($params);
+            $this->insertStoreItem($params);
         }
     }
 
@@ -67,15 +72,19 @@ Class StoreItemService
             $storeItem = $dataHandlerService
                 ->getKeyValue(['store_asn_code' => $asnDetail->asnno, 'asn_line_code' => $asnDetail->asnlineno, 'sku' => $asnDetail->sku], $storeItem_map);
             if ($storeItem ?? false) continue;
+            $status=null;
+            if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c=='完全收货') $status='已入库';
+            if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c=='订单创建') $status='未入库';
+            //if (empty($store_asn_code_map[$asnDetail->asnno])) continue;
             $params[] = [
                 'store_id' => $store_asn_code_map[$asnDetail->asnno]['id'],
-                'asn_line_code' => $asnDetail->asnlineno,
+                'asn_line_code' => (string)$asnDetail->asnlineno,
                 'name' => $asnDetail->skudescrc,
                 'sku' => $asnDetail->sku,
                 'barcode' => $asnDetail->basSku ? $asnDetail->basSku->alternate_sku1 : '',
                 'amount' => $asnDetail->receivedqty ?? 0,
                 'quality' => $asnDetail->qualityStatus ? $asnDetail->qualityStatus->codename_c : '',
-                'status' => $asnDetail->lineStatus ? $asnDetail->lineStatus->codename_c : '',
+                'status' => $status ? $status :$asnDetail->lineStatus->codename_c,
                 'created_at' => $asnDetail->addtime ?? null,
                 'updated_at' => $asnDetail->edittime ?? null,
             ];
@@ -104,7 +113,7 @@ Class StoreItemService
         $storeItems = $this->getByWms($asnDetails);
         $asnDetails_map = $dataHandlerService->dataHeader(['asnno', 'asnlineno', 'sku'], $asnDetails);
         $updateParams = [[
-           /* 'id',*/ 'store_id', 'asn_line_code', 'name', 'sku', 'barcode', 'amount', 'quality', 'status', 'created_at', 'updated_at'
+            'id', 'store_id', 'asn_line_code', 'name', 'sku', 'barcode', 'amount', 'quality', 'status', 'created_at', 'updated_at'
         ]];
         $delete_storeItems = [];
         foreach ($storeItems as $storeItem) {
@@ -114,6 +123,9 @@ Class StoreItemService
                 array_push($delete_storeItems, $storeItem);
                 continue;
             }
+            $status=null;
+            if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c=='完全收货') $status='已入库';
+            if ($asnDetail->lineStatus && $asnDetail->lineStatus->codename_c=='订单创建') $status='未入库';
             if ($storeItem->asn_line_code != $asnDetail['asnlineno'] ||
                 $storeItem->name != $asnDetail['skudescrc'] ||
                 $storeItem->sku != $asnDetail['sku'] ||
@@ -124,15 +136,15 @@ Class StoreItemService
                 $storeItem->created_at != $asnDetail['addtime'] ||
                 $storeItem->updated_at != $asnDetail['edittime']) {
                 $updateParams[] = [
-                   /* 'id' => $storeItem->id,*/
+                    'id' => $storeItem->id,
                     'store_id' => $storeItem->store->id,
-                    'asn_line_code' => $asnDetail['asnlineno'],
+                    'asn_line_code' => (string)$asnDetail['asnlineno'],
                     'name' => $asnDetail['skudescrc'],
                     'sku' => $asnDetail['sku'],
                     'barcode' => $asnDetail['basSku'] ? $asnDetail['basSku']['alternate_sku1'] : '',
                     'amount' => $asnDetail['receivedqty'] ?? 0,
                     'quality' => $asnDetail['qualityStatus'] ? $asnDetail['qualityStatus']['codename_c'] : '',
-                    'status' => $asnDetail['lineStatus'] ? $asnDetail['lineStatus']['codename_c'] : '',
+                    'status' => $status ? $status :$asnDetail['lineStatus']['codename_c'],
                     'created_at' => $asnDetail['addtime'] ?? null,
                     'updated_at' => $asnDetail['edittime'],
                 ];

+ 210 - 95
app/Services/StoreService.php

@@ -6,27 +6,32 @@ use App\Services\common\BatchUpdateService;
 use App\Services\common\DataHandlerService;
 use App\Services\common\QueryService;
 use App\Store;
+use App\ValueStore;
 use Carbon\Carbon;
+use Illuminate\Support\Facades\Cache;
 
 
 Class StoreService
 {
-    private function conditionQuery(array $params){
-        $stores=Store::query()->with(['storeItems.store','warehouse','owner'])->whereNotIn('stored_method',['快速入库','正常'])->orderBy('id','DESC');
-        $columnQueryRules=[
+    private function conditionQuery(array $params)
+    {
+        $stores = Store::query()->with(['storeItems.store', 'warehouse', 'owner'])->whereNotIn('stored_method', ['快速入库', '正常'])->orderBy('id', 'DESC');
+        $columnQueryRules = [
             'asn_code' => ['like' => ''],
-            'created_at_start' => ['alias' => 'created_at' , 'startDate' => ' 00:00:00'],
-            'created_at_end' => ['alias' => 'created_at' , 'endDate' => ' 23:59:59'],
+            'created_at_start' => ['alias' => 'created_at', 'startDate' => ' 00:00:00'],
+            'created_at_end' => ['alias' => 'created_at', 'endDate' => ' 23:59:59'],
             'owner_id' => ['multi' => ','],
             'warehouse_id' => ['multi' => ','],
             'status' => ['multi' => ','],
             'stored_method' => ['multi' => ','],
             'id' => ['multi' => ',']
         ];
-        $stores = app(QueryService::class)->query($params,$stores,$columnQueryRules,'stores');
+        $stores = app(QueryService::class)->query($params, $stores, $columnQueryRules, 'stores');
         return $stores;
     }
-    public function paginate(array $params){
+
+    public function paginate(array $params)
+    {
         return $this->conditionQuery($params)->paginate($params['paginate'] ?? 50);
     }
 
@@ -35,179 +40,289 @@ Class StoreService
         return Store::query()->create($params);
     }
 
-    public function syncWmsAsnData($startDate)
+    public function storeCreateByWms()
     {
-        $this->storeCreateByWms($startDate);
-        $this->storeUpdateByWms($startDate);
-    }
+        $created_at = config('sync.asn_sync.created_at');
+        $create_set = config('sync.asn_sync.cache_prefix.create_set');
+        $create_keys = config('sync.asn_sync.cache_prefix.create_keys');
+        $create_key = config('sync.asn_sync.cache_prefix.create');
 
-    public function storeCreateByWms($startDate)
-    {
         /** @var OracleDocAsnHerderService $oracleDocAsnHerderService */
         $oracleDocAsnHerderService = app(OracleDocAsnHerderService::class);
-        $asnHerders = $oracleDocAsnHerderService->getWmsAsnOnStartDateCreate($startDate);
+        $last_time = $this->getAsnLastSyncAt($created_at, 'create');
+        $asnHerders = $oracleDocAsnHerderService->getWmsAsnOnStartDateCreate($last_time);
+        $last_time = $asnHerders->first()['addtime'];
+        $last_records = $asnHerders->where('addtime', $last_time);
+        if (!$asnHerders) return;
         $this->createStore($asnHerders);
+        $this->deleteCacheKey($create_set, $create_keys);
+        $this->setLastRecordsByRedis($create_key, $create_set, $create_keys, $last_records);
+        $this->setAsnLastSyncAt($created_at, $last_time);
     }
 
-    public function storeUpdateByWms($startDate)
+    public function storeUpdateByWms()
     {
+        $updated_at = config('sync.asn_sync.updated_at');
+        $update_set = config('sync.asn_sync.cache_prefix.update_set');
+        $update_keys = config('sync.asn_sync.cache_prefix.update_keys');
+        $update_key = config('sync.asn_sync.cache_prefix.update');
+
         /** @var OracleDocAsnHerderService $oracleDocAsnHerderService */
         $oracleDocAsnHerderService = app(OracleDocAsnHerderService::class);
-        $asnHerders = $oracleDocAsnHerderService->getWmsAsnOnStartDateEdit($startDate);
+        $last_time = $this->getAsnLastSyncAt($updated_at, 'update');
+        $asnHerders = $oracleDocAsnHerderService->getWmsAsnOnStartDateEdit($last_time);
+        $last_time = $asnHerders->first()['edittime'];
+        $last_records = $asnHerders->where('edittime', $last_time);
+        if (!$asnHerders) return;
+        $this->createStore($asnHerders);
         $this->updateStore($asnHerders);
+        $this->deleteCacheKey($update_set, $update_keys);
+        $this->setLastRecordsByRedis($update_key, $update_set, $update_keys, $last_records);
+        $this->setAsnLastSyncAt($updated_at, $last_time);
     }
 
     public function createStore($asnHerders)
     {
-        if ($asnHerders->isEmpty())return null;
+        if (!$asnHerders) return null;
         /**
          * @var OwnerService $ownerService
          * @var WarehouseService $wareHouseService
          */
         $ownerService = app(OwnerService::class);
-        $owners=$ownerService->getByWmsOrders($asnHerders);
-        $wareHouseService=app(WarehouseService::class);
-        $warehouses=$wareHouseService->getByWms($asnHerders);
+        $wareHouseService = app(WarehouseService::class);
+        $owner_codes = [];
+        $warehouse_codes = [];
+        foreach ($asnHerders as $asnHerder) {
+            if (!empty($asnHerder['customerid']))
+                $owner_codes[$asnHerder['customerid']] = $asnHerder['customerid'];
+            if (!empty($asnHerder['warehouseid']))
+                $warehouse_codes[$asnHerder['warehouseid']] = $asnHerder['warehouseid'];
+        }
+        $owners = $ownerService->getOwnerByCodes($owner_codes);
+        $warehouses = $wareHouseService->getWareHouseByCodes($warehouse_codes);
         foreach ($owners as $owner) {
             $owners_code_map[$owner->code] = $owner;
         }
         foreach ($warehouses as $warehouse) {
             $warehouses_code_map[$warehouse->code] = $warehouse;
         }
-
-        $params=$this->getParamsByAsnHeader($asnHerders,$owners_code_map,$warehouses_code_map);
-        if(count($params)> 0){
+        $params = $this->getParamsByAsnHeader($asnHerders, $owners_code_map, $warehouses_code_map);
+        if (count($params) > 0) {
             $this->insertStore($params);
         }
         /** @var StoreItemService $storeItemService */
         $storeItemService = app(StoreItemService::class);
         $storeItemService->storeItemCreateByWms($asnHerders);
         /** @var RejectedBillService $rejectedBillService */
-        $rejectedBillService=app(RejectedBillService::class);
+        $rejectedBillService = app(RejectedBillService::class);
         $rejectedBillService->syncLoadedStatusByAsnHerder($asnHerders);
-        unset($asnHerders,$owners_code_map,$warehouses_code_map);
+        unset($asnHerders, $owners_code_map, $warehouses_code_map);
     }
-    public function getParamsByAsnHeader($asnHerders,$owners_code_map,$warehouses_code_map)
+
+    public function getParamsByAsnHeader($asnHerders, $owners_code_map, $warehouses_code_map)
     {
         $params = [];
-        $stores = Store::query()->whereIn('asn_code',data_get($asnHerders,'*.asnno'))->get();
+        $stores = Store::query()->whereIn('asn_code', data_get($asnHerders, '*.asnno'))->get();
         $store_asn_code_map = [];
         foreach ($stores as $store) {
-            $store_asn_code_map[$store->asn_code]= $store;
+            $store_asn_code_map[$store->asn_code] = $store;
         }
         foreach ($asnHerders as $asnHerder) {
-            if($store_asn_code_map[$asnHerder->asnno] ?? false)continue;
+            if ($store_asn_code_map[$asnHerder->asnno] ?? false) continue;
             $owner = $owners_code_map[$asnHerder->customerid] ?? null;
-            $warehouse=$warehouses_code_map[$asnHerder->warehouseid] ?? null;
+            $warehouse = $warehouses_code_map[$asnHerder->warehouseid] ?? null;
+            $status = null;
+            if ($asnHerder->asnStatus && $asnHerder->asnStatus->codename_c == '完全收货') $status = '已入库';
+            if ($asnHerder->asnStatus && $asnHerder->asnStatus->codename_c == '订单创建') $status = '未入库';
             $params[] = [
                 'asn_code' => $asnHerder->asnno,
-                'warehouse_id' =>$warehouse->id??null,
-                'owner_id' => $owner->id??null,
-                'stored_method' =>$asnHerder->asnType?$asnHerder->asnType->codename_c:'',
-                'status' =>$asnHerder->asnStatus?$asnHerder->asnStatus->codename_c:'',
-                'remark' => $asnHerder->notes??null,
-                'created_at'=>$asnHerder->addtime??null,
-                'updated_at'=>$asnHerder->edittime??null,
+                'warehouse_id' => $warehouse->id ?? null,
+                'owner_id' => $owner->id ?? null,
+                'stored_method' => $asnHerder->asnType ? $asnHerder->asnType->codename_c : '',
+                'status' => $status ? $status : $asnHerder->asnStatus->codename_c,
+                'remark' => $asnHerder->notes ?? null,
+                'created_at' => $asnHerder->addtime ?? null,
+                'updated_at' => $asnHerder->edittime ?? null,
             ];
         }
         return $params;
     }
-    public function insertStore(array $params){
-        if(count($params) === 0) return [];
+
+    public function insertStore(array $params)
+    {
+        if (count($params) === 0) return [];
         try {
             $this->insert($params);
-            LogService::log(__METHOD__,__FUNCTION__,'批量创建 store success'.count($params).json_encode($params));
+            LogService::log(__METHOD__, __FUNCTION__, '批量创建 store success' . count($params) . json_encode($params));
         } catch (\Exception $e) {
-            LogService::log(__METHOD__,__FUNCTION__,'批量创建 store error'.json_encode($params).'||'.$e->getMessage().'||'.$e->getTraceAsString());
+            LogService::log(__METHOD__, __FUNCTION__, '批量创建 store error' . json_encode($params) . '||' . json_encode($e->getMessage()) . '||' . $e->getTraceAsString());
         }
     }
 
     public function updateStore($asnHerders)
     {
-        if(!$asnHerders || $asnHerders->count() == 0){return null;}
-        /** @var DataHandlerService $dataHandlerService */
-        $dataHandlerService =  app(DataHandlerService::class);
+        if (!$asnHerders || $asnHerders->count() == 0) return null;
+        /**
+         * @var DataHandlerService $dataHandlerService
+         * @var OwnerService $ownerService
+         * @var WarehouseService $wareHouseService
+         */
+        $ownerService = app(OwnerService::class);
+        $wareHouseService = app(WarehouseService::class);
+        $dataHandlerService = app(DataHandlerService::class);
         $stores = $this->getByWms($asnHerders);
-        $store_asn_code_map =  $dataHandlerService->dataHeader(['asn_code'],$stores);
-        $owners = app(OwnerService::class)->getByWmsOrders($asnHerders);
-        $owner_code_map = $dataHandlerService->dataHeader(['code'],$owners);
-        $warehouses = app(WarehouseService::class)->getByWms($asnHerders);
-        $warehouses_map = $dataHandlerService->dataHeader(['code'],$warehouses);
+        $store_asn_code_map = $dataHandlerService->dataHeader(['asn_code'], $stores);
+        $owner_codes = [];
+        $warehouse_codes = [];
+        foreach ($asnHerders as $asnHerder) {
+            if (!empty($asnHerder['customerid']))
+                $owner_codes[$asnHerder['customerid']] = $asnHerder['customerid'];
+            if (!empty($asnHerder['warehouseid']))
+                $warehouse_codes[$asnHerder['warehouseid']] = $asnHerder['warehouseid'];
+        }
+        $owners = $ownerService->getOwnerByCodes($owner_codes);
+        $warehouses = $wareHouseService->getWareHouseByCodes($warehouse_codes);
+        $owner_code_map = $dataHandlerService->dataHeader(['code'], $owners);
+        $warehouses_map = $dataHandlerService->dataHeader(['code'], $warehouses);
         $updateParams = [[
-            'id','asn_code','warehouse_id','owner_id','stored_method','status','remark','updated_at'
+            'id', 'asn_code', 'warehouse_id', 'owner_id', 'stored_method', 'status', 'remark', 'updated_at'
         ]];
+//        $KSRK = [];
         foreach ($asnHerders as $asnHerder) {
-            $store =$dataHandlerService->getKeyValue(['asn_code'=>$asnHerder->asnno],$store_asn_code_map);
-            if(!$store){continue;}
-            $owner = $dataHandlerService->getKeyValue(['code'=>$asnHerder->customerid] ,$owner_code_map);
-            $warehouse=$dataHandlerService->getKeyValue(['code'=>$asnHerder->warehouseid],$warehouses_map);
+            $store = $dataHandlerService->getKeyValue(['asn_code' => $asnHerder->asnno], $store_asn_code_map);
+            if (!$store) continue;
+//            if ($store && $store->stored_method == '快速入库') {
+//                array_push($KSRK, $store['asn_code']);
+//                continue;
+//            }
+            $owner = $dataHandlerService->getKeyValue(['code' => $asnHerder->customerid], $owner_code_map);
+            $warehouse = $dataHandlerService->getKeyValue(['code' => $asnHerder->warehouseid], $warehouses_map);
             $owner_id = $owner->id ?? null;
-            $warehouse_id=$warehouse->id??null;
-
-            if( $store->asn_code != $asnHerder->asnno ||
-                $store->warehouse_id!=$warehouse_id ||
+            $warehouse_id = $warehouse->id ?? null;
+            $status = null;
+            if ($asnHerder->asnStatus && $asnHerder->asnStatus->codename_c == '完全收货') $status = '已入库';
+            if ($asnHerder->asnStatus && $asnHerder->asnStatus->codename_c == '订单创建') $status = '未入库';
+            if ($store->asn_code != $asnHerder->asnno ||
+                $store->warehouse_id != $warehouse_id ||
                 $store->owner_id != $owner_id ||
-                $store->stored_method != $asnHerder->asnType->codename_c||
-                $store->status !=$asnHerder->asnStatus->codename_c||
-                $store->remark != $asnHerder->notes){
+                $store->stored_method != $asnHerder->asnType->codename_c ||
+                $store->status != $asnHerder->asnStatus->codename_c ||
+                $store->remark != $asnHerder->notes) {
                 $updateParams[] = [
-                    'id'=>$store->id,
-                    'asn_code'=>$asnHerder->asnno,
-                    'warehouse_id'=>$warehouse_id,
+                    'id' => $store->id,
+                    'asn_code' => $asnHerder->asnno,
+                    'warehouse_id' => $warehouse_id,
                     'owner_id' => $owner_id,
-                    'stored_method' =>$asnHerder->asnType?$asnHerder->asnType->codename_c:'',
-                    'status' =>$asnHerder->asnStatus?$asnHerder->asnStatus->codename_c:'',
+                    'stored_method' => $asnHerder->asnType ? $asnHerder->asnType->codename_c : '',
+                    'status' => $status ? $status : $asnHerder->asnStatus->codename_c,
                     'remark' => $asnHerder->notes,
-                    'updated_at' =>$asnHerder->edittime,
-                    ];
+                    'updated_at' => $asnHerder->edittime,
+                ];
             }
         }
-        if(count($updateParams) > 1) $this->batchUpdate($updateParams);
-        $this->createStore($asnHerders);
+        if (count($updateParams) > 1) $this->batchUpdate($updateParams);
         /** @var StoreItemService $storeItemService */
         $storeItemService = app(StoreItemService::class);
         $storeItemService->storeItemUpdateByWms($asnHerders);
         /** @var RejectedBillService $rejectedBillService */
-        $rejectedBillService=app(RejectedBillService::class);
+        $rejectedBillService = app(RejectedBillService::class);
         $rejectedBillService->syncLoadedStatusByAsnHerder($asnHerders);
-        unset($updateParams,$asnHerders);
+        unset($updateParams, $asnHerders);
     }
-    public function insert($params){
+
+    public function insert($params)
+    {
         return Store::query()->insert($params);
     }
-    public function batchUpdate($params){
-        return app(BatchUpdateService::class)->batchUpdate('stores',$params);
+
+    public function batchUpdate($params)
+    {
+        return app(BatchUpdateService::class)->batchUpdate('stores', $params);
+    }
+
+    public function getByWms($asnHerders)
+    {
+        if (!$asnHerders) {
+            return null;
+        }
+        $asn_nos = array_unique(data_get($asnHerders, '*.asnno'));
+        return Store::query()->whereIn('asn_code', $asn_nos)->get();
     }
-    public function getByWms($asnHerders){
-        if(!$asnHerders){return null;}
-        $asn_nos = array_unique(data_get($asnHerders,'*.asnno'));
-        return Store::query()->whereIn('asn_code',$asn_nos)->get();
+
+    public function getAsnLastSyncAt($key, $type)
+    {
+        $last_time = ValueStore::query()->where('name', $key)->value('value');
+        if ($last_time) return $last_time;
+        if ($type == 'create') {
+            $store = Store::query()->orderByDesc('created_at')->first();
+            if ($store) return $store->created_at;
+        } else {
+            $store = Store::query()->orderByDesc('updated_at')->first();
+            if ($store) return $store->updated_at;
+        }
+        return Carbon::now()->subSeconds(65);
     }
 
-    public function createInstantBill(Store $store):bool
+    public function setAsnLastSyncAt($key, $last_time)
     {
-        if (!$store || $store->status!="已入库")return false;
-        $store->loadMissing("storeItems");
+        $asnLastSyncAt = ValueStore::query()->updateOrCreate([
+            'name' => $key,
+        ], [
+            'name' => $key,
+            'value' => $last_time,
+        ]);
+        LogService::log(__METHOD__, __FUNCTION__, '修改或更新' . $key . json_encode($asnLastSyncAt));
+        return $asnLastSyncAt;
+    }
+
+    public function deleteCacheKey($set, $keys)
+    {
+        if (Cache::get($set)) {
+            $cacheKeys = Cache::get($keys);
+            if (!$cacheKeys) return;
+            foreach ($cacheKeys as $cacheKey) {
+                Cache::forget($cacheKey);
+            }
+            Cache::forget($keys);
+        }
+    }
+
+    public function setLastRecordsByRedis($prefixKey, $set, $keys, $last_records)
+    {
+        $cacheKeys = [];
+        foreach ($last_records as $last_record) {
+            Cache::put($prefixKey . $last_record->customerid . '_' . $last_record->asnno, true);
+            array_push($cacheKeys, $prefixKey . $last_record->customerid . '_' . $last_record->asnno);
+        }
+        Cache::put($keys, $cacheKeys);
+        Cache::put($set, true);
+    }
+
+    public function createInstantBill(Store $store): bool
+    {
+        if (!$store || $store->status != "已入库") return false;
+        if (!$store->storeItems) $store->load("storeItems");
+
 
         /** @var OwnerPriceOperationService $service */
         $service = app("OwnerPriceOperationService");
 
-        $mapping = ["packages"=>"storeItems","商品名称"=>"name","订单类型"=>"stored_method"];
+        $mapping = ["packages" => "storeItems", "商品名称" => "name", "订单类型" => "stored_method"];
 
-        $work_fee = $service->matchRule($store,$mapping,$store->owner_id,"入库");
-        if ($work_fee < 0)$work_fee = null;
+        $work_fee = $service->matchRule($store, $mapping, $store->owner_id, "入库");
+        if ($work_fee < 0) $work_fee = null;
 
         if (app("OwnerFeeDetailService")->create([
-            "owner_id"          => $store->owner_id,
-            "worked_at"         => $store->created_at,
-            "type"              => "收货",
-            "operation_bill"    => $store->asn_code,
-            "commodity_amount"  => array_sum(array_column($store->storeItems->toArray(),"amount")),
-            "work_fee"          => $work_fee,
-            "created_at"        => date('Y-m-d H:i:s'),
-            "outer_id"          => $store->id,
-            "outer_table_name"  => "stores",
-        ]))return true;
+            "owner_id" => $store->owner_id,
+            "worked_at" => $store->created_at,
+            "type" => "收货",
+            "operation_bill" => $store->asn_code,
+            "commodity_amount" => array_sum(array_column($store->storeItems->toArray(), "amount")),
+            "work_fee" => $work_fee,
+            "created_at" => date('Y-m-d H:i:s'),
+            "outer_id" => $store->id,
+            "outer_table_name" => "stores",
+        ])) return true;
         return false;
     }
 }

+ 1 - 37
app/Services/WarehouseService.php

@@ -65,42 +65,6 @@ Class WarehouseService
         }
         return  $collet;
     }
-    public function getByWms($asnHerders)
-    {
-        $warehouseids = array_unique(data_get($asnHerders, '*.warehouseid'));
-        $warehouseids = array_diff($warehouseids, [null, '', '*']);
-        $warehouses = Warehouse::query()->whereIn('code', $warehouseids)->get();
-        if ($warehouses->count() < count($warehouseids)) {
-            $warehouseids = array_diff($warehouseids, data_get($warehouses, '*.code'));
-            $warehouse_list = $this->createWarehouseByWms($warehouseids);
-            $warehouses=$warehouses->concat($warehouse_list);
-        }
-        return $warehouses;
-    }
-
-    public function createWarehouseByWms($codes)
-    {
-        if(!$codes) {return [];}
-        $insert_params = [];
-        $created_at = Carbon::now()->format('Y-m-d H:i:s');
-        foreach ($codes as $item) {
-            $insert_params[] = [
-                'code' => $item,
-                'name' => $item,
-                'created_at' => $created_at,
-            ];
-        }
-        try {
-            if (count($insert_params) > 0) {
-                $this->insert($insert_params);
-                LogService::log(__METHOD__, __FUNCTION__, '批量创建 warehouse success' . count($insert_params) . json_encode($insert_params) );
-            }
-        } catch (\Exception $e) {
-            LogService::log(__METHOD__, __FUNCTION__, '批量创建 warehouse error' . json_encode($insert_params) . '||' . $e->getMessage() . '||' . $e->getTraceAsString());
-        } finally {
-            return Warehouse::query()->whereIn('code', $codes)->get();
-        }
-    }
     public function insert($fillables){
         return Warehouse::query()->insert($fillables);
     }
@@ -116,7 +80,7 @@ Class WarehouseService
     }
 
     public function getWareHouseByCode($code){
-        return Cache::remember("WareHouse_{$code}",config('database.cache.expirations.forever'),function()use($code){
+        return Cache::remember("WareHouse_{$code}",config('cache.expirations.warehouse'),function()use($code){
             $wareHouse =  Warehouse::query()->where('code',$code)->first();
             if($wareHouse)return $wareHouse;
             $bas_customer = app('OracleBasCustomerService')->first(['CustomerId'=>$code,'Customer_Type'=>'WH']);

+ 1 - 1
app/Store.php

@@ -12,7 +12,7 @@ class Store extends Model
     use SoftDeletes;
 
     protected $fillable=[
-        'asn_code','warehouse_id','owner_id','stored_method','status','remark','deleted_at'
+        'asn_code','warehouse_id','owner_id','stored_method','status','remark','deleted_at','is_fast_stored'
     ];
 
 //    protected $appends=[

+ 24 - 0
config/sync.php

@@ -7,6 +7,30 @@ return [
     'asn_sync' => [
         'interval' => 1,   // 时间以分为单位
         'start_at'=> '',    // 开始同步WMS的时间  时间格式: yyyy-MM-dd HH:mm:ss 如 2020-09-05 13:15:16
+        'created_at'=>'asn_last_created_sync_at',
+        'updated_at'=>'asn_last_updated_sync_at',
+        'cache_prefix'=>[
+            'create_set'=>'asn_create_has_set',
+            'create_keys'=>'asn_create_keys',
+            'create'=>'asn_create_',
+            'update_set'=>'asn_update_has_set',
+            'update_keys'=>'asn_update_keys',
+            'update'=>'asn_update_',
+        ]
+    ],
+    'commodity_sync' => [
+        'interval' => 1,   // 时间以分为单位
+        'start_at'=> '',    // 开始同步WMS的时间  时间格式: yyyy-MM-dd HH:mm:ss
+        'created_at'=>'commodity_last_created_sync_at',
+        'updated_at'=>'commodity_last_updated_sync_at',
+        'cache_prefix'=>[
+            'create_set'=>'commodity_create_has_set',
+            'create_keys'=>'commodity_create_keys',
+            'create'=>'commodity_create_',
+            'update_set'=>'commodity_update_has_set',
+            'update_keys'=>'commodity_update_keys',
+            'update'=>'commodity_update_',
+        ]
     ],
     'order_sync' => [
         'enabled' => true,

+ 1 - 1
database/migrations/2020_10_27_142647_create_owner_storage_price_model_table.php → database/migrations/2020_10_27_142647_create_owner_storage_price_models_table.php

@@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration;
 use Illuminate\Database\Schema\Blueprint;
 use Illuminate\Support\Facades\Schema;
 
-class CreateOwnerStoragePriceModelTable extends Migration
+class CreateOwnerStoragePriceModelsTable extends Migration
 {
     /**
      * Run the migrations.

+ 32 - 0
database/migrations/2020_12_10_113555_add_stores_is_fast_stored_column.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddStoresIsFastStoredColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('stores',function (Blueprint $table){
+            $table->enum('is_fast_stored',['无','快速入库'])->default('无')->comment('是否为快数入库');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('stores',function (Blueprint $table){
+            $table->dropColumn('is_fast_stored');
+        });
+    }
+}

+ 1 - 1
package-lock.json

@@ -8845,7 +8845,7 @@
         },
         "socket.io-client": {
             "version": "2.3.0",
-            "resolved": "https://registry.npm.taobao.org/socket.io-client/download/socket.io-client-2.3.0.tgz",
+            "resolved": "https://registry.npm.taobao.org/socket.io-client/download/socket.io-client-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsocket.io-client%2Fdownload%2Fsocket.io-client-2.3.0.tgz",
             "integrity": "sha1-FNW6LgC5vNFFrkQ6uWs/hsvMG7Q=",
             "requires": {
                 "backo2": "1.0.2",

+ 2 - 2
phpunit.xml

@@ -34,8 +34,8 @@
         <server name="APP_ENV" value="testing"/>
         <server name="BCRYPT_ROUNDS" value="4"/>
         <server name="CACHE_DRIVER" value="redis"/>
-        <!--<server name="DB_CONNECTION" value="sqlite"/>
-        <server name="DB_DATABASE" value=":memory:"/>-->
+        <server name="DB_CONNECTION" value="sqlite"/>
+        <server name="DB_DATABASE" value=":memory:"/>
         <server name="MAIL_DRIVER" value="array"/>
         <server name="QUEUE_CONNECTION" value="sync"/>
         <server name="SESSION_DRIVER" value="array"/>

+ 38 - 14
resources/views/maintenance/commodity/create.blade.php

@@ -6,7 +6,7 @@
         @component('maintenance.menu')@endcomponent
         @component('maintenance.commodity.menu')@endcomponent
     </div>
-    <div class="container-fluid">
+    <div class="container-fluid" id="list">
         <div class="card col-md-8 offset-md-2">
             <div class="card-body">
                 @if(Session::has('successTip'))
@@ -14,11 +14,26 @@
                 @endif
                 <form method="POST" action="{{ url('maintenance/commodity') }}">
                     @csrf
+                    <div class="form-group row">
+                        <label for="owner_name" class="col-2 col-form-label text-right">货主名</label>
+                        <div class="col-9 form-inline">
+                            <select class="form-control form-control-sm col-6 @error('owner_id') is-invalid @enderror" name="owner_id" v-model="owner_id">
+                                <option v-for="owner in owners" :value="owner.id">@{{ owner.name }}</option>
+                            </select>
+                            <input placeholder="搜索货主" @input="seekOwner($event)" class="form-control form-control-sm col-3">
+                            @error('owner_id')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+
                     <div class="form-group row">
                         <label for="sku" class="col-2 col-form-label text-right">SKU</label>
                         <div class="col-8">
                             <input type="text" class="form-control @error('sku') is-invalid @enderror"
-                                   name="sku" autocomplete="off" value="{{ old('sku') }}" >
+                                   name="sku" autocomplete="off" value="{{ old('sku') }}" required>
                             @error('sku')
                             <span class="invalid-feedback" role="alert">
                                 <strong>{{ $message }}</strong>
@@ -50,18 +65,6 @@
                             @enderror
                         </div>
                     </div>
-                    <div class="form-group row">
-                        <label for="owner_name" class="col-2 col-form-label text-right">货主名</label>
-                        <div class="col-8">
-                            <input type="text" class="form-control @error('owner_name') is-invalid @enderror"
-                                   name="owner_name" autocomplete="off" value="{{ old('owner_name') }}" >
-                            @error('owner_name')
-                            <span class="invalid-feedback" role="alert">
-                                <strong>{{ $message }}</strong>
-                            </span>
-                            @enderror
-                        </div>
-                    </div>
                     <div class="form-group row">
                         <div class="col-8 offset-2">
                             <input type="submit" class="btn btn-success form-control">
@@ -72,3 +75,24 @@
         </div>
     </div>
 @endsection
+@section('lastScript')
+    <script>
+        new Vue({
+            el: "#list",
+            data: {
+                owners: {!! $owners !!},
+                owner_id: '',
+            },
+            methods: {
+                seekOwner(e) {
+                    this.owners.some(owner => {
+                        if (owner.name.indexOf(e.target.value) !== -1) {
+                            this.owner_id = owner.id;
+                            return true;
+                        }
+                    });
+                }
+            }
+        });
+    </script>
+@endsection

+ 42 - 13
resources/views/maintenance/commodity/edit.blade.php

@@ -11,7 +11,7 @@
                 </li>
         @endcomponent
     </div>
-    <div class="container-fluid">
+    <div class="container-fluid" id="list">
         <div class="card">
             <div class="card-body">
                 @if(Session::has('successTip'))
@@ -20,6 +20,22 @@
                 <form method="POST" action='{{url("maintenance/commodity/{$commodity->id}")}}'>
                     @csrf
                     @method('PUT')
+                    <div class="form-group row">
+                        <label for="owner_name" class="col-2 col-form-label text-right">货主名</label>
+                        <div class="col-9 form-inline">
+                            <select class="form-control form-control-sm col-6 @error('owner_id') is-invalid @enderror"
+                                    name="owner_id" v-model="owner_id">
+                                <option v-for="owner in owners" :value="owner.id">@{{ owner.name }}</option>
+                            </select>
+                            <input placeholder="搜索货主" @input="seekOwner($event)" class="form-control form-control-sm col-3">
+                            @error('owner_id')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+
                     <div class="form-group row">
                         <label for="sku" class="col-2 col-form-label text-right">SKU</label>
                         <div class="col-8">
@@ -56,18 +72,6 @@
                             @enderror
                         </div>
                     </div>
-                    <div class="form-group row">
-                        <label for="owner_name" class="col-2 col-form-label text-right">货主名</label>
-                        <div class="col-8">
-                            <input type="text" class="form-control @error('owner_name') is-invalid @enderror"
-                                   name="owner_name" autocomplete="off" value="@if(old('owner_name')){{old('owner_name')}}@else{{$commodity->owner_name}}@endif" >
-                            @error('owner_name')
-                            <span class="invalid-feedback" role="alert">
-                                <strong>{{ $message }}</strong>
-                            </span>
-                            @enderror
-                        </div>
-                    </div>
                     <div class="form-group row">
                         <div class="col-8 offset-2">
                             <input type="submit" class="btn btn-outline-dark form-control">
@@ -78,3 +82,28 @@
         </div>
     </div>
 @endsection
+@section('lastScript')
+    <script>
+        new Vue({
+            el: "#list",
+            data: {
+                owners: {!! $owners !!},
+                owner_id: '',
+                commodity:{!! $commodity !!},
+            },
+            mounted(){
+              if (this.commodity.owner_id) this.owner_id=this.commodity.owner_id;
+            },
+            methods: {
+                seekOwner(e) {
+                    this.owners.some(owner => {
+                        if (owner.name.indexOf(e.target.value) !== -1) {
+                            this.owner_id = owner.id;
+                            return true;
+                        }
+                    });
+                }
+            }
+        });
+    </script>
+@endsection

+ 1 - 1
resources/views/personnel/checking-in/importAndExportQRCode.blade.php

@@ -30,7 +30,7 @@
     </div>
 
 
-    <script src="{{ asset('js/app201009.js') }}"></script>
+    <script src="{{ asset('js/app.js') }}"></script>
     <script>
         function computeDiffMicroTime_fromNow(dateComparing) {
             let now=new Date();

+ 1 - 1
resources/views/personnel/checking-in/importAndExportSuccess.blade.php

@@ -27,7 +27,7 @@
         <h5 style="margin-top: 0;color: red">下班登出成功</h5>
     @endif
 </div>
-<script src="{{ asset('js/app201009.js') }}"></script>
+<script src="{{ asset('js/app.js') }}"></script>
 <script>
     new Vue({
         el:'#page',

+ 1 - 1
resources/views/personnel/checking-in/success.blade.php

@@ -16,7 +16,7 @@
         <h5 v-else style="margin-top: 0;color: red">等待组长确认登入,请勿关闭:<span id="_lefttime" ></span></h5>
     </div>
 </div>
-<script src="{{ asset('js/app201009.js') }}"></script>
+<script src="{{ asset('js/app.js') }}"></script>
 <script>
     new Vue({
         el:'#page',

+ 55 - 0
tests/Services/CommodityBarcodeService/CreateBarcodeByWmsTest.php

@@ -0,0 +1,55 @@
+<?php
+
+
+namespace Tests\Services\CommodityBarcodeService;
+
+
+use App\OracleBasSKU;
+use App\Services\CommodityBarcodeService;
+use App\ValueStore;
+use Tests\TestCase;
+
+class CreateBarcodeByWmsTest extends TestCase
+{
+
+    /**
+     * @var CommodityBarcodeService $service
+     */
+    public $service;
+    public $bas_skus;
+    public $created_at;
+    public $commodityBarcodes;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->created_at = config('sync.commodity_sync.created_at');
+        $last_time = ValueStore::query()->where('name', $this->created_at)->value('value');
+        $startDate = \Illuminate\Support\Carbon::now()->subSeconds(65);
+        $this->service = app(CommodityBarcodeService::class);
+        $this->bas_skus = OracleBasSKU::query()
+            ->select('customerid', 'sku', 'descr_c', 'alternate_sku1', 'alternate_sku2', 'alternate_sku3', 'skulength', 'skuwidth', 'skuhigh', 'cube', 'packid', 'addtime', 'edittime')
+            ->where('addTime', '>=', $last_time ?? $startDate)
+            ->orderByDesc('addtime')
+            ->get();
+
+    }
+
+    public function testCreateBarcodeByWms()
+    {
+
+        if ($this->bas_skus->isEmpty()) {
+            $this->assertEmpty($this->bas_skus);
+            return;
+        }
+        $this->service->createBarcodeByWms($this->bas_skus);
+        $this->commodityBarcodes=$this->service->getByWms($this->bas_skus);
+        if ($this->commodityBarcodes) $this->assertNotNull($this->commodityBarcodes);
+    }
+
+
+    public function tearDown(): void
+    {
+
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 55 - 0
tests/Services/CommodityBarcodeService/GetByWmsTest.php

@@ -0,0 +1,55 @@
+<?php
+
+
+namespace Tests\Services\CommodityBarcodeService;
+
+
+use App\OracleBasSKU;
+use App\Services\CommodityBarcodeService;
+use App\ValueStore;
+use Tests\TestCase;
+
+class GetByWmsTest extends TestCase
+{
+
+    /**
+     * @var CommodityBarcodeService $service
+     */
+    public $service;
+    public $bas_skus;
+    public $created_at;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->created_at = config('sync.commodity_sync.created_at');
+        $last_time = ValueStore::query()->where('name',$this->created_at)->value('value');
+        $startDate = \Illuminate\Support\Carbon::now()->subSeconds(65);
+        $this->service = app(CommodityBarcodeService::class);
+        $this->bas_skus = OracleBasSKU::query()
+            ->select('customerid', 'sku', 'descr_c', 'alternate_sku1', 'alternate_sku2', 'alternate_sku3', 'skulength', 'skuwidth', 'skuhigh', 'cube', 'packid', 'addtime', 'edittime')
+            ->where('addTime', '>=', $last_time??$startDate)
+            ->orderByDesc('addtime')
+            ->get();
+    }
+
+
+    public function testGetByWms()
+    {
+        if ($this->bas_skus->isEmpty()) {
+            $this->assertEmpty($this->bas_skus);
+            return;
+        }
+        $commodities=$this->service->getByWms($this->bas_skus);
+        if ($commodities) {
+            $this->assertNotNull($commodities);
+        }else{
+            $this->assertNull($commodities);
+        }
+    }
+
+
+    public function tearDown(): void
+    {
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 39 - 0
tests/Services/CommodityService/GetAsnSyncAtTest.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace Tests\Services\CommodityService;
+
+use App\Services\CommodityService;
+use Tests\TestCase;
+
+class GetAsnSyncAtTest extends TestCase
+{
+    /**
+     * @var CommodityService $service
+     */
+    private $service;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app(CommodityService::class);
+    }
+
+    /**
+     * @test
+     */
+    public function getCreatedAsnSyncAt()
+    {
+        $key = config('sync.asn_sync.created_at');
+        $data = $this->service->getAsnLastSyncAt($key,'create');
+        $this->assertNotEmpty($data);
+    }
+
+    /**
+     * @test
+     */
+    public function getUpdatedAsnSyncAt()
+    {
+        $key = config('sync.asn_sync.updated_at');
+        $data = $this->service->getAsnLastSyncAt($key,'update');
+        $this->assertNotEmpty($data);
+    }
+}

+ 45 - 0
tests/Services/CommodityService/GetParamsByBasSkusTest.php

@@ -0,0 +1,45 @@
+<?php
+
+
+namespace Tests\Services\CommodityService;
+
+
+use App\OracleBasSKU;
+use App\Services\CommodityService;
+use App\Services\OwnerService;
+use App\Store;
+use Tests\TestCase;
+
+class GetParamsByBasSkusTest extends TestCase
+{
+    /**
+     * @var CommodityService $service
+     * @var OwnerService $ownerService
+     *
+     */
+    public $service;
+    public $bas_skus;
+    public $ownerService;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $startDate = \Illuminate\Support\Carbon::now()->subSeconds(300);
+        $this->service=app(CommodityService::class);
+        $this->ownerService=app(OwnerService::class);
+        $this->bas_skus=OracleBasSKU::query()
+            ->select('customerid','sku','descr_c','alternate_sku1','alternate_sku2','alternate_sku3','skulength','skuwidth','skuhigh','cube','packid','addtime','edittime')
+            ->where('addTime', '>=', $startDate)
+            ->orderByDesc('addtime')
+            ->get();
+    }
+    public function testGetParamsByBasSkus(){
+        if ($this->bas_skus->isEmpty()) {
+            $this->assertEmpty($this->bas_skus);
+            $insert_params=$this->service->getParamsByBasSkus($this->bas_skus);
+            $this->assertNull($insert_params);
+        }else{
+            $insert_params=$this->service->getParamsByBasSkus($this->bas_skus);
+            $this->assertNotNull($insert_params);
+        }
+    }
+}

+ 52 - 0
tests/Services/CommodityService/SetAsnSyncAtTest.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace Tests\Services\CommodityService;
+
+use App\Services\OrderService;
+use App\Services\StoreService;
+use App\ValueStore;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Illuminate\Support\Str;
+use Tests\TestCase;
+
+class SetAsnSyncAtTest extends TestCase
+{
+    /** @var StoreService $service */
+    private $service;
+    private $created_at;
+    private $original_value;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app(StoreService::class);
+        $this->created_at = config('sync.asn_sync.created_at');
+    }
+
+    /**
+     * @test
+     */
+    public function testSetAsnSyncAt()
+    {
+        /** @var Carbon $time */
+
+        $data = Carbon::now();
+        $this->original_value=ValueStore::query()->where('name',$this->created_at)->value('value');
+
+        $this->service->setAsnLastSyncAt($this->created_at,$data);
+        $value=ValueStore::query()->where('name',$this->created_at)->value('value');
+        $this->assertEquals((string)$data,(string)$value);
+    }
+
+    public function tearDown(): void
+    {
+        ValueStore::query()->updateOrCreate([
+            'name' => $this->created_at,
+        ], [
+            'name' => $this->created_at,
+            'value' => $this->original_value,
+        ]);
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 75 - 0
tests/Services/CommodityService/SyncCommodityCreatedTest.php

@@ -0,0 +1,75 @@
+<?php
+
+namespace Tests\Services\CommodityService;
+
+use App\Commodity;
+use App\OracleBasSKU;
+use App\Services\CommodityService;
+use App\Services\OwnerService;
+use App\ValueStore;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\DB;
+use Tests\TestCase;
+
+class SyncCommodityCreatedTest extends TestCase
+{
+    /**
+     * @var CommodityService $service
+     */
+    public $service;
+    public $bas_skus;
+    public $created_at;
+    public $last_time;
+    public $insert_params;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service=app(CommodityService::class);
+    }
+
+    /**
+     * @test
+     */
+    public function testSyncCommodityCreated()
+    {
+        $this->created_at = config('sync.commodity_sync.created_at');
+        $this->last_time = ValueStore::query()->where('name',$this->created_at)->value('value');
+        if (!$this->last_time) $time=Carbon::now()->subSeconds(65);
+        $this->bas_skus=OracleBasSKU::query()
+            ->select('customerid','sku','descr_c','alternate_sku1','alternate_sku2','alternate_sku3','skulength','skuwidth','skuhigh','cube','packid','addtime','edittime')
+            ->where('addTime', '>=', $this->last_time??$time)
+            ->orderByDesc('addtime')
+            ->get();
+        $this->insert_params=$this->service->getParamsByBasSkus($this->bas_skus);
+        $this->service->syncCommodityCreated();
+        if ($this->insert_params) $this->assertNotNull($this->insert_params);
+        if ($this->insert_params)$this->assertEquals(count($this->insert_params),count($this->bas_skus));
+        if (!$this->insert_params)$this->assertNull($this->insert_params);
+    }
+
+    public function tearDown(): void
+    {
+        ValueStore::query()->updateOrCreate([
+            'name' => $this->created_at,
+        ], [
+            'name' => $this->created_at,
+            'value' => $this->last_time,
+        ]);
+        $sku=[];
+        $owner_id=[];
+        if (!$this->insert_params) return;
+        foreach ($this->insert_params as $insert_param){
+            $owner_id[]=$insert_param['owner_id'];
+            $sku[]=$insert_param['sku'];
+        }
+        $commodities=Commodity::query()->whereIn('owner_id',$owner_id)->whereIn('sku',$sku)->get();
+        $commodity_id=[];
+        foreach ($commodities as $commodity){
+            $commodity_id[]=$commodity->id;
+        }
+        DB::table('commodities')->whereIn('id',$commodity_id)->delete();
+        DB::table('commodity_barcodes')->whereIn('commodity_id',$commodity_id)->delete();
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 102 - 0
tests/Services/CommodityService/SyncCommodityUpdatedTest.php

@@ -0,0 +1,102 @@
+<?php
+
+namespace Tests\Services\CommodityService;
+
+use App\Commodity;
+use App\OracleBasSKU;
+use App\Services\CommodityService;
+use App\Services\common\DataHandlerService;
+use App\Services\OwnerService;
+use App\ValueStore;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\DB;
+use Tests\TestCase;
+
+class SyncCommodityUpdatedTest extends TestCase
+{
+    /**
+     * @var CommodityService $service
+     */
+    public $service;
+    public $bas_skus;
+    public $updated_at;
+    public $last_time;
+    public $commodities;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service=app(CommodityService::class);
+    }
+
+    /**
+     * @test
+     */
+    public function testSyncCommodityUpdated()
+    {
+        $this->updated_at = config('sync.commodity_sync.updated_at');
+        $this->last_time = ValueStore::query()->where('name',$this->updated_at)->value('value');
+        if (!$this->last_time) $time=Carbon::now()->subSeconds(65);
+        $this->bas_skus= OracleBasSKU::query()
+            ->select('customerid','sku','descr_c','alternate_sku1','alternate_sku2','alternate_sku3','skulength','skuwidth','skuhigh','cube','packid','addtime','edittime')
+            ->where('EditTime', '>=', $this->last_time??$time)
+            ->whereColumn('EditTime', '<>', 'addTime')
+            ->orderByDesc('EditTime')
+            ->get();
+
+        $this->service->syncCommodityUpdated();
+        $owner_sku_map = [];
+        $sku = [];
+        $this->bas_skus->each(function ($addBasSku) use (&$owner_sku_map, &$sku) {
+            if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
+                $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
+                $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
+                $sku[] = $addBasSku['sku'];
+            }
+        });
+        /**
+         * @var OwnerService $ownerService
+         */
+        $ownerService = app(OwnerService::class);
+        $owner_codes = (function () use ($owner_sku_map) {
+            $owner_codes = [];
+            if (count($owner_sku_map) == 0) return $owner_codes;
+            foreach ($owner_sku_map as $item) {
+                $owner_codes[$item['owner_code']] = $item['owner_code'];
+            }
+            return $owner_codes;
+        })();
+        $owner_id = (function () use ($ownerService, $owner_codes) {
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner) use (&$map) {
+                $map[] = $owner['id'];
+            });
+            return $map;
+        })();
+        $this->commodities = Commodity::query()
+            ->whereIn('owner_id', array_unique($owner_id))
+            ->whereIn('sku', array_unique($sku))
+            ->groupBy('owner_id', 'sku')
+            ->get();
+        $this->assertNotNull($this->commodities);
+        $this->assertEquals(count($this->bas_skus),count($this->commodities));
+    }
+
+    public function tearDown(): void
+    {
+        ValueStore::query()->updateOrCreate([
+            'name' => $this->updated_at,
+        ], [
+            'name' => $this->updated_at,
+            'value' => $this->last_time,
+        ]);
+        $commodityIds=[];
+        foreach ($this->commodities as $commodity){
+            array_push($commodityIds,$commodity->id);
+        }
+        DB::table('commodities')->whereIn('id',$commodityIds)->delete();
+        DB::table('commodity_barcodes')->whereIn('commodity_id',$commodityIds)->delete();
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 75 - 0
tests/Services/CommodityService/SyncCreateCommodityByBasSkusTest.php

@@ -0,0 +1,75 @@
+<?php
+
+namespace Tests\Services\CommodityService;
+
+use App\Commodity;
+use App\OracleBasSKU;
+use App\Services\CommodityService;
+use App\Services\OwnerService;
+use App\ValueStore;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\DB;
+use Tests\TestCase;
+
+class SyncCreateCommodityByBasSkusTest extends TestCase
+{
+    /**
+     * @var CommodityService $service
+     */
+    public $service;
+    public $bas_skus;
+    public $created_at;
+    public $last_time;
+    public $insert_params;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service=app(CommodityService::class);
+    }
+
+    /**
+     * @test
+     */
+    public function testSyncCreateCommodityByBasSkus()
+    {
+        $this->created_at = config('sync.commodity_sync.created_at');
+        $this->last_time = ValueStore::query()->where('name',$this->created_at)->value('value');
+        if (!$this->last_time) $time=Carbon::now()->subSeconds(65);
+        $this->bas_skus=OracleBasSKU::query()
+            ->select('customerid','sku','descr_c','alternate_sku1','alternate_sku2','alternate_sku3','skulength','skuwidth','skuhigh','cube','packid','addtime','edittime')
+            ->where('addTime', '>=', $this->last_time??$time)
+            ->orderByDesc('addtime')
+            ->get();
+        $this->insert_params=$this->service->getParamsByBasSkus($this->bas_skus);
+        $this->service->syncCreateCommodity($this->bas_skus);
+        if ($this->insert_params) $this->assertNotNull($this->insert_params);
+        if ($this->insert_params)$this->assertEquals(count($this->insert_params),count($this->bas_skus));
+        if (!$this->insert_params)$this->assertNull($this->insert_params);
+    }
+
+    public function tearDown(): void
+    {
+        ValueStore::query()->updateOrCreate([
+            'name' => $this->created_at,
+        ], [
+            'name' => $this->created_at,
+            'value' => $this->last_time,
+        ]);
+        $sku=[];
+        $owner_id=[];
+        if (!$this->insert_params) return;
+        foreach ($this->insert_params as $insert_param){
+            $owner_id[]=$insert_param['owner_id'];
+            $sku[]=$insert_param['sku'];
+        }
+        $commodities=Commodity::query()->whereIn('owner_id',$owner_id)->whereIn('sku',$sku)->get();
+        $commodity_id=[];
+        foreach ($commodities as $commodity){
+            $commodity_id[]=$commodity->id;
+        }
+        DB::table('commodities')->whereIn('id',$commodity_id)->delete();
+        DB::table('commodity_barcodes')->whereIn('commodity_id',$commodity_id)->delete();
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 102 - 0
tests/Services/CommodityService/SyncUpdateCommodityBasSkusTest.php

@@ -0,0 +1,102 @@
+<?php
+
+namespace Tests\Services\CommodityService;
+
+use App\Commodity;
+use App\OracleBasSKU;
+use App\Services\CommodityService;
+use App\Services\common\DataHandlerService;
+use App\Services\OwnerService;
+use App\ValueStore;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\DB;
+use Tests\TestCase;
+
+class SyncUpdateCommodityBasSkusTest extends TestCase
+{
+    /**
+     * @var CommodityService $service
+     */
+    public $service;
+    public $bas_skus;
+    public $updated_at;
+    public $last_time;
+    public $commodities;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service=app(CommodityService::class);
+    }
+
+    /**
+     * @test
+     */
+    public function testSyncCommodityUpdated()
+    {
+        $this->updated_at = config('sync.commodity_sync.updated_at');
+        $this->last_time = ValueStore::query()->where('name',$this->updated_at)->value('value');
+        if (!$this->last_time) $time=Carbon::now()->subSeconds(65);
+        $this->bas_skus= OracleBasSKU::query()
+            ->select('customerid','sku','descr_c','alternate_sku1','alternate_sku2','alternate_sku3','skulength','skuwidth','skuhigh','cube','packid','addtime','edittime')
+            ->where('EditTime', '>=', $this->last_time??$time)
+            ->whereColumn('EditTime', '<>', 'addTime')
+            ->orderByDesc('EditTime')
+            ->get();
+        $this->service->syncUpdateCommodity($this->bas_skus);
+
+        $owner_sku_map = [];
+        $sku = [];
+        $this->bas_skus->each(function ($addBasSku) use (&$owner_sku_map, &$sku) {
+            if (!empty($addBasSku['customerid']) && !empty($addBasSku['sku'])) {
+                $key = "owner_code_{$addBasSku['customerid']}_sku_{$addBasSku['sku']}";
+                $owner_sku_map[$key] = ['owner_code' => $addBasSku['customerid'], 'sku' => $addBasSku['sku']];
+                $sku[] = $addBasSku['sku'];
+            }
+        });
+        /**
+         * @var OwnerService $ownerService
+         */
+        $ownerService = app(OwnerService::class);
+        $owner_codes = (function () use ($owner_sku_map) {
+            $owner_codes = [];
+            if (count($owner_sku_map) == 0) return $owner_codes;
+            foreach ($owner_sku_map as $item) {
+                $owner_codes[$item['owner_code']] = $item['owner_code'];
+            }
+            return $owner_codes;
+        })();
+        $owner_id = (function () use ($ownerService, $owner_codes) {
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner) use (&$map) {
+                $map[] = $owner['id'];
+            });
+            return $map;
+        })();
+        $this->commodities = Commodity::query()
+            ->whereIn('owner_id', array_unique($owner_id))
+            ->whereIn('sku', array_unique($sku))
+            ->groupBy('owner_id', 'sku')
+            ->get();
+        $this->assertNotNull($this->commodities);
+        $this->assertEquals(count($this->bas_skus),count($this->commodities));
+    }
+
+    public function tearDown(): void
+    {
+        ValueStore::query()->updateOrCreate([
+            'name' => $this->updated_at,
+        ], [
+            'name' => $this->updated_at,
+            'value' => $this->last_time,
+        ]);
+        $commodityIds=[];
+        foreach ($this->commodities as $commodity){
+            array_push($commodityIds,$commodity->id);
+        }
+        DB::table('commodities')->whereIn('id',$commodityIds)->delete();
+        DB::table('commodity_barcodes')->whereIn('commodity_id',$commodityIds)->delete();
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 2 - 2
tests/Services/RejectedBillService/GetLogisticNumberTest.php

@@ -50,13 +50,13 @@ class GetLogisticNumberTest extends TestCase
         $addUpdateCollect=$this->service->getUpdateCollect($this->asnHeaders);
         if ($addUpdateCollect){
             $addLogisticNumber=$this->service->getLogisticNumberReturn($addUpdateCollect);
-            $this->assertNotEmpty($addLogisticNumber);
+            $this->assertNotNull($addLogisticNumber);
         }
         if (empty($this->asnHeadersEdit))return null;
         $editUpdateCollect=$this->service->getUpdateCollect($this->asnHeadersEdit);
         if ($editUpdateCollect){
             $editLogisticNumber=$this->service->getLogisticNumberReturn($editUpdateCollect);
-            $this->assertNotEmpty($editLogisticNumber);
+            $this->assertNotNull($editLogisticNumber);
         }
     }
 }

+ 4 - 4
tests/Services/RejectedBillService/GetUpdateCollectTest.php

@@ -49,16 +49,16 @@ class GetUpdateCollectTest extends TestCase
         if (empty($this->asnHeaders))return null;
         $addUpdateCollect=$this->service->getUpdateCollect($this->asnHeaders);
         if ($addUpdateCollect){
-            $this->assertNotEmpty($addUpdateCollect);
+            $this->assertNotNull($addUpdateCollect);
         }else{
-            $this->assertEmpty($addUpdateCollect);
+            $this->assertNull($addUpdateCollect);
         }
         if (empty($this->asnHeadersEdit))return null;
         $editUpdateCollect=$this->service->getUpdateCollect($this->asnHeadersEdit);
         if ($editUpdateCollect){
-            $this->assertNotEmpty($editUpdateCollect);
+            $this->assertNotNull($editUpdateCollect);
         }else{
-            $this->assertEmpty($editUpdateCollect);
+            $this->assertNull($editUpdateCollect);
         }
     }
 }

+ 40 - 6
tests/Services/RejectedBillService/SyncLoadedStatusByAsnHeaderTest.php

@@ -5,6 +5,7 @@ namespace Tests\Services\RejectedBillService;
 
 
 use App\OracleDOCASNHeader;
+use App\RejectedBill;
 use App\Services\OwnerService;
 use App\Services\RejectedBillService;
 use App\Services\StoreItemService;
@@ -22,6 +23,7 @@ class SyncLoadedStatusByAsnHeaderTest extends TestCase
      */
     public $service;
     public $asnHeaders;
+    public $params;
     public function setUp(): void
     {
         parent::setUp(); // TODO: Change the autogenerated stub
@@ -34,15 +36,47 @@ class SyncLoadedStatusByAsnHeaderTest extends TestCase
             ->where('addTime', '>=', $startDate)
             ->get();
     }
+
+    /**
+     * @test
+     */
     public function testSyncLoadedStatusByAsnHeaderTest(){
-        if (empty($this->asnHeaders))return null;
+        if (empty($this->asnHeaders)){
+            $this->assertNull($this->asnHeaders);
+            return;
+        }
         $updateCollect=$this->service->getUpdateCollect($this->asnHeaders);
-        if ($updateCollect->isEmpty())return null;
+        if ($updateCollect->isEmpty()){
+            $this->assertEmpty($updateCollect);
+            return;
+        }
         $logisticNumberReturn=$this->service->getLogisticNumberReturn($updateCollect);
+        if (count($logisticNumberReturn)==0) return;
         $rejectedBills=$this->service->getRejectedBills($logisticNumberReturn);
-        if ($rejectedBills->isEmpty())return null;
-        $this->assertNull($rejectedBills);
-        $this->service->syncLoadedStatusByAsnHerder($this->asnHeaders);
-        $this->assertNull($logisticNumberReturn);
+        if ($rejectedBills->isEmpty()){
+            $this->assertEmpty($rejectedBills);
+            return null;
+        }
+        $this->assertNotNull($rejectedBills);
+        $this->params=[];
+        $updateParams=$this->service->getNeedUpdateLoadedStatusByWms($this->asnHeaders);
+        array_shift($updateParams);
+        if (count($updateParams)>=1){
+            foreach ($updateParams as $param){
+                $this->params[] = $param['logistic_number_return'];
+            }
+            $this->service->syncLoadedStatusByAsnHerder($this->asnHeaders);
+        }
+        $this->assertNotNull($logisticNumberReturn);
+    }
+    public function tearDown(): void
+    {
+        if (!$this->params)return;
+        $rejectBills=RejectedBill::query()->whereIn('logistic_number_return', $this->params)->get();
+        foreach ($rejectBills as $rejectBill){
+            $rejectBill->is_loaded=0;
+            $rejectBill->update();
+        }
+        parent::tearDown(); // TODO: Change the autogenerated stub
     }
 }

+ 1 - 1
tests/Services/StoreItemService/GetAsnDetailsByAsnHerderTest.php

@@ -1,7 +1,7 @@
 <?php
 
 
-namespace Tests\Services\StoreService;
+namespace Tests\Services\StoreItemService;
 
 
 use App\OracleDOCASNHeader;

+ 1 - 1
tests/Services/StoreItemService/GetByWmsTest.php

@@ -1,7 +1,7 @@
 <?php
 
 
-namespace Tests\Services\StoreService;
+namespace Tests\Services\StoreItemService;
 
 
 use App\OracleDOCASNHeader;

+ 1 - 1
tests/Services/StoreItemService/GetParamsByAsnDetailsTest.php

@@ -1,7 +1,7 @@
 <?php
 
 
-namespace Tests\Services\StoreService;
+namespace Tests\Services\StoreItemService;
 
 
 use App\OracleDOCASNHeader;

+ 4 - 1
tests/Services/StoreService/CreateStoreTest.php

@@ -7,11 +7,13 @@ namespace Tests\Services\StoreService;
 use App\OracleDOCASNHeader;
 use App\Services\StoreService;
 use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
 use Illuminate\Support\Facades\DB;
 use Tests\TestCase;
 
 class CreateStoreTest extends TestCase
 {
+//    use RefreshDatabase;
     /** @var StoreService $service */
     public $service;
     public $asnHeaders;
@@ -32,7 +34,7 @@ class CreateStoreTest extends TestCase
         if (!$this->asnHeaders) return null;
         $this->service->createStore($this->asnHeaders);
         $this->stores=$this->service->getByWms($this->asnHeaders);
-        $this->assertNotEmpty($this->stores);
+        $this->assertNotnull($this->stores);
         $this->assertNotNull($this->asnHeaders);
     }
     public function tearDown(): void
@@ -43,6 +45,7 @@ class CreateStoreTest extends TestCase
         }
         DB::table('stores')->whereIn('asn_code',data_get($this->asnHeaders,'*.asnno'))->delete();
         DB::table('store_items')->whereIn('store_id',$storeIds)->delete();
+        cache()->flush();
         parent::tearDown(); // TODO: Change the autogenerated stub
     }
 }

+ 41 - 0
tests/Services/StoreService/GetAsnSyncAtTest.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace Tests\Services\StoreService;
+
+use App\Services\OrderService;
+use App\Services\StoreService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Tests\TestCase;
+
+class GetAsnSyncAtTest extends TestCase
+{
+    /**
+     * @var StoreService $service
+     */
+    private $service;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app(StoreService::class);
+    }
+
+    /**
+     * @test
+     */
+    public function getCreatedAsnSyncAt()
+    {
+        $key = config('sync.asn_sync.created_at');
+        $data = $this->service->getAsnLastSyncAt($key,'create');
+        $this->assertNotEmpty($data);
+    }
+
+    /**
+     * @test
+     */
+    public function getUpdatedAsnSyncAt()
+    {
+        $key = config('sync.asn_sync.updated_at');
+        $data = $this->service->getAsnLastSyncAt($key,'update');
+        $this->assertNotEmpty($data);
+    }
+}

+ 1 - 1
tests/Services/StoreService/GetParamsByAsnHeaderTest.php

@@ -42,7 +42,7 @@ class GetParamsByAsnHeaderTest extends TestCase
         if (empty($this->asnHeaders))return null;
         $stores = Store::query()->whereIn('asn_code',data_get($this->asnHeaders,'*.asnno'))->get();
         $owners=$this->ownerService->getByWmsOrders($this->asnHeaders);
-        $warehouses=$this->warehouseService->getByWms($this->asnHeaders);
+        $warehouses=$this->warehouseService->getByWmsOrders($this->asnHeaders);
         $this->assertNotEmpty($this->asnHeaders);
         $this->assertNotEmpty($owners);
         $this->assertNotEmpty($warehouses);

+ 1 - 2
tests/Services/StoreService/InsertStoreTest.php

@@ -41,8 +41,7 @@ class InsertStoreTest extends TestCase
         array_push($this->params,$data2);
     }
     public  function testInsertStore(){
-        $stores=$this->service->insertStore($this->params);
-        $this->assertNotEmpty($stores);
+        $this->service->insertStore($this->params);
         $this->assertDatabaseHas('stores',$this->params[0]);
     }
      public function tearDown(): void

+ 52 - 0
tests/Services/StoreService/SetAsnSyncAtTest.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace Tests\Services\StoreService;
+
+use App\Services\OrderService;
+use App\Services\StoreService;
+use App\ValueStore;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Illuminate\Support\Str;
+use Tests\TestCase;
+
+class SetAsnSyncAtTest extends TestCase
+{
+    /** @var StoreService $service */
+    private $service;
+    private $created_at;
+    private $original_value;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app(StoreService::class);
+        $this->created_at = config('sync.asn_sync.created_at');
+    }
+
+    /**
+     * @test
+     */
+    public function testSetAsnSyncAt()
+    {
+        /** @var Carbon $time */
+
+        $data = Carbon::now();
+        $this->original_value=ValueStore::query()->where('name',$this->created_at)->value('value');
+
+        $this->service->setAsnLastSyncAt($this->created_at,$data);
+        $value=ValueStore::query()->where('name',$this->created_at)->value('value');
+        $this->assertEquals((string)$data,(string)$value);
+    }
+
+    public function tearDown(): void
+    {
+        ValueStore::query()->updateOrCreate([
+            'name' => $this->created_at,
+        ], [
+            'name' => $this->created_at,
+            'value' => $this->original_value,
+        ]);
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 91 - 0
tests/Services/StoreService/SetLastRecordsByRedisTest.php

@@ -0,0 +1,91 @@
+<?php
+
+namespace Tests\Services\StoreService;
+
+use App\OracleDOCASNHeader;
+use App\Services\StoreService;
+use Illuminate\Support\Facades\Cache;
+use Tests\TestCase;
+
+class SetLastRecordsByRedisTest extends TestCase
+{
+    /** @var StoreService $service */
+    public $service;
+    public $data;
+    public $create_set;
+    public $create_keys;
+    public $create_key;
+    public $update_set;
+    public $update_keys;
+    public $update_key;
+    public $createRecord;
+    public $updateRecord;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app(StoreService::class);
+        $this->create_set = config('sync.asn_sync.cache_prefix.create_set');
+        $this->create_keys = config('sync.asn_sync.cache_prefix.create_keys');
+        $this->create_key = config('sync.asn_sync.cache_prefix.create');
+        $this->update_set = config('sync.asn_sync.cache_prefix.update_set');
+        $this->update_keys = config('sync.asn_sync.cache_prefix.update_keys');
+        $this->update_key = config('sync.asn_sync.cache_prefix.update');
+    }
+    /**
+     * @test
+     */
+    public function testSetLastRecordsByRedisCreated()
+    {
+        $this->createRecord=collect();
+        $last_record=OracleDOCASNHeader::query()->orderByDesc('addtime')->first();
+        $this->createRecord->add($last_record);
+        if (!Cache::get($this->create_set)){
+            $this->assertNull(Cache::get($this->create_set));
+            $this->assertNotNull($this->createRecord);
+            return;
+        }
+        $this->service->setLastRecordsByRedis($this->create_key,$this->create_set,$this->create_keys,$this->createRecord);
+        $this->assertNotNull($this->createRecord);
+        $this->assertEquals(true,Cache::get($this->create_set));
+        $this->assertNotNull(Cache::get($this->create_keys));
+    }
+
+    /**
+     * @test
+     */
+    public function testSetLastRecordsByRedisUpdated()
+    {
+        $this->updateRecord=collect();
+        $last_record=OracleDOCASNHeader::query()->orderByDesc('edittime')->first();
+        $this->updateRecord->add($last_record);
+        if (!Cache::get($this->update_set)){
+            $this->assertNull(Cache::get($this->update_set));
+            $this->assertNotNull($this->updateRecord);
+            return;
+        }
+        $this->service->setLastRecordsByRedis($this->update_key,$this->update_set,$this->update_keys,$this->updateRecord);
+        $this->assertNotNull($this->updateRecord);
+        $this->assertEquals(true,Cache::get($this->update_set));
+        $this->assertNotNull(Cache::get($this->update_keys));
+    }
+
+    public function tearDown(): void
+    {
+        if (!Cache::get($this->create_set)) return;
+        $cacheKeys = Cache::get($this->create_keys);
+        if (!$cacheKeys) return;
+        foreach ($cacheKeys as $cacheKey) {
+            Cache::forget($cacheKey);
+        }
+        Cache::forget($this->create_keys);
+
+        if (!Cache::get($this->update_set)) return;
+        $cacheKeys = Cache::get($this->update_keys);
+        if (!$cacheKeys) return;
+        foreach ($cacheKeys as $cacheKey) {
+            Cache::forget($cacheKey);
+        }
+        Cache::forget($this->update_keys);
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 81 - 0
tests/Services/StoreService/SyncStoreCreateByWmsTest.php

@@ -0,0 +1,81 @@
+<?php
+
+namespace Tests\Services\StoreService;
+
+use App\Logistic;
+use App\OracleDOCASNHeader;
+use App\Owner;
+use App\Services\common\DataHandlerService;
+use App\Services\LogisticService;
+use App\OracleDOCOrderHeader;
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderService;
+use App\Services\OwnerService;
+use App\Services\ShopService;
+use App\Services\StoreService;
+use App\Services\WarehouseService;
+use App\Shop;
+use App\ValueStore;
+use App\Warehouse;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Illuminate\Support\Facades\DB;
+use Tests\TestCase;
+
+class SyncStoreCreateByWmsTest extends TestCase
+{
+    /**
+     * @var StoreService $service
+     */
+    public $service;
+    public $stores;
+    public $asnHeaders;
+    public $created_at;
+    public $last_time;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service=app(StoreService::class);
+    }
+
+    /**
+     * @test
+     */
+    public function testStoreCreateByWms()
+    {
+        $this->created_at = config('sync.asn_sync.created_at');
+        $this->last_time = ValueStore::query()->where('name',$this->created_at)->value('value');
+        if (!$this->last_time) $time=Carbon::now()->subSeconds(65);
+        $this->asnHeaders=OracleDOCASNHeader::query()
+            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
+                $query->with(['lineStatus', 'qualityStatus','basSku']);
+            }])
+            ->select('asnno','asnstatus','asntype','addtime','edittime','customerid','notes','warehouseid','asnreference3')
+            ->where('addTime', '>=',  $this->last_time??$time)
+            ->orderByDesc('addtime')
+            ->get();
+        $this->service->storeCreateByWms();
+        $this->stores = $this->service->getByWms($this->asnHeaders);
+        $this->assertNotNull($this->stores);
+        $this->assertEquals(count($this->asnHeaders),count($this->stores));
+    }
+
+    public function tearDown(): void
+    {
+        ValueStore::query()->updateOrCreate([
+            'name' => $this->created_at,
+        ], [
+            'name' => $this->created_at,
+            'value' => $this->last_time,
+        ]);
+        $storeIds=[];
+        foreach ($this->stores as $store){
+            array_push($storeIds,$store->id);
+        }
+        DB::table('stores')->whereIn('asn_code',data_get($this->asnHeaders,'*.asnno'))->delete();
+        DB::table('store_items')->whereIn('store_id',$storeIds)->delete();
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 82 - 0
tests/Services/StoreService/SyncStoreUpdateByWmsTest.php

@@ -0,0 +1,82 @@
+<?php
+
+namespace Tests\Services\StoreService;
+
+use App\Logistic;
+use App\OracleDOCASNHeader;
+use App\Owner;
+use App\Services\common\DataHandlerService;
+use App\Services\LogisticService;
+use App\OracleDOCOrderHeader;
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderService;
+use App\Services\OwnerService;
+use App\Services\ShopService;
+use App\Services\StoreService;
+use App\Services\WarehouseService;
+use App\Shop;
+use App\ValueStore;
+use App\Warehouse;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Illuminate\Support\Facades\DB;
+use Tests\TestCase;
+
+class SyncStoreUpdateByWmsTest extends TestCase
+{
+    /**
+     * @var StoreService $service
+     */
+    public $service;
+    public $stores;
+    public $asnHeaders;
+    public $update_at;
+    public $last_time;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service=app(StoreService::class);
+    }
+
+    /**
+     * @test
+     */
+    public function testStoreUpdateByWms()
+    {
+        $this->update_at = config('sync.asn_sync.updated_at');
+        $this->last_time = ValueStore::query()->where('name',$this->update_at)->value('value');
+        if (!$this->last_time) $time=Carbon::now()->subSeconds(65);
+        $this->asnHeaders=OracleDOCASNHeader::query()
+            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
+                $query->with(['lineStatus', 'qualityStatus','basSku']);
+            }])
+            ->select('asnno','asnstatus','asntype','addtime','edittime','customerid','notes','warehouseid','asnreference3')
+            ->where('EditTime', '>=', $this->last_time ?? $time)
+            ->whereColumn('EditTime', '<>', 'addTime')
+            ->orderByDesc('EditTime')
+            ->get();
+        $this->service->storeUpdateByWms();
+        $this->stores = $this->service->getByWms($this->asnHeaders);
+        $this->assertNotNull($this->stores);
+        $this->assertEquals(count($this->asnHeaders),count($this->stores));
+    }
+
+    public function tearDown(): void
+    {
+        ValueStore::query()->updateOrCreate([
+            'name' => $this->update_at,
+        ], [
+            'name' => $this->update_at,
+            'value' => $this->last_time,
+        ]);
+        $storeIds=[];
+        foreach ($this->stores as $store){
+            array_push($storeIds,$store->id);
+        }
+        DB::table('stores')->whereIn('asn_code',data_get($this->asnHeaders,'*.asnno'))->delete();
+        DB::table('store_items')->whereIn('store_id',$storeIds)->delete();
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 0 - 69
tests/Services/StoreService/SyncWmsAsnDataTest.php

@@ -1,69 +0,0 @@
-<?php
-
-
-namespace Tests\AsnSync\Services;
-
-
-use App\OracleDOCASNHeader;
-use App\Services\StoreService;
-use Illuminate\Support\Facades\DB;
-use Tests\TestCase;
-
-class SyncWmsAsnDataTest extends TestCase
-{
-    /** @var StoreService $service */
-    public $service;
-    public $asnHeaders;
-    public $asnHeadersEdit;
-    public $asnHeadersTotal;
-    public $startDate;
-    public $stores;
-    public function setUp(): void
-    {
-
-        parent::setUp(); // TODO: Change the autogenerated stub
-        $this->startDate = \Illuminate\Support\Carbon::now()->subSeconds(300);
-        $this->service = app(StoreService::class);
-        $this->asnHeaders = OracleDOCASNHeader::query()
-            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
-                $query->with(['lineStatus', 'qualityStatus', 'basSku']);
-            }])
-            ->where('addTime', '>=', $this->startDate)
-            ->get();
-        $this->asnHeadersEdit = OracleDOCASNHeader::query()
-            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
-                $query->with(['lineStatus', 'qualityStatus', 'basSku']);
-            }])
-            ->where('EditTime', '>=', $this->startDate)
-            ->whereColumn('EditTime', '<>', 'addTime')
-            ->get();
-    }
-
-
-    public function testSyncWmsAsnData()
-    {
-          if (!$this->asnHeaders && !$this->asnHeadersEdit) return null;
-        if (!empty($this->asnHeadersEdit)){
-            foreach ($this->asnHeadersEdit as $asnHerder)
-                $this->asnHeaders->add($asnHerder);
-        }
-        if ($this->asnHeaders) {
-            $this->service->syncWmsAsnData($this->startDate);
-            $this->stores = $this->service->getByWms($this->asnHeaders);
-            $this->assertNotEmpty($this->stores);
-        } else {
-            $this->assertNull($this->asnHeaders);
-        }
-    }
-
-    public function tearDown(): void
-    {
-        $storeIds = [];
-        foreach ($this->stores as $store) {
-            array_push($storeIds, $store->id);
-        }
-        DB::table('stores')->whereIn('asn_code', data_get($this->asnHeaders, '*.asnno'))->delete();
-        DB::table('store_items')->whereIn('store_id', $storeIds)->delete();
-        parent::tearDown(); // TODO: Change the autogenerated stub
-    }
-}

+ 2 - 1
tests/Services/StoreService/UpdateStoreTest.php

@@ -35,7 +35,7 @@ class UpdateStoreTest extends TestCase
         }else{
             $this->service->updateStore($this->asnHeaders);
             $this->stores=$this->service->getByWms($this->asnHeaders);
-            $this->assertNotEmpty($this->stores);
+            $this->assertNotNull($this->stores);
         }
     }
     public function tearDown(): void
@@ -46,6 +46,7 @@ class UpdateStoreTest extends TestCase
         }
         DB::table('stores')->whereIn('asn_code',data_get($this->asnHeaders,'*.asnno'))->delete();
         DB::table('store_items')->whereIn('store_id',$storeIds)->delete();
+        cache()->flush();
         parent::tearDown(); // TODO: Change the autogenerated stub
     }
 }