younger_times
2023-07-17 a0071c0c7726d3e6742bc7c4c30536302766626a
完善
30个文件已修改
1004 ■■■■ 已修改文件
WanPai/Common/TCell/CommonSingleTCell.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Common/TCell/CommonSingleTCell.xib 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Config/Enums.swift 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Model/CommonModels.swift 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Network/Services.swift 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/TCell/ActivityInfoTCell.swift 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityDetailApplyVC.swift 130 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityDetailApplyVC.xib 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityDetailVC.swift 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityDetailVC.xib 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityListVC.swift 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivitySignupDetailVC.swift 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivitySignupDetailVC.xib 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivitySignupListSubVC.swift 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/VC/ActivityStudentListVC.swift 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/View/StoresInfoView.swift 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/View/StudentUpdateInfoView.swift 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Activity/View/StudentUpdateInfoView.xib 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/AddStudentVC.swift 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseDetailApplyVC.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseInfoVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/CourseVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/VC/StudentExchangeVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/View/CityChooseSubTypeView.swift 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Course/View/CityChooseSubTypeView.xib 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Home/VC/HomeVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/TCell/StudentInfo_2_TCell.swift 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/TCell/StudentInfo_2_TCell.xib 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/View/StoresChooseView.swift 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Root/Other/View/StudentChooseView.swift 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WanPai/Common/TCell/CommonSingleTCell.swift
@@ -9,6 +9,10 @@
class CommonSingleTCell: UITableViewCell {
    @IBOutlet weak var label_title: UILabel!
    @IBOutlet weak var img_select: UIImageView!
    @IBOutlet weak var view_container: UIView!
    override func awakeFromNib() {
        super.awakeFromNib()
        selectionStyle = .none
WanPai/Common/TCell/CommonSingleTCell.xib
@@ -59,6 +59,11 @@
                </constraints>
            </tableViewCellContentView>
            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
            <connections>
                <outlet property="img_select" destination="hYy-vZ-8P5" id="Fqn-ZO-5bb"/>
                <outlet property="label_title" destination="gbv-KA-MVi" id="EgY-b4-2FU"/>
                <outlet property="view_container" destination="fHS-Ci-ihh" id="ASq-WT-0GK"/>
            </connections>
            <point key="canvasLocation" x="203.0534351145038" y="41.901408450704224"/>
        </tableViewCell>
    </objects>
WanPai/Config/Enums.swift
@@ -208,4 +208,14 @@
    case over = 3
        /// 已取消
    case cancel = 4
    var rawTitle:String{
        switch self {
            case .all:return ""
            case .prepare:return "未开始"
            case .ongoing:return "进行中"
            case .over:return "已结束"
            case .cancel:return "已取消"
        }
    }
}
WanPai/Model/CommonModels.swift
@@ -99,10 +99,52 @@
    var name: String = ""
    var registerCondition:RegisterAcitivyType = .allUser
    var registerEndTime: String = ""
    var status:SignupType = .all
}
struct ActivityDetailModel:HandyJSON{
    var address: String = ""
    var age: String = ""
    ///是否报名
    var apply:Int = 0
    var city: String = ""
    var distance: Double = 0
    var endTime: String = ""
    var id: Int = 0
    var imgs: String = ""
    var introduction: String = ""
    var name: String = ""
    var participant = [ActivityDetailPartModel]()
    var payType: PayType = .aliPay
    var cashPrice: Double = 0
    var classPrice:Int = 0
    var playPaiCoin:Int = 0
    var province: String = ""
    var registerCondition:RegisterAcitivyType = .allUser
    var registerEndTime: String = ""
    var registrationNotes: String = ""
    var startTime: String = ""
    var status: SignupType = .all
    var storeAddress: String = ""
    var storeCoverDrawing: String = ""
    var storeLat: String = ""
    var storeLon: String = ""
    var storeName: String = ""
}
struct ActivityDetailPartModel:HandyJSON{
    var age = 0
    var id = 0
    var idcard = ""
    var name = ""
    var residueClassHour = 0
    var phone = ""
}
struct CityProfileModel:HandyJSON {
    var id  = 0
    var code = ""
    var name = ""
}
WanPai/Network/Services.swift
@@ -12,7 +12,7 @@
import JQTools
#if DEBUG
let All_Url = "http://192.168.110.80:5209"
let All_Url = "https://console-mock.apipost.cn/mock/b5b2dee0-5564-40ae-f082-a352d502a153"
#else
let All_Url = "http://192.168.110.80:5209"
#endif
@@ -186,7 +186,7 @@
extension Services{
        /// 获取赛事列表
    class func queryCompetitionList(cityCode:Int?,content:String?,heat:SortType?,registerCondition:Int?)->Observable<BaseResponse<[ActivityListModel]>>{
    class func queryCompetitionList(cityCode:String?,content:String?,heat:SortType?,registerCondition:Int?)->Observable<BaseResponse<[ActivityListModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/competition/base/competition/queryCompetitionList")
            .append(key: "cityCode", value: cityCode)
@@ -197,7 +197,7 @@
    }
        /// 获取赛事详情
    class func queryCompetitionDetail(id:Int)->Observable<BaseResponse<SimpleModel>>{
    class func queryCompetitionDetail(id:Int)->Observable<BaseResponse<ActivityDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/competition/base/competition/queryCompetitionInfo")
            .append(key: "id", value: id)
@@ -213,15 +213,74 @@
            .append(key: "pageNo", value: page)
            .append(key: "pageSize", value: pageSize)
            .append(key: "type", value: type.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
        /// 获取参赛人员列表
    class func queryParticipantList()->Observable<BaseResponse<[ActivityDetailPartModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/participant/queryParticipantList")
        return NetworkRequest.request(params: params, method: .post, progress: false)
    }
        /// 编辑参赛人员信息
    class func editParticipant(id:Int,height:Int,weight:Int,phone:String?)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/participant/editParticipant")
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
        ///获取所有开通城市
    class func queryAllCity()->Observable<BaseResponse<String>>{
        /// 添加参赛人员
    class func addParticipant(_ model:StudentProfileModel)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "other/base/store/queryAllCity")
            .interface(url: "competition/api/participant/addParticipant")
            .append(key: "birthday", value: model.birthday)
            .append(key: "headImg", value: model.headImg)
            .append(key: "height", value: model.height.string)
            .append(key: "idCard", value: model.idCard)
            .append(key: "name", value: model.name)
            .append(key: "phone", value: model.phone)
            .append(key: "sex", value: model.sex.rawValue)
            .append(key: "weight", value: model.weight.string)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
        /// 删除参赛人员
    class func deleParticipant(id:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/participant/delParticipant")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
        /// 赛事报名
    class func paymentCompetition(id:Int,userIds:String,payType:PayType)->Observable<BaseResponse<PaymentModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/competition/paymentCompetition")
            .append(key: "id", value: id)
            .append(key: "userIds", value: userIds)
            .append(key: "payType", value: payType.rawValue)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
        /// 查询已报名赛事详情
    class func queryMyCompetitionInfo(id:Int)->Observable<BaseResponse<ActivityDetailModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/competition/queryMyCompetitionInfo")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
        /// 取消当前报名
    class func cancelMyCOmpetition(id:Int)->Observable<BaseResponse<SimpleModel>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "competition/api/competition/cancelMyCompetition")
            .append(key: "id", value: id)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
}
    // MARK: -- 其他
@@ -258,10 +317,18 @@
        /// 获取城市code获取门店
    class func queryStoreAtCity(cityCode:String)->Observable<BaseResponse<[CityProfileModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other//base/store/queryStoreByCityCode")
            .interface(url: "/other/base/store/queryStoreByCityCode")
            .append(key: "cityCode", value: cityCode)
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
        /// 获取全部城市
    class func queryAllCity()->Observable<BaseResponse<[CityProfileModel]>>{
        let params = ParamsAppender.build(url: All_Url)
            .interface(url: "/other/base/store/queryAllCity")
        return NetworkRequest.request(params: params, method: .post, progress: true)
    }
}
extension Services{
WanPai/Root/Activity/TCell/ActivityInfoTCell.swift
@@ -25,6 +25,14 @@
                label_duetime.text = "截止报名:" + m.registerEndTime
                label_ageScope.text = m.age
                label_hot.text = "\(m.heat)"
                label_state.text = m.status.rawTitle
                switch m.status{
                    case .ongoing,.prepare:
                        label_state.backgroundColor = Def_ThemeColor
                    default:
                        label_state.backgroundColor = UIColor(hexStr: "#BABABA")
                }
            }
        }
    }
WanPai/Root/Activity/VC/ActivityDetailApplyVC.swift
@@ -7,16 +7,67 @@
import UIKit
import QMUIKit
import SDWebImage
import JQTools
class ActivityDetailApplyVC: BaseVC {
    @IBOutlet weak var img_profile: UIImageView!
    @IBOutlet weak var label_storeName: UILabel!
    @IBOutlet weak var label_title: UILabel!
    @IBOutlet weak var label_joinCondition: UILabel!
    @IBOutlet weak var label_address: UILabel!
    @IBOutlet weak var label_duetime: UILabel!
    @IBOutlet weak var label_starttime: UILabel!
    @IBOutlet weak var label_endtime: UILabel!
    @IBOutlet weak var label_ageScope: UILabel!
    @IBOutlet weak var label_city: UILabel!
    @IBOutlet weak var label_money: UILabel!
    @IBOutlet weak var label_coin: UILabel!
    @IBOutlet weak var label_courseNum: UILabel!
    @IBOutlet weak var label_introducion: UILabel!
    @IBOutlet weak var btn_enroll: UIButton!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var btn_addStudent: QMUIButton!
    @IBOutlet weak var cons_tableHei: NSLayoutConstraint!
    
