| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <?php
- namespace App\Console\Commands;
- use App\Facades\Servers\Logs\Log;
- use App\Models\CollectProduct;
- use App\Models\CollectEquipment;
- use App\Models\CollectTask;
- use App\Models\CollectTaskRecord;
- use App\Models\CollectTaskAllocate;
- use App\Models\CollectPlatformConfig;
- use Carbon\Carbon;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\DB;
- class CollectTaskAllocateCommand extends Command
- {
- protected $signature = 'collect-task-allocate';
- protected $description = '定时分配采集任务设备';
- public function __construct()
- {
- parent::__construct();
- }
- public function handle()
- {
- Log::info('collect-task-allocate','分配采集任务开始');
- $time = time();
- $day = date("Y-m-d",strtotime("-1 day"));
- $timestamp = strtotime($day);
- $collectTaskList = CollectTask::query()
- ->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;
- }
- }
|