diff --git a/file/src/main/java/com/baiyue/file/service/QualificationPackageService.java b/file/src/main/java/com/baiyue/file/service/QualificationPackageService.java index 5519973f0..ff4903161 100644 --- a/file/src/main/java/com/baiyue/file/service/QualificationPackageService.java +++ b/file/src/main/java/com/baiyue/file/service/QualificationPackageService.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; +import org.springframework.util.StringUtils; @Service public class QualificationPackageService { @@ -45,9 +46,10 @@ public class QualificationPackageService { String legalPersonIdDocumentUrl = storedLegalPersonId == null ? null : storedLegalPersonId.documentUrl(); var request = new IamQualificationClient.RequiredPackageRequest( - tenantId, normalizedCreditCode, storedBusinessLicense.documentUrl(), businessLicense.getOriginalFilename(), + tenantId, normalizedCreditCode, storedBusinessLicense.documentUrl(), + originalFileName(businessLicense, storedBusinessLicense, "business-license"), businessLicenseValidTo, replaceBusinessLicense, legalPersonIdDocumentUrl, - legalPersonId == null ? null : legalPersonId.getOriginalFilename(), + legalPersonId == null ? null : originalFileName(legalPersonId, storedLegalPersonId, "legal-person-id"), legalPersonIdValidTo, replaceLegalPersonId); try { var response = platform @@ -87,6 +89,13 @@ public class QualificationPackageService { if (storedFile != null) storage.delete(storedFile); } + private String originalFileName(MultipartFile file, LocalQualificationStorage.StoredFile stored, String fallback) { + String original = file.getOriginalFilename(); + if (StringUtils.hasText(original)) return original; + String storedName = stored == null ? null : stored.fileName(); + return StringUtils.hasText(storedName) ? storedName : fallback; + } + public record PackageUploadResult(Long businessLicenseQualificationId, Long legalPersonIdQualificationId, String tenantStatus, diff --git a/file/src/test/java/com/baiyue/file/service/QualificationPackageServiceTest.java b/file/src/test/java/com/baiyue/file/service/QualificationPackageServiceTest.java index 43d1b1944..cf7d0d345 100644 --- a/file/src/test/java/com/baiyue/file/service/QualificationPackageServiceTest.java +++ b/file/src/test/java/com/baiyue/file/service/QualificationPackageServiceTest.java @@ -83,6 +83,25 @@ class QualificationPackageServiceTest { verify(fixture.storage, never()).store(TENANT_ID, fixture.legalPersonId); } + @Test + void missingMultipartOriginalNamesUseStoredNamesForIamRegistration() { + var fixture = fixture(); + var businessLicense = new MockMultipartFile("businessLicense", "", "image/png", new byte[] {1}); + var legalPersonId = new MockMultipartFile("legalPersonId", "", "image/png", new byte[] {2}); + when(fixture.storage.store(TENANT_ID, businessLicense)).thenReturn(fixture.businessStored); + when(fixture.storage.store(TENANT_ID, legalPersonId)).thenReturn(fixture.legalPersonStored); + when(fixture.iamClient.submitRequiredPackage(eq("internal-token"), any())).thenReturn(ApiResponse.success( + new IamQualificationClient.RequiredPackageResponse(31L, 32L, "PROFILE_REQUIRED", null, null))); + + fixture.service.upload(TENANT_ID, businessLicense, legalPersonId, + "91310101abcde12345", null, null, false, false, false); + + var captor = ArgumentCaptor.forClass(IamQualificationClient.RequiredPackageRequest.class); + verify(fixture.iamClient).submitRequiredPackage(eq("internal-token"), captor.capture()); + assertEquals("business.pdf", captor.getValue().businessLicenseOriginalFileName()); + assertEquals("legal-person.png", captor.getValue().legalPersonIdOriginalFileName()); + } + @Test void missingBusinessLicenseAndOrphanedLegalPersonParametersStillFailClosed() { var fixture = fixture(); diff --git a/scripts/admin-test-env-modules/merchant-qualification-fixture.mjs b/scripts/admin-test-env-modules/merchant-qualification-fixture.mjs index 4a63fcfeb..b754e0466 100644 --- a/scripts/admin-test-env-modules/merchant-qualification-fixture.mjs +++ b/scripts/admin-test-env-modules/merchant-qualification-fixture.mjs @@ -60,8 +60,8 @@ export async function run(context, { publishEnvironment = true } = {}) { if (!tenantId || !username || !password) throw new Error('创建下单客户未返回完整管理员凭据') const packageForm = new FormData() - packageForm.append('businessLicense', new Blob([QUALIFICATION_IMAGE], { type: 'image/png' }), `business-${suffix}.png`) - packageForm.append('legalPersonId', new Blob([QUALIFICATION_IMAGE], { type: 'image/png' }), `legal-person-${suffix}.png`) + packageForm.append('businessLicense', new File([QUALIFICATION_IMAGE], `business-${suffix}.png`, { type: 'image/png' })) + packageForm.append('legalPersonId', new File([QUALIFICATION_IMAGE], `legal-person-${suffix}.png`, { type: 'image/png' })) const unifiedSocialCreditCode = `91440300${suffix}` const packageResponse = await context.requestWithBody('POST', `/api/platform/v1/files/qualifications/${encodeURIComponent(tenantId)}/required-package?unifiedSocialCreditCode=${encodeURIComponent(unifiedSocialCreditCode)}`,