无故事王国
2024-03-13 919d1d6bb0ec4043ec25b58a492618239ca37529
WanPai/Root/Course/VC/CourseInfoVC.swift
@@ -15,604 +15,604 @@
class CourseInfoVC: BaseVC {
    @IBOutlet weak var scrollView: CourseInfoScrollView!
    @IBOutlet weak var view_container: UIView!
    @IBOutlet weak var img_header: UIImageView!
    @IBOutlet weak var label_stu_name: UILabel!
    @IBOutlet weak var label_stu_hei: UILabel!
    @IBOutlet weak var label_stu_wei: UILabel!
    @IBOutlet weak var label_stu_BMI: UILabel!
    @IBOutlet weak var img_gender: UIImageView!
    @IBOutlet weak var label_age: UILabel!
    @IBOutlet weak var view_menu: UIView!
    @IBOutlet weak var cons_menuHeight: NSLayoutConstraint!
    @IBOutlet weak var btn_record: UIButton!
    @IBOutlet weak var view_schedule: UIView!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var cons_tableHei: NSLayoutConstraint!
    @IBOutlet weak var mentalCollectionView: UICollectionView!
    @IBOutlet weak var cons_mentalViewHei: NSLayoutConstraint!
    @IBOutlet weak var exerciseCollectionView: UICollectionView!
    @IBOutlet weak var label_weeklyScope: UILabel!
    @IBOutlet weak var label_totalNums: UILabel!
    @IBOutlet weak var label_deductedNums: UILabel!
    @IBOutlet weak var label_remainingNums: UILabel!
   @IBOutlet weak var stack_courseExercise: UIStackView!
   @IBOutlet weak var view_exerciseTitle: UIView!
   @IBOutlet weak var view_footer: UIView!
   @IBOutlet weak var view_menuDetail: UIView!
            @IBOutlet weak var scrollView: CourseInfoScrollView!
            @IBOutlet weak var view_container: UIView!
            @IBOutlet weak var img_header: UIImageView!
            @IBOutlet weak var label_stu_name: UILabel!
            @IBOutlet weak var label_stu_hei: UILabel!
            @IBOutlet weak var label_stu_wei: UILabel!
            @IBOutlet weak var label_stu_BMI: UILabel!
            @IBOutlet weak var img_gender: UIImageView!
            @IBOutlet weak var label_age: UILabel!
            @IBOutlet weak var view_menu: UIView!
            @IBOutlet weak var cons_menuHeight: NSLayoutConstraint!
            @IBOutlet weak var btn_record: UIButton!
            @IBOutlet weak var view_schedule: UIView!
            @IBOutlet weak var tableView: UITableView!
            @IBOutlet weak var cons_tableHei: NSLayoutConstraint!
            @IBOutlet weak var mentalCollectionView: UICollectionView!
            @IBOutlet weak var cons_mentalViewHei: NSLayoutConstraint!
            @IBOutlet weak var exerciseCollectionView: UICollectionView!
            @IBOutlet weak var label_weeklyScope: UILabel!
            @IBOutlet weak var label_totalNums: UILabel!
            @IBOutlet weak var label_deductedNums: UILabel!
            @IBOutlet weak var label_remainingNums: UILabel!
            @IBOutlet weak var stack_courseExercise: UIStackView!
            @IBOutlet weak var view_exerciseTitle: UIView!
            @IBOutlet weak var view_footer: UIView!
            @IBOutlet weak var view_menuDetail: UIView!
   private var updateProdDate:Date?
            private var updateProdDate:Date?
    var startClouseHomeModel:StartClouseHomeModel?
   var weeklyCourseModel:WeeklyCourseModel?
    private var currentDate = Date()
   private var unDispatchNum:Int?
    private var mentals = [StudentMedalModel]()
            var startClouseHomeModel:StartClouseHomeModel?
            var weeklyCourseModel:WeeklyCourseModel?
            private var currentDate = Date()
            private var unDispatchNum:Int?
            private var mentals = [StudentMedalModel]()
    private var pageMenu:SPPageMenu = {
        let pageMenu = SPPageMenu(frame: .zero, trackerStyle: .line)
        // 追踪线
        pageMenu.trackerWidth = 56
        pageMenu.setTrackerHeight(3, cornerRadius: 1.5)
        pageMenu.tracker.backgroundColor = .clear
        pageMenu.trackerFollowingMode = .always
        pageMenu.contentInset = UIEdgeInsets(top: 0, left: 19, bottom: 0, right: 19)
            private var pageMenu:SPPageMenu = {
                        let pageMenu = SPPageMenu(frame: .zero, trackerStyle: .line)
                        // 追踪线
                        pageMenu.trackerWidth = 56
                        pageMenu.setTrackerHeight(3, cornerRadius: 1.5)
                        pageMenu.tracker.backgroundColor = .clear
                        pageMenu.trackerFollowingMode = .always
                        pageMenu.contentInset = UIEdgeInsets(top: 0, left: 19, bottom: 0, right: 19)
        // 分割线
        pageMenu.dividingLine.backgroundColor = .clear
        pageMenu.dividingLineHeight = 1
                        // 分割线
                        pageMenu.dividingLine.backgroundColor = .clear
                        pageMenu.dividingLineHeight = 1
        // item
        pageMenu.spacing = 27.0
        pageMenu.permutationWay = .scrollAdaptContent
                        // item
                        pageMenu.spacing = 27.0
                        pageMenu.permutationWay = .scrollAdaptContent
        // 字体
        pageMenu.selectedItemTitleFont = UIFont.systemFont(ofSize: 18, weight: .medium)
        pageMenu.unSelectedItemTitleFont = UIFont.systemFont(ofSize: 18,weight: .medium)
        // 颜色
        pageMenu.selectedItemTitleColor = UIColor(hexStr: "#6CC366")
        pageMenu.unSelectedItemTitleColor = UIColor(hexStr: "#A4A4A4")
                        // 字体
                        pageMenu.selectedItemTitleFont = UIFont.systemFont(ofSize: 18, weight: .medium)
                        pageMenu.unSelectedItemTitleFont = UIFont.systemFont(ofSize: 18,weight: .medium)
                        // 颜色
                        pageMenu.selectedItemTitleColor = UIColor(hexStr: "#6CC366")
                        pageMenu.unSelectedItemTitleColor = UIColor(hexStr: "#A4A4A4")
        return pageMenu
    }()
                        return pageMenu
            }()
    lazy var pageViewController:FFPageViewController = {
        let pageVC = FFPageViewController()
        pageVC.view.backgroundColor = .clear
        pageVC.scrollview.backgroundColor = .clear
            lazy var pageViewController:FFPageViewController = {
                        let pageVC = FFPageViewController()
                        pageVC.view.backgroundColor = .clear
                        pageVC.scrollview.backgroundColor = .clear
        pageVC.scrollview.bounces = false
        return pageVC
    }()
                        pageVC.scrollview.bounces = false
                        return pageVC
            }()
   private lazy var btn_dispatchCourse:UIButton = {
      let btn = UIButton(type: .custom)
      btn.setTitleColor(Def_ThemeColor, for: .normal)
            private lazy var btn_dispatchCourse:UIButton = {
                        let btn = UIButton(type: .custom)
                        btn.setTitleColor(Def_ThemeColor, for: .normal)
      let attribute = AttributedStringbuilder.build().add(string: "未分配课时", withFont: UIFont.systemFont(ofSize: 14), withColor: Def_ThemeColor).underLine(color: Def_ThemeColor).mutableAttributedString
      btn.setAttributedTitle(attribute, for: .normal)
      btn.addTarget(self, action: #selector(dispatchCourseAction), for: .touchUpInside)
      return btn
                        let attribute = AttributedStringbuilder.build().add(string: "未分配课时", withFont: UIFont.systemFont(ofSize: 14), withColor: Def_ThemeColor).underLine(color: Def_ThemeColor).mutableAttributedString
                        btn.setAttributedTitle(attribute, for: .normal)
                        btn.addTarget(self, action: #selector(dispatchCourseAction), for: .touchUpInside)
                        return btn
   }()
            }()
   override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)
            override func viewDidAppear(_ animated: Bool) {
                        super.viewDidAppear(animated)
      if let date = updateProdDate{
         //防止反复切换,15秒
         if Date().timeIntervalSince1970 - date.timeIntervalSince1970 > 15{
            NotificationCenter.default.post(name: StudentRefresh_Nofi, object: nil)
         }
      }
   }
    override func viewDidLoad() {
        super.viewDidLoad()
      updateData()
    }
    override func setUI() {
        cons_menuHeight.constant = 0
      scrollView.contentInset = UIEdgeInsets( top: UIDevice.jq_safeEdges.top  + 158, left: 0, bottom: 0, right: 0)
        scrollView.delegate = self
        scrollView.bringSubviewToFront(img_header)
        scrollView.bounces = false
        scrollView.contentInsetAdjustmentBehavior = .never
        let attribute = AttributedStringbuilder()
        attribute.add(string: "上课记录", withFont: UIFont.systemFont(ofSize: 14), withColor: Def_ThemeColor)
        attribute.underLine(color: Def_ThemeColor)
        btn_record.titleLabel?.attributedText = attribute.mutableAttributedString
        view_schedule.addSubview(pageViewController.view)
        addChild(pageViewController)
        pageViewController.delegate = self
        view_schedule.insertSubview(pageViewController.view, at: 0)
        pageViewController.didMove(toParent: self)
      pageViewController.view.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 90)
        tableView.delegate = self
        tableView.dataSource = self
        tableView.isScrollEnabled = false
        if #available(iOS 15.0, *) {
            tableView.sectionHeaderTopPadding = 0
        } else {
        }
        tableView.separatorStyle = .none
        tableView.register(UINib(nibName: "CourseBookingTCell", bundle: nil), forCellReuseIdentifier: "_CourseBookingTCell")
      tableView.backgroundColor = .clear
        mentalCollectionView.delegate = self
        mentalCollectionView.dataSource = self
        mentalCollectionView.contentInset = UIEdgeInsets(top: 0, left: 58, bottom: 0, right: 58)
        mentalCollectionView.tag = 1000
        mentalCollectionView.isScrollEnabled = false
        mentalCollectionView.register(UINib(nibName: "StudentMedalCCell", bundle: nil), forCellWithReuseIdentifier: "_StudentMedalCCell")
        exerciseCollectionView.delegate = self
        exerciseCollectionView.dataSource = self
        exerciseCollectionView.tag = 1001
        exerciseCollectionView.register(UINib(nibName: "StudentVideoCCell", bundle: nil), forCellWithReuseIdentifier: "_StudentVideoCCell")
    }
   override func setRx() {
      NotificationCenter.default.rx.notification(StudentRefresh_Nofi).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
         guard let weakSelf = self else { return }
         Services.startCourseHome().subscribe(onNext: {[weak self] data in
            if let model = data.data{
               self?.startClouseHomeModel = model
               UserDefaults.standard.setValue(model.stuId, forKey: "currentStuId")
               UserDefaults.standard.synchronize()
               self?.updateData()
                        if let date = updateProdDate{
                                    //防止反复切换,15秒
                                    if Date().timeIntervalSince1970 - date.timeIntervalSince1970 > 15{
                                                NotificationCenter.default.post(name: StudentRefresh_Nofi, object: nil)
                                    }
                        }
            }
         }).disposed(by: weakSelf.disposeBag)
      }).disposed(by: disposeBag)
      NotificationCenter.default.rx.notification(UpdateCurrentStore_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
         self?.getSelectDayData()
      }) { error in
      }.disposed(by: disposeBag)
   }
   private func updateData(){
      if let m = startClouseHomeModel{
         updateProdDate = Date()
         img_header.sd_setImage(with: URL(string: m.stuImg))
         label_stu_name.text = m.stuName
         img_gender.image = m.stuSex == .man ? UIImage(named: "icon_man") : UIImage(named: "icon_woman")
         label_age.text = "/\(m.stuAge)岁"
         label_stu_hei.attributedText = setAttribute(t1: "\(m.height)", t2: "cm")
         label_stu_wei.attributedText = setAttribute(t1: "\(m.weight)", t2: "kg")
         label_stu_BMI.attributedText = setAttribute(t1: m.bmi.jq_formatFloat, t2: m.bodyStatus)
         pageMenu.removeAllItems()
         if !view_menu.subviews.contains(where: {$0 == self.pageMenu}){
            pageMenu.frame = CGRect(origin: .zero, size: CGSize(width: JQ_ScreenW - 100, height: 25))
            pageMenu.delegate = self
            view_menu.addSubview(pageMenu)
            cons_menuHeight.constant = 25
         }
         pageMenu.setItems(m.courseList.map({$0.courseName}), selectedItemIndex: 0)
         view_menuDetail.isHidden = m.courseList.count == 0
         view_menu.addSubview(btn_dispatchCourse)
         btn_dispatchCourse.snp.makeConstraints { make in
            make.right.equalTo(-19)
            make.centerY.equalToSuperview()
            make.height.equalTo(25)
         }
         exerciseCollectionView.reloadData()
         label_totalNums.text = "总课时数\( m.courseList.first?.totalNums ?? 0)"
         label_deductedNums.text = "已扣课时数\( m.courseList.first?.deductedNums ?? 0)"
         label_remainingNums.text = "剩余课时数\( m.courseList.first?.remainingNums ?? 0)"
         exerciseCollectionView.isHidden = m.exerciseVideoList.isEmpty
         view_exerciseTitle.isHidden = m.exerciseVideoList.isEmpty
//         view_footer.isHidden = m.exerciseVideoList.isEmpty
         Services.studMedalList(studentId: m.stuId).subscribe(onNext: {[weak self] data in
            guard let weakSelf = self else { return }
            if let models = data.data{
               weakSelf.mentals = models
               if models.count > 0{
                  weakSelf.mentals.append(StudentMedalModel(medalName: "更多", medalType: .more))
               }
               weakSelf.mentalCollectionView.reloadData()
               let he = ceil(Double(weakSelf.mentals.count) / 3) * 91 + floor(Double(weakSelf.mentals.count) / 3) * 35
               weakSelf.cons_mentalViewHei.constant = he
               UIView.animate(withDuration: 0.3) {
                  weakSelf.view.layoutIfNeeded()
               }
            override func viewDidLoad() {
                        super.viewDidLoad()
                        updateData()
            }
         }).disposed(by: disposeBag)
         Services.weeksOfGetHours().subscribe(onNext: {[weak self] data in
            self?.unDispatchNum = data.data
         }) { error in
         }.disposed(by: disposeBag)
         getSelectDayData()
      }
   }
    private func setAttribute(t1:String,t2:String)->NSMutableAttributedString{
        let color:UIColor = UIColor(hexStr: "#2F5264")
        let a1 = AttributedStringbuilder()
        a1.add(string: t1, withFont: UIFont.systemFont(ofSize: 22), withColor: color)
            .add(string: t2, withFont: UIFont.systemFont(ofSize: 12), withColor: color)
        return a1.mutableAttributedString
    }
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        view_container.jq_addCorners(corner: [.topLeft,.topRight], radius: 42)
    }
   @objc func dispatchCourseAction(){
      guard unDispatchNum != 0 else {
         alert(msg: "没有未分配的课时");return
      }
      CourseUnAssignView.show(startClouseHomeModel?.courseList ?? [], num: unDispatchNum ?? 0)
   }
   @IBAction func addStudentAction(_ sender: QMUIButton) {
      let vc = AddStudentVC(type: .course)
      push(vc: vc)
   }
    @IBAction func exchangeAction(_ sender: UIButton) {
        let vc = StudentExchangeVC()
        push(vc: vc)
    }
    @IBAction func reportAction(_ sender: UIButton) {
        guard startClouseHomeModel != nil else {return}
        let vc = StudentReportVC(stuId: startClouseHomeModel!.stuId)
        push(vc: vc)
    }
    @IBAction func detailAction(_ sender: UIButton) {
        guard (startClouseHomeModel?.courseList.count ?? 0) > 0 else {return}
            override func setUI() {
                        cons_menuHeight.constant = 0
                        scrollView.contentInset = UIEdgeInsets( top: UIDevice.jq_safeEdges.top  + 158, left: 0, bottom: 0, right: 0)
                        scrollView.delegate = self
                        scrollView.bringSubviewToFront(img_header)
        let index = pageMenu.selectedItemIndex
        let models = startClouseHomeModel!.courseList
        let studentModel = StudentSimpleProfileModel(stuId: startClouseHomeModel!.stuId, stuName: startClouseHomeModel!.stuName, stuImage: startClouseHomeModel!.stuImg)
      let vc = StudentCourseDetailVC(models: models.filter({$0.courseType == 1}),defaultIndex: index,studentModel: studentModel)
        push(vc: vc)
    }
                        scrollView.bounces = false
                        scrollView.contentInsetAdjustmentBehavior = .never
                        let attribute = AttributedStringbuilder()
                        attribute.add(string: "上课记录", withFont: UIFont.systemFont(ofSize: 14), withColor: Def_ThemeColor)
                        attribute.underLine(color: Def_ThemeColor)
                        btn_record.titleLabel?.attributedText = attribute.mutableAttributedString
   @IBAction func renewalAction(_ sender: UIButton) {
      let index = pageMenu.selectedItemIndex
      let models = startClouseHomeModel!.courseList
      guard index < models.count else {return}
      Services.registeredData(coursePayId: models[index].id,orderId: models[index].orderId).subscribe(onNext: {data in
         if let m1 = data.data{
            let vc = CourseDetailVC(id: models[index].courseId, signUpCourseModel: m1)
            self.push(vc: vc)
         }
      }) { error in
                        view_schedule.addSubview(pageViewController.view)
                        addChild(pageViewController)
                        pageViewController.delegate = self
                        view_schedule.insertSubview(pageViewController.view, at: 0)
                        pageViewController.didMove(toParent: self)
                        pageViewController.view.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 90)
      }.disposed(by: disposeBag)
   }
    @IBAction func bookingRecordAction(_ sender: UIButton) {
        guard startClouseHomeModel != nil else {return}
        let vc = CourseBookingListVC(student: startClouseHomeModel!)
        push(vc: vc)
    }
                        tableView.delegate = self
                        tableView.dataSource = self
                        tableView.isScrollEnabled = false
                        if #available(iOS 15.0, *) {
                                    tableView.sectionHeaderTopPadding = 0
                        } else {
                        }
                        tableView.separatorStyle = .none
                        tableView.register(UINib(nibName: "CourseBookingTCell", bundle: nil), forCellReuseIdentifier: "_CourseBookingTCell")
                        tableView.backgroundColor = .clear
    @IBAction func remarkAction(_ sender: UIButton) {
        guard startClouseHomeModel != nil else {return}
        let vc = StudentRemarkListVC(stuId: startClouseHomeModel!.stuId)
        push(vc: vc)
    }
                        mentalCollectionView.delegate = self
                        mentalCollectionView.dataSource = self
                        mentalCollectionView.contentInset = UIEdgeInsets(top: 0, left: 58, bottom: 0, right: 58)
                        mentalCollectionView.tag = 1000
                        mentalCollectionView.isScrollEnabled = false
                        mentalCollectionView.register(UINib(nibName: "StudentMedalCCell", bundle: nil), forCellWithReuseIdentifier: "_StudentMedalCCell")
                        exerciseCollectionView.delegate = self
                        exerciseCollectionView.dataSource = self
                        exerciseCollectionView.tag = 1001
                        exerciseCollectionView.register(UINib(nibName: "StudentVideoCCell", bundle: nil), forCellWithReuseIdentifier: "_StudentVideoCCell")
   @IBAction func forwardWeekAction(_ sender: UIButton) {
      let forwardPage = pageViewController.currentPage - 1
      pageViewController.scroll(toPage: forwardPage, animation: true)
   }
   @IBAction func nextWeekAction(_ sender: UIButton) {
      let nextPage = pageViewController.currentPage + 1
      pageViewController.scroll(toPage: nextPage, animation: true)
   }
   @IBAction func exerciseAction(_ sender: UITapGestureRecognizer) {
      let vc = CourseExerciseSubListVC()
      push(vc: vc)
   }
    private func getSelectDayData(){
        if let model = startClouseHomeModel{
         if let storeStr = UserDefaults.standard.object(forKey: "CurrentStore") as? String{
            if let deserModel = HomeStoreModel.deserialize(from: storeStr){
               Services.weeksOfCourseDetails(stuId: model.stuId, time: currentDate,storeId: deserModel.storeId).subscribe(onNext: {[weak self] data in
                  if let model = data.data{
                     self?.weeklyCourseModel = model
                     self?.cons_tableHei.constant = 58 + 72 * Double(model.data.count)
                     UIView.animate(withDuration: 0.3) {
                        self?.view.layoutIfNeeded()
                        self?.viewDidLayoutSubviews()
                     }
                     self?.tableView.reloadData()
                  }
               }).disposed(by: disposeBag)
            }
         }
        }
    }
    override var preferredStatusBarStyle: UIStatusBarStyle{
      return .lightContent
    }
            override func setRx() {
                        NotificationCenter.default.rx.notification(StudentRefresh_Nofi).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
                                    guard let weakSelf = self else { return }
                                    Services.startCourseHome().subscribe(onNext: {[weak self] data in
                                                if let model = data.data{
                                                            self?.startClouseHomeModel = model
                                                            UserDefaults.standard.setValue(model.stuId, forKey: "currentStuId")
                                                            UserDefaults.standard.synchronize()
                                                            self?.updateData()
                                                }
                                    }).disposed(by: weakSelf.disposeBag)
                        }).disposed(by: disposeBag)
                        NotificationCenter.default.rx.notification(UpdateCurrentStore_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
                                    self?.getSelectDayData()
                        }) { error in
                        }.disposed(by: disposeBag)
            }
            private func updateData(){
                        if let m = startClouseHomeModel{
                                    updateProdDate = Date()
                                    img_header.sd_setImage(with: URL(string: m.stuImg))
                                    label_stu_name.text = m.stuName
                                    img_gender.image = m.stuSex == .man ? UIImage(named: "icon_man") : UIImage(named: "icon_woman")
                                    label_age.text = "/\(m.stuAge)岁"
                                    label_stu_hei.attributedText = setAttribute(t1: "\(m.height)", t2: "cm")
                                    label_stu_wei.attributedText = setAttribute(t1: "\(m.weight)", t2: "kg")
                                    label_stu_BMI.attributedText = setAttribute(t1: m.bmi.jq_formatFloat, t2: m.bodyStatus)
                                    pageMenu.removeAllItems()
                                    if !view_menu.subviews.contains(where: {$0 == self.pageMenu}){
                                                pageMenu.frame = CGRect(origin: .zero, size: CGSize(width: JQ_ScreenW - 100, height: 25))
                                                pageMenu.delegate = self
                                                view_menu.addSubview(pageMenu)
                                                cons_menuHeight.constant = 25
                                    }
                                    pageMenu.setItems(m.courseList.map({$0.courseName}), selectedItemIndex: 0)
                                    view_menuDetail.isHidden = m.courseList.count == 0
                                    view_menu.addSubview(btn_dispatchCourse)
                                    btn_dispatchCourse.snp.makeConstraints { make in
                                                make.right.equalTo(-19)
                                                make.centerY.equalToSuperview()
                                                make.height.equalTo(25)
                                    }
                                    exerciseCollectionView.reloadData()
                                    label_totalNums.text = "总课时数\( m.courseList.first?.totalNums ?? 0)"
                                    label_deductedNums.text = "已扣课时数\( m.courseList.first?.deductedNums ?? 0)"
                                    label_remainingNums.text = "剩余课时数\( m.courseList.first?.remainingNums ?? 0)"
                                    exerciseCollectionView.isHidden = m.exerciseVideoList.isEmpty
                                    view_exerciseTitle.isHidden = m.exerciseVideoList.isEmpty
                                    //         view_footer.isHidden = m.exerciseVideoList.isEmpty
                                    Services.studMedalList(studentId: m.stuId).subscribe(onNext: {[weak self] data in
                                                guard let weakSelf = self else { return }
                                                if let models = data.data{
                                                            weakSelf.mentals = models
                                                            if models.count > 0{
                                                                        weakSelf.mentals.append(StudentMedalModel(medalName: "更多", medalType: .more))
                                                            }
                                                            weakSelf.mentalCollectionView.reloadData()
                                                            let he = ceil(Double(weakSelf.mentals.count) / 3) * 91 + floor(Double(weakSelf.mentals.count) / 3) * 35
                                                            weakSelf.cons_mentalViewHei.constant = he
                                                            UIView.animate(withDuration: 0.3) {
                                                                        weakSelf.view.layoutIfNeeded()
                                                            }
                                                }
                                    }).disposed(by: disposeBag)
                                    Services.weeksOfGetHours().subscribe(onNext: {[weak self] data in
                                                self?.unDispatchNum = data.data
                                    }) { error in
                                    }.disposed(by: disposeBag)
                                    getSelectDayData()
                        }
            }
            private func setAttribute(t1:String,t2:String)->NSMutableAttributedString{
                        let color:UIColor = UIColor(hexStr: "#2F5264")
                        let a1 = AttributedStringbuilder()
                        a1.add(string: t1, withFont: UIFont.systemFont(ofSize: 22), withColor: color)
                                    .add(string: t2, withFont: UIFont.systemFont(ofSize: 12), withColor: color)
                        return a1.mutableAttributedString
            }
            override func viewDidLayoutSubviews() {
                        super.viewDidLayoutSubviews()
                        view_container.jq_addCorners(corner: [.topLeft,.topRight], radius: 42)
            }
            @objc func dispatchCourseAction(){
                        guard unDispatchNum != 0 else {
                                    alert(msg: "没有未分配的课时");return
                        }
                        CourseUnAssignView.show(startClouseHomeModel?.courseList ?? [], num: unDispatchNum ?? 0)
            }
            @IBAction func addStudentAction(_ sender: QMUIButton) {
                        let vc = AddStudentVC(type: .course)
                        push(vc: vc)
            }
            @IBAction func exchangeAction(_ sender: UIButton) {
                        let vc = StudentExchangeVC()
                        push(vc: vc)
            }
   @objc func localDetailAction(btn:UIButton){
      let index = btn.tag - 10
      guard let m = weeklyCourseModel else {return}
         JQ_MapNavigationTool.startNav(CLLocationCoordinate2D(latitude: m.lat, longitude: m.lon), distanceName: m.name, scheme: "weparklife")
   }
            @IBAction func reportAction(_ sender: UIButton) {
                        guard startClouseHomeModel != nil else {return}
                        let vc = StudentReportVC(stuId: startClouseHomeModel!.stuId)
                        push(vc: vc)
            }
            @IBAction func detailAction(_ sender: UIButton) {
                        guard (startClouseHomeModel?.courseList.count ?? 0) > 0 else {return}
                        let index = pageMenu.selectedItemIndex
                        let models = startClouseHomeModel!.courseList
                        let studentModel = StudentSimpleProfileModel(stuId: startClouseHomeModel!.stuId, stuName: startClouseHomeModel!.stuName, stuImage: startClouseHomeModel!.stuImg)
                        let vc = StudentCourseDetailVC(models: models.filter({$0.courseType == 1}),defaultIndex: index,studentModel: studentModel)
                        push(vc: vc)
            }
            @IBAction func renewalAction(_ sender: UIButton) {
                        let index = pageMenu.selectedItemIndex
                        let models = startClouseHomeModel!.courseList
                        guard index < models.count else {return}
                        Services.registeredData(coursePayId: models[index].id,orderId: models[index].orderId).subscribe(onNext: {data in
                                    if let m1 = data.data{
                                                let vc = CourseDetailVC(id: models[index].courseId, signUpCourseModel: m1)
                                                self.push(vc: vc)
                                    }
                        }) { error in
                        }.disposed(by: disposeBag)
            }
            @IBAction func bookingRecordAction(_ sender: UIButton) {
                        guard startClouseHomeModel != nil else {return}
                        let vc = CourseBookingListVC(student: startClouseHomeModel!)
                        push(vc: vc)
            }
            @IBAction func remarkAction(_ sender: UIButton) {
                        guard startClouseHomeModel != nil else {return}
                        let vc = StudentRemarkListVC(stuId: startClouseHomeModel!.stuId)
                        push(vc: vc)
            }
            @IBAction func forwardWeekAction(_ sender: UIButton) {
                        let forwardPage = pageViewController.currentPage - 1
                        pageViewController.scroll(toPage: forwardPage, animation: true)
            }
            @IBAction func nextWeekAction(_ sender: UIButton) {
                        let nextPage = pageViewController.currentPage + 1
                        pageViewController.scroll(toPage: nextPage, animation: true)
            }
            @IBAction func exerciseAction(_ sender: UITapGestureRecognizer) {
                        let vc = CourseExerciseSubListVC()
                        push(vc: vc)
            }
            private func getSelectDayData(){
                        if let model = startClouseHomeModel{
                                    if let storeStr = UserDefaults.standard.object(forKey: "CurrentStore") as? String{
                                                if let deserModel = HomeStoreModel.deserialize(from: storeStr){
                                                            Services.weeksOfCourseDetails(stuId: model.stuId, time: currentDate,storeId: deserModel.storeId).subscribe(onNext: {[weak self] data in
                                                                        if let model = data.data{
                                                                                    self?.weeklyCourseModel = model
                                                                                    self?.cons_tableHei.constant = 58 + 72 * Double(model.data.count)
                                                                                    UIView.animate(withDuration: 0.3) {
                                                                                                self?.view.layoutIfNeeded()
                                                                                                self?.viewDidLayoutSubviews()
                                                                                    }
                                                                                    self?.tableView.reloadData()
                                                                        }
                                                            }).disposed(by: disposeBag)
                                                }
                                    }
                        }
            }
            override var preferredStatusBarStyle: UIStatusBarStyle{
                        return .lightContent
            }
            @objc func localDetailAction(btn:UIButton){
                        let index = btn.tag - 10
                        guard let m = weeklyCourseModel else {return}
                        JQ_MapNavigationTool.startNav(CLLocationCoordinate2D(latitude: m.lat, longitude: m.lon), distanceName: m.name, scheme: "weparklife")
            }
}
extension CourseInfoVC:UITableViewDelegate{
   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//       let m = weeklyCourseModel?.data[indexPath.row]
//      let vc = SignUpCourseVC()
//      push(vc: vc)
   }
            func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                        //       let m = weeklyCourseModel?.data[indexPath.row]
                        //      let vc = SignUpCourseVC()
                        //      push(vc: vc)
            }
}
extension CourseInfoVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "_CourseBookingTCell") as! CourseBookingTCell
            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                        let cell = tableView.dequeueReusableCell(withIdentifier: "_CourseBookingTCell") as! CourseBookingTCell
      cell.view_corner.jq_addShadows(shadowColor: UIColor(hexStr: "#DADADA").withAlphaComponent(0.5), corner: 16, radius: 3.5, offset: CGSize(width: 0, height: 2), opacity: 1)
      guard indexPath.row < weeklyCourseModel?.data.count ?? 0 else {
         return cell
      }
                        cell.view_corner.jq_addShadows(shadowColor: UIColor(hexStr: "#DADADA").withAlphaComponent(0.5), corner: 16, radius: 3.5, offset: CGSize(width: 0, height: 2), opacity: 1)
                        guard indexPath.row < weeklyCourseModel?.data.count ?? 0 else {
                                    return cell
                        }
      cell.weeklyCourseItemModel = weeklyCourseModel?.data[indexPath.row]
        cell.clickClouse = {[weak self] m in
         guard let weakSelf = self else { return }
         if let stuId = weakSelf.startClouseHomeModel?.stuId{
            //请假
            if m.type == 1 && m.isType == 0{
               CommonAlertView.show(title: "提示", content: "确认请假?") { status in
                  if status{
                     let ftime = m.time.first!.components(separatedBy: "-").first!
                     let leveTime = String(format: "%@ %@", weakSelf.currentDate.jq_format("yyyy-MM-dd"),ftime)
                     Services.startCourceRreverse(courseId: m.id, time: leveTime, stuId: stuId).subscribe(onNext: {[weak self] data in
                        alertSuccess(msg: "请假成功")
                        self?.getSelectDayData()
                        cell.weeklyCourseItemModel = weeklyCourseModel?.data[indexPath.row]
                        cell.clickClouse = {[weak self] m in
                                    guard let weakSelf = self else { return }
                                    if let stuId = weakSelf.startClouseHomeModel?.stuId{
                                                //请假
                                                if m.type == 1 && m.isType == 0{
                                                            CommonAlertView.show(title: "提示", content: "确认请假?") { status in
                                                                        if status{
                                                                                    let ftime = m.time.first!.components(separatedBy: "-").first!
                                                                                    let leveTime = String(format: "%@ %@", weakSelf.currentDate.jq_format("yyyy-MM-dd"),ftime)
                                                                                    Services.startCourceRreverse(courseId: m.id, time: leveTime, stuId: stuId).subscribe(onNext: {[weak self] data in
                                                                                                alertSuccess(msg: "请假成功")
                                                                                                self?.getSelectDayData()
                     }).disposed(by: weakSelf.disposeBag)
                  }
               }
            }
            //购课
            if m.type == 2{
               let vc = ExperienceCourseVC(courseId: m.id)
               weakSelf.push(vc: vc)
                                                                                    }).disposed(by: weakSelf.disposeBag)
                                                                        }
                                                            }
                                                }
                                                //购课
                                                if m.type == 2{
                                                            let vc = ExperienceCourseVC(courseId: m.id)
                                                            weakSelf.push(vc: vc)
                                                }
                                    }
                        }
                        return cell
            }
         }
        }
        return cell
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return weeklyCourseModel?.data.count ?? 0
}
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 72
    }
   func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
      if let m = weeklyCourseModel{
         var headerView  = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header")
         if headerView == nil{
            headerView = UITableViewHeaderFooterView(reuseIdentifier: "header")
            let contentView = UIView()
            contentView.borderColor = UIColor(hexStr: "#E7E3E3")
            contentView.borderWidth = 1
            contentView.cornerRadius = 11
            headerView?.contentView.addSubview(contentView)
            contentView.snp.makeConstraints { make in
               make.center.equalToSuperview()
               make.left.right.equalToSuperview()
               make.height.equalTo(22)
            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                        return weeklyCourseModel?.data.count ?? 0
            }
            let label_address = UILabel()
            label_address.tag = 1000
            label_address.text = "成都非遗玩湃全科体育公园   0.0km"
            label_address.font = UIFont.systemFont(ofSize: 10, weight: .medium)
            label_address.textColor = UIColor(hexStr: "#AFB4BC")
            contentView.addSubview(label_address)
            label_address.snp.makeConstraints { make in
               make.left.equalToSuperview().offset(12)
               make.centerY.equalToSuperview()
               make.right.equalTo(-50)
            func numberOfSections(in tableView: UITableView) -> Int {
                        return 1
            }
            let btn_detial = QMUIButton(type: .custom)
            btn_detial.setTitle("位置详情", for: .normal)
            btn_detial.tag = 10 + section
            btn_detial.addTarget(self, action: #selector(localDetailAction(btn:)), for: .touchUpInside)
            btn_detial.titleLabel?.font = UIFont.systemFont(ofSize: 10)
            btn_detial.setTitleColor(UIColor(hexStr: "#AFB4BC"), for: .normal)
            btn_detial.setImage(UIImage(named: "icon_pop"), for: .normal)
            btn_detial.imagePosition = .left
            btn_detial.spacingBetweenImageAndTitle = 3
            contentView.addSubview(btn_detial)
            btn_detial.snp.makeConstraints { make in
               make.right.equalTo(-10)
               make.centerY.equalToSuperview()
            func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
                        return 72
            }
         }
         if let label = headerView?.contentView.viewWithTag(1000) as? UILabel{
            label.text = String(format: "%@ %.1lfkm", m.name,m.distance)
         }
            func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
                        if let m = weeklyCourseModel{
                                    var headerView  = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header")
                                    if headerView == nil{
                                                headerView = UITableViewHeaderFooterView(reuseIdentifier: "header")
         headerView?.contentView.backgroundColor = .white
         return headerView
      }
      return nil
   }
                                                let contentView = UIView()
                                                contentView.borderColor = UIColor(hexStr: "#E7E3E3")
                                                contentView.borderWidth = 1
                                                contentView.cornerRadius = 11
                                                headerView?.contentView.addSubview(contentView)
                                                contentView.snp.makeConstraints { make in
                                                            make.center.equalToSuperview()
                                                            make.left.right.equalToSuperview()
                                                            make.height.equalTo(22)
                                                }
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 58
    }
                                                let label_address = UILabel()
                                                label_address.tag = 1000
                                                label_address.text = "成都非遗玩湃全科体育公园   0.0km"
                                                label_address.font = UIFont.systemFont(ofSize: 10, weight: .medium)
                                                label_address.textColor = UIColor(hexStr: "#AFB4BC")
                                                contentView.addSubview(label_address)
                                                label_address.snp.makeConstraints { make in
                                                            make.left.equalToSuperview().offset(12)
                                                            make.centerY.equalToSuperview()
                                                            make.right.equalTo(-50)
                                                }
                                                let btn_detial = QMUIButton(type: .custom)
                                                btn_detial.setTitle("位置详情", for: .normal)
                                                btn_detial.tag = 10 + section
                                                btn_detial.addTarget(self, action: #selector(localDetailAction(btn:)), for: .touchUpInside)
                                                btn_detial.titleLabel?.font = UIFont.systemFont(ofSize: 10)
                                                btn_detial.setTitleColor(UIColor(hexStr: "#AFB4BC"), for: .normal)
                                                btn_detial.setImage(UIImage(named: "icon_pop"), for: .normal)
                                                btn_detial.imagePosition = .left
                                                btn_detial.spacingBetweenImageAndTitle = 3
                                                contentView.addSubview(btn_detial)
                                                btn_detial.snp.makeConstraints { make in
                                                            make.right.equalTo(-10)
                                                            make.centerY.equalToSuperview()
                                                }
                                    }
                                    if let label = headerView?.contentView.viewWithTag(1000) as? UILabel{
                                                label.text = String(format: "%@ %.1lfkm", m.name,m.distance)
                                    }
                                    headerView?.contentView.backgroundColor = .white
                                    return headerView
                        }
                        return nil
            }
            func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
                        return 58
            }
}
extension CourseInfoVC:UICollectionViewDelegate{
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if collectionView.tag == 1000{
         guard let stuId = startClouseHomeModel?.stuId else { return }
         let vc = StudentMentalListVC(stuId: stuId)
            push(vc: vc)
        }else{
         let model = startClouseHomeModel?.exerciseVideoList[indexPath.row]
         Services.exerciseCourseList(courseTypeId: model?.coursePackageId).subscribe(onNext: {[weak self] data in
            if let d = data.data?.first{
               let vc = CourseVideoDetailVC(model: d)
               vc.title = "课后练习"
               self?.push(vc: vc)
                        if collectionView.tag == 1000{
                                    guard let stuId = startClouseHomeModel?.stuId else { return }
                                    let vc = StudentMentalListVC(stuId: stuId)
                                    push(vc: vc)
                        }else{
                                    let model = startClouseHomeModel?.exerciseVideoList[indexPath.row]
                                    Services.exerciseCourseList(courseTypeId: model?.coursePackageId).subscribe(onNext: {[weak self] data in
                                                if let d = data.data?.first{
                                                            let vc = CourseVideoDetailVC(model: d)
                                                            vc.title = "课后练习"
                                                            self?.push(vc: vc)
                                                }
                                    }).disposed(by: disposeBag)
                        }
            }
         }).disposed(by: disposeBag)
        }
    }
}
extension CourseInfoVC:UICollectionViewDataSource{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if collectionView.tag == 1000{
            return mentals.count
        }else{
            return startClouseHomeModel?.exerciseVideoList.count ?? 0
        }
    }
                        if collectionView.tag == 1000{
                                    return mentals.count
                        }else{
                                    return startClouseHomeModel?.exerciseVideoList.count ?? 0
                        }
            }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if collectionView.tag == 1000{
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_StudentMedalCCell", for: indexPath) as! StudentMedalCCell
            cell.img.image = mentals[indexPath.row].medalType.image
            cell.t1.text = mentals[indexPath.row].medalType.title_en
            cell.t2.text = mentals[indexPath.row].medalType.title
            return cell
        } else{
            let model = startClouseHomeModel!.exerciseVideoList[indexPath.row]
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_StudentVideoCCell", for: indexPath) as! StudentVideoCCell
            cell.videoListModel = model
            return cell
        }
    }
            func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                        if collectionView.tag == 1000{
                                    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_StudentMedalCCell", for: indexPath) as! StudentMedalCCell
                                    cell.img.image = mentals[indexPath.row].medalType.image
                                    cell.t1.text = mentals[indexPath.row].medalType.title_en
                                    cell.t2.text = mentals[indexPath.row].medalType.title
                                    return cell
                        } else{
                                    let model = startClouseHomeModel!.exerciseVideoList[indexPath.row]
                                    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_StudentVideoCCell", for: indexPath) as! StudentVideoCCell
                                    cell.videoListModel = model
                                    return cell
                        }
            }
}
extension CourseInfoVC:UICollectionViewDelegateFlowLayout{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        if collectionView.tag == 1000{
            return 30
        }else {
            return 12
        }
    }
            func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
                        if collectionView.tag == 1000{
                                    return 30
                        }else {
                                    return 12
                        }
            }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        if collectionView.tag == 1000{
            return 30
        }else {
            return 0
        }
    }
            func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
                        if collectionView.tag == 1000{
                                    return 30
                        }else {
                                    return 0
                        }
            }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        if collectionView.tag == 1000{
            let CellW = (JQ_ScreenW - 116 - 62 * 2) / 3
            return CGSize(width: CellW, height: 91)
        }else {
            let CellW = (JQ_ScreenW - 44 - 13) / 2
            return CGSize(width: CellW, height: 166)
        }
    }
            func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
                        if collectionView.tag == 1000{
                                    let CellW = (JQ_ScreenW - 116 - 62 * 2) / 3
                                    return CGSize(width: CellW, height: 91)
                        }else {
                                    let CellW = (JQ_ScreenW - 44 - 13) / 2
                                    return CGSize(width: CellW, height: 166)
                        }
            }
}
extension CourseInfoVC:SPPageMenuDelegate{
    func pageMenu(_ pageMenu: SPPageMenu, itemSelectedAt index: Int) {
        guard startClouseHomeModel != nil else {return}
        if let m = startClouseHomeModel?.courseList[index]{
            label_totalNums.text = "总课时数\( m.totalNums)"
            label_deductedNums.text = "已扣课时数\( m.deductedNums)"
            label_remainingNums.text = "剩余课时数\( m.remainingNums)"
            func pageMenu(_ pageMenu: SPPageMenu, itemSelectedAt index: Int) {
                        guard startClouseHomeModel != nil else {return}
                        if let m = startClouseHomeModel?.courseList[index]{
                                    label_totalNums.text = "总课时数\( m.totalNums)"
                                    label_deductedNums.text = "已扣课时数\( m.deductedNums)"
                                    label_remainingNums.text = "剩余课时数\( m.remainingNums)"
         view_menuDetail.isHidden = startClouseHomeModel?.courseList[index].courseType == 2
        }
    }
                                    view_menuDetail.isHidden = startClouseHomeModel?.courseList[index].courseType == 2
                        }
            }
}
extension CourseInfoVC:FFPageViewControllerDelegate{
    func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
        let vc = pageViewController.currentController as! CourseInfoScheduleVC
        vc.currentSelectDate = currentDate
        let first = vc.dates.first?.jq_format("yyyy.MM.dd")
        let last = vc.dates.last?.jq_format("yyyy.MM.dd")
        label_weeklyScope.text = "\(first ?? "")-\(last ?? "")"
    }
            func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
                        let vc = pageViewController.currentController as! CourseInfoScheduleVC
                        vc.currentSelectDate = currentDate
                        let first = vc.dates.first?.jq_format("yyyy.MM.dd")
                        let last = vc.dates.last?.jq_format("yyyy.MM.dd")
                        label_weeklyScope.text = "\(first ?? "")-\(last ?? "")"
            }
    func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
        return 11
    }
            func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
                        return 11
            }
    func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
        let vc = CourseInfoScheduleVC(index: page) {[weak self] date in
            self?.currentDate = date
            self?.getSelectDayData()
        }
        return vc
    }
            func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
                        let vc = CourseInfoScheduleVC(index: page) {[weak self] date in
                                    self?.currentDate = date
                                    self?.getSelectDayData()
                        }
                        return vc
            }
}
public class CourseInfoScrollView:UIScrollView{
    public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        for subView in subviews{
            let p = subView.convert(point, to: self)
            let hitTestView = subView.hitTest(p, with: event)
            return hitTestView
        }
        return nil
    }
            public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
                        for subView in subviews{
                                    let p = subView.convert(point, to: self)
                                    let hitTestView = subView.hitTest(p, with: event)
                                    return hitTestView
                        }
                        return nil
            }
}