|
|
@@ -0,0 +1,107 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Services;
|
|
|
+
|
|
|
+use App\OracleDOCOrderHeader;
|
|
|
+use App\OracleDOCWaveDetails;
|
|
|
+use App\ValueStore;
|
|
|
+use Carbon\Carbon;
|
|
|
+use Illuminate\Support\Facades\Cache;
|
|
|
+
|
|
|
+class OracleDocWaveDetailService
|
|
|
+{
|
|
|
+ public function clearCancelledOrder($orderHeaders)
|
|
|
+ {
|
|
|
+ if (!$orderHeaders) return;
|
|
|
+ $clearOrderNos = data_get($orderHeaders, '*.orderno');
|
|
|
+ OracleDOCWaveDetails::query()->whereIn('OrderNo', $clearOrderNos)->delete();
|
|
|
+ app('LogService')->log(__CLASS__, __METHOD__, 'Delete OracleDOCWaveDetails' . ' ' . json_encode($clearOrderNos) );
|
|
|
+ }
|
|
|
+
|
|
|
+ private function getSyncAt()
|
|
|
+ {
|
|
|
+ return Cache::remember('clear_cancel_order_sync_at', config('sync.clear_wave_order.cache_prefix.sync_at'), function () {
|
|
|
+ $valueStore = ValueStore::query()->where('name', 'last_cancel_order_sync_at')->first();
|
|
|
+ if(!$valueStore) $valueStore = ValueStore::query()->create(['name'=>'last_cancel_order_sync_at']);
|
|
|
+ if (!$valueStore->value) return (string)Carbon::now()->subMinutes(7);
|
|
|
+ return $valueStore->value;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private function getLastSyncStartAt()
|
|
|
+ {
|
|
|
+ return Cache::remember('clear_cancel_order_start_at', config('sync.clear_wave_order.cache_prefix.last_start_at'), function () {
|
|
|
+ $valueStore = ValueStore::query()->where('name', 'last_cancel_order_start_at')->first();
|
|
|
+ if(!$valueStore) $valueStore = ValueStore::query()->create(['name'=>'last_cancel_order_start_at']);
|
|
|
+ if ($valueStore->value) return (string)Carbon::now();
|
|
|
+ return null;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private function getLastSyncEndAt()
|
|
|
+ {
|
|
|
+ return Cache::remember('clear_cancel_order_start_at', config('sync.clear_wave_order.cache_prefix.last_end_at'), function () {
|
|
|
+ $valueStore = ValueStore::query()->where('name', 'last_cancel_order_end_at')->first();
|
|
|
+ if(!$valueStore) $valueStore = ValueStore::query()->create(['name'=>'last_cancel_order_end_at']);
|
|
|
+ if ($valueStore->value) return (string)Carbon::now();
|
|
|
+ return null;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private function setSyncAt($time)
|
|
|
+ {
|
|
|
+ Cache::put(config('clear_cancel_order_sync_at'), $time);
|
|
|
+ ValueStore::query()->where('name', 'last_cancel_order_sync_at')->update(['value'=>$time]);
|
|
|
+ }
|
|
|
+
|
|
|
+ private function setSyncStartAt($time)
|
|
|
+ {
|
|
|
+ Cache::put(config('clear_cancel_order_start_at'), $time);
|
|
|
+ ValueStore::query()->where('name', 'last_cancel_order_start_at')->update(['value'=>$time]);
|
|
|
+ }
|
|
|
+
|
|
|
+ private function setSyncEndAt($time)
|
|
|
+ {
|
|
|
+ Cache::put(config('clear_cancel_order_start_at'), $time);
|
|
|
+ ValueStore::query()->where('name', 'last_cancel_order_end_at')->update(['value'=>$time]);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function clearCancelledOrderTask()
|
|
|
+ {
|
|
|
+ $enabled = config('sync.clear_wave_order.enabled');
|
|
|
+ if ($enabled == false) return;
|
|
|
+ $sync_at = $this->getSyncAt();
|
|
|
+ $last_start_at = $this->getLastSyncStartAt();
|
|
|
+ $last_end_at = $this->getLastSyncEndAt();
|
|
|
+ $restart = config('clear_wave_order.cache_prefix.restart');
|
|
|
+ $start_time = Carbon::now();
|
|
|
+
|
|
|
+ if (isset($last_start_at) && empty($last_end_at) && $start_time->diffInMinutes(Carbon::parse($last_start_at)) < $this->restart) return;
|
|
|
+ if (isset($last_start_at) && isset($last_end_at)
|
|
|
+ && Carbon::parse($last_end_at)->lt(Carbon::parse($last_start_at))
|
|
|
+ && $start_time->diffInMinutes(Carbon::parse($last_start_at)) < $restart)
|
|
|
+ return;
|
|
|
+
|
|
|
+ $orderHeaders = OracleDOCOrderHeader::query()
|
|
|
+ ->selectRaw('orderno,waveno')
|
|
|
+ ->where('editTime', '>=', Carbon::parse($sync_at)->subSeconds(1))
|
|
|
+ ->where('ERPCANCELFLAG', 'Y')
|
|
|
+ ->orderByDesc('editTime')->get();
|
|
|
+ $orderHeaderList = $orderHeaders->chunk(3000);
|
|
|
+ foreach ($orderHeaderList as $items) {
|
|
|
+ $this->clearCancelledOrder($items);
|
|
|
+ if ($orderHeaders->count() > 0) {
|
|
|
+ OracleDOCOrderHeader::query()->whereIn('orderNo', data_get($items, '*.orderno'))->update(['waveno' => '*']);
|
|
|
+ $json = json_encode($items->map(function ($orderHeader) {
|
|
|
+ return ['orderno' => $orderHeader->orderno, 'waveno' => $orderHeader->waveno];
|
|
|
+ }));
|
|
|
+ app('LogService')->log(__CLASS__, __METHOD__, 'update OrderHeader' . ' ' . $json);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $end_time = (string)Carbon::now();
|
|
|
+ $sync_at = $orderHeaders->last()->editTime ?? $sync_at;
|
|
|
+ $this->setSyncAt($sync_at);
|
|
|
+ $this->setSyncStartAt((string)$start_time);
|
|
|
+ $this->setSyncEndAt($end_time);
|
|
|
+ }
|
|
|
+}
|