import Foundation // MARK: - Blind Box Media Type enum BlindBoxMediaType { case video case image case all } // MARK: - Blind Box List struct BlindList: Codable, Identifiable { // API 返回为字符串,这里按字符串处理 let id: String let boxCode: String let userId: String let name: String let boxType: String let features: String? let resultFile: FileInfo? let status: String let workflowInstanceId: String? let videoGenerateTime: String? let createTime: String let coverFile: FileInfo? let description: String? struct FileInfo: Codable { let id: String let fileName: String? let url: String? // 为了兼容任意元数据结构,这里使用字典的最宽松版本 // 如果后续需要更强类型,可以引入自定义的 AnyCodable/JSONValue let metadata: [String: String]? enum CodingKeys: String, CodingKey { case id case fileName = "file_name" case url case metadata } } enum CodingKeys: String, CodingKey { case id case boxCode = "box_code" case userId = "user_id" case name case boxType = "box_type" case features case resultFile = "result_file" case status case workflowInstanceId = "workflow_instance_id" case videoGenerateTime = "video_generate_time" case createTime = "create_time" case coverFile = "cover_file" case description } } // MARK: - Blind Box Count struct BlindCount: Codable { let availableQuantity: Int enum CodingKeys: String, CodingKey { case availableQuantity = "available_quantity" } } // MARK: - Blind Box Data struct BlindBoxData: Codable { let id: String let boxCode: String let userId: String let name: String let boxType: String let features: String? let resultFile: FileInfo? let status: String let workflowInstanceId: String? let videoGenerateTime: String? let createTime: String let coverFile: FileInfo? let description: String // 添加计算属性以获取Int64值 var idValue: Int64 { Int64(id) ?? 0 } var userIdValue: Int64 { Int64(userId) ?? 0 } struct FileInfo: Codable { let id: String let fileName: String? let url: String? let metadata: [String: String]? enum CodingKeys: String, CodingKey { case id case fileName = "file_name" case url case metadata } } enum CodingKeys: String, CodingKey { case id case boxCode = "box_code" case userId = "user_id" case name case boxType = "box_type" case features case resultFile = "result_file" case status case workflowInstanceId = "workflow_instance_id" case videoGenerateTime = "video_generate_time" case createTime = "create_time" case coverFile = "cover_file" case description } init(id: String, boxCode: String, userId: String, name: String, boxType: String, features: String?, resultFile: FileInfo?, status: String, workflowInstanceId: String?, videoGenerateTime: String?, createTime: String, coverFile: FileInfo?, description: String) { self.id = id self.boxCode = boxCode self.userId = userId self.name = name self.boxType = boxType self.features = features self.resultFile = resultFile self.status = status self.workflowInstanceId = workflowInstanceId self.videoGenerateTime = videoGenerateTime self.createTime = createTime self.coverFile = coverFile self.description = description } init(from listItem: BlindList) { self.id = listItem.id self.boxCode = listItem.boxCode self.userId = listItem.userId self.name = listItem.name self.boxType = listItem.boxType self.features = listItem.features // 转换FileInfo类型 if let resultFileInfo = listItem.resultFile { self.resultFile = FileInfo( id: resultFileInfo.id, fileName: resultFileInfo.fileName, url: resultFileInfo.url, metadata: resultFileInfo.metadata ) } else { self.resultFile = nil } self.status = listItem.status self.workflowInstanceId = listItem.workflowInstanceId self.videoGenerateTime = listItem.videoGenerateTime self.createTime = listItem.createTime // 转换coverFile的FileInfo类型 if let coverFileInfo = listItem.coverFile { self.coverFile = FileInfo( id: coverFileInfo.id, fileName: coverFileInfo.fileName, url: coverFileInfo.url, metadata: coverFileInfo.metadata ) } else { self.coverFile = nil } self.description = listItem.description ?? "" } }