From 2b300d29fed49cb5c19fa80e9dcd8378b33c9b7e Mon Sep 17 00:00:00 2001 From: Junhui Chen Date: Sat, 6 Sep 2025 17:17:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=B4=A0=E6=9D=90=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wake/View/Owner/UserInfo/UserInfo.swift | 88 ++++++++++++++++--------- wake/View/Upload/MediaUploadView.swift | 68 +++++++++++++------ 2 files changed, 107 insertions(+), 49 deletions(-) diff --git a/wake/View/Owner/UserInfo/UserInfo.swift b/wake/View/Owner/UserInfo/UserInfo.swift index a013d60..a227376 100644 --- a/wake/View/Owner/UserInfo/UserInfo.swift +++ b/wake/View/Owner/UserInfo/UserInfo.swift @@ -283,6 +283,10 @@ struct UserInfo: View { // MARK: - 首个盲盒自动创建 extension UserInfo { + private struct MaterialSubmitResponse: Codable { + let code: Int + let data: [String]? + } private struct GenerateFileInfo: Codable { let id: String let fileName: String? @@ -315,44 +319,68 @@ extension UserInfo { } private func generateFirstBlindBox(with fileId: String) { - let params: [String: Any] = [ - "box_type": "First", - "material_ids": [fileId] - ] + // 1) 先将文件注册为素材 + let materialPayload: [[String: String]] = [[ + "file_id": fileId, + "preview_file_id": fileId + ]] NetworkService.shared.postWithToken( - path: "/blind_box/generate", - parameters: params - ) { (result: Result) in + path: "/material", + parameters: materialPayload + ) { (matResult: Result) in DispatchQueue.main.async { - switch result { - case .success(let response): - guard response.code == 0, let urlStr = response.data?.resultFile?.url, let url = URL(string: urlStr) else { - self.errorMessage = "Create first blind box failed: invalid response" + switch matResult { + case .success(let matResp): + guard matResp.code == 0, let materialIds = matResp.data, let materialId = materialIds.first else { + self.errorMessage = "Submit material failed" self.showError = true return } - // 下载图片并跳转到盲盒结果页 - URLSession.shared.dataTask(with: url) { data, _, error in - if let error = error { - DispatchQueue.main.async { - self.errorMessage = "Load result image failed: \(error.localizedDescription)" - self.showError = true - } - return - } - guard let data = data, let image = UIImage(data: data) else { - DispatchQueue.main.async { - self.errorMessage = "Invalid image data" - self.showError = true - } - return - } + // 2) 用 material_id 创建首个盲盒 + let params: [String: Any] = [ + "box_type": "First", + "material_ids": [materialId] + ] + NetworkService.shared.postWithToken( + path: "/blind_box/generate", + parameters: params + ) { (result: Result) in DispatchQueue.main.async { - Router.shared.navigate(to: .blindOutcome(media: .image(image), time: nil, description: nil)) + switch result { + case .success(let response): + guard response.code == 0, let urlStr = response.data?.resultFile?.url, let url = URL(string: urlStr) else { + self.errorMessage = "Create first blind box failed: invalid response" + self.showError = true + return + } + // 下载图片并跳转到盲盒结果页 + URLSession.shared.dataTask(with: url) { data, _, error in + if let error = error { + DispatchQueue.main.async { + self.errorMessage = "Load result image failed: \(error.localizedDescription)" + self.showError = true + } + return + } + guard let data = data, let image = UIImage(data: data) else { + DispatchQueue.main.async { + self.errorMessage = "Invalid image data" + self.showError = true + } + return + } + DispatchQueue.main.async { + Router.shared.navigate(to: .blindOutcome(media: .image(image), time: nil, description: nil)) + } + }.resume() + case .failure(let error): + self.errorMessage = "Create first blind box failed: \(error.localizedDescription)" + self.showError = true + } } - }.resume() + } case .failure(let error): - self.errorMessage = "Create first blind box failed: \(error.localizedDescription)" + self.errorMessage = "Submit material failed: \(error.localizedDescription)" self.showError = true } } diff --git a/wake/View/Upload/MediaUploadView.swift b/wake/View/Upload/MediaUploadView.swift index ec21648..8379cd6 100644 --- a/wake/View/Upload/MediaUploadView.swift +++ b/wake/View/Upload/MediaUploadView.swift @@ -49,12 +49,19 @@ private struct QueryResponse: Codable { let data: GenerateData? } +private struct MaterialSubmitResponse: Codable { + let code: Int + let data: [String]? +} + extension MediaUploadView { private func startPollingSecondBox(id: Int64) { pollingTimer?.invalidate() // 每2秒轮询一次查询接口 pollingTimer = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { _ in - querySecondBox(id: id) + DispatchQueue.main.async { + querySecondBox(id: id) + } } // 立即查询一次 querySecondBox(id: id) @@ -422,31 +429,54 @@ struct MediaUploadView: View { print("⚠️ 没有可用的文件ID") return } - // 收集素材 file_id 列表 - let materialIds: [String] = uploadResults.map { $0.value.fileId } - // 调用创建第二个盲盒接口 - let params: [String: Any] = [ - "box_type": "Second", - "material_ids": materialIds - ] + // 1) 先将文件ID提交为素材,获取 material_ids + let materialPayload: [[String: String]] = uploadResults.map { (_, result) in + [ + "file_id": result.fileId, + "preview_file_id": result.thumbnailId ?? result.fileId + ] + } isGeneratingSecond = true NetworkService.shared.postWithToken( - path: "/blind_box/generate", - parameters: params - ) { (result: Result) in + path: "/material", + parameters: materialPayload + ) { (matResult: Result) in DispatchQueue.main.async { - switch result { - case .success(let response): - guard response.code == 0, let id = response.data?.id else { - print("❌ 创建第二个盲盒失败:响应无效") + switch matResult { + case .success(let matResp): + guard matResp.code == 0, let materialIds = matResp.data, !materialIds.isEmpty else { + print("❌ 素材提交失败:响应无效或为空") isGeneratingSecond = false return } - generatedSecondBoxId = id - // 开始轮询结果 - startPollingSecondBox(id: id) + // 2) 用 material_ids 创建第二个盲盒 + let params: [String: Any] = [ + "box_type": "Second", + "material_ids": materialIds + ] + NetworkService.shared.postWithToken( + path: "/blind_box/generate", + parameters: params + ) { (result: Result) in + DispatchQueue.main.async { + switch result { + case .success(let response): + guard response.code == 0, let id = response.data?.id else { + print("❌ 创建第二个盲盒失败:响应无效") + isGeneratingSecond = false + return + } + generatedSecondBoxId = id + // 开始轮询结果 + startPollingSecondBox(id: id) + case .failure(let error): + print("❌ 创建第二个盲盒失败: \(error.localizedDescription)") + isGeneratingSecond = false + } + } + } case .failure(let error): - print("❌ 创建第二个盲盒失败: \(error.localizedDescription)") + print("❌ 素材提交失败: \(error.localizedDescription)") isGeneratingSecond = false } }