import Foundation /// 计划类型(周/月/年)。 public enum PlanType: String, CaseIterable, Hashable, Sendable { case weekly case monthly case yearly public var label: String { switch self { case .weekly: return "周计划" case .monthly: return "月计划" case .yearly: return "年计划" } } } /// 我提交的计划记录。 public struct MyPlanRecord: Hashable, Sendable { public let status: String public let submittedTime: String public let content: String public let attachments: [String] public init(status: String, submittedTime: String, content: String, attachments: [String]) { self.status = status self.submittedTime = submittedTime self.content = content self.attachments = attachments } } /// 小组成员(计划视角)。 public struct PlanMember: Identifiable, Hashable, Sendable { public let id: String public let name: String public let filled: Bool public init(id: String, name: String, filled: Bool) { self.id = id self.name = name self.filled = filled } } /// 小组计划统计(含成员)。 public struct PlanGroup: Identifiable, Hashable, Sendable { public let id: String public let name: String public let checkedCount: Int public let memberCount: Int public let members: [PlanMember] public init(id: String, name: String, checkedCount: Int, memberCount: Int, members: [PlanMember]) { self.id = id self.name = name self.checkedCount = checkedCount self.memberCount = memberCount self.members = members } } /// 计划页聚合数据。 public struct PlanRecord: Hashable, Sendable { public let type: PlanType public let periodKey: String public let canSubmit: Bool public let message: String? public let myChecked: Bool public let myRecord: MyPlanRecord? public let groups: [PlanGroup] public let unassignedCount: Int public init( type: PlanType, periodKey: String, canSubmit: Bool, message: String?, myChecked: Bool, myRecord: MyPlanRecord?, groups: [PlanGroup], unassignedCount: Int ) { self.type = type self.periodKey = periodKey self.canSubmit = canSubmit self.message = message self.myChecked = myChecked self.myRecord = myRecord self.groups = groups self.unassignedCount = unassignedCount } } /// 提交计划页数据。 public struct PlanSubmitData: Hashable, Sendable { public let content: String public let attachments: [String] public let checked: Bool public let canSubmit: Bool public let message: String? public let history: [MyPlanRecord] public init( content: String, attachments: [String], checked: Bool, canSubmit: Bool, message: String?, history: [MyPlanRecord] ) { self.content = content self.attachments = attachments self.checked = checked self.canSubmit = canSubmit self.message = message self.history = history } }