    var activityDetailModel:ActivityDetailModel!
    private var students = [ActivityDetailPartModel]()
    required init(model:ActivityDetailModel) {
        super.init(nibName: nil, bundle: nil)
        self.activityDetailModel = model
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "活动详情"
        img_profile.sd_setImage(with: URL(string: activityDetailModel.storeCoverDrawing)!)
        label_storeName.text = activityDetailModel.storeName + "(\(activityDetailModel.storeAddress))"
        label_title.text = activityDetailModel.name
        label_joinCondition.text = activityDetailModel.registerCondition.strTitle
        label_address.text = activityDetailModel.address
        label_duetime.text = activityDetailModel.registerEndTime
        label_starttime.text = activityDetailModel.startTime
        label_endtime.text = activityDetailModel.endTime
        label_ageScope.text = activityDetailModel.age
        label_introducion.text = activityDetailModel.introduction
        label_city.text = activityDetailModel.province + "|" + activityDetailModel.city
        label_money.text = String(format: "%@/人", activityDetailModel.cashPrice.currency())
        label_coin.text = String(format: "%ld币/人", activityDetailModel.playPaiCoin)
        label_courseNum.text = String(format: "%ld课时/人", activityDetailModel.classPrice)
        students.append(contentsOf: activityDetailModel.participant)
        cons_tableHei.constant = Double(students.count) * 100
        tableView.reloadData()
    }
    
    override func setUI() {
@@ -28,8 +79,10 @@
    }
    
