CollectTaskAllocateAgainCommand.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. ['collect_equipment_account.region_id','=',$collectTask['region_id']],
  86. ])
  87. ->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')
  88. ->get()
  89. ->toArray();
  90. if (!$collectEquipmentList){
  91. Log::info('collect-task-allocate','暂无可使用设备,分配结束');
  92. continue;
  93. }
  94. if (!$collectEquipmentList){
  95. Log::info('collect-task-allocate_again','暂无可使用设备,分配结束');
  96. continue;
  97. }
  98. //查询设备当日的使用次数
  99. $collectEquipmentIds = array_column($collectEquipmentList,'id');
  100. $collectEquipmentRecordCount = CollectTaskRecord::query()
  101. ->whereIn('collect_equipment_id',$collectEquipmentIds)
  102. ->where([['start_time','>=',strtotime(date('Y-m-d'))],
  103. ['start_time','<=',strtotime(date('Y-m-d',strtotime('+1 day')))],
  104. ['platform','=',$collectTask['platform']]])
  105. ->groupBy('collect_equipment_id')
  106. ->select('collect_equipment_id',DB::raw('count(*) as count'))
  107. ->get()
  108. ->toArray();
  109. //重组使用次数,设备id作为键
  110. if ($collectEquipmentRecordCount){
  111. $collectEquipmentRecordCount = array_column($collectEquipmentRecordCount,'count','collect_equipment_id');
  112. }
  113. //分配设备数量
  114. $allocateNumber = 0;
  115. foreach ($collectEquipmentList as $collectEquipment){
  116. if ($platformConfig){
  117. //查询设备最后执行时间
  118. $collectEquipmentRecord = CollectTaskRecord::query()->where([['collect_equipment_id','=',$collectEquipment['id']]])->select('end_time')->orderBy('end_time','desc')->first();
  119. if($collectEquipmentRecord){
  120. if (($platformConfig['rest_duration'] * 60) > (time()-$collectEquipmentRecord['end_time'])){
  121. Log::info('collect-task-allocate-again','设备处于休息时间');
  122. continue;
  123. }
  124. }
  125. if (isset($collectEquipmentRecordCount[$collectEquipment['id']])){
  126. if ($platformConfig['day_number'] <= $collectEquipmentRecordCount[$collectEquipment['id']]){
  127. Log::info('collect-task-allocate-again','设备当天该平台可执行次数已用完');
  128. continue;
  129. }
  130. }
  131. }
  132. //分配设备
  133. $data = $collectTask;
  134. unset($data['id']);
  135. $data['status'] = 1;
  136. $data['collect_equipment_id'] = $collectEquipment['collect_equipment_id'];
  137. $data['collect_equipment_account_id'] = $collectEquipment['collect_equipment_account_id'];
  138. $res = $CollectTaskAllocate->add($data);
  139. if (!$res){
  140. Log::info('collect-task-allocate-again','添加采集任务分配失败');
  141. }
  142. //修改设备占用状态
  143. $res = $CollectEquipment->edit($collectEquipment['id'],['task_status'=>1]);
  144. if (!$res){
  145. Log::info('collect-task-allocate-again','修改设备占用状态失败');
  146. }
  147. //修改任务状态
  148. $res = $CollectTaskAllocate->edit($collectTask['id'],['status'=>5]);
  149. if (!$res){
  150. Log::info('collect-task-allocate-again','修改任务状态失败');
  151. }
  152. }
  153. Log::info('collect-task-allocate-again','分配成功');
  154. }
  155. Log::info('collect-task-allocate-again','分配结束');
  156. return true;
  157. }
  158. }