//
|
// TravelServiceViewModel.swift
|
// OKProject
|
//
|
// Created by alvin_y on 2020/6/8.
|
// Copyright © 2020 yangwang. All rights reserved.
|
//
|
|
import UIKit
|
import RxSwift
|
import RxCocoa
|
import SwiftDate
|
import AMapSearchKit
|
class TravelServiceViewModel: YYViewModel {
|
|
/// 订单Id
|
let orderId = BehaviorRelay<Int>(value: 0)
|
|
/// 出行方式
|
let orderType = BehaviorRelay<OrderType>(value: .taxi)
|
|
/// 取消原因
|
let reason = BehaviorRelay<String?>(value: nil)
|
|
/// 取消备注
|
let remark = BehaviorRelay<String?>(value: nil)
|
|
/// 数据源
|
let data = BehaviorRelay<TravelServiceModel?>(value: nil)
|
|
/// 订单状态
|
let state = BehaviorRelay<Int>(value: 0)
|
|
/// 支付方式(0=其他方式,1=微信,2=支付宝)
|
let payType = BehaviorRelay<Int?>(value: nil)
|
|
/// 取消订单Id
|
let cancelId = BehaviorRelay<Int>(value: 0)
|
|
/// 取消订单Subject
|
let cancleOrderTaxiSubject = PublishSubject<RequestStatus>()
|
|
/// 评价
|
let evaluateSubject = PublishSubject<RequestStatus>()
|
|
/// 查询是否有红包
|
let queryRedMoneySubject = PublishSubject<RequestStatus>()
|
|
/// 继续等待订单
|
let pushOrderTaxiTaxiSubject = PublishSubject<RequestStatus>()
|
|
/// 取消订单获取金额
|
let queryCancleAmountSubject = PublishSubject<RequestStatus>()
|
|
/// 分享红包
|
let shareRedEnvelopeSubject = PublishSubject<RequestStatus>()
|
|
/// 获取没有司机接单的提醒数据
|
let queryEndPushSubject = PublishSubject<RequestStatus>()
|
|
/// 取消订单需要支付金额
|
let amount = BehaviorRelay<Double>(value: 0)
|
|
/// 投诉
|
let complaintSubject = PublishSubject<RequestStatus>()
|
|
/// 添加取消记录
|
let addCancleSubject = PublishSubject<RequestStatus>()
|
|
/// 评分
|
let fraction = BehaviorRelay<Int>(value: 0)
|
|
/// 评价内容
|
let content = BehaviorRelay<String?>(value: nil)
|
|
/// 司机信息
|
let driverInfo = BehaviorRelay<SocketInfoModel?>(value: nil)
|
|
/// 司机Id
|
let driverId = BehaviorRelay<Int>(value: 0)
|
|
/// 手动完成订单
|
let completeOrderSubject = PublishSubject<RequestStatus>()
|
|
/// Subject
|
let queryTrackSubject = PublishSubject<RequestStatus>()
|
|
/// 轨迹
|
let track = BehaviorRelay<[TrackModel]>(value: [])
|
|
/// 分享红包金额
|
let shareRedEnvelopeAmount = BehaviorRelay<Double>(value: 0)
|
|
/// 获取订单轨迹坐标
|
func queryTrack() {
|
queryTrackSubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.queryTrack(orderId: orderId.value, orderType: orderType.value.rawValue))
|
.map(YYModel<[TrackModel]>.self)
|
.validate()
|
.subscribe(onSuccess: { [unowned self] (model) in
|
guard model.data != nil else {return}
|
self.track.accept(model.data!)
|
self.queryTrackSubject.onNext(.success(model.data))
|
}) { (error) in
|
self.queryTrackSubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
/// 获取详情
|
func queryOrderInfo() {
|
APIManager.shared.provider.rx
|
.request(.queryOrderInfo(orderId: orderId.value, orderType: orderType.value.rawValue))
|
.map(YYModel<TravelServiceModel>.self)
|
.validate()
|
.subscribe(onSuccess: { (model) in
|
guard let data = model.data else{return}
|
self.state.accept(data.state)
|
self.data.accept(data)
|
}) { (error) in
|
}
|
.disposed(by: disposeBag)
|
}
|
|
/// 取消订单
|
func cancleOrderTaxi() {
|
cancleOrderTaxiSubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.cancleOrderTaxi(cancleId: cancelId.value, id: orderId.value,orderType: orderType.value.rawValue, payType: payType.value))
|
.map(YYModel<PayModel>.self)
|
.validate()
|
.subscribe(onSuccess: { [unowned self] (model) in
|
self.cancleOrderTaxiSubject.onNext(.success(model.data))
|
}) { [unowned self](error) in
|
self.cancleOrderTaxiSubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
/// 添加取消记录
|
func addCancle() {
|
addCancleSubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.addCancle(id: orderId.value, orderType: orderType.value.rawValue, reason: reason.value, remark: remark.value))
|
.map(YYModel<SystemMessageModel>.self)
|
.validate()
|
.subscribe(onSuccess: { [unowned self] (model) in
|
guard let data = model.data else{return}
|
self.cancelId.accept(data.id)
|
self.addCancleSubject.onNext(.success(nil))
|
}) { [unowned self](error) in
|
self.addCancleSubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
/// 获取司机位置
|
func queryOrderServer() {
|
APIManager.shared.provider.rx
|
.request(.queryOrderServer(orderId: self.orderId.value, orderType: orderType.value.rawValue))
|
.map(YYModel<SocketInfoModel>.self)
|
.validate()
|
.subscribe(onSuccess: { (model) in
|
guard let data = model.data else{return}
|
if data.orderType == self.orderType.value.rawValue{
|
self.driverInfo.accept(data)
|
}
|
}) { (error) in
|
}
|
.disposed(by: disposeBag)
|
}
|
|
/// 评价
|
func orderEvaluate() {
|
evaluateSubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.orderEvaluate(orderId: self.orderId.value, orderType: orderType.value.rawValue, fraction: fraction.value, content: content.value))
|
.map(YYModel<Nothing>.self)
|
.validate()
|
.subscribe(onSuccess: {[unowned self] (model) in
|
self.evaluateSubject.onNext(.success(nil))
|
}) { (error) in
|
self.evaluateSubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
/// 查询是否有红包
|
func queryRedMoney() {
|
queryRedMoneySubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.queryRedMoney(orderId: orderId.value, orderType: orderType.value.rawValue))
|
.map(YYModel<CancleAmountModel>.self)
|
.validate()
|
.subscribe(onSuccess: {[unowned self] (model) in
|
self.queryRedMoneySubject.onNext(.success(model.data))
|
}) { (error) in
|
self.queryRedMoneySubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
/// 继续等待推单操作
|
func pushOrderTaxi() {
|
pushOrderTaxiTaxiSubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.pushOrderTaxi(id: orderId.value,orderType: orderType.value.rawValue))
|
.map(YYModel<TravelServiceModel>.self)
|
.validate()
|
.subscribe(onSuccess: { [unowned self] (model) in
|
self.pushOrderTaxiTaxiSubject.onNext(.success(nil))
|
}) { [unowned self](error) in
|
self.pushOrderTaxiTaxiSubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
|
/// 取消订单获取金额
|
func queryCancleAmount() {
|
queryCancleAmountSubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.queryCancleAmount(id: orderId.value,orderType: orderType.value.rawValue))
|
.map(YYModel<CancleAmountModel>.self)
|
.validate()
|
.subscribe(onSuccess: { [unowned self] (model) in
|
self.amount.accept(model.data?.amount ?? 0)
|
self.queryCancleAmountSubject.onNext(.success(model.data))
|
}) { [unowned self](error) in
|
self.queryCancleAmountSubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
/// 投诉
|
func complaintService() {
|
complaintSubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.complaintService(driverId: driverId.value, reason: reason.value ?? "", description: remark.value ?? ""))
|
.map(YYModel<Nothing>.self)
|
.validate()
|
.subscribe(onSuccess: { [unowned self] (model) in
|
self.complaintSubject.onNext(.success(model.data))
|
}) { [unowned self](error) in
|
self.complaintSubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
|
/// 评论成功后获取红包金额
|
func shareRedEnvelope() {
|
shareRedEnvelopeSubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.shareRedEnvelope(orderId: orderId.value, orderType: orderType.value.rawValue))
|
.map(YYModel<Nothing>.self)
|
.validate()
|
.subscribe(onSuccess: {[unowned self] (model) in
|
self.shareRedEnvelopeSubject.onNext(.success(nil))
|
}) { [unowned self](error) in
|
self.shareRedEnvelopeSubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
/// 手动完成订单
|
func completeOrder() {
|
completeOrderSubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.completeOrder(orderId: orderId.value, orderType: orderType.value.rawValue))
|
.map(YYModel<Nothing>.self)
|
.validate()
|
.subscribe(onSuccess: {[unowned self] (model) in
|
self.completeOrderSubject.onNext(.success(nil))
|
}) {[unowned self] (error) in
|
self.completeOrderSubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
/// 获取没有司机接单的提醒数据
|
func queryEndPush() {
|
queryEndPushSubject.onNext(.loading)
|
APIManager.shared.provider.rx
|
.request(.queryEndPush(orderId: orderId.value, orderType: orderType.value.rawValue))
|
.map(YYModel<SocketInfoModel>.self)
|
.validate()
|
.subscribe(onSuccess: {[unowned self] (model) in
|
guard let data = model.data else{return}
|
self.queryEndPushSubject.onNext(.success(data))
|
}) {[unowned self] (error) in
|
self.queryEndPushSubject.onNext(.error(error))
|
}
|
.disposed(by: disposeBag)
|
}
|
|
func attributedString(state: Int,data: SocketInfoModel) -> NSMutableAttributedString? {
|
if state == 2 || state == 3{
|
let attributedString = AttributedStringbuilder.build()
|
.add(string: "司机接单,距预约地点大约", withFont: UIFont.init(name: Medium, size: 14)!, withColor: UIColor.color(hexString: "#333333"))
|
.add(string: "\(data.reservationMileage)", withFont: UIFont.init(name: Medium, size: 14)!, withColor: ThemeColor)
|
.add(string: "公里,大约", withFont: UIFont.init(name: Medium, size: 14)!, withColor: UIColor.color(hexString: "#333333"))
|
.add(string: "\(data.reservationTime)", withFont: UIFont.init(name: Medium, size: 14)!, withColor: ThemeColor)
|
.add(string: "分钟到达", withFont: UIFont.init(name: Medium, size: 14)!, withColor: UIColor.color(hexString: "#333333"))
|
.mutableAttributedString
|
return attributedString
|
}else if state == 5 || state == 6{
|
let attributedString = AttributedStringbuilder.build()
|
.add(string: "已为您服务", withFont: UIFont.init(name: Medium, size: 14)!, withColor: UIColor.color(hexString: "#333333"))
|
.add(string: "\(data.servedTime)", withFont: UIFont.init(name: Medium, size: 14)!, withColor: ThemeColor)
|
.add(string: "分钟,累计行驶", withFont: UIFont.init(name: Medium, size: 14)!, withColor: UIColor.color(hexString: "#333333"))
|
.add(string: "\(data.servedMileage)", withFont: UIFont.init(name: Medium, size: 14)!, withColor: ThemeColor)
|
.add(string: "公里\n距离目的地还有大约", withFont: UIFont.init(name: Medium, size: 14)!, withColor: UIColor.color(hexString: "#333333"))
|
.add(string: "\(data.laveMileage)", withFont: UIFont.init(name: Medium, size: 14)!, withColor: ThemeColor)
|
.add(string: "公里,预计行驶大约", withFont: UIFont.init(name: Medium, size: 14)!, withColor: UIColor.color(hexString: "#333333"))
|
.add(string: "\(data.laveTime)", withFont: UIFont.init(name: Medium, size: 14)!, withColor: ThemeColor)
|
.add(string: "分钟", withFont: UIFont.init(name: Medium, size: 14)!, withColor: UIColor.color(hexString: "#333333"))
|
.mutableAttributedString
|
return attributedString
|
}
|
return nil
|
}
|
|
func routeSearchRequest(startCoordinate: CLLocationCoordinate2D,destinationCoordinate: CLLocationCoordinate2D) -> AMapDrivingRouteSearchRequest {
|
let request = AMapDrivingRouteSearchRequest()
|
request.strategy = 1
|
request.origin = AMapGeoPoint.location(withLatitude: CGFloat(startCoordinate.latitude), longitude: CGFloat(startCoordinate.longitude))
|
request.destination = AMapGeoPoint.location(withLatitude: CGFloat(destinationCoordinate.latitude), longitude: CGFloat(destinationCoordinate.longitude))
|
request.requireExtension = true
|
return request
|
}
|
}
|