ImageArrJob.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. namespace app\job;
  3. use think\Db;
  4. use think\queue\Job;
  5. use think\Queue;
  6. /**
  7. * ImageArrJob 图像任务初始化队列
  8. * 用于将批量图像任务按类型分发至下游子队列(图生文/文生文/文生图)
  9. */
  10. class ImageArrJob
  11. {
  12. /**
  13. * 队列任务执行函数
  14. *
  15. * @param Job $job 当前队列任务对象
  16. * @param array $data 传入的数据,包含 task_id 和图像列表 data
  17. * task_id:队列id
  18. * data:队列数据
  19. */
  20. public function fire(Job $job, $data)
  21. {
  22. // 将 $data 强制转换为数组(兼容对象/字符串等类型)
  23. $data = (array)$data;
  24. if (empty($data['status_val']) || $data['status_val'] == '文生文') {
  25. Queue::push('app\job\TextToTextJob', $data, 'txttotxt');
  26. echo date('Y-m-d H:i:s') . " 文生文已启动\n";
  27. }elseif (empty($data['status_val']) || $data['status_val'] == '文生图') {
  28. Queue::push('app\job\TextToImageJob', $data, 'txttoimg');
  29. echo date('Y-m-d H:i:s') . " 文生图已启动\n";
  30. }else if (empty($data['status_val']) || $data['status_val'] == '图生文') {
  31. Queue::push('app\job\ImageJob', $data, 'imgtotxt');
  32. echo date('Y-m-d H:i:s') . " 图生文已启动\n";
  33. }else if (empty($data['status_val']) || $data['status_val'] == '图生图') {
  34. Queue::push('app\job\ImageToImageJob', $data, 'imgtoimg');
  35. echo date('Y-m-d H:i:s') . " 图生图已启动\n";
  36. } else {
  37. $task_id = $data['task_id'];
  38. $images = $data['data'];
  39. foreach ($images as $value) {
  40. $value['task_id'] = $task_id;
  41. // 清理路径:去除末尾 Preview 目录
  42. $sourceDir = rtrim($value["sourceDir"], '/\\');
  43. $dirParts = explode('/', str_replace('\\', '/', $sourceDir));
  44. if (end($dirParts) === 'Preview') {
  45. array_pop($dirParts);
  46. }
  47. $cleanedSourceDir = implode('/', $dirParts);
  48. // 获取文件名并拼接最终路径
  49. $fileName = basename($value['file_name']);
  50. $fullPath = $cleanedSourceDir . '/' . $fileName;
  51. // 写入 image_task_log 队列明细日志记录
  52. $log_id = Db::name('image_task_log')->insertGetId([
  53. 'task_id' => $task_id,
  54. 'file_name' => $fullPath,
  55. 'model_name' => $value['type'] ?? '',
  56. 'status' => 0,
  57. 'log' => '队列中',
  58. 'create_time' => date('Y-m-d H:i:s')
  59. ]);
  60. $value['log_id'] = $log_id;
  61. //若有链式任务,传递下去
  62. $chain_next = $value['chain_next'] ?? [];
  63. switch (trim($value['type'])) {
  64. case '图生文':
  65. Queue::push('app\job\ImageJob', array_merge($value, ['chain_next' => $chain_next]), 'imgtotxt');
  66. break;
  67. case '文生文':
  68. Queue::push('app\job\TextToTextJob', array_merge($value, ['chain_next' => $chain_next]), 'txttotxt');
  69. break;
  70. case '文生图':
  71. Queue::push('app\job\TextToImageJob', array_merge($value, ['chain_next' => $chain_next]), 'txttoimg');
  72. break;
  73. case '图生图':
  74. Queue::push('app\job\ImageToImageJob', array_merge($value, ['chain_next' => $chain_next]), 'imgtoimg');
  75. break;
  76. case '高清放大':
  77. Queue::push('app\job\ImageToSingleJob', array_merge($value, ['chain_next' => $chain_next]), 'single');
  78. break;
  79. default:
  80. \think\Log::warning("未识别的任务类型:" . json_encode($value, JSON_UNESCAPED_UNICODE));
  81. break;
  82. }
  83. }
  84. //更新任务状态为已启动
  85. Db::name('queue_logs')->where('id', $task_id)->update(['status' => '已启动队列']);
  86. echo date('Y-m-d H:i:s') . " 队列已启动\n";
  87. }
  88. //推送后删除当前队列任务
  89. $job->delete();
  90. }
  91. /**
  92. * 任务执行失败回调
  93. *
  94. * @param array $data 原始任务数据
  95. */
  96. public function failed($data)
  97. {
  98. \think\Log::error("ImageArrJob 任务失败:" . json_encode($data, JSON_UNESCAPED_UNICODE));
  99. }
  100. }