    @IBAction func addStudentAction(_ sender: QMUIButton) {
        StudentChooseView.show(itemType: .activity) { studs in
        StudentChooseView.show(itemType: .activity, defaultStu: students) { [weak self] studs in
            self?.students = studs as! [ActivityDetailPartModel]
            self?.cons_tableHei.constant = Double(self?.students.count ?? 0) * 100
            self?.tableView.reloadData()
        } needAddClouse: {[weak self] () in
            let vc = ActivityStudentListVC()
            self?.push(vc: vc)
@@ -38,20 +91,51 @@
    
    @IBAction func applyAction(_ sender: UIButton) {
        StoresInfoView.show(CourseDetailModel()) { status in
        guard students.count != 0 else {
            alertError(msg: "请至少选择一位参赛人员");return
        }
//        StoresInfoView.show(CourseDetailModel() { status in
//            if status{
//                PaymentView.show(money: (ali:1,wx:2,coin:2,course:2)) { stat in
//                    let result:PaymentResultVC.PaymentResult = status ? .success:.fail
//                    let vc = PaymentResultVC(result: result, objType: .activityApply)
//                    vc.modalPresentationStyle = .fullScreen
//                    self.present(vc, animated: true)
//                }
//            }
//        }
        StoresInfoView.show(activityDetailModel) { [weak self] status in
            guard let weakSelf = self else { return }
            let price = weakSelf.activityDetailModel.cashPrice * Double(weakSelf.activityDetailModel.participant.count)
            let coin = weakSelf.activityDetailModel.playPaiCoin * weakSelf.activityDetailModel.participant.count
            let course = weakSelf.activityDetailModel.classPrice * weakSelf.activityDetailModel.participant.count
            if status{
                PaymentView.show(money: (ali:price,wx:price,coin:coin,course:course)) { [weak self] type in
                    guard let weakSelf = self else { return }
                    let ids = weakSelf.students.map({"\($0.id)"}).joined(separator: ",")
                    Services.paymentCompetition(id: weakSelf.activityDetailModel.id, userIds: ids, payType: type).subscribe(onNext: {data in
                        if let m = data.data{
                            switch type {
                                case .aliPay:
                                    let req = YYAlipayRequest(orderString: m.orderString)
                                    YYPaymentManager.shared.sendPaymentRequest(req) { result in
                                        switch result {
                                            case .success:
                                                let vc = PaymentResultVC(result: .success, objType: .activityApply)
                                                vc.modalPresentationStyle = .fullScreen
                                                weakSelf.present(vc, animated: true)
                                            case .cancel:
                                                let vc = PaymentResultVC(result: .fail, objType: .activityApply)
                                                vc.modalPresentationStyle = .fullScreen
                                                weakSelf.present(vc, animated: true)
                                            case .failure(_):
                                                let vc = PaymentResultVC(result: .fail, objType: .activityApply)
                                                vc.modalPresentationStyle = .fullScreen
                                                weakSelf.present(vc, animated: true)
                                        }
                                    }
                                case .wechat:break
                                case .coin:break
                                case .courseNum:break
                            }
                        }
                    }).disposed(by: weakSelf.disposeBag)
                }
            }
        }
    }
}
@@ -61,13 +145,25 @@
extension ActivityDetailApplyVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let student = students[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_2_TCell") as! StudentInfo_2_TCell
        cell.indexPath = indexPath
        cell.activityDetailPartModel = student
        cell.btn_edit.isHidden = true
        cell.img_radio.isHidden = true
        cell.delClouse = {[weak self] index in
            tableView.beginUpdates()
            self?.students.remove(at: index.row)
            tableView.deleteItemsAtIndexPaths([index], animationStyle: .automatic)
            tableView.endUpdates()
            tableView.reloadData()
            self?.cons_tableHei.constant = Double(self?.students.count ?? 0) * 100
        }
        return cell
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
        return students.count
    }
}
WanPai/Root/Activity/VC/ActivityDetailApplyVC.xib
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<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">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
        <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"/>
@@ -13,7 +13,22 @@
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ActivityDetailApplyVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="btn_addStudent" destination="vFF-I7-FyB" id="mwi-Hb-JXm"/>
                <outlet property="btn_enroll" destination="V8a-fY-mQH" id="UGV-vA-sh2"/>
                <outlet property="cons_tableHei" destination="E7r-ch-NFQ" id="292-df-rws"/>
                <outlet property="img_profile" destination="8p4-kz-QQR" id="Vr2-gO-BRG"/>
                <outlet property="label_address" destination="w7l-Hs-7EQ" id="LdO-Sd-ibK"/>
                <outlet property="label_ageScope" destination="RkB-65-NBj" id="v0f-KQ-KRu"/>
                <outlet property="label_city" destination="gQe-UF-wHC" id="wu9-wX-bZd"/>
                <outlet property="label_coin" destination="D5t-1x-WAG" id="Op0-h9-O57"/>
                <outlet property="label_courseNum" destination="G8f-PQ-0Pj" id="lno-Ng-8JU"/>
                <outlet property="label_duetime" destination="yFh-cd-Oew" id="jnZ-cU-xIo"/>
                <outlet property="label_endtime" destination="WG0-AL-bqm" id="8RG-ZV-h3p"/>
                <outlet property="label_introducion" destination="zOi-jz-xW4" id="yYQ-Lg-HWl"/>
                <outlet property="label_joinCondition" destination="2Bd-9P-C67" id="WUY-Bk-NuQ"/>
                <outlet property="label_money" destination="eU8-vW-wfW" id="mZ1-dy-Jx6"/>
                <outlet property="label_starttime" destination="HVZ-gK-GRY" id="PVB-dL-Xli"/>
                <outlet property="label_storeName" destination="fFg-Kg-NdR" id="Vh6-y3-NQp"/>
                <outlet property="label_title" destination="Mnc-lb-0cc" id="1SY-Nz-XIn"/>
                <outlet property="tableView" destination="UEA-WV-jZV" id="exc-tP-CQA"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
@@ -568,7 +583,7 @@
        <image name="btn_add_1" width="16" height="16"/>
        <image name="icon_local_mini" width="11" height="16"/>
        <namedColor name="FE6E0D">
            <color red="0.99599999189376831" green="0.4309999942779541" blue="0.050999999046325684" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <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"/>
WanPai/Root/Activity/VC/ActivityDetailVC.swift
@@ -6,9 +6,65 @@
//
import UIKit
import SDWebImage
import JQTools
class ActivityDetailVC: BaseVC {
    private var id:Int!
    @IBOutlet weak var img_profile: UIImageView!
    @IBOutlet weak var label_storeName: UILabel!
    @IBOutlet weak var label_title: UILabel!
    @IBOutlet weak var label_joinCondition: UILabel!
    @IBOutlet weak var label_address: UILabel!
    @IBOutlet weak var label_duetime: UILabel!
    @IBOutlet weak var label_starttime: UILabel!
    @IBOutlet weak var label_endtime: UILabel!
    @IBOutlet weak var label_ageScope: UILabel!
    @IBOutlet weak var label_city: UILabel!
    @IBOutlet weak var label_money: UILabel!
    @IBOutlet weak var label_coin: UILabel!
    @IBOutlet weak var label_courseNum: UILabel!
    @IBOutlet weak var label_introducion: UILabel!
    @IBOutlet weak var img_enrollRequired: UIImageView!
    @IBOutlet weak var cons_imgEnrollHei: NSLayoutConstraint!
    @IBOutlet weak var btn_enroll: UIButton!
    var activityDetailModel:ActivityDetailModel!{
        didSet{
            img_profile.sd_setImage(with: URL(string: activityDetailModel.storeCoverDrawing)!)
            label_storeName.text = activityDetailModel.storeName + "(\(activityDetailModel.storeAddress))"
            label_title.text = activityDetailModel.name
            label_joinCondition.text = activityDetailModel.registerCondition.strTitle
            label_address.text = activityDetailModel.address
            label_duetime.text = activityDetailModel.registerEndTime
            label_starttime.text = activityDetailModel.startTime
            label_endtime.text = activityDetailModel.endTime
            label_ageScope.text = activityDetailModel.age
            label_introducion.text = activityDetailModel.introduction
            label_city.text = activityDetailModel.province + "|" + activityDetailModel.city
            SDWebImageDownloader.shared.downloadImage(with: URL(string: activityDetailModel.registrationNotes)!) {[weak self] image, data, error, status in
                guard let img = image else {
                    self?.cons_imgEnrollHei.constant = 0;return
                }
                let radio = img.size.width / img.size.height
                self?.cons_imgEnrollHei.constant = radio * JQ_ScreenW
            }
            label_money.text = String(format: "%@/人", activityDetailModel.cashPrice.currency())
            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
        }
    }
    required init(id:Int) {
@@ -24,13 +80,16 @@
        super.viewDidLoad()
        title = "活动详情"
        Services.queryCompetitionDetail(id: id).subscribe(onNext: {data in
        Services.queryCompetitionDetail(id: id).subscribe(onNext: {[weak self] data in
            if let data = data.data{
                self?.activityDetailModel = data
            }
        }).disposed(by: disposeBag)
    }
    @IBAction func joinAction(_ sender: UIButton) {
        let vc = ActivityDetailApplyVC()
        guard activityDetailModel.apply == 0 else {return}
        let vc = ActivityDetailApplyVC(model: activityDetailModel)
        push(vc: vc)
    }
}
WanPai/Root/Activity/VC/ActivityDetailVC.xib
@@ -12,6 +12,23 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ActivityDetailVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="btn_enroll" destination="lNv-6h-9fm" id="1jA-V7-JGL"/>
                <outlet property="cons_imgEnrollHei" destination="cJz-gp-mRM" id="VWo-7z-5pw"/>
                <outlet property="img_enrollRequired" destination="c7G-7A-ePH" id="juI-hw-hEe"/>
                <outlet property="img_profile" destination="tHB-vU-AiW" id="X08-8x-bwm"/>
                <outlet property="label_address" destination="bbY-Kb-C5z" id="WcD-uY-098"/>
                <outlet property="label_ageScope" destination="qcG-AF-9Uh" id="1hS-Wj-Jym"/>
                <outlet property="label_city" destination="NBi-eH-iIS" id="NtM-vD-ivy"/>
                <outlet property="label_coin" destination="PY6-ve-vcQ" id="odv-df-2Os"/>
                <outlet property="label_courseNum" destination="RUi-U1-Ge0" id="qHg-ZV-law"/>
                <outlet property="label_duetime" destination="nPn-v2-ONf" id="ttv-gw-KKD"/>
                <outlet property="label_endtime" destination="kah-57-uD0" id="Cd8-8B-6hA"/>
                <outlet property="label_introducion" destination="BXI-8J-fD0" id="2sv-GS-XdT"/>
                <outlet property="label_joinCondition" destination="0xj-gh-rFl" id="cSI-pz-OGJ"/>
                <outlet property="label_money" destination="Jlz-7i-loh" id="tla-wb-Edb"/>
                <outlet property="label_starttime" destination="hmj-Je-tPz" id="rA5-Ut-KQL"/>
                <outlet property="label_storeName" destination="l5e-Xg-fHb" id="wFX-gB-Ijt"/>
                <outlet property="label_title" destination="uIe-np-Pwt" id="MHn-gz-rST"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
WanPai/Root/Activity/VC/ActivityListVC.swift
@@ -12,13 +12,13 @@
class ActivityListViewModel:RefreshModel<ActivityListModel>{
    var city = BehaviorRelay<Int?>(value:nil)
    var cityCode = BehaviorRelay<String?>(value:nil)
    var content = BehaviorRelay<String>(value: "")
    var heat = BehaviorRelay<SortType?>(value:nil)
    var registerCondition = BehaviorRelay<RegisterAcitivyType?>(value:nil)
    override func api() -> (Observable<BaseResponse<[ActivityListModel]>>)? {
        return Services.queryCompetitionList(cityCode: city.value, content: content.value, heat: heat.value, registerCondition: registerCondition.value?.rawValue)
        return Services.queryCompetitionList(cityCode: cityCode.value, content: content.value, heat: heat.value, registerCondition: registerCondition.value?.rawValue)
    }
}
@@ -73,8 +73,10 @@
        guard !sender.isSelected else {return}
        hiddenMenu()
        sender.isSelected = true
        cityChooseSubTypeView = CityChooseSubTypeView.show(inView: self.view, afterView: view_top) { text in
            sender.setTitle(text, for: .normal)
        cityChooseSubTypeView = CityChooseSubTypeView.show(inView: self.view, afterView: view_top) { [weak self] m in
            sender.setTitle(m.name, for: .normal)
            self?.viewModel.cityCode.accept(m.code)
            self?.viewModel.beginRefresh()
            sender.isSelected = false
        } closeClouse: {
            sender.isSelected = false
@@ -133,6 +135,7 @@
        let model = viewModel.dataSource.value[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "_ActivityInfoTCell") as! ActivityInfoTCell
        cell.activityListModel = model
        cell.label_state.isHidden = true
        return cell
    }
    
WanPai/Root/Activity/VC/ActivitySignupDetailVC.swift
@@ -6,19 +6,140 @@
//
import UIKit
import SDWebImage
import JQTools
let CancelActivitySingup_Noti = Notification.Name.init("CancelActivitySingup_Noti")
class ActivitySignupDetailVC: BaseVC {
    private var id:Int!
    @IBOutlet weak var img_profile: UIImageView!
    @IBOutlet weak var label_storeName: UILabel!
    @IBOutlet weak var label_title: UILabel!
    @IBOutlet weak var label_joinCondition: UILabel!
    @IBOutlet weak var label_address: UILabel!
    @IBOutlet weak var label_duetime: UILabel!
    @IBOutlet weak var label_starttime: UILabel!
    @IBOutlet weak var label_endtime: UILabel!
    @IBOutlet weak var label_ageScope: UILabel!
    @IBOutlet weak var label_city: UILabel!
    @IBOutlet weak var label_money: UILabel!
    @IBOutlet weak var label_totalMoney: UILabel!
    @IBOutlet weak var label_introducion: UILabel!
    @IBOutlet weak var img_enrollRequired: UIImageView!
    @IBOutlet weak var cons_imgEnrollHei: NSLayoutConstraint!
    @IBOutlet weak var btn_cancel: UIButton!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var cons_tableHei: NSLayoutConstraint!
    var activityDetailModel:ActivityDetailModel?{
        didSet{
            guard let m = activityDetailModel else {return}
            img_profile.sd_setImage(with: URL(string: m.storeCoverDrawing)!)
            label_storeName.text = m.storeName + "(\(m.storeAddress))"
            label_title.text = m.name
            label_joinCondition.text = m.registerCondition.strTitle
            label_address.text = m.address
            label_duetime.text = m.registerEndTime
            label_starttime.text = m.startTime
            label_endtime.text = m.endTime
            label_ageScope.text = m.age
            label_introducion.text = m.introduction
            label_city.text = m.province + "|" + m.city
            SDWebImageDownloader.shared.downloadImage(with: URL(string: m.registrationNotes)!) {[weak self] image, data, error, status in
                guard let img = image else {
                    self?.cons_imgEnrollHei.constant = 0;return
                }
                let radio = img.size.width / img.size.height
                self?.cons_imgEnrollHei.constant = radio * JQ_ScreenW
            }
            if m.cashPrice != 0 {
                label_money.text =  String(format: "%@/人", m.cashPrice.currency())
                label_totalMoney.text = String(format: "合计:%@", (m.cashPrice * Double(m.participant.count)).currency())
            }
            if m.playPaiCoin != 0{
                label_money.text =  String(format: "%ld币/人", m.playPaiCoin)
                label_totalMoney.text = String(format: "合计:%ld币", (m.playPaiCoin * m.participant.count))
            }
            if m.classPrice != 0{
                label_money.text =  String(format: "%ld课时/人", m.classPrice)
                label_totalMoney.text = String(format: "合计:%ld课时", (m.classPrice * m.participant.count))
            }
            cons_tableHei.constant = Double(m.participant.count) * 100
            tableView.reloadData()
        }
    }
    required init(id: Int) {
        super.init(nibName: nil, bundle: nil)
        self.id = id
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "活动详情"
        Services.queryMyCompetitionInfo(id: id).subscribe(onNext: {data in
            self.activityDetailModel = data.data
        }).disposed(by: disposeBag)
    }
    override func setUI() {
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UINib(nibName: "StudentInfo_2_TCell", bundle: nil), forCellReuseIdentifier: "_StudentInfo_2_TCell")
    }
    @IBAction func operationAction(_ sender: UIButton) {
        CommonAlertView.show(title: "提示", content: "确认取消吗?取消后相关费用将会退还到原支付账户!") { _ in
        CommonAlertView.show(title: "提示", content: "确认取消吗?取消后相关费用将会退还到原支付账户!") { [weak self]status in
            guard let weakSelf = self else { return }
            if status{
                Services.cancelMyCOmpetition(id: weakSelf.id).subscribe(onNext: { data in
                    alertSuccess(msg: "取消成功")
                    self?.btn_cancel.isHidden = true
                    NotificationCenter.default.post(name: CancelActivitySingup_Noti, object: nil)
                }).disposed(by: weakSelf.disposeBag)
            }
        }
    }
}
extension ActivitySignupDetailVC:UITableViewDelegate{
}
extension ActivitySignupDetailVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let student = activityDetailModel!.participant[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_2_TCell") as! StudentInfo_2_TCell
        cell.indexPath = indexPath
        cell.activityDetailPartModel = student
        cell.btn_edit.isHidden = true
        cell.img_radio.isHidden = true
        cell.btn_delete.isHidden = true
        return cell
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return activityDetailModel?.participant.count ?? 0
    }
}
WanPai/Root/Activity/VC/ActivitySignupDetailVC.xib
@@ -12,6 +12,24 @@
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ActivitySignupDetailVC" customModule="WanPai" customModuleProvider="target">
            <connections>
                <outlet property="btn_cancel" destination="gsK-Ti-c0V" id="Xio-78-QS4"/>
                <outlet property="cons_imgEnrollHei" destination="mAy-Ng-8UL" id="Aer-Cm-sMm"/>
                <outlet property="cons_tableHei" destination="yGd-8d-HGD" id="OTf-Vx-aXz"/>
                <outlet property="img_enrollRequired" destination="SpQ-0k-1EN" id="cRI-V5-kV6"/>
                <outlet property="img_profile" destination="eXP-qo-kfo" id="eWb-zf-u07"/>
                <outlet property="label_address" destination="XP0-t1-ig8" id="ofm-w5-G0F"/>
                <outlet property="label_ageScope" destination="kmf-XM-osN" id="RKf-8t-nz7"/>
                <outlet property="label_city" destination="lA2-Dx-e7N" id="zB2-4f-uaC"/>
                <outlet property="label_duetime" destination="XNr-7p-cOy" id="VvG-vn-si0"/>
                <outlet property="label_endtime" destination="N3e-2J-emq" id="lXK-RK-f2C"/>
                <outlet property="label_introducion" destination="3t5-6s-rAl" id="Z8D-ed-TOC"/>
                <outlet property="label_joinCondition" destination="i4P-8X-bJm" id="9nW-J5-c1j"/>
                <outlet property="label_money" destination="VtB-Xx-cFv" id="9r8-XO-jvy"/>
                <outlet property="label_starttime" destination="JzL-bl-dVo" id="g1B-EF-6lO"/>
                <outlet property="label_storeName" destination="uoD-EG-EuC" id="uAF-6q-6Jm"/>
                <outlet property="label_title" destination="UMG-EM-0dd" id="4pY-yN-O3m"/>
                <outlet property="label_totalMoney" destination="ZUy-X0-BNd" id="Np0-sJ-5qT"/>
                <outlet property="tableView" destination="m6W-zh-Mvj" id="Trt-2g-HX6"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
@@ -21,32 +39,32 @@
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Rym-cm-VUC">
                    <rect key="frame" x="0.0" y="59" width="377" height="759"/>
                    <rect key="frame" x="0.0" y="59" width="393" height="759"/>
                    <subviews>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="u6Z-PS-k1D">
                            <rect key="frame" x="0.0" y="0.0" width="377" height="1204.6666666666667"/>
                            <rect key="frame" x="0.0" y="0.0" width="393" height="1213.6666666666667"/>
                            <subviews>
                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="eXP-qo-kfo">
                                    <rect key="frame" x="0.0" y="0.0" width="377" height="211"/>
                                    <rect key="frame" x="0.0" y="0.0" width="393" height="220"/>
                                    <color key="backgroundColor" systemColor="systemGray6Color"/>
                                    <constraints>
                                        <constraint firstAttribute="width" secondItem="eXP-qo-kfo" secondAttribute="height" multiplier="1:0.56" id="OiP-Ee-oqZ"/>
                                    </constraints>
                                </imageView>
                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="TUv-Fz-UHV">
                                    <rect key="frame" x="0.0" y="210.99999999999994" width="377" height="993.66666666666652"/>
                                    <rect key="frame" x="0.0" y="219.99999999999994" width="393" height="993.66666666666652"/>
                                    <subviews>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="edY-He-yWT">
                                            <rect key="frame" x="0.0" y="0.0" width="377" height="235"/>
                                            <rect key="frame" x="0.0" y="0.0" width="393" height="235"/>
                                            <subviews>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UMG-EM-0dd">
                                                    <rect key="frame" x="14" y="14" width="243" height="183.66666666666666"/>
                                                    <rect key="frame" x="14" y="14" width="259" height="183.66666666666666"/>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <view contentMode="scaleToFill" horizontalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="EOr-Ck-3py">
                                                    <rect key="frame" x="318" y="14" width="45" height="21"/>
                                                    <rect key="frame" x="334" y="14" width="45" height="21"/>
                                                    <subviews>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="i4P-8X-bJm">
                                                            <rect key="frame" x="7" y="0.0" width="31" height="21"/>
@@ -72,13 +90,13 @@
                                                    </constraints>
                                                </imageView>
                                                <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="uoD-EG-EuC">
                                                    <rect key="frame" x="30" y="205.66666666666669" width="342" height="14.333333333333343"/>
                                                    <rect key="frame" x="30" y="205.66666666666669" width="358" height="14.333333333333343"/>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="F8G-lx-1Z2">
                                                    <rect key="frame" x="14" y="234" width="363" height="1"/>
                                                    <rect key="frame" x="14" y="234" width="379" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="djr-SK-nlX"/>
@@ -109,10 +127,10 @@
                                            </userDefinedRuntimeAttributes>
                                        </view>
                                        <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="jgm-Kx-ReO">
                                            <rect key="frame" x="0.0" y="235" width="377" height="230"/>
                                            <rect key="frame" x="0.0" y="235" width="393" height="230"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ReX-iz-v11">
                                                    <rect key="frame" x="0.0" y="0.0" width="377" height="46"/>
                                                    <rect key="frame" x="0.0" y="0.0" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Eb-9r-932">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
@@ -153,7 +171,7 @@
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BLJ-lc-YEB">
                                                    <rect key="frame" x="0.0" y="46" width="377" height="46"/>
                                                    <rect key="frame" x="0.0" y="46" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ltj-DL-lb4">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
@@ -194,7 +212,7 @@
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GpD-dt-0jE">
                                                    <rect key="frame" x="0.0" y="92" width="377" height="46"/>
                                                    <rect key="frame" x="0.0" y="92" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="reL-36-mqI">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
@@ -235,7 +253,7 @@
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fKp-tk-BMZ">
                                                    <rect key="frame" x="0.0" y="138" width="377" height="46"/>
                                                    <rect key="frame" x="0.0" y="138" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Sp6-JJ-i7i">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
@@ -276,7 +294,7 @@
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="a9Z-e0-RVA">
                                                    <rect key="frame" x="0.0" y="184" width="377" height="46"/>
                                                    <rect key="frame" x="0.0" y="184" width="393" height="46"/>
                                                    <subviews>
                                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9pI-Ea-HrZ">
                                                            <rect key="frame" x="14" y="11" width="4" height="4"/>
@@ -305,7 +323,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="lA2-Dx-e7N">
                                                            <rect key="frame" x="351.33333333333331" y="28.333333333333368" width="11.666666666666686" height="14.333333333333332"/>
                                                            <rect key="frame" x="367.33333333333331" y="28.333333333333368" width="11.666666666666686" height="14.333333333333332"/>
                                                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
@@ -327,10 +345,10 @@
                                            </subviews>
                                        </stackView>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zJ5-21-kLx">
                                            <rect key="frame" x="0.0" y="464.99999999999994" width="377" height="149.33333333333331"/>
                                            <rect key="frame" x="0.0" y="464.99999999999994" width="393" height="149.33333333333331"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="d2i-mV-pu5">
                                                    <rect key="frame" x="13" y="0.0" width="364" height="1"/>
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="Wv2-vJ-x4Q"/>
@@ -343,7 +361,7 @@
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="m6W-zh-Mvj">
                                                    <rect key="frame" x="0.0" y="49.333333333333371" width="377" height="100"/>
                                                    <rect key="frame" x="0.0" y="49.333333333333371" width="393" height="100"/>
                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="100" id="yGd-8d-HGD"/>
@@ -364,24 +382,24 @@
                                            </constraints>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dan-qg-cLQ">
                                            <rect key="frame" x="0.0" y="614.33333333333337" width="377" height="115"/>
                                            <rect key="frame" x="0.0" y="614.33333333333337" width="393" height="115"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ELv-4d-A6p">
                                                    <rect key="frame" x="13" y="0.0" width="364" height="1"/>
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="tHh-mP-vh1"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="t3L-i0-hQf">
                                                    <rect key="frame" x="13" y="114" width="364" height="1"/>
                                                    <rect key="frame" x="13" y="114" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="bng-7M-THG"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="赛事费用" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kAL-8h-2oA">
                                                    <rect key="frame" x="14" y="15" width="349" height="64"/>
                                                    <rect key="frame" x="14" y="15" width="365" height="64"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
@@ -393,7 +411,7 @@
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="合计:¥0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZUy-X0-BNd">
                                                    <rect key="frame" x="302" y="91" width="61" height="17"/>
                                                    <rect key="frame" x="318" y="91" width="61" height="17"/>
                                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                                    <color key="textColor" red="1" green="0.14509803921568626" blue="0.14509803921568626" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <nil key="highlightedColor"/>
@@ -418,30 +436,30 @@
                                            </constraints>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5wv-LK-WEg">
                                            <rect key="frame" x="0.0" y="729.33333333333337" width="377" height="115"/>
                                            <rect key="frame" x="0.0" y="729.33333333333337" width="393" height="115"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qxw-c2-zsl">
                                                    <rect key="frame" x="13" y="0.0" width="364" height="1"/>
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="OY1-V6-dfy"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gG3-fm-qze">
                                                    <rect key="frame" x="13" y="113.99999999999989" width="364" height="1"/>
                                                    <rect key="frame" x="13" y="113.99999999999989" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="RKP-mR-awy"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="赛事简介" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ieh-s0-lkb">
                                                    <rect key="frame" x="14" y="15" width="349" height="61"/>
                                                    <rect key="frame" x="14" y="15" width="365" height="61"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3t5-6s-rAl">
                                                    <rect key="frame" x="14" y="82.999999999999886" width="349" height="17"/>
                                                    <rect key="frame" x="14" y="82.999999999999886" width="365" height="17"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                                    <color key="textColor" red="0.23921568630000001" green="0.24313725489999999" blue="0.27058823529999998" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <nil key="highlightedColor"/>
@@ -465,23 +483,23 @@
                                            </constraints>
                                        </view>
                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yFM-tU-dMy">
                                            <rect key="frame" x="0.0" y="844.33333333333326" width="377" height="149.33333333333337"/>
                                            <rect key="frame" x="0.0" y="844.33333333333326" width="393" height="149.33333333333337"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="53b-9u-D2e">
                                                    <rect key="frame" x="13" y="0.0" width="364" height="1"/>
                                                    <rect key="frame" x="13" y="0.0" width="380" height="1"/>
                                                    <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="1" id="Ngj-hn-htc"/>
                                                    </constraints>
                                                </view>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="报名须知" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qEc-jv-Bpx">
                                                    <rect key="frame" x="14" y="14.999999999999998" width="349" height="19.333333333333329"/>
                                                    <rect key="frame" x="14" y="14.999999999999998" width="365" height="19.333333333333329"/>
                                                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="SpQ-0k-1EN">
                                                    <rect key="frame" x="0.0" y="49.333333333333485" width="377" height="100"/>
                                                    <rect key="frame" x="0.0" y="49.333333333333485" width="393" height="100"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="100" id="mAy-Ng-8UL"/>
                                                    </constraints>
@@ -542,8 +560,8 @@
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstItem="Rym-cm-VUC" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="DEO-hE-CGp"/>
                <constraint firstAttribute="trailingMargin" secondItem="Rym-cm-VUC" secondAttribute="trailing" id="E0z-pn-c9M"/>
                <constraint firstItem="Rym-cm-VUC" firstAttribute="top" secondItem="fnl-2z-Ty3" secondAttribute="top" id="Esp-Un-UGk"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="Rym-cm-VUC" secondAttribute="trailing" id="Fvm-c8-sIL"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="gsK-Ti-c0V" secondAttribute="trailing" id="Rmn-g8-RNB"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="Rym-cm-VUC" secondAttribute="bottom" id="Sij-mS-gac"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="gsK-Ti-c0V" secondAttribute="bottom" id="avU-oz-rD2"/>
@@ -555,7 +573,7 @@
    <resources>
        <image name="icon_local_mini" width="11" height="16"/>
        <namedColor name="FE6E0D">
            <color red="0.99599999189376831" green="0.4309999942779541" blue="0.050999999046325684" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <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"/>
WanPai/Root/Activity/VC/ActivitySignupListSubVC.swift
@@ -53,19 +53,27 @@
            make.edges.equalToSuperview()
        }
    }
    override func setRx() {
        NotificationCenter.default.rx.notification(CancelActivitySingup_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self]noti in
            self?.viewModel.beginRefresh()
        }).disposed(by: disposeBag)
    }
}
extension ActivitySignupListSubVC:UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let model = viewModel.dataSource.value[indexPath.row]
        let vc = ActivitySignupDetailVC()
        let vc = ActivitySignupDetailVC(id: model.id)
        push(vc: vc)
    }
}
extension ActivitySignupListSubVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let model = viewModel.dataSource.value[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "_ActivityInfoTCell") as! ActivityInfoTCell
        cell.activityListModel = model
        return cell
    }
    
