//
|
// YYSpecialCarViewController.swift
|
// OKProject
|
//
|
// Created by alvin_y on 2020/9/17.
|
// Copyright © 2020 yangwang. All rights reserved.
|
//
|
|
import UIKit
|
import RxSwift
|
import RxCocoa
|
import SwiftDate
|
class YYSpecialCarViewController: YYViewController {
|
/// 跨城下单完成的摆渡车的
|
let isCanleTye = BehaviorRelay<travelType>(value: .orderTravel)
|
/// 是否为摆渡车下单
|
var isFERRY = false
|
|
var isCarpool = false
|
|
let viewModel = YYSpecialCarViewModel()
|
|
var intervalDisposeBag = DisposeBag()
|
|
/// 投诉司机
|
lazy var button_complaint: UIButton = {
|
let button = UIButton()
|
button.setTitle("投诉司机", for: .normal)
|
button.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .regular)
|
button.setTitleColor(#colorLiteral(red: 0.4, green: 0.4, blue: 0.4, alpha: 1), for: .normal)
|
return button
|
}()
|
|
/// 投诉司机
|
lazy var item_complaint: UIBarButtonItem = {
|
return UIBarButtonItem.init(customView: button_complaint)
|
}()
|
|
/// 取消订单
|
lazy var button_canceledItem: UIButton = {
|
let button = UIButton()
|
button.setTitle("取消订单", for: .normal)
|
button.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .regular)
|
button.setTitleColor(#colorLiteral(red: 0.4, green: 0.4, blue: 0.4, alpha: 1), for: .normal)
|
return button
|
}()
|
|
/// 取消订单
|
lazy var item_canceled: UIBarButtonItem = {
|
return UIBarButtonItem.init(customView: button_canceledItem)
|
}()
|
|
/// 流程
|
lazy var vc_flow: YYSpecialCarFlowViewController = {
|
let vc = YYSpecialCarFlowViewController(viewModel: self.viewModel)
|
vc.isCanleTye.accept(self.isCanleTye.value)
|
vc.didPressRefresh.delegate(on: self) { (self, _) in
|
self.getOrderDetails()
|
}
|
vc.complainDriverBlock = {
|
// 投诉司机
|
guard let driverId = self.viewModel.dataSource.value?.driverId else{return}
|
let vc = storyBoard(name: "Home", identifier: "TravelServiceCancelVC") as! TravelServiceCancelVC
|
vc.orderId = self.viewModel.orderId.value
|
vc.driverId = driverId
|
vc.state.accept(.complaints)
|
vc.orderType = self.viewModel.orderType.value
|
self.yy_push(vc: vc)
|
}
|
return vc
|
}()
|
|
|
/// 流程
|
lazy var vc_carpooling_flow: YYSpecialCarpoolingCarFlowViewController = {
|
let vc = YYSpecialCarpoolingCarFlowViewController(viewModel: self.viewModel)
|
vc.isCanleTye.accept(self.isCanleTye.value)
|
vc.didPressRefresh.delegate(on: self) { (self, _) in
|
self.getOrderDetails()
|
}
|
vc.complainDriverBlock = {
|
// 投诉司机
|
guard let driverId = self.viewModel.dataSource.value?.driverId else{return}
|
let vc = storyBoard(name: "Home", identifier: "TravelServiceCancelVC") as! TravelServiceCancelVC
|
vc.orderId = self.viewModel.orderId.value
|
vc.driverId = driverId
|
vc.state.accept(.complaints)
|
vc.orderType = self.viewModel.orderType.value
|
self.yy_push(vc: vc)
|
}
|
return vc
|
}()
|
|
/// 支付
|
lazy var vc_payment: YYSpecialCarPaymentViewController = {
|
let vc = YYSpecialCarPaymentViewController(viewModel: self.viewModel)
|
vc.didPressRefresh.delegate(on: self) { (self, _) in
|
self.getOrderDetails()
|
}
|
return vc
|
}()
|
|
/// 评价
|
lazy var vc_comment: YYSpecialCarCommentViewController = {
|
let vc = YYSpecialCarCommentViewController(viewModel: self.viewModel)
|
vc.didPressRefresh.delegate(on: self) { (self, _) in
|
self.getOrderDetails()
|
}
|
return vc
|
}()
|
|
/// 取消
|
lazy var vc_canceled: YYSpecialCarCanceledViewController = {
|
let vc = YYSpecialCarCanceledViewController(viewModel: self.viewModel)
|
vc.didPressRefresh.delegate(on: self) { (self, _) in
|
self.getOrderDetails()
|
}
|
return vc
|
}()
|
|
/// 取消没有司机
|
lazy var vc_canceledNoDriver: YYSpecialCarCanceledNoDriverViewController = {
|
let vc = YYSpecialCarCanceledNoDriverViewController(viewModel: self.viewModel)
|
return vc
|
}()
|
|
|
|
/// 预约
|
lazy var vc_appointment: YYSpecialCarAppointmentViewController = {
|
let vc = YYSpecialCarAppointmentViewController(viewModel: self.viewModel)
|
return vc
|
}()
|
|
|
|
var timerDisposeBag = DisposeBag()
|
|
/// 当前显示的控制器
|
var vc_current: UIViewController?
|
|
/// 无人接单提示
|
weak var popupView: YYPopupView?
|
|
init(orderId: Int,orderType:OrderType? = .special,isCarpool:Bool = false) {
|
super.init(nibName: nil, bundle: nil)
|
self.isCarpool = isCarpool
|
self.viewModel.orderId.accept(orderId)
|
self.viewModel.orderType.accept(orderType!)
|
}
|
|
required init?(coder aDecoder: NSCoder) {
|
fatalError("init(coder:) has not been implemented")
|
}
|
|
override func viewDidLoad() {
|
super.viewDidLoad()
|
|
// Do any additional setup after loading the view.
|
getOrderDetails()
|
queryOrderServer()
|
yy_popBlock = { [unowned self] in
|
for item in (self.navigationController?.viewControllers)! {
|
if item.isKind(of: MyOrderListVC.classForCoder()){
|
let owr = item
|
self.navigationController?.popToViewController(owr, animated: true)
|
return
|
}
|
}
|
self.yy_popToRoot()
|
}
|
}
|
|
override func viewWillAppear(_ animated: Bool) {
|
super.viewWillAppear(animated)
|
intervalDisposeBag = DisposeBag()
|
// 定时获取订单信息
|
Observable<Int>.interval(RxTimeInterval.seconds(6), scheduler: MainScheduler.instance)
|
.subscribe(onNext: { [unowned self](_) in
|
if !YYSocketManager.shared().isRunning(){
|
self.queryOrderServer()
|
self.getOrderDetails()
|
if isCarpool{
|
self.vc_carpooling_flow.queryEndPush()
|
|
}else{
|
self.vc_flow.queryEndPush()
|
}
|
}
|
}).disposed(by: intervalDisposeBag)
|
}
|
|
override func viewDidDisappear(_ animated: Bool) {
|
super.viewDidDisappear(animated)
|
intervalDisposeBag = DisposeBag()
|
}
|
|
//MARK: - UI
|
override func setupViews() {
|
super.setupViews()
|
|
if isCarpool{
|
addChildViewController(vc_carpooling_flow, toContainerView: view)
|
vc_current = vc_carpooling_flow
|
}else{
|
addChildViewController(vc_flow, toContainerView: view)
|
vc_current = vc_flow
|
}
|
|
addChild(vc_payment)
|
|
addChild(vc_comment)
|
|
addChild(vc_canceled)
|
|
addChild(vc_canceledNoDriver)
|
|
addChild(vc_appointment)
|
}
|
|
/// 订单详情
|
func getOrderDetails() {
|
viewModel.getOrderDetails()
|
.subscribe(onNext: {[unowned self] (result) in
|
switch result{
|
case .success(let data):
|
guard let data = data,let state = SpecialCarState(rawValue: data.state) else {return}
|
self.viewModel.travelTime.accept(data.travelTime1)
|
self.viewModel.dataSource.accept(data)
|
self.viewModel.state.accept(state)
|
self.viewModel.cancelId.accept(data.cancelId)
|
self.viewModel.orderTime.accept(data.insertTime)
|
self.viewModel.orderType.accept(OrderType(rawValue: data.orderType) ?? .special)
|
break
|
case .failure(let error):
|
YYAlertKit.display(message: error.localizedDescription)
|
break
|
}
|
})
|
.disposed(by: disposeBag)
|
}
|
|
deinit {
|
NotificationCenter.default.removeObserver(self)
|
}
|
|
override func bindRx() {
|
super.bindRx()
|
|
// 获取订单信息
|
YYSocketManager.shared()
|
.orderInfosubject
|
.subscribe(onNext: {[unowned self] (r) in
|
guard let data = r.data else{return}
|
if r.method == "FERRY"{
|
self.isFERRY = true
|
self.viewModel.orderId.accept(data.orderId)
|
self.viewModel.orderType.accept(OrderType(rawValue: data.orderType) ?? .special)
|
self.getOrderDetails()
|
return
|
}else if r.method == "REASSIGN"{
|
self.getOrderDetails()
|
return
|
}
|
|
if data.orderId == self.viewModel.dataSource.value?.orderId{
|
guard let model = self.viewModel.dataSource.value else{return}
|
// if self.viewModel.orderType.value.parame() == 3 {
|
// 跨城
|
if data.state < 7{
|
if data.state == 4{
|
if self.viewModel.dataSource.value?.arriveTime == ""{
|
self.getOrderDetails()
|
}
|
}
|
if model.driverId == 0{
|
self.getOrderDetails()
|
}
|
model.state = data.state
|
self.viewModel.state.accept(SpecialCarState(rawValue: data.state) ?? .witingForResponse)
|
self.queryOrderServer()
|
}else{
|
self.getOrderDetails()
|
self.queryOrderServer()
|
}
|
// }
|
// else if data.orderType == self.viewModel.orderType.value.parame(){
|
// if data.state < 7{
|
// if data.state == 4{
|
// if self.viewModel.dataSource.value?.arriveTime == ""{
|
// self.getOrderDetails()
|
// }
|
// }
|
// if model.driverId == 0{
|
// self.getOrderDetails()
|
// }
|
// model.state = data.state
|
// self.viewModel.state.accept(SpecialCarState(rawValue: data.state) ?? .witingForResponse)
|
// self.queryOrderServer()
|
// }else{
|
// self.getOrderDetails()
|
// self.queryOrderServer()
|
// }
|
//
|
// }
|
}
|
|
// if data.orderId == self.viewModel.dataSource.value?.orderId && data.orderType == self.viewModel.orderType.value.parame(){
|
// guard let model = self.viewModel.dataSource.value else{return}
|
// if data.state < 7{
|
// if data.state == 4{
|
// if self.viewModel.dataSource.value?.arriveTime == ""{
|
// self.getOrderDetails()
|
// }
|
// }
|
// if model.driverId == 0{
|
// self.getOrderDetails()
|
// }
|
// model.state = data.state
|
// self.viewModel.state.accept(SpecialCarState(rawValue: data.state) ?? .witingForResponse)
|
// self.queryOrderServer()
|
// }else{
|
// self.getOrderDetails()
|
// self.queryOrderServer()
|
// }
|
// }
|
}).disposed(by: disposeBag)
|
|
|
|
/// 监听当前状态改变显示
|
viewModel.state
|
.subscribeOn(MainScheduler.instance)
|
.subscribe(onNext: { [unowned self] (state) in
|
switch state {
|
case .witingForResponse:
|
self.title = "等待应答"
|
self.navigationItem.rightBarButtonItem = nil
|
if isCarpool{
|
self.switchCurrentViewController(to: self.vc_carpooling_flow)
|
}else{
|
self.switchCurrentViewController(to: self.vc_flow)
|
}
|
case .driverReaydToGo, .witingForPickUp:
|
// 判断是否预约单
|
if let travelTime = self.viewModel.travelTime.value?.toDate(fromFormat: "yyyy-MM-dd HH:mm:ss"){
|
if travelTime > Date().localDate() + 30.minutes{
|
self.title = "等待接驾"
|
self.navigationItem.rightBarButtonItem = self.item_canceled
|
self.switchCurrentViewController(to: self.vc_appointment)
|
self.fireWaitingForResponseTimer()
|
}else{
|
self.title = "等待接驾"
|
self.navigationItem.rightBarButtonItem = self.item_canceled
|
if isCarpool{
|
self.switchCurrentViewController(to: self.vc_carpooling_flow)
|
}else{
|
self.switchCurrentViewController(to: self.vc_flow)
|
}
|
}
|
}else{
|
self.title = "等待接驾"
|
self.navigationItem.rightBarButtonItem = self.item_canceled
|
if isCarpool{
|
self.switchCurrentViewController(to: self.vc_carpooling_flow)
|
}else{
|
self.switchCurrentViewController(to: self.vc_flow)
|
}
|
}
|
case .driverArrived:
|
self.title = "司机已到达"
|
self.navigationItem.rightBarButtonItem = self.item_canceled
|
if isCarpool{
|
self.switchCurrentViewController(to: self.vc_carpooling_flow)
|
}else{
|
self.switchCurrentViewController(to: self.vc_flow)
|
}
|
case .serving, .waitingForConfirmCost:
|
self.title = "服务中"
|
// 设置投诉按钮
|
self.navigationItem.rightBarButtonItem = self.item_canceled
|
self.vc_flow.view_travel.complain_driverBt.isHidden = false
|
if self.viewModel.orderType.value == .travel{
|
self.navigationItem.rightBarButtonItem = self.item_complaint
|
self.vc_flow.view_travel.complain_driverBt.isHidden = true
|
}
|
if isCarpool{
|
self.switchCurrentViewController(to: self.vc_carpooling_flow)
|
}else{
|
self.switchCurrentViewController(to: self.vc_flow)
|
}
|
case .waitingForPayment:
|
self.title = "支付费用"
|
self.navigationItem.rightBarButtonItem = self.item_complaint
|
self.switchCurrentViewController(to: self.vc_payment)
|
case .waitingForComment:
|
self.title = "已完成"
|
self.navigationItem.rightBarButtonItem = self.item_complaint
|
self.vc_comment.isFERRY = self.isFERRY
|
self.switchCurrentViewController(to: self.vc_comment)
|
case .completed:
|
self.title = "已完成"
|
self.navigationItem.rightBarButtonItem = self.item_complaint
|
self.vc_comment.isFERRY = self.isFERRY
|
self.switchCurrentViewController(to: self.vc_comment)
|
case .canceled:
|
self.navigationItem.rightBarButtonItem = nil
|
if self.viewModel.dataSource.value?.driverId == 0{
|
self.title = "订单详情"
|
self.switchCurrentViewController(to: self.vc_canceledNoDriver)
|
}else{
|
//75029 [拼车]在司机接单后一定时间内取消订单支付费用后停留在支付完界面,不显示其他界面
|
self.title = "已取消"
|
self.switchCurrentViewController(to: self.vc_canceled)
|
}
|
case .canceledWaitingForPayment:
|
self.title = "支付费用"
|
self.navigationItem.rightBarButtonItem = nil
|
self.switchCurrentViewController(to: self.vc_payment)
|
case .reassign:
|
break
|
}
|
})
|
.disposed(by: disposeBag)
|
|
|
/// 投诉
|
button_complaint.rx.tap
|
.subscribe(onNext: { [unowned self] (_) in
|
guard let driverId = self.viewModel.dataSource.value?.driverId else{return}
|
let vc = storyBoard(name: "Home", identifier: "TravelServiceCancelVC") as! TravelServiceCancelVC
|
vc.orderId = self.viewModel.orderId.value
|
vc.driverId = driverId
|
vc.state.accept(.complaints)
|
vc.orderType = self.viewModel.orderType.value
|
self.yy_push(vc: vc)
|
})
|
.disposed(by: disposeBag)
|
|
/// 取消订单
|
button_canceledItem.rx.tap
|
.subscribe(onNext: {[unowned self] (_) in
|
if self.viewModel.orderType.value == .travel {
|
let vc = storyBoard(name: "Home", identifier: "TravelServiceCancelVC") as! TravelServiceCancelVC
|
vc.orderType = self.viewModel.orderType.value
|
vc.orderId = self.viewModel.orderId.value
|
vc.didPressPay.delegate(on: self) { (self,arge) in
|
let (money,cancleId) = arge
|
self.navigationItem.rightBarButtonItem?.customView?.isHidden = true
|
self.getOrderDetails()
|
self.viewModel.amount.accept(money)
|
self.viewModel.cancelId.accept(cancleId)
|
}
|
self.yy_push(vc: vc)
|
return
|
}
|
|
if self.viewModel.dataSource.value?.state == 1{ // 司机未接单 直接取消
|
|
if isCarpool{
|
self.vc_carpooling_flow.queryCancleAmount()
|
}else{
|
self.vc_flow.queryCancleAmount()
|
}
|
}else{ // 司机已接单 判断需不需要付费
|
let vc = storyBoard(name: "Home", identifier: "TravelServiceCancelVC") as! TravelServiceCancelVC
|
vc.orderType = self.viewModel.orderType.value
|
vc.orderId = self.viewModel.orderId.value
|
vc.didPressPay.delegate(on: self) { (self,arge) in
|
let (money,cancleId) = arge
|
self.navigationItem.rightBarButtonItem?.customView?.isHidden = true
|
self.getOrderDetails()
|
self.viewModel.amount.accept(money)
|
self.viewModel.cancelId.accept(cancleId)
|
}
|
self.yy_push(vc: vc)
|
}
|
// }
|
})
|
.disposed(by: disposeBag)
|
}
|
|
|
/// 司机信息
|
func queryOrderServer() {
|
viewModel.queryOrderServer().subscribe(onNext: {[unowned self] (result) in
|
switch result{
|
case .success(let data):
|
guard let data = data else {return}
|
self.viewModel.driverInfo.accept(data)
|
break
|
case .failure(let error):
|
YYAlertKit.display(message: error.localizedDescription)
|
self.intervalDisposeBag = DisposeBag()
|
break
|
}
|
}) { error in
|
self.intervalDisposeBag = DisposeBag()
|
}.disposed(by: disposeBag)
|
|
}
|
|
//MARK: - 计时器模块
|
/// 启动等待应答倒计时
|
func fireWaitingForResponseTimer() {
|
timerDisposeBag = DisposeBag()
|
Observable<Int>.interval(RxTimeInterval.seconds(1), scheduler: MainScheduler.instance)
|
.subscribe(onNext: { [unowned self] (seconds) in
|
if let travelTime = self.viewModel.travelTime.value?.toDate(fromFormat: "yyyy-MM-dd HH:mm:ss"){
|
if travelTime < Date() + 30.minutes{
|
self.getOrderDetails()
|
self.timerDisposeBag = DisposeBag()
|
}
|
}
|
})
|
.disposed(by: timerDisposeBag)
|
}
|
|
|
func switchCurrentViewController(to: UIViewController) {
|
|
let from = self.vc_current!
|
|
guard from != to else { return }
|
self.vc_current = to
|
to.view.frame = view.bounds
|
self.transition(from: from, to: to, duration: 0.3, options: .transitionCrossDissolve, animations: nil, completion: nil)
|
}
|
|
}
|