//
|
// ThanksDriverView.swift
|
// OKProject
|
//
|
// Created by 无故事王国 on 2022/2/16.
|
// Copyright © 2022 yangwang. All rights reserved.
|
//
|
|
import UIKit
|
import RxRelay
|
import IQKeyboardManager
|
import RxSwift
|
import RxCocoa
|
|
|
class ThanksDriverView: UIView,NIBLoadable{
|
|
@IBOutlet weak var titleL: UILabel!
|
@IBOutlet weak var containerView: UIView!
|
@IBOutlet weak var fiveBtn: UIButton!
|
@IBOutlet weak var twoBtn: UIButton!
|
@IBOutlet weak var tenBtn: UIButton!
|
@IBOutlet weak var otherMoneyField: YYTextField!
|
@IBOutlet weak var wechatBtn: UIButton!
|
@IBOutlet weak var aliBtn: UIButton!
|
@IBOutlet weak var balanceBtn: UIButton!
|
@IBOutlet weak var safeBottom: NSLayoutConstraint!
|
@IBOutlet weak var paymentBtn: UIButton!
|
@IBOutlet weak var balanceL: UILabel!
|
|
var btns = [UIButton]()
|
var btns1 = [UIButton]()
|
|
private let paymentType = BehaviorRelay<PayTypeNormal>(value: .balance)
|
private let paymentMoney = BehaviorRelay<Double>(value: 0)
|
private var orderId:Int!
|
private var orderType:OrderType!
|
private var refreshClouse:(()->Void)?
|
private let travelServicePayViewModel = TravelServicePayViewModel()
|
private var queryBalanceModel:QueryBalanceModel?
|
|
override func awakeFromNib() {
|
super.awakeFromNib()
|
alpha = 0
|
bindRx()
|
containerView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
|
btns = [fiveBtn,twoBtn,tenBtn]
|
btns1 = [wechatBtn,aliBtn,balanceBtn]
|
otherMoneyField.delegate = self
|
|
|
}
|
|
private func bindRx(){
|
otherMoneyField.rx.controlEvent(.editingDidBegin).subscribe(onNext: {[weak self] (_) in
|
guard let weakSelf = self else { return }
|
for btn in weakSelf.btns {
|
btn.isSelected = false
|
btn.backgroundColor = UIColor(hexString: "#EDEFED")
|
}
|
}).disposed(by: rx.disposeBag)
|
|
otherMoneyField.rx.controlEvent(.editingDidEnd).subscribe(onNext: {[weak self] (_) in
|
guard let weakSelf = self else { return }
|
let price = weakSelf.otherMoneyField.text ?? "0"
|
guard !price.isEmpty else {return}
|
weakSelf.paymentMoney.accept(Double(price)!)
|
}).disposed(by: rx.disposeBag)
|
|
paymentType.subscribe(onNext: { type in
|
|
}).disposed(by: rx.disposeBag)
|
|
|
NotificationCenter.default.rx.notification(UIWindow.keyboardWillShowNotification, object: nil).takeUntil(self.rx.deallocated).subscribe { _ in
|
self.safeBottom.constant = 20
|
UIView.animate(withDuration: 0.3) {
|
self.layoutIfNeeded()
|
}
|
}.disposed(by: rx.disposeBag)
|
|
NotificationCenter.default.rx.notification(UIWindow.keyboardWillHideNotification, object: nil).takeUntil(self.rx.deallocated).subscribe { _ in
|
self.safeBottom.constant = 0
|
UIView.animate(withDuration: 0.3) {
|
self.layoutIfNeeded()
|
}
|
}.disposed(by: rx.disposeBag)
|
|
paymentMoney.subscribe { [weak self]value in
|
guard let weakSelf = self else { return }
|
weakSelf.paymentBtn.setTitle(String(format: "立即支付%@元", (value.element ?? 0).ld_formatFloat), for: .normal)
|
}.disposed(by: rx.disposeBag)
|
|
travelServicePayViewModel.requestSubject.subscribeOn(MainScheduler.instance).subscribe(onNext: { [unowned self](status) in
|
switch status{
|
case .loading:break
|
case .success(let model):
|
alretDismiss()
|
if self.paymentType.value == .balance{
|
alert(text: "支付成功")
|
UIView.animate(withDuration: 0.4) {
|
self.alpha = 0
|
self.containerView.y = ScreenHeight
|
} completion: { _ in
|
self.refreshClouse?()
|
self.removeFromSuperview()
|
}
|
}else{
|
guard let data = model as? PayModel else{return}
|
if self.paymentType.value == .ali{
|
// 调起微信支付宝
|
let request = PayModel(orderString: data.orderString)
|
YYPaymentManager.shared.sendPaymentRequest(request) { (result) in
|
switch result {
|
case .success:
|
alert(text: "支付成功")
|
UIView.animate(withDuration: 0.4) {
|
self.alpha = 0
|
self.containerView.y = ScreenHeight
|
} completion: { _ in
|
self.refreshClouse?()
|
self.removeFromSuperview()
|
}
|
case .cancel:
|
alert(text: "支付取消")
|
|
case .failure(let error):
|
alert(text: error.localizedDescription)
|
}
|
}
|
}else if self.paymentType.value == .weChat{
|
let wechatPayRequest = YYWeChatPayRequest(partnerId: data.partnerid, prepayId: data.prepayid, package: data.package, nonceStr: data.noncestr, timeStamp: TimeInterval(data.timestamp) ?? 0, sign: data.sign)
|
YYPaymentManager.shared.sendPaymentRequest(wechatPayRequest) { result in
|
switch result {
|
case .success:
|
alert(text: "支付成功")
|
UIView.animate(withDuration: 0.4) {
|
self.alpha = 0
|
self.containerView.y = ScreenHeight
|
} completion: { _ in
|
self.refreshClouse?()
|
self.removeFromSuperview()
|
}
|
case .cancel:
|
alert(text: "支付取消")
|
case .failure(let error):
|
alert(text: error.localizedDescription)
|
}
|
}
|
}
|
}
|
case.error(let error):
|
alretDismiss()
|
alert(text: error.localizedDescription)
|
break
|
}
|
}).disposed(by: rx.disposeBag)
|
|
travelServicePayViewModel.queryBalanceSubject.subscribe(onNext: {[unowned self](status) in
|
switch status{
|
case .loading:break
|
case .success(let model):
|
guard let data = model as? QueryBalanceModel else{return}
|
self.queryBalanceModel = data
|
self.balanceL.text = "余额(余额\(data.balance)元)"
|
break
|
case .error(_):break
|
}
|
}) { error in
|
|
}.disposed(by: rx.disposeBag)
|
}
|
|
@discardableResult
|
static func show(orderId:Int,orderType:OrderType,clouse:@escaping ()->Void)->ThanksDriverView{
|
let thanksDriverView = ThanksDriverView.loadViewFromNib()
|
thanksDriverView.orderId = orderId
|
thanksDriverView.orderType = orderType
|
thanksDriverView.refreshClouse = clouse
|
if orderType == .charter{
|
thanksDriverView.titleL.text = "感谢平台"
|
}
|
thanksDriverView.travelServicePayViewModel.orderType.accept(orderType)
|
thanksDriverView.travelServicePayViewModel.orderId.accept(orderId)
|
thanksDriverView.travelServicePayViewModel.queryBalance()
|
thanksDriverView.frame = CGRect(x: 0, y: 0, width: screenW, height: screenH)
|
app.window?.addSubview(thanksDriverView)
|
UIView.animate(withDuration: 0.3) {
|
thanksDriverView.alpha = 1
|
thanksDriverView.containerView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
|
} completion: { (_) in
|
}
|
return thanksDriverView
|
}
|
|
@IBAction func chooseMoneyAction(_ sender: UIButton) {
|
endEditing(true)
|
otherMoneyField.text = ""
|
for btn in btns {
|
if btn.tag == sender.tag{
|
btn.isSelected = true
|
btn.backgroundColor = UIColor(hexString: "#00BF30")
|
}else{
|
btn.isSelected = false
|
btn.backgroundColor = UIColor(hexString: "#EDEFED")
|
}
|
}
|
|
switch sender.tag {
|
case 10:
|
paymentMoney.accept(2)
|
case 11:
|
paymentMoney.accept(5)
|
case 12:
|
paymentMoney.accept(10)
|
default:break
|
}
|
}
|
|
@IBAction func thansPaymentAction(_ sender: UIButton) {
|
|
if paymentMoney.value == 0{
|
alert(text: "请选择或输入金额");return
|
}
|
|
if queryBalanceModel == nil{
|
travelServicePayViewModel.queryBalance()
|
alert(text: "获取余额失败,请稍后再试");return
|
}
|
|
if paymentMoney.value > self.queryBalanceModel?.balance ?? 0{
|
alert(text: "余额不足");return
|
}
|
|
travelServicePayViewModel.payThanksOrder(money: paymentMoney.value, orderType: orderType, payType: paymentType.value)
|
}
|
|
@IBAction func paymentAction(_ sender: UIButton) {
|
for btn in btns1 {
|
btn.isSelected = false
|
}
|
sender.isSelected = true
|
switch sender.tag {
|
case 20:
|
paymentType.accept(.weChat)
|
case 21:
|
paymentType.accept(.ali)
|
case 22:
|
paymentType.accept(.balance)
|
default:break
|
}
|
}
|
|
|
|
@IBAction func closeAction(_ sender: UIButton) {
|
UIView.animate(withDuration: 0.4) {
|
self.alpha = 0
|
self.containerView.y = ScreenHeight
|
} completion: { _ in
|
self.removeFromSuperview()
|
}
|
}
|
}
|
|
extension ThanksDriverView:UITextFieldDelegate{
|
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
|
// 前面的判断都是正确滴 不需要改动 在最后面加位数限制
|
var Digits = 5
|
if textField == otherMoneyField {
|
Digits = 4
|
}
|
if textField.text?.contains(".") == false && string != "" && string != "."{
|
if (textField.text?.length)! > Digits{
|
return false
|
}
|
}
|
|
let scanner = Scanner(string: string)
|
let numbers : NSCharacterSet
|
let pointRange = (textField.text! as NSString).range(of: ".")
|
|
if (pointRange.length > 0) && pointRange.length < range.location || pointRange.location > range.location + range.length {
|
numbers = NSCharacterSet(charactersIn: "0123456789.")
|
}else{
|
numbers = NSCharacterSet(charactersIn: "0123456789.")
|
}
|
|
if textField.text == "" && string == "." {
|
return false
|
}
|
|
let remain = 2
|
|
let tempStr = textField.text!.appending(string)
|
|
let strlen = tempStr.length
|
|
if pointRange.length > 0 && pointRange.location > 0{//判断输入框内是否含有“.”。
|
if string == "." {
|
return false
|
}
|
|
if strlen > 0 && (strlen - pointRange.location) > remain + 1 {//当输入框内已经含有“.”,当字符串长度减去小数点前面的字符串长度大于需要要保留的小数点位数,则视当次输入无效。
|
return false
|
}
|
}
|
|
let zeroRange = (textField.text! as NSString).range(of: "0")
|
if zeroRange.length == 1 && zeroRange.location == 0 { //判断输入框第一个字符是否为“0”
|
if !(string == "0") && !(string == ".") && textField.text?.length == 1 {//当输入框只有一个字符并且字符为“0”时,再输入不为“0”或者“.”的字符时,则将此输入替换输入框的这唯一字符。
|
textField.text = string
|
return false
|
}else {
|
if pointRange.length == 0 && pointRange.location > 0 {//当输入框第一个字符为“0”时,并且没有“.”字符时,如果当此输入的字符为“0”,则视当此输入无效。
|
if string == "0" {
|
return false
|
}
|
}
|
}
|
}
|
// let buffer : NSString!
|
if !scanner.scanCharacters(from: numbers as CharacterSet, into: nil) && string.length != 0 {
|
return false
|
}
|
return true
|
}
|
}
|