where('insert_time','>=',$timestamp) ->whereIn('status',[0]) #->whereIn('allocate_status',[0,1]) ->orderBy('allocate_status', 'desc') ->get() ->toArray(); if(!$collectTaskList){ Log::info('collect-task-allocate','暂无待分配任务,分配结束'); return 0; } $result = $this->allocate($collectTaskList); if ($result){ Log::info('collect-task-allocate','分配成功'); } return $result; } public function allocate($collectTaskList) { $CollectTaskAllocateModel = new CollectTaskAllocate(); $CollectEquipmentModel = new CollectEquipment(); $CollectTaskModel = new CollectTask(); Log::info('collect-task-allocate','分配采集任务开始'); foreach ($collectTaskList as $collectTask){ $page = 1; $CollectPlatformConfigModel = new CollectPlatformConfig(); $platformConfig = $CollectPlatformConfigModel->getOne($collectTask['platform']); if (!$platformConfig){ Log::info('collect-task-allocate','暂无配置平台参数,分配结束'); continue; } //设备每次执行能采集页数 $pageNumber = ceil((($platformConfig['duration']*$platformConfig['minute_size'])/$platformConfig['page_size'])); //获取任务已分配的最大页数 $maxPage = CollectTaskAllocate::query() ->where('collect_task_id','=',$collectTask['id']) ->select(Db::raw('max(end_page) as max_page')) ->first(); if ($maxPage){ $page = $maxPage['max_page'] + 1; } //查询可用设备 $collectEquipmentList = CollectEquipment::query() ->join('collect_equipment_account','collect_equipment_account.collect_equipment_id','=','collect_equipment.id') ->where([['collect_equipment.status','=',0], ['collect_equipment.task_status','=',0], ['collect_equipment_account.status','=',0], ['collect_equipment_account.platform','=',$collectTask['platform']], ]) ->select('collect_equipment.*','collect_equipment_account.username','collect_equipment_account.password') ->get() ->toArray(); if (!$collectEquipmentList){ Log::info('collect-task-allocate','暂无可使用设备,分配结束'); continue; } //查询设备当日的使用次数 $collectEquipmentIds = array_column($collectEquipmentList,'id'); $collectEquipmentRecordCount = CollectTaskRecord::query() ->whereIn('collect_equipment_id',$collectEquipmentIds) ->where([['start_time','>=',strtotime(date('Y-m-d'))], ['start_time','<=',strtotime(date('Y-m-d',strtotime('+1 day')))], ['platform','=',$collectTask['platform']]]) ->groupBy('collect_equipment_id') ->select('collect_equipment_id',DB::raw('count(*) as count')) ->get() ->toArray(); //重组使用次数,设备id作为键 if ($collectEquipmentRecordCount){ $collectEquipmentRecordCount = array_column($collectEquipmentRecordCount,'count','collect_equipment_id'); } //分配设备数量 $allocateNumber = 0; foreach ($collectEquipmentList as $collectEquipment){ if ($platformConfig){ //查询设备最后执行时间 $collectEquipmentRecord = CollectTaskRecord::query()->where([['collect_equipment_id','=',$collectEquipment['id']]])->select('end_time')->orderBy('end_time','desc')->first(); if($collectEquipmentRecord){ if (($platformConfig['rest_duration'] * 60) > (time()-$collectEquipmentRecord['end_time'])){ continue; } } if (isset($collectEquipmentRecordCount[$collectEquipment['id']])){ if ($platformConfig['day_number'] <= $collectEquipmentRecordCount[$collectEquipment['id']]){ continue; } } } //分配设备 $start_page = $page; $end_page = $page + $pageNumber - 1; $data = [ 'collect_task_id' => $collectTask['id'], 'collect_equipment_id' => $collectEquipment['id'], 'company_id' => $collectTask['company_id'], 'platform' => $collectTask['platform'], 'product_name' => $collectTask['product_name'], 'product_specs' => $collectTask['product_specs'], 'product_brand' => $collectTask['product_brand'], 'product_keyword' => $collectTask['product_keyword'], 'minimum_order_quantity'=> $collectTask['minimum_order_quantity'], 'count' => $platformConfig['page_size'] * $pageNumber, 'start_page' => $start_page, 'end_page' => $end_page, 'status' => 1, 'duration' => $platformConfig['duration'], ]; $res = $CollectTaskAllocateModel->add($data); if (!$res){ Log::info('collect-task-allocate','添加采集任务分配失败'); } //修改设备占用状态 $res = $CollectEquipmentModel->edit($collectEquipment['id'],['task_status'=>1]); if (!$res){ Log::info('collect-task-allocate','修改设备占用状态失败'); } $allocateNumber++; if ($allocateNumber >= ($collectTask['max_equipment_number'] - $collectTask['equipment_number'])){ break; } $page = $end_page + 1; } //修改任务状态 $res = $CollectTaskModel->edit($collectTask['id'],['status'=>1,'allocate_status'=>1,'equipment_number'=>($allocateNumber+$collectTask['equipment_number'])]); if (!$res){ Log::info('collect-task-allocate','修改任务状态失败'); } Log::info('collect-task-allocate','分配成功'); } Log::info('collect-task-allocate','分配结束'); return true; } }