WanPai/Assets.xcassets/Btns/btn_add_large_2.imageset/Contents.json
New file @@ -0,0 +1,22 @@ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "filename" : "btn_add_large_2@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "btn_add_large_2@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } WanPai/Assets.xcassets/Btns/btn_add_large_2.imageset/btn_add_large_2@2x.png
WanPai/Assets.xcassets/Btns/btn_add_large_2.imageset/btn_add_large_2@3x.png
WanPai/Common/VC/CommonWebVC.swift
@@ -16,9 +16,9 @@ @IBOutlet weak var webView: WKWebView! @IBOutlet weak var cons_webHeight: NSLayoutConstraint! @IBOutlet weak var view_btns: UIView! private var needBackBtn:Bool? private var needBackBtn:Bool! init(type:AgreentType,customTitle:String? = nil,content:String? = nil,needBackBtn:Bool? = nil) { init(type:AgreentType,customTitle:String? = nil,content:String? = nil,needBackBtn:Bool = false) { super.init(nibName: nil, bundle: nil) self.type = type self.content = content @@ -102,6 +102,8 @@ view_btns.isHidden = false if needBackBtn == false{ navigationItem.leftBarButtonItem = UIBarButtonItem() }else{ view_btns.isHidden = true } default: view_btns.isHidden = true WanPai/Common/View/QRPreview.swift
@@ -10,42 +10,53 @@ class QRPreview: UIView,JQNibView{ @IBOutlet weak var img_QRCode: UIImageView! @IBOutlet weak var btn_close: UIButton! override func awakeFromNib() { super.awakeFromNib() alpha = 0 img_QRCode.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) btn_close.alpha = 0 layoutIfNeeded() } @IBOutlet weak var img_QRCode: UIImageView! @IBOutlet weak var btn_close: UIButton! @IBOutlet weak var label_title: UILabel! override func awakeFromNib() { super.awakeFromNib() alpha = 0 label_title.isHidden = true img_QRCode.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) btn_close.alpha = 0 layoutIfNeeded() } static func show(_ text:String){ let preView = QRPreview.jq_loadNibView() preView.frame = sceneDelegate?.window?.frame ?? .zero preView.img_QRCode.image = QRCodeImage(string: text, size: (JQ_ScreenW - 88) * sceneDelegate!.window!.screen.scale) sceneDelegate?.window?.addSubview(preView) static func show(_ text:String,title:String? = nil){ let preView = QRPreview.jq_loadNibView() preView.frame = sceneDelegate?.window?.frame ?? .zero preView.img_QRCode.image = QRCodeImage(string: text, size: (JQ_ScreenW - 88) * sceneDelegate!.window!.screen.scale) preView.label_title.text = title UIView.animate(withDuration: 0.5) { preView.alpha = 1 preView.img_QRCode.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) preView.layoutIfNeeded() } completion: { complete in if complete{ preView.btn_close.alpha = 1 preView.layoutIfNeeded() } } } @IBAction func closeAction(_ sender: UIButton) { UIView.animate(withDuration: 0.5) { self.alpha = 0 self.img_QRCode.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) self.btn_close.alpha = 0 } completion: { _ in self.removeFromSuperview() } } sceneDelegate?.window?.addSubview(preView) UIView.animate(withDuration: 0.5) { preView.alpha = 1 if title == nil{ preView.label_title.isHidden = true preView.img_QRCode.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) }else{ preView.label_title.isHidden = false preView.img_QRCode.transform = CGAffineTransform(scaleX: 0.9, y: 0.9) } preView.layoutIfNeeded() } completion: { complete in if complete{ preView.btn_close.alpha = 1 preView.layoutIfNeeded() } } } @IBAction func closeAction(_ sender: UIButton) { UIView.animate(withDuration: 0.5) { self.alpha = 0 self.img_QRCode.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) self.btn_close.alpha = 0 } completion: { _ in self.removeFromSuperview() } } } WanPai/Common/View/QRPreview.xib
@@ -4,6 +4,7 @@ <dependencies> <deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/> <capability name="System colors in document resources" minToolsVersion="11.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <objects> @@ -13,19 +14,39 @@ <rect key="frame" x="0.0" y="0.0" width="393" height="852"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="6HX-Cl-1DV"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TVQ-se-KCE"> <rect key="frame" x="44" y="273.66666666666669" width="305" height="305.00000000000006"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <subviews> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="omp-OX-ywi"> <rect key="frame" x="0.0" y="0.0" width="305" height="305"/> <subviews> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ezD-1O-ihZ"> <rect key="frame" x="0.0" y="0.0" width="305" height="46"/> <constraints> <constraint firstAttribute="height" constant="46" id="4Ei-5X-kUi"/> </constraints> <fontDescription key="fontDescription" type="system" weight="medium" pointSize="21"/> <nil key="textColor"/> <nil key="highlightedColor"/> </label> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="6HX-Cl-1DV"> <rect key="frame" x="0.0" y="46" width="305" height="259"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> </imageView> </subviews> </stackView> </subviews> <color key="backgroundColor" systemColor="systemBackgroundColor"/> <constraints> <constraint firstAttribute="width" secondItem="6HX-Cl-1DV" secondAttribute="height" multiplier="1:1" id="qZS-VY-glI"/> <constraint firstItem="omp-OX-ywi" firstAttribute="leading" secondItem="TVQ-se-KCE" secondAttribute="leading" id="MQf-so-2YR"/> <constraint firstAttribute="width" secondItem="TVQ-se-KCE" secondAttribute="height" multiplier="1:1" id="eEW-WY-qk5"/> <constraint firstAttribute="trailing" secondItem="omp-OX-ywi" secondAttribute="trailing" id="sum-wH-Hz6"/> <constraint firstItem="omp-OX-ywi" firstAttribute="top" secondItem="TVQ-se-KCE" secondAttribute="top" id="wi4-8G-1DX"/> <constraint firstAttribute="bottom" secondItem="omp-OX-ywi" secondAttribute="bottom" id="z5X-IE-asj"/> </constraints> </imageView> </view> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Uua-ww-qMC"> <rect key="frame" x="175.66666666666666" y="619.66666666666663" width="42" height="42"/> <constraints> <constraint firstAttribute="width" constant="42" id="VB4-al-dnO"/> <constraint firstAttribute="height" constant="42" id="fYE-6n-Jdz"/> </constraints> <rect key="frame" x="175.66666666666666" y="619.66666666666663" width="42" height="43"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> <state key="normal" image="btn_close_1"/> <connections> @@ -35,21 +56,25 @@ </subviews> <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.90000000000000002" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="trailing" secondItem="6HX-Cl-1DV" secondAttribute="trailing" constant="44" id="97i-gB-Zk8"/> <constraint firstItem="Uua-ww-qMC" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Hsf-NB-MIA"/> <constraint firstItem="6HX-Cl-1DV" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="44" id="KmT-Q0-pyD"/> <constraint firstItem="6HX-Cl-1DV" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="UGF-9N-bzH"/> <constraint firstItem="Uua-ww-qMC" firstAttribute="top" secondItem="6HX-Cl-1DV" secondAttribute="bottom" constant="41" id="fgE-fX-MS9"/> <constraint firstItem="6HX-Cl-1DV" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="uEH-Zs-7cc"/> <constraint firstItem="Uua-ww-qMC" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="06a-BT-uko"/> <constraint firstItem="TVQ-se-KCE" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="LOt-mN-q8V"/> <constraint firstItem="TVQ-se-KCE" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="iu0-Vj-rEP"/> <constraint firstItem="Uua-ww-qMC" firstAttribute="top" secondItem="TVQ-se-KCE" secondAttribute="bottom" constant="41" id="k8O-8x-dRQ"/> <constraint firstItem="TVQ-se-KCE" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="44" id="odi-8W-l92"/> <constraint firstAttribute="trailing" secondItem="TVQ-se-KCE" secondAttribute="trailing" constant="44" id="s3J-kY-3ER"/> </constraints> <connections> <outlet property="btn_close" destination="Uua-ww-qMC" id="0hz-tc-D5t"/> <outlet property="img_QRCode" destination="6HX-Cl-1DV" id="3vh-6u-afq"/> <outlet property="label_title" destination="ezD-1O-ihZ" id="GcM-gS-NdK"/> </connections> <point key="canvasLocation" x="54" y="21"/> </view> </objects> <resources> <image name="btn_close_1" width="42" height="43"/> <systemColor name="systemBackgroundColor"> <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> </systemColor> </resources> </document> WanPai/Config/Enums.swift
@@ -46,6 +46,7 @@ enum ItemType{ case course case activity case worldCup } /// 获取短信验证码类型 WanPai/Model/CommonModels.swift
@@ -169,6 +169,15 @@ var orderString = "" var returnId = 0 var siteBooking:Int = 0 var appid = "" var noncestr = "" var package = "" var partnerid = "" var prepayid = "" var sign = "" var timestamp:TimeInterval = 0 } struct StoreWalfareModel:HandyJSON{ @@ -244,6 +253,7 @@ var height:Double = 0 var weight:Double = 0 var isStudent = 0 // 1:是学员, 0:否 var headImg = "" var avatar = "" } WanPai/Network/Services.swift
@@ -1112,7 +1112,7 @@ } /// 编辑参赛人员信息 class func editParticipant(id:Int,height:Int,weight:Int,phone:String?,isStudent:Int)->Observable<BaseResponse<SimpleModel>>{ class func editParticipant(id:Int,height:Int,weight:Int,phone:String?,isStudent:Int,headImg:String)->Observable<BaseResponse<SimpleModel>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "competition/api/participant/editParticipant") .append(key: "id", value: id) @@ -1120,6 +1120,7 @@ .append(key: "weight", value: weight) .append(key: "phone", value: phone) .append(key: "isStudent", value: isStudent) .append(key: "headImg", value: headImg) return NetworkRequest.request(params: params, method: .post, progress: true) } @@ -1144,6 +1145,7 @@ .interface(url: "/competition/api/participant/editParticipant") .append(key: "id", value: model.id) .append(key: "idcard", value: model.idcard) .append(key: "headImg",value: model.headImg) return NetworkRequest.request(params: params, method: .post, progress: true) } @@ -1432,16 +1434,16 @@ extension Services{ static func startNetworkMonitor(){ let manager = NetworkReachabilityManager(host: All_Url) manager?.startListening(onUpdatePerforming: { status in switch status { case .notReachable:alertError(msg: "当前网络不可用") case .reachable(let type): switch type{ case .ethernetOrWiFi:alert(msg: "当前为Wi-Fi网络") case .cellular:alert(msg: "当前为移动网络") } default:break } }) // manager?.startListening(onUpdatePerforming: { status in // switch status { // case .notReachable:alertError(msg: "当前网络不可用") // case .reachable(let type): // switch type{ // case .ethernetOrWiFi:alert(msg: "当前为Wi-Fi网络") // case .cellular:alert(msg: "当前为移动网络") // } // default:break // } // }) } } WanPai/Root/Activity/VC/ActivityStudentListVC.swift
@@ -50,7 +50,7 @@ } @IBAction func addStudentAction(_ sender: Any) { let vc = AddStudentVC(type: .activity) let vc = AddStudentVC(type: .activity,activityDetailPartModel: nil) push(vc: vc) } } WanPai/Root/Activity/View/StudentUpdateInfoView.swift
@@ -13,94 +13,137 @@ 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! @IBOutlet weak var img_profile: UIImageView! @IBOutlet weak var view_profile: UIView! @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() private var model:ActivityDetailPartModel? private var updateUserProfile:Bool = false private let disposeBag = DisposeBag() private var profileImg:UIImage? 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) override func awakeFromNib() { super.awakeFromNib() cons_bottom.constant = -(JQ_ScreenW / 2) alpha = 0 layoutIfNeeded() 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(_ model:ActivityDetailPartModel){ let storesView = StudentUpdateInfoView.jq_loadNibView() storesView.model = model storesView.frame = sceneDelegate?.window?.frame ?? .zero sceneDelegate?.window?.addSubview(storesView) storesView.cons_bottom.constant = 0 storesView.tf_phone.text = model.phone storesView.tf_height.text = "\(model.height.int)" storesView.tf_weight.text = "\(model.weight.int)" let tap = UITapGestureRecognizer(target: self, action: #selector(userImgUploadAction)) img_profile.isUserInteractionEnabled = true img_profile.addGestureRecognizer(tap) UIView.animate(withDuration: 0.4) { storesView.alpha = 1 storesView.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(_ model:ActivityDetailPartModel,updateUserProfile:Bool = false){ let storesView = StudentUpdateInfoView.jq_loadNibView() storesView.model = model storesView.updateUserProfile = updateUserProfile storesView.view_profile.isHidden = !updateUserProfile storesView.frame = sceneDelegate?.window?.frame ?? .zero sceneDelegate?.window?.addSubview(storesView) storesView.cons_bottom.constant = 0 storesView.tf_phone.text = model.phone storesView.tf_height.text = "\(model.height.int)" storesView.tf_weight.text = "\(model.weight.int)" if updateUserProfile{ storesView.img_profile.sd_setImage(with: URL(string: model.headImg),placeholderImage: UIImage(named: "btn_add_large_2")) } UIView.animate(withDuration: 0.4) { storesView.alpha = 1 storesView.layoutIfNeeded() } } @objc func userImgUploadAction(){ JQ_ImagePickerTool.getSharedInstance().singleImage({ [weak self] image in self?.img_profile.image = image self?.profileImg = image }, clipSize: CGSize(width: JQ_ScreenW, height: JQ_ScreenW)) } @IBAction func saveAction(_ sender: UIButton) { guard !tf_height.text!.isEmpty else {alertError(msg: "请输入身高");return} guard !tf_weight.text!.isEmpty else {alertError(msg: "请输入体重");return} @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} 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 ?? 0, weight: tf_weight.text!.int ?? 0, phone: tf_phone.text,isStudent: model!.isStudent).subscribe(onNext: {data in alertSuccess(msg: "修改成功") DispatchQueue.main.asyncAfter(deadline: .now()+1) { NotificationCenter.default.post(name: StudentUpdate_Nofi, object: nil) self.close() } }).disposed(by: disposeBag) } guard profileImg != nil || !(model?.headImg.isEmpty ?? true) else { alertError(msg: "请上传头像");return } self.endEditing(true) if profileImg != nil{ showHUD("正在上传头像") profileImg!.uploadImgToService().subscribe(onNext: { [weak self] imgUrl in guard let weakSelf = self else { return } weakSelf.model?.headImg = imgUrl hiddenHUD() weakSelf.saveEdit() }, onError: { error in hiddenHUD() alertError(msg: error.localizedDescription) }).disposed(by: disposeBag) }else{ saveEdit() } } private func saveEdit(){ Services.editParticipant(id: model!.id, height: tf_height.text!.int ?? 0, weight: tf_weight.text!.int ?? 0, phone: tf_phone.text,isStudent: model!.isStudent,headImg: model!.headImg).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() } @IBAction func closeAction(_ sender: UIButton) { close() } private func close(){ self.cons_bottom.constant = -(JQ_ScreenW / 2) UIView.animate(withDuration: 0.4) { self.alpha = 0 self.layoutIfNeeded() } completion: { _ in self.removeFromSuperview() } } override func layoutSubviews() { super.layoutSubviews() view_container.jq_addCorners(corner: [.topLeft,.topRight], radius: 20,width: JQ_ScreenW,height: JQ_ScreenW) } private func close(){ self.cons_bottom.constant = -(JQ_ScreenW / 2) UIView.animate(withDuration: 0.4) { self.alpha = 0 self.layoutIfNeeded() } completion: { _ in self.removeFromSuperview() } } override func layoutSubviews() { super.layoutSubviews() view_container.jq_addCorners(corner: [.topLeft,.topRight], radius: 20,width: JQ_ScreenW,height: JQ_ScreenW) } } 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="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <device id="retina6_12" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/> <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"/> @@ -16,13 +16,37 @@ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FQP-Da-djy"> <rect key="frame" x="0.0" y="560.66666666666663" width="393" height="291.33333333333337"/> <rect key="frame" x="0.0" y="420.66666666666674" width="393" height="431.33333333333326"/> <subviews> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="V13-39-Dea"> <rect key="frame" x="0.0" y="16" width="393" height="151.33333333333334"/> <rect key="frame" x="0.0" y="16" width="393" height="291.33333333333331"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Whm-kp-4GP"> <rect key="frame" x="0.0" y="0.0" width="393" height="140"/> <subviews> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="btn_add_large_2" translatesAutoresizingMaskIntoConstraints="NO" id="bj7-gH-bLI"> <rect key="frame" x="145.66666666666666" y="19" width="102" height="102"/> <constraints> <constraint firstAttribute="width" constant="102" id="dAb-dt-iR0"/> <constraint firstAttribute="height" constant="102" id="qdQ-fr-ZOH"/> </constraints> <userDefinedRuntimeAttributes> <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/> <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB"> <real key="value" value="51"/> </userDefinedRuntimeAttribute> </userDefinedRuntimeAttributes> </imageView> </subviews> <color key="backgroundColor" systemColor="systemBackgroundColor"/> <constraints> <constraint firstItem="bj7-gH-bLI" firstAttribute="centerY" secondItem="Whm-kp-4GP" secondAttribute="centerY" id="Cj3-JO-u5V"/> <constraint firstAttribute="height" constant="140" id="VZw-jM-bvY"/> <constraint firstItem="bj7-gH-bLI" firstAttribute="centerX" secondItem="Whm-kp-4GP" secondAttribute="centerX" id="Vee-F2-jZH"/> </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cId-Io-SsC"> <rect key="frame" x="0.0" y="0.0" width="393" height="50.666666666666664"/> <rect key="frame" x="0.0" y="139.99999999999994" width="393" height="50.666666666666657"/> <subviews> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_item_p" translatesAutoresizingMaskIntoConstraints="NO" id="3qc-L3-U16"> <rect key="frame" x="15" y="19.333333333333371" width="12" height="12"/> @@ -76,7 +100,7 @@ </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sbO-PZ-2I4"> <rect key="frame" x="0.0" y="50.666666666666742" width="393" height="50.333333333333343"/> <rect key="frame" x="0.0" y="190.66666666666669" width="393" height="50.333333333333343"/> <subviews> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_item_p" translatesAutoresizingMaskIntoConstraints="NO" id="4a2-W8-ZB1"> <rect key="frame" x="15" y="19" width="12" height="12"/> @@ -130,7 +154,7 @@ </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Jhb-ug-p8L"> <rect key="frame" x="0.0" y="101" width="393" height="50.333333333333343"/> <rect key="frame" x="0.0" y="240.99999999999997" width="393" height="50.333333333333343"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NGC-Ss-4rN"> <rect key="frame" x="14" y="50" width="365" height="0.3333333333333357"/> @@ -173,7 +197,7 @@ </subviews> </stackView> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lxt-la-hhb"> <rect key="frame" x="41" y="192.33333333333337" width="146" height="40"/> <rect key="frame" x="41" y="332.33333333333331" width="146" height="40"/> <constraints> <constraint firstAttribute="height" constant="40" id="LMv-4a-nfN"/> </constraints> @@ -198,7 +222,7 @@ </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"/> <rect key="frame" x="207" y="332.33333333333331" width="146" height="40"/> <color key="backgroundColor" name="FE6E0D"/> <constraints> <constraint firstAttribute="height" constant="40" id="ock-wd-iD8"/> @@ -233,7 +257,7 @@ </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"/> <rect key="frame" x="0.0" y="0.0" width="393" height="420.66666666666669"/> <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"/> @@ -252,15 +276,18 @@ </constraints> <connections> <outlet property="cons_bottom" destination="Xfr-Bp-8jB" id="IZH-JX-BFj"/> <outlet property="img_profile" destination="bj7-gH-bLI" id="GsX-Bs-0B2"/> <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"/> <outlet property="view_profile" destination="Whm-kp-4GP" id="8KG-BB-BrO"/> </connections> <point key="canvasLocation" x="-10" y="21"/> </view> </objects> <resources> <image name="btn_add_large_2" width="112" height="112"/> <image name="icon_item_p" width="12" height="12"/> <namedColor name="FE6E0D"> <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> WanPai/Root/Course/VC/AddStudentVC.swift
@@ -23,7 +23,8 @@ @IBOutlet weak var tf_weight: QMUITextField! @IBOutlet weak var tf_phone: QMUITextField! @IBOutlet weak var tf_birthday: UITextField! @IBOutlet weak var img_idCardSingle: UIImageView! var profileImg:UIImage? var studentModel = StudentProfileModel() @@ -32,17 +33,20 @@ var type:ItemType! var verifyIdCard:Bool = false var identity:Bool = false //是否需要实名 init(type:ItemType,studentInfo:StudentProfile1Model? = nil) { init(type:ItemType,studentInfo:StudentProfile1Model? = nil,identity:Bool = false) { super.init(nibName: nil, bundle: nil) self.type = type self.studentInfo = studentInfo self.identity = identity } init(activityDetailPartModel:ActivityDetailPartModel? = nil) { init(type:ItemType,activityDetailPartModel:ActivityDetailPartModel? = nil,identity:Bool = false) { super.init(nibName: nil, bundle: nil) self.type = .activity self.type = type self.activityDetailPartModel = activityDetailPartModel self.identity = identity } required init?(coder: NSCoder) { @@ -51,6 +55,9 @@ override func viewDidLoad() { super.viewDidLoad() img_idCardSingle.isHidden = !identity if type == .course{ title = "添加运动营成员" view_profile.isHidden = false @@ -82,6 +89,7 @@ tf_idCard.placeholder = "请输入身份证号" if let m = activityDetailPartModel{ title = "编辑人员" view_profile.isHidden = identity tf_name.text = m.name tf_idCard.text = m.idcard tf_height.text = String(format: "%.0lf", m.height) @@ -124,7 +132,8 @@ @IBAction func completeAction(_ sender: UIButton) { if studentInfo == nil{ if !view_profile.isHidden{ guard profileImg != nil else { if type == .course{ @@ -133,7 +142,8 @@ alertError(msg: "请上传人员头像"); } return} return } } guard !tf_name.text!.isEmpty else {alertError(msg: tf_name.placeholder!);return} @@ -149,7 +159,7 @@ guard tf_phone.text!.jq_isPhone else {alertError(msg: "请输入正确的手机号");return} } if !tf_idCard.isEmpty || activityDetailPartModel != nil{ if !tf_idCard.isEmpty || identity{ guard tf_idCard.text!.jq_idCard() else {alertError(msg: "请输入正确的身份证号码");return} } WanPai/Root/Course/VC/AddStudentVC.xib
@@ -12,6 +12,7 @@ <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="AddStudentVC" customModule="WanPai" customModuleProvider="target"> <connections> <outlet property="img_idCardSingle" destination="fvg-3w-ZtH" id="Jbe-zT-f6D"/> <outlet property="img_profile" destination="5oh-CW-AiU" id="lde-3f-DOi"/> <outlet property="tf_birthday" destination="Gwh-N7-mRQ" id="Xsk-gB-nJj"/> <outlet property="tf_gender" destination="5l9-vJ-vil" id="Ch0-JK-GqD"/> @@ -356,17 +357,25 @@ <constraint firstAttribute="height" constant="0.40000000000000002" id="i2J-rI-rHl"/> </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="JjF-jS-GPH"> <rect key="frame" x="14.000000000000004" y="16.666666666666629" width="57.333333333333343" height="17"/> <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/> <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入运动营成员身份证号" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="LD0-ej-DmH"> <rect key="frame" x="120" y="0.0" width="233" height="49.666666666666664"/> <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/> <textInputTraits key="textInputTraits" keyboardType="numberPad"/> </textField> <stackView opaque="NO" contentMode="scaleToFill" spacing="3" translatesAutoresizingMaskIntoConstraints="NO" id="5SC-hK-UA4"> <rect key="frame" x="14.000000000000004" y="16.666666666666629" width="57.333333333333343" height="17"/> <subviews> <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_item_p" translatesAutoresizingMaskIntoConstraints="NO" id="fvg-3w-ZtH"> <rect key="frame" x="0.0" y="0.0" width="0.0" height="17"/> </imageView> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="身份证号" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JjF-jS-GPH"> <rect key="frame" x="0.0" y="0.0" width="57.333333333333329" height="17"/> <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/> <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> </subviews> </stackView> </subviews> <color key="backgroundColor" systemColor="systemBackgroundColor"/> <constraints> @@ -374,12 +383,12 @@ <constraint firstItem="LD0-ej-DmH" firstAttribute="top" secondItem="eXg-lM-iFa" secondAttribute="top" id="2K7-zV-OyA"/> <constraint firstAttribute="bottom" secondItem="NlW-dD-gIp" secondAttribute="bottom" id="9Mu-Gg-yex"/> <constraint firstItem="LD0-ej-DmH" firstAttribute="leading" secondItem="eXg-lM-iFa" secondAttribute="leading" constant="120" id="9U6-rD-Jfd"/> <constraint firstItem="JjF-jS-GPH" firstAttribute="leading" secondItem="eXg-lM-iFa" secondAttribute="leading" constant="14" id="Im9-5F-1xr"/> <constraint firstItem="NlW-dD-gIp" firstAttribute="leading" secondItem="eXg-lM-iFa" secondAttribute="leading" constant="14" id="Qir-9y-1mQ"/> <constraint firstItem="5SC-hK-UA4" firstAttribute="leading" secondItem="eXg-lM-iFa" secondAttribute="leading" constant="14" id="ZKf-ks-ceU"/> <constraint firstItem="5SC-hK-UA4" firstAttribute="centerY" secondItem="eXg-lM-iFa" secondAttribute="centerY" id="bmM-pj-ZpC"/> <constraint firstAttribute="trailing" secondItem="NlW-dD-gIp" secondAttribute="trailing" constant="14" id="jSc-75-egP"/> <constraint firstItem="NlW-dD-gIp" firstAttribute="top" secondItem="LD0-ej-DmH" secondAttribute="bottom" id="mxF-BK-Axi"/> <constraint firstAttribute="height" constant="50" id="ngz-MT-wKh"/> <constraint firstItem="JjF-jS-GPH" firstAttribute="centerY" secondItem="eXg-lM-iFa" secondAttribute="centerY" id="xph-Ep-7kc"/> </constraints> </view> </subviews> @@ -414,7 +423,7 @@ <constraint firstItem="d3m-we-29R" firstAttribute="top" secondItem="fnl-2z-Ty3" secondAttribute="top" id="Oq1-zv-ea2"/> <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="KyK-7A-Oi3" secondAttribute="trailing" constant="100" id="gh3-61-wYy"/> </constraints> <point key="canvasLocation" x="40" y="21"/> <point key="canvasLocation" x="38.931297709923662" y="20.422535211267608"/> </view> </objects> <resources> WanPai/Root/Course/VC/CourseDetailApplyVC.swift
@@ -207,7 +207,7 @@ weakSelf.cons_tableHei.constant = CGFloat((weakSelf.studentModels.count) * 87) weakSelf.changePrice(weakSelf.selectClassIndex) } needAddClouse: { [weak self] () in let vc = AddStudentVC(type: .course) let vc = AddStudentVC(type: .course,studentInfo: nil) self?.push(vc: vc) } } @@ -266,34 +266,49 @@ } Services.courcePayment(conponId: weakSelf.selectCouponModel?.id, courseConfigId: model.id, id: weakSelf.detailModel!.id, price: resultPayPrice, payType: payType, stuId: weakSelf.studentModels.map({$0.id}),orderId: weakSelf.signUpModel?.coursePayId).subscribe(onNext: { data in if data.code == 200{ switch payType { case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: data.data!.orderString)) { [weak self] result in switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .courseApply,handleVC: self,courseConfigId: model.id) vc.isExtend = self?.signUpModel?.payStatus == .paymented self?.push(vc: vc) case .cancel: alert(msg: "已取消") case .failure(_): let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .courseApply) self?.push(vc: vc) if let m = data.data{ if data.code == 200{ switch payType { case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: data.data!.orderString)) { [weak self] result in switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .courseApply,handleVC: self,courseConfigId: model.id) vc.isExtend = self?.signUpModel?.payStatus == .paymented self?.push(vc: vc) case .cancel: alert(msg: "已取消") case .failure(_): let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .courseApply) self?.push(vc: vc) } } } case .wechat: self?.navigationController?.popViewController(animated: false) break case .coin: let vc = PaymentResultVC(result: .success, objType: .courseApply,handleVC: self,courseConfigId: model.id) vc.isExtend = self?.signUpModel?.payStatus == .paymented self?.push(vc: vc) default:break case .wechat: YYPaymentManager.shared.sendPaymentRequest(YYWeChatPayRequest(partnerId: m.partnerid, prepayId: m.prepayid, package: m.package, nonceStr: m.noncestr, timeStamp: m.timestamp, sign: m.sign)) { [weak self] result in switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .courseApply,handleVC: self,courseConfigId: model.id) vc.isExtend = self?.signUpModel?.payStatus == .paymented self?.push(vc: vc) case .cancel: alert(msg: "已取消") case .failure(_): let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .courseApply) self?.push(vc: vc) } } break case .coin: let vc = PaymentResultVC(result: .success, objType: .courseApply,handleVC: self,courseConfigId: model.id) vc.isExtend = self?.signUpModel?.payStatus == .paymented self?.push(vc: vc) default:break } }else{ alertError(msg: data.msg) } }else{ alertError(msg: data.msg) } },onError: { error in if let er = error as? NetworkRequest.NetRequestError{ switch er { WanPai/Root/Course/VC/CourseInfoVC.swift
@@ -269,7 +269,7 @@ } @IBAction func addStudentAction(_ sender: QMUIButton) { let vc = AddStudentVC(type: .course) let vc = AddStudentVC(type: .course,studentInfo: nil) push(vc: vc) } WanPai/Root/Course/VC/CourseVC.swift
@@ -91,7 +91,7 @@ } @IBAction func addStudentAction(_ sender: QMUIButton) { let addstudentVC = AddStudentVC(type: .course) let addstudentVC = AddStudentVC(type: .course,studentInfo: nil) push(vc: addstudentVC) } } WanPai/Root/Course/VC/StudentExchangeVC.swift
@@ -47,7 +47,7 @@ } @IBAction func addStudentAction(_ sender: UIButton) { let studentVC = AddStudentVC(type: .course) let studentVC = AddStudentVC(type: .course,studentInfo: nil) push(vc: studentVC) } WanPai/Root/Games/TCell/GamesTCell.swift
@@ -42,23 +42,37 @@ PaymentView.show(enumType:.game,money: (ali: weakSelf.gameListModel.cash, wx: weakSelf.gameListModel.cash, coin: weakSelf.gameListModel.playCoin, course: nil,integral:weakSelf.gameListModel.integral)) { [weak self] payType in guard let weakSelf = self else { return } Services.payGame(configId: weakSelf.gameListModel.id, gameId: weakSelf.gameListModel.gameId, spaceId: weakSelf.storeId, sutuId: weakSelf.sutuId, type: payType).subscribe(onNext: {data in switch payType { case .wechat:break case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: data.data?.orderString ?? "")) { result in switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .games) JQ_currentViewController().jq_push(vc: vc) case .cancel:alert(msg: "支付已取消") case .failure(_): let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .games) JQ_currentViewController().jq_push(vc: vc) if let m = data.data{ switch payType { case .wechat: YYPaymentManager.shared.sendPaymentRequest(YYWeChatPayRequest(partnerId: m.partnerid, prepayId: m.prepayid, package: m.package, nonceStr: m.noncestr, timeStamp: m.timestamp, sign: m.sign)) { result in switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .games) JQ_currentViewController().jq_push(vc: vc) case .cancel:alert(msg: "支付已取消") case .failure(_): let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .games) JQ_currentViewController().jq_push(vc: vc) } } } default: let vc = PaymentResultVC(result: .success, objType: .games) JQ_currentViewController().jq_push(vc: vc) case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: data.data?.orderString ?? "")) { result in switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .games) JQ_currentViewController().jq_push(vc: vc) case .cancel:alert(msg: "支付已取消") case .failure(_): let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .games) JQ_currentViewController().jq_push(vc: vc) } } default: let vc = PaymentResultVC(result: .success, objType: .games) JQ_currentViewController().jq_push(vc: vc) } } }) { error in if let er = error as? NetworkRequest.NetRequestError{ WanPai/Root/Home/Model/WorldCupModel.swift
@@ -95,7 +95,7 @@ var name: String = "" var nationalRank: Int = 0 var win: Int = 0 var winRate: Int = 0 var winRate: Double = 0 } struct WorldCupMatchRecordModel:HandyJSON{ WanPai/Root/Home/VC/JoinMemberIntroduceVC.swift
@@ -43,10 +43,35 @@ PaymentView.show(enumType: .joinMember, money: (ali:price,wx:price,coin:nil,course:nil,integral:nil)) { type in Services.enrollMember(paytype: type).subscribe(onNext: {data in switch type { case .aliPay: if let orderString = data.data?.orderString{ YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: orderString)) {[weak self] result in if let m = data.data{ switch type { case .aliPay: if let orderString = data.data?.orderString{ YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: orderString)) {[weak self] result in guard let weakSelf = self else { return } switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .member, handleVC: nil, courseConfigId: nil, againClouse: nil) weakSelf.push(vc: vc) case .cancel: let vc = PaymentResultVC(result: .fail("已取消支付", 0), objType: .member, handleVC: nil, courseConfigId: nil, againClouse: nil) weakSelf.push(vc: vc) case .failure(let error): if let er = error as? NetworkRequest.NetRequestError{ switch er { case .Other(let code,let string): let vc = PaymentResultVC(result: .fail(string,code), objType: .member) weakSelf.push(vc: vc) default: let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .member) weakSelf.push(vc: vc) } } } } } case .wechat: YYPaymentManager.shared.sendPaymentRequest(YYWeChatPayRequest(partnerId: m.partnerid, prepayId: m.prepayid, package: m.package, nonceStr: m.noncestr, timeStamp: m.timestamp, sign: m.sign)) {[weak self] result in guard let weakSelf = self else { return } switch result { case .success: @@ -68,10 +93,10 @@ } } } } case .wechat:break default:break default:break } } }).disposed(by: self.disposeBag) } } WanPai/Root/Home/View/WorldCupHeadView.swift
@@ -27,7 +27,7 @@ override func awakeFromNib() { super.awakeFromNib() btn_hot.isSelected = true btn_point.spacingBetweenImageAndTitle = 5 btn_condition.spacingBetweenImageAndTitle = 5 btn_hot.spacingBetweenImageAndTitle = 5 WanPai/Root/Other/TCell/StudentInfo_2_TCell.swift
@@ -49,7 +49,7 @@ } @IBAction func editAction(_ sender: UIButton) { StudentUpdateInfoView.show(activityDetailPartModel) StudentUpdateInfoView.show(activityDetailPartModel,updateUserProfile: true) } @@ -60,7 +60,7 @@ } @IBAction func verifyAction(_ sender: UIButton) { let vc = AddStudentVC(activityDetailPartModel: activityDetailPartModel) let vc = AddStudentVC(type:.activity,activityDetailPartModel: activityDetailPartModel,identity: true) JQ_currentViewController().jq_push(vc: vc) } } WanPai/Root/Other/TCell/StudentInfo_5_TCell.swift
@@ -51,12 +51,12 @@ @objc func showQRAction(){ if let qrCode = WorldCupUserInfoQRCodel(id: activityDetailPartModel.id, isStudent: activityDetailPartModel.isStudent).toJSONString(){ QRPreview.show(qrCode) QRPreview.show(qrCode,title: activityDetailPartModel.name) } } @IBAction func editAction(_ sender: UIButton) { StudentUpdateInfoView.show(activityDetailPartModel) StudentUpdateInfoView.show(activityDetailPartModel,updateUserProfile: true) } @@ -67,7 +67,7 @@ } @IBAction func verifyAction(_ sender: UIButton) { let vc = AddStudentVC(activityDetailPartModel: activityDetailPartModel) let vc = AddStudentVC(type:.worldCup,activityDetailPartModel: activityDetailPartModel,identity: true) JQ_currentViewController().jq_push(vc: vc) } WanPai/Root/Other/VC/ProfileVC.swift
@@ -20,6 +20,7 @@ @IBOutlet weak var view_vipExpired: UIView! private var profileImg:UIImage? private var model:UserInfoModel? override func viewDidLoad() { super.viewDidLoad() @@ -39,11 +40,11 @@ self?.label_vipDutime.text = model.memberLifespan self?.btn_userProfile.sd_setImage(with: URL(string: model.userImage), for: .normal,placeholderImage: UIImage(named: "btn_userProfile")) self?.view_vipExpired.isHidden = model.isVip == 0 self?.model = model self?.tf_username.isEnabled = model.userName.isEmpty self?.tf_gender.isEnabled = model.sex.isEmpty self?.tf_birthday.isEnabled = model.birthday.isEmpty // self?.tf_username.isEnabled = model.userName.isEmpty // self?.tf_gender.isEnabled = model.sex.isEmpty // self?.tf_birthday.isEnabled = model.birthday.isEmpty } }).disposed(by: disposeBag) @@ -56,6 +57,7 @@ alertError(msg: "请输入用户名称");return } guard weakSelf.tf_username.text != weakSelf.model?.userName else {return} Services.updateInfo(birthday: nil, gender: nil, name: weakSelf.tf_username.text).subscribe(onNext: {[weak self] data in self?.updateUserInfo() }).disposed(by: weakSelf.disposeBag) WanPai/Root/Search/VC/MeQRCodeVC.swift
@@ -20,7 +20,7 @@ Services.queryProtocol(.useStore, progress: false).subscribe(onNext: {[weak self] text in self?.label_content.text = (text.data ?? "").jq_filterFromHTML_1() self?.label_content.attributedText = AttributedStringbuilder.build().add(string: (text.data ?? ""), withFont: .systemFont(ofSize: 14, weight: .medium), withColor: .black.withAlphaComponent(0.6), lineSpace: 5).mutableAttributedString }).disposed(by: disposeBag) } WanPai/Root/Search/VC/StudentsManagerListVC.swift
@@ -40,7 +40,7 @@ } @IBAction func addStudentAction(_ sender: Any) { let vc = AddStudentVC(type: .activity) let vc = AddStudentVC(type: .activity,activityDetailPartModel: nil,identity:true) push(vc: vc) } } WanPai/Root/Search/VC/WorldCupContentApplyInputVC.swift
@@ -125,7 +125,7 @@ self?.cons_tableHei.constant = Double(self?.students.count ?? 0) * 100 self?.tableView.reloadData() } needAddClouse: {[weak self] () in let vc = ActivityStudentListVC() let vc = AddStudentVC(type: .worldCup,activityDetailPartModel: nil,identity: true) self?.push(vc: vc) } } @@ -206,6 +206,22 @@ Services.worldCupPayment(id: detailModel.id, ids: result.jq_toJson1(), payType: payType, uid: nil).subscribe(onNext: {[weak self]data in if let m = data.data{ switch payType { case .wechat: YYPaymentManager.shared.sendPaymentRequest(YYWeChatPayRequest(partnerId: m.partnerid, prepayId: m.prepayid, package: m.package, nonceStr: m.noncestr, timeStamp: m.timestamp, sign: m.sign)) { result in switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .worldCup) self?.push(vc: vc) case .cancel: alert(msg: "交易取消") case .failure(_): let vc = PaymentResultVC(result: .fail("支付失败",0), objType: .worldCup){[weak self] () in self?.showPaymentView() } self?.push(vc: vc) } } case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) { result in switch result { WanPai/Root/Search/VC/WorldCupContentDetailVC.swift
@@ -129,7 +129,7 @@ } if let endDate = model.registrationClosingTime{ let endDateTimeInterval = Date.jq_StringToTimeInterval(endDate, "yyyy-MM-dd HH:mm") let endDateTimeInterval = Date.jq_StringToTimeInterval(model.startTime, "yyyy-MM-dd HH:mm") if Date.jq_CalByDays(startDate: Date(), endDate: Date(timeIntervalSince1970: endDateTimeInterval)) <= 1{ self?.btn_enroll.setTitle("取消", for: .normal) @@ -196,7 +196,12 @@ } extension WorldCupContentDetailVC:UITableViewDelegate{ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let model = detailModel!.participants[indexPath.row] if let qrCode = WorldCupUserInfoQRCodel(id: model.id, isStudent: model.isStudent).toJSONString(){ QRPreview.show(qrCode,title: model.name) } } } extension WorldCupContentDetailVC:UITableViewDataSource{ WanPai/Root/Search/VC/WorldCupHeaderVC.swift
@@ -43,6 +43,10 @@ setProvince(rank: 0) setCity(cityName: "", rank: 0) let tap = UITapGestureRecognizer(target: self, action: #selector(showBigPicAction)) img_QR.isUserInteractionEnabled = true img_QR.addGestureRecognizer(tap) } override func setRx() { @@ -65,7 +69,7 @@ self?.setCity(cityName: model.cityName, rank: model.cityRank) self?.label_winNum.text = "\(model.win)" self?.label_loseNum.text = "\(model.lose)" self?.label_winRate.text = "\(model.winRate)%" self?.label_winRate.text = String(format: "%.1lf%%", model.winRate) } }).disposed(by: disposeBag) @@ -75,6 +79,15 @@ label_provinceRank.attributedText = AttributedStringbuilder.build().add(string: "全国排名 ", withFont: .systemFont(ofSize: 14), withColor: .white).add(string: "\(rank)", withFont: .systemFont(ofSize: 28, weight: .semibold), withColor: .white).mutableAttributedString } @objc private func showBigPicAction(){ if let model = partModel?.value{ if let qrCode = WorldCupUserInfoQRCodel(id: model.id, isStudent: model.isStudent).toJSONString(){ QRPreview.show(qrCode,title: model.name) } } } private func setCity(cityName:String,rank:Int){ label_cityRank.attributedText = AttributedStringbuilder.build().add(string: "\(cityName)排名 ", withFont: .systemFont(ofSize: 14), withColor: .white).add(string: "\(rank)", withFont: .systemFont(ofSize: 28, weight: .semibold), withColor: .white).mutableAttributedString } WanPai/Root/Search/VC/WorldCupRankVC.swift
@@ -35,21 +35,11 @@ private let provinceBtn = UIButton(type: .custom) private var tableView:UITableView! var superScrollView:UIScrollView? var flowCell:WorldCupRankTCell? override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .clear // if let model = currentPartModel{ // viewModel.id.accept(model.id) // viewModel.isStudent.accept(model.isStudent) // Services.getEntrantRank(id: model.id, isStudent: model.isStudent).subscribe(onNext: {[weak self] data in // if let model = data.data{ // self?.worldCupRankModel = model // self?.cityBtn.setTitle(model.cityName, for: .normal) // self?.cityBtn.layoutIfNeeded() // self?.cityBtn.layoutSubviews() // } // }).disposed(by: disposeBag) // } } override func setUI() { @@ -118,6 +108,7 @@ if let m = model{ self?.viewModel.id.accept(m.id) self?.viewModel.isStudent.accept(m.isStudent) self?.viewModel.beginRefresh() Services.getEntrantRank(id: m.id, isStudent: m.isStudent).subscribe(onNext: {[weak self] data in if let model = data.data{ @@ -130,6 +121,18 @@ } }).disposed(by: disposeBag) Observable.combineLatest(superScrollView!.rx.contentOffset, tableView.rx.contentOffset).subscribe { v1,v2 in //获取rankTCell是否出现在屏幕内 if let cell = self.flowCell{ let rect = cell.convert(cell.bounds, to: app.window) if rect.origin.y < 0 || rect.origin.y > self.view.height{ NotificationCenter.default.post(name: ShowOrHiddenFlowImage_Noti, object: false) }else{ NotificationCenter.default.post(name: ShowOrHiddenFlowImage_Noti, object: true) } } }.disposed(by: disposeBag) } @objc func radiusAction(btn:UIButton){ @@ -263,13 +266,31 @@ } return cell! } let cell = tableView.dequeueReusableCell(withIdentifier: "rankTCell") as! WorldCupRankTCell let cell = tableView.dequeueReusableCell(withIdentifier: "rankTCell") as! WorldCupRankTCell cell.indexPath = indexPath cell.model = viewModel.dataSource.value[indexPath.row] if viewModel.dataSource.value[indexPath.row].oneself == 1{ cell.borderColor = UIColor(hexString: "#FC743A") cell.borderWidth = 1 }else{ cell.borderWidth = 0 } cell.addLine(UIColor(hexStr: "#E1E1E1"), false, true, false, true, 0.4) return cell } func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if let rankTCell = cell as? WorldCupRankTCell{ if viewModel.dataSource.value[indexPath.row].oneself == 1{ flowCell = rankTCell NotificationCenter.default.post(name: FlowImage_Noti, object: rankTCell.jq_captureToImage()) } } } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.section == 0{ return 32 WanPai/Root/Search/VC/WorldCupRecordVC.swift
@@ -56,6 +56,7 @@ if let m = model{ self?.viewModel.studentId.accept(m.id) self?.viewModel.isStudent.accept(m.isStudent) self?.viewModel.beginRefresh() } }).disposed(by: disposeBag) } WanPai/Root/Search/VC/WorldCupVC.swift
@@ -15,11 +15,15 @@ import RxDataSources import ReplayKit let FlowImage_Noti = Notification.Name.init("FlowImage_Noti") let ShowOrHiddenFlowImage_Noti = Notification.Name.init("FlowImage_Noti") class WorldCupVC: BaseVC { private var partModels = [ActivityDetailPartModel]() private var partModel = BehaviorRelay<ActivityDetailPartModel?>(value:nil) private var toPage:Int? lazy var headerVC:WorldCupHeaderVC = { let vc = WorldCupHeaderVC() vc.partModel = partModel @@ -41,6 +45,12 @@ vc.menuHeight = 50 vc.style = .subRefresh return vc }() lazy var flowImageView:UIImageView = { let i = UIImageView() i.tag = 1001 return i }() lazy var pageVC:FFPageViewController = { @@ -103,10 +113,26 @@ } override func setRx() { // partModel.subscribe(onNext: { data in // // // }).disposed(by: disposeBag) NotificationCenter.default.rx.notification(FlowImage_Noti, object: nil).take(until: self.rx.deallocated).subscribe(onNext: { noti in if let img = noti.object as? UIImage{ if let imag = self.view.viewWithTag(1001) as? UIImageView{ imag.image = img }else{ self.flowImageView.image = img self.flowImageView.frame = CGRect(x: 15, y: JQ_ScreenH - UIDevice.jq_safeEdges.bottom - 45, width: JQ_ScreenW-30, height: 45) self.view.addSubview(self.flowImageView) } } }).disposed(by: disposeBag) NotificationCenter.default.rx.notification(ShowOrHiddenFlowImage_Noti, object: nil).take(until: self.rx.deallocated).subscribe(onNext: { noti in if let hidden = noti.object as? Bool, self.pageVC.currentPage == 3{ self.flowImageView.isHidden = hidden } }).disposed(by: disposeBag) } } @@ -140,12 +166,14 @@ func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) { menuVC.pageMenu.selectedItemIndex = currentPage flowImageView.isHidden = currentPage != 3 } } extension WorldCupVC:SPPageMenuDelegate{ func pageMenu(_ pageMenu: SPPageMenu, didSelectedItem index: Int) { pageVC.scroll(toPage: index, animation: true) flowImageView.isHidden = index != 3 } func pageMenu(_ pageMenu: SPPageMenu, itemSelectedAt index: Int) { WanPai/Root/Welfare/VC/RechargeCenterVC.swift
@@ -11,159 +11,171 @@ class RechargeCenterVC: BaseVC { struct RechargeItem { var coin = 0 var money:Double = 0 } @IBOutlet weak var view_topBg: UIView! @IBOutlet weak var view_cion: JQ_RollNumberLabel! @IBOutlet weak var btn_rechange: UIButton! @IBOutlet weak var view_container: UIView! @IBOutlet weak var btn_rechargeInfo: UIButton! @IBOutlet weak var collectionView: UICollectionView! @IBOutlet weak var cons_collectHei: NSLayoutConstraint! private var items = [RechargeItem]() private var cellW:Double = 0 private var cellH:Double = 0 private var selectIndex = 0 // var viewModel:RechargeRecordViewModel! override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) } override func viewDidLoad() { super.viewDidLoad() title = "充值中心" cellW = (JQ_ScreenW - 100.0) / 3.0 cellH = (JQ_ScreenW - 100.0) / 3.0 * 0.5148 Services.benefitHome().subscribe(onNext: {[weak self] data in if let m = data.data{ self?.view_cion.valueNumber = NSNumber(value: m.wpCoin) } }) { error in }.disposed(by: disposeBag) view_cion.font = UIFont.init(name: "Impact", size: 36)! view_cion.textColor = .white Services.voucherCenter().subscribe(onNext: {[weak self] data in guard let weakSelf = self else { return } for v in data.data ?? []{ weakSelf.items.append(RechargeItem(coin: v.wpGold, money: v.amount)) } let h = ceil(Double(weakSelf.items.count) / 3.0) * weakSelf.cellH + (floor(Double(weakSelf.items.count) / 3.0)) * 21.0 weakSelf.cons_collectHei.constant = h weakSelf.collectionView.reloadData() }).disposed(by: disposeBag) } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let colors = [UIColor(hexStr: "#FD8C02").cgColor, UIColor(hexStr: "#FD7202").cgColor] view_topBg.jq_gradientColor(colorArr: colors,bounds: CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.5923)) btn_rechange.jq_gradientNibColor(colorArr: colors, cornerRadius: 20) } override func setUI() { let attribute = AttributedStringbuilder() attribute.add(string: "储值说明?", withFont: UIFont.systemFont(ofSize: 14), withColor: Def_ThemeColor) attribute.underLine(color: Def_ThemeColor) btn_rechargeInfo.titleLabel?.attributedText = attribute.mutableAttributedString collectionView.delegate = self collectionView.dataSource = self collectionView.isScrollEnabled = false collectionView.contentInset = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12) collectionView.register(UINib(nibName: "RechargeItemCCell", bundle: nil), forCellWithReuseIdentifier: "_RechargeItemCCell") } @IBAction func introAction(_ sender: UIButton) { Services.rechargeDescription().subscribe(onNext: {[weak self] data in if let string = data.data{ let vc = CommonWebVC(type: .other, content: string) vc.title = "储值说明" self?.jq_push(vc: vc) } }).disposed(by: disposeBag) } @IBAction func rechargeAction(_ sender: UIButton) { let item = items[selectIndex] PaymentView.show(enumType: .recharge, money: (ali:item.money,wx:item.money,coin:nil,course:nil,integral:nil)) {[weak self] type in guard let weakSelf = self else { return } Services.useBenefitPayment(amount: item.money, payType:type).subscribe(onNext: {data in if let m = data.data{ switch type { case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) {[weak self] result in switch result { case .success: NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) let vc = PaymentResultVC(result: .success, objType: .recharge) self?.push(vc: vc) case .cancel: alert(msg: "交易已取消") case .failure(let error): alertError(msg: error.localizedDescription) } } case .wechat:break default:break } struct RechargeItem { var coin = 0 var money:Double = 0 } }).disposed(by: weakSelf.disposeBag) } } @IBOutlet weak var view_topBg: UIView! @IBOutlet weak var view_cion: JQ_RollNumberLabel! @IBOutlet weak var btn_rechange: UIButton! @IBOutlet weak var view_container: UIView! @IBOutlet weak var btn_rechargeInfo: UIButton! @IBOutlet weak var collectionView: UICollectionView! @IBOutlet weak var cons_collectHei: NSLayoutConstraint! private var items = [RechargeItem]() private var cellW:Double = 0 private var cellH:Double = 0 private var selectIndex = 0 // var viewModel:RechargeRecordViewModel! override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) } override func viewDidLoad() { super.viewDidLoad() title = "充值中心" cellW = (JQ_ScreenW - 100.0) / 3.0 cellH = (JQ_ScreenW - 100.0) / 3.0 * 0.5148 Services.benefitHome().subscribe(onNext: {[weak self] data in if let m = data.data{ self?.view_cion.valueNumber = NSNumber(value: m.wpCoin) } }) { error in }.disposed(by: disposeBag) view_cion.font = UIFont.init(name: "Impact", size: 36)! view_cion.textColor = .white Services.voucherCenter().subscribe(onNext: {[weak self] data in guard let weakSelf = self else { return } for v in data.data ?? []{ weakSelf.items.append(RechargeItem(coin: v.wpGold, money: v.amount)) } let h = ceil(Double(weakSelf.items.count) / 3.0) * weakSelf.cellH + (floor(Double(weakSelf.items.count) / 3.0)) * 21.0 weakSelf.cons_collectHei.constant = h weakSelf.collectionView.reloadData() }).disposed(by: disposeBag) } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let colors = [UIColor(hexStr: "#FD8C02").cgColor, UIColor(hexStr: "#FD7202").cgColor] view_topBg.jq_gradientColor(colorArr: colors,bounds: CGRect(x: 0, y: 0, width: JQ_ScreenW, height: JQ_ScreenW * 0.5923)) btn_rechange.jq_gradientNibColor(colorArr: colors, cornerRadius: 20) } override func setUI() { let attribute = AttributedStringbuilder() attribute.add(string: "储值说明?", withFont: UIFont.systemFont(ofSize: 14), withColor: Def_ThemeColor) attribute.underLine(color: Def_ThemeColor) btn_rechargeInfo.titleLabel?.attributedText = attribute.mutableAttributedString collectionView.delegate = self collectionView.dataSource = self collectionView.isScrollEnabled = false collectionView.contentInset = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12) collectionView.register(UINib(nibName: "RechargeItemCCell", bundle: nil), forCellWithReuseIdentifier: "_RechargeItemCCell") } @IBAction func introAction(_ sender: UIButton) { Services.rechargeDescription().subscribe(onNext: {[weak self] data in if let string = data.data{ let vc = CommonWebVC(type: .other, content: string) vc.title = "储值说明" self?.jq_push(vc: vc) } }).disposed(by: disposeBag) } @IBAction func rechargeAction(_ sender: UIButton) { let item = items[selectIndex] PaymentView.show(enumType: .recharge, money: (ali:item.money,wx:item.money,coin:nil,course:nil,integral:nil)) {[weak self] type in guard let weakSelf = self else { return } Services.useBenefitPayment(amount: item.money, payType:type).subscribe(onNext: {data in if let m = data.data{ switch type { case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) {[weak self] result in switch result { case .success: NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) let vc = PaymentResultVC(result: .success, objType: .recharge) self?.push(vc: vc) case .cancel: alert(msg: "交易已取消") case .failure(let error): alertError(msg: error.localizedDescription) } } case .wechat: YYPaymentManager.shared.sendPaymentRequest(YYWeChatPayRequest(partnerId: m.partnerid, prepayId: m.prepayid, package: m.package, nonceStr: m.noncestr, timeStamp: m.timestamp, sign: m.sign)) {[weak self] result in switch result { case .success: NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) let vc = PaymentResultVC(result: .success, objType: .recharge) self?.push(vc: vc) case .cancel: alert(msg: "交易已取消") case .failure(let error): alertError(msg: error.localizedDescription) } } default:break } } }).disposed(by: weakSelf.disposeBag) } } } extension RechargeCenterVC:UICollectionViewDelegate{ func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { selectIndex = indexPath.row } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { selectIndex = indexPath.row } } extension RechargeCenterVC:UICollectionViewDataSource{ func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let item = items[indexPath.row] let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_RechargeItemCCell", for:indexPath) as! RechargeItemCCell cell.isSelected = indexPath.row == selectIndex cell.label_coin.text = "\(item.coin)币" cell.label_moeny.text = item.money.currency() return cell } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let item = items[indexPath.row] let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_RechargeItemCCell", for:indexPath) as! RechargeItemCCell cell.isSelected = indexPath.row == selectIndex cell.label_coin.text = "\(item.coin)币" cell.label_moeny.text = item.money.currency() return cell } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return items.count } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return items.count } } extension RechargeCenterVC:UICollectionViewDelegateFlowLayout{ func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 18 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 18 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 18 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 18 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: cellW, height: cellH) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: cellW, height: cellH) } } WanPai/Root/Welfare/VC/WelfareRedeemGoodsDetailVC.swift
@@ -1,9 +1,9 @@ // // WelfareRedeemGoodsDetailVC.swift // WanPai // // Created by 无故事王国 on 2023/6/28. // // // WelfareRedeemGoodsDetailVC.swift // WanPai // // Created by 无故事王国 on 2023/6/28. // import UIKit import QMUIKit @@ -12,354 +12,380 @@ class WelfareRedeemGoodsDetailVC: BaseVC { @IBOutlet weak var btn_student: QMUIButton! @IBOutlet weak var btn_store: QMUIButton! @IBOutlet weak var tableView: UITableView! @IBOutlet weak var cons_tableHei: NSLayoutConstraint! @IBOutlet weak var view_banner: UIView! @IBOutlet weak var label_title: UILabel! @IBOutlet weak var label_exchange: UILabel! @IBOutlet weak var label_limit: UILabel! @IBOutlet weak var label_cost: UILabel! @IBOutlet weak var label_redeemedNum: UILabel! @IBOutlet weak var label_residueNum: UILabel! @IBOutlet weak var label_perLimit: UILabel! @IBOutlet weak var label_startTime: UILabel! @IBOutlet weak var label_courseHours: UILabel! @IBOutlet weak var view_courseHours: UIView! @IBOutlet weak var view_exchangeStore: UIView! @IBOutlet weak var view_vaildTime: UIView! @IBOutlet weak var webView: WKWebView! @IBOutlet weak var label_storeName: UILabel! @IBOutlet weak var cons_webHei: NSLayoutConstraint! @IBOutlet weak var btn_exchange: UIButton! @IBOutlet weak var view_students: UIView! @IBOutlet weak var view_ticketType: UIView! @IBOutlet weak var label_ticketType: UILabel! @IBOutlet weak var view_selectStore: UIView! @IBOutlet weak var view_selectStoreHei: NSLayoutConstraint! private var bannerView:CommonBannerView = { let banner = CommonBannerView() return banner }() @IBOutlet weak var btn_student: QMUIButton! @IBOutlet weak var btn_store: QMUIButton! @IBOutlet weak var tableView: UITableView! @IBOutlet weak var cons_tableHei: NSLayoutConstraint! @IBOutlet weak var view_banner: UIView! @IBOutlet weak var label_title: UILabel! @IBOutlet weak var label_exchange: UILabel! @IBOutlet weak var label_limit: UILabel! @IBOutlet weak var label_cost: UILabel! @IBOutlet weak var label_redeemedNum: UILabel! @IBOutlet weak var label_residueNum: UILabel! @IBOutlet weak var label_perLimit: UILabel! @IBOutlet weak var label_startTime: UILabel! @IBOutlet weak var label_courseHours: UILabel! @IBOutlet weak var view_courseHours: UIView! @IBOutlet weak var view_exchangeStore: UIView! @IBOutlet weak var view_vaildTime: UIView! @IBOutlet weak var webView: WKWebView! @IBOutlet weak var label_storeName: UILabel! @IBOutlet weak var cons_webHei: NSLayoutConstraint! @IBOutlet weak var btn_exchange: UIButton! @IBOutlet weak var view_students: UIView! @IBOutlet weak var view_ticketType: UIView! @IBOutlet weak var label_ticketType: UILabel! @IBOutlet weak var view_selectStore: UIView! @IBOutlet weak var view_selectStoreHei: NSLayoutConstraint! private var bannerView:CommonBannerView = { let banner = CommonBannerView() return banner }() // private var model:BenefitHomeCommonditiesModel! private var id:Int! private var goodsType:ExchangeType? private var exchangeGoodsModel:ExchangeGoodsModel? private var storeModels = [StoreSimpleModel]() private var selectStoreModel:StoreSimpleModel? private var studentModels = [CourseDetailStudentModel]() // private var model:BenefitHomeCommonditiesModel! private var id:Int! private var goodsType:ExchangeType? private var exchangeGoodsModel:ExchangeGoodsModel? private var storeModels = [StoreSimpleModel]() private var selectStoreModel:StoreSimpleModel? private var studentModels = [CourseDetailStudentModel]() init(commodityId:Int,goodsType:ExchangeType?) { super.init(nibName: nil, bundle: nil) self.id = commodityId self.goodsType = goodsType } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() title = "商品详情" if goodsType == .ticket{ view_vaildTime.isHidden = true //临时隐藏 } //全局隐藏,目前不需要 view_exchangeStore.isHidden = true view_selectStore.isHidden = true view_selectStoreHei.constant = 0 getData() } override func setUI() { btn_student.imagePosition = .right btn_store.imagePosition = .right webView.scrollView.isScrollEnabled = false btn_student.spacingBetweenImageAndTitle = 3 btn_store.spacingBetweenImageAndTitle = 3 tableView.delegate = self tableView.dataSource = self tableView.isScrollEnabled = false tableView.separatorStyle = .none tableView.register(UINib(nibName: "StudentInfoTCell", bundle: nil), forCellReuseIdentifier: "_StudentInfoTCell") view_banner.addSubview(bannerView) bannerView.snp.makeConstraints { make in make.edges.equalToSuperview() } } private func getData(){ if let type = goodsType{ Services.UseBenefitDetail(goodsId: id, goodsType: type).subscribe(onNext: {[weak self] data in if let model = data.data{ self?.updateData(model) init(commodityId:Int,goodsType:ExchangeType?) { super.init(nibName: nil, bundle: nil) self.id = commodityId self.goodsType = goodsType } }).disposed(by: disposeBag) }else{ Services.UseBenefitDetailOne(goodsId: id).subscribe(onNext: {[weak self] data in if let model = data.data{ self?.updateData(model) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }).disposed(by: disposeBag) } updateStudenTable() } override func setRx() { self.webView.scrollView.rx.observe(CGSize.self, "contentSize").map { (size) -> CGFloat? in if let size = size{ return size.height } return nil }.subscribe(onNext: { [unowned self](height) in if let height = height{ self.cons_webHei.constant = height } }).disposed(by: disposeBag) } override func viewDidLoad() { super.viewDidLoad() title = "商品详情" private func updateStudenTable(){ cons_tableHei.constant = Double(studentModels.count) * 100 tableView.reloadData() } private func updateData(_ model:ExchangeGoodsModel){ exchangeGoodsModel = model label_title.text = model.goodName label_limit.text = String(format: "%@|%@", model.belongsScope.strTitle,model.exchangeAddrType.titleRaw) label_cost.isHidden = model.cost == 0 label_cost.text = String(format: "价值:%@", model.cost.currency()) label_redeemedNum.text = "\(model.redeemedNum)" label_residueNum.text = "\(model.residueNum)" label_perLimit.text = "\(model.perLimit)" label_startTime.text = "\(model.startTime)-\(model.endTime)" label_courseHours.text = "\(model.courseHours)课时" view_courseHours.isHidden = model.courseHours == 0 // self?.view_exchangeStore.isHidden = model.exchangeAddrType != .store view_students.isHidden = model.goodType != .course view_ticketType.isHidden = model.goodType != .ticket label_ticketType.text = model.cardType.strTitle switch model.exchangeType{ case .coin: label_exchange.text = String(format: "%ld积分", model.integral) case .cashAndCoin: label_exchange.text = String(format: "%ld积分+%@", model.integral,model.cash.currency()) case .cash: label_exchange.text = model.cash.currency() } //加载门店 if model.exchangeAddrType == .store{ Services.exchangeStoreIds(id: model.goodId, type: model.goodType).subscribe(onNext: {[weak self] data in if let models = data.data{ self?.storeModels = models } }).disposed(by: disposeBag) } if model.contents.isEmpty{ webView.loadHTMLString("暂无说明".jq_wrapHtml(), baseURL: nil) }else{ webView.loadHTMLString(model.contents.jq_wrapHtml(), baseURL: nil) } let imgs = model.pics var items = [CommonBannerModel]() for (index,img) in imgs.enumerated(){ items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl)) } bannerView.setItems(items: items) } @IBAction func chooseAction(_ sender: QMUIButton) { guard exchangeGoodsModel != nil else {return} StudentChooseView.show(itemType: .course, defaultStu: studentModels) {[weak self] studs in guard let weakSelf = self else { return } if studs.count > weakSelf.exchangeGoodsModel!.perLimit{ alert(msg: "最多选择\(weakSelf.exchangeGoodsModel!.perLimit)位运动营成员");return } self?.studentModels = studs as! [CourseDetailStudentModel] self?.updateStudenTable() } needAddClouse: { [weak self] in let vc = AddStudentVC(type: .course) self?.push(vc: vc) } } @IBAction func chooseStoreAction(_ sender: QMUIButton) { guard storeModels.count != 0 else {return} ChooseStoreView.show(models: storeModels,defaultModel: selectStoreModel) {[weak self] m in self?.selectStoreModel = m self?.label_storeName.text = m.storeName self?.view_selectStore.isHidden = false self?.view_selectStoreHei.constant = 42 UIView.animate(withDuration: 0.4) { self?.view.layoutIfNeeded() } } } @IBAction func exchangeAction(_ sender: UIButton) { guard exchangeGoodsModel != nil else {return} guard exchangeGoodsModel!.residueNum != 0 else {alert(msg: "已兑换光啦");return} // guard exchangeGoodsModel!.redeemedNum != exchangeGoodsModel!.perLimit else {alert(msg: "您已兑换光啦");return} if exchangeGoodsModel!.goodType == .course{ guard studentModels.count != 0 else {alert(msg: "请选择运动营成员");return} } if exchangeGoodsModel!.perLimit > 1{ var n = exchangeGoodsModel!.perLimit if exchangeGoodsModel!.goodType == .course{ n = floor(Double(exchangeGoodsModel!.perLimit / studentModels.count)).int } ChooseNumberView.show(maxNumber: n) {[weak self] num in self?.showExchangeUI(num: num) } }else{ showExchangeUI(num: 1) } } private func showExchangeUI(num:Int){ let attribute = AttributedStringbuilder() attribute.add(string: "确认消耗", withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: .black.withAlphaComponent(0.9)) var coin = 0 var cash:Double = 0 var totalNum = num * studentModels.count if exchangeGoodsModel?.goodType == .course{ coin = exchangeGoodsModel!.integral * totalNum cash = (exchangeGoodsModel!.cash * Double(totalNum)) }else{ coin = exchangeGoodsModel!.integral * num cash = (exchangeGoodsModel!.cash * Double(num)) } switch exchangeGoodsModel!.exchangeType{ case .cash: attribute.add(string: cash.currency(), withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexStr: "#E41818").withAlphaComponent(0.8)) case .cashAndCoin: attribute.add(string: String(format: "%ld积分和%@", coin,cash.currency()), withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexStr: "#E41818").withAlphaComponent(0.8)) case .coin: attribute.add(string: "\(coin)积分", withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexStr: "#E41818").withAlphaComponent(0.8)) } attribute.add(string: "兑换此商品吗?", withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: .black.withAlphaComponent(0.9)) CommonAlertView.show(title: "兑换商品", attribute: attribute.mutableAttributedString) {[weak self] state in guard state else {return} guard let weakSelf = self else { return } let goodsType = weakSelf.exchangeGoodsModel!.goodType var n = num if goodsType == .course{ n = num * weakSelf.studentModels.count } if weakSelf.exchangeGoodsModel!.exchangeType == .coin{ Services.exchangeOperation(exchangeType: .coin, goodsId: weakSelf.exchangeGoodsModel!.goodId, goodsType: goodsType, num: n, payType: nil, stuIds: weakSelf.studentModels.map({"\($0.id)"}).joined(separator: ","),storeId: weakSelf.selectStoreModel?.storeId).subscribe(onNext: {[weak self] data in guard let weakSelf = self else { return } let vc = PaymentResultVC(result: .success, objType: .exchange) vc.otherInfo = ["id":data.data?.returnId ?? 0,"goodsType":goodsType.rawValue] self?.push(vc: vc) self?.exchangeSuccessUI() NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) },onError: { error in if let er = error as? NetworkRequest.NetRequestError{ switch er { case .Other(_,let string): CommonAlertView.show(title: "兑换商品", content: string) { _ in if goodsType == .ticket{ view_vaildTime.isHidden = true //临时隐藏 } default: CommonAlertView.show(title: "兑换商品", content: "兑换失败") { _ in //全局隐藏,目前不需要 view_exchangeStore.isHidden = true view_selectStore.isHidden = true view_selectStoreHei.constant = 0 getData() } override func setUI() { btn_student.imagePosition = .right btn_store.imagePosition = .right webView.scrollView.isScrollEnabled = false btn_student.spacingBetweenImageAndTitle = 3 btn_store.spacingBetweenImageAndTitle = 3 tableView.delegate = self tableView.dataSource = self tableView.isScrollEnabled = false tableView.separatorStyle = .none tableView.register(UINib(nibName: "StudentInfoTCell", bundle: nil), forCellReuseIdentifier: "_StudentInfoTCell") view_banner.addSubview(bannerView) bannerView.snp.makeConstraints { make in make.edges.equalToSuperview() } } } }).disposed(by: weakSelf.disposeBag) }else { //支付金额 PaymentView.show(enumType: .goods(goodsType), money: (ali:cash,wx:cash,coin:nil,course:nil,integral:nil)) { payType in Services.exchangeOperation(exchangeType: weakSelf.exchangeGoodsModel!.exchangeType, goodsId: weakSelf.exchangeGoodsModel!.goodId, goodsType: weakSelf.exchangeGoodsModel!.goodType, num: n, payType: payType, stuIds: weakSelf.studentModels.map({"\($0.id)"}).joined(separator: ","), storeId: weakSelf.selectStoreModel?.storeId).subscribe(onNext: {[weak self] data in if let m = data.data{ switch payType { case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) {[weak self] result in guard let weakSelf = self else { return } switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .exchange) vc.otherInfo = ["id":m.returnId,"goodsType":weakSelf.exchangeGoodsModel!.goodType.rawValue] self?.push(vc: vc) self?.exchangeSuccessUI() NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) case .cancel: alert(msg: "已取消兑换") case .failure(let error): if let er = error as? NetworkRequest.NetRequestError{ switch er { case .Other(let code,let string): let vc = PaymentResultVC(result: .fail(string,code), objType: .exchange) weakSelf.push(vc: vc) default: let vc = PaymentResultVC(result: .fail("兑换失败",0), objType: .exchange) weakSelf.push(vc: vc) } } private func getData(){ if let type = goodsType{ Services.UseBenefitDetail(goodsId: id, goodsType: type).subscribe(onNext: {[weak self] data in if let model = data.data{ self?.updateData(model) } }).disposed(by: disposeBag) }else{ Services.UseBenefitDetailOne(goodsId: id).subscribe(onNext: {[weak self] data in if let model = data.data{ self?.updateData(model) } }).disposed(by: disposeBag) } updateStudenTable() } override func setRx() { self.webView.scrollView.rx.observe(CGSize.self, "contentSize").map { (size) -> CGFloat? in if let size = size{ return size.height } self?.exchangeSuccessUI() NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) } } case .wechat:break case .coin: let vc = PaymentResultVC(result: .success, objType: .exchange) vc.otherInfo = ["id":m.returnId,"goodsType":weakSelf.exchangeGoodsModel!.goodType.rawValue] self?.push(vc: vc) self?.exchangeSuccessUI() case .courseNum:break default:break } } },onError: { error in if let er = error as? NetworkRequest.NetRequestError{ switch er { case .Other(let code,let string): let vc = PaymentResultVC(result: .fail(string,code), objType: .exchange) weakSelf.push(vc: vc) default: let vc = PaymentResultVC(result: .fail("兑换失败",0), objType: .exchange) weakSelf.push(vc: vc) } } }).disposed(by: weakSelf.disposeBag) return nil }.subscribe(onNext: { [unowned self](height) in if let height = height{ self.cons_webHei.constant = height } }).disposed(by: disposeBag) } } } } private func exchangeSuccessUI(){ // btn_exchange.setTitle("已兑换", for: .normal) // btn_exchange.isEnabled = false // label_redeemedNum.text = "\(exchangeGoodsModel!.redeemedNum + 1)" // label_residueNum.text = "\(exchangeGoodsModel!.residueNum - 1)" getData() } private func updateStudenTable(){ cons_tableHei.constant = Double(studentModels.count) * 100 tableView.reloadData() } private func updateData(_ model:ExchangeGoodsModel){ exchangeGoodsModel = model label_title.text = model.goodName label_limit.text = String(format: "%@|%@", model.belongsScope.strTitle,model.exchangeAddrType.titleRaw) label_cost.isHidden = model.cost == 0 label_cost.text = String(format: "价值:%@", model.cost.currency()) label_redeemedNum.text = "\(model.redeemedNum)" label_residueNum.text = "\(model.residueNum)" label_perLimit.text = "\(model.perLimit)" label_startTime.text = "\(model.startTime)-\(model.endTime)" label_courseHours.text = "\(model.courseHours)课时" view_courseHours.isHidden = model.courseHours == 0 // self?.view_exchangeStore.isHidden = model.exchangeAddrType != .store view_students.isHidden = model.goodType != .course view_ticketType.isHidden = model.goodType != .ticket label_ticketType.text = model.cardType.strTitle switch model.exchangeType{ case .coin: label_exchange.text = String(format: "%ld积分", model.integral) case .cashAndCoin: label_exchange.text = String(format: "%ld积分+%@", model.integral,model.cash.currency()) case .cash: label_exchange.text = model.cash.currency() } //加载门店 if model.exchangeAddrType == .store{ Services.exchangeStoreIds(id: model.goodId, type: model.goodType).subscribe(onNext: {[weak self] data in if let models = data.data{ self?.storeModels = models } }).disposed(by: disposeBag) } if model.contents.isEmpty{ webView.loadHTMLString("暂无说明".jq_wrapHtml(), baseURL: nil) }else{ webView.loadHTMLString(model.contents.jq_wrapHtml(), baseURL: nil) } let imgs = model.pics var items = [CommonBannerModel]() for (index,img) in imgs.enumerated(){ items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl)) } bannerView.setItems(items: items) } @IBAction func chooseAction(_ sender: QMUIButton) { guard exchangeGoodsModel != nil else {return} StudentChooseView.show(itemType: .course, defaultStu: studentModels) {[weak self] studs in guard let weakSelf = self else { return } if studs.count > weakSelf.exchangeGoodsModel!.perLimit{ alert(msg: "最多选择\(weakSelf.exchangeGoodsModel!.perLimit)位运动营成员");return } self?.studentModels = studs as! [CourseDetailStudentModel] self?.updateStudenTable() } needAddClouse: { [weak self] in let vc = AddStudentVC(type: .course,studentInfo: nil) self?.push(vc: vc) } } @IBAction func chooseStoreAction(_ sender: QMUIButton) { guard storeModels.count != 0 else {return} ChooseStoreView.show(models: storeModels,defaultModel: selectStoreModel) {[weak self] m in self?.selectStoreModel = m self?.label_storeName.text = m.storeName self?.view_selectStore.isHidden = false self?.view_selectStoreHei.constant = 42 UIView.animate(withDuration: 0.4) { self?.view.layoutIfNeeded() } } } @IBAction func exchangeAction(_ sender: UIButton) { guard exchangeGoodsModel != nil else {return} guard exchangeGoodsModel!.residueNum != 0 else {alert(msg: "已兑换光啦");return} // guard exchangeGoodsModel!.redeemedNum != exchangeGoodsModel!.perLimit else {alert(msg: "您已兑换光啦");return} if exchangeGoodsModel!.goodType == .course{ guard studentModels.count != 0 else {alert(msg: "请选择运动营成员");return} } if exchangeGoodsModel!.perLimit > 1{ var n = exchangeGoodsModel!.perLimit if exchangeGoodsModel!.goodType == .course{ n = floor(Double(exchangeGoodsModel!.perLimit / studentModels.count)).int } ChooseNumberView.show(maxNumber: n) {[weak self] num in self?.showExchangeUI(num: num) } }else{ showExchangeUI(num: 1) } } private func showExchangeUI(num:Int){ let attribute = AttributedStringbuilder() attribute.add(string: "确认消耗", withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: .black.withAlphaComponent(0.9)) var coin = 0 var cash:Double = 0 var totalNum = num * studentModels.count if exchangeGoodsModel?.goodType == .course{ coin = exchangeGoodsModel!.integral * totalNum cash = (exchangeGoodsModel!.cash * Double(totalNum)) }else{ coin = exchangeGoodsModel!.integral * num cash = (exchangeGoodsModel!.cash * Double(num)) } switch exchangeGoodsModel!.exchangeType{ case .cash: attribute.add(string: cash.currency(), withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexStr: "#E41818").withAlphaComponent(0.8)) case .cashAndCoin: attribute.add(string: String(format: "%ld积分和%@", coin,cash.currency()), withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexStr: "#E41818").withAlphaComponent(0.8)) case .coin: attribute.add(string: "\(coin)积分", withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexStr: "#E41818").withAlphaComponent(0.8)) } attribute.add(string: "兑换此商品吗?", withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: .black.withAlphaComponent(0.9)) CommonAlertView.show(title: "兑换商品", attribute: attribute.mutableAttributedString) {[weak self] state in guard state else {return} guard let weakSelf = self else { return } let goodsType = weakSelf.exchangeGoodsModel!.goodType var n = num if goodsType == .course{ n = num * weakSelf.studentModels.count } if weakSelf.exchangeGoodsModel!.exchangeType == .coin{ Services.exchangeOperation(exchangeType: .coin, goodsId: weakSelf.exchangeGoodsModel!.goodId, goodsType: goodsType, num: n, payType: nil, stuIds: weakSelf.studentModels.map({"\($0.id)"}).joined(separator: ","),storeId: weakSelf.selectStoreModel?.storeId).subscribe(onNext: {[weak self] data in guard let weakSelf = self else { return } let vc = PaymentResultVC(result: .success, objType: .exchange) vc.otherInfo = ["id":data.data?.returnId ?? 0,"goodsType":goodsType.rawValue] self?.push(vc: vc) self?.exchangeSuccessUI() NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) },onError: { error in if let er = error as? NetworkRequest.NetRequestError{ switch er { case .Other(_,let string): CommonAlertView.show(title: "兑换商品", content: string) { _ in } default: CommonAlertView.show(title: "兑换商品", content: "兑换失败") { _ in } } } }).disposed(by: weakSelf.disposeBag) }else { //支付金额 PaymentView.show(enumType: .goods(goodsType), money: (ali:cash,wx:cash,coin:nil,course:nil,integral:nil)) { payType in Services.exchangeOperation(exchangeType: weakSelf.exchangeGoodsModel!.exchangeType, goodsId: weakSelf.exchangeGoodsModel!.goodId, goodsType: weakSelf.exchangeGoodsModel!.goodType, num: n, payType: payType, stuIds: weakSelf.studentModels.map({"\($0.id)"}).joined(separator: ","), storeId: weakSelf.selectStoreModel?.storeId).subscribe(onNext: {[weak self] data in if let m = data.data{ switch payType { case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) {[weak self] result in guard let weakSelf = self else { return } switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .exchange) vc.otherInfo = ["id":m.returnId,"goodsType":weakSelf.exchangeGoodsModel!.goodType.rawValue] self?.push(vc: vc) self?.exchangeSuccessUI() NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) case .cancel: alert(msg: "已取消兑换") case .failure(let error): if let er = error as? NetworkRequest.NetRequestError{ switch er { case .Other(let code,let string): let vc = PaymentResultVC(result: .fail(string,code), objType: .exchange) weakSelf.push(vc: vc) default: let vc = PaymentResultVC(result: .fail("兑换失败",0), objType: .exchange) weakSelf.push(vc: vc) } } self?.exchangeSuccessUI() NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) } } case .wechat: YYPaymentManager.shared.sendPaymentRequest(YYWeChatPayRequest(partnerId: m.partnerid, prepayId: m.prepayid, package: m.package, nonceStr: m.noncestr, timeStamp: m.timestamp, sign: m.sign)) {[weak self] result in guard let weakSelf = self else { return } switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .exchange) vc.otherInfo = ["id":m.returnId,"goodsType":weakSelf.exchangeGoodsModel!.goodType.rawValue] self?.push(vc: vc) self?.exchangeSuccessUI() NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) case .cancel: alert(msg: "已取消兑换") case .failure(let error): if let er = error as? NetworkRequest.NetRequestError{ switch er { case .Other(let code,let string): let vc = PaymentResultVC(result: .fail(string,code), objType: .exchange) weakSelf.push(vc: vc) default: let vc = PaymentResultVC(result: .fail("兑换失败",0), objType: .exchange) weakSelf.push(vc: vc) } } self?.exchangeSuccessUI() NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil) } } case .coin: let vc = PaymentResultVC(result: .success, objType: .exchange) vc.otherInfo = ["id":m.returnId,"goodsType":weakSelf.exchangeGoodsModel!.goodType.rawValue] self?.push(vc: vc) self?.exchangeSuccessUI() case .courseNum:break default:break } } },onError: { error in if let er = error as? NetworkRequest.NetRequestError{ switch er { case .Other(let code,let string): let vc = PaymentResultVC(result: .fail(string,code), objType: .exchange) weakSelf.push(vc: vc) default: let vc = PaymentResultVC(result: .fail("兑换失败",0), objType: .exchange) weakSelf.push(vc: vc) } } }).disposed(by: weakSelf.disposeBag) } } } } private func exchangeSuccessUI(){ // btn_exchange.setTitle("已兑换", for: .normal) // btn_exchange.isEnabled = false // label_redeemedNum.text = "\(exchangeGoodsModel!.redeemedNum + 1)" // label_residueNum.text = "\(exchangeGoodsModel!.residueNum - 1)" getData() } } extension WelfareRedeemGoodsDetailVC:UITableViewDelegate{ @@ -367,18 +393,18 @@ } extension WelfareRedeemGoodsDetailVC:UITableViewDataSource{ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfoTCell") as! StudentInfoTCell cell.indexPath = indexPath cell.studentModel = studentModels[indexPath.row] cell.deleClouse = {[weak self] index in self?.studentModels.remove(at: index) self?.updateStudenTable() } return cell } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfoTCell") as! StudentInfoTCell cell.indexPath = indexPath cell.studentModel = studentModels[indexPath.row] cell.deleClouse = {[weak self] index in self?.studentModels.remove(at: index) self?.updateStudenTable() } return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return studentModels.count } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return studentModels.count } } WanPai/Root/Yard/TCell/YardBookingTCell.swift
@@ -1,122 +1,136 @@ // // YardBookingTCell.swift // WanPai // // Created by 无故事王国 on 2023/6/20. // // // YardBookingTCell.swift // WanPai // // Created by 无故事王国 on 2023/6/20. // import UIKit import JQTools import RxSwift class YardBookingTCell: UITableViewCell { @IBOutlet weak var label_name: UILabel! @IBOutlet weak var label_typeName: UILabel! @IBOutlet weak var label_address: UILabel! @IBOutlet weak var label_bookingTime: UILabel! @IBOutlet weak var label_price: UILabel! @IBOutlet weak var label_status: UILabel! @IBOutlet weak var btn_payment: UIButton! @IBOutlet weak var btn_detail: UIButton! // @IBOutlet weak var btn_cancel: UIButton! @IBOutlet weak var label_name: UILabel! @IBOutlet weak var label_typeName: UILabel! @IBOutlet weak var label_address: UILabel! @IBOutlet weak var label_bookingTime: UILabel! @IBOutlet weak var label_price: UILabel! @IBOutlet weak var label_status: UILabel! @IBOutlet weak var btn_payment: UIButton! @IBOutlet weak var btn_detail: UIButton! // @IBOutlet weak var btn_cancel: UIButton! private var timer:Timer? var indexPath:IndexPath! private var disposeBag = DisposeBag() private var timer:Timer? var indexPath:IndexPath! private var disposeBag = DisposeBag() var yardBookingModel:YardBookingModel!{ didSet{ label_name.text = yardBookingModel.name label_typeName.text = yardBookingModel.siteTypeName label_address.text = String(format: "%@(%@)",yardBookingModel.storeName, yardBookingModel.storeAddress) label_status.text = yardBookingModel.status.titleRaw label_bookingTime.text = String(format: "预约时间:%@", yardBookingModel.appointment) btn_detail.isHidden = yardBookingModel.status == .cancel var yardBookingModel:YardBookingModel!{ didSet{ label_name.text = yardBookingModel.name label_typeName.text = yardBookingModel.siteTypeName label_address.text = String(format: "%@(%@)",yardBookingModel.storeName, yardBookingModel.storeAddress) label_status.text = yardBookingModel.status.titleRaw label_bookingTime.text = String(format: "预约时间:%@", yardBookingModel.appointment) btn_detail.isHidden = yardBookingModel.status == .cancel switch yardBookingModel.status{ case .none:break case .waitPayment: self.btn_payment.isHidden = false // self.btn_cancel.isHidden = true self.startTimer() case .pending: self.btn_payment.isHidden = true // self.btn_cancel.isHidden = false default: self.btn_payment.isHidden = true // self.btn_cancel.isHidden = true } switch yardBookingModel.status{ case .none:break case .waitPayment: self.btn_payment.isHidden = false // self.btn_cancel.isHidden = true self.startTimer() case .pending: self.btn_payment.isHidden = true // self.btn_cancel.isHidden = false default: self.btn_payment.isHidden = true // self.btn_cancel.isHidden = true } switch yardBookingModel.payType { case .aliPay,.wechat: label_price.text = yardBookingModel.payMoney.currency() case .coin: label_price.text = yardBookingModel.payMoney.int.string + "币" default:break } } } switch yardBookingModel.payType { case .aliPay,.wechat: label_price.text = yardBookingModel.payMoney.currency() case .coin: label_price.text = yardBookingModel.payMoney.int.string + "币" default:break } } } override func awakeFromNib() { super.awakeFromNib() selectionStyle = .none } override func awakeFromNib() { super.awakeFromNib() selectionStyle = .none } private func startTimer(){ timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(runTimer), userInfo: nil, repeats: true) timer?.fire() RunLoop.current.add(timer!, forMode: .common) } private func startTimer(){ timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(runTimer), userInfo: nil, repeats: true) timer?.fire() RunLoop.current.add(timer!, forMode: .common) } @objc func runTimer(){ let second = (yardBookingModel.insertTime / 1000) + 30 * 60 - Date().timeIntervalSince1970 if second <= 0{ timer?.invalidate() }else{ let arem = Date.JQ_secondToDate(interval: Int(second)) btn_payment.setTitle(String(format: "支付(%02ld:%02ld)", arem.minute,arem.second), for: .normal) } } @objc func runTimer(){ let second = (yardBookingModel.insertTime / 1000) + 30 * 60 - Date().timeIntervalSince1970 if second <= 0{ timer?.invalidate() }else{ let arem = Date.JQ_secondToDate(interval: Int(second)) btn_payment.setTitle(String(format: "支付(%02ld:%02ld)", arem.minute,arem.second), for: .normal) } } @IBAction func paymentAction(_ sender: UIButton) { Services.continuePaymentPrice(id: yardBookingModel.id).subscribe(onNext: { data in if let model = data.data{ PaymentView.show(enumType: .yard, money: (ali: model.cash, wx: model.cash, coin: model.playPaiCoin, course: nil,integral:nil)) { [weak self] paytype in guard let weakSelf = self else { return } Services.continuePayment(id: weakSelf.yardBookingModel.id, payType: paytype).subscribe(onNext: {data in if let m = data.data{ switch paytype { case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) { result in switch result { case .success: NotificationCenter.default.post(name: RefreshBooking_Noti, object: weakSelf.indexPath) let vc = PaymentResultVC(result: .success, objType: .activityApply) JQ_currentViewController().jq_push(vc: vc) case .cancel: alert(msg: "交易取消") case .failure(_): let vc = PaymentResultVC(result: .fail("交易失败",0), objType: .activityApply) JQ_currentViewController().jq_push(vc: vc) } } case .wechat,.integral:break case .coin,.free: NotificationCenter.default.post(name: RefreshBooking_Noti, object: weakSelf.indexPath) let vc = PaymentResultVC(result: .success, objType: .activityApply) JQ_currentViewController().jq_push(vc: vc) case .courseNum:break } } }).disposed(by: weakSelf.disposeBag) } } }).disposed(by: disposeBag) } @IBAction func paymentAction(_ sender: UIButton) { Services.continuePaymentPrice(id: yardBookingModel.id).subscribe(onNext: { data in if let model = data.data{ PaymentView.show(enumType: .yard, money: (ali: model.cash, wx: model.cash, coin: model.playPaiCoin, course: nil,integral:nil)) { [weak self] paytype in guard let weakSelf = self else { return } Services.continuePayment(id: weakSelf.yardBookingModel.id, payType: paytype).subscribe(onNext: {data in if let m = data.data{ switch paytype { case .wechat: YYPaymentManager.shared.sendPaymentRequest(YYWeChatPayRequest(partnerId: m.partnerid, prepayId: m.prepayid, package: m.package, nonceStr: m.noncestr, timeStamp: m.timestamp, sign: m.sign)) { result in switch result { case .success: NotificationCenter.default.post(name: RefreshBooking_Noti, object: weakSelf.indexPath) let vc = PaymentResultVC(result: .success, objType: .activityApply) JQ_currentViewController().jq_push(vc: vc) case .cancel: alert(msg: "交易取消") case .failure(_): let vc = PaymentResultVC(result: .fail("交易失败",0), objType: .activityApply) JQ_currentViewController().jq_push(vc: vc) } } case .aliPay: YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) { result in switch result { case .success: NotificationCenter.default.post(name: RefreshBooking_Noti, object: weakSelf.indexPath) let vc = PaymentResultVC(result: .success, objType: .activityApply) JQ_currentViewController().jq_push(vc: vc) case .cancel: alert(msg: "交易取消") case .failure(_): let vc = PaymentResultVC(result: .fail("交易失败",0), objType: .activityApply) JQ_currentViewController().jq_push(vc: vc) } } case .integral:break case .coin,.free: NotificationCenter.default.post(name: RefreshBooking_Noti, object: weakSelf.indexPath) let vc = PaymentResultVC(result: .success, objType: .activityApply) JQ_currentViewController().jq_push(vc: vc) case .courseNum:break } } }).disposed(by: weakSelf.disposeBag) } } }).disposed(by: disposeBag) } @IBAction func detailAction(_ sender: UIButton) { let vc = YardBookingDetailVC(model: yardBookingModel) JQ_currentNavigationController().pushViewController(vc, animated: true) } @IBAction func detailAction(_ sender: UIButton) { let vc = YardBookingDetailVC(model: yardBookingModel) JQ_currentNavigationController().pushViewController(vc, animated: true) } } WanPai/Root/Yard/VC/YardBookingDetailVC.swift
@@ -272,7 +272,19 @@ self?.push(vc: vc) } } case .wechat:break case .wechat: YYPaymentManager.shared.sendPaymentRequest(YYWeChatPayRequest(partnerId: m.partnerid, prepayId: m.prepayid, package: m.package, nonceStr: m.noncestr, timeStamp: m.timestamp, sign: m.sign)) { result in switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .activityApply) self?.push(vc: vc) case .cancel: alert(msg: "交易取消") case .failure(_): let vc = PaymentResultVC(result: .fail("交易失败",0), objType: .activityApply) JQ_currentViewController().jq_push(vc: vc) } } case .coin,.free: let vc = PaymentResultVC(result: .success, objType: .activityApply) self?.push(vc: vc) WanPai/Root/Yard/VC/YardDetailVC.swift
@@ -416,7 +416,26 @@ } } case .wechat,.integral:break case .wechat: YYPaymentManager.shared.sendPaymentRequest(YYWeChatPayRequest(partnerId: m.partnerid, prepayId: m.prepayid, package: m.package, nonceStr: m.noncestr, timeStamp: m.timestamp, sign: m.sign)) { result in switch result { case .success: NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil) let vc = YardBookingDetailVC(siteBookingId: m.siteBooking) weakSelf.push(vc: vc) case .cancel: alert(msg: "交易取消") let vc = YardBookingListVC(page: 5) weakSelf.push(vc: vc) NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil) case .failure(_): NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil) let vc = PaymentResultVC(result: .fail("交易失败",0), objType: .yard,handleVC: nil) weakSelf.push(vc: vc) } } case .integral:break case .coin,.free: NotificationCenter.default.post(name: UpdateDetailDate_Noti, object: nil) let vc = YardBookingDetailVC(siteBookingId: m.siteBooking) @@ -451,6 +470,7 @@ } } } private func showPaymentView(){