杨锴
2025-06-04 ac84f81ca2311300b431c1bfb9f71253b59073f2
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift
@@ -10,767 +10,1023 @@
import RxRelay
let NextLession_Noti = Notification.Name.init("NextLession_Noti")
let ResetLession_Noti = Notification.Name.init("ResetLession_Noti")
//let Reload_Noti = Notification.Name.init("Reload_Noti")
enum ListenType:Int{
            case lesson1 = 1 //自主学习-听音选图
            case lesson2 = 2 //自主学习-看图选音
            case lesson3 = 3 //自主学习-归纳排除
            case lesson4 = 4 //自主学习-有问有答
            case lesson5 = 5 //自主学习-音图相配
            case game1 = 6 //游戏类型-超级听力
            case game2 = 7 //游戏类型-超级记忆
            case story1 = 8 //故事类型-自主故事1-看图配音
            case story2 = 9 //故事类型-自主故事2-框架记忆
    case lesson1 = 1 //自主学习-听音选图
    case lesson2 = 2 //自主学习-看图选音
    case lesson3 = 3 //自主学习-归纳排除
    case lesson4 = 4 //自主学习-有问有答
    case lesson5 = 5 //自主学习-音图相配
    case game1 = 6 //游戏类型-超级听力
    case game2 = 7 //游戏类型-超级记忆
    case story1 = 8 //故事类型-自主故事1-看图配音
    case story2 = 9 //故事类型-自主故事2-框架记忆
            var rawTitle:String{
                        switch self {
                                    case .lesson1:return "自主学习1-听音选图"
                                    case .lesson2:return "自主学习2-看图选音"
                                    case .lesson3:return "自主学习3-归纳排除"
                                    case .lesson4:return "自主学习4-有问有答"
                                    case .lesson5:return "自主学习5-音图相配"
                                    case .game1:return "游戏类型1-超级听力"
                                    case .game2:return "游戏类型2-超级记忆"
                                    case .story1:return "自主故事1-看图配音"
                                    case .story2:return "自主故事2-框架记忆"
                        }
            }
    var rawTitle:String{
        switch self {
        case .lesson1:return "自主学习1-听音选图"
        case .lesson2:return "自主学习2-看图选音"
        case .lesson3:return "自主学习3-归纳排除"
        case .lesson4:return "自主学习4-有问有答"
        case .lesson5:return "自主学习5-音图相配"
        case .game1:return "游戏类型1-超级听力"
        case .game2:return "游戏类型2-超级记忆"
        case .story1:return "自主故事1-看图配音"
        case .story2:return "自主故事2-框架记忆"
        }
    }
}
enum ListenFightLine{
            case before
            case next
            case none
    case before
    case next
    case none
}
//中途退出所需要
class ExitLearnModel{
            var topicsIds = Set<Int>()
    var topicsIds = Set<Int>()
}
class HomeListenFightViewModel{
            /// 当前页数
            var currentPage = BehaviorRelay<Int>(value: 0)
            var subPage = BehaviorRelay<Int>(value: 1) //小题目角标
            var maxPage = BehaviorRelay<Int>(value: 5)
            var listenType = BehaviorRelay<ListenType>(value:.lesson1)
            var times:Int = 0
            var quarter = BehaviorRelay<Int?>(value: 0)
            var week = BehaviorRelay<Int?>(value: 0)
            var day = BehaviorRelay<Int?>(value: 0)
    /// 当前页数
    var currentPage = BehaviorRelay<Int>(value: 0)
    //    var subPage = BehaviorRelay<Int>(value: 1) //小题目角标
    var maxPage = BehaviorRelay<Int>(value: 5)
    var listenType = BehaviorRelay<ListenType>(value:.lesson1)
    var times:Int = 0
    var quarter = BehaviorRelay<Int?>(value: 0)
    var week = BehaviorRelay<Int?>(value: 0)
    var day = BehaviorRelay<Int?>(value: 0)
            //游戏专属,游戏等级
            var gameLevel = BehaviorRelay<Int>(value:0)
    //游戏专属,游戏等级
    var gameLevel = BehaviorRelay<Int>(value:0)
            //回答错误数量
            var correctNum:Int = 0{
                        didSet{
                                    print("回答正确:\(correctNum)")
                        }
            }
    //回答错误数量
    var correctNum:Int = 0{
        didSet{
            print("回答正确:\(correctNum)")
        }
    }
            /// 回答错误数量
            var errorNum:Int = 0{
                        didSet{
                                    print("回答错误:\(correctNum)")
                        }
            }
    /// 回答错误数量
    var errorNum:Int = 0{
        didSet{
            print("回答错误:\(correctNum)")
        }
    }
            //所有回答的 两游戏在用
            var answerItems = Dictionary<Int,Any>() //{page:0,data:String,currectAt:0}
            var answerCount = BehaviorRelay<Int>(value: 1)
    //所有回答的 两游戏在用
    var answerItems = Dictionary<Int,Any>() //{page:0,data:String,currectAt:0}
    var answerCount = BehaviorRelay<Int>(value: 1)
            var answerItems_1 = Dictionary<String,Array<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!] = Array<Int>()
                        }
    //回答正确的题
    func insertCorrectAnswer(teamId:String?,answerId:Int){
        guard teamId != nil else {return}
        if answerItems_1[teamId!] == nil{
            answerItems_1[teamId!] = Array<Int>()
        }
                        answerItems_1[teamId!]!.append(answerId)
            }
        answerItems_1[teamId!]!.append(answerId)
    }
}
class HomeListenFightVC: BaseVC {
            private var viewModel = HomeListenFightViewModel()
            var studyScheduleModel:StudyScheduleModel? //学习进度(上级传递)
            var listenFightLine:ListenFightLine = .none
            var data:Any?
    private var viewModel = HomeListenFightViewModel()
    var studyScheduleModel:StudyScheduleModel? //学习进度(上级传递)
    var listenFightLine:ListenFightLine = .none
    var data:Any?
            var maxPage = 0 //最大页记录
            var teamScheduleModel:TeamScheduleModel? //上次中途退出,答题记录
    var maxPage = 0 //最大页记录
    var teamScheduleModel:TeamScheduleModel? //上次中途退出,答题记录
    var pages = [[ListenSubCardModel]]() //分页显示
            private var notiObject:Dictionary<String,Any>?
    private var notiObject:Dictionary<String,Any>?
            private lazy var label_pageNum:UILabel = {
                        let label = UILabel()
                        label.font = .systemFont(ofSize: 14, weight: .medium)
                        label.textColor = .black.withAlphaComponent(0.81)
                        label.textAlignment = .center
                        label.text = "已完成:0/0"
                        return label
            }()
    private lazy var label_pageNum:UILabel = {
        let label = UILabel()
        label.font = .systemFont(ofSize: 14, weight: .medium)
        label.textColor = .black.withAlphaComponent(0.81)
        label.textAlignment = .center
        label.numberOfLines = 2
        label.text = "已完成:0/0\n正确率:--%"
        return label
    }()
            private lazy var btn_forward: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.jq_borderWidth = 1
                        btn.jq_cornerRadius = 4
                        return btn
            }()
    private lazy var btn_forward: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.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
            }()
    private lazy var collection_card:UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.minimumInteritemSpacing = 2
        layout.minimumLineSpacing = 2
        layout.itemSize = CGSize(width: 24, height: 24)
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
        collectionView.backgroundColor = .clear
        return collectionView
    }()
            private lazy var btn_next: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.jq_borderWidth = 1
                        btn.jq_cornerRadius = 4
                        return btn
            }()
    private lazy var btn_beAgain: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.jq_borderWidth = 1
        btn.jq_cornerRadius = 4
        return btn
    }()
            private lazy var btn_exit:UIButton = {
                        let btn = UIButton(type: .custom)
                        btn.setTitle("退出", for: .normal)
                        btn.titleLabel?.font = .systemFont(ofSize: 14, weight: .medium)
                        btn.setTitleColor(.white, for: .normal)
                        btn.backgroundColor = Config.ThemeColor
                        btn.jq_cornerRadius = 4
                        return btn
            }()
    private lazy var btn_continue: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.jq_borderWidth = 1
        btn.jq_cornerRadius = 4
        return btn
    }()
            private lazy var pageVC:FFPageViewController = {
                        let vc = FFPageViewController()
                        vc.scrollview.isScrollEnabled = false
                        return vc
            }()
    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
    }()
            private var timer:Timer!
    private lazy var btn_next: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.jq_borderWidth = 1
        btn.jq_cornerRadius = 4
        return btn
    }()
    private lazy var btn_exit:UIButton = {
        let btn = UIButton(type: .custom)
        btn.setTitle("退出", for: .normal)
        btn.titleLabel?.font = .systemFont(ofSize: 14, weight: .medium)
        btn.setTitleColor(.white, for: .normal)
        btn.backgroundColor = Config.ThemeColor
        btn.jq_cornerRadius = 4
        return btn
    }()
            init(listenType:ListenType,quarter:Int? = nil,week:Int? = nil,day:Int? = nil) {
                        super.init(nibName: nil, bundle: nil)
                        self.viewModel.listenType.accept(listenType)
                        self.viewModel.week.accept(week)
                        self.viewModel.day.accept(day)
                        self.viewModel.quarter.accept(quarter)
    private lazy var pageVC:FFPageViewController = {
        let vc = FFPageViewController()
        vc.scrollview.isScrollEnabled = false
        return vc
    }()
                        if listenType == .game1 || listenType == .game2{
                                    self.viewModel.maxPage.accept(1)
                        }
            }
    private var timer:Timer!
            required init?(coder: NSCoder) {
                        fatalError("init(coder:) has not been implemented")
            }
            override func viewDidDisappear(_ animated: Bool) {
                        super.viewDidDisappear(animated)
                        sceneDelegate?.suspendTimer()
                        self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
            }
    init(listenType:ListenType,quarter:Int? = nil,week:Int? = nil,day:Int? = nil) {
        super.init(nibName: nil, bundle: nil)
        self.viewModel.listenType.accept(listenType)
        self.viewModel.week.accept(week)
        self.viewModel.day.accept(day)
        self.viewModel.quarter.accept(quarter)
            override func viewDidLoad() {
                        super.viewDidLoad()
        if listenType == .game1 || listenType == .game2{
            self.viewModel.maxPage.accept(1)
        }
    }
                        self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
                        yy_popBlock = {[weak self] in
                                    self?.quitAction(isPop: true)
                        }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        sceneDelegate?.suspendTimer()
        self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
    }
                        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)
    override func viewDidLoad() {
        super.viewDidLoad()
                        setPages()
                        pageVC.reloadData()
        self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
                        timer = Timer(fire: .distantPast, interval: 1.0, repeats: true, block: {[weak self] _ in
                                    self?.viewModel.times += 1
                        })
        yy_popBlock = {[weak self] in
            self?.quitAction(isPop: true)
        }
                        timer.fire()
                        RunLoop.current.add(timer, forMode: .common)
        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)
        btn_beAgain.addTarget(self, action: #selector(beAgaionAction), for: .touchUpInside)
        setPages()
        pageVC.reloadData()
                        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()
        timer = Timer(fire: .distantPast, interval: 1.0, repeats: true, block: {[weak self] _ in
            self?.viewModel.times += 1
        })
                                                case .lesson2:
                                                            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()
                                                            }
        timer.fire()
        RunLoop.current.add(timer, forMode: .common)
        setPages()
                                                case .lesson4:
                                                            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()
                                                            }
        if let teamSchedule = teamScheduleModel{
            viewModel.correctNum = viewModel.correctNum + teamSchedule.correctNumber
            viewModel.errorNum = teamSchedule.answerNumber - teamSchedule.correctNumber
            maxPage   = teamSchedule.schedule
            switch viewModel.listenType.value{
            case .lesson1:
                                                case .lesson3,.lesson5:
                                                            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()
                                                            }
                if let m  = data as? ListenNewModel{
                    self.pages = Array<ListenSubCardModel>.splitArray(m.list, subArraySize: 4)
                    let c = m.list.count / 4
                    let totalW = 24 * c + 2 * (c - 1)
                    collection_card.snp.updateConstraints { make in
                        make.width.equalTo(totalW)
                    }
                }
            case .lesson2,.lesson3,.lesson4,.lesson5:
                if let m  = data as? ListenNewModel{
                    self.pages = Array<ListenSubCardModel>.splitArray(m.list, subArraySize: 1)
                    let totalW = 24 * m.list.count + 2 * (m.list.count - 1)
                    collection_card.snp.updateConstraints { make in
                        make.width.equalTo(totalW)
                    }
                }
            default:break
            }
            switch viewModel.listenType.value {
            case .lesson1:
                collection_card.reloadData()
                let nextPage = floor(Double(maxPage) / 5.0)
                pageVC.scroll(toPage: Int(nextPage), animation: false)
                viewModel.answerCount.accept(maxPage)
                setPages()
                                                default:break
                                    }
                        }
            }
            case .lesson2:
                collection_card.reloadData()
                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()
                }
            override func setUI() {
                        super.setUI()
                        craeteFootFuncView()
            case .lesson4:
                collection_card.reloadData()
                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()
                }
                        pageVC.delegate = self
                        view.addSubview(pageVC.view)
                        pageVC.view.snp.makeConstraints { make in
                                    make.left.right.equalToSuperview()
                                    make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top)
                                    if self.viewModel.listenType.value == .lesson3 || self.viewModel.listenType.value == .lesson4{
                                                make.bottom.equalTo(self.label_pageNum.snp.top).offset(-18)
                                    }else{
                                                make.bottom.equalTo(self.label_pageNum.snp.top).offset(-32)
                                    }
                        }
            }
            case .lesson3,.lesson5:
                collection_card.reloadData()
                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()
                }
            private func showGameLevel(canLevel:Int){
                        ChooseLevelView.show(canLevel: canLevel) {[weak self] level in
                                    guard let weakSelf = self else { return }
                                    weakSelf.viewModel.gameLevel.accept(level)
                                    Services.gameHearing(difficulty: level, quarter: weakSelf.viewModel.quarter.value!, week: weakSelf.viewModel.week.value!).subscribe(onNext: {result in
                                                GameBeginTipView.show {
                                                            if let data = result.data{
                                                                        weakSelf.data = data
                                                                        (weakSelf.data as! Listen1Model).data?.playNow = true
                                                                        weakSelf.pageVC.reloadData()
                                                            }
                                                }
                                    },onError: {[weak self] _ in
                                                self?.navigationController?.popViewController(animated: true)
                                    }).disposed(by: weakSelf.disposeBag)
                        } cancelClouse: { [weak self] in
                                    self?.navigationController?.popViewController(animated: true)
                        }
            }
            private func craeteFootFuncView(){
            default:break
            }
        }
    }
    override func setUI() {
        super.setUI()
                        btn_forward.snp.makeConstraints { make in
                                    make.height.equalTo(40)
                                    make.width.equalTo(124)
                        }
        switch viewModel.listenType.value{
        case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:
            collection_card.delegate = self
            collection_card.dataSource = self
            collection_card.register(CardItemCCell.self, forCellWithReuseIdentifier: "_CardItemCCell")
        default:break
        }
                        btn_exit.snp.makeConstraints { make in
                                    make.height.equalTo(40)
                                    make.width.equalTo(124)
                        }
        craeteFootFuncView()
                        let stackView = UIStackView(arrangedSubviews: [btn_forward,label_pageNum,btn_exit])
                        if viewModel.listenType.value == .story2{
                                    btn_next.snp.makeConstraints { make in
                                                make.height.equalTo(40)
                                                make.width.equalTo(124)
                                    }
                                    stackView.insertArrangedSubview(btn_next, at: 2)
                        }
        pageVC.delegate = self
        view.addSubview(pageVC.view)
        pageVC.view.snp.makeConstraints { make in
            make.left.right.equalToSuperview()
            make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top)
            if self.viewModel.listenType.value == .lesson3 || self.viewModel.listenType.value == .lesson4{
                make.bottom.equalTo(self.label_pageNum.snp.top).offset(-52)
            }else{
                make.bottom.equalTo(self.label_pageNum.snp.top).offset(-52)
            }
        }
    }
                        stackView.spacing = 22
                        view.addSubview(stackView)
                        stackView.snp.makeConstraints { make in
                                    make.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom).offset(-22)
                                    make.centerX.equalToSuperview()
                                    make.height.equalTo(40)
                        }
            }
    private func showGameLevel(canLevel:Int){
        ChooseLevelView.show(canLevel: canLevel) {[weak self] level in
            guard let weakSelf = self else { return }
            weakSelf.viewModel.gameLevel.accept(level)
            Services.gameHearing(difficulty: level, quarter: weakSelf.viewModel.quarter.value!, week: weakSelf.viewModel.week.value!).subscribe(onNext: {result in
                GameBeginTipView.show {
                    if let data = result.data{
                        weakSelf.data = data
                        (weakSelf.data as! Listen1Model).data?.playNow = true
                        weakSelf.pageVC.reloadData()
                    }
                }
            },onError: {[weak self] _ in
                self?.navigationController?.popViewController(animated: true)
            }).disposed(by: weakSelf.disposeBag)
        } cancelClouse: { [weak self] in
            self?.navigationController?.popViewController(animated: true)
        }
    }
    private func craeteFootFuncView(){
        view.addSubview(collection_card)
        btn_forward.snp.makeConstraints { make in
            make.height.equalTo(40)
            make.width.equalTo(124)
        }
        btn_beAgain.snp.makeConstraints { make in
            make.height.equalTo(40)
            make.width.equalTo(124)
        }
        btn_continue.snp.makeConstraints { make in
            make.height.equalTo(40)
            make.width.equalTo(124)
        }
        btn_exit.snp.makeConstraints { make in
            make.height.equalTo(40)
            make.width.equalTo(124)
        }
        let stackView = UIStackView(arrangedSubviews: [btn_beAgain,label_pageNum,btn_exit])
        if viewModel.listenType.value == .story2{
            btn_next.snp.makeConstraints { make in
                make.height.equalTo(40)
                make.width.equalTo(124)
            }
            stackView.insertArrangedSubview(btn_next, at: 2)
        }
        stackView.spacing = 22
        view.addSubview(stackView)
        stackView.snp.makeConstraints { make in
            make.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom).offset(-5)
            make.centerX.equalToSuperview()
            make.height.equalTo(40)
        }
        switch viewModel.listenType.value{
        case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:
            collection_card.snp.makeConstraints { make in
                make.centerX.equalToSuperview()
                make.width.equalTo(10)
                make.bottom.equalTo(stackView.snp.top).offset(-10)
                make.height.equalTo(24)
            }
        default:break
        }
    }
    override func setRx() {
        NotificationCenter.default.rx.notification(NextLession_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
            guard let weakSelf = self else { return }
            let nextPage = weakSelf.viewModel.currentPage.value + 1
            var asComplete:Bool = false
            switch weakSelf.viewModel.listenType.value {
            case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:asComplete = nextPage >= (weakSelf.data as! ListenNewModel).subjectList.count
            case .game1,.game2:asComplete = true
            case .story1,.story2: asComplete = nextPage >= (weakSelf.data as! Listen1Model).storyList.count
            }
            if asComplete{
                switch weakSelf.viewModel.listenType.value {
                case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:
                    weakSelf.studyComplete()
                case .game1,.game2:
                    weakSelf.notiObject = noti.object as? Dictionary<String,Any>
                    weakSelf.timer.invalidate()
                    if let isComplete = weakSelf.notiObject?["complete"] as? Bool{
                        if isComplete{
                            weakSelf.btn_exit.setTitle("提交", for: .normal)
                        }else{
                            weakSelf.gamesComplete(gameId: weakSelf.notiObject!["gameId"] as! Int,integral: weakSelf.notiObject!["gameIntegral"] as! Int)
                        }
                    }
                case .story1,.story2:
                    if let dict = noti.object as? Dictionary<String,Any>{
                        let type = weakSelf.viewModel.listenType.value == .story1 ? 1:2
                        let accracy = floor(Double(weakSelf.viewModel.correctNum) / Double(weakSelf.viewModel.correctNum + weakSelf.viewModel.errorNum) * 100).int
                        weakSelf.storyComplete(storyId: dict["storyId"] as! Int, accuracy: accracy, studyTime: weakSelf.viewModel.times, type: type, integral: dict["storyIntegral"] as! Int)
                    }
                }
                return
            }
            if weakSelf.viewModel.listenType.value == .story2{
                weakSelf.btn_next.isHidden = (nextPage + 1) == weakSelf.viewModel.maxPage.value
                if weakSelf.btn_next.isHidden{
                    weakSelf.btn_exit.setTitle("完成", for: .normal)
                }
            }
            weakSelf.listenFightLine = .next
            weakSelf.pageVC.scroll(toPage: nextPage, animation: true)
            weakSelf.viewModel.currentPage.accept(nextPage)
        }).disposed(by: disposeBag)
        viewModel.currentPage.subscribe(onNext: {[weak self]currentPage in
            guard let weakSelf = self else { return }
            weakSelf.btn_forward.isHidden = currentPage <= 0
            weakSelf.setPages()
        }).disposed(by: disposeBag)
        viewModel.answerCount.subscribe(onNext: {[weak self] count in
            self?.setPages()
        }).disposed(by: disposeBag)
    }
    private func setPages(){
        switch viewModel.listenType.value{
        case .lesson1:
            let m = data as! ListenNewModel
            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.flatMap({$0}).count / 4)"
            let correctNum = m.list.filter({$0.status == 2}).count //正确
            //                if correctNum > 0 {
            let ratio = Double(correctNum) / Double(m.list.count) * 100.0
            let ratioStr = ratio.jq_formatFloat
            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.flatMap({$0}).count / 4)\n正确率:\(ratioStr)%"
            //                }
            maxPage = viewModel.answerCount.value
            btn_forward.isHidden = viewModel.answerCount.value == 1
        case .lesson3:
            let m = data as! ListenNewModel
            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.count / 6)"
            btn_forward.isHidden = viewModel.currentPage.value == 0
            let page = viewModel.currentPage.value + 1
            maxPage = page
            override func setRx() {
                        NotificationCenter.default.rx.notification(NextLession_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
                                    guard let weakSelf = self else { return }
                                    let nextPage = weakSelf.viewModel.currentPage.value + 1
                                    var asComplete:Bool = false
                                    switch weakSelf.viewModel.listenType.value {
                                                case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:asComplete = nextPage >= (weakSelf.data as! ListenNewModel).subjectList.count
                                                case .game1,.game2:asComplete = true
                                                case .story1,.story2: asComplete = nextPage >= (weakSelf.data as! Listen1Model).storyList.count
                                    }
            let correctNum = m.list.filter({$0.status == 2}).count //正确
            let ratio = Double(correctNum) / Double(m.list.count) * 100.0
            let ratioStr = ratio.jq_formatFloat
            label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\(m.subjectList.flatMap({$0}).count)\n正确率:\(ratioStr)%"
                                    if asComplete{
                                                switch weakSelf.viewModel.listenType.value {
                                                            case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:
                                                                        weakSelf.studyComplete()
                                                            case .game1,.game2:
                                                                        weakSelf.notiObject = noti.object as? Dictionary<String,Any>
                                                                        weakSelf.timer.invalidate()
        case .lesson2,.lesson5:
            let m = data as! ListenNewModel
            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.count)"
            btn_forward.isHidden = viewModel.currentPage.value == 0
            let page = viewModel.currentPage.value + 1
            maxPage = page
                                                                        if let isComplete = weakSelf.notiObject?["complete"] as? Bool{
                                                                                    if isComplete{
                                                                                                weakSelf.btn_exit.setTitle("提交", for: .normal)
                                                                                    }else{
                                                                                                weakSelf.gamesComplete(gameId: weakSelf.notiObject!["gameId"] as! Int,integral: weakSelf.notiObject!["gameIntegral"] as! Int)
                                                                                    }
                                                                        }
                                                            case .story1,.story2:
                                                                        if let dict = noti.object as? Dictionary<String,Any>{
                                                                                    let type = weakSelf.viewModel.listenType.value == .story1 ? 1:2
                                                                                    let accracy = floor(Double(weakSelf.viewModel.correctNum) / Double(weakSelf.viewModel.correctNum + weakSelf.viewModel.errorNum) * 100).int
                                                                                    weakSelf.storyComplete(storyId: dict["storyId"] as! Int, accuracy: accracy, studyTime: weakSelf.viewModel.times, type: type, integral: dict["storyIntegral"] as! Int)
                                                                        }
                                                }
                                                return
                                    }
            let correctNum = m.list.filter({$0.status == 2}).count //正确
            let ratio = Double(correctNum) / Double(m.list.count) * 100.0
            let ratioStr = ratio.jq_formatFloat
            label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\(m.subjectList.flatMap({$0}).count)\n正确率:\(ratioStr)%"
                                    if weakSelf.viewModel.listenType.value == .story2{
                                                weakSelf.btn_next.isHidden = (nextPage + 1) == weakSelf.viewModel.maxPage.value
                                                if weakSelf.btn_next.isHidden{
                                                            weakSelf.btn_exit.setTitle("完成", for: .normal)
                                                }
                                    }
        case .lesson4:
            let m = data as! ListenNewModel
            //两题为一组:需要/2
            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.count)"
            let page = viewModel.currentPage.value + 1
            //                                                maxPage = max(page,maxPage)
            maxPage = page
                                    weakSelf.listenFightLine = .next
                                    weakSelf.pageVC.scroll(toPage: nextPage, animation: true)
                                    weakSelf.viewModel.currentPage.accept(nextPage)
                        }).disposed(by: disposeBag)
            let correctNum = m.list.filter({$0.status == 2}).count //正确
            let ratio = Double(correctNum) / Double(m.list.count) * 100.0
            let ratioStr = ratio.jq_formatFloat
            label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\(m.subjectList.flatMap({$0}).count)\n正确率:\(ratioStr)%"
        case .game1,.game2:
            btn_forward.isHidden = true
            label_pageNum.isHidden = true
                        viewModel.currentPage.subscribe(onNext: {[weak self]currentPage in
                                    guard let weakSelf = self else { return }
                                    weakSelf.btn_forward.isHidden = currentPage <= 0
                                    weakSelf.setPages()
                        }).disposed(by: disposeBag)
            if viewModel.listenType.value == .game1{
                showGameLevel(canLevel: studyScheduleModel?.gameDifficulty ?? 0)
            }
        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)"
        }
    }
                        viewModel.answerCount.subscribe(onNext: {[weak self] count in
                                    self?.setPages()
                        }).disposed(by: disposeBag)
            }
            private func setPages(){
                        switch viewModel.listenType.value{
                                    case .lesson1:
                                                label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\((data as! ListenNewModel).subjectList.flatMap({$0}).count)"
//                                                maxPage = max(viewModel.answerCount.value,maxPage)
                                                maxPage = viewModel.answerCount.value
                                                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)
                                                maxPage = page
                                    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)
                                                maxPage = page
                                    case .game1,.game2:
                                                btn_forward.isHidden = true
                                                label_pageNum.isHidden = true
    /// 学习类完成
    /// - Parameter ignorePush: 是否忽略跳转(未完成答题 :true)
    private func studyComplete(){
        let ids:String = viewModel.answerItems_1.keys.sorted().joined(separator: ",")
                                                if viewModel.listenType.value == .game1{
                                                            showGameLevel(canLevel: studyScheduleModel?.gameDifficulty ?? 0)
                                                }
                                    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)"
                        }
            }
        //正确率
        let accracy = floor(Double(viewModel.correctNum) / Double(viewModel.correctNum + viewModel.errorNum) * 100).int
        Services.completeLearing(type: viewModel.listenType.value.rawValue, studyTime: viewModel.times, studyIds: ids, quarter: viewModel.quarter.value!, week: viewModel.week.value!, day: viewModel.day.value!, accracy: accracy).subscribe(onNext: {data in
            NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
            NotificationCenter.default.post(name: StudyCompleteCoinUpdate_Noti, object: data.data ?? 0)
        }).disposed(by: disposeBag)
            /// 学习类完成
            /// - Parameter ignorePush: 是否忽略跳转(未完成答题 :true)
            private func studyComplete(){
                        let ids:String = viewModel.answerItems_1.keys.sorted().joined(separator: ",")
        timer.invalidate()
                        //正确率
                        let accracy = floor(Double(viewModel.correctNum) / Double(viewModel.correctNum + viewModel.errorNum) * 100).int
        let vc = HomeStudyCompleteVC(viewModel: viewModel,studyScheduleModel: studyScheduleModel!)
        vc.title = viewModel.listenType.value.rawTitle
        vc.viewModel = viewModel
        push(vc: vc)
    }
                        Services.completeLearing(type: viewModel.listenType.value.rawValue, studyTime: viewModel.times, studyIds: ids, quarter: viewModel.quarter.value!, week: viewModel.week.value!, day: viewModel.day.value!, accracy: accracy).subscribe(onNext: {data in
                                    NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
                                    NotificationCenter.default.post(name: StudyCompleteCoinUpdate_Noti, object: data.data ?? 0)
                        }).disposed(by: disposeBag)
    //游戏类完成
    private func gamesComplete(gameId:Int,integral:Int){
                        timer.invalidate()
        var name = ""
        var accuracy:Int = 0
        var totalNum:Double = 0
                        let vc = HomeStudyCompleteVC(viewModel: viewModel,studyScheduleModel: studyScheduleModel!)
                        vc.title = viewModel.listenType.value.rawTitle
                        vc.viewModel = viewModel
                        push(vc: vc)
            }
        if viewModel.listenType.value == .game1{
            name = "超级听力"
            totalNum =  Double(viewModel.correctNum + viewModel.errorNum)
            if totalNum > 0{
                accuracy = floor(Double(viewModel.correctNum) / totalNum * 100).int
            }
        }else{
            name = "超级记忆"
            let v = viewModel.answerItems.first?.value as! Listen1Model
            //11887:完成答题页,总题目、错误题目 数量计算逻辑错误(只要是没有答对的题目就算错误题目,不管是否答,相当于错误题目就是总题目减去正确题目)
            totalNum = Double(v.photoList.count)
            if totalNum > 0 && viewModel.correctNum > 0 && viewModel.errorNum > 0{
                accuracy = floor(Double(viewModel.correctNum) / Double(totalNum) * 100).int
            }
            viewModel.errorNum = Int(totalNum) - viewModel.correctNum
        }
            //游戏类完成
            private func gamesComplete(gameId:Int,integral:Int){
        Services.completeGames(gameId: gameId, gameName: name, difficulty: viewModel.gameLevel.value, accuracy: accuracy, useTime: viewModel.times).subscribe(onNext: {data in
            NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
            NotificationCenter.default.post(name: StudyCompleteCoinUpdate_Noti, object: data.data ?? 0)
        }).disposed(by: disposeBag)
                        var name = ""
                        var accuracy:Int = 0
                        var totalNum:Double = 0
        timer.invalidate()
                        if viewModel.listenType.value == .game1{
                                    name = "超级听力"
                                    totalNum =  Double(viewModel.correctNum + viewModel.errorNum)
                                    if totalNum > 0{
                                                accuracy = floor(Double(viewModel.correctNum) / totalNum * 100).int
                                    }
                        }else{
                                    name = "超级记忆"
                                    let v = viewModel.answerItems.first?.value as! Listen1Model
                                    //11887:完成答题页,总题目、错误题目 数量计算逻辑错误(只要是没有答对的题目就算错误题目,不管是否答,相当于错误题目就是总题目减去正确题目)
                                    totalNum = Double(v.photoList.count)
                                    if totalNum > 0 && viewModel.correctNum > 0 && viewModel.errorNum > 0{
                                                accuracy = floor(Double(viewModel.correctNum) / Double(totalNum) * 100).int
                                    }
                                    viewModel.errorNum = Int(totalNum) - viewModel.correctNum
                        }
        let vc = HomeStudyCompleteVC(totalNum:totalNum.int,viewModel: viewModel,studyScheduleModel: studyScheduleModel!)
        vc.title = viewModel.listenType.value.rawTitle
        vc.viewModel = viewModel
        push(vc: vc)
    }
                        Services.completeGames(gameId: gameId, gameName: name, difficulty: viewModel.gameLevel.value, accuracy: accuracy, useTime: viewModel.times).subscribe(onNext: {data in
                                    NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
                                    NotificationCenter.default.post(name: StudyCompleteCoinUpdate_Noti, object: data.data ?? 0)
                        }).disposed(by: disposeBag)
    private func storyComplete(storyId:Int,accuracy:Int,studyTime:Int,type:Int,integral:Int){
        timer.invalidate()
        Services.completeStory(storyId: storyId, accuracy: accuracy, studyTime: studyTime, type: type).subscribe(onNext: {data in
            NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
            NotificationCenter.default.post(name: StudyCompleteCoinUpdate_Noti, object: data.data ?? 0)
        }).disposed(by: disposeBag)
                        timer.invalidate()
        let vc = HomeStudyCompleteVC(viewModel: viewModel,studyScheduleModel: studyScheduleModel!)
        vc.title = viewModel.listenType.value.rawTitle
        vc.viewModel = viewModel
        push(vc: vc)
    }
                        let vc = HomeStudyCompleteVC(totalNum:totalNum.int,viewModel: viewModel,studyScheduleModel: studyScheduleModel!)
                        vc.title = viewModel.listenType.value.rawTitle
                        vc.viewModel = viewModel
                        push(vc: vc)
            }
    deinit{
        timer.invalidate()
    }
            private func storyComplete(storyId:Int,accuracy:Int,studyTime:Int,type:Int,integral:Int){
                        timer.invalidate()
                        Services.completeStory(storyId: storyId, accuracy: accuracy, studyTime: studyTime, type: type).subscribe(onNext: {data in
                                    NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
                                    NotificationCenter.default.post(name: StudyCompleteCoinUpdate_Noti, object: data.data ?? 0)
                        }).disposed(by: disposeBag)
    @objc func quitAction(isPop:Bool = false){
        if btn_exit.titleLabel?.text == "完成"{
            if viewModel.listenType.value == .story2{
                        let vc = HomeStudyCompleteVC(viewModel: viewModel,studyScheduleModel: studyScheduleModel!)
                        vc.title = viewModel.listenType.value.rawTitle
                        vc.viewModel = viewModel
                        push(vc: vc)
            }
                if isPop{
                    CommonAlertView.show(content: "未完成全部答题,确认退出吗?") {[weak self] () in
                        guard let weakSelf = self else { return }
                        for vc in weakSelf.navigationController?.viewControllers ?? []{
                            if vc.isKind(of: HomeListenVC.self){
                                weakSelf.navigationController?.popToViewController(vc, animated: true)
                                NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
                                break
                            }
                        }
                    }
                    return
                }
            deinit{
                        timer.invalidate()
            }
                guard (pageVC.currentController as! HomeListenStory_2_VC).isPlayEnd else {
                    alert(msg: "请听完");return
                }
            @objc func quitAction(isPop:Bool = false){
                        if btn_exit.titleLabel?.text == "完成"{
                                    if viewModel.listenType.value == .story2{
                let v = data as! Listen1Model
                let accuracy = 100
                storyComplete(storyId: v.data!.id, accuracy: accuracy, studyTime: viewModel.times, type: viewModel.listenType.value == .story1 ? 1:2, integral: v.data!.integral)
            }
        }else if btn_exit.titleLabel?.text == "提交"{
                                                if isPop{
                                                            CommonAlertView.show(content: "未完成全部答题,确认退出吗?") {[weak self] () in
                                                                        guard let weakSelf = self else { return }
                                                                        for vc in weakSelf.navigationController?.viewControllers ?? []{
                                                                                    if vc.isKind(of: HomeListenVC.self){
                                                                                                weakSelf.navigationController?.popToViewController(vc, animated: true)
                                                                                                NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
                                                                                                break
                                                                                    }
                                                                        }
                                                            }
                                                            return
                                                }
            if isPop{
                CommonAlertView.show(content: "未完成全部答题,确认退出吗?") {[weak self] () in
                    guard let weakSelf = self else { return }
                    for vc in weakSelf.navigationController?.viewControllers ?? []{
                        if vc.isKind(of: HomeListenVC.self){
                            weakSelf.navigationController?.popToViewController(vc, animated: true)
                            NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
                            break
                        }
                    }
                }
                return
            }
                                                guard (pageVC.currentController as! HomeListenStory_2_VC).isPlayEnd else {
                                                            alert(msg: "请听完");return
                                                }
            if viewModel.listenType.value == .game1 || viewModel.listenType.value == .game2{
                if let dict = notiObject{
                    gamesComplete(gameId: dict["gameId"] as! Int,integral: dict["gameIntegral"] as! Int)
                }
            }
        } else{
            CommonAlertView.show(content: "未完成全部答题,确认退出吗?") {[weak self] () in
                guard let weakSelf = self else { return }
                                                let v = data as! Listen1Model
                                                let accuracy = 100
                                                storyComplete(storyId: v.data!.id, accuracy: accuracy, studyTime: viewModel.times, type: viewModel.listenType.value == .story1 ? 1:2, integral: v.data!.integral)
                                    }
                        }else if btn_exit.titleLabel?.text == "提交"{
                let temIds = [String]()
                let topicIds = [String]()
                                    if isPop{
                                                CommonAlertView.show(content: "未完成全部答题,确认退出吗?") {[weak self] () in
                                                            guard let weakSelf = self else { return }
                                                            for vc in weakSelf.navigationController?.viewControllers ?? []{
                                                                        if vc.isKind(of: HomeListenVC.self){
                                                                                    weakSelf.navigationController?.popToViewController(vc, animated: true)
                                                                                    NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
                                                                                    break
                                                                        }
                                                            }
                                                }
                                                return
                                    }
                                    if viewModel.listenType.value == .game1 || viewModel.listenType.value == .game2{
                                                if let dict = notiObject{
                                                            gamesComplete(gameId: dict["gameId"] as! Int,integral: dict["gameIntegral"] as! Int)
                                                }
                                    }
                        } else{
                                    CommonAlertView.show(content: "未完成全部答题,确认退出吗?") {[weak self] () in
                                                guard let weakSelf = self else { return }
                switch weakSelf.viewModel.listenType.value{
                case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:
                    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: weakSelf.maxPage).subscribe(onNext: { data in
                                                let temIds = [String]()
                                                let topicIds = [String]()
                        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
                                                switch weakSelf.viewModel.listenType.value{
                                                            case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:
                                                                        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: weakSelf.maxPage).subscribe(onNext: { data in
                    }).disposed(by: weakSelf.disposeBag)
                }
                for vc in weakSelf.navigationController?.viewControllers ?? []{
                    if vc.isKind(of: HomeListenVC.self){
                        weakSelf.navigationController?.popToViewController(vc, animated: true)
                        NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
                        break
                    }
                }
            }
        }
    }
                                                                                    NotificationCenter.default.post(name: MeUserInfoUpdate_Noti, object: nil)
    @objc func beAgaionAction(){
        CommonAlertView.show(content: "是否重新开始答题?确认后将清空当前答题进度") {[unowned self] in
            let day = self.viewModel.day.value ?? 0
            let week = self.viewModel.week.value ?? 0
            let type = self.viewModel.listenType.value.rawValue
            Services.restart(day: day, type: type, week: week).subscribe(onNext: {[unowned self]_ in
                self.pageVC.scroll(toPage: 0, animation: true)
                if let m = (self.data as? ListenNewModel){
                    for v in m.list{
                        v.status = 1
                    }
                    self.restore()
                    self.setPages()
                    self.collection_card.reloadData()
                    NotificationCenter.default.post(name: ResetLession_Noti, object: nil)
                }
            }).disposed(by: disposeBag)
        }
    }
                                                                        }).disposed(by: weakSelf.disposeBag)
                                                            case .game1,.game2,.story1,.story2:
                                                                        Services.exitGameOrStory(studyTime: weakSelf.viewModel.times).subscribe(onNext: { _ in
    @objc func nextAction(){
        listenFightLine = .next
        if viewModel.listenType.value == .story2{
                                                                        }).disposed(by: weakSelf.disposeBag)
                                                }
                                                for vc in weakSelf.navigationController?.viewControllers ?? []{
                                                            if vc.isKind(of: HomeListenVC.self){
                                                                        weakSelf.navigationController?.popToViewController(vc, animated: true)
                                                                        NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
                                                                        break
                                                            }
                                                }
                                    }
                        }
            }
            guard (pageVC.currentController as! HomeListenStory_2_VC).isPlayEnd else {
                alert(msg: "请听完");return
            }
            @objc func nextAction(){
                        listenFightLine = .next
                        if viewModel.listenType.value == .story2{
            let v = data as! Listen1Model
            var dict = Dictionary<String,Any>()
            dict["storyId"] = v.data?.id ?? 0
            dict["storyIntegral"] = v.data?.lookIntegral ?? 0
            NotificationCenter.default.post(name: NextLession_Noti, object: data)
        }
    }
                                    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()
            }
        }
    }
                                    let v = data as! Listen1Model
                                    var dict = Dictionary<String,Any>()
                                    dict["storyId"] = v.data?.id ?? 0
                                    dict["storyIntegral"] = v.data?.lookIntegral ?? 0
                                    NotificationCenter.default.post(name: NextLession_Noti, object: data)
                        }
            }
    @objc func beforeAction(){
            @objc func beforeAction_mini(){
                        if viewModel.listenType.value == .lesson1{
                                    if let vc = pageVC.currentController as? HomeListenFight_lesson_1_VC{
                                                print("---->进入")
                                                vc.tobefore()
                                    }
                        }
            }
        listenFightLine = .before
        let beforePage = max(0, viewModel.currentPage.value - 1)
        switch viewModel.listenType.value {
        case .lesson1:
            if !(pageVC.currentController as! HomeListenFight_lesson_1_VC).isListen{
                alert(msg: "请听完");return
            }
            @objc func beforeAction(){
            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
        }
                        listenFightLine = .before
                        let beforePage = max(0, viewModel.currentPage.value - 1)
                        switch viewModel.listenType.value {
                                    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
                        }
        pageVC.scroll(toPage: beforePage, animation: true)
        viewModel.currentPage.accept(beforePage)
                        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 == .story2{
                                    guard (pageVC.currentController as! HomeListenStory_2_VC).isPlayEnd else {
                                                alert(msg: "请听完");return
                                    }
                        }
        if viewModel.listenType.value == .lesson3{
            (pageVC.currentController as! HomeListenFight_lesson_3_VC).restore()
        }
                        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 == .story2{
            btn_next.isHidden = false
        }
                        if viewModel.listenType.value == .lesson3{
                                    (pageVC.currentController as! HomeListenFight_lesson_3_VC).restore()
                        }
        btn_exit.setTitle("退出", for: .normal)
    }
                        if viewModel.listenType.value == .story2{
                                    btn_next.isHidden = false
                        }
    private func restore(){
        if let vc = pageVC.currentController as? HomeListenFight_lesson_1_VC{
            vc.restore()
        }
        if let vc = pageVC.currentController as? HomeListenFight_lesson_2_VC{
            vc.restore()
        }
        if let vc = pageVC.currentController as? HomeListenFight_lesson_3_VC{
            vc.restore()
        }
        if let vc = pageVC.currentController as? HomeListenFight_lesson_4_VC{
            vc.restore()
        }
        if let vc = pageVC.currentController as? HomeListenFight_lesson_5_VC{
            vc.restore()
        }
                        btn_exit.setTitle("退出", for: .normal)
            }
        if let vc = pageVC.currentController as? HomeListenStory_1_VC{
            vc.restore()
        }
        if let vc = pageVC.currentController as? HomeListenStory_2_VC{
            vc.restore()
        }
    }
}
extension HomeListenFightVC:FFPageViewControllerDelegate{
            func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
    func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
                        switch viewModel.listenType.value {
                                    case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:return UInt((data as! ListenNewModel).subjectList.count)
                                    case .story1,.story2:
                                                return UInt((data as! Listen1Model).storyList.count)
                                    default:break
                        }
        switch viewModel.listenType.value {
        case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:return UInt((data as! ListenNewModel).subjectList.count)
        case .story1,.story2:
            return UInt((data as! Listen1Model).storyList.count)
        default:break
        }
                        //超级听力,只有一页
                        if viewModel.listenType.value == .game1 || viewModel.listenType.value == .game2{
                                    return 1
                        }
                        return UInt(viewModel.maxPage.value)
            }
        //超级听力,只有一页
        if viewModel.listenType.value == .game1 || viewModel.listenType.value == .game2{
            return 1
        }
        return UInt(viewModel.maxPage.value)
    }
            func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
    func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
                        if listenFightLine == .before{
                                    if let vc = pageViewController.currentController as? HomeListenFight_lesson_1_VC{
                                                vc.restore()
                                    }
                                    if let vc = pageViewController.currentController as? HomeListenFight_lesson_2_VC{
                                                vc.restore()
                                    }
                                    if let vc = pageViewController.currentController as? HomeListenFight_lesson_3_VC{
                                                vc.restore()
                                    }
                                    if let vc = pageViewController.currentController as? HomeListenFight_lesson_4_VC{
                                                vc.restore()
                                    }
                                    if let vc = pageViewController.currentController as? HomeListenFight_lesson_5_VC{
                                                vc.restore()
                                    }
        if listenFightLine == .before{
            restore()
        }
    }
                                    if let vc = pageViewController.currentController as? HomeListenStory_1_VC{
                                                vc.restore()
                                    }
                                    if let vc = pageViewController.currentController as? HomeListenStory_2_VC{
                                                vc.restore()
                                    }
                        }
            }
    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
            vc.handleClouseAction {[unowned self] in
                self.setPages()
                self.collection_card.reloadData()
            }
            return vc
        }
            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
            vc.handleClouseAction {[unowned self] in
                self.setPages()
                self.collection_card.reloadData()
            }
            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
            vc.handleClouseAction {[unowned self] in
                self.setPages()
                self.collection_card.reloadData()
            }
            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
            vc.handleClouseAction {[unowned self] in
                self.setPages()
                self.collection_card.reloadData()
            }
            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
            vc.handleClouseAction {[unowned self] in
                self.setPages()
                self.collection_card.reloadData()
            }
            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
                        }
        if viewModel.listenType.value == .game1{
            if data == nil{return UIViewController()}
            let vc = HomeListenGame_1_VC(listen1Model: data as! Listen1Model)
            vc.rootViewModel = viewModel
            return vc
        }
                        if viewModel.listenType.value == .game1{
                                    if data == nil{return UIViewController()}
                                    let vc = HomeListenGame_1_VC(listen1Model: data as! Listen1Model)
                                    vc.rootViewModel = viewModel
                                    return vc
                        }
        if viewModel.listenType.value == .game2{
            let vc = HomeListenGame_2_VC(listen1Model: data as! Listen1Model)
            vc.rootViewModel = viewModel
            return vc
        }
                        if viewModel.listenType.value == .game2{
                                    let vc = HomeListenGame_2_VC(listen1Model: data as! Listen1Model)
                                    vc.rootViewModel = viewModel
                                    return vc
                        }
        if viewModel.listenType.value == .story1{
            let vc = HomeListenStory_1_VC(page: page, listen1Model: data as! Listen1Model)
            vc.rootViewModel = viewModel
            return vc
        }
                        if viewModel.listenType.value == .story1{
                                    let vc = HomeListenStory_1_VC(page: page, listen1Model: data as! Listen1Model)
                                    vc.rootViewModel = viewModel
                                    return vc
                        }
        if viewModel.listenType.value == .story2{
            let vc = HomeListenStory_2_VC(page: page, listen1Model: data as! Listen1Model)
            vc.rootViewModel = viewModel
            return vc
        }
                        if viewModel.listenType.value == .story2{
                                    let vc = HomeListenStory_2_VC(page: page, listen1Model: data as! Listen1Model)
                                    vc.rootViewModel = viewModel
                                    return vc
                        }
                        let vc = UIViewController()
                        return vc
            }
        let vc = UIViewController()
        return vc
    }
}
extension HomeListenFightVC:UICollectionViewDelegate{
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if let m = data as? ListenNewModel{
            guard m.list[indexPath.row].status != 1 else{return}
            guard pageVC.currentPage != indexPath.row else {return}
            pageVC.scroll(toPage: indexPath.row, animation: true)
            //todo
        }
    }
}
extension HomeListenFightVC:UICollectionViewDataSource{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if let m = data as? ListenNewModel{
            if viewModel.listenType.value == .lesson1{
                return pages.count
            }
            return pages.count
        }
        return 0
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_CardItemCCell", for: indexPath) as! CardItemCCell
        if let m = data as? ListenNewModel{
            let model = pages[indexPath.row]
            cell.titleL.text = "\(indexPath.row + 1)"
            if viewModel.listenType.value == .lesson1{
                if model.filter({$0.status == 2}).count == 4{
                    cell.titleL.textColor = UIColor(hexString: "#52C41A")
                    cell.titleL.jq_borderColor = UIColor(hexString: "#52C41A")
                }else if model.filter({$0.status == 3}).count >= 1 {
                    cell.titleL.textColor = UIColor(hexString: "#FF4D4F")
                    cell.titleL.jq_borderColor = UIColor(hexString: "#52C41A")
                }else{
                    cell.titleL.textColor = .black.withAlphaComponent(0.25)
                    cell.titleL.jq_borderColor = .black.withAlphaComponent(0.25)
                }
            }else{
                //状态1灰色未答题 2绿色正确 3红色错误
                switch model.first!.status{
                case 1:
                    cell.titleL.textColor = .black.withAlphaComponent(0.25)
                    cell.titleL.jq_borderColor = .black.withAlphaComponent(0.25)
                case 2:
                    cell.titleL.textColor = UIColor(hexString: "#52C41A")
                    cell.titleL.jq_borderColor = UIColor(hexString: "#52C41A")
                case 3:
                    cell.titleL.textColor = UIColor(hexString: "#FF4D4F")
                    cell.titleL.jq_borderColor = UIColor(hexString: "#52C41A")
                default:break
                }
            }
        }
        return cell
    }
}
class CardItemCCell:UICollectionViewCell{
    var titleL:UILabel!
    override init(frame: CGRect) {
        super.init(frame: frame)
        titleL = UILabel()
        titleL.text = "1"
        titleL.backgroundColor = .white
        titleL.jq_borderColor = .black.withAlphaComponent(0.15)
        titleL.jq_borderWidth = 0.5
        titleL.font = .systemFont(ofSize: 13,weight: .semibold)
        titleL.textAlignment = .center
        contentView.addSubview(titleL)
        titleL.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}