ImageArrJob.php 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. namespace app\job;
  3. use think\Db;
  4. use think\queue\Job;
  5. use think\Queue;
  6. class ImageArrJob
  7. {
  8. public function fire(Job $job, $data)
  9. {
  10. //队列id
  11. $task_id = $data['task_id'];
  12. //队列数据
  13. $images = $data['data'];
  14. foreach ($images as $value) {
  15. $value['task_id'] = $task_id;
  16. // 1. 清理 sourceDir,去掉末尾重复的 Preview
  17. $sourceDir = rtrim($value["sourceDir"], '/\\');
  18. $dirParts = explode('/', str_replace('\\', '/', $sourceDir));
  19. if (end($dirParts) === 'Preview') {
  20. array_pop($dirParts); // 删除末尾 Preview
  21. }
  22. $cleanedSourceDir = implode('/', $dirParts);
  23. // 2. 获取纯文件名
  24. $fileName = basename($value['file_name']);
  25. // 3. 拼接最终路径
  26. $fullPath = $cleanedSourceDir . '/' . $fileName;
  27. // 4. 写入日志记录
  28. $log_id = Db::name('image_task_log')->insertGetId([
  29. 'task_id' => $task_id,
  30. 'file_name' => $fullPath,
  31. 'model_name' => $value['type'] ?? '',
  32. 'status' => 0,
  33. 'log' => '队列中',
  34. 'create_time' => date('Y-m-d H:i:s')
  35. ]);
  36. $value['log_id'] = $log_id;
  37. // 6. 若有链式任务,传递下去
  38. $chain_next = $value['chain_next'] ?? [];
  39. switch (trim($value['type'])) {
  40. case '图生文':
  41. Queue::push('app\job\ImageJob', array_merge($value, ['chain_next' => $chain_next]), 'imgtotxt');
  42. break;
  43. case '文生文':
  44. Queue::push('app\job\TextToTextJob', array_merge($value, ['chain_next' => $chain_next]), 'txttotxt');
  45. break;
  46. case '文生图':
  47. Queue::push('app\job\TextToImageJob', array_merge($value, ['chain_next' => $chain_next]), 'txttoimg');
  48. break;
  49. default:
  50. \think\Log::warning("未识别的任务类型:" . json_encode($value, JSON_UNESCAPED_UNICODE));
  51. break;
  52. }
  53. }
  54. // 6. 更新任务状态为已启动
  55. Db::name('queue_logs')->where('id', $task_id)->update(['status' => '已启动队列']);
  56. echo date('Y-m-d H:i:s') . " 队列已启动\n";
  57. // 7. 删除当前队列任务
  58. $job->delete();
  59. }
  60. public function failed($data)
  61. {
  62. \think\Log::error("ImageArrJob 任务失败:" . json_encode($data, JSON_UNESCAPED_UNICODE));
  63. }
  64. }