StatisticsPageViewModel.swift 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. //
  2. // StatisticsPageViewModel.swift
  3. // JiaPeiManage
  4. //
  5. // Created by Ning.ge on 2023/7/13.
  6. //
  7. import UIKit
  8. import RxSwift
  9. import PGDatePicker
  10. class StatisticsPageViewModel: NSObject {
  11. let cellIdentifier:String = "_StatisticsPageCell"
  12. // MARK: 服务属性
  13. private let statisticsService: StatisticsServiceType = StatisticsService(networking: StatisticsNetworking())
  14. @objc weak var vc:StatisticsPageController? = nil
  15. // MARK: 数据
  16. var stuTotalCountDataModel:StuTotalCountDataModel?
  17. var stuCountDataModel:StuCountDataModel?
  18. var dateType:DateType = .day
  19. var startDate:String = ""
  20. var endDate:String = ""
  21. var fieldType:Int = 1 //1:时间 2:学员数
  22. var sortType:Int = 2 //1:正序 2:倒序
  23. var type:StatisticsType = .normal // 普通-预售
  24. init(vc:StatisticsPageController) {
  25. super.init()
  26. self.vc = vc
  27. }
  28. // MARK: 请求数据
  29. //获取统计报名
  30. func getStatisticsList(isLoading:Bool){
  31. if isLoading {NYTips.show()}
  32. self.statisticsService.statisticsStuCount(city: LocalManager.userInfo.city!, schoolId: LocalManager.userInfo.schoolId).subscribe(onSuccess: {[unowned self] stuTotalCountDataModel in
  33. print("成功%@",stuTotalCountDataModel)
  34. self.stuTotalCountDataModel = stuTotalCountDataModel
  35. 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
  36. self.stuCountDataModel = stuCountDataModel
  37. // self.itemsSubject.onNext(stuCountDataModel.rows)//消息rx
  38. self.vc!.hideLoadAnimation()
  39. self.vc!.tableView.reloadData()
  40. self.vc!.stopRefresh()
  41. NYTips.hide()
  42. }, onError: { error in
  43. self.vc!.stopRefresh()
  44. NYTips.hide()
  45. })
  46. .disposed(by: self.vc!.disposeBag)
  47. }, onError: { error in
  48. self.vc!.stopRefresh()
  49. NYTips.hide()
  50. })
  51. .disposed(by: self.vc!.disposeBag)
  52. }
  53. //切换
  54. func switchStatisticsStuCount(){
  55. // 根据不同的 dateType 进行相应的数据请求
  56. switch dateType {
  57. case .day:
  58. // 发起请求,获取日数据
  59. 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
  60. self.stuCountDataModel = stuCountDataModel
  61. self.vc!.tableView.reloadData()
  62. }, onError: { error in
  63. })
  64. .disposed(by: self.vc!.disposeBag)
  65. case .month:
  66. // 发起请求,获取月数据
  67. let startMonth = String(self.startDate.prefix(7))
  68. let endMonth = String(self.endDate.prefix(7))
  69. 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
  70. self.stuCountDataModel = stuCountDataModel
  71. self.vc!.tableView.reloadData()
  72. }, onError: { error in
  73. })
  74. .disposed(by: self.vc!.disposeBag)
  75. case .year:
  76. // 发起请求,获取年数据
  77. let startYear = String(self.startDate.prefix(4))
  78. let endYear = String(self.endDate.prefix(4))
  79. 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
  80. self.stuCountDataModel = stuCountDataModel
  81. self.vc!.tableView.reloadData()
  82. }, onError: { error in
  83. })
  84. .disposed(by: self.vc!.disposeBag)
  85. }
  86. }
  87. // MARK: 公共方法
  88. //配置-日期
  89. func configDefaulthDate(){
  90. switch dateType {
  91. case .day:
  92. let dates = NYDate.getDateMonth()
  93. self.endDate = dates[1]
  94. self.startDate = dates[0]
  95. case .month:
  96. let dates = NYDate.getDateYear() //本年 NYDate.getDateMonthSectionNum(num: -2)
  97. self.endDate = String(dates[1].prefix(7))
  98. self.startDate = String(dates[0].prefix(7))
  99. case .year:
  100. let dates = NYDate.getDateYearSectionNum(num: 4)
  101. self.endDate = String(dates[1].prefix(4))
  102. self.startDate = String(dates[0].prefix(4))
  103. }
  104. }
  105. //配置显示时间
  106. func configUIdata(){
  107. // 根据不同的 dateType 进行相应的数据请求
  108. var starttime = ""
  109. var endtime = ""
  110. switch dateType {
  111. case .day:
  112. starttime = startDate
  113. endtime = endDate
  114. case .month:
  115. starttime = String(startDate.prefix(7))
  116. endtime = String(endDate.prefix(7))
  117. case .year:
  118. starttime = String(startDate.prefix(4))
  119. endtime = String(endDate.prefix(4))
  120. }
  121. if(type == .presell){
  122. vc!.headerView.date_section_button.setTitle("\(starttime)~\(endtime)", for: .normal)
  123. }else {
  124. vc!.officialheaderView.date_section_button.setTitle("\(starttime)~\(endtime)", for: .normal)
  125. }
  126. }
  127. //confirm 确定处理
  128. func confirmHandledo(){
  129. //刷新数据
  130. self.startDate = vc!.selectDateView.startdate_button.currentTitle!
  131. self.endDate = vc!.selectDateView.enddate_button.currentTitle!
  132. self.configUIdata()
  133. self.showSelectDateView()
  134. self.switchStatisticsStuCount()
  135. }
  136. //重置
  137. func resetHandledo(){
  138. self.vc!.selectDateView.startdate_button.setTitle(getButtonDate(date: self.startDate), for: .normal)
  139. self.vc!.selectDateView.enddate_button.setTitle(getButtonDate(date: self.endDate), for: .normal)
  140. self.vc!.selectDateView.setDateType(type: dateType)
  141. }
  142. func getButtonDate(date:String)->String{
  143. var _date = ""
  144. switch dateType {
  145. case .month:
  146. _date = String(date.prefix(7))
  147. case .year:
  148. _date = String(date.prefix(4))
  149. case .day:
  150. _date = String(date.prefix(10))
  151. }
  152. return _date
  153. }
  154. //时间排序
  155. func getDateSortdo(){
  156. self.fieldType = 1 //1:时间 2:学员数
  157. if type == .presell {
  158. self.sortType = vc!.headerView.time_button.isSelected ? 1:2
  159. }else {
  160. self.sortType = vc!.officialheaderView.time_button.isSelected ? 1:2
  161. }
  162. self.switchStatisticsStuCount()
  163. }
  164. //学员排序
  165. func getStuCountdo(){
  166. self.fieldType = 2 //1:时间 2:学员数
  167. if type == .presell {
  168. self.sortType = vc!.headerView.student_button.isSelected ? 1:2
  169. }else {
  170. self.sortType = vc!.officialheaderView.student_button.isSelected ? 1:2
  171. }
  172. self.switchStatisticsStuCount()
  173. }
  174. //切换swictdo selectedSegmentIndex do
  175. func selectedSegmentIndexdo(dateType:DateType){
  176. self.dateType = dateType
  177. self.configDefaulthDate()
  178. self.configUIdata()
  179. vc!.selectDateView.showCount = 0
  180. self.switchStatisticsStuCount()
  181. }
  182. // MARK: selectDateView
  183. //显示selectDateView
  184. func showSelectDateView(){
  185. if(self.vc!.selectDateView.isHidden)
  186. {
  187. let bottomY = (type == .presell ? vc!.headerView.qmui_bottom : vc!.officialheaderView.qmui_bottom )
  188. //计算相对坐标
  189. let headerFrameInSuperview = vc!.tableView.convert(CGPoint(x: 0, y: bottomY), to: vc!.tableView.superview)
  190. vc!.selectDateView.snp.remakeConstraints { make in
  191. make.top.equalTo(headerFrameInSuperview.y-vc!.navBar.bottom+(isIphoneX==true ? 20:0))
  192. make.left.right.equalToSuperview()
  193. make.height.equalTo(172.f)
  194. }
  195. vc!.loadViewIfNeeded()//提醒刷
  196. //显示
  197. vc!.selectDateView.startdate_button.setTitle(startDate, for: .normal)
  198. vc!.selectDateView.enddate_button.setTitle(endDate, for: .normal)
  199. vc!.selectDateView.setDateType(type: dateType)
  200. vc!.selectDateView.isHidden = false
  201. vc!.selectDateViewBgBtn.isHidden = false
  202. }else{
  203. //隐藏
  204. vc!.selectDateView.isHidden = true
  205. vc!.selectDateViewBgBtn.isHidden = true
  206. }
  207. }
  208. //显示时间选择器
  209. func showPGDatePickManager(tag:Int){
  210. switch dateType {
  211. case .day:
  212. let datePickerManager = PGDatePickManager()
  213. datePickerManager.headerViewBackgroundColor = UIColor("#031223")
  214. datePickerManager.titleLabel.text = "选择年月日"
  215. datePickerManager.titleLabel.textColor = UIColor.white
  216. datePickerManager.cancelButtonTextColor = .db_fontGray
  217. datePickerManager.confirmButtonTextColor = .db_green
  218. let datePicker = datePickerManager.datePicker!
  219. datePicker.tag = tag
  220. datePicker.lineBackgroundColor = .db_green
  221. datePicker.textColorOfSelectedRow = .db_green
  222. datePicker.backgroundColor = UIColor("#031223")
  223. datePicker.delegate = self
  224. datePicker.isHiddenMiddleText = false;
  225. datePicker.datePickerType = .segment;
  226. datePicker.datePickerMode = .date
  227. vc!.present(datePickerManager, animated: false, completion: nil)
  228. case .month:
  229. let datePickerManager = PGDatePickManager()
  230. datePickerManager.headerViewBackgroundColor = UIColor("#031223")
  231. datePickerManager.titleLabel.text = "选择年月"
  232. datePickerManager.titleLabel.textColor = UIColor.white
  233. datePickerManager.cancelButtonTextColor = .db_fontGray
  234. datePickerManager.confirmButtonTextColor = .db_green
  235. let datePicker = datePickerManager.datePicker!
  236. datePicker.tag = tag
  237. datePicker.lineBackgroundColor = .db_green
  238. datePicker.textColorOfSelectedRow = .db_green
  239. datePicker.backgroundColor = UIColor("#031223")
  240. datePicker.delegate = self
  241. datePicker.isHiddenMiddleText = false;
  242. datePicker.datePickerType = .segment
  243. datePicker.datePickerMode = .yearAndMonth
  244. vc!.present(datePickerManager, animated: false, completion: nil)
  245. case .year:
  246. let datePickerManager = PGDatePickManager()
  247. datePickerManager.headerViewBackgroundColor = UIColor("#031223")
  248. datePickerManager.titleLabel.text = "选择年"
  249. datePickerManager.titleLabel.textColor = UIColor.white
  250. datePickerManager.cancelButtonTextColor = .db_fontGray
  251. datePickerManager.confirmButtonTextColor = .db_green
  252. let datePicker = datePickerManager.datePicker!
  253. datePicker.tag = tag
  254. datePicker.lineBackgroundColor = .db_green
  255. datePicker.textColorOfSelectedRow = .db_green
  256. datePicker.backgroundColor = UIColor("#031223")
  257. datePicker.delegate = self
  258. datePicker.isHiddenMiddleText = false;
  259. datePicker.datePickerType = .segment
  260. datePicker.datePickerMode = .year
  261. vc!.present(datePickerManager, animated: false, completion: nil)
  262. }
  263. }
  264. }
  265. //数据源
  266. extension StatisticsPageViewModel:UITableViewDataSource {
  267. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  268. if stuCountDataModel != nil&&(stuCountDataModel?.rows!.count)!>0 {
  269. return (stuCountDataModel?.rows.count)!+1
  270. }
  271. return 0
  272. }
  273. func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  274. if (type == .presell){
  275. if stuTotalCountDataModel != nil {
  276. vc!.headerView.setStuTotalCountDataModel(stuTotalCountDataModel: stuTotalCountDataModel!)
  277. }
  278. return vc!.headerView
  279. }
  280. if stuTotalCountDataModel != nil {
  281. vc!.officialheaderView.setStuTotalCountDataModel(stuTotalCountDataModel: stuTotalCountDataModel!)
  282. }
  283. return vc!.officialheaderView
  284. }
  285. func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  286. var height = 232.f
  287. if (type == .presell){
  288. height = 352.f
  289. }
  290. return height
  291. }
  292. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  293. let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! StatisticsPageCell
  294. cell.contentView.backgroundColor = ((indexPath.row%2) != 0) ? UIColor("#113357") : UIColor("#0B2B4D")
  295. cell.backgroundColor = ((indexPath.row%2) != 0) ? UIColor("#113357") : UIColor("#0B2B4D")
  296. if (indexPath.row==0){
  297. let obj = (stuCountDataModel?.data)! as StuCountTotalModel
  298. cell.date_label.text = "总计"
  299. cell.num_label.text = String(obj.total)
  300. cell.num_label.textColor = .db_green
  301. }else{
  302. let info = (stuCountDataModel?.rows[indexPath.row-1])! as StuCountInfoModel
  303. cell.date_label.text = info.dateTime
  304. cell.num_label.text = String(info.stuCount)
  305. cell.num_label.textColor = .db_fontGray
  306. }
  307. return cell
  308. }
  309. }
  310. //事件
  311. extension StatisticsPageViewModel:UITableViewDelegate {
  312. }
  313. //PGDatePickerDelegate
  314. extension StatisticsPageViewModel: PGDatePickerDelegate {
  315. func datePicker(_ datePicker: PGDatePicker!, didSelectDate dateComponents: DateComponents!) {
  316. print("dateComponents = ", dateComponents)
  317. var date = String(format: "%02d", dateComponents.year ?? 0)+"-"+String(format: "%02d", dateComponents.month ?? 0)+"-"+String(format: "%02d", dateComponents.day ?? 0)
  318. date = getButtonDate(date: date)
  319. if datePicker.tag == 1 {
  320. vc!.selectDateView.startdate_button.setTitle(date, for: .normal)
  321. }else if datePicker.tag == 2 {
  322. vc!.selectDateView.enddate_button.setTitle(date, for: .normal)
  323. }
  324. }
  325. }