From 123efb1612e4f249561d5002c632ba8549e81ae4 Mon Sep 17 00:00:00 2001 From: wangdl Date: Fri, 19 Jun 2026 11:26:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(IOS-INFO-043):=20add=20=E8=AF=A6=E6=83=85?= =?UTF-8?q?=20and=20=E6=95=B4=E7=90=86=E7=9F=A5=E8=AF=86=E7=82=B9=20toolba?= =?UTF-8?q?r=20buttons=20to=20MaterialReaderView?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MaterialReaderView: add info.circle button → MaterialDetailView - MaterialReaderView: add brain button → trigger parse API + status polling - MaterialReaderView: add triggerParse() with 2s poll loop - KnowledgeSourceService: add parse() method (POST /sources/:id/parse) - ImportStatusResponse: add jobId, progress fields - ParseResponse: new model for parse trigger response Co-Authored-By: Claude Opus 4.7 --- .../UserInterfaceState.xcuserstate | Bin 110992 -> 111001 bytes .../AIStudyApp/Core/Models/APIModels.swift | 8 +++ .../AIStudyApp/Core/Services/APIService.swift | 4 ++ .../MaterialReader/MaterialReaderView.swift | 54 ++++++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/AIStudyApp/AIStudyApp.xcodeproj/project.xcworkspace/xcuserdata/Admin1.xcuserdatad/UserInterfaceState.xcuserstate b/AIStudyApp/AIStudyApp.xcodeproj/project.xcworkspace/xcuserdata/Admin1.xcuserdatad/UserInterfaceState.xcuserstate index 1b90506f82e6050fea8e0f24be5c0105b39d5fa5..400b1d4c29ea554979e76d698f89e1de06674a93 100644 GIT binary patch delta 42647 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%0AJ#;h}HKMEfNBWG{CrYGx4%`VrSo@}Bgvgut< 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 diff --git a/AIStudyApp/AIStudyApp/Core/Models/APIModels.swift b/AIStudyApp/AIStudyApp/Core/Models/APIModels.swift index fd85dc3..be2f283 100644 --- a/AIStudyApp/AIStudyApp/Core/Models/APIModels.swift +++ b/AIStudyApp/AIStudyApp/Core/Models/APIModels.swift @@ -577,13 +577,21 @@ struct CreateImportRequest: Codable { struct ImportStatusResponse: Codable { let id: String + let jobId: String? let status: String? let fileName: String? let knowledgeBaseId: String? let errorMessage: String? + let progress: Int? let itemCount: Int? } +struct ParseResponse: Codable { + let id: String? + let jobId: String? + let status: String? +} + // MARK: - Import Candidate struct ImportCandidate: Codable, Identifiable { diff --git a/AIStudyApp/AIStudyApp/Core/Services/APIService.swift b/AIStudyApp/AIStudyApp/Core/Services/APIService.swift index 8fe12b7..31a959f 100644 --- a/AIStudyApp/AIStudyApp/Core/Services/APIService.swift +++ b/AIStudyApp/AIStudyApp/Core/Services/APIService.swift @@ -546,6 +546,10 @@ class KnowledgeSourceService { func delete(kbId: String, id: String) async throws -> GenericSuccessResponse { return try await client.request("/knowledge-bases/\(kbId)/sources/\(id)", method: "DELETE") } + + func parse(kbId: String, sourceId: String) async throws -> ParseResponse { + return try await client.request("/knowledge-bases/\(kbId)/sources/\(sourceId)/parse", method: "POST") + } } // MARK: - Quiz diff --git a/AIStudyApp/AIStudyApp/Features/MaterialReader/MaterialReaderView.swift b/AIStudyApp/AIStudyApp/Features/MaterialReader/MaterialReaderView.swift index 7a4875b..c17e960 100644 --- a/AIStudyApp/AIStudyApp/Features/MaterialReader/MaterialReaderView.swift +++ b/AIStudyApp/AIStudyApp/Features/MaterialReader/MaterialReaderView.swift @@ -107,6 +107,8 @@ struct MaterialReaderView: View { @State private var apiRestorePosition: ReadingPosition? @Environment(\.scenePhase) private var scenePhase + @State private var isParsing = false + @State private var parseMessage = "" private let title: String private let knowledgeBaseId: String? @@ -191,6 +193,19 @@ struct MaterialReaderView: View { } if let kbId = knowledgeBaseId { + NavigationLink(value: Route.materialDetail( + knowledgeBaseId: kbId, + fileName: title.isEmpty ? "资料" : title, + fileType: vm.materialType, + fileSize: 0, + filePath: vm.filePath, + uploadDate: nil + )) { + Image(systemName: "info.circle") + .font(.system(size: 16)) + .foregroundColor(Color.zxF05) + } + NavigationLink(value: Route.learningSession( taskTitle: title.isEmpty ? "学习资料" : title, taskType: "study", @@ -200,6 +215,14 @@ struct MaterialReaderView: View { .font(.system(size: 16)) .foregroundColor(Color.zxF05) } + + Button { + Task { await triggerParse(kbId: kbId, sourceId: vm.materialId) } + } label: { + Image(systemName: "brain.head.profile") + .font(.system(size: 16)) + .foregroundColor(Color.zxF05) + } } } } @@ -708,6 +731,37 @@ private func formatDuration(_ seconds: Int) -> String { return "\(seconds / 3600)h\(String(format: "%02d", (seconds % 3600) / 60))m" } + private func triggerParse(kbId: String, sourceId: String) async { + guard !isParsing else { return } + isParsing = true + parseMessage = "正在整理知识点..." + print("[MaterialReader] triggerParse START kbId=\(kbId) sourceId=\(sourceId)") + do { + let result = try await KnowledgeSourceService.shared.parse(kbId: kbId, sourceId: sourceId) + print("[MaterialReader] parse queued: id=\(result.jobId ?? "?"), status=\(result.status ?? "?")") + parseMessage = "知识点整理任务已提交" + // Poll status + for _ in 0..<60 { + try await Task.sleep(nanoseconds: 2_000_000_000) + let status = try await DocumentImportService.shared.getStatus(id: result.jobId ?? result.id ?? "") + print("[MaterialReader] parse status: \(status.status ?? "?")") + if status.status == "completed" { + parseMessage = "知识点整理完成" + break + } else if status.status == "failed" { + parseMessage = "整理失败: \(status.errorMessage ?? "未知错误")" + break + } else { + parseMessage = "整理中... \(status.progress ?? 0)%" + } + } + } catch { + print("[MaterialReader] triggerParse ERROR: \(error.localizedDescription)") + parseMessage = "整理失败: \(error.localizedDescription)" + } + isParsing = false + } + private func formatFileSize(_ bytes: UInt64) -> String { if bytes < 1024 { return "\(bytes) B" } if bytes < 1024 * 1024 { return String(format: "%.1f KB", Double(bytes) / 1024) }