info('====================开始检查动漫对话角色和场景图片生成状态===================='); $time_expire_datetime = date('Y-m-d H:i:s', strtotime('-12 hours')); DB::table('mp_anime_episodes')->where('generate_status', '执行中')->where('generate_at', '<', $time_expire_datetime)->update([ 'generate_status' => '失败', 'updated_at'=>date('Y-m-d H:i:s'), ]); $time_start = microtime(true); // 获取待执行的动漫对话数据 $data = DB::table('mp_anime_episodes')->where('generate_status', '执行中')->select('id', 'roles', 'scenes')->get(); foreach ($data as $item) { $id = getProp($item, 'id'); $roles = json_decode(getProp($item, 'roles'), true); $scenes = json_decode(getProp($item, 'scenes'), true); $role_count = count($roles); $scene_count = count($scenes); $role_success_count = 0; $scene_success_count = 0; // 处理角色图片状态 $role_success_count = $this->checkRoles($id, $roles); // 处理场景图片状态 $scene_success_count = $this->checkScenes($id, $scenes); if ($role_success_count == $role_count && $scene_success_count == $scene_count) { // 更新状态为已完成 DB::table('mp_anime_episodes')->where('id', $id)->update(['generate_status' => '已完成', 'updated_at'=>date('Y-m-d H:i:s')]); dLog('generate')->info('动漫对话图片已全部生成完毕'); } } $time_end = microtime(true); dLog('generate')->info('脚本执行时间: '.round($time_end-$time_start, 2).'秒'); dLog('generate')->info('====================结束检查动漫对话角色和场景图片生成状态===================='); } private function checkRoles($id, $roles) { $role_success_count = 0; foreach ($roles as &$role) { $task_id = getProp($role, 'task_id'); $task_status = getProp($role, 'task_status'); if (!$task_id || $task_status == 'success') { $role_success_count++; continue; } $task = DB::table('mp_generate_pic_tasks')->where('id', $task_id)->select('result_url', 'status')->first(); if (in_array(getProp($task, 'status'), ['success', 'failed'])) { $role['task_status'] = 'success'; $role['url'] = ''; $result_url = getProp($task, 'result_url'); if ($result_url && is_json($result_url)) { $role['url'] = json_decode($result_url, true)[0]; } $role_success_count++; } } if ($role_success_count > 0) { DB::table('mp_anime_episodes')->where('id', $id)->update(['roles' => json_encode($roles, 256)]); } return $role_success_count; } private function checkScenes($id, $scenes) { $scene_success_count = 0; foreach ($scenes as &$scene) { $task_id = getProp($scene, 'task_id'); $task_status = getProp($scene, 'task_status'); if (!$task_id || $task_status == 'success') { $scene_success_count++; continue; } $task = DB::table('mp_generate_pic_tasks')->where('id', $task_id)->select('result_url', 'status')->first(); if (in_array(getProp($task, 'status'), ['success', 'failed'])) { $scene['task_status'] = 'success'; $scene['url'] = ''; $result_url = getProp($task, 'result_url'); if ($result_url && is_json($result_url)) { $scene['url'] = json_decode($result_url, true)[0]; } $scene_success_count++; } } if ($scene_success_count > 0) { DB::table('mp_anime_episodes')->where('id', $id)->update(['scenes' => json_encode($scenes, 256)]); } return $scene_success_count; } }