field('id,english_content,content,ids') ->where('ids',1) ->find(); // 遍历每个图像,进行处理 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;
                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 图像文件路径
     * @param int $type 返回类型标识
     * @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"];
        }
    }
}