From 31b6be2dfcc5a7e9300c90b2216dbd579153c3b0 Mon Sep 17 00:00:00 2001
From: younger_times <841720330@qq.com>
Date: 星期一, 10 七月 2023 19:22:00 +0800
Subject: [PATCH] 新增

---
 WanPai/Root/Course/VC/CourseListVC.swift |  147 +++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 135 insertions(+), 12 deletions(-)

diff --git a/WanPai/Root/Course/VC/CourseListVC.swift b/WanPai/Root/Course/VC/CourseListVC.swift
index 3fc37d5..04f5593 100644
--- a/WanPai/Root/Course/VC/CourseListVC.swift
+++ b/WanPai/Root/Course/VC/CourseListVC.swift
@@ -7,20 +7,62 @@
 
 import UIKit
 import QMUIKit
+import JQTools
+import RxSwift
+import RxDataSources
+import RxCocoa
 
-class CourseListVC: BaseVC {
+class CourseListViewModel{
+
+    var disposeBag = DisposeBag()
+
+    var packageTypeData = BehaviorRelay<[NormalSimpleModel]?>(value: nil)
+    var storesData = BehaviorRelay<[NormalSimpleModel]?>(value: nil)
+    var selectPackeType = BehaviorRelay<NormalSimpleModel?>(value: nil)
+    var selectStore = BehaviorRelay<NormalSimpleModel?>(value: nil)
+    var distanceSort = BehaviorRelay<SortType?>(value: nil)
+    var salesRanking = BehaviorRelay<SortType?>(value: nil)
+    var search = BehaviorRelay<String?>(value: nil)
+
+    func getDefaultData(){
+        Services.coursePackageType().subscribe(onNext: {[weak self] data in
+            if var datas = data.data{
+                datas.insert(NormalSimpleModel(id: -1, name: "全部"), at: 0)
+                self?.packageTypeData.accept(datas)
+            }
+        }) { error in
+
+        }.disposed(by: disposeBag)
+
+        Services.queryStoreList().subscribe(onNext: {[weak self] data in
+            if var datas = data.data{
+                datas.insert(NormalSimpleModel(id: -1, name: "全部"), at: 0)
+                self?.storesData.accept(datas)
+            }
+        }) { error in
+
+        }.disposed(by: disposeBag)
+    }
+}
+
+class CourseListVC: BaseVC,Refreshable{
 
     @IBOutlet weak var view_topView: UIView!
     @IBOutlet weak var tf_search: QMUITextField!
-    @IBOutlet weak var tableView: UITableView!
+    @IBOutlet weak var tableView: BaseTableView!
     @IBOutlet weak var btn_courseType: QMUIButton!
     @IBOutlet weak var btn_stores: QMUIButton!
     @IBOutlet weak var btn_sales: QMUIButton!
     @IBOutlet weak var btn_distance: QMUIButton!
+    var items = [CourseItemModel]()
+
+    private var viewModel = CourseListViewModel()
+    private var showSubTypeView:CourseSubTypeView?
     
     override func viewDidLoad() {
         super.viewDidLoad()
         title = "课程列表"
+        viewModel.getDefaultData()
     }
     
     override func setUI() {
@@ -38,6 +80,43 @@
         tableView.dataSource = self
         tableView.register(UINib(nibName: "CourseTCell", bundle: nil), forCellReuseIdentifier: "_CourseTCell")
         tableView.separatorStyle = .none
+        tf_search.delegate = self
+
+        tableView.jq_setEmptyView()
+
+        refreshStatusBind(to: tableView) {[weak self] in
+            self?.getData()
+        } footer: {}
+        refreshStatus.onNext(.beingHeaderRefresh)
+    }
+
+    override func setRx() {
+        tf_search.rx.controlEvent(.editingDidEnd).subscribe(onNext: { [weak self] in
+            if self?.tf_search.text?.isEmpty ?? true{
+                self?.viewModel.search.accept(nil)
+            }else{
+                self?.viewModel.search.accept(self?.tf_search.text!)
+            }
+        }).disposed(by: disposeBag)
+    }
+
+    private func getData(_ header:Bool = true){
+        Services.queryCourseList(typeId: viewModel.selectPackeType.value?.id, distanceSort: viewModel.distanceSort.value, salesRanking: viewModel.salesRanking.value, search: viewModel.search.value, storeId: viewModel.selectStore.value?.id).subscribe { [weak self] data in
+            self?.refreshStatus.onNext(.endAll)
+            self?.items = data.data ?? []
+            self?.tableView.reloadData()
+        } onError: {[weak self] error in
+            self?.refreshStatus.onNext(.endAll)
+        }.disposed(by: disposeBag)
+
+    }
+
+    private func cleanOther(){
+        showSubTypeView?.removeFromSuperview()
+        btn_courseType.isSelected = false
+        btn_stores.isSelected = false
+        btn_sales.isSelected = false
+        btn_distance.isSelected = false
     }
     
     @IBAction func searchAction(_ sender: UIButton) {
@@ -45,40 +124,77 @@
     }
     
     @IBAction func crouseTypeAction(_ sender: UIButton) {
+        guard viewModel.packageTypeData.value != nil else {
+            alertError(msg: "分类数据加载失败,请再试一次")
+            viewModel.getDefaultData()
+            return
+        }
+
         guard !sender.isSelected else {return}
+        cleanOther()
         sender.isSelected = true
-        CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: ["足球课程","篮球课程","羽毛球课程","网球课程"]) { str in
+        showSubTypeView = CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: viewModel.packageTypeData.value!,selectModel: viewModel.selectPackeType.value) { [weak self] m in
+            if m.name != "全部"{
+                sender.setTitle(m.name, for: .normal)
+                self?.viewModel.selectPackeType.accept(m)
+            }else{
+                sender.setTitle("课程类型", for: .normal)
+                self?.viewModel.selectPackeType.accept(nil)
+            }
             sender.isSelected = false
-            
+            self?.refreshStatus.onNext(.beingHeaderRefresh)
         } closeClouse: {
             sender.isSelected = false
         }
     }
     
     @IBAction func inStoresAction(_ sender: UIButton) {
+        guard viewModel.storesData.value != nil else {
+            alertError(msg: "分类数据加载失败,请再试一次")
+            viewModel.getDefaultData()
+            return
+        }
+
         guard !sender.isSelected else {return}
+        cleanOther()
         sender.isSelected = true
-        CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: ["玩湃-喜望店","玩湃-喜望店","玩湃-喜望店","玩湃-喜望店"]) { str in
+        showSubTypeView =  CourseSubTypeView.show(inView: self.view, afterView: view_topView, items: viewModel.storesData.value!,selectModel: viewModel.selectStore.value) { [weak self] m in
+            if m.name != "全部"{
+                sender.setTitle(m.name, for: .normal)
+                self?.viewModel.selectStore.accept(m)
+            }else{
+                sender.setTitle("所在门店", for: .normal)
+                self?.viewModel.selectStore.accept(nil)
+            }
             sender.isSelected = false
-            
+            self?.refreshStatus.onNext(.beingHeaderRefresh)
         } closeClouse: {
             sender.isSelected = false
         }
     }
     
     @IBAction func saleAction(_ sender: UIButton) {
-        
+        sender.isSelected = !sender.isSelected
+        let sortType = sender.isSelected ? SortType.desc:SortType.asc
+        viewModel.salesRanking.accept(sortType)
+        sender.setImage(viewModel.salesRanking.value?.img, for: .normal)
+        refreshStatus.onNext(.beingHeaderRefresh)
     }
     
     @IBAction func distanceAction(_ sender: UIButton) {
-        
+        sender.isSelected = !sender.isSelected
+        let sortType = sender.isSelected ? SortType.desc:SortType.asc
+        viewModel.distanceSort.accept(sortType)
+        sender.setImage(viewModel.distanceSort.value?.img, for: .normal)
+        refreshStatus.onNext(.beingHeaderRefresh)
     }
     
 }
 
 extension CourseListVC:UITableViewDelegate{
     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        let vc = CourseDetailVC()
+        let item = items[indexPath.row]
+        let vc = CourseDetailVC(id: item.id)
         push(vc: vc)
     }
     
@@ -87,12 +203,19 @@
 extension CourseListVC:UITableViewDataSource{
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
          let cell = tableView.dequeueReusableCell(withIdentifier: "_CourseTCell") as! CourseTCell
+        cell.courseItemModel = items[indexPath.row]
         return cell
     }
     
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return 5
+        return items.count
     }
-    
-    
+}
+
+extension CourseListVC:QMUITextFieldDelegate{
+    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
+        textField.resignFirstResponder()
+        refreshStatus.onNext(.beingHeaderRefresh)
+        return true
+    }
 }

--
Gitblit v1.7.1