WanPai/Root/Activity/VC/ActivityStudentListVC.swift
@@ -7,15 +7,28 @@
import UIKit
import QMUIKit
import JQTools
import RxSwift
import RxCocoa
import HandyJSON
class ActivityStudentViewModel:RefreshModel<ActivityDetailPartModel>{
    override func api() -> (Observable<BaseResponse<[ActivityDetailPartModel]>>)? {
        return Services.queryParticipantList()
    }
}
class ActivityStudentListVC: BaseVC {
    @IBOutlet weak var btn_addStudent: QMUIButton!
    @IBOutlet weak var tableView: UITableView!
    private var viewModel = ActivityStudentViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "选择人员"
        viewModel.configure(tableView,needMore: false)
        viewModel.beginRefresh()
    }
    
    override func setUI() {
@@ -28,8 +41,14 @@
        tableView.register(UINib(nibName: "StudentInfo_2_TCell", bundle: nil), forCellReuseIdentifier: "_StudentInfo_2_TCell")
    }
    
    override func setRx() {
        NotificationCenter.default.rx.notification(StudentUpdate_Nofi).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
            self?.viewModel.beginRefresh()
        }).disposed(by: disposeBag)
    }
    @IBAction func addStudentAction(_ sender: Any) {
        let vc = AddStudentVC()
        let vc = AddStudentVC(type: .activity)
        push(vc: vc)
    }
}
@@ -41,11 +60,24 @@
extension ActivityStudentListVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_2_TCell") as! StudentInfo_2_TCell
        cell.indexPath = indexPath
        cell.img_radio.isHidden = true
        cell.activityDetailPartModel = viewModel.dataSource.value[indexPath.row]
        cell.delClouse = {index in
            CommonAlertView.show(title: "提示", content: "确认删除当前人员吗?") { [weak self] status in
                guard let weakSelf = self else { return }
                if status{
                    let m = weakSelf.viewModel.dataSource.value[index.row]
                    Services.deleParticipant(id: m.id).subscribe(onNext: { data in
                        weakSelf.viewModel.beginRefresh()
                    }).disposed(by: weakSelf.disposeBag)
                }
            }
        }
        return cell
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
        return viewModel.dataSource.value.count
    }
}
WanPai/Root/Activity/View/StoresInfoView.swift
@@ -28,7 +28,7 @@
        let storesView = StoresInfoView.jq_loadNibView()
        storesView.frame = screnDelegate?.window?.frame ?? .zero
        storesView.img_logo.sd_setImage(with: URL(string: detailModel.coverDrawing)!)
        storesView.img_logo.sd_setImage(with: URL(string: detailModel.coverDrawing))
        storesView.label_title.text = detailModel.name
        storesView.label_address.text = detailModel.storeAddress
        storesView.label_distance.text = String(format: "距你%.2lfkm", detailModel.distance)
