OracleDocWaveDetailService.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. namespace App\Services;
  3. use App\OracleDOCOrderHeader;
  4. use App\OracleDOCWaveDetails;
  5. use App\ValueStore;
  6. use Carbon\Carbon;
  7. use Illuminate\Support\Facades\Cache;
  8. use App\Traits\ServiceAppAop;
  9. class OracleDocWaveDetailService
  10. {
  11. use ServiceAppAop;
  12. public function clearCancelledOrder($orderHeaders)
  13. {
  14. if (!$orderHeaders) return;
  15. $array = array_chunk($orderHeaders,300);
  16. foreach ($array as $item) {
  17. $clearOrderNos = data_get($item, '*.orderno');
  18. $ownerNos = data_get($item, '*.ownerno');
  19. try {
  20. OracleDOCWaveDetails::query()->whereIn('OrderNo', $clearOrderNos)->whereIn('OwnerNo', $ownerNos)->delete();
  21. app('LogService')->log(__CLASS__, __METHOD__, 'Delete OracleDOCWaveDetails' . ' ' . json_encode($clearOrderNos) );
  22. } catch (\Exception $e) {
  23. app('LogService')->log(__CLASS__, __METHOD__,'Error clearCancelledOrder'.json_encode($clearOrderNos).json_encode($ownerNos));
  24. }
  25. }
  26. }
  27. private function getSyncAt()
  28. {
  29. return Cache::remember('clear_cancel_order_sync_at', config('sync.clear_wave_order.cache_prefix.sync_at'), function () {
  30. $valueStore = ValueStore::query()->where('name', 'last_cancel_order_sync_at')->first();
  31. if(!$valueStore) $valueStore = ValueStore::query()->create(['name'=>'last_cancel_order_sync_at']);
  32. if (!$valueStore->value) return (string)Carbon::now()->subMinutes(7);
  33. return $valueStore->value;
  34. });
  35. }
  36. private function getLastSyncStartAt()
  37. {
  38. return Cache::remember('clear_cancel_order_start_at', config('sync.clear_wave_order.cache_prefix.last_start_at'), function () {
  39. $valueStore = ValueStore::query()->where('name', 'last_cancel_order_start_at')->first();
  40. if(!$valueStore) $valueStore = ValueStore::query()->create(['name'=>'last_cancel_order_start_at']);
  41. if ($valueStore->value) return (string)Carbon::now();
  42. return null;
  43. });
  44. }
  45. private function getLastSyncEndAt()
  46. {
  47. return Cache::remember('clear_cancel_order_start_at', config('sync.clear_wave_order.cache_prefix.last_end_at'), function () {
  48. $valueStore = ValueStore::query()->where('name', 'last_cancel_order_end_at')->first();
  49. if(!$valueStore) $valueStore = ValueStore::query()->create(['name'=>'last_cancel_order_end_at']);
  50. if ($valueStore->value) return (string)Carbon::now();
  51. return null;
  52. });
  53. }
  54. private function setSyncAt($time)
  55. {
  56. Cache::put(config('clear_cancel_order_sync_at'), $time);
  57. ValueStore::query()->where('name', 'last_cancel_order_sync_at')->update(['value'=>$time]);
  58. }
  59. private function setSyncStartAt($time)
  60. {
  61. Cache::put(config('clear_cancel_order_start_at'), $time);
  62. ValueStore::query()->where('name', 'last_cancel_order_start_at')->update(['value'=>$time]);
  63. }
  64. private function setSyncEndAt($time)
  65. {
  66. Cache::put(config('clear_cancel_order_start_at'), $time);
  67. ValueStore::query()->where('name', 'last_cancel_order_end_at')->update(['value'=>$time]);
  68. }
  69. public function clearCancelledOrderTask()
  70. {
  71. $enabled = config('sync.clear_wave_order.enabled');
  72. if ($enabled == false) return;
  73. $sync_at = $this->getSyncAt();
  74. $last_start_at = $this->getLastSyncStartAt();
  75. $last_end_at = $this->getLastSyncEndAt();
  76. $restart = config('clear_wave_order.cache_prefix.restart');
  77. $start_time = Carbon::now();
  78. if (isset($last_start_at) && empty($last_end_at) && $start_time->diffInMinutes(Carbon::parse($last_start_at)) < $this->restart) return;
  79. if (isset($last_start_at) && isset($last_end_at)
  80. && Carbon::parse($last_end_at)->lt(Carbon::parse($last_start_at))
  81. && $start_time->diffInMinutes(Carbon::parse($last_start_at)) < $restart)
  82. return;
  83. $orderHeaders = OracleDOCOrderHeader::query()
  84. ->selectRaw('orderno,waveno')
  85. ->where('editTime', '>=', Carbon::parse($sync_at)->subSeconds(1))
  86. ->where('ERPCANCELFLAG', 'Y')
  87. ->orderByDesc('editTime')->get();
  88. $orderHeaderList = $orderHeaders->chunk(3000);
  89. foreach ($orderHeaderList as $items) {
  90. $this->clearCancelledOrder($items);
  91. if ($orderHeaders->count() > 0) {
  92. OracleDOCOrderHeader::query()
  93. ->whereIn('orderNo', data_get($items, '*.orderno'))
  94. ->whereIn('owerno', data_get($items, '*.owerno'))
  95. ->update(['waveno' => '*']);
  96. $json = json_encode($items->map(function ($orderHeader) {
  97. return ['orderno' => $orderHeader->orderno, 'waveno' => $orderHeader->waveno];
  98. }));
  99. app('LogService')->log(__CLASS__, __METHOD__, 'update OrderHeader' . ' ' . $json);
  100. }
  101. }
  102. $end_time = (string)Carbon::now();
  103. $sync_at = $orderHeaders->last()->editTime ?? $sync_at;
  104. $this->setSyncAt($sync_at);
  105. $this->setSyncStartAt((string)$start_time);
  106. $this->setSyncEndAt($end_time);
  107. }
  108. }