StatisticsPageController.swift 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. //
  2. // StatisticsPageController.swift
  3. // JiaPeiManage
  4. //
  5. // Created by Ning.ge on 2023/6/26.
  6. //
  7. import UIKit
  8. import RxSwift
  9. import RxCocoa
  10. import PGDatePicker
  11. enum StatisticsType: Int {
  12. case normal
  13. case presell
  14. }
  15. final class StatisticsPageController: BaseGroupTableViewController {
  16. let cellIdentifier:String = "_StatisticsPageCell"
  17. // MARK: 服务属性
  18. private let statisticsService: StatisticsServiceType = StatisticsService(networking: StatisticsNetworking())
  19. //VM
  20. let statisticsPageViewModel = StatisticsPageViewModel()
  21. // MARK: UI let
  22. let statusBar = UIView().then {
  23. $0.backgroundColor = UIColor.db_theme
  24. }
  25. let navBar = MeTraineeNavBar.loadFromNib().then {
  26. $0.title_label.text = "全部报名统计"
  27. }
  28. //头部 view
  29. let headerView = StatisticsPageHeaderView.loadFromNib().then {
  30. $0.backgroundColor = .db_theme
  31. }
  32. let officialheaderView = StatisticsOfficialPageHeaderView.loadFromNib().then {
  33. $0.backgroundColor = .db_theme
  34. }
  35. //头部 日期选择
  36. let selectDateViewBgBtn = UIButton(type:.custom).then {
  37. $0.isHidden = true
  38. $0.backgroundColor = UIColor.clear
  39. }
  40. let selectDateView = StatisticsSelectDateView.loadFromNib().then {
  41. $0.isHidden = true
  42. }
  43. // MARK: 数据
  44. var stuTotalCountDataModel:StuTotalCountDataModel?
  45. var stuCountDataModel:StuCountDataModel?
  46. var dateType:DateType = .day
  47. var startDate:String = ""
  48. var endDate:String = ""
  49. var fieldType:Int = 1 //1:时间 2:学员数
  50. var sortType:Int = 2 //1:正序 2:倒序
  51. var type:StatisticsType = .normal // 普通-预售
  52. override func setupConstraints() {
  53. statusBar.snp.makeConstraints { (make) in
  54. make.left.right.top.equalToSuperview()
  55. make.height.equalTo(Metric.statusBarHeight)
  56. }
  57. navBar.snp.remakeConstraints { (make) in
  58. make.left.right.equalToSuperview()
  59. make.height.equalTo(Metric.navBarHeight)
  60. make.top.equalTo(statusBar.snp.bottom)
  61. }
  62. tableView.snp.remakeConstraints { make in
  63. make.top.equalTo(navBar.snp.bottom)
  64. make.left.right.bottom.equalToSuperview()
  65. }
  66. selectDateViewBgBtn.snp.makeConstraints { (make) in
  67. make.edges.equalToSuperview()
  68. }
  69. selectDateView.snp.remakeConstraints { make in
  70. make.top.equalTo(352.f)
  71. make.left.right.equalToSuperview()
  72. make.height.equalTo(172.f)
  73. }
  74. }
  75. init(type:StatisticsType) {
  76. self.type = type
  77. super.init()
  78. }
  79. required convenience init?(coder aDecoder: NSCoder) {
  80. fatalError("init(coder:) has not been implemented")
  81. }
  82. override func viewDidLoad() {
  83. super.viewDidLoad()
  84. setupUI()
  85. biandView()
  86. getStatisticsList(isLoading: true)
  87. }
  88. // MARK: 私有方法
  89. //显示selectDateView
  90. func showSelectDateView(){
  91. if(self.selectDateView.isHidden)
  92. {
  93. let bottomY = (type == .presell ? headerView.qmui_bottom : officialheaderView.qmui_bottom )
  94. //计算相对坐标
  95. let headerFrameInSuperview = tableView.convert(CGPoint(x: 0, y: bottomY), to: tableView.superview)
  96. selectDateView.snp.remakeConstraints { make in
  97. make.top.equalTo(headerFrameInSuperview.y-navBar.bottom+(isIphoneX==true ? 20:0))
  98. make.left.right.equalToSuperview()
  99. make.height.equalTo(172.f)
  100. }
  101. self.loadViewIfNeeded()//提醒刷
  102. //显示
  103. self.selectDateView.startdate_button.setTitle(startDate, for: .normal)
  104. self.selectDateView.enddate_button.setTitle(endDate, for: .normal)
  105. self.selectDateView.setDateType(type: dateType)
  106. self.selectDateView.isHidden = false
  107. self.selectDateViewBgBtn.isHidden = false
  108. }else{
  109. //隐藏
  110. self.selectDateView.isHidden = true
  111. self.selectDateViewBgBtn.isHidden = true
  112. }
  113. }
  114. //显示时间选择器
  115. func showPGDatePickManager(tag:Int){
  116. switch dateType {
  117. case .day:
  118. let datePickerManager = PGDatePickManager()
  119. datePickerManager.headerViewBackgroundColor = UIColor("#031223")
  120. datePickerManager.titleLabel.text = "选择年月日"
  121. datePickerManager.titleLabel.textColor = UIColor.white
  122. datePickerManager.cancelButtonTextColor = .db_fontGray
  123. datePickerManager.confirmButtonTextColor = .db_green
  124. let datePicker = datePickerManager.datePicker!
  125. datePicker.tag = tag
  126. datePicker.lineBackgroundColor = .db_green
  127. datePicker.textColorOfSelectedRow = .db_green
  128. datePicker.backgroundColor = UIColor("#031223")
  129. datePicker.delegate = self
  130. datePicker.isHiddenMiddleText = false;
  131. datePicker.datePickerType = .segment;
  132. datePicker.datePickerMode = .date
  133. self.present(datePickerManager, animated: false, completion: nil)
  134. case .month:
  135. let datePickerManager = PGDatePickManager()
  136. datePickerManager.headerViewBackgroundColor = UIColor("#031223")
  137. datePickerManager.titleLabel.text = "选择年月"
  138. datePickerManager.titleLabel.textColor = UIColor.white
  139. datePickerManager.cancelButtonTextColor = .db_fontGray
  140. datePickerManager.confirmButtonTextColor = .db_green
  141. let datePicker = datePickerManager.datePicker!
  142. datePicker.tag = tag
  143. datePicker.lineBackgroundColor = .db_green
  144. datePicker.textColorOfSelectedRow = .db_green
  145. datePicker.backgroundColor = UIColor("#031223")
  146. datePicker.delegate = self
  147. datePicker.isHiddenMiddleText = false;
  148. datePicker.datePickerType = .segment
  149. datePicker.datePickerMode = .yearAndMonth
  150. self.present(datePickerManager, animated: false, completion: nil)
  151. case .year:
  152. let datePickerManager = PGDatePickManager()
  153. datePickerManager.headerViewBackgroundColor = UIColor("#031223")
  154. datePickerManager.titleLabel.text = "选择年"
  155. datePickerManager.titleLabel.textColor = UIColor.white
  156. datePickerManager.cancelButtonTextColor = .db_fontGray
  157. datePickerManager.confirmButtonTextColor = .db_green
  158. let datePicker = datePickerManager.datePicker!
  159. datePicker.tag = tag
  160. datePicker.lineBackgroundColor = .db_green
  161. datePicker.textColorOfSelectedRow = .db_green
  162. datePicker.backgroundColor = UIColor("#031223")
  163. datePicker.delegate = self
  164. datePicker.isHiddenMiddleText = false;
  165. datePicker.datePickerType = .segment
  166. datePicker.datePickerMode = .year
  167. self.present(datePickerManager, animated: false, completion: nil)
  168. }
  169. }
  170. //配置-日期
  171. func configDefaulthDate(){
  172. switch dateType {
  173. case .day:
  174. let dates = NYDate.getDateMonth()
  175. self.endDate = dates[1]
  176. self.startDate = dates[0]
  177. case .month:
  178. let dates = NYDate.getDateYear() //本年 NYDate.getDateMonthSectionNum(num: -2)
  179. self.endDate = String(dates[1].prefix(7))
  180. self.startDate = String(dates[0].prefix(7))
  181. case .year:
  182. let dates = NYDate.getDateYearSectionNum(num: 4)
  183. self.endDate = String(dates[1].prefix(4))
  184. self.startDate = String(dates[0].prefix(4))
  185. }
  186. }
  187. //配置显示时间
  188. func configUIdata(){
  189. // 根据不同的 dateType 进行相应的数据请求
  190. var starttime = ""
  191. var endtime = ""
  192. switch dateType {
  193. case .day:
  194. starttime = startDate
  195. endtime = endDate
  196. case .month:
  197. starttime = String(startDate.prefix(7))
  198. endtime = String(endDate.prefix(7))
  199. case .year:
  200. starttime = String(startDate.prefix(4))
  201. endtime = String(endDate.prefix(4))
  202. }
  203. if(type == .presell){
  204. headerView.date_section_button.setTitle("\(starttime)~\(endtime)", for: .normal)
  205. }else {
  206. officialheaderView.date_section_button.setTitle("\(starttime)~\(endtime)", for: .normal)
  207. }
  208. }
  209. //confirm 确定处理
  210. func confirmHandledo(){
  211. //刷新数据
  212. self.startDate = selectDateView.startdate_button.currentTitle!
  213. self.endDate = selectDateView.enddate_button.currentTitle!
  214. self.configUIdata()
  215. self.showSelectDateView()
  216. self.switchStatisticsStuCount()
  217. }
  218. //重置
  219. func resetHandledo(){
  220. self.selectDateView.startdate_button.setTitle(getButtonDate(date: self.startDate), for: .normal)
  221. self.selectDateView.enddate_button.setTitle(getButtonDate(date: self.endDate), for: .normal)
  222. self.selectDateView.setDateType(type: dateType)
  223. }
  224. func getButtonDate(date:String)->String{
  225. var _date = ""
  226. switch dateType {
  227. case .month:
  228. _date = String(date.prefix(7))
  229. case .year:
  230. _date = String(date.prefix(4))
  231. case .day:
  232. _date = String(date.prefix(10))
  233. }
  234. return _date
  235. }
  236. func setupUI(){
  237. self.view.addSubview(navBar)
  238. self.view.addSubview(statusBar)
  239. self.view.backgroundColor = .db_theme
  240. self.view.insertSubview(selectDateViewBgBtn, at: 9998)
  241. self.view.insertSubview(selectDateView, at: 9999)
  242. self.navBar.back_button.addTarget(self, action: #selector(actionBackdo), for: .touchUpInside)
  243. self.navBar.search_button.isHidden = true
  244. configDefaulthDate()
  245. configUIdata()
  246. if(type == .presell){
  247. //header - 事件
  248. headerView.items_date_segmented.rx.selectedSegmentIndex
  249. .map { DateType(rawValue: $0)! }
  250. .subscribe(onNext: { [weak self] dateType in
  251. self?.dateType = dateType
  252. self?.configDefaulthDate()
  253. self?.configUIdata()
  254. self?.selectDateView.showCount = 0
  255. self?.switchStatisticsStuCount()
  256. print("datetype = \(dateType)")
  257. })
  258. .disposed(by: disposeBag)
  259. //日前选择
  260. headerView.date_section_button.rx.tap.subscribe ({ [unowned self] (_) in
  261. self.showSelectDateView()
  262. }).disposed(by: disposeBag)
  263. //时间排序
  264. headerView.time_button.rx.tap
  265. .subscribe ({ [unowned self] (_) in
  266. headerView.time_button.isSelected = !headerView.time_button.isSelected
  267. self.fieldType = 1 //1:时间 2:学员数
  268. self.sortType = headerView.time_button.isSelected ? 1:2
  269. self.switchStatisticsStuCount()
  270. }).disposed(by: disposeBag)
  271. //学员排序
  272. headerView.student_button.rx.tap.subscribe ({ [unowned self] (_) in
  273. headerView.student_button.isSelected = !headerView.student_button.isSelected
  274. self.fieldType = 2 //1:时间 2:学员数
  275. self.sortType = headerView.student_button.isSelected ? 1:2
  276. self.switchStatisticsStuCount()
  277. }).disposed(by: disposeBag)
  278. }else{
  279. //普通模式
  280. //header - 事件
  281. officialheaderView.items_date_segmented.rx.selectedSegmentIndex
  282. .map { DateType(rawValue: $0)! }
  283. .subscribe(onNext: { [weak self] dateType in
  284. self?.dateType = dateType
  285. self?.configDefaulthDate()
  286. self?.configUIdata()
  287. self?.switchStatisticsStuCount()
  288. print("datetype = \(dateType)")
  289. })
  290. .disposed(by: disposeBag)
  291. //日前选择
  292. officialheaderView.date_section_button.rx.tap.subscribe ({ [unowned self] (_) in
  293. self.showSelectDateView()
  294. }).disposed(by: disposeBag)
  295. //时间排序
  296. officialheaderView.time_button.rx.tap
  297. .subscribe ({ [unowned self] (_) in
  298. officialheaderView.time_button.isSelected = !officialheaderView.time_button.isSelected
  299. self.fieldType = 1 //1:时间 2:学员数
  300. self.sortType = officialheaderView.time_button.isSelected ? 1:2
  301. self.switchStatisticsStuCount()
  302. }).disposed(by: disposeBag)
  303. //学员排序
  304. officialheaderView.student_button.rx.tap.subscribe ({ [unowned self] (_) in
  305. officialheaderView.student_button.isSelected = !officialheaderView.student_button.isSelected
  306. self.fieldType = 2 //1:时间 2:学员数
  307. self.sortType = officialheaderView.student_button.isSelected ? 1:2
  308. self.switchStatisticsStuCount()
  309. }).disposed(by: disposeBag)
  310. }
  311. //hide showSelectDateView
  312. selectDateViewBgBtn.rx.tap.subscribe ({ [unowned self] (_) in
  313. self.showSelectDateView()
  314. }).disposed(by: disposeBag)
  315. //开始时间 事件
  316. selectDateView.startdate_button.rx.tap.subscribe ({ [unowned self] (_) in
  317. self.showPGDatePickManager(tag: 1)
  318. }).disposed(by: disposeBag)
  319. //结束时间 事件
  320. selectDateView.enddate_button.rx.tap.subscribe ({ [unowned self] (_) in
  321. self.showPGDatePickManager(tag: 2)
  322. }).disposed(by: disposeBag)
  323. //本月
  324. selectDateView.month_button.rx.tap.subscribe ({ [unowned self] (_) in
  325. selectDateView.selectItemIndex(index: 0)
  326. }).disposed(by: disposeBag)
  327. //上月
  328. selectDateView.lastmonth_button.rx.tap.subscribe ({ [unowned self] (_) in
  329. selectDateView.selectItemIndex(index: 1)
  330. }).disposed(by: disposeBag)
  331. //近3月
  332. selectDateView.threemonth_button.rx.tap.subscribe ({ [unowned self] (_) in
  333. selectDateView.selectItemIndex(index: 2)
  334. }).disposed(by: disposeBag)
  335. //本年
  336. selectDateView.year_button.rx.tap.subscribe ({ [unowned self] (_) in
  337. selectDateView.selectItemIndex(index: 3)
  338. }).disposed(by: disposeBag)
  339. //重置
  340. selectDateView.reset_button.rx.tap.subscribe ({ [unowned self] (_) in
  341. self.resetHandledo()
  342. }).disposed(by: disposeBag)
  343. //确定
  344. selectDateView.confirm_button.rx.tap.subscribe ({ [unowned self] (_) in
  345. self.confirmHandledo()
  346. }).disposed(by: disposeBag)
  347. }
  348. func biandView(){
  349. tableView.delegate = self
  350. tableView.dataSource = self
  351. tableView.separatorStyle = .none //去除分割线
  352. tableView.register(UINib(nibName: "StatisticsPageCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
  353. tableView.rowHeight = 44.f
  354. if(isIphoneX){
  355. tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
  356. }else {
  357. tableView.contentInset = UIEdgeInsets(top: -25, left: 0, bottom: -25, right: 0)
  358. }
  359. setupRefreshHeader(tableView) {[unowned self] in
  360. self.getStatisticsList(isLoading: false)
  361. }
  362. self.isEmptyDisplay = false
  363. }
  364. //获取统计报名
  365. func getStatisticsList(isLoading:Bool){
  366. if isLoading {NYTips.show()}
  367. self.statisticsService.statisticsStuCount(city: LocalManager.userInfo.city!, schoolId: LocalManager.userInfo.schoolId).subscribe(onSuccess: {[unowned self] stuTotalCountDataModel in
  368. print("成功%@",stuTotalCountDataModel)
  369. self.stuTotalCountDataModel = stuTotalCountDataModel
  370. 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
  371. self.stuCountDataModel = stuCountDataModel
  372. self.hideLoadAnimation()
  373. self.tableView.reloadData()
  374. self.stopRefresh()
  375. NYTips.hide()
  376. }, onError: { error in
  377. self.stopRefresh()
  378. NYTips.hide()
  379. })
  380. .disposed(by: disposeBag)
  381. }, onError: { error in
  382. self.stopRefresh()
  383. NYTips.hide()
  384. })
  385. .disposed(by: disposeBag)
  386. }
  387. //切换
  388. func switchStatisticsStuCount(){
  389. // 根据不同的 dateType 进行相应的数据请求
  390. switch dateType {
  391. case .day:
  392. // 发起请求,获取日数据
  393. 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
  394. self.stuCountDataModel = stuCountDataModel
  395. self.tableView.reloadData()
  396. }, onError: { error in
  397. })
  398. .disposed(by: disposeBag)
  399. case .month:
  400. // 发起请求,获取月数据
  401. let startMonth = String(self.startDate.prefix(7))
  402. let endMonth = String(self.endDate.prefix(7))
  403. 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
  404. self.stuCountDataModel = stuCountDataModel
  405. self.tableView.reloadData()
  406. }, onError: { error in
  407. })
  408. .disposed(by: disposeBag)
  409. case .year:
  410. // 发起请求,获取年数据
  411. let startYear = String(self.startDate.prefix(4))
  412. let endYear = String(self.endDate.prefix(4))
  413. 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
  414. self.stuCountDataModel = stuCountDataModel
  415. self.tableView.reloadData()
  416. }, onError: { error in
  417. })
  418. .disposed(by: disposeBag)
  419. }
  420. }
  421. }
  422. //数据源
  423. extension StatisticsPageController:UITableViewDataSource {
  424. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  425. if stuCountDataModel != nil&&(stuCountDataModel?.rows!.count)!>0 {
  426. return (stuCountDataModel?.rows.count)!+1
  427. }
  428. return 0
  429. }
  430. func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  431. if (type == .presell){
  432. if stuTotalCountDataModel != nil {
  433. headerView.setStuTotalCountDataModel(stuTotalCountDataModel: stuTotalCountDataModel!)
  434. }
  435. return headerView
  436. }
  437. if stuTotalCountDataModel != nil {
  438. officialheaderView.setStuTotalCountDataModel(stuTotalCountDataModel: stuTotalCountDataModel!)
  439. }
  440. return officialheaderView
  441. }
  442. func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  443. var height = 232.f
  444. if (type == .presell){
  445. height = 352.f
  446. }
  447. return height
  448. }
  449. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  450. let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! StatisticsPageCell
  451. cell.contentView.backgroundColor = ((indexPath.row%2) != 0) ? UIColor("#113357") : UIColor("#0B2B4D")
  452. cell.backgroundColor = ((indexPath.row%2) != 0) ? UIColor("#113357") : UIColor("#0B2B4D")
  453. if (indexPath.row==0){
  454. let obj = (stuCountDataModel?.data)! as StuCountTotalModel
  455. cell.date_label.text = "总计"
  456. cell.num_label.text = String(obj.total)
  457. cell.num_label.textColor = .db_green
  458. }else{
  459. let info = (stuCountDataModel?.rows[indexPath.row-1])! as StuCountInfoModel
  460. cell.date_label.text = info.dateTime
  461. cell.num_label.text = String(info.stuCount)
  462. cell.num_label.textColor = .db_fontGray
  463. }
  464. return cell
  465. }
  466. }
  467. //事件
  468. extension StatisticsPageController:UITableViewDelegate {
  469. }
  470. //PGDatePickerDelegate
  471. extension StatisticsPageController: PGDatePickerDelegate {
  472. func datePicker(_ datePicker: PGDatePicker!, didSelectDate dateComponents: DateComponents!) {
  473. print("dateComponents = ", dateComponents)
  474. var date = String(format: "%02d", dateComponents.year ?? 0)+"-"+String(format: "%02d", dateComponents.month ?? 0)+"-"+String(format: "%02d", dateComponents.day ?? 0)
  475. date = getButtonDate(date: date)
  476. if datePicker.tag == 1 {
  477. self.selectDateView.startdate_button.setTitle(date, for: .normal)
  478. }else if datePicker.tag == 2 {
  479. self.selectDateView.enddate_button.setTitle(date, for: .normal)
  480. }
  481. }
  482. }