@@ -41,6 +41,23 @@
        }
    }
    
    static func show(_ activityModel:ActivityDetailModel,clouse:@escaping (Bool)->Void){
        let storesView = StoresInfoView.jq_loadNibView()
        storesView.frame = screnDelegate?.window?.frame ?? .zero
        storesView.img_logo.sd_setImage(with: URL(string: activityModel.storeCoverDrawing))
        storesView.label_title.text = activityModel.name
        storesView.label_address.text = activityModel.storeAddress
        storesView.label_distance.text = String(format: "距你%.2lfkm", activityModel.distance)
        storesView.clouse = clouse
        screnDelegate?.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()
    }
WanPai/Root/Activity/View/StudentUpdateInfoView.swift
@@ -7,21 +7,51 @@
import UIKit
import JQTools
import QMUIKit
import RxSwift
let StudentUpdate_Nofi = Notification.Name.init("StudentUpdate_Nofi")
class StudentUpdateInfoView: UIView,JQNibView{
    @IBOutlet weak var view_container: UIView!
    @IBOutlet weak var cons_bottom: NSLayoutConstraint!
    @IBOutlet weak var tf_height: QMUITextField!
    @IBOutlet weak var tf_weight: QMUITextField!
    @IBOutlet weak var tf_phone: QMUITextField!
    private var model:ActivityDetailPartModel?
    private let disposeBag = DisposeBag()
    
