OracleDocWaveDetailService.php 6.2 KB

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