SyncWMSOrderTask.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\OracleDOCOrderHeader;
  4. use App\Services\OracleDOCOrderHeaderService;
  5. use App\Services\OrderService;
  6. use App\ValueStore;
  7. use Carbon\Carbon;
  8. use Illuminate\Console\Command;
  9. use Illuminate\Support\Facades\Cache;
  10. class SyncWMSOrderTask extends Command
  11. {
  12. /**
  13. * @var OrderService $service
  14. */
  15. private $service;
  16. protected $signature = 'sync:order';
  17. private $last_start_key ; // 上一次任务开始时间
  18. private $last_end_key ; // 上一次任务结束时间
  19. private $last_err_key ; // 上一次任务异常时间
  20. private $restart; // 重启时间
  21. private $is_enabled; // 是否开启
  22. protected $description = 'Command description';
  23. public function __construct()
  24. {
  25. parent::__construct();
  26. $this->service = app('OrderService');
  27. }
  28. public function init()
  29. {
  30. $this->last_start_key = config('sync.order_sync.cache_prefix.last_start_at');
  31. $this->last_end_key = config('sync.order_sync.cache_prefix.last_end_at');
  32. $this->last_err_key = config('sync.order_sync.cache_prefix.last_err_at');
  33. $this->restart = config('sync.order_sync.cache_prefix.restart');
  34. $this->is_enabled= config('sync.order_sync.enabled');
  35. }
  36. public function handle()
  37. {
  38. $this->init();
  39. if($this->is_enabled===false)return;
  40. sleep(rand(2,3));
  41. $start_time = Cache::remember($this->last_start_key,null,function (){
  42. return ValueStore::query()->firstOrCreate(['name'=>$this->last_start_key])->first()->value;
  43. });
  44. $end_time = Cache::remember($this->last_end_key,null,function (){
  45. return ValueStore::query()->firstOrCreate(['name'=>$this->last_end_key])->first()->value;
  46. });
  47. $start = Carbon::now();
  48. // 判断上一次任务异常了
  49. // 第一次出现异常没有记录上任务结束时间
  50. if(isset($start_time) && empty($end_time) && $start->diffInMinutes(Carbon::parse($start_time)) < $this->restart)return;
  51. // 这次任务启动时间 距离上一次任务的一个启动时间 小于10
  52. if(isset($start_time) && isset($end_time)
  53. && Carbon::parse($end_time)->lt(Carbon::parse($start_time))
  54. && $start->diffInMinutes(Carbon::parse($start_time)) < $this->restart)
  55. return;
  56. $start = (string)$start;
  57. Cache::put($this->last_start_key,$start);
  58. ValueStore::query()->where('name',$this->last_start_key)->update(['value'=>$start]);
  59. $this->syncCreatedOrder();
  60. $this->syncUpdatedOrder();
  61. $end = (string)Carbon::now();
  62. Cache::put($this->last_end_key,$end);
  63. ValueStore::query()->where('name',$this->last_end_key)->update(['value'=>$end]);
  64. }
  65. public function syncCreatedOrder()
  66. {
  67. /**
  68. * @var OracleDocOrderHeaderService $oracleDOCOrderHeaderService
  69. */
  70. $oracleDOCOrderHeaderService = app('OracleDocOrderHeaderService');
  71. $newest_key = config('sync.order_sync.cache_prefix.created_at');
  72. $newest_list_key = config('sync.order_sync.cache_prefix.newest_list');
  73. $hasKey = config('sync.order_sync.cache_prefix.newest_has');
  74. $prefixKey = config('sync.order_sync.cache_prefix.newest');
  75. ini_set('memory_limit', '1024M');
  76. $last_date = $this->service->getOrderSyncAt($newest_key,'newest'); // 获取创建时间点
  77. $orderHeaders = OracleDOCOrderHeader::query()
  78. ->selectRaw(implode(',',OracleDOCOrderHeaderService::$columns))
  79. ->whereColumn('DOC_Order_Header.editTime','=','DOC_Order_Header.addTime')
  80. ->where('addTime','>=',$last_date)
  81. ->orderBy('DOC_Order_Header.addTime')->get();
  82. if($orderHeaders->count()==0)return;
  83. $orderHeaderList = $orderHeaders->chunk(100);
  84. foreach ($orderHeaderList as $item) {
  85. $item = $oracleDOCOrderHeaderService->loadMissing($item);
  86. $last_order = $item->last(); // 时间点靠后的
  87. $newest_orders = $item->where('addtime',$last_order->addtime);
  88. $orderHeaders = $this->service->filterOrderByCache($item,$newest_list_key); // 对比缓存
  89. if(count($newest_orders)>0 && count($orderHeaders) >0){
  90. $this->service->syncOrder($orderHeaders); // 同步订单
  91. $this->service->cancelOrderCache($newest_list_key,$prefixKey); // 清除缓存
  92. $this->service->pushOrderCache($newest_orders,$prefixKey,$hasKey,$newest_list_key); // 添加缓存
  93. $this->service->setOrderSyncAt($newest_key,$last_order->addtime,count($orderHeaders)>0); // 更新时间
  94. }
  95. }
  96. unset($orderHeaders,$newest_orders,$last_order);
  97. }
  98. public function syncUpdatedOrder()
  99. {
  100. /**
  101. * @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService
  102. */
  103. $oracleDOCOrderHeaderService = app('OracleDocOrderHeaderService');
  104. $renewal_key = config('sync.order_sync.cache_prefix.updated_at');
  105. $renewal_list_key = config('sync.order_sync.cache_prefix.renewal_list');
  106. $hasKey = config('sync.order_sync.cache_prefix.renewal_has');
  107. $prefixKey = config('sync.order_sync.cache_prefix.renewal');
  108. ini_set('memory_limit', '1024M');
  109. $last_date = $this->service->getOrderSyncAt($renewal_key,'renewal'); // 获取更新时间点
  110. $orderHeaders = OracleDOCOrderHeader::query()
  111. ->selectRaw(implode(',',OracleDOCOrderHeaderService::$columns))
  112. ->whereColumn('DOC_Order_Header.editTime','!=','DOC_Order_Header.addTime')
  113. ->where('editTime',">=",$last_date)
  114. ->orderBy('editTime')->get();
  115. if($orderHeaders->count()==0)return;
  116. $orderHeaderList = $orderHeaders->chunk(100);
  117. foreach ($orderHeaderList as $item) {
  118. $item = $oracleDOCOrderHeaderService->loadMissing($item);
  119. $renewal_order = $item->last(); // 时间点靠后的
  120. $renewal_orders = $item->where('edittime',$renewal_order->edittime);
  121. $orderHeaders = $this->service->filterOrderByCache($orderHeaders,$renewal_list_key); // 对比缓存
  122. if(count($renewal_orders)>0 && count($orderHeaders)>0){
  123. $this->service->syncOrder($item); // 同步订单
  124. $this->service->cancelOrderCache($renewal_list_key,$prefixKey); // 清除缓存
  125. $this->service->pushOrderCache($renewal_orders,$prefixKey,$hasKey,$renewal_list_key); // 添加缓存
  126. $this->service->setOrderSyncAt($renewal_key,$renewal_order->edittime,count($orderHeaders)>0); // 更新时间
  127. }
  128. }
  129. unset($orderHeaders,$renewal_orders,$renewal_order);
  130. }
  131. }