    override func awakeFromNib() {
        super.awakeFromNib()
        cons_bottom.constant = -(JQ_ScreenW / 2)
        alpha = 0
        layoutIfNeeded()
        NotificationCenter.default.rx.notification(UIApplication.keyboardWillHideNotification).subscribe(onNext: {noti in
            if let userInfo = noti.userInfo{
                self.cons_bottom.constant =  0
                let duration = (userInfo["UIKeyboardAnimationDurationUserInfoKey"] as? Double) ?? 0
                UIView.animate(withDuration: duration) {
                    self.layoutIfNeeded()
                }
            }
        }).disposed(by: disposeBag)
        NotificationCenter.default.rx.notification(UIApplication.keyboardWillShowNotification).subscribe(onNext: { noti in
            if let userInfo = noti.userInfo{
                self.cons_bottom.constant =  (userInfo["UIKeyboardFrameEndUserInfoKey"] as? CGRect)?.height ?? 0
                let duration = (userInfo["UIKeyboardAnimationDurationUserInfoKey"] as? Double) ?? 0
                UIView.animate(withDuration: duration) {
                    self.layoutIfNeeded()
                }
            }
        }).disposed(by: disposeBag)
    }
    
    static func show(){
    static func show(_ model:ActivityDetailPartModel){
        let storesView = StudentUpdateInfoView.jq_loadNibView()
        storesView.model = model
        storesView.frame = screnDelegate?.window?.frame ?? .zero
        screnDelegate?.window?.addSubview(storesView)
        storesView.cons_bottom.constant = 0
@@ -32,6 +62,30 @@
        }
    }
    
