SyncWMSOrderTask.php 6.2 KB

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