AnimeCheckImgUrlCommand.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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_expire_datetime = date('Y-m-d H:i:s', strtotime('-12 hours'));
  28. DB::table('mp_anime_episodes')->where('generate_status', '执行中')->where('generate_at', '<', $time_expire_datetime)->update([
  29. 'generate_status' => '失败',
  30. 'updated_at'=>date('Y-m-d H:i:s'),
  31. ]);
  32. $time_start = microtime(true);
  33. // 获取待执行的动漫对话数据
  34. $data = DB::table('mp_anime_episodes')->where('generate_status', '执行中')->select('id', 'roles', 'scenes')->get();
  35. foreach ($data as $item) {
  36. $id = getProp($item, 'id');
  37. $roles = json_decode(getProp($item, 'roles'), true);
  38. $scenes = json_decode(getProp($item, 'scenes'), true);
  39. $role_count = count($roles);
  40. $scene_count = count($scenes);
  41. $role_success_count = 0;
  42. $scene_success_count = 0;
  43. // 处理角色图片状态
  44. $role_success_count = $this->checkRoles($id, $roles);
  45. // 处理场景图片状态
  46. $scene_success_count = $this->checkScenes($id, $scenes);
  47. if ($role_success_count == $role_count && $scene_success_count == $scene_count) {
  48. // 更新状态为已完成
  49. DB::table('mp_anime_episodes')->where('id', $id)->update(['generate_status' => '已完成', 'updated_at'=>date('Y-m-d H:i:s')]);
  50. dLog('generate')->info('动漫对话图片已全部生成完毕');
  51. }
  52. }
  53. $time_end = microtime(true);
  54. dLog('generate')->info('脚本执行时间: '.round($time_end-$time_start, 2).'秒');
  55. dLog('generate')->info('====================结束检查动漫对话角色和场景图片生成状态====================');
  56. }
  57. private function checkRoles($id, $roles) {
  58. $role_success_count = 0;
  59. foreach ($roles as &$role) {
  60. $task_id = getProp($role, 'task_id');
  61. $task_status = getProp($role, 'task_status');
  62. if (!$task_id || $task_status == 'success') {
  63. $role_success_count++;
  64. continue;
  65. }
  66. $task = DB::table('mp_generate_pic_tasks')->where('id', $task_id)->select('result_url', 'status')->first();
  67. if (in_array(getProp($task, 'status'), ['success', 'failed'])) {
  68. $role['task_status'] = 'success';
  69. $role['url'] = '';
  70. $result_url = getProp($task, 'result_url');
  71. if ($result_url && is_json($result_url)) {
  72. $role['url'] = json_decode($result_url, true)[0];
  73. }
  74. $role_success_count++;
  75. }
  76. }
  77. if ($role_success_count > 0) {
  78. DB::table('mp_anime_episodes')->where('id', $id)->update(['roles' => json_encode($roles, 256)]);
  79. }
  80. return $role_success_count;
  81. }
  82. private function checkScenes($id, $scenes) {
  83. $scene_success_count = 0;
  84. foreach ($scenes as &$scene) {
  85. $task_id = getProp($scene, 'task_id');
  86. $task_status = getProp($scene, 'task_status');
  87. if (!$task_id || $task_status == 'success') {
  88. $scene_success_count++;
  89. continue;
  90. }
  91. $task = DB::table('mp_generate_pic_tasks')->where('id', $task_id)->select('result_url', 'status')->first();
  92. if (in_array(getProp($task, 'status'), ['success', 'failed'])) {
  93. $scene['task_status'] = 'success';
  94. $scene['url'] = '';
  95. $result_url = getProp($task, 'result_url');
  96. if ($result_url && is_json($result_url)) {
  97. $scene['url'] = json_decode($result_url, true)[0];
  98. }
  99. $scene_success_count++;
  100. }
  101. }
  102. if ($scene_success_count > 0) {
  103. DB::table('mp_anime_episodes')->where('id', $id)->update(['scenes' => json_encode($scenes, 256)]);
  104. }
  105. return $scene_success_count;
  106. }
  107. }