CollectTaskAllocateAgainCommand.php 7.2 KB

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