feat: 重造领域模型并对齐 android(home/checkin/plan/profile/session)

This commit is contained in:
AndyChen1024
2026-09-15 14:35:52 +08:00
parent ac4492a8f1
commit 14eb5ad44d
6 changed files with 313 additions and 40 deletions

View File

@@ -0,0 +1,119 @@
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
}
}