    @IBAction func saveAction(_ sender: UIButton) {
        guard !tf_height.text!.isEmpty else {alertError(msg: "请输入身高");return}
        guard !tf_weight.text!.isEmpty else {alertError(msg: "请输入体重");return}
        guard tf_height.text!.int != 0 else {alertError(msg: "请输入正确的身高");return}
        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).subscribe(onNext: {data in
            alertSuccess(msg: "修改成功")
            DispatchQueue.main.asyncAfter(deadline: .now()+1) {
                NotificationCenter.default.post(name: StudentUpdate_Nofi, object: nil)
                self.close()
            }
        }).disposed(by: disposeBag)
    }
    @IBAction func closeAction(_ sender: UIButton) {
        close()
    }
    private func close(){
        self.cons_bottom.constant = -(JQ_ScreenW / 2)
        UIView.animate(withDuration: 0.4) {
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="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<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">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
        <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"/>
@@ -193,6 +193,9 @@
                                    <real key="value" value="1"/>
                                </userDefinedRuntimeAttribute>
                            </userDefinedRuntimeAttributes>
                            <connections>
                                <action selector="closeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="vFi-xq-qyL"/>
                            </connections>
                        </button>
                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Pdv-hP-j5u">
                            <rect key="frame" x="207" y="192.33333333333337" width="146" height="40"/>
@@ -210,6 +213,9 @@
                                    <real key="value" value="20"/>
                                </userDefinedRuntimeAttribute>
                            </userDefinedRuntimeAttributes>
                            <connections>
                                <action selector="saveAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="VMo-41-mds"/>
                            </connections>
                        </button>
                    </subviews>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
@@ -226,15 +232,29 @@
                        <constraint firstAttribute="trailing" secondItem="V13-39-Dea" secondAttribute="trailing" id="pI5-DU-DUG"/>
                    </constraints>
                </view>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZAh-4X-KgY">
                    <rect key="frame" x="0.0" y="0.0" width="393" height="560.66666666666663"/>
                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                    <connections>
                        <action selector="closeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="HHa-Qh-d4t"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
            <constraints>
                <constraint firstItem="ZAh-4X-KgY" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="3hB-2M-dCz"/>
                <constraint firstAttribute="trailing" secondItem="ZAh-4X-KgY" secondAttribute="trailing" id="H19-1B-OUy"/>
                <constraint firstItem="ZAh-4X-KgY" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="SgX-gc-8zU"/>
                <constraint firstAttribute="bottom" secondItem="FQP-Da-djy" secondAttribute="bottom" id="Xfr-Bp-8jB"/>
                <constraint firstItem="FQP-Da-djy" firstAttribute="top" secondItem="ZAh-4X-KgY" secondAttribute="bottom" id="Zk1-2K-JHo"/>
                <constraint firstItem="FQP-Da-djy" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="c0g-Sn-Fvg"/>
                <constraint firstAttribute="trailing" secondItem="FQP-Da-djy" secondAttribute="trailing" id="pRf-XY-SYk"/>
            </constraints>
            <connections>
                <outlet property="cons_bottom" destination="Xfr-Bp-8jB" id="IZH-JX-BFj"/>
                <outlet property="tf_height" destination="Zec-I5-pJT" id="48c-gi-8K9"/>
                <outlet property="tf_phone" destination="Cui-v0-oxz" id="Twv-bl-sNA"/>
                <outlet property="tf_weight" destination="U4X-od-m4c" id="3R1-09-4pq"/>
                <outlet property="view_container" destination="FQP-Da-djy" id="v8l-GZ-ns8"/>
            </connections>
            <point key="canvasLocation" x="-10" y="21"/>
@@ -243,7 +263,7 @@
    <resources>
        <image name="icon_item_p" width="12" height="12"/>
        <namedColor name="FE6E0D">
            <color red="0.99599999189376831" green="0.4309999942779541" blue="0.050999999046325684" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <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"/>
WanPai/Root/Course/VC/AddStudentVC.swift
@@ -24,11 +24,26 @@
    var studentModel = StudentProfileModel()
    var type:ItemType!
    var verifyIdCard:Bool = false
    init(type:ItemType) {
        super.init(nibName: nil, bundle: nil)
        self.type = type
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if type == .course{
        title = "添加学员"
        }else{
            title = "添加人员"
        }
        
        let idCardView = IDCardView()
        idCardView.box.bind { text in
@@ -80,8 +95,8 @@
        studentModel.name = tf_name.text!
        studentModel.height = tf_height.text!.toDouble
        studentModel.weight = tf_weight.text!.toDouble
        studentModel.phone = tf_phone.text
        studentModel.idCard = tf_idCard.text
        studentModel.phone = tf_phone.text!
        studentModel.idCard = tf_idCard.text!
        studentModel.name = tf_name.text!
        if studentModel.headImg.isEmpty{
@@ -101,6 +116,8 @@
    }
    private func addStudent(){
        if type == .course{
        Services.addStudent(studentModel).subscribe(onNext: { [weak self] data in
            guard let weakSelf = self else { return }
            alertSuccess(msg: "添加成功")
@@ -108,6 +125,16 @@
                weakSelf.navigationController?.popViewController()
            }
        }).disposed(by: disposeBag)
        }else{
            Services.addParticipant(studentModel).subscribe(onNext: {[weak self] data in
                guard let weakSelf = self else { return }
                alertSuccess(msg: "添加成功")
                DispatchQueue.main.asyncAfter(deadline: .now()+1) {
                    weakSelf.navigationController?.popViewController()
                    NotificationCenter.default.post(name: StudentUpdate_Nofi, object: nil)
                }
            }).disposed(by: disposeBag)
        }
    }
    deinit{
WanPai/Root/Course/VC/CourseDetailApplyVC.swift
@@ -108,12 +108,12 @@
    @IBAction func studentAction(_ sender: QMUIButton) {
        StudentChooseView.show(itemType: .course, defaultStu: studentModels) { [weak self] studs in
            guard let weakSelf = self else { return }
            weakSelf.studentModels = studs
            weakSelf.studentModels = studs as! [CourseDetailStudentModel]
            weakSelf.tableView.reloadData()
            weakSelf.cons_tableHei.constant = CGFloat((weakSelf.studentModels.count) * 87)
            weakSelf.changePrice(weakSelf.selectClassIndex)
        } needAddClouse: { [weak self] () in
            let vc = AddStudentVC()
            let vc = AddStudentVC(type: .course)
            self?.push(vc: vc)
        }
    }
WanPai/Root/Course/VC/CourseInfoVC.swift
@@ -164,7 +164,7 @@
    }
    @objc func addStudentAction() {
        let vc = AddStudentVC()
        let vc = AddStudentVC(type: .course)
        push(vc: vc)
    }
WanPai/Root/Course/VC/CourseVC.swift
@@ -34,7 +34,7 @@
    @IBAction func addStudentAction(_ sender: QMUIButton) {
         let addstudentVC = AddStudentVC()
        let addstudentVC = AddStudentVC(type: .course)
        push(vc: addstudentVC)
    }
}
WanPai/Root/Course/VC/StudentExchangeVC.swift
@@ -24,7 +24,7 @@
    }
    @IBAction func addStudentAction(_ sender: UIButton) {
        let studentVC = AddStudentVC()
        let studentVC = AddStudentVC(type: .course)
        push(vc: studentVC)
    }
}
WanPai/Root/Course/View/CityChooseSubTypeView.swift
@@ -7,23 +7,48 @@
import UIKit
import JQTools
import RxSwift
class CityChooseSubTypeView: UIView,JQNibView{
    @IBOutlet weak var cons_viewHeight: NSLayoutConstraint!
    @IBOutlet weak var label_city: UILabel!
    @IBOutlet weak var tableView: UITableView!
    private var closeClouse:(()->Void)?
    private var clouse:((String)->Void)?
    private var clouse:((CityProfileModel)->Void)?
    private var disposeBag = DisposeBag()
    private var datas = [CityProfileModel]()
    private var dataDict = Dictionary<String,[CityProfileModel]>()
    private var keys = [String]()
    
    override func awakeFromNib() {
        super.awakeFromNib()
        cons_viewHeight.constant = 100
        alpha = 0
        layoutIfNeeded()
        tableView.delegate = self
        tableView.dataSource = self
        tableView.sectionIndexColor = Def_ThemeColor
        tableView.register(UINib(nibName: "CommonSingleTCell", bundle: nil), forCellReuseIdentifier: "_CommonSingleTCell")
        startLocation()
        Services.queryAllCity().subscribe(onNext: {[weak self] data in
            if let models = data.data{
                self?.datas = models
                for v in models{
                    if let py = v.name.jq_getPinyin().first?.uppercased(){
                        if self?.dataDict[py] == nil{
                            self?.dataDict[py] = [CityProfileModel]()
                        }
                        self?.dataDict[py]?.append(v)
                    }
                }
                self?.keys = self?.dataDict.keys.sorted() ?? []
                self?.tableView.reloadData()
            }
        }).disposed(by: disposeBag)
    }
    @discardableResult
    static func show(inView:UIView,afterView:UIView,clouse:@escaping (String)->Void,closeClouse:@escaping ()->Void)->CityChooseSubTypeView{
    static func show(inView:UIView,afterView:UIView,clouse:@escaping (CityProfileModel)->Void,closeClouse:@escaping ()->Void)->CityChooseSubTypeView{
        let subTypeView = CityChooseSubTypeView.jq_loadNibView()
        subTypeView.closeClouse = closeClouse
        subTypeView.clouse = clouse
@@ -71,3 +96,64 @@
        startLocation()
    }
}
extension CityChooseSubTypeView:UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let key = keys[indexPath.section]
        let model = dataDict[key]![indexPath.row]
        clouse!(model)
        self.cons_viewHeight.constant = 100
        UIView.animate(withDuration: 0.2) {
            self.alpha = 0
            self.layoutIfNeeded()
        } completion: { _ in
            self.removeFromSuperview()
        }
    }
}
extension CityChooseSubTypeView:UITableViewDataSource{
    func sectionIndexTitles(for tableView: UITableView) -> [String]? {
        return keys
    }
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return keys[section]
    }
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 35
    }
    func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
        return index
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 46
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "_CommonSingleTCell") as! CommonSingleTCell
        if let model = dataDict[keys[indexPath.section]]?[indexPath.row]{
            cell.label_title.text = model.name
        }
        cell.img_select.isHidden = true
        cell.view_container.borderColor = .clear
        cell.view_container.backgroundColor = .white
        return cell
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return keys.count
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataDict[keys[section]]?.count ?? 0
    }
}
WanPai/Root/Course/View/CityChooseSubTypeView.xib
@@ -83,6 +83,7 @@
            <connections>
                <outlet property="cons_viewHeight" destination="eEu-f9-Ced" id="DiD-Kz-VSh"/>
                <outlet property="label_city" destination="VXl-8W-S4W" id="75K-gD-yyi"/>
                <outlet property="tableView" destination="TJg-Td-Jbc" id="E6T-Z5-jHa"/>
            </connections>
            <point key="canvasLocation" x="72" y="21"/>
        </view>
WanPai/Root/Home/VC/HomeVC.swift
@@ -139,7 +139,7 @@
    
    @IBAction func chooseStoresAction(_ sender: TapBtn) {
        StoresChooseView.show { [weak self] storeId in
            self?.viewModel.storeId.accept(storeId.int!)
            self?.viewModel.storeId.accept(storeId)
            self?.viewModel.beginRefresh()
        }
    }
