field('id,english_content,content,ids') ->where('ids',1) ->find(); // 构建任务基础结构(每图生成 N 份任务) foreach ($batch as $k => $v) { $baseItem = [ "sourceDir" => $this->sourceDir($v, 1), "outputDir" => $this->sourceDir($v, 2), "file_name" => $this->sourceDir($v, 3), "type" => $params['type'] ?? '', "selectedOption" => $params['selectedOption'], "prompt" => $template['content'], "width" => $params['width'], "height" => $params['height'] ]; // 创建$num个相同的项目并合并到$arr $arr = array_merge($arr, array_fill(0, $num, $baseItem)); } // 插入队列日志基础信息 $insertData = [ 'create_time' => date('Y-m-d H:i:s'), 'old_image_file' => $params['old_image_file'], 'status' => '等待中', 'image_count' => count($arr), 'params' => json_encode($params, JSON_UNESCAPED_UNICODE) ]; // 模型任务类型处理 if (empty($params['type'])) { // 链式任务:图生文 → 文生文 → 文生图 $insertData['model'] = "gpt-4-vision-preview,"."gpt-4,".$params['selectedOption']; $insertData['model_name'] = '文生图'; // echo "
";print_r($insertData);echo "";die;
$task_id = Db::name('queue_logs')->insertGetId($insertData);
$arr = array_map(function ($item) use ($task_id) {
$item['type'] = '图生文';
$item['chain_next'] = ['文生文', '文生图','图生图'];
$item['task_id'] = $task_id;
return $item;
}, $arr);
$payload = [
'task_id' => $task_id,
'data' => $arr
];
Queue::push('app\job\ImageArrJob', $payload, "arrimage");
} else {
// 指定任务类型
switch ($params['type']) {
case '图生文':
$insertData['model'] = 'gpt-4-vision-preview';
$insertData['model_name'] = '图生文';
break;
case '文生文':
$insertData['model'] = 'gpt-4';
$insertData['model_name'] = '文生文';
break;
case '文生图':
$insertData['model'] = $params['selectedOption'];
$insertData['model_name'] = '文生图';
break;
case '图生图':
$insertData['model'] = "realisticVisionV51_v51VAE-inpainting.safetensors [f0d4872d24]";
$insertData['model_name'] = '图生图';
break;
default:
return false;
}
$task_id = Db::name('queue_logs')->insertGetId($insertData);
$arr = array_map(function ($item) use ($params, $task_id) {
$item['type'] = $params['type'];
$item['task_id'] = $task_id;
return $item;
}, $arr);
// 投递任务到队列
$payload = [
'task_id' => $task_id,
'data' => $arr
];
Queue::push('app\job\ImageArrJob', $payload, "arrimage");
}
return true;
}
/**
* 解析图像路径,返回不同组成部分
*
* @param string $filePath 图像路径(如 uploads/operate/ai/Preview/20240610/xxx.png)
* @param int $type 返回内容类型:
* 1 = 基础路径(去掉日期+文件名)
* sourceDir 源目录uploads/operate/ai/Preview/
* 2 = 输出路径(Preview 替换为 dall-e,并加日期代表当天数据存到当天文件夹中)
* outputDir 输出目录/uploads/operate/ai/dall-e/hua/并加日期
* 3 = 文件名
* file_name 文件名0194b6fdd6203fda369d5e3b74b6b454.png
* @return string|null
*/
public function sourceDir($filePath, $type) {
$arr = [];
$pathParts = explode('/', $filePath);
$filename = array_pop($pathParts); // 最后是文件名
$baseParts = $pathParts;
// 查找是否有 8 位数字(即日期)文件夹
$date = '';
foreach ($pathParts as $index => $part) {
if (preg_match('/^\d{8}$/', $part)) {
$date = $part;
unset($baseParts[$index]); // 日期不算在 basePath 里
break;
}
}
$arr = [
'basePath' => implode('/', $baseParts),
'date' => $date,
'filename' => $filename
];
// 根据类型返回不同路径
if ($type == 1) {
return $arr["basePath"];
}
if ($type == 2) {
return '/' . str_replace('/Preview/', '/dall-e/', $arr["basePath"]) . $arr["date"];
}
if ($type == 3) {
return $arr["filename"];
}
}
}