CollectTaskAllocateCommand.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Facades\Servers\Logs\Log;
  4. use App\Models\CollectProduct;
  5. use App\Models\CollectEquipment;
  6. use App\Models\CollectTask;
  7. use App\Models\CollectTaskRecord;
  8. use App\Models\CollectTaskAllocate;
  9. use App\Models\CollectPlatformConfig;
  10. use Carbon\Carbon;
  11. use Illuminate\Console\Command;
  12. use Illuminate\Support\Facades\DB;
  13. class CollectTaskAllocateCommand extends Command
  14. {
  15. protected $signature = 'collect-task-allocate';
  16. protected $description = '定时分配采集任务设备';
  17. public function __construct()
  18. {
  19. parent::__construct();
  20. }
  21. public function handle()
  22. {
  23. Log::info('collect-task-allocate','分配采集任务开始');
  24. $time = time();
  25. $day = date("Y-m-d",strtotime("-1 day"));
  26. $timestamp = strtotime($day);
  27. $collectTaskList = CollectTask::query()
  28. ->where('insert_time','>=',$timestamp)
  29. ->whereIn('status',[0])
  30. #->whereIn('allocate_status',[0,1])
  31. ->orderBy('allocate_status', 'desc')
  32. ->get()
  33. ->toArray();
  34. if(!$collectTaskList){
  35. Log::info('collect-task-allocate','暂无待分配任务,分配结束');
  36. return 0;
  37. }
  38. $result = $this->allocate($collectTaskList);
  39. if ($result){
  40. Log::info('collect-task-allocate','分配成功');
  41. }
  42. return $result;
  43. }
  44. public function allocate($collectTaskList)
  45. {
  46. $CollectTaskAllocateModel = new CollectTaskAllocate();
  47. $CollectEquipmentModel = new CollectEquipment();
  48. $CollectTaskModel = new CollectTask();
  49. Log::info('collect-task-allocate','分配采集任务开始');
  50. foreach ($collectTaskList as $collectTask){
  51. $page = 1;
  52. $CollectPlatformConfigModel = new CollectPlatformConfig();
  53. $platformConfig = $CollectPlatformConfigModel->getOne($collectTask['platform']);
  54. if (!$platformConfig){
  55. Log::info('collect-task-allocate','暂无配置平台参数,分配结束');
  56. continue;
  57. }
  58. //设备每次执行能采集页数
  59. $pageNumber = ceil((($platformConfig['duration']*$platformConfig['minute_size'])/$platformConfig['page_size']));
  60. //获取任务已分配的最大页数
  61. $maxPage = CollectTaskAllocate::query()
  62. ->where('collect_task_id','=',$collectTask['id'])
  63. ->select(Db::raw('max(end_page) as max_page'))
  64. ->first();
  65. if ($maxPage){
  66. $page = $maxPage['max_page'] + 1;
  67. }
  68. //查询可用设备
  69. $collectEquipmentList = CollectEquipment::query()
  70. ->join('collect_equipment_account','collect_equipment_account.collect_equipment_id','=','collect_equipment.id')
  71. ->where([['collect_equipment.status','=',0],
  72. ['collect_equipment.task_status','=',0],
  73. ['collect_equipment_account.status','=',0],
  74. ['collect_equipment_account.platform','=',$collectTask['platform']],
  75. ])
  76. ->select('collect_equipment.*','collect_equipment_account.username','collect_equipment_account.password')
  77. ->get()
  78. ->toArray();
  79. if (!$collectEquipmentList){
  80. Log::info('collect-task-allocate','暂无可使用设备,分配结束');
  81. continue;
  82. }
  83. //查询设备当日的使用次数
  84. $collectEquipmentIds = array_column($collectEquipmentList,'id');
  85. $collectEquipmentRecordCount = CollectTaskRecord::query()
  86. ->whereIn('collect_equipment_id',$collectEquipmentIds)
  87. ->where([['start_time','>=',strtotime(date('Y-m-d'))],
  88. ['start_time','<=',strtotime(date('Y-m-d',strtotime('+1 day')))],
  89. ['platform','=',$collectTask['platform']]])
  90. ->groupBy('collect_equipment_id')
  91. ->select('collect_equipment_id',DB::raw('count(*) as count'))
  92. ->get()
  93. ->toArray();
  94. //重组使用次数,设备id作为键
  95. if ($collectEquipmentRecordCount){
  96. $collectEquipmentRecordCount = array_column($collectEquipmentRecordCount,'count','collect_equipment_id');
  97. }
  98. //分配设备数量
  99. $allocateNumber = 0;
  100. foreach ($collectEquipmentList as $collectEquipment){
  101. if ($platformConfig){
  102. //查询设备最后执行时间
  103. $collectEquipmentRecord = CollectTaskRecord::query()->where([['collect_equipment_id','=',$collectEquipment['id']]])->select('end_time')->orderBy('end_time','desc')->first();
  104. if($collectEquipmentRecord){
  105. if (($platformConfig['rest_duration'] * 60) > (time()-$collectEquipmentRecord['end_time'])){
  106. continue;
  107. }
  108. }
  109. if (isset($collectEquipmentRecordCount[$collectEquipment['id']])){
  110. if ($platformConfig['day_number'] <= $collectEquipmentRecordCount[$collectEquipment['id']]){
  111. continue;
  112. }
  113. }
  114. }
  115. //分配设备
  116. $start_page = $page;
  117. $end_page = $page + $pageNumber - 1;
  118. $data = [
  119. 'collect_task_id' => $collectTask['id'],
  120. 'collect_equipment_id' => $collectEquipment['id'],
  121. 'company_id' => $collectTask['company_id'],
  122. 'platform' => $collectTask['platform'],
  123. 'product_name' => $collectTask['product_name'],
  124. 'product_specs' => $collectTask['product_specs'],
  125. 'product_brand' => $collectTask['product_brand'],
  126. 'product_keyword' => $collectTask['product_keyword'],
  127. 'minimum_order_quantity'=> $collectTask['minimum_order_quantity'],
  128. 'count' => $platformConfig['page_size'] * $pageNumber,
  129. 'start_page' => $start_page,
  130. 'end_page' => $end_page,
  131. 'status' => 1,
  132. 'duration' => $platformConfig['duration'],
  133. ];
  134. $res = $CollectTaskAllocateModel->add($data);
  135. if (!$res){
  136. Log::info('collect-task-allocate','添加采集任务分配失败');
  137. }
  138. //修改设备占用状态
  139. $res = $CollectEquipmentModel->edit($collectEquipment['id'],['task_status'=>1]);
  140. if (!$res){
  141. Log::info('collect-task-allocate','修改设备占用状态失败');
  142. }
  143. $allocateNumber++;
  144. if ($allocateNumber >= ($collectTask['max_equipment_number'] - $collectTask['equipment_number'])){
  145. break;
  146. }
  147. $page = $end_page + 1;
  148. }
  149. //修改任务状态
  150. $res = $CollectTaskModel->edit($collectTask['id'],['status'=>1,'allocate_status'=>1,'equipment_number'=>($allocateNumber+$collectTask['equipment_number'])]);
  151. if (!$res){
  152. Log::info('collect-task-allocate','修改任务状态失败');
  153. }
  154. Log::info('collect-task-allocate','分配成功');
  155. }
  156. Log::info('collect-task-allocate','分配结束');
  157. return true;
  158. }
  159. }