========== 模拟测试逗号分隔文件ID处理逻辑 ========== 开始测试... 测试用例 1: 正常情况:第一个文件可用 -------------------------------------------------- 处理营业执照文件ID: '20f3262a-9cbb-4be1-9504-50d1dd1a1cf8,ff83a66a-33d3-4447-b7ee-137f1534659f' 分割结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f] 尝试ID 1: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 ✅ 文件存在且可访问 返回文件: business_license_v1.jpg ✅ 测试成功:找到可用文件 business_license_v1.jpg 测试用例 2: 备用文件:第一个不可访问,使用第二个 -------------------------------------------------- 处理营业执照文件ID: 'old-file-id,ff83a66a-33d3-4447-b7ee-137f1534659f' 分割结果: [old-file-id, ff83a66a-33d3-4447-b7ee-137f1534659f] 尝试ID 1: old-file-id ⚠️ 文件记录存在但不可访问 尝试ID 2: ff83a66a-33d3-4447-b7ee-137f1534659f ✅ 文件存在且可访问 返回文件: business_license_v2.jpg ✅ 测试成功:找到可用文件 business_license_v2.jpg 测试用例 3: 全部失败:所有文件都不可用 -------------------------------------------------- 处理身份证正面文件ID: 'invalid-id,old-file-id' 分割结果: [invalid-id, old-file-id] 尝试ID 1: invalid-id ❌ 文件记录不存在 尝试ID 2: old-file-id ⚠️ 文件记录存在但不可访问 结果: 所有文件都不可用,返回null ❌ 测试结果:未找到可用文件 测试用例 4: 单个文件:兼容原有格式 -------------------------------------------------- 处理身份证反面文件ID: '20f3262a-9cbb-4be1-9504-50d1dd1a1cf8' 分割结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8] 尝试ID 1: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 ✅ 文件存在且可访问 返回文件: business_license_v1.jpg ✅ 测试成功:找到可用文件 business_license_v1.jpg 测试用例 5: 包含空格:自动去除空格 -------------------------------------------------- 处理营业执照文件ID: ' 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 , ff83a66a-33d3-4447-b7ee-137f1534659f ' 分割结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f] 尝试ID 1: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 ✅ 文件存在且可访问 返回文件: business_license_v1.jpg ✅ 测试成功:找到可用文件 business_license_v1.jpg 测试用例 6: 包含空ID:跳过空值 -------------------------------------------------- 处理身份证正面文件ID: '20f3262a-9cbb-4be1-9504-50d1dd1a1cf8,,ff83a66a-33d3-4447-b7ee-137f1534659f' 分割结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f] 尝试ID 1: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 ✅ 文件存在且可访问 返回文件: business_license_v1.jpg ✅ 测试成功:找到可用文件 business_license_v1.jpg 测试用例 7: 空字符串:返回null -------------------------------------------------- 处理身份证反面文件ID: '' 结果: 文件ID为空,返回null ❌ 测试结果:未找到可用文件 ========== 实际代码逻辑对比 ========== VATDataService.php 中的实际实现: ```php private function getExistingFileFromIds($fileIds, $fileType) { // 1. 按逗号分割文件ID $idArray = array_map('trim', explode(',', $fileIds)); // 2. 逐个查询文件记录 foreach ($idArray as $fileId) { if (empty($fileId)) continue; $file = $this->getFileById($fileId); if ($file) { // 3. 验证文件可访问性 if ($this->checkFileExists($file['F_FilePath'])) { return $file; // 返回第一个可用文件 } } } return null; // 所有文件都不可用 } ``` 关键特性: ✅ 支持逗号分隔的多个文件ID ✅ 自动去除ID前后的空格 ✅ 跳过空的文件ID ✅ 按顺序查找,返回第一个可用文件 ✅ 通过HTTP HEAD请求验证文件实际可访问性 ✅ 兼容原有的单文件ID格式 ✅ 提供详细的日志记录 使用场景: 1. 数据库中存储: '新文件ID,备用文件ID1,备用文件ID2' 2. 系统自动选择第一个可用的文件 3. 提高文档生成的成功率 4. 减少因单个文件损坏导致的失败 ========== 测试完成 ==========