// // StatisticsPageController.swift // JiaPeiManage // // Created by Ning.ge on 2023/6/26. // import UIKit import RxSwift import RxCocoa import PGDatePicker enum StatisticsType: Int { case normal case presell } final class StatisticsPageController: BaseGroupTableViewController { let cellIdentifier:String = "_StatisticsPageCell" // MARK: 服务属性 private let statisticsService: StatisticsServiceType = StatisticsService(networking: StatisticsNetworking()) // MARK: UI let let statusBar = UIView().then { $0.backgroundColor = UIColor.db_theme } let navBar = MeTraineeNavBar.loadFromNib().then { $0.title_label.text = "全部报名统计" } //头部 view let headerView = StatisticsPageHeaderView.loadFromNib().then { $0.backgroundColor = .db_theme } let officialheaderView = StatisticsOfficialPageHeaderView.loadFromNib().then { $0.backgroundColor = .db_theme } //头部 日期选择 let selectDateViewBgBtn = UIButton(type:.custom).then { $0.isHidden = true $0.backgroundColor = UIColor.clear } let selectDateView = StatisticsSelectDateView.loadFromNib().then { $0.isHidden = true } // 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 // 普通-预售 override func setupConstraints() { statusBar.snp.makeConstraints { (make) in make.left.right.top.equalToSuperview() make.height.equalTo(Metric.statusBarHeight) } navBar.snp.remakeConstraints { (make) in make.left.right.equalToSuperview() make.height.equalTo(Metric.navBarHeight) make.top.equalTo(statusBar.snp.bottom) } tableView.snp.remakeConstraints { make in make.top.equalTo(navBar.snp.bottom) make.left.right.bottom.equalToSuperview() } selectDateViewBgBtn.snp.makeConstraints { (make) in make.edges.equalToSuperview() } selectDateView.snp.remakeConstraints { make in make.top.equalTo(352.f) make.left.right.equalToSuperview() make.height.equalTo(172.f) } } init(type:StatisticsType) { self.type = type super.init() } required convenience init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() setupUI() biandView() getStatisticsList(isLoading: true) } // MARK: 私有方法 //显示selectDateView func showSelectDateView(){ if(self.selectDateView.isHidden) { let bottomY = (type == .presell ? headerView.qmui_bottom : officialheaderView.qmui_bottom ) //计算相对坐标 let headerFrameInSuperview = tableView.convert(CGPoint(x: 0, y: bottomY), to: tableView.superview) selectDateView.snp.remakeConstraints { make in make.top.equalTo(headerFrameInSuperview.y-navBar.bottom+(isIphoneX==true ? 20:0)) make.left.right.equalToSuperview() make.height.equalTo(172.f) } self.loadViewIfNeeded()//提醒刷 //显示 self.selectDateView.startdate_button.setTitle(startDate, for: .normal) self.selectDateView.enddate_button.setTitle(endDate, for: .normal) self.selectDateView.setDateType(type: dateType) self.selectDateView.isHidden = false self.selectDateViewBgBtn.isHidden = false }else{ //隐藏 self.selectDateView.isHidden = true self.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 self.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 self.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 self.present(datePickerManager, animated: false, completion: nil) } } //配置-日期 func configDefaulthDate(){ switch dateType { case .day: let dates = NYDate.getDateMonth() self.endDate = dates[1] self.startDate = dates[0] case .month: let dates = 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){ headerView.date_section_button.setTitle("\(starttime)~\(endtime)", for: .normal) }else { officialheaderView.date_section_button.setTitle("\(starttime)~\(endtime)", for: .normal) } } //confirm 确定处理 func confirmHandledo(){ //刷新数据 self.startDate = selectDateView.startdate_button.currentTitle! self.endDate = selectDateView.enddate_button.currentTitle! self.configUIdata() self.showSelectDateView() self.switchStatisticsStuCount() } //重置 func resetHandledo(){ self.selectDateView.startdate_button.setTitle(getButtonDate(date: self.startDate), for: .normal) self.selectDateView.enddate_button.setTitle(getButtonDate(date: self.endDate), for: .normal) self.selectDateView.setDateType(type: dateType) } 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 setupUI(){ self.view.addSubview(navBar) self.view.addSubview(statusBar) self.view.backgroundColor = .db_theme self.view.insertSubview(selectDateViewBgBtn, at: 9998) self.view.insertSubview(selectDateView, at: 9999) self.navBar.back_button.addTarget(self, action: #selector(actionBackdo), for: .touchUpInside) self.navBar.search_button.isHidden = true configDefaulthDate() configUIdata() if(type == .presell){ //header - 事件 headerView.items_date_segmented.rx.selectedSegmentIndex .map { DateType(rawValue: $0)! } .subscribe(onNext: { [weak self] dateType in self?.dateType = dateType self?.configDefaulthDate() self?.configUIdata() self?.switchStatisticsStuCount() print("datetype = \(dateType)") }) .disposed(by: disposeBag) //日前选择 headerView.date_section_button.rx.tap.subscribe ({ [unowned self] (_) in self.showSelectDateView() }).disposed(by: disposeBag) //时间排序 headerView.time_button.rx.tap .subscribe ({ [unowned self] (_) in headerView.time_button.isSelected = !headerView.time_button.isSelected self.fieldType = 1 //1:时间 2:学员数 self.sortType = headerView.time_button.isSelected ? 1:2 self.switchStatisticsStuCount() }).disposed(by: disposeBag) //学员排序 headerView.student_button.rx.tap.subscribe ({ [unowned self] (_) in headerView.student_button.isSelected = !headerView.student_button.isSelected self.fieldType = 2 //1:时间 2:学员数 self.sortType = headerView.student_button.isSelected ? 1:2 self.switchStatisticsStuCount() }).disposed(by: disposeBag) }else{ //普通模式 //header - 事件 officialheaderView.items_date_segmented.rx.selectedSegmentIndex .map { DateType(rawValue: $0)! } .subscribe(onNext: { [weak self] dateType in self?.dateType = dateType self?.configDefaulthDate() self?.configUIdata() self?.switchStatisticsStuCount() print("datetype = \(dateType)") }) .disposed(by: disposeBag) //日前选择 officialheaderView.date_section_button.rx.tap.subscribe ({ [unowned self] (_) in self.showSelectDateView() }).disposed(by: disposeBag) //时间排序 officialheaderView.time_button.rx.tap .subscribe ({ [unowned self] (_) in officialheaderView.time_button.isSelected = !officialheaderView.time_button.isSelected self.fieldType = 1 //1:时间 2:学员数 self.sortType = officialheaderView.time_button.isSelected ? 1:2 self.switchStatisticsStuCount() }).disposed(by: disposeBag) //学员排序 officialheaderView.student_button.rx.tap.subscribe ({ [unowned self] (_) in officialheaderView.student_button.isSelected = !officialheaderView.student_button.isSelected self.fieldType = 2 //1:时间 2:学员数 self.sortType = officialheaderView.student_button.isSelected ? 1:2 self.switchStatisticsStuCount() }).disposed(by: disposeBag) } //hide showSelectDateView selectDateViewBgBtn.rx.tap.subscribe ({ [unowned self] (_) in self.showSelectDateView() }).disposed(by: disposeBag) //开始时间 事件 selectDateView.startdate_button.rx.tap.subscribe ({ [unowned self] (_) in self.showPGDatePickManager(tag: 1) }).disposed(by: disposeBag) //结束时间 事件 selectDateView.enddate_button.rx.tap.subscribe ({ [unowned self] (_) in self.showPGDatePickManager(tag: 2) }).disposed(by: disposeBag) //本月 selectDateView.month_button.rx.tap.subscribe ({ [unowned self] (_) in selectDateView.selectItemIndex(index: 0) }).disposed(by: disposeBag) //上月 selectDateView.lastmonth_button.rx.tap.subscribe ({ [unowned self] (_) in selectDateView.selectItemIndex(index: 1) }).disposed(by: disposeBag) //近3月 selectDateView.threemonth_button.rx.tap.subscribe ({ [unowned self] (_) in selectDateView.selectItemIndex(index: 2) }).disposed(by: disposeBag) //本年 selectDateView.year_button.rx.tap.subscribe ({ [unowned self] (_) in selectDateView.selectItemIndex(index: 3) }).disposed(by: disposeBag) //重置 selectDateView.reset_button.rx.tap.subscribe ({ [unowned self] (_) in self.resetHandledo() }).disposed(by: disposeBag) //确定 selectDateView.confirm_button.rx.tap.subscribe ({ [unowned self] (_) in self.confirmHandledo() }).disposed(by: disposeBag) } func biandView(){ tableView.delegate = self tableView.dataSource = self tableView.separatorStyle = .none //去除分割线 tableView.register(UINib(nibName: "StatisticsPageCell", bundle: nil), forCellReuseIdentifier: cellIdentifier) tableView.rowHeight = 44.f tableView.contentInset = UIEdgeInsets(top: -25, left: 0, bottom: -25, right: 0) setupRefreshHeader(tableView) {[unowned self] in self.getStatisticsList(isLoading: false) } } //获取统计报名 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.hideLoadAnimation() self.tableView.reloadData() self.stopRefresh() NYTips.hide() }, onError: { error in self.stopRefresh() NYTips.hide() }) .disposed(by: disposeBag) }, onError: { error in self.stopRefresh() NYTips.hide() }) .disposed(by: 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.tableView.reloadData() }, onError: { error in }) .disposed(by: 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.tableView.reloadData() }, onError: { error in }) .disposed(by: 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.tableView.reloadData() }, onError: { error in }) .disposed(by: disposeBag) } } } //数据源 extension StatisticsPageController: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 { headerView.setStuTotalCountDataModel(stuTotalCountDataModel: stuTotalCountDataModel!) } return headerView } if stuTotalCountDataModel != nil { officialheaderView.setStuTotalCountDataModel(stuTotalCountDataModel: stuTotalCountDataModel!) } return 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 StatisticsPageController:UITableViewDelegate { } //PGDatePickerDelegate extension StatisticsPageController: 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 { self.selectDateView.startdate_button.setTitle(date, for: .normal) }else if datePicker.tag == 2 { self.selectDateView.enddate_button.setTitle(date, for: .normal) } } }