// // StatisticsPageViewModel.swift // JiaPeiManage // // Created by Ning.ge on 2023/7/13. // import UIKit import RxSwift import PGDatePicker class StatisticsPageViewModel: NSObject { let cellIdentifier:String = "_StatisticsPageCell" // MARK: 服务属性 private let statisticsService: StatisticsServiceType = StatisticsService(networking: StatisticsNetworking()) @objc weak var vc:StatisticsPageController? = nil // MARK: 数据 var stuTotalCountDataModel:StuTotalCountDataModel? var stuCountDataModel:StuCountDataModel? var dateType:DateType = .day var startDate:String = "" var endDate:String = "" var fieldType:Int = 1 //1:时间 2:学员数 var sortType:Int = 2 //1:正序 2:倒序 var type:StatisticsType = .normal // 普通-预售 init(vc:StatisticsPageController) { super.init() self.vc = vc } // MARK: 请求数据 //获取统计报名 func getStatisticsList(isLoading:Bool){ if isLoading {NYTips.show()} self.statisticsService.statisticsStuCount(city: LocalManager.userInfo.city!, schoolId: LocalManager.userInfo.schoolId).subscribe(onSuccess: {[unowned self] stuTotalCountDataModel in print("成功%@",stuTotalCountDataModel) self.stuTotalCountDataModel = stuTotalCountDataModel self.statisticsService.everyDayStuCountRequest(city: LocalManager.userInfo.city!, schoolId: LocalManager.userInfo.schoolId, startDate: self.startDate, endDate: self.endDate, fieldType: self.fieldType,sortType: self.sortType).subscribe(onSuccess: { stuCountDataModel in self.stuCountDataModel = stuCountDataModel // self.itemsSubject.onNext(stuCountDataModel.rows)//消息rx self.vc!.hideLoadAnimation() self.vc!.tableView.reloadData() self.vc!.stopRefresh() NYTips.hide() }, onError: { error in self.vc!.stopRefresh() NYTips.hide() }) .disposed(by: self.vc!.disposeBag) }, onError: { error in self.vc!.stopRefresh() NYTips.hide() }) .disposed(by: self.vc!.disposeBag) } //切换 func switchStatisticsStuCount(){ // 根据不同的 dateType 进行相应的数据请求 switch dateType { case .day: // 发起请求,获取日数据 self.statisticsService.everyDayStuCountRequest(city: LocalManager.userInfo.city!, schoolId: LocalManager.userInfo.schoolId, startDate: self.startDate, endDate: self.endDate, fieldType: self.fieldType,sortType: self.sortType).subscribe(onSuccess: { stuCountDataModel in self.stuCountDataModel = stuCountDataModel self.vc!.tableView.reloadData() }, onError: { error in }) .disposed(by: self.vc!.disposeBag) case .month: // 发起请求,获取月数据 let startMonth = String(self.startDate.prefix(7)) let endMonth = String(self.endDate.prefix(7)) self.statisticsService.everyMonthStuCount(city: LocalManager.userInfo.city!, schoolId: LocalManager.userInfo.schoolId, startMonth: startMonth, endMonth: endMonth, fieldType: self.fieldType,sortType: self.sortType).subscribe(onSuccess: { stuCountDataModel in self.stuCountDataModel = stuCountDataModel self.vc!.tableView.reloadData() }, onError: { error in }) .disposed(by: self.vc!.disposeBag) case .year: // 发起请求,获取年数据 let startYear = String(self.startDate.prefix(4)) let endYear = String(self.endDate.prefix(4)) self.statisticsService.everyYearStuCount(city: LocalManager.userInfo.city!, schoolId: LocalManager.userInfo.schoolId, startYear: startYear, endYear: endYear, fieldType: self.fieldType,sortType: self.sortType).subscribe(onSuccess: { stuCountDataModel in self.stuCountDataModel = stuCountDataModel self.vc!.tableView.reloadData() }, onError: { error in }) .disposed(by: self.vc!.disposeBag) } } // MARK: 公共方法 //配置-日期 func configDefaulthDate(){ switch dateType { case .day: let dates = NYDate.getDateMonth() self.endDate = dates[1] self.startDate = dates[0] case .month: let dates = NYDate.getDateYear() //本年 NYDate.getDateMonthSectionNum(num: -2) self.endDate = String(dates[1].prefix(7)) self.startDate = String(dates[0].prefix(7)) case .year: let dates = NYDate.getDateYearSectionNum(num: 4) self.endDate = String(dates[1].prefix(4)) self.startDate = String(dates[0].prefix(4)) } } //配置显示时间 func configUIdata(){ // 根据不同的 dateType 进行相应的数据请求 var starttime = "" var endtime = "" switch dateType { case .day: starttime = startDate endtime = endDate case .month: starttime = String(startDate.prefix(7)) endtime = String(endDate.prefix(7)) case .year: starttime = String(startDate.prefix(4)) endtime = String(endDate.prefix(4)) } if(type == .presell){ vc!.headerView.date_section_button.setTitle("\(starttime)~\(endtime)", for: .normal) }else { vc!.officialheaderView.date_section_button.setTitle("\(starttime)~\(endtime)", for: .normal) } } //confirm 确定处理 func confirmHandledo(){ //刷新数据 self.startDate = vc!.selectDateView.startdate_button.currentTitle! self.endDate = vc!.selectDateView.enddate_button.currentTitle! self.configUIdata() self.showSelectDateView() self.switchStatisticsStuCount() } //重置 func resetHandledo(){ self.vc!.selectDateView.showCount = 0 self.vc!.selectDateView.startdate_button.setTitle(getButtonDate(date: self.startDate), for: .normal) self.vc!.selectDateView.enddate_button.setTitle(getButtonDate(date: self.endDate), for: .normal) self.vc!.selectDateView.setDateType(type: dateType) self.vc!.selectDateView.selectItemIndex(index: self.vc!.selectDateView.current_button.tag-99) } func getButtonDate(date:String)->String{ var _date = "" switch dateType { case .month: _date = String(date.prefix(7)) case .year: _date = String(date.prefix(4)) case .day: _date = String(date.prefix(10)) } return _date } //时间排序 func getDateSortdo(){ self.fieldType = 1 //1:时间 2:学员数 if type == .presell { self.sortType = vc!.headerView.time_button.isSelected ? 1:2 }else { self.sortType = vc!.officialheaderView.time_button.isSelected ? 1:2 } self.switchStatisticsStuCount() } //学员排序 func getStuCountdo(){ self.fieldType = 2 //1:时间 2:学员数 if type == .presell { self.sortType = vc!.headerView.student_button.isSelected ? 1:2 }else { self.sortType = vc!.officialheaderView.student_button.isSelected ? 1:2 } self.switchStatisticsStuCount() } //切换swictdo selectedSegmentIndex do func selectedSegmentIndexdo(dateType:DateType){ self.dateType = dateType self.configDefaulthDate() self.configUIdata() vc!.selectDateView.showCount = 0 self.switchStatisticsStuCount() } // MARK: selectDateView //显示selectDateView func showSelectDateView(){ if(self.vc!.selectDateView.isHidden) { let bottomY = (type == .presell ? vc!.headerView.qmui_bottom : vc!.officialheaderView.qmui_bottom ) //计算相对坐标 let headerFrameInSuperview = vc!.tableView.convert(CGPoint(x: 0, y: bottomY), to: vc!.tableView.superview) vc!.selectDateView.snp.remakeConstraints { make in make.top.equalTo(headerFrameInSuperview.y-vc!.navBar.bottom+(isIphoneX==true ? 20:0)) make.left.right.equalToSuperview() make.height.equalTo(172.f) } vc!.loadViewIfNeeded()//提醒刷 //显示 vc!.selectDateView.startdate_button.setTitle(startDate, for: .normal) vc!.selectDateView.enddate_button.setTitle(endDate, for: .normal) vc!.selectDateView.setDateType(type: dateType) vc!.selectDateView.isHidden = false vc!.selectDateViewBgBtn.isHidden = false }else{ //隐藏 vc!.selectDateView.isHidden = true vc!.selectDateViewBgBtn.isHidden = true } } //显示时间选择器 func showPGDatePickManager(tag:Int){ switch dateType { case .day: let datePickerManager = PGDatePickManager() datePickerManager.headerViewBackgroundColor = UIColor("#031223") datePickerManager.titleLabel.text = "选择年月日" datePickerManager.titleLabel.textColor = UIColor.white datePickerManager.cancelButtonTextColor = .db_fontGray datePickerManager.confirmButtonTextColor = .db_green let datePicker = datePickerManager.datePicker! datePicker.tag = tag datePicker.lineBackgroundColor = .db_green datePicker.textColorOfSelectedRow = .db_green datePicker.backgroundColor = UIColor("#031223") datePicker.delegate = self datePicker.isHiddenMiddleText = false; datePicker.datePickerType = .segment; datePicker.datePickerMode = .date vc!.present(datePickerManager, animated: false, completion: nil) case .month: let datePickerManager = PGDatePickManager() datePickerManager.headerViewBackgroundColor = UIColor("#031223") datePickerManager.titleLabel.text = "选择年月" datePickerManager.titleLabel.textColor = UIColor.white datePickerManager.cancelButtonTextColor = .db_fontGray datePickerManager.confirmButtonTextColor = .db_green let datePicker = datePickerManager.datePicker! datePicker.tag = tag datePicker.lineBackgroundColor = .db_green datePicker.textColorOfSelectedRow = .db_green datePicker.backgroundColor = UIColor("#031223") datePicker.delegate = self datePicker.isHiddenMiddleText = false; datePicker.datePickerType = .segment datePicker.datePickerMode = .yearAndMonth vc!.present(datePickerManager, animated: false, completion: nil) case .year: let datePickerManager = PGDatePickManager() datePickerManager.headerViewBackgroundColor = UIColor("#031223") datePickerManager.titleLabel.text = "选择年" datePickerManager.titleLabel.textColor = UIColor.white datePickerManager.cancelButtonTextColor = .db_fontGray datePickerManager.confirmButtonTextColor = .db_green let datePicker = datePickerManager.datePicker! datePicker.tag = tag datePicker.lineBackgroundColor = .db_green datePicker.textColorOfSelectedRow = .db_green datePicker.backgroundColor = UIColor("#031223") datePicker.delegate = self datePicker.isHiddenMiddleText = false; datePicker.datePickerType = .segment datePicker.datePickerMode = .year vc!.present(datePickerManager, animated: false, completion: nil) } } } //数据源 extension StatisticsPageViewModel:UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if stuCountDataModel != nil&&(stuCountDataModel?.rows!.count)!>0 { return (stuCountDataModel?.rows.count)!+1 } return 0 } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { if (type == .presell){ if stuTotalCountDataModel != nil { vc!.headerView.setStuTotalCountDataModel(stuTotalCountDataModel: stuTotalCountDataModel!) }else{ return UIView() } return vc!.headerView } if stuTotalCountDataModel != nil { vc!.officialheaderView.setStuTotalCountDataModel(stuTotalCountDataModel: stuTotalCountDataModel!) }else{ return UIView() } return vc!.officialheaderView } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { var height = 232.f if (type == .presell){ height = 352.f } return height } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! StatisticsPageCell cell.contentView.backgroundColor = ((indexPath.row%2) != 0) ? UIColor("#113357") : UIColor("#0B2B4D") cell.backgroundColor = ((indexPath.row%2) != 0) ? UIColor("#113357") : UIColor("#0B2B4D") if (indexPath.row==0){ let obj = (stuCountDataModel?.data)! as StuCountTotalModel cell.date_label.text = "总计" cell.num_label.text = String(obj.total) cell.num_label.textColor = .db_green }else{ let info = (stuCountDataModel?.rows[indexPath.row-1])! as StuCountInfoModel cell.date_label.text = info.dateTime cell.num_label.text = String(info.stuCount) cell.num_label.textColor = .db_fontGray } return cell } } //事件 extension StatisticsPageViewModel:UITableViewDelegate { } //PGDatePickerDelegate extension StatisticsPageViewModel: PGDatePickerDelegate { func datePicker(_ datePicker: PGDatePicker!, didSelectDate dateComponents: DateComponents!) { print("dateComponents = ", dateComponents) var date = String(format: "%02d", dateComponents.year ?? 0)+"-"+String(format: "%02d", dateComponents.month ?? 0)+"-"+String(format: "%02d", dateComponents.day ?? 0) date = getButtonDate(date: date) if datePicker.tag == 1 { vc!.selectDateView.startdate_button.setTitle(date, for: .normal) }else if datePicker.tag == 2 { vc!.selectDateView.enddate_button.setTitle(date, for: .normal) } } }