// // GroupMemberListVM.swift // QuickLocation // // Created by 八条 on 2026/6/29. // import RxSwift import RxRelay import RxDataSources import ObjectMapper struct DrivingEventItem: IdentifiableType, Equatable { typealias Identity = String let identity: String let title: String let iconName: String let count: Int init(title: String, iconName: String, count: Int = 0) { self.identity = title self.title = title self.iconName = iconName self.count = count } } typealias DrivingEventSection = SectionModel typealias ScheduleRecordSection = SectionModel class GroupMemberListVM { let groupKey: String var groupModel: GroupInfoModel? struct Output { var sectionedItems: Observable<[GroupMemberListSectionModel]> var drivingSectionedItems: Observable<[DrivingEventSection]> var scheduleSectionedItems: Observable<[ScheduleRecordSection]> } let output: Output var memberId: String = "" private let sectionedItems = PublishSubject<[GroupMemberListSectionModel]>() private let drivingItemsRelay = BehaviorRelay<[DrivingEventItem]>(value: GroupMemberListVM.defaultDrivingEvents) private let scheduleItemsRelay = BehaviorRelay<[ScheduleRecordModel]>(value: []) private var memberList: [GroupMemberModel] = [] private static let defaultDrivingEvents: [DrivingEventItem] = [ DrivingEventItem(title: "急加速", iconName: "GroupMemberList/1"), DrivingEventItem(title: "急转向", iconName: "GroupMemberList/3"), DrivingEventItem(title: "急刹", iconName: "GroupMemberList/5"), DrivingEventItem(title: "手机干扰", iconName: "GroupMemberList/7"), DrivingEventItem(title: "超速", iconName: "GroupMemberList/2"), DrivingEventItem(title: "低速", iconName: "GroupMemberList/4"), DrivingEventItem(title: "频繁变道", iconName: "GroupMemberList/6"), DrivingEventItem(title: "长时间驾驶", iconName: "GroupMemberList/8") ] // 是否当前用户 func isCurrentUser(id: String) -> Bool { id == AppContextManager.shared.userId } // 是否圈主 func isGroupOwn(id: String) -> Bool { guard let model = groupModel else { return false } return model.group_key.contains(id) } func loadData(_ list: [GroupMemberModel]) { var tempmemberList = list tempmemberList.moveToFirst { $0.is_online == true } tempmemberList.moveToFirst { $0.user_id == AppContextManager.shared.userId } tempmemberList.moveToFirst { isGroupOwn(id: $0.user_id) } memberList = tempmemberList memberId = memberList.first?.user_id ?? "" sectionedItems.onNext(memberList.mapSection()) } /// 获取成员在列表中的行号 func rowOf(userId: String) -> Int? { memberList.firstIndex(where: { $0.user_id == userId }) } /// 加载行程记录 func loadScheduleRecords(_ list: [ScheduleRecordModel]) { scheduleItemsRelay.accept(list) } /// 更新驾驶事件统计 func updateDrivingStats(_ stats: DrivingStatsModel) { let items = Self.defaultDrivingEvents.enumerated().map { i, item in let count: Int switch i { case 0: count = stats.hard_acceleration case 1: count = stats.sharp_turn case 2: count = stats.hard_braking case 3: count = stats.signal_loss case 4: count = stats.speeding case 5: count = stats.low_speeding case 6: count = stats.frequent_lane_change case 7: count = stats.long_driving default: count = 0 } return DrivingEventItem(title: item.title, iconName: item.iconName, count: count) } drivingItemsRelay.accept(items) } init(groupKey: String) { self.groupKey = groupKey output = Output( sectionedItems: sectionedItems.asObservable(), drivingSectionedItems: drivingItemsRelay.map { $0.mapSection() }.asObservable(), scheduleSectionedItems: scheduleItemsRelay.map { $0.mapSection() }.asObservable() ) } }