CollectTaskAllocateCommand.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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','暂无待分配任务,分配结束:'.$timestamp);
  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. ['collect_equipment_account.region_id','=',$collectTask['region_id']],
  76. ])
  77. ->select('collect_equipment.*','collect_equipment_account.id as collect_equipment_account_id','collect_equipment_account.collect_region_id','collect_equipment_account.username','collect_equipment_account.password')
  78. ->get()
  79. ->toArray();
  80. if (!$collectEquipmentList){
  81. Log::info('collect-task-allocate','暂无可使用设备,分配结束');
  82. continue;
  83. }
  84. //查询设备当日的使用次数
  85. $collectEquipmentIds = array_column($collectEquipmentList,'id');
  86. $collectEquipmentRecordCount = CollectTaskRecord::query()
  87. ->whereIn('collect_equipment_id',$collectEquipmentIds)
  88. ->where([['start_time','>=',strtotime(date('Y-m-d'))],
  89. ['start_time','<=',strtotime(date('Y-m-d',strtotime('+1 day')))],
  90. ['platform','=',$collectTask['platform']]])
  91. ->groupBy('collect_equipment_id')
  92. ->select('collect_equipment_id',DB::raw('count(*) as count'))
  93. ->get()
  94. ->toArray();
  95. //重组使用次数,设备id作为键
  96. if ($collectEquipmentRecordCount){
  97. $collectEquipmentRecordCount = array_column($collectEquipmentRecordCount,'count','collect_equipment_id');
  98. }
  99. //分配设备数量
  100. $allocateNumber = 0;
  101. foreach ($collectEquipmentList as $collectEquipment){
  102. if ($platformConfig){
  103. //查询设备最后执行时间
  104. $collectEquipmentRecord = CollectTaskRecord::query()->where([['collect_equipment_id','=',$collectEquipment['id']]])->select('end_time')->orderBy('end_time','desc')->first();
  105. if($collectEquipmentRecord){
  106. if (($platformConfig['rest_duration'] * 60) > (time()-$collectEquipmentRecord['end_time'])){
  107. continue;
  108. }
  109. }
  110. if (isset($collectEquipmentRecordCount[$collectEquipment['id']])){
  111. if ($platformConfig['day_number'] <= $collectEquipmentRecordCount[$collectEquipment['id']]){
  112. continue;
  113. }
  114. }
  115. }
  116. //分配设备
  117. $start_page = $page;
  118. $end_page = $page + $pageNumber - 1;
  119. $data = [
  120. 'collect_task_id' => $collectTask['id'],
  121. 'collect_equipment_id' => $collectEquipment['id'],
  122. 'collect_equipment_account_id' => $collectEquipment['collect_equipment_account_id'],
  123. 'collect_region_id' => $collectEquipment['collect_region_id'],
  124. 'company_id' => $collectTask['company_id'],
  125. 'platform' => $collectTask['platform'],
  126. 'product_name' => $collectTask['product_name'],
  127. 'product_specs' => $collectTask['product_specs'],
  128. 'product_brand' => $collectTask['product_brand'],
  129. 'sampling_cycle' => $collectTask['sampling_cycle'],
  130. 'sampling_start_time' => $collectTask['sampling_start_time'],
  131. 'sampling_end_time' => $collectTask['sampling_end_time'],
  132. 'minimum_order_quantity'=> $collectTask['minimum_order_quantity'],
  133. 'count' => $platformConfig['page_size'] * $pageNumber,
  134. 'start_page' => $start_page,
  135. 'end_page' => $end_page,
  136. 'status' => 1,
  137. 'duration' => $platformConfig['duration'],
  138. ];
  139. $res = $CollectTaskAllocateModel->add($data);
  140. if (!$res){
  141. Log::info('collect-task-allocate','添加采集任务分配失败');
  142. }
  143. //修改设备占用状态
  144. $res = $CollectEquipmentModel->edit($collectEquipment['id'],['task_status'=>1]);
  145. if (!$res){
  146. Log::info('collect-task-allocate','修改设备占用状态失败');
  147. }
  148. $allocateNumber++;
  149. if ($allocateNumber >= ($collectTask['max_equipment_number'] - $collectTask['equipment_number'])){
  150. break;
  151. }
  152. $page = $end_page + 1;
  153. }
  154. //修改任务状态
  155. $res = $CollectTaskModel->edit($collectTask['id'],['status'=>1,'allocate_status'=>1,'equipment_number'=>($allocateNumber+$collectTask['equipment_number'])]);
  156. if (!$res){
  157. Log::info('collect-task-allocate','修改任务状态失败');
  158. }
  159. Log::info('collect-task-allocate','分配成功');
  160. }
  161. Log::info('collect-task-allocate','分配结束');
  162. return true;
  163. }
  164. }