AnimeCheckImgUrlCommand.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <?php
  2. namespace App\Console\Anime;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\DB;
  5. class AnimeCheckImgUrlCommand extends Command
  6. {
  7. /**
  8. * The name and signature of the console command.
  9. *
  10. * @var string
  11. */
  12. protected $signature = 'Anime:checkImgUrl';
  13. /**
  14. * The console command description.
  15. *
  16. * @var string
  17. */
  18. protected $description = '检查动漫对话角色和场景图片生成状态';
  19. /**
  20. * Execute the console command.
  21. *
  22. * @return int
  23. */
  24. public function handle()
  25. {
  26. dLog('generate')->info('====================开始检查动漫对话角色和场景图片生成状态====================');
  27. $time_start = microtime(true);
  28. // 获取待执行的动漫对话数据
  29. $data = DB::table('mp_animes')->where('generate_status', '执行中')->select('id', 'roles', 'scenes')->get();
  30. foreach ($data as $item) {
  31. $id = getProp($item, 'id');
  32. $roles = json_decode(getProp($item, 'roles'), true);
  33. $scenes = json_decode(getProp($item, 'scenes'), true);
  34. $role_count = count($roles);
  35. $scene_count = count($scenes);
  36. $role_success_count = 0;
  37. $scene_success_count = 0;
  38. // 处理角色图片状态
  39. $role_success_count = $this->checkRoles($id, $roles);
  40. // 处理场景图片状态
  41. $scene_success_count = $this->checkScenes($id, $scenes);
  42. if ($role_success_count == $role_count && $scene_success_count == $scene_count) {
  43. // 更新状态为已完成
  44. DB::table('mp_animes')->where('id', $id)->update(['generate_status' => '已完成', 'updated_at'=>date('Y-m-d H:i:s')]);
  45. dLog('generate')->info('动漫对话图片已生成完成');
  46. }
  47. }
  48. $time_end = microtime(true);
  49. dLog('generate')->info('脚本执行时间: '.round($time_end-$time_start, 2).'秒');
  50. dLog('generate')->info('====================结束检查动漫对话角色和场景图片生成状态====================');
  51. }
  52. private function checkRoles($id, $roles) {
  53. $role_success_count = 0;
  54. foreach ($roles as &$role) {
  55. $task_id = getProp($role, 'task_id');
  56. $task_status = getProp($role, 'task_status');
  57. if (!$task_id || $task_status == 'success') {
  58. $role_success_count++;
  59. continue;
  60. }
  61. $task = DB::table('mp_generate_pic_tasks')->where('id', $task_id)->select('result_url', 'status')->first();
  62. if (in_array(getProp($task, 'status'), ['success', 'failed'])) {
  63. $role['task_status'] = 'success';
  64. $role['url'] = '';
  65. $result_url = getProp($task, 'result_url');
  66. if ($result_url && is_json($result_url)) {
  67. $role['url'] = json_decode($result_url, true)[0];
  68. }
  69. $role_success_count++;
  70. }
  71. }
  72. if ($role_success_count > 0) {
  73. DB::table('mp_animes')->where('id', $id)->update(['roles' => json_encode($roles, 256)]);
  74. }
  75. return $role_success_count;
  76. }
  77. private function checkScenes($id, $scenes) {
  78. $scene_success_count = 0;
  79. foreach ($scenes as &$scene) {
  80. $task_id = getProp($scene, 'task_id');
  81. $task_status = getProp($scene, 'task_status');
  82. if (!$task_id || $task_status == 'success') {
  83. $scene_success_count++;
  84. continue;
  85. }
  86. $task = DB::table('mp_generate_pic_tasks')->where('id', $task_id)->select('result_url', 'status')->first();
  87. if (in_array(getProp($task, 'status'), ['success', 'failed'])) {
  88. $scene['task_status'] = 'success';
  89. $scene['url'] = '';
  90. $result_url = getProp($task, 'result_url');
  91. if ($result_url && is_json($result_url)) {
  92. $scene['url'] = json_decode($result_url, true)[0];
  93. }
  94. $scene_success_count++;
  95. }
  96. }
  97. if ($scene_success_count > 0) {
  98. DB::table('mp_animes')->where('id', $id)->update(['scenes' => json_encode($scenes, 256)]);
  99. }
  100. return $scene_success_count;
  101. }
  102. }