StatisticsPageController.swift 21 KB

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