无故事王国
2023-11-08 5f9cd3ae516f510a9475fd11f440fedf027aa4df
修复BUG
31个文件已修改
3个文件已添加
628 ■■■■ 已修改文件
WanPai.xcodeproj/project.pbxproj 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Model/CommonModels.swift 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Network/Services.swift 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/CustomPointAnnotation.swift 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityDetailApplyVC.swift 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityDetailVC.swift 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityListVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityStudentListVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/View/StoresInfo_2_View.swift 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/View/StoresInfo_2_View.xib 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/View/StudentUpdateInfoView.swift 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/View/StudentUpdateInfoView.xib 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/TCell/CourseOnlineTCell.xib 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/AddStudentVC.swift 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseDetailVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseOnlineListVC.swift 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseVideoDetailVC.swift 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/StudentMentalListVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/VC/HomeVC.swift 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/VC/JoinMemberIntroduceVC.swift 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/TCell/CouponTCell.xib 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/VC/PaymentResultVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/View/StoresChooseView.swift 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/View/StudentChooseView.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/VC/SearchVC.swift 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Search/View/CustomPointAnnotationView.swift 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/TCell/BillInfoTCell.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/RechargeRecordVC.swift 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/WelfareRedeemGoodsDetailVC.swift 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/VC/WelfareVC.swift 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Welfare/View/CoinStoreHeadView.swift 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Yard/VC/YardBookingDetailVC.swift 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Yard/VC/YardBookingDetailVC.xib 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Yard/VC/YardDetailVC.swift 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai.xcodeproj/project.pbxproj
@@ -50,6 +50,9 @@
        133A61882A4E7A200066C4E6 /* CustomerSubListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133A61872A4E7A200066C4E6 /* CustomerSubListVC.swift */; };
        133A618C2A4E7AF90066C4E6 /* CustomerContentTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133A618A2A4E7AF90066C4E6 /* CustomerContentTCell.swift */; };
        133A618D2A4E7AF90066C4E6 /* CustomerContentTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 133A618B2A4E7AF90066C4E6 /* CustomerContentTCell.xib */; };
        133E223C2AFB37020045B544 /* StoresInfo_2_View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133E223B2AFB37020045B544 /* StoresInfo_2_View.swift */; };
        133E223E2AFB370D0045B544 /* StoresInfo_2_View.xib in Resources */ = {isa = PBXBuildFile; fileRef = 133E223D2AFB370D0045B544 /* StoresInfo_2_View.xib */; };
        133E22402AFB85330045B544 /* CustomPointAnnotation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133E223F2AFB85330045B544 /* CustomPointAnnotation.swift */; };
        1347D1BA2AB4457A0052082A /* GamesDataSourceSubListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1347D1B92AB4457A0052082A /* GamesDataSourceSubListVC.swift */; };
        1347D1BC2AB448C20052082A /* CourseUnAssignView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1347D1BB2AB448C20052082A /* CourseUnAssignView.swift */; };
        1347D1BE2AB448CC0052082A /* CourseUnAssignView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1347D1BD2AB448CC0052082A /* CourseUnAssignView.xib */; };
@@ -348,6 +351,9 @@
        133A61872A4E7A200066C4E6 /* CustomerSubListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomerSubListVC.swift; sourceTree = "<group>"; };
        133A618A2A4E7AF90066C4E6 /* CustomerContentTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomerContentTCell.swift; sourceTree = "<group>"; };
        133A618B2A4E7AF90066C4E6 /* CustomerContentTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CustomerContentTCell.xib; sourceTree = "<group>"; };
        133E223B2AFB37020045B544 /* StoresInfo_2_View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoresInfo_2_View.swift; sourceTree = "<group>"; };
        133E223D2AFB370D0045B544 /* StoresInfo_2_View.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StoresInfo_2_View.xib; sourceTree = "<group>"; };
        133E223F2AFB85330045B544 /* CustomPointAnnotation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomPointAnnotation.swift; sourceTree = "<group>"; };
        1347D1B92AB4457A0052082A /* GamesDataSourceSubListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GamesDataSourceSubListVC.swift; sourceTree = "<group>"; };
        1347D1BB2AB448C20052082A /* CourseUnAssignView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseUnAssignView.swift; sourceTree = "<group>"; };
        1347D1BD2AB448CC0052082A /* CourseUnAssignView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseUnAssignView.xib; sourceTree = "<group>"; };
@@ -989,6 +995,8 @@
                8D79A59A2A3967A90029874B /* StudentUpdateInfoView.xib */,
                8D6D58D22A39970C0003CFE6 /* StoresInfoView.swift */,
                8D6D58D42A3997250003CFE6 /* StoresInfoView.xib */,
                133E223B2AFB37020045B544 /* StoresInfo_2_View.swift */,
                133E223D2AFB370D0045B544 /* StoresInfo_2_View.xib */,
            );
            path = View;
            sourceTree = "<group>";
@@ -1177,6 +1185,7 @@
                8D79A5952A39677C0029874B /* View */,
                8D7D87142A380932003209D6 /* TCell */,
                8DC3BE0E2A38039700C91B7F /* VC */,
                133E223F2AFB85330045B544 /* CustomPointAnnotation.swift */,
            );
            path = Activity;
            sourceTree = "<group>";
@@ -1546,6 +1555,7 @@
                8D6E54D22A381CB000D750CE /* ActivityDetailVC.xib in Resources */,
                13272DD12A4034A300AC6481 /* YardDetailVC.xib in Resources */,
                137B866B2AB3F03F00C4D01B /* GamesVC.xib in Resources */,
                133E223E2AFB370D0045B544 /* StoresInfo_2_View.xib in Resources */,
                13CCC4BD2A4A820100DEDF19 /* StudentCourseDetailHeadView.xib in Resources */,
                8D5C150D2A31885B00A8BCC9 /* AgreentView.xib in Resources */,
                130EC1822AD3F6C0003CA9BA /* CommonAlertSheetView.xib in Resources */,
@@ -1703,6 +1713,7 @@
                1347D1BA2AB4457A0052082A /* GamesDataSourceSubListVC.swift in Sources */,
                8D8DEDED2A31D82100F2C7FA /* PaymentResultVC.swift in Sources */,
                8D6810E72A370EFB004486DE /* CouponTCell.swift in Sources */,
                133E22402AFB85330045B544 /* CustomPointAnnotation.swift in Sources */,
                133A618C2A4E7AF90066C4E6 /* CustomerContentTCell.swift in Sources */,
                1387B66C2A4AC61F00BF2F2E /* CourseBookingFuncView.swift in Sources */,
                8D8400D22A2F1430003AF6A2 /* AppDelegate.swift in Sources */,
