haozi 5 rokov pred
rodič
commit
25a1420455

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

@@ -1213,20 +1213,14 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         $tack->handle();
         dump(11);
     }
-    public  function  testSyncAsn(){
-        /** @var StoreService $storeService */
-        $storeService  = app(StoreService::class);
-        dump('start',Carbon::now());
-        $storeService->storeCreateByWms();
-        $storeService->storeUpdateByWms();
-        dump('end',Carbon::now());
-    }
+
     public function testCommodity(){
         /**
          * @var CommodityService $commodityService
          */
         $commodityService=app(CommodityService::class);
-        $commodityService->pushCommodityToCache();
+        $commodityService->syncCommodityCreated();
+        $commodityService->syncCommodityUpdated();
     }
 
     public function reNewBatches3()

+ 227 - 41
app/Services/CommodityService.php

@@ -8,6 +8,7 @@ use App\CommodityBarcode;
 use App\OracleBasSKU;
 use App\Owner;
 use App\Services\common\BatchUpdateService;
+use App\Services\common\DataHandlerService;
 use App\ValueStore;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
@@ -396,57 +397,244 @@ Class CommodityService
         $oracleBasSkuService = app(OracleBasSkuService::class);
         $last_time = $this->getAsnLastSyncAt($created_at, 'create');
         $basSkus = $oracleBasSkuService->getWmsCreatedCommodities($last_time);
-        $last_time=$basSkus->first()['addtime'];
+        $last_time = $basSkus->first()['addtime'];
         $last_records = $basSkus->where('addtime', $last_time);
         if (!$basSkus) return;
         $addBasSkus = $this->getLastRecordsByRedis($create_set, $create_key, $basSkus);
-        //if (count($addBasSkus) > 0) $addBasSkus=$this->filterByCommodityCache($addBasSkus);
+        //if (count($addBasSkus) > 0) $addBasSkus = $this->filterByCommodityCache($addBasSkus); //从缓存中过滤
         if (count($addBasSkus) > 0) {
             $this->syncCreateCommodity($addBasSkus);
             $this->deleteCacheKey($create_set, $create_keys);
-            $this->setLastRecordsByRedis($create_key,$create_set,$create_keys,$last_records);
-            $this->setAsnLastSyncAt($created_at,$last_time);
+            $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;
+        $addBasSkus = $this->getLastRecordsByRedis($update_set, $update_key, $basSkus);
+        //if (count($addBasSkus) > 0) $addBasSkus = $this->filterByCommodityCache($addBasSkus); //从缓存中过滤
+        if (count($addBasSkus) > 0) {
+            $this->syncCreateCommodity($addBasSkus);
+            $this->syncUpdateCommodity($addBasSkus);
+            $this->deleteCacheKey($update_set, $update_keys);
+            $this->setLastRecordsByRedis($update_key, $update_set, $update_keys, $last_records);
+            $this->setAsnLastSyncAt($updated_at, $last_time);
+        }
     }
+
     // TODO
     public function syncCreateCommodity($addBasSkus)
     {
-        $owner_codes = array_diff(array_unique(data_get($addBasSkus, '*.customerid')), ['', '*', null]);
-        if (count($owner_codes)<1) return null;
-        $owners = Owner::query()->whereIn('code', $owner_codes)->get();
-        $owners_code_map = [];
-        foreach ($owners as $owner) {
-            $owners_code_map[$owner->code] = $owner;
+        if (count($addBasSkus) < 1) return null;
+        $insert_params = $this->getParamsByOwnerSkuMap($addBasSkus);
+        foreach (array_chunk($insert_params, 1000) as $item) {
+            try {
+                $bool = Commodity::query()->insert($item);
+                if ($bool) {
+                    app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 Commodity Success " . count($insert_params) . ' || ' . json_encode($insert_params));
+                    $commodities = Commodity::query()->with('owner')->whereIn('owner_id', data_get($item, '*.owner_id'))->whereIn('sku', data_get($item, '*.sku'))->get();
+                    $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()));
+            }
         }
+        //同步商品条码
+//        /**
+//         * @var CommodityBarcodeService $commodityBarcodeService
+//         */
+//        $commodityBarcodeService = app(CommodityBarcodeService::class);
+//        $commodityBarcodeService->createBarcodeByWms($addBasSkus);
     }
