StatisticsPageViewModel.swift 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  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.showCount = 0
  139. self.vc!.selectDateView.startdate_button.setTitle(getButtonDate(date: self.startDate), for: .normal)
  140. self.vc!.selectDateView.enddate_button.setTitle(getButtonDate(date: self.endDate), for: .normal)
  141. self.vc!.selectDateView.setDateType(type: dateType)
  142. self.vc!.selectDateView.selectItemIndex(index: self.vc!.selectDateView.current_button.tag-99)
  143. }
  144. func getButtonDate(date:String)->String{
  145. var _date = ""
  146. switch dateType {
  147. case .month:
  148. _date = String(date.prefix(7))
  149. case .year:
  150. _date = String(date.prefix(4))
  151. case .day:
  152. _date = String(date.prefix(10))
  153. }
  154. return _date
  155. }
  156. //时间排序
  157. func getDateSortdo(){
  158. self.fieldType = 1 //1:时间 2:学员数
  159. if type == .presell {
  160. self.sortType = vc!.headerView.time_button.isSelected ? 1:2
  161. }else {
  162. self.sortType = vc!.officialheaderView.time_button.isSelected ? 1:2
  163. }
  164. self.switchStatisticsStuCount()
  165. }
  166. //学员排序
  167. func getStuCountdo(){
  168. self.fieldType = 2 //1:时间 2:学员数
  169. if type == .presell {
  170. self.sortType = vc!.headerView.student_button.isSelected ? 1:2
  171. }else {
  172. self.sortType = vc!.officialheaderView.student_button.isSelected ? 1:2
  173. }
  174. self.switchStatisticsStuCount()
  175. }
  176. //切换swictdo selectedSegmentIndex do
  177. func selectedSegmentIndexdo(dateType:DateType){
  178. self.dateType = dateType
  179. self.configDefaulthDate()
  180. self.configUIdata()
  181. vc!.selectDateView.showCount = 0
  182. self.switchStatisticsStuCount()
  183. }
  184. // MARK: selectDateView
  185. //显示selectDateView
  186. func showSelectDateView(){
  187. if(self.vc!.selectDateView.isHidden)
  188. {
  189. let bottomY = (type == .presell ? vc!.headerView.qmui_bottom : vc!.officialheaderView.qmui_bottom )
  190. //计算相对坐标
  191. let headerFrameInSuperview = vc!.tableView.convert(CGPoint(x: 0, y: bottomY), to: vc!.tableView.superview)
  192. vc!.selectDateView.snp.remakeConstraints { make in
  193. make.top.equalTo(headerFrameInSuperview.y-vc!.navBar.bottom+(isIphoneX==true ? 20:0))
  194. make.left.right.equalToSuperview()
  195. make.height.equalTo(172.f)
  196. }
  197. vc!.loadViewIfNeeded()//提醒刷
  198. //显示
  199. vc!.selectDateView.startdate_button.setTitle(startDate, for: .normal)
  200. vc!.selectDateView.enddate_button.setTitle(endDate, for: .normal)
  201. vc!.selectDateView.setDateType(type: dateType)
  202. vc!.selectDateView.isHidden = false
  203. vc!.selectDateViewBgBtn.isHidden = false
  204. }else{
  205. //隐藏
  206. vc!.selectDateView.isHidden = true
  207. vc!.selectDateViewBgBtn.isHidden = true
  208. }
  209. }
  210. //显示时间选择器
  211. func showPGDatePickManager(tag:Int){
  212. switch dateType {
  213. case .day:
  214. let datePickerManager = PGDatePickManager()
  215. datePickerManager.headerViewBackgroundColor = UIColor("#031223")
  216. datePickerManager.titleLabel.text = "选择年月日"
  217. datePickerManager.titleLabel.textColor = UIColor.white
  218. datePickerManager.cancelButtonTextColor = .db_fontGray
  219. datePickerManager.confirmButtonTextColor = .db_green
  220. let datePicker = datePickerManager.datePicker!
  221. datePicker.tag = tag
  222. datePicker.lineBackgroundColor = .db_green
  223. datePicker.textColorOfSelectedRow = .db_green
  224. datePicker.backgroundColor = UIColor("#031223")
  225. datePicker.delegate = self
  226. datePicker.isHiddenMiddleText = false;
  227. datePicker.datePickerType = .segment;
  228. datePicker.datePickerMode = .date
  229. vc!.present(datePickerManager, animated: false, completion: nil)
  230. case .month:
  231. let datePickerManager = PGDatePickManager()
  232. datePickerManager.headerViewBackgroundColor = UIColor("#031223")
  233. datePickerManager.titleLabel.text = "选择年月"
  234. datePickerManager.titleLabel.textColor = UIColor.white
  235. datePickerManager.cancelButtonTextColor = .db_fontGray
  236. datePickerManager.confirmButtonTextColor = .db_green
  237. let datePicker = datePickerManager.datePicker!
  238. datePicker.tag = tag
  239. datePicker.lineBackgroundColor = .db_green
  240. datePicker.textColorOfSelectedRow = .db_green
  241. datePicker.backgroundColor = UIColor("#031223")
  242. datePicker.delegate = self
  243. datePicker.isHiddenMiddleText = false;
  244. datePicker.datePickerType = .segment
  245. datePicker.datePickerMode = .yearAndMonth
  246. vc!.present(datePickerManager, animated: false, completion: nil)
  247. case .year:
  248. let datePickerManager = PGDatePickManager()
  249. datePickerManager.headerViewBackgroundColor = UIColor("#031223")
  250. datePickerManager.titleLabel.text = "选择年"
  251. datePickerManager.titleLabel.textColor = UIColor.white
  252. datePickerManager.cancelButtonTextColor = .db_fontGray
  253. datePickerManager.confirmButtonTextColor = .db_green
  254. let datePicker = datePickerManager.datePicker!
  255. datePicker.tag = tag
  256. datePicker.lineBackgroundColor = .db_green
  257. datePicker.textColorOfSelectedRow = .db_green
  258. datePicker.backgroundColor = UIColor("#031223")
  259. datePicker.delegate = self
  260. datePicker.isHiddenMiddleText = false;
  261. datePicker.datePickerType = .segment
  262. datePicker.datePickerMode = .year
  263. vc!.present(datePickerManager, animated: false, completion: nil)
  264. }
  265. }
  266. }
  267. //数据源
  268. extension StatisticsPageViewModel:UITableViewDataSource {
  269. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  270. if stuCountDataModel != nil&&(stuCountDataModel?.rows!.count)!>0 {
  271. return (stuCountDataModel?.rows.count)!+1
  272. }
  273. return 0
  274. }
  275. func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  276. if (type == .presell){
  277. if stuTotalCountDataModel != nil {
  278. vc!.headerView.setStuTotalCountDataModel(stuTotalCountDataModel: stuTotalCountDataModel!)
  279. }else{
  280. return UIView()
  281. }
  282. return vc!.headerView
  283. }
  284. if stuTotalCountDataModel != nil {
  285. vc!.officialheaderView.setStuTotalCountDataModel(stuTotalCountDataModel: stuTotalCountDataModel!)
  286. }else{
  287. return UIView()
  288. }
  289. return vc!.officialheaderView
  290. }
  291. func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  292. var height = 232.f
  293. if (type == .presell){
  294. height = 352.f
  295. }
  296. return height
  297. }
  298. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  299. let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! StatisticsPageCell
  300. cell.contentView.backgroundColor = ((indexPath.row%2) != 0) ? UIColor("#113357") : UIColor("#0B2B4D")
  301. cell.backgroundColor = ((indexPath.row%2) != 0) ? UIColor("#113357") : UIColor("#0B2B4D")
  302. if (indexPath.row==0){
  303. let obj = (stuCountDataModel?.data)! as StuCountTotalModel
  304. cell.date_label.text = "总计"
  305. cell.num_label.text = String(obj.total)
  306. cell.num_label.textColor = .db_green
  307. }else{
  308. let info = (stuCountDataModel?.rows[indexPath.row-1])! as StuCountInfoModel
  309. cell.date_label.text = info.dateTime
  310. cell.num_label.text = String(info.stuCount)
  311. cell.num_label.textColor = .db_fontGray
  312. }
  313. return cell
  314. }
  315. }
  316. //事件
  317. extension StatisticsPageViewModel:UITableViewDelegate {
  318. }
  319. //PGDatePickerDelegate
  320. extension StatisticsPageViewModel: PGDatePickerDelegate {
  321. func datePicker(_ datePicker: PGDatePicker!, didSelectDate dateComponents: DateComponents!) {
  322. print("dateComponents = ", dateComponents)
  323. var date = String(format: "%02d", dateComponents.year ?? 0)+"-"+String(format: "%02d", dateComponents.month ?? 0)+"-"+String(format: "%02d", dateComponents.day ?? 0)
  324. date = getButtonDate(date: date)
  325. if datePicker.tag == 1 {
  326. vc!.selectDateView.startdate_button.setTitle(date, for: .normal)
  327. }else if datePicker.tag == 2 {
  328. vc!.selectDateView.enddate_button.setTitle(date, for: .normal)
  329. }
  330. }
  331. }