WanPai/Root/Other/TCell/StudentInfo_2_TCell.swift
@@ -13,6 +13,24 @@
    @IBOutlet weak var btn_delete: UIButton!
    @IBOutlet weak var btn_edit: UIButton!
    
    @IBOutlet weak var label_name: UILabel!
    @IBOutlet weak var label_idCard: UILabel!
    @IBOutlet weak var label_age: UILabel!
    @IBOutlet weak var label_phone: UILabel!
    var indexPath:IndexPath?
    var delClouse:((IndexPath)->Void)?
//    var editClouse:((IndexPath)->Void)?
    var activityDetailPartModel:ActivityDetailPartModel!{
        didSet{
            label_name.text = activityDetailPartModel.name
            label_idCard.text = activityDetailPartModel.idcard
            label_age.text = "\(activityDetailPartModel.age)岁"
            label_phone.text = activityDetailPartModel.phone
        }
    }
    
    var isChoose:Bool!{
        didSet{
@@ -28,8 +46,13 @@
    }
    
    @IBAction func editAction(_ sender: UIButton) {
        StudentUpdateInfoView.show()
        StudentUpdateInfoView.show(activityDetailPartModel)
    }
    
    
    @IBAction func delAction(_ sender: UIButton) {
        if let index = indexPath{
            delClouse?(index)
        }
    }
}
WanPai/Root/Other/TCell/StudentInfo_2_TCell.xib
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<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">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
@@ -69,6 +69,9 @@
                                <rect key="frame" x="320" y="12" width="16" height="22"/>
                                <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                <state key="normal" image="btn_delete"/>
                                <connections>
                                    <action selector="delAction:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="azx-Ts-rCx"/>
                                </connections>
                            </button>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="联系电话:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yyi-BO-9d9">
                                <rect key="frame" x="114" y="44" width="71.666666666666686" height="20"/>
@@ -149,6 +152,10 @@
                <outlet property="btn_delete" destination="uRT-PP-Jry" id="oVl-2n-p1K"/>
                <outlet property="btn_edit" destination="FQi-mi-aCF" id="Utm-lZ-OLO"/>
                <outlet property="img_radio" destination="lvC-v3-2oB" id="8h7-kF-JB2"/>
                <outlet property="label_age" destination="U15-qH-Kc3" id="1Dv-0w-hQ8"/>
                <outlet property="label_idCard" destination="YtF-LX-bzG" id="tut-IZ-HEr"/>
                <outlet property="label_name" destination="iDi-s9-qiA" id="XNd-oN-2fI"/>
                <outlet property="label_phone" destination="eQZ-Ha-dGW" id="OjX-8Q-n5g"/>
            </connections>
            <point key="canvasLocation" x="79.389312977099237" y="41.549295774647888"/>
        </tableViewCell>
WanPai/Root/Other/View/StoresChooseView.swift
@@ -26,7 +26,7 @@
    private var storesModel = [CityProfileModel]()
    private var clouse:((String)->Void)!
    private var clouse:((Int)->Void)!
    private let disposeBag = DisposeBag()
    
    override func awakeFromNib() {
@@ -36,7 +36,7 @@
        layoutIfNeeded()
    }
    
    static func show(_ clouse:@escaping (String)->Void){
    static func show(_ clouse:@escaping (Int)->Void){
        let storesView = StoresChooseView.jq_loadNibView()
        storesView.clouse = clouse
        storesView.frame = screnDelegate?.window?.frame ?? .zero
@@ -132,7 +132,7 @@
        }
        close()
        clouse?(storeModel!.code)
        clouse?(storeModel!.id)
    }
    
}
WanPai/Root/Other/View/StudentChooseView.swift
@@ -10,11 +10,19 @@
import QMUIKit
import RxSwift
import RxCocoa
import HandyJSON
class StudentViewModel:RefreshModel<CourseDetailStudentModel>{
    override func api() -> (Observable<BaseResponse<[CourseDetailStudentModel]>>)? {
        return Services.queryStudentList()
    }
}
class ActivityViewModel:RefreshModel<ActivityDetailPartModel>{
    override func api() -> (Observable<BaseResponse<[ActivityDetailPartModel]>>)? {
        return Services.queryParticipantList()
    }
}
class StudentChooseView: UIView,JQNibView{
@@ -24,11 +32,19 @@
    @IBOutlet weak var cons_bottom: NSLayoutConstraint!
    @IBOutlet weak var btn_add: QMUIButton!
    
    private var clickClouse:(([CourseDetailStudentModel])->Void)!
    private var clickClouse:(([Any])->Void)!
    private var needAddClouse:(()->Void)!
    private var itemType:ItemType!
    private var selectStudents = [CourseDetailStudentModel]()
    private var viewModel = StudentViewModel()
    private var selectStudents = [Any]()
    private lazy var stuViewModel:StudentViewModel = {
        return StudentViewModel()
    }()
    private lazy var actViewModel:ActivityViewModel = {
        return ActivityViewModel()
    }()
    
    override func awakeFromNib() {
        super.awakeFromNib()
@@ -40,13 +56,9 @@
        tableView.separatorStyle = .none
        alpha = 0
        layoutIfNeeded()
        viewModel.configure(tableView,needMore: false)
        viewModel.beginRefresh()
    }
    
    static func show(itemType:ItemType,defaultStu:[CourseDetailStudentModel]? = nil,clickClouse:@escaping ([CourseDetailStudentModel])->Void,needAddClouse:@escaping ()->Void){
    static func show(itemType:ItemType,defaultStu:[Any]? = nil,clickClouse:@escaping ([Any])->Void,needAddClouse:@escaping ()->Void){
        let studentChooseView = StudentChooseView.jq_loadNibView()
        if defaultStu != nil{
            studentChooseView.selectStudents = defaultStu!
@@ -62,8 +74,15 @@
        studentChooseView.clickClouse = clickClouse
        studentChooseView.needAddClouse = needAddClouse
        screnDelegate?.window?.addSubview(studentChooseView)
        studentChooseView.cons_bottom.constant = 0
        if itemType == .course{
            studentChooseView.stuViewModel.configure(studentChooseView.tableView,needMore: false)
            studentChooseView.stuViewModel.beginRefresh()
        }else{
            studentChooseView.actViewModel.configure(studentChooseView.tableView,needMore: false)
            studentChooseView.actViewModel.beginRefresh()
        }
        
        UIView.animate(withDuration: 0.4) {
            studentChooseView.alpha = 1
@@ -108,8 +127,9 @@
extension StudentChooseView:UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         let item = viewModel.dataSource.value[indexPath.row]
        if self.selectStudents.contains(where: {$0.id == item.id}){
        if itemType == .course{
            let item = stuViewModel.dataSource.value[indexPath.row]
           if self.selectStudents.contains(where: {($0 as! CourseDetailStudentModel).id == item.id}){
            if self.selectStudents.count == 1{
                alert(msg: "至少选择一位学员");return
            }
@@ -117,21 +137,36 @@
        }else{
            self.selectStudents.append(item)
        }
        }else{
            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
               }
               self.selectStudents.remove(at: indexPath.row)
           }else{
               self.selectStudents.append(item)
           }
        }
        tableView.reloadData()
    }
}
extension StudentChooseView:UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.dataSource.value.count
        if itemType == .course{
            return stuViewModel.dataSource.value.count
        }else{
            return actViewModel.dataSource.value.count
        }
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        if itemType == .course{
            let item = viewModel.dataSource.value[indexPath.row]
            let item = stuViewModel.dataSource.value[indexPath.row]
            let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfoTCell") as! StudentInfoTCell
            if selectStudents.contains(where: {$0.id == item.id}){
            if self.selectStudents.contains(where: {($0 as! CourseDetailStudentModel).id == item.id}){
                cell.btn_handle.setImage(UIImage(named: "btn_choose_s"), for: .normal)
            }else{
                cell.btn_handle.setImage(nil, for: .normal)
@@ -139,7 +174,16 @@
            cell.studentModel = item
            return cell
        }else if itemType == .activity{
            let item = actViewModel.dataSource.value[indexPath.row]
            let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_2_TCell") as! StudentInfo_2_TCell
            cell.btn_delete.isHidden = true
            cell.btn_edit.isHidden = true
            cell.activityDetailPartModel = item
            if self.selectStudents.contains(where: {($0 as! ActivityDetailPartModel).id == item.id}){
                cell.img_radio.image = UIImage(named: "btn_choose_s")
            }else{
                cell.img_radio.image = UIImage(named: "")
            }
            return cell
        }