无故事王国
2024-07-06 607c74dfcfb5e52e56604f635d1d6a081cddcace
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift
@@ -83,15 +83,16 @@
            var answerItems = Dictionary<Int,Any>() //{page:0,data:String,currectAt:0}
            var answerCount = BehaviorRelay<Int>(value: 1)
            var answerItems_1 = Dictionary<String,Set<Int>>()
            var answerItems_1 = Dictionary<String,Array<Int>>()
            //回答正确的题
            func insertCorrectAnswer(teamId:String?,answerId:Int){
                        guard teamId != nil else {return}
                        if answerItems_1[teamId!] == nil{
                                    answerItems_1[teamId!] = Set<Int>()
                                    answerItems_1[teamId!] = Array<Int>()
                        }
                        answerItems_1[teamId!]!.insert(answerId)
                        answerItems_1[teamId!]!.append(answerId)
            }
}
@@ -100,6 +101,9 @@
            var studyScheduleModel:StudyScheduleModel? //学习进度(上级传递)
            var listenFightLine:ListenFightLine = .none
            var data:Any?
            var maxPage = 0 //最大页记录
            var teamScheduleModel:TeamScheduleModel? //上次中途退出,答题记录
            private var notiObject:Dictionary<String,Any>?
@@ -119,6 +123,19 @@
                        btn.setTitleColor(Config.ThemeColor, for: .normal)
                        btn.jq_borderColor = Config.ThemeColor
                        btn.backgroundColor = .white
                        btn.jq_borderWidth = 1
                        btn.jq_cornerRadius = 4
                        return btn
            }()
            private lazy var btn_forward_mini:UIButton = {
                        let btn = UIButton(type: .custom)
                        btn.setTitle("上一小题", for: .normal)
                        btn.titleLabel?.font = .systemFont(ofSize: 14, weight: .medium)
                        btn.setTitleColor(Config.ThemeColor, for: .normal)
                        btn.jq_borderColor = Config.ThemeColor
                        btn.backgroundColor = .white
                        btn.isHidden = true
                        btn.jq_borderWidth = 1
                        btn.jq_cornerRadius = 4
                        return btn
@@ -174,10 +191,13 @@
            override func viewDidDisappear(_ animated: Bool) {
                        super.viewDidDisappear(animated)
                        sceneDelegate?.suspendTimer()
                        self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
            }
            override func viewDidLoad() {
                        super.viewDidLoad()
                        self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
                        yy_popBlock = {[weak self] in
                                    self?.quitAction(isPop: true)
@@ -185,6 +205,7 @@
                        btn_exit.addTarget(self, action: #selector(quitAction), for: .touchUpInside)
                        btn_forward.addTarget(self, action: #selector(beforeAction), for: .touchUpInside)
                        btn_forward_mini.addTarget(self, action: #selector(beforeAction_mini), for: .touchUpInside)
                        btn_next.addTarget(self, action: #selector(nextAction), for: .touchUpInside)
                        setPages()
@@ -197,36 +218,70 @@
                        timer.fire()
                        RunLoop.current.add(timer, forMode: .common)
                        Services.teamSchedule(type: viewModel.listenType.value, week: viewModel.week.value!, day: viewModel.day.value!).subscribe(onNext: {[weak self] data in
                                    guard let weakSelf = self else { return }
                                    if let model = data.data{
                                                weakSelf.viewModel.correctNum = weakSelf.viewModel.correctNum + model.correctNumber
                                                weakSelf.viewModel.errorNum = model.answerNumber - model.correctNumber
                                                //跳转至指定页面
                                                let page = max(0,model.topicIds.count - 1)
                                                if weakSelf.pageVC.currentPage != page{
                                                            weakSelf.pageVC.scroll(toPage: page, animation: false)
                                                }
                        if let teamSchedule = teamScheduleModel{
                                                viewModel.correctNum = viewModel.correctNum + teamSchedule.correctNumber
                                                viewModel.errorNum = teamSchedule.answerNumber - teamSchedule.correctNumber
                                    maxPage   = teamSchedule.schedule
                                                let ids = (data as! ListenNewModel).data!.id.components(separatedBy: ",")
                                                switch viewModel.listenType.value {
                                                            case .lesson1:
                                                                        let nextPage = floor(Double(maxPage) / 5.0)
                                                                        pageVC.scroll(toPage: Int(nextPage), animation: false)
                                                                        viewModel.answerCount.accept(maxPage)
                                                                        setPages()
                                                DispatchQueue.main.asyncAfter(wallDeadline: .now()+0.5){
                                                            switch weakSelf.viewModel.listenType.value {
                                                                        case .lesson1:
                                                                                    let vc = weakSelf.pageVC.currentController as! HomeListenFight_lesson_1_VC
                                                                        case .lesson2:
                                                                                    let vc = weakSelf.pageVC.currentController as! HomeListenFight_lesson_2_VC
                                                                        case .lesson3:
                                                                                    let vc = weakSelf.pageVC.currentController as! HomeListenFight_lesson_3_VC
                                                                        case .lesson4:
                                                                                    let vc = weakSelf.pageVC.currentController as! HomeListenFight_lesson_4_VC
                                                                        case .lesson5:
                                                                                    let vc = weakSelf.pageVC.currentController as! HomeListenFight_lesson_5_VC
                                                                        default:
                                                                                    break
                                                            }
//                                                                        for (index,v) in ids.enumerated(){
//                                                                                    if v == String(teamSchedule.teamIds.last!){
//                                                                                                let maxCount = (data as! ListenNewModel).subjectList.count
//                                                                                                //下一页页码
//                                                                                                let page = min(index, maxCount)
//                                                                                                if pageVC.currentPage != page{
//                                                                                                            pageVC.scroll(toPage: page, animation: false)
//                                                                                                            setPages()
//                                                                                                }
//                                                                                                viewModel.answerCount.accept(teamSchedule.topicIds.count + 1)
//                                                                                    }
//                                                                        }
                                                            case .lesson2:
//                                                                        let nextPage = (teamSchedule.teamIds.count) - 1
                                                                        let maxCount = (data as! ListenNewModel).subjectList.count
                                                                                    let page = min((maxPage - 1),maxCount)
                                                                        if pageVC.currentPage != page{
                                                                                    viewModel.currentPage.accept(page)
                                                                                    pageVC.scroll(toPage: page, animation: false)
                                                                                    setPages()
                                                                        }
                                                            case .lesson4:
//                                                                        let nextPage = (teamSchedule.teamIds.count) - 1
                                                                        let maxCount = (data as! ListenNewModel).subjectList.count
                                                                        let page = min((maxPage - 1),maxCount)
                                                                        if pageVC.currentPage != page{
                                                                                    viewModel.currentPage.accept(page)
                                                                                    pageVC.scroll(toPage: page, animation: false)
                                                                                    setPages()
                                                                        }
                                                            case .lesson3,.lesson5:
//                                                                        let nextPage = (teamSchedule.teamIds.count) - 1
                                                                        let maxCount = (data as! ListenNewModel).subjectList.count
                                                                        let page = min((maxPage - 1),maxCount)
                                                                        if pageVC.currentPage != page{
                                                                                    viewModel.currentPage.accept(page)
                                                                                    pageVC.scroll(toPage: page, animation: false)
                                                                                    setPages()
                                                                        }
                                                            default:break
                                                }
                                    }
                        }).disposed(by: disposeBag)
                        }
            }
            override func setUI() {
@@ -269,15 +324,12 @@
            private func craeteFootFuncView(){
                        view.addSubview(label_pageNum)
                        view.addSubview(btn_forward)
                        btn_forward.snp.makeConstraints { make in
                                    make.height.equalTo(40)
                                    make.width.equalTo(124)
                        }
                        view.addSubview(btn_exit)
                        btn_exit.snp.makeConstraints { make in
                                    make.height.equalTo(40)
                                    make.width.equalTo(124)
@@ -362,13 +414,20 @@
            private func setPages(){
                        switch viewModel.listenType.value{
                                    case .lesson1,.lesson5:
                                    case .lesson1:
                                                label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\((data as! ListenNewModel).subjectList.flatMap({$0}).count)"
                                    case .lesson2,.lesson3:
                                                maxPage = max(viewModel.answerCount.value,maxPage)
                                                btn_forward.isHidden = viewModel.answerCount.value == 1
                                    case .lesson2,.lesson3,.lesson5:
                                                label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\((data as! ListenNewModel).subjectList.count)"
                                                btn_forward.isHidden = viewModel.currentPage.value == 0
                                                let page = viewModel.currentPage.value + 1
                                                maxPage = max(page,maxPage)
                                    case .lesson4:
                                                //两题为一组:需要/2
                                                label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\((data as! ListenNewModel).subjectList.count)"
                                                let page = viewModel.currentPage.value + 1
                                                maxPage = max(page,maxPage)
                                    case .game1,.game2:
                                                btn_forward.isHidden = true
                                                label_pageNum.isHidden = true
@@ -376,17 +435,18 @@
                                                if viewModel.listenType.value == .game1{
                                                            showGameLevel(canLevel: studyScheduleModel?.gameDifficulty ?? 0)
                                                }
                                    case .story1,.story2:
                                                let count = (data as! Listen1Model).storyList.count
                                                viewModel.maxPage.accept(count)
                                                label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(count)"
                                    case .story1:
                                                if viewModel.listenType.value == .story2{
                                                            btn_next.isHidden = (viewModel.currentPage.value + 1) == viewModel.maxPage.value
                                                            if btn_next.isHidden{
                                                                        btn_exit.setTitle("完成", for: .normal)
                                                            }
                                                }
                                                fallthrough
                                    case .story2:
                                                let count = (data as! Listen1Model).storyList.count
                                                viewModel.maxPage.accept(count)
                                                label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(count)"
                        }
            }
@@ -477,10 +537,6 @@
                                                                                    if vc.isKind(of: HomeListenVC.self){
                                                                                                weakSelf.navigationController?.popToViewController(vc, animated: true);break
                                                                                    }
//                                                                                    if vc.isKind(of: HomeListenMenuVC.self){
//                                                                                                weakSelf.navigationController?.popToViewController(vc, animated: true);break
//                                                                                    }
                                                                        }
                                                            }
                                                            return
@@ -503,10 +559,6 @@
                                                                        if vc.isKind(of: HomeListenVC.self){
                                                                                    weakSelf.navigationController?.popToViewController(vc, animated: true);break
                                                                        }
//                                                                        if vc.isKind(of: HomeListenMenuVC.self){
//                                                                                    weakSelf.navigationController?.popToViewController(vc, animated: true);break
//                                                                        }
                                                            }
                                                }
                                                return
@@ -521,27 +573,37 @@
                                    CommonAlertView.show(content: "未完成全部答题,确认退出吗?") {[weak self] () in
                                                guard let weakSelf = self else { return }
                                                let topicIds = weakSelf.viewModel.answerItems_1.keys.sorted()
                                                let temIds = weakSelf.viewModel.answerItems_1.values.flatMap({$0}).map({"\($0)"})
//                                                let temIds = weakSelf.viewModel.answerItems_1.keys.sorted()
//                                                let topicIds = weakSelf.viewModel.answerItems_1.values.flatMap({$0}).map({"\($0)"})
                                                var schedule:Int = 0
                                                switch weakSelf.viewModel.listenType.value{
                                                            case .lesson1,.lesson2,.lesson5:schedule = weakSelf.viewModel.answerCount.value
                                                            case .lesson3:schedule = weakSelf.viewModel.currentPage.value + 1
                                                            case .lesson4:schedule = weakSelf.viewModel.currentPage.value + 1
                                                            default:break
                                                }
                                                let temIds = [String]()
                                                let topicIds = [String]()
//                                                var schedule:Int = 0
//                                                if let page = weakSelf.label_pageNum.text?.components(separatedBy: ":").last?.components(separatedBy: "/").first?.int{
//                                                            schedule = max((page - 1),1)
//                                                }
//                                                switch weakSelf.viewModel.listenType.value{
//                                                            case .lesson1:schedule = max(weakSelf.viewModel.answerCount.value - 1,1)
//                                                            case .lesson2,.lesson3:schedule = max(weakSelf.viewModel.currentPage.value,1)
//                                                            case .lesson4:schedule = max(weakSelf.viewModel.currentPage.value,1)
//                                                            case .lesson5:schedule = max(weakSelf.viewModel.currentPage.value,1)
//                                                            default:break
//                                                }
                                                switch weakSelf.viewModel.listenType.value{
                                                            case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:
                                                                        if temIds.count > 0 && topicIds.count > 0{
//                                                                        if temIds.count > 0 && topicIds.count > 0{
                                                                                    let totalNum = weakSelf.viewModel.correctNum + weakSelf.viewModel.errorNum
                                                                                    Services.exitLearning(type:weakSelf.viewModel.listenType.value.rawValue,quarter: weakSelf.viewModel.quarter.value!,week: weakSelf.viewModel.week.value!, day: weakSelf.viewModel.day.value!, teamIds: temIds, topicIds: topicIds,answerNumber: totalNum,correctNumber:weakSelf.viewModel.correctNum,studyTime:weakSelf.viewModel.times,schedule: schedule).subscribe(onNext: { data in
                                                                                    Services.exitLearning(type:weakSelf.viewModel.listenType.value.rawValue,quarter: weakSelf.viewModel.quarter.value!,week: weakSelf.viewModel.week.value!, day: weakSelf.viewModel.day.value!, teamIds: temIds, topicIds: topicIds,answerNumber: totalNum,correctNumber:weakSelf.viewModel.correctNum,studyTime:weakSelf.viewModel.times,schedule: weakSelf.maxPage).subscribe(onNext: { data in
                                                                                                NotificationCenter.default.post(name: MeUserInfoUpdate_Noti, object: nil)
                                                                                    }).disposed(by: weakSelf.disposeBag)
                                                                        }
//                                                                        }
                                                            case .game1,.game2,.story1,.story2:
                                                                        Services.exitGameOrStory(studyTime: weakSelf.viewModel.times).subscribe(onNext: { _ in
@@ -551,10 +613,6 @@
                                                            if vc.isKind(of: HomeListenVC.self){
                                                                        weakSelf.navigationController?.popToViewController(vc, animated: true);break
                                                            }
//
//                                                            if vc.isKind(of: HomeListenMenuVC.self){
//                                                                        weakSelf.navigationController?.popToViewController(vc, animated: true);break
//                                                            }
                                                }
                                    }
                        }
@@ -576,18 +634,28 @@
                        }
            }
            @objc func beforeAction(){
                        if viewModel.listenType.value == .story2{
                                    guard (pageVC.currentController as! HomeListenStory_2_VC).isPlayEnd else {
                                                alert(msg: "请听完");return
            @objc func beforeAction_mini(){
                        if viewModel.listenType.value == .lesson1{
                                    if let vc = pageVC.currentController as? HomeListenFight_lesson_1_VC{
                                                print("---->进入")
                                                vc.tobefore()
                                    }
                        }
            }
            @objc func beforeAction(){
                        listenFightLine = .before
                        let beforePage = max(0, viewModel.currentPage.value - 1)
                        switch viewModel.listenType.value {
                                    case .lesson1,.lesson2:
                                    case .lesson1:
                                                if !(pageVC.currentController as! HomeListenFight_lesson_1_VC).isListen{
                                                            alert(msg: "请听完");return
                                                }
                                                let temp = viewModel.answerCount.value - 1
                                                viewModel.answerCount.accept(max(1,temp))
                                    case .lesson2:
                                                let temp = (beforePage * 4) + 1
                                                viewModel.answerCount.accept(max(1,temp))
                                    default:break
@@ -596,6 +664,24 @@
                        pageVC.scroll(toPage: beforePage, animation: true)
                        viewModel.currentPage.accept(beforePage)
                        if viewModel.listenType.value == .story2{
                                    guard (pageVC.currentController as! HomeListenStory_2_VC).isPlayEnd else {
                                                alert(msg: "请听完");return
                                    }
                        }
                        if viewModel.listenType.value == .lesson1{
                                    let currentVC = pageVC.currentController as! HomeListenFight_lesson_1_VC
//                                    if (viewModel.answerCount.value - 1 ) % 4 != 0 || viewModel.answerCount.value <= 4{
                                                currentVC.tobefore();return
//                                    }
                        }
                        if viewModel.listenType.value == .lesson3{
                                    (pageVC.currentController as! HomeListenFight_lesson_3_VC).restore()
                        }
                        if viewModel.listenType.value == .story2{
                                    btn_next.isHidden = false
@@ -654,30 +740,35 @@
            func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
                        if viewModel.listenType.value == .lesson1{
                                    let vc = HomeListenFight_lesson_1_VC(page: page,listenNewModel:data as! ListenNewModel)
                                    vc.teamScheduleModel = teamScheduleModel
                                    vc.rootViewModel = viewModel
                                    return vc
                        }
                        if viewModel.listenType.value == .lesson2{
                                    let vc = HomeListenFight_lesson_2_VC(page: page,listenNewModel:data as! ListenNewModel)
                                    vc.teamScheduleModel = teamScheduleModel
                                    vc.rootViewModel = viewModel
                                    return vc
                        }
                        if viewModel.listenType.value == .lesson3{
                                    let vc = HomeListenFight_lesson_3_VC(page: page, listenNewModel: data as! ListenNewModel)
                                    vc.teamScheduleModel = teamScheduleModel
                                    vc.rootViewModel = viewModel
                                    return vc
                        }
                        if viewModel.listenType.value == .lesson4{
                                    let vc = HomeListenFight_lesson_4_VC(page: page, listenNewModel: data as! ListenNewModel)
                                    vc.teamScheduleModel = teamScheduleModel
                                    vc.rootViewModel = viewModel
                                    return vc
                        }
                        if viewModel.listenType.value == .lesson5{
                                    let vc = HomeListenFight_lesson_5_VC(page: page, listenNewModel: data as! ListenNewModel)
                                    vc.teamScheduleModel = teamScheduleModel
                                    vc.rootViewModel = viewModel
                                    return vc
                        }