@@ -1749,6 +1760,7 @@
                8D8400E92A2F14A3003AF6A2 /* LoginVC.swift in Sources */,
                1376A6992A4A7B7B00D4C851 /* StudentCourseDetailVC.swift in Sources */,
                133A61862A4E78340066C4E6 /* CustomerListVC.swift in Sources */,
                133E223C2AFB37020045B544 /* StoresInfo_2_View.swift in Sources */,
                13A7F72C2AB7E0EC000B3436 /* CourseEXPVC.swift in Sources */,
                136B63982A4ECDD900E594F9 /* SearchStoreDetail_1_TCell.swift in Sources */,
                8D4905A92A31A6EC00E38513 /* HomeCCell.swift in Sources */,
WanPai/Model/CommonModels.swift
@@ -112,6 +112,7 @@
    var idCard:String = ""
    var stuPhone:String = ""
    var stuHeadImg:String = ""
    var sex:GenderType = .man
}
struct StudentSimpleProfileModel:HandyJSON{
@@ -145,6 +146,7 @@
struct PaymentModel:HandyJSON{
    var orderString = ""
    var returnId = 0
    var siteBooking:Int = 0
}
struct StoreWalfareModel:HandyJSON{
@@ -784,6 +786,11 @@
struct YardBookingDetailModel:HandyJSON{
    var data:YardBookingDetailDataModel?
    var shopName:String = ""
    var siteName:String = ""
    var shopAddress:String = ""
    var siteType:String = ""
//    var ids = [Int]() //区域ID
}
WanPai/Network/Services.swift
@@ -648,13 +648,16 @@
    }
        /// 更新课后视频学习状态
    static func updateVideoStatus(coursePackageId:Int,videoId:Int)->Observable<BaseResponse<SimpleModel>>{
    static func updateVideoStatus(coursePackageId:Int,videoId:Int?)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/course/api/startCource/updateVideoStatus")
            .append(key: "coursePackageId", value: coursePackageId)
            .append(key: "videoId", value: videoId)
            .append(key: "isOver", value: 1)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
        /// 更新课后视频学习状态
        /// 观看视频结束后领取奖励
    static func receiveAward(id:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/activity/api/benefitsVideo/receiveAward")
@@ -914,6 +917,8 @@
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/site/querySiteInfo")
            .append(key: "id", value: id)
            .append(key: "lat", value: locationTool.currentLocation?.coordinate.latitude.string)
            .append(key: "lon", value: locationTool.currentLocation?.coordinate.longitude.string)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
@@ -927,7 +932,7 @@
            .append(key: "day", value: day)
            .append(key: "halfName", value: halfName)
            .append(key: "siteName", value: siteName)
        return NetworkRequest.request(params: params, method: .post, progress: false)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
        /// 预约场地支付
WanPai/Root/Activity/CustomPointAnnotation.swift
New file
@@ -0,0 +1,14 @@
//
//  CustomPointAnnotation.swift
//  WanPai
//
//  Created by 无故事王国 on 2023/11/8.
//
import Foundation
class CustomPointAnnotation:MAPointAnnotation{
    var index = 0
}
WanPai/Root/Activity/VC/ActivityDetailApplyVC.swift
@@ -128,38 +128,69 @@
    @IBAction func applyAction(_ sender: UIButton) {
        guard students.count != 0 else {
            alertError(msg: "请至少选择一位参赛人员");return
            alertError(msg: "请至少选择一位活动人员");return
        }
        StoresInfoView.show(activityDetailModel.storeInfos.first!) { [weak self] status in
            guard let weakSelf = self else { return }
            let price = weakSelf.activityDetailModel.cashPrice * Double(weakSelf.students.count)
            let coin = weakSelf.activityDetailModel.playPaiCoin * weakSelf.students.count
            let course = weakSelf.activityDetailModel.classPrice * weakSelf.students.count
        if activityDetailModel.storeInfos.count > 1{
            let a = activityDetailModel.storeInfos.map({$0.name})
            StoresInfo_2_View.show(a) {[weak self] status in
                guard let weakSelf = self else { return }
            if status{
                let isStudent = weakSelf.students.filter({$0.isStudent == 0}).count > 0 ? true:false
                PaymentView.show(money: (ali:price,wx:price,coin:coin,course:course,integral:nil),hasNotStudent: isStudent) { [weak self] type in
                    guard let weakSelf = self else { return }
                    if type == .courseNum{
                        PaymentCourseView.show(id: weakSelf.activityDetailModel.id,number:course) { id in
                            weakSelf.payment(type: type,paymentId: id)
                let price = weakSelf.activityDetailModel.cashPrice * Double(weakSelf.students.count)
                let coin = weakSelf.activityDetailModel.playPaiCoin * weakSelf.students.count
                let course = weakSelf.activityDetailModel.classPrice * weakSelf.students.count
                if status{
                    let isStudent = weakSelf.students.filter({$0.isStudent == 0}).count > 0 ? true:false
                    PaymentView.show(money: (ali:price,wx:price,coin:coin,course:course,integral:nil),hasNotStudent: isStudent) { [weak self] type in
                        guard let weakSelf = self else { return }
                        if type == .courseNum{
                            PaymentCourseView.show(id: weakSelf.activityDetailModel.id,number:course) { id in
                                weakSelf.payment(type: type,paymentId: id)
                            }
                        }else{
                            weakSelf.payment(type: type)
                        }
                    }else{
                        weakSelf.payment(type: type)
                    }
                }
            }else{
                NotificationCenter.default.post(name: ChooseHomeStore_Noti, object: nil)
                }else{
                    weakSelf.navigationController?.qmui_popToRootViewController(animated: true, completion: {
                        NotificationCenter.default.post(name: ChooseHomeStore_Noti, object: nil)
                    })
                }
            }
        }
        }else{
            StoresInfoView.show(activityDetailModel.storeInfos.first!) { [weak self] status in
                guard let weakSelf = self else { return }
                let price = weakSelf.activityDetailModel.cashPrice * Double(weakSelf.students.count)
                let coin = weakSelf.activityDetailModel.playPaiCoin * weakSelf.students.count
                let course = weakSelf.activityDetailModel.classPrice * weakSelf.students.count
                if status{
                    let isStudent = weakSelf.students.filter({$0.isStudent == 0}).count > 0 ? true:false
                    PaymentView.show(money: (ali:price,wx:price,coin:coin,course:course,integral:nil),hasNotStudent: isStudent) { [weak self] type in
                        guard let weakSelf = self else { return }
                        if type == .courseNum{
                            PaymentCourseView.show(id: weakSelf.activityDetailModel.id,number:course) { id in
                                weakSelf.payment(type: type,paymentId: id)
                            }
                        }else{
                            weakSelf.payment(type: type)
                        }
                    }
                }else{
                    weakSelf.navigationController?.qmui_popToRootViewController(animated: true, completion: {
                        NotificationCenter.default.post(name: ChooseHomeStore_Noti, object: nil)
                    })
                }
            }
        }
    }
    private func payment(type:PayType,paymentId:Int? = nil){
        let ids = students.map({"\($0.id)"}).joined(separator: ",")
        Services.paymentCompetition(id: activityDetailModel.id, userIds: ids, payType: type,coursePaymentId: paymentId).subscribe(onNext: {[weak self] data in
            guard let weakSelf = self else { return }
            if let m = data.data{
                switch type {
                    case .aliPay:
WanPai/Root/Activity/VC/ActivityDetailVC.swift
@@ -74,10 +74,10 @@
            label_coin.text = String(format: "%ld币/人", activityDetailModel.playPaiCoin)
            label_courseNum.text = String(format: "%ld课时/人", activityDetailModel.classPrice)
            let name = activityDetailModel.apply == 1 ? "已报名":"立即报名"
            let color = activityDetailModel.apply == 1 ? UIColor.gray.withAlphaComponent(0.5):Def_ThemeColor
            btn_enroll.setTitle(name, for: .normal)
            btn_enroll.backgroundColor = color
//            let name = activityDetailModel.apply == 1 ? "已报名":"立即报名"
//            let color = activityDetailModel.apply == 1 ? UIColor.gray.withAlphaComponent(0.5):Def_ThemeColor
//            btn_enroll.setTitle(name, for: .normal)
//            btn_enroll.backgroundColor = color
            let imgs = activityDetailModel.imgs.components(separatedBy: ",")
            var items = [CommonBannerModel]()
@@ -123,7 +123,6 @@
    }
    @IBAction func joinAction(_ sender: UIButton) {
        guard activityDetailModel.apply == 0 else {return}
        let vc = ActivityDetailApplyVC(model: activityDetailModel)
        push(vc: vc)
    }
WanPai/Root/Activity/VC/ActivityListVC.swift
@@ -39,7 +39,7 @@
    
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "赛事活动列表"
        title = "活动列表"
        viewModel.configure(tableView,needMore: false)
        viewModel.beginRefresh()
    }
WanPai/Root/Activity/VC/ActivityStudentListVC.swift
@@ -39,7 +39,7 @@
        tableView.dataSource = self
        tableView.separatorStyle = .none
        tableView.register(UINib(nibName: "StudentInfo_2_TCell", bundle: nil), forCellReuseIdentifier: "_StudentInfo_2_TCell")
//        tableView.jq_setEmptyView("暂无参赛人员")
//        tableView.jq_setEmptyView("暂无活动人员")
    }
    override func setRx() {
WanPai/Root/Activity/View/StoresInfo_2_View.swift
New file
@@ -0,0 +1,67 @@
//
//  StoresInfo_2_View.swift
//  WanPai
//
//  Created by 无故事王国 on 2023/11/8.
//
import UIKit
import JQTools
class StoresInfo_2_View: UIView,JQNibView{
    @IBOutlet weak var view_container: UIView!
    @IBOutlet weak var stack_view: UIStackView!
    private var clouse:((Bool)->Void)!
    override func awakeFromNib() {
        super.awakeFromNib()
        view_container.transform = .init(scaleX: 0.1, y: 0.1)
        alpha = 0
        layoutIfNeeded()
    }
    static func show(_ stores:[String],clouse:@escaping (Bool)->Void){
        let storesView = StoresInfo_2_View.jq_loadNibView()
        storesView.frame = sceneDelegate?.window?.frame ?? .zero
        storesView.clouse = clouse
        for store in stores {
            let label = UILabel(text: store)
            label.text = store
            label.textAlignment = .center
            label.textColor = .black.withAlphaComponent(0.7)
            label.font = UIFont.systemFont(ofSize: 14, weight: .semibold)
            storesView.stack_view.addArrangedSubview(label)
        }
//        storesView.label_content.attributedText = AttributedStringbuilder.build().add(string: stores, withFont: UIFont.systemFont(ofSize: 14, weight: .semibold), withColor: .black.withAlphaComponent(0.7), lineSpace: 4).mutableAttributedString
        sceneDelegate?.window?.addSubview(storesView)
        UIView.animate(withDuration: 0.4) {
            storesView.view_container.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
            storesView.alpha = 1
        }
    }
    @IBAction func cancelAction(_ sender: UIButton) {
        close()
    }
    @IBAction func completeAction(_ sender: UIButton) {
        close()
        clouse(true)
    }
    private func close(){
        UIView.animate(withDuration: 0.4) {
            self.view_container.transform = .init(scaleX: 0.1, y: 0.1)
            self.alpha = 0
        } completion: { _ in
            self.removeFromSuperview()
        }
    }
}
WanPai/Root/Activity/View/StoresInfo_2_View.xib
New file
@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="StoresInfo_2_View" customModule="WanPai" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="aac-V4-Eez">
                    <rect key="frame" x="14" y="348" width="365" height="181"/>
                    <subviews>
                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="参与门店" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tfj-b9-BsK">
                            <rect key="frame" x="150" y="17" width="65.333333333333314" height="22"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="22" id="XnP-sO-ijp"/>
                            </constraints>
                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                            <nil key="highlightedColor"/>
                        </label>
                        <button opaque="NO" contentMode="scaleToFill" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="VX5-ve-F9r">
                            <rect key="frame" x="27" y="121" width="145.66666666666666" height="40"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="40" id="gO6-7D-tBu"/>
                            </constraints>
                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/>
                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                            <state key="normal" title="取消">
                                <color key="titleColor" name="FE6E0D"/>
                            </state>
                            <userDefinedRuntimeAttributes>
                                <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
                                    <color key="value" name="FE6E0D"/>
                                </userDefinedRuntimeAttribute>
                                <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
                                    <real key="value" value="1"/>
                                </userDefinedRuntimeAttribute>
                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                                    <real key="value" value="20"/>
                                </userDefinedRuntimeAttribute>
                            </userDefinedRuntimeAttributes>
                            <connections>
                                <action selector="cancelAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="XNk-lZ-wOL"/>
                            </connections>
                        </button>
                        <button opaque="NO" contentMode="scaleToFill" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="69m-4Z-8zI">
                            <rect key="frame" x="192.66666666666663" y="121" width="145.33333333333337" height="40"/>
                            <color key="backgroundColor" name="FE6E0D"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="40" id="T1Y-sP-aBb"/>
                            </constraints>
                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/>
                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                            <state key="normal" title="确认支付">
                                <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            </state>
                            <userDefinedRuntimeAttributes>
                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                                    <real key="value" value="20"/>
                                </userDefinedRuntimeAttribute>
                            </userDefinedRuntimeAttributes>
                            <connections>
                                <action selector="completeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="jmF-Ip-aI2"/>
                            </connections>
                        </button>
                        <stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="13" translatesAutoresizingMaskIntoConstraints="NO" id="NfF-aM-rUk">
                            <rect key="frame" x="10" y="61" width="345" height="28"/>
                        </stackView>
                    </subviews>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    <constraints>
                        <constraint firstAttribute="trailing" secondItem="69m-4Z-8zI" secondAttribute="trailing" constant="27" id="3ZT-zf-aGe"/>
                        <constraint firstItem="69m-4Z-8zI" firstAttribute="top" secondItem="VX5-ve-F9r" secondAttribute="top" id="DKK-9w-TMk"/>
                        <constraint firstItem="NfF-aM-rUk" firstAttribute="centerX" secondItem="aac-V4-Eez" secondAttribute="centerX" id="Ecq-IU-j31"/>
                        <constraint firstItem="Tfj-b9-BsK" firstAttribute="centerX" secondItem="aac-V4-Eez" secondAttribute="centerX" id="H3g-Q4-TcJ"/>
                        <constraint firstAttribute="trailing" secondItem="NfF-aM-rUk" secondAttribute="trailing" constant="10" id="KSR-Cr-z8O"/>
                        <constraint firstItem="Tfj-b9-BsK" firstAttribute="top" secondItem="aac-V4-Eez" secondAttribute="top" constant="17" id="RBp-jQ-mqN"/>
                        <constraint firstItem="69m-4Z-8zI" firstAttribute="width" secondItem="VX5-ve-F9r" secondAttribute="width" id="S9h-Je-UsC"/>
                        <constraint firstItem="VX5-ve-F9r" firstAttribute="leading" secondItem="aac-V4-Eez" secondAttribute="leading" constant="27" id="SV9-yh-nSw"/>
                        <constraint firstItem="NfF-aM-rUk" firstAttribute="leading" secondItem="aac-V4-Eez" secondAttribute="leading" constant="10" id="Yau-zW-a49"/>
                        <constraint firstItem="VX5-ve-F9r" firstAttribute="top" secondItem="NfF-aM-rUk" secondAttribute="bottom" constant="32" id="a1l-0K-nWG"/>
                        <constraint firstItem="NfF-aM-rUk" firstAttribute="top" secondItem="Tfj-b9-BsK" secondAttribute="bottom" constant="22" id="dxS-ar-wWo"/>
                        <constraint firstAttribute="bottom" secondItem="VX5-ve-F9r" secondAttribute="bottom" constant="20" id="g8U-Wv-ZzZ"/>
                        <constraint firstItem="69m-4Z-8zI" firstAttribute="leading" secondItem="VX5-ve-F9r" secondAttribute="trailing" constant="20" id="zXI-5O-BKn"/>
                    </constraints>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                            <real key="value" value="6"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </view>
            </subviews>
            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="sRGB"/>
            <constraints>
                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="aac-V4-Eez" secondAttribute="trailing" constant="14" id="OpL-D6-qoa"/>
                <constraint firstItem="aac-V4-Eez" firstAttribute="centerY" secondItem="vUN-kp-3ea" secondAttribute="centerY" id="aUP-hp-4Ba"/>
                <constraint firstItem="aac-V4-Eez" firstAttribute="centerX" secondItem="vUN-kp-3ea" secondAttribute="centerX" id="cYh-XP-qXn"/>
                <constraint firstItem="aac-V4-Eez" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="14" id="dOa-BD-Qwr"/>
            </constraints>
            <connections>
                <outlet property="stack_view" destination="NfF-aM-rUk" id="PAx-TY-RJ6"/>
                <outlet property="view_container" destination="aac-V4-Eez" id="Ge6-hx-bTO"/>
            </connections>
            <point key="canvasLocation" x="139.69465648854961" y="20.422535211267608"/>
        </view>
    </objects>
    <resources>
        <namedColor name="FE6E0D">
            <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
        </namedColor>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
WanPai/Root/Activity/View/StudentUpdateInfoView.swift
@@ -56,8 +56,8 @@
        sceneDelegate?.window?.addSubview(storesView)
        storesView.cons_bottom.constant = 0
        storesView.tf_phone.text = model.phone
        storesView.tf_height.text = model.height.string
        storesView.tf_weight.text = model.weight.string
        storesView.tf_height.text = "\(model.height.int)"
        storesView.tf_weight.text = "\(model.weight.int)"
        UIView.animate(withDuration: 0.4) {
            storesView.alpha = 1
@@ -74,7 +74,7 @@
        guard tf_weight.text!.int != 0 else {alertError(msg: "请输入正确的体重");return}
        self.endEditing(true)
        Services.editParticipant(id: model!.id, height: tf_height.text!.int!, weight: tf_weight.text!.int!, phone: tf_phone.text,isStudent: model!.isStudent).subscribe(onNext: {data in
        Services.editParticipant(id: model!.id, height: tf_height.text!.int ?? 0, weight: tf_weight.text!.int ?? 0, phone: tf_phone.text,isStudent: model!.isStudent).subscribe(onNext: {data in
            alertSuccess(msg: "修改成功")
            DispatchQueue.main.asyncAfter(deadline: .now()+1) {
                NotificationCenter.default.post(name: StudentUpdate_Nofi, object: nil)
WanPai/Root/Activity/View/StudentUpdateInfoView.xib
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22154" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22130"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
        <capability name="Named colors" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
WanPai/Root/Course/TCell/CourseOnlineTCell.xib
@@ -41,7 +41,7 @@
                        <nil key="highlightedColor"/>
                    </label>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ipR-Qm-467">
                        <rect key="frame" x="168.33333333333337" y="39" width="153.66666666666663" height="13.333333333333336"/>
                        <rect key="frame" x="168.33333333333337" y="39" width="179.66666666666663" height="13.333333333333336"/>
                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
                        <color key="textColor" red="0.23921568627450979" green="0.24313725490196078" blue="0.27058823529411763" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="sRGB"/>
                        <nil key="highlightedColor"/>
@@ -87,7 +87,7 @@
                    <constraint firstItem="ipR-Qm-467" firstAttribute="top" secondItem="sRF-Wi-a0T" secondAttribute="bottom" constant="4" id="1Mp-Ed-ktl"/>
                    <constraint firstItem="BbO-Ve-6Ru" firstAttribute="bottom" secondItem="PxT-nX-Lp5" secondAttribute="bottom" id="AIc-He-2Mh"/>
                    <constraint firstAttribute="bottom" secondItem="FLy-JX-VOh" secondAttribute="bottom" id="Agr-CJ-fHk"/>
                    <constraint firstAttribute="trailing" secondItem="ipR-Qm-467" secondAttribute="trailing" constant="39" id="CCN-wj-dEh"/>
                    <constraint firstAttribute="trailing" secondItem="ipR-Qm-467" secondAttribute="trailing" constant="13" id="CCN-wj-dEh"/>
                    <constraint firstAttribute="trailing" secondItem="FLy-JX-VOh" secondAttribute="trailing" constant="12" id="Efd-WO-zFw"/>
                    <constraint firstItem="zTl-3I-CmB" firstAttribute="centerY" secondItem="R4u-Yo-mQ2" secondAttribute="centerY" id="GXy-UK-1E8"/>
                    <constraint firstItem="FLy-JX-VOh" firstAttribute="top" secondItem="PxT-nX-Lp5" secondAttribute="bottom" constant="13" id="H84-dZ-k9i"/>
WanPai/Root/Course/VC/AddStudentVC.swift
@@ -70,6 +70,7 @@
                img_profile.sd_setImage(with: URL(string: studentInfo!.stuHeadImg))
                studentModel.headImg = studentInfo!.stuHeadImg
                studentModel.stuId = studentInfo!.stuId
                tf_gender.text = studentModel.sex == .man ? "男":"女"
            }
        }else{
            view_profile.isHidden = true
WanPai/Root/Course/VC/CourseDetailVC.swift
@@ -191,7 +191,7 @@
        if let m = detailModel{
            let vc = CourseDetailApplyVC(detailModel: m)
            let vc = CourseDetailApplyVC(detailModel: m,isExtend: signUpCourseModel?.payStatus == 2)
           push(vc: vc)
        }
    }
WanPai/Root/Course/VC/CourseOnlineListVC.swift
@@ -61,7 +61,10 @@
                for (index,img) in imgs.enumerated(){
                    items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl))
                }
                self?.searchView.bannerView.setItems(items: items)
                self?.searchView.bannerView.setItems(items: items,selectClouse: { m in
                    let index = m.index
                    jumpPage(model: models[index].model, page: models[index].page, type: models[index].type, id: models[index].turnId)
                })
            }
        }).disposed(by: disposeBag)
WanPai/Root/Course/VC/CourseVideoDetailVC.swift
@@ -100,13 +100,13 @@
                    self?.label_introduce.text = model.synopsis
                    self?.label_studyState.isHidden = false
                    if model.studyStatus == 1{
                        self?.label_studyState.text = "已学习"
                        self?.label_studyState.backgroundColor = UIColor(hexStr: "#318C10").withAlphaComponent(0.29)
                        self?.label_studyState.textColor = UIColor(hexStr: "#318C10")
                    }else{
                        self?.label_studyState.text = "未学习"
                        self?.label_studyState.backgroundColor = UIColor(hexStr: "#FD9331").withAlphaComponent(0.29)
                        self?.label_studyState.textColor = Def_ThemeColor
                    }else{
                        self?.label_studyState.text = "已学习"
                        self?.label_studyState.backgroundColor = UIColor(hexStr: "#318C10").withAlphaComponent(0.29)
                        self?.label_studyState.textColor = UIColor(hexStr: "#318C10")
                    }
                    if let videoUrl = URL(string: model.videoURL){
@@ -149,7 +149,7 @@
            if timeDuration >= CMTimeGetSeconds((playerVC.player?.currentItem?.duration)!) && m.studyStatus == 0 {
                Services.updateVideoStatus(coursePackageId: m.coursePackageId, videoId: m.videoId).subscribe(onNext: {[weak self] data in
                    alertSuccess(msg: "已获得积分")
                    self?.exerciseVideoDetailModel?.studyStatus = 1
                    self?.exerciseVideoDetailModel?.studyStatus = 2
                    self?.label_studyState.text = "已学习"
                    self?.label_studyState.backgroundColor = UIColor(hexStr: "#318C10").withAlphaComponent(0.29)
                    self?.label_studyState.textColor = UIColor(hexStr: "#318C10")
WanPai/Root/Course/VC/StudentMentalListVC.swift
@@ -60,7 +60,7 @@
                        case .deepPlayer:
                            self?.items.append(MentalInfo(icon: UIImage(named: "icon_coupon_4"), l1: "APPOINTMENT", l2: model.medalName, level: model.levelNum, info: String(format: "再完成课后练习%@次可升级LV%ld", model.upgradeConditions,model.nextLevel), btnName: "去完成",medalType: model.medalType))
                        case .sport:
                            self?.items.append(MentalInfo(icon: UIImage(named: "icon_coupon_2"), l1: "EVENTS", l2: model.medalName, level: model.levelNum, info: String(format: "再参与赛事%@次可升级LV%ld", model.upgradeConditions,model.nextLevel), btnName: "去报名",medalType: model.medalType))
                            self?.items.append(MentalInfo(icon: UIImage(named: "icon_coupon_2"), l1: "EVENTS", l2: model.medalName, level: model.levelNum, info: String(format: "再参与活动%@次可升级LV%ld", model.upgradeConditions,model.nextLevel), btnName: "去报名",medalType: model.medalType))
                    }
                }
                self?.tableView.reloadData()
WanPai/Root/Home/VC/HomeVC.swift
@@ -30,15 +30,16 @@
    private var storeId:Int?
    private var currentLocal:CLLocation?
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let nav = navigationController as? BaseNav{
            nav.navigationController(nav, willShow: self, animated: true)
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        startLocation()
//        let vc = PaymentResultVC(result: .success, objType: .member)
//        push(vc: vc)
        Services.startCourseHome().subscribe(onNext: {[weak self] data in
            if let model = data.data{
WanPai/Root/Home/VC/JoinMemberIntroduceVC.swift
@@ -1,9 +1,9 @@
    //
    //  JoinMemberIntroduceVC.swift
    //  WanPai
    //
    //  Created by 杨锴 on 2023/6/8.
    //
//
//  JoinMemberIntroduceVC.swift
//  WanPai
//
//  Created by 杨锴 on 2023/6/8.
//
import UIKit
import QMUIKit
@@ -11,30 +11,30 @@
import JQTools
class JoinMemberIntroduceVC: BaseVC {
    @IBOutlet weak var btn_join: QMUIButton!
    @IBOutlet weak var webView: WKWebView!
    @IBOutlet weak var btn_join: QMUIButton!
    @IBOutlet weak var webView: WKWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "成为会员"
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "成为会员"
        Services.querySystemImg(type: .becomeVip).subscribe(onNext: {data in
            if let imgString = data.data{
                let html = "<img src='\(imgString)' width='\(JQ_ScreenW)' loading=eager/>"
                self.webView.loadHTMLString(html.jq_wrapHtml(), baseURL: nil)
            }
        }) { error in
        Services.querySystemImg(type: .becomeVip).subscribe(onNext: {data in
            if let imgString = data.data{
                let html = "<img src='\(imgString)' width='\(JQ_ScreenW)' loading=eager/>"
                self.webView.loadHTMLString(html.jq_wrapHtml(), baseURL: nil)
            }
        }) { error in
        }.disposed(by: disposeBag)
    }
    override func setUI() {
        btn_join.spacingBetweenImageAndTitle = 3
        btn_join.imagePosition = .left
    }
    @IBAction func joinAction(_ sender: QMUIButton) {
        }.disposed(by: disposeBag)
    }
    override func setUI() {
        btn_join.spacingBetweenImageAndTitle = 3
        btn_join.imagePosition = .left
    }
    @IBAction func joinAction(_ sender: QMUIButton) {
        var price = 0.01
#if !DEBUG
@@ -59,10 +59,10 @@
                                        if let er = error as? NetworkRequest.NetRequestError{
                                            switch er {
                                                case .Other(let code,let string):
                                                    let vc = PaymentResultVC(result: .fail(string,code), objType: .games)
                                                    let vc = PaymentResultVC(result: .fail(string,code), objType: .member)
                                                    weakSelf.push(vc: vc)
                                                default:
                                                    let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .games)
                                                    let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .member)
                                                    weakSelf.push(vc: vc)
                                            }
                                        }
WanPai/Root/Other/TCell/CouponTCell.xib
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -19,19 +19,19 @@
                <autoresizingMask key="autoresizingMask"/>
                <subviews>
                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tgl-HJ-o47">
                        <rect key="frame" x="14" y="10" width="431" height="122"/>
                        <rect key="frame" x="14" y="7.6666666666666714" width="431" height="127.00000000000001"/>
                        <subviews>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="1000" verticalHuggingPriority="251" image="icon_coupon_header" translatesAutoresizingMaskIntoConstraints="NO" id="zmS-eg-Mj0">
                                <rect key="frame" x="0.0" y="0.0" width="100" height="122"/>
                                <rect key="frame" x="0.0" y="0.0" width="100" height="127"/>
                                <constraints>
                                    <constraint firstAttribute="width" constant="100" id="Q7m-lv-Y2D"/>
                                </constraints>
                            </imageView>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_coupon_footer" translatesAutoresizingMaskIntoConstraints="NO" id="gIO-rm-Idg">
                                <rect key="frame" x="100" y="0.0" width="331" height="122"/>
                                <rect key="frame" x="100" y="0.0" width="331" height="127"/>
                            </imageView>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0元" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3QE-LO-GFM">
                                <rect key="frame" x="5" y="5" width="90" height="112"/>
                                <rect key="frame" x="5" y="5" width="90" height="117"/>
                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="24"/>
                                <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                <nil key="highlightedColor"/>
@@ -58,7 +58,7 @@
                                        <nil key="highlightedColor"/>
                                    </label>
                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="有效期至--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7mn-yy-wtX">
                                        <rect key="frame" x="0.0" y="20" width="241" height="17"/>
                                        <rect key="frame" x="0.0" y="20.000000000000007" width="241" height="17"/>
                                        <constraints>
                                            <constraint firstAttribute="height" constant="17" id="FUm-Cr-mcZ"/>
                                        </constraints>
@@ -69,7 +69,7 @@
                                </subviews>
                            </stackView>
                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uap-oQ-COV">
                                <rect key="frame" x="361" y="49.666666666666664" width="61" height="22.999999999999993"/>
                                <rect key="frame" x="361" y="52" width="61" height="23"/>
                                <constraints>
                                    <constraint firstAttribute="width" constant="61" id="E0U-vG-ym7"/>
                                    <constraint firstAttribute="height" constant="23" id="swg-VA-9gM"/>
@@ -119,8 +119,8 @@
                    </view>
                </subviews>
                <constraints>
                    <constraint firstItem="tgl-HJ-o47" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="10" id="IAF-yN-tsN"/>
                    <constraint firstAttribute="bottom" secondItem="tgl-HJ-o47" secondAttribute="bottom" constant="10" id="IHo-qw-9LQ"/>
                    <constraint firstItem="tgl-HJ-o47" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="7.5" id="IAF-yN-tsN"/>
                    <constraint firstAttribute="bottom" secondItem="tgl-HJ-o47" secondAttribute="bottom" constant="7.5" id="IHo-qw-9LQ"/>
                    <constraint firstItem="tgl-HJ-o47" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="elG-km-OZX"/>
                    <constraint firstAttribute="trailing" secondItem="tgl-HJ-o47" secondAttribute="trailing" constant="14" id="vx5-fe-yx7"/>
                </constraints>
WanPai/Root/Other/VC/PaymentResultVC.swift
@@ -148,7 +148,7 @@
            case .success:
                btn_again.setTitle("查看报名", for: .normal)
                btn_back.setTitle("返回首页", for: .normal)
                label_content.text = "报名成功,请注意赛事开始时间!"
                label_content.text = "报名成功,请注意活动开始时间!"
            case .none:break
            }
WanPai/Root/Other/View/StoresChooseView.swift
@@ -27,7 +27,8 @@
    private var storesModel = [CityProfileModel]()
    private var clouse:((CityProfileModel,CityProfileModel?,CityProfileModel)->Void)!
    private var clouse:((CityProfileModel,CityProfileModel?,CityProfileModel)->Void)?
    private var clouse2:((CityProfileModel?,CityProfileModel?,CityProfileModel?)->Void)?
    private let disposeBag = DisposeBag()
    private var defaultStoreModel:HomeStoreModel?
@@ -73,6 +74,41 @@
            storesView.getData()
        }
    }
    static func showMarket(defaultM:HomeStoreModel? = nil, clouse:@escaping (CityProfileModel?,CityProfileModel?,CityProfileModel?)->Void){
        let storesView = StoresChooseView.jq_loadNibView()
        storesView.clouse2 = clouse
        storesView.defaultStoreModel = defaultM
        storesView.frame = sceneDelegate?.window?.frame ?? .zero
        sceneDelegate?.window?.addSubview(storesView)
        if let m = defaultM{
            storesView.label_city.text = m.city.isEmpty ? "选择城市":m.city
            storesView.label_province.text = m.province.isEmpty ? "选择省份":m.province
            storesView.label_currently.text = m.name.isEmpty ? "选择门店":m.name
            if m.provinceCode != 0{
                storesView.provinceModel = CityProfileModel(id: 0, code: m.provinceCode, name: m.province)
                storesView.getData(m.provinceCode)
                storesView.getStore(nil,provinceCode: m.provinceCode)
            }
            if m.cityCode != 0{
                storesView.cityModel = CityProfileModel(id: 0, code: m.cityCode, name: m.city)
            }
            if m.storeId != 0{
                storesView.storeModel = CityProfileModel(id: m.storeId, code: 0, name: m.name)
            }
        }
        UIView.animate(withDuration: 0.4) {
            storesView.view_container.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
            storesView.alpha = 1
        }completion: { _ in
            storesView.getData()
        }
    }
    private func getData(_ provinceId:Int? = nil){
        Services.queryProvinceAndCity(pcode: provinceId).subscribe(onNext: { [weak self] data in
@@ -170,6 +206,14 @@
    }
    
    @IBAction func completeAction(_ sender: UIButton) {
        if let c = clouse2{
            c(provinceModel,cityModel,storeModel)
            close()
            return
        }
        guard provinceModel != nil else {
            alertError(msg: "请先选择省份");return
        }
WanPai/Root/Other/View/StudentChooseView.swift
@@ -171,7 +171,7 @@
            let item = actViewModel.dataSource.value[indexPath.row]
           if self.selectStudents.contains(where: {($0 as! ActivityDetailPartModel).id == item.id}){
               if self.selectStudents.count == 1{
                   alert(msg: "至少选择一位参赛运动营成员");return
                   alert(msg: "至少选择一位运动营成员");return
               }
               if let index = self.selectStudents.firstIndex(where: {($0 as! ActivityDetailPartModel).id == item.id}){
                   self.selectStudents.remove(at: index)
WanPai/Root/Search/VC/SearchVC.swift
@@ -61,14 +61,15 @@
        mapView.frame = CGRect(origin: .zero, size: view_container.size)
        for (index,v) in models.enumerated(){
            let point = MAPointAnnotation()
            let point = CustomPointAnnotation()
            point.coordinate = CLLocationCoordinate2D(latitude: v.latitude, longitude:v.longitude)
            point.title = v.storeName
            point.title = v.storeAddr
            point.index = index
            v.index = index
            v.annotation = point
        }
        let points = models.map({$0.annotation}) as! [MAPointAnnotation]
        let points = models.map({$0.annotation}) as! [CustomPointAnnotation]
        mapView.addAnnotations(points)
        mapView.showAnnotations(points, animated: true)
        mapView.selectAnnotation(points.first!, animated: true)
@@ -167,12 +168,13 @@
extension SearchVC:MAMapViewDelegate{
    func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! {
        if annotation is MAPointAnnotation{
            var pointView =  mapView.dequeueReusableAnnotationView(withIdentifier: "point")
        if annotation is CustomPointAnnotation{
            var pointView =  mapView.dequeueReusableAnnotationView(withIdentifier: "point") as? CustomPointAnnotationView
            if pointView == nil{
                pointView = MAAnnotationView(annotation: annotation, reuseIdentifier: "point")
                pointView = CustomPointAnnotationView(annotation: annotation, reuseIdentifier: "point")
            }
            pointView?.canShowCallout = true
            pointView?.label.text = "\((annotation as! CustomPointAnnotation).index + 1)"
            pointView?.image = UIImage(named: "icon_point")?.withTintColor(UIColor(hexStr: "#f54444"))
            return pointView
        }
WanPai/Root/Search/View/CustomPointAnnotationView.swift
@@ -16,13 +16,19 @@
        setUI()
    }
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    private func setUI(){
        label = UILabel(text: "123")
        label.textColor = .black
        label = UILabel(text: "")
        label.textColor = .white
        label.font = UIFont.systemFont(ofSize: 11, weight: .medium)
        addSubview(label)
        label.snp.makeConstraints { make in
            make.center.equalToSuperview()
            make.center.equalToSuperview().inset(UIEdgeInsets(top: -3, left: 0, bottom: 0, right: 0))
        }
    }
WanPai/Root/Welfare/TCell/BillInfoTCell.swift
@@ -19,7 +19,7 @@
                label_price.text = billingModel.consumeAmount.jq_formatFloat
                label_price.textColor = UIColor(hexStr: "#FD2A02")
            }else{
                label_price.text = billingModel.consumeAmount.jq_formatFloat
                label_price.text = "+" + billingModel.consumeAmount.jq_formatFloat
                label_price.textColor = UIColor(hexStr: "#2AA60B")
            }
        }
WanPai/Root/Welfare/VC/RechargeRecordVC.swift
@@ -123,6 +123,14 @@
        let model = viewModel.dataSource.value[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "_BillInfoTCell") as! BillInfoTCell
        cell.billingModel = model
        if viewModel.subType.value == .coin{
            if model.detailsType == .positive{
                cell.label_price.textColor = UIColor(hexStr: "#FD7302")
            }else{
                cell.label_price.textColor = UIColor(hexStr: "#FD2A02")
            }
        }
        return cell
    }
WanPai/Root/Welfare/VC/WelfareRedeemGoodsDetailVC.swift
@@ -217,7 +217,12 @@
//        var mpower = max(1,studentModels.count) //倍率
        if exchangeGoodsModel!.perLimit > 1{
            ChooseNumberView.show(maxNumber: exchangeGoodsModel!.perLimit) {[weak self] num in
            var n = exchangeGoodsModel!.perLimit
            if exchangeGoodsModel!.goodType == .course{
                n = floor(Double(exchangeGoodsModel!.perLimit / studentModels.count)).int
            }
            ChooseNumberView.show(maxNumber: n) {[weak self] num in
                self?.showExchangeUI(num: num)
            }
        }else{
WanPai/Root/Welfare/VC/WelfareVC.swift
@@ -211,7 +211,8 @@
extension WelfareVC:UICollectionViewDataSource{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return benefitHomeModel?.commodities.count ?? 0
        let resultCount = min(5,benefitHomeModel?.commodities.count ?? 0)
        return resultCount
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
WanPai/Root/Welfare/View/CoinStoreHeadView.swift
@@ -113,9 +113,9 @@
    }
    @IBAction func storeAction(_ sender: UIButton) {
        StoresChooseView.show { [weak self] province,city,store in
            self?.btn_store.setTitle(store.name, for: .normal)
            self?.viewModel.shopId.accept(store.id)
        StoresChooseView.showMarket { [weak self] province,city,store in
            self?.btn_store.setTitle(store?.name ?? "选择门店", for: .normal)
            self?.viewModel.shopId.accept(store?.id)
            self?.viewModel.beginRefresh()
        }
    }
WanPai/Root/Yard/VC/YardBookingDetailVC.swift
@@ -35,13 +35,18 @@
    @IBOutlet weak var label_dealtime: UILabel!
    private var timer:Timer?
    private var yardBookingModel:YardBookingModel!
    private var siteBookingId:Int?
    private var yardBookingModel:YardBookingModel?
    private var yardBookingDetailDataModel:YardBookingDetailDataModel?
    init(model:YardBookingModel) {
        super.init(nibName: nil, bundle: nil)
        self.yardBookingModel = model
    }
    init(siteBookingId:Int) {
        super.init(nibName: nil, bundle: nil)
        self.siteBookingId = siteBookingId
    }
    required init?(coder: NSCoder) {
@@ -57,17 +62,33 @@
        super.viewDidLoad()
        title = "我的预约"
        label_title.text = yardBookingModel.name
        label_address.text = String(format: "%@(%@)", yardBookingModel.storeName,yardBookingModel.storeAddress)
        label_type.text = yardBookingModel.siteTypeName
        view_yard.isHidden = yardBookingModel.siteTypeName.isEmpty
//        if let model = yardBookingModel{
//            label_title.text = model.name
//            label_address.text = String(format: "%@(%@)", model.storeName,model.storeAddress)
//            label_type.text = model.siteTypeName
//            view_yard.isHidden = model.siteTypeName.isEmpty
//        }
        getData()
    }
    private func getData(){
        Services.siteDetail(id: yardBookingModel.id).subscribe(onNext: {[weak self] data in
        var id = 0
        if yardBookingModel != nil{
            id = yardBookingModel!.id
        }else{
            id = siteBookingId!
        }
        Services.siteDetail(id: id).subscribe(onNext: {[weak self] data in
            if let model = data.data?.data{
                self?.yardBookingDetailDataModel = model
                self?.label_title.text = data.data!.siteName
                self?.label_address.text = String(format: "%@(%@)", data.data!.shopName,data.data!.shopAddress)
                self?.label_type.text = data.data!.siteType
                self?.view_yard.isHidden = data.data!.siteType.isEmpty
                self?.label_yardName.text = model.nextName
                self?.label_yardName.isHidden = model.nextName.isEmpty
                self?.label_bookingType.text = model.isHalf == 1 ? "半场":"全场"
@@ -189,10 +210,18 @@
    @IBAction func cancelAction(_ sender: UIButton) {
        var id = 0
        if yardBookingModel != nil{
            id = yardBookingModel!.id
        }else{
            id = siteBookingId!
        }
        CommonAlertView.show(title: "提示", content: "确认取消本次的预约吗?") {[weak self] status in
            if status{
                guard let weakSelf = self else { return }
                Services.cancelMySite(id: weakSelf.yardBookingModel.id).subscribe(onNext: { data in
                Services.cancelMySite(id: id).subscribe(onNext: { data in
                    weakSelf.getData()
                }) { error in
@@ -202,11 +231,19 @@
    }
    @IBAction func paymentAction(_ sender: UIButton) {
        Services.continuePaymentPrice(id: yardBookingModel.id).subscribe(onNext: {data in
        var id = 0
        if yardBookingModel != nil{
            id = yardBookingModel!.id
        }else{
            id = siteBookingId!
        }
        Services.continuePaymentPrice(id: id).subscribe(onNext: {data in
            if let model = data.data{
                PaymentView.show(money: (ali: model.cash, wx: model.cash, coin: model.playPaiCoin, course: nil,integral:nil)) { [weak self] paytype in
                    guard let weakSelf = self else { return }
                    Services.continuePayment(id: weakSelf.yardBookingModel.id, payType: paytype).subscribe(onNext: {data in
                    Services.continuePayment(id: id, payType: paytype).subscribe(onNext: {data in
                        if let m = data.data{
                            switch paytype {
                                case .aliPay:
WanPai/Root/Yard/VC/YardBookingDetailVC.xib
@@ -61,7 +61,7 @@
                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Dtc-xv-Gmh">
                                    <rect key="frame" x="282" y="15.333333333333329" width="40" height="19"/>
                                    <subviews>
                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aO5-bJ-0tv">
                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aO5-bJ-0tv">
                                            <rect key="frame" x="5" y="2" width="30" height="15"/>
                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="10"/>
                                            <color key="textColor" red="0.99215686270000003" green="0.45098039220000002" blue="0.0078431372550000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -420,6 +420,9 @@
                                </view>
                            </subviews>
                            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                            <constraints>
                                <constraint firstAttribute="bottom" secondItem="1hl-Kq-mul" secondAttribute="bottom" id="j6f-3p-P7a"/>
                            </constraints>
                            <userDefinedRuntimeAttributes>
                                <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
                                    <size key="value" width="0.0" height="2"/>
WanPai/Root/Yard/VC/YardDetailVC.swift
@@ -392,7 +392,8 @@
                                        switch result {
                                            case .success:
                                                NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                                //todo
                                                let vc = YardBookingDetailVC(siteBookingId: m.siteBooking)
                                                    weakSelf.push(vc: vc)
                                            case .cancel:
                                                alert(msg: "交易取消")
                                                let vc = YardBookingListVC(page: 5)
@@ -407,7 +408,8 @@
                                case .wechat,.integral:break
                                case .coin:
                                    NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil)
                                    //todo
                                    let vc = YardBookingDetailVC(siteBookingId: m.siteBooking)
                                    weakSelf.push(vc: vc)
                                case .courseNum:break
                            }
                        }
@@ -458,6 +460,17 @@
            UIView.animate(withDuration: 0.5) {
                self.view.layoutIfNeeded()
            }
            var halfName:String?
            var nextName:String?
            if halfIndex != nil{
                halfName = siteDetailModel.halfName[halfIndex!]
            }
            if siteDetailModel.nextName.count > 0{
                nextName = siteDetailModel.nextName[yardIndex]
            }
            vc.querySiteTimes(halfName: halfName, siteName: nextName)
        }
    }