+
     // TODO
-    public function getParamsByBasSku($addBasSkus, $owners_code_map)
-    {
-        $params = [];
-        $commodities = Commodity::query()->with(['owner' => function ($query) use ($addBasSkus) {
-            return $query->whereIn('code', data_get($addBasSkus, '*.customerid'));
-        }])
-            ->whereIn('sku', data_get($addBasSkus, '*.sku'))
+    public function getParamsByOwnerSkuMap($addBasSkus)
+    {
+        $owner_sku_map = [];
+        $sku = [];
+        $owner_code = [];
+        $addBasSkus->each(function ($addBasSku) use (&$owner_sku_map, &$sku, &$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'];
+            }
+        });
+        /** @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;
+        })();
+        $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();
-        $commodity_map = [];
-        foreach ($commodities as $commodity) {
-            $commodity_map[$commodity['owner']['code'].$commodity['sku']] = $commodity;
-        }
-        foreach ($addBasSkus as $addBasSku) {
-            if ($store_asn_code_map[$addBasSku->customerid.$addBasSku->sku] ?? false) continue;
-            $owner = $owners_code_map[$addBasSku->customerid] ?? null;
-
-            $params[] = [
 
+        $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->pickid,
+                ];
+            });
+            return $map;
+        })();
+        if (count($inner_params) == 0) return null;
+        return $inner_params;
+    }
+
+    // TODO
+    public function syncUpdateCommodity($addBasSkus)
+    {
+        $owner_sku_map = [];
+        $sku = [];
+        $addBasSkus->each(function ($addBasSku) use (&$owner_sku_map, &$sku, &$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'];
+            }
+        });
+        /**
+         * @var OwnerService $ownerService
+         * @var DataHandlerService $dataHandlerService
+         */
+        $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_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();
+        $dataHandlerService = app(DataHandlerService::class);
+        $commodities_map = $dataHandlerService->dataHeader(['owner_id', 'sku'], $commodities);
+        $updateParams = [[
+            'id', 'name', 'sku', 'owner_id', 'length', 'width', 'height', 'volumn', 'pack_spec', 'updated_at', 'created_at'
+        ]];
+        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) 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->pickid,
+                ];
+            }
         }
-        return $params;
+        if (count($updateParams) > 1) $this->batchUpdate($updateParams);
+        $commodities = Commodity::query()->with('owner')->whereIn('owner_id', data_get($updateParams, '*.owner_id'))->whereIn('sku', data_get($updateParams, '*.sku'))->get();
+        $this->pushToCache($commodities);
     }
+
     public function getAsnLastSyncAt($key, $type)
     {
         $last_time = ValueStore::query()->where('name', $key)->value('value');
@@ -478,7 +666,7 @@ Class CommodityService
         if (Cache::get($set)) {
             $addBasSkus = collect();
             foreach ($basSkus as $basSku) {
-                if (Cache::get($prefixKey . $basSkus->customerid . '_' . $basSkus->sku)) continue;
+                if (Cache::get($prefixKey . $basSku->customerid . '_' . $basSku->sku)) continue;
                 $addBasSkus->add($basSku);
             }
             return $addBasSkus;
@@ -500,25 +688,23 @@ Class CommodityService
 
     public function setLastRecordsByRedis($prefixKey, $set, $keys, $last_records)
     {
-        if (Cache::get($set)) {
-            $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);
+        $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);
     }
+
     public function filterByCommodityCache($basSkus)
     {
-        if (count($basSkus)<1)return null;
-        $addBasSkus=collect();
-        foreach ($basSkus as $basSku){
+        if (count($basSkus) < 1) return null;
+        $addBasSkus = collect();
+        foreach ($basSkus as $basSku) {
             if (Cache::get("owner_code_{$basSku['customerid']}_sku_{$basSku['sku']}")) continue;
             $addBasSkus->add($basSku);
         }
         return $addBasSkus;
     }
-
 }