========== 测试营业执照逗号分隔ID处理 ========== 功能说明: 营业执照原件现在支持逗号分隔的多个文件ID,系统会: 1. 按逗号分割文件ID 2. 逐个尝试查询和下载文件 3. 使用第一个下载成功的文件 4. 如果所有文件都下载失败,则报错 测试用例: 1. 单个文件ID 输入: '20f3262a-9cbb-4be1-9504-50d1dd1a1cf8' 说明: 兼容原有的单文件ID格式 解析结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8] 处理逻辑: 逐个尝试ID 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 2. 两个文件ID 输入: '20f3262a-9cbb-4be1-9504-50d1dd1a1cf8,ff83a66a-33d3-4447-b7ee-137f1534659f' 说明: 第一个文件可用时使用第一个 解析结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f] 处理逻辑: 逐个尝试ID 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 → ff83a66a-33d3-4447-b7ee-137f1534659f 3. 第一个文件无效 输入: 'invalid-id,ff83a66a-33d3-4447-b7ee-137f1534659f' 说明: 第一个文件无效时使用第二个 解析结果: [invalid-id, ff83a66a-33d3-4447-b7ee-137f1534659f] 处理逻辑: 逐个尝试ID invalid-id → ff83a66a-33d3-4447-b7ee-137f1534659f 4. 包含空格的ID 输入: ' 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 , ff83a66a-33d3-4447-b7ee-137f1534659f ' 说明: 自动去除ID前后的空格 解析结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f] 处理逻辑: 逐个尝试ID 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 → ff83a66a-33d3-4447-b7ee-137f1534659f 5. 包含空ID 输入: '20f3262a-9cbb-4be1-9504-50d1dd1a1cf8,,ff83a66a-33d3-4447-b7ee-137f1534659f' 说明: 自动跳过空的ID 解析结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f] 处理逻辑: 逐个尝试ID 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 → ff83a66a-33d3-4447-b7ee-137f1534659f 6. 所有ID都无效 输入: 'invalid-id1,invalid-id2,invalid-id3' 说明: 所有文件都无效时应该报错 解析结果: [invalid-id1, invalid-id2, invalid-id3] 处理逻辑: 逐个尝试ID invalid-id1 → invalid-id2 → invalid-id3 7. 空字符串 输入: '' 说明: 字段为空时应该报错 解析结果: [] 处理逻辑: 直接报错 - 文件ID为空 处理流程对比: 修改前 (依赖VATDataService预处理): 1. VATDataService.getExistingFileFromIds() - 查找可用文件 2. VATDocumentGenerator.processBusinessLicense() - 使用预选文件 3. 问题: 如果VATDataService选择的文件下载失败,没有备用方案 修改后 (直接处理逗号分隔ID): 1. VATDocumentGenerator.processBusinessLicense() - 直接处理原始ID字段 2. 按逗号分割ID列表 3. 逐个尝试查询文件记录 4. 逐个尝试下载文件 5. 使用第一个下载成功的文件 6. 优势: 即使某个文件查询成功但下载失败,也会尝试下一个 关键改进: ✅ 直接从数据库字段获取ID,不依赖VATDataService的预处理 ✅ 在下载层面进行重试,而不仅仅是查询层面 ✅ 提供详细的每个ID的处理日志 ✅ 与身份证处理逻辑保持一致 日志输出示例: [INFO] 营业执照文件ID: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8,ff83a66a-33d3-4447-b7ee-137f1534659f [INFO] 营业执照文件ID列表: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f [INFO] 尝试营业执照文件ID 1: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8 [INFO] 尝试下载营业执照文件: business_license_v1.jpg [INFO] 营业执照下载成功: business_license_v1.jpg (ID: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8) [INFO] 营业执照最终使用文件: business_license_v1.jpg 错误处理示例: [WARNING] 营业执照文件记录不存在: ID invalid-id [WARNING] 营业执照文件URL为空: ID empty-url-id [WARNING] 营业执照下载失败: old_license.jpg (ID: broken-file-id) [INFO] 尝试营业执照文件ID 2: ff83a66a-33d3-4447-b7ee-137f1534659f [INFO] 营业执照下载成功: business_license_v2.jpg (ID: ff83a66a-33d3-4447-b7ee-137f1534659f) 与身份证处理的一致性: 现在营业执照和身份证都采用相同的处理模式: 1. 直接从数据库原始字段获取ID 2. 支持逗号分隔的多个ID 3. 逐个尝试直到成功 4. 提供详细的处理日志 5. 严格的错误处理 数据库字段要求: BusinessLicensePic: '主文件ID,备用文件ID1,备用文件ID2' LegalPersonIdNumberFrontPic: '主文件ID,备用文件ID1,备用文件ID2' LegalPersonIdNumberBackPic: '主文件ID,备用文件ID1,备用文件ID2' 优势总结: ✅ 提高成功率 - 多个备用文件降低失败风险 ✅ 统一处理 - 所有原件文件采用相同逻辑 ✅ 详细日志 - 便于问题排查和监控 ✅ 向后兼容 - 完全支持原有的单文件ID格式 ✅ 实时重试 - 在下载层面进行重试,更加可靠 ========== 测试完成 ==========