OracleDocWaveDetailService.php 6.1 KB

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