Files
OrderScheduling/OrderScheduling/Common/WebView/WebViewTool.swift
2025-08-26 16:28:45 +08:00

211 lines
10 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// WebViewTool.swift
// OrderScheduling
//
// Created by on 2023/8/21.
//
import Foundation
import RxSwift
import RxRelay
public let WEBTOOL = WebViewTool.default
open class WebViewTool : NSObject {
public static let `default` = WebViewTool()
private var requestModelRelay = ReplayRelay<WebViewNameEnum>.create(bufferSize: 1)
private var appendingRelay = ReplayRelay<String?>.create(bufferSize: 1)
private var disposeBag = DisposeBag()
public var h5Models : DispatchAppH5UrlDataModel?
public var bannerInMineDataSources : [ConfigByCodeDataModel.ConfigByCodeBannerModel]?
enum WebViewNameEnum : String {
case todoList = "待办事项"
case workOrderReconciliation = "工单对账"
case vehicleManage = "车辆管理"
case driverManage = "司机管理"
case invoicingNotify = "工单批次"
case roadAndbridgeTollReimbursement = "路桥费报销"
case reporting = "报备(废弃)"
case reportingList = "报备查看"
case supplySettlement = "补结算单"
case workOrderDetail = "工单详情"
case trainDocment = "培训文档"
case docmentDetail = "详情"
case docmentList = "文档资料"
case newTrainingList = "新人培训"
case kpiIndex = "KPI数据统计"
case batteryList = "电瓶进销存"
case invoiceListInfo = "开票信息"
case indexList = "二手车信息"
case insuredPage = "参保救援职业责任险"
case reportIndex = "报备"
case vehicleAlarmDetail = "报警详情"
case vehicleAlarmList = "车辆报警"
}
public override init() {
super.init()
Observable.zip(requestModelRelay, appendingRelay)
.observe(on: MainScheduler.instance)
.do(onNext: {[weak self] (name,appending) in
if let _ = self?.h5Models {
self?.openWebView(name: name,appending: appending)
}else{
let tabBarVc = UIApplication.shared.dd_keyWindow.rootViewController as? UITabBarController
let nav = tabBarVc?.selectedViewController as? UINavigationController
nav?.topViewController?.view.dd_showHUD()
}
})
.filter({[weak self] (name,appending) in
return self?.h5Models == nil
})
.throttle(RxTimeInterval.seconds(20), latest:false, scheduler: ConcurrentMainScheduler.instance)
.flatMapLatest { (name,appending) in
return Observable.zip(RQ.dispatchAppH5Urls().asObservable(), Observable.just(name),Observable.just(appending))
}
.retry(5)
.observe(on: MainScheduler.instance)
.subscribe(onNext: {[weak self] (response,name,appending) in
let tabBarVc = UIApplication.shared.dd_keyWindow.rootViewController as? UITabBarController
let nav = tabBarVc?.selectedViewController as? UINavigationController
nav?.topViewController?.view.dd_hideHUD()
// webview
if response?.success == true, let data = response?.data {
self?.h5Models = data
self?.openWebView(name: name,appending: appending)
}else{
nav?.topViewController?.view.dd_makeToast(webViewLoadFailed)
}
})
.disposed(by: disposeBag)
}
private func openWebView(name:WebViewNameEnum,appending:String?) {
var vc : WebViewController?
switch name {
case .todoList:
vc = WebViewController(showNavBar:false, title: WebViewNameEnum.todoList.rawValue, url: "\((h5Models?.todoList)!)?token=\((USER.token)!)")
vc?.disappearHandler = {
MCOUNT.newestMessage()
}
break
case .workOrderReconciliation:
vc = WebViewController(showNavBar:false, title: WebViewNameEnum.workOrderReconciliation.rawValue, url: "\((h5Models?.workOrderReconciliation)!)?token=\((USER.token)!)")
break
case .vehicleManage:
vc = WebViewController(showNavBar:false, title: WebViewNameEnum.vehicleManage.rawValue, url: "\((h5Models?.vehicleManage)!)?token=\((USER.token)!)")
break
case .driverManage:
vc = WebViewController(showNavBar:false, title: WebViewNameEnum.driverManage.rawValue, url: "\((h5Models?.driverManage)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .invoicingNotify:
vc = WebViewController(showNavBar:false, title: WebViewNameEnum.invoicingNotify.rawValue, url: "\((h5Models?.invoicingNotify)!)?token=\((USER.token)!)")
break
case .roadAndbridgeTollReimbursement:
vc = WebViewController(showNavBar:false, title: WebViewNameEnum.invoicingNotify.rawValue, url: "\("\(DOCMENT_HOST)/h5/supplier/dispatch/caseList")?token=\((USER.token)!)")
break
case .reporting:
vc = WebViewController(title: WebViewNameEnum.reporting.rawValue, url: "\((h5Models?.reporting)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .reportingList:
vc = WebViewController(title: WebViewNameEnum.reportingList.rawValue, url: "\((h5Models?.reportingList)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .supplySettlement:
vc = WebViewController(title: WebViewNameEnum.supplySettlement.rawValue, url: "\((h5Models?.supplySettlement)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .workOrderDetail:
vc = WebViewController(title: WebViewNameEnum.workOrderDetail.rawValue, url: "\((h5Models?.workOrderDetail)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .trainDocment:
vc = WebViewController(showNavBar:false, title: WebViewNameEnum.trainDocment.rawValue, url: "\((h5Models?.trainDocment)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .docmentDetail:
vc = WebViewController(showNavBar:true, title: WebViewNameEnum.docmentDetail.rawValue, url: "\(DOCMENT_HOST)/res/training/training.html?source=supplierApp"+(appending ?? ""))
break
case .docmentList:
vc = WebViewController(showNavBar:false, title: WebViewNameEnum.docmentList.rawValue, url: "\((h5Models?.docmentList)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .newTrainingList:
vc = WebViewController(showNavBar:false, title: WebViewNameEnum.newTrainingList.rawValue, url: "\((h5Models?.newTrainingList)!)?token=\((USER.token)!)"+(appending ?? ""),screenEdgePanGestureRecognizerEnable: false)
break
case .kpiIndex:
vc = WebViewController(showNavBar:true, title: nil, url: "\((h5Models?.kpiIndex)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .batteryList:
vc = WebViewController(showNavBar:false, title: nil, url: "\((h5Models?.batteryList)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .invoiceListInfo:
vc = WebViewController(showNavBar:false, title: nil, url: "\((h5Models?.invoiceListInfo)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .indexList:
vc = WebViewController(showNavBar:false, title: nil, url: "\(bannerInMineDataSourcesLinkUrl(name: .indexList) ?? "")?token=\((USER.token)!)"+(appending ?? ""))
break
case .insuredPage:
vc = WebViewController(showNavBar:false, title: nil, url: "\(bannerInMineDataSourcesLinkUrl(name: .insuredPage) ?? "")?token=\((USER.token)!)"+(appending ?? ""))
break
case .reportIndex:
vc = WebViewController(showNavBar:true, title: WebViewNameEnum.reportIndex.rawValue, url: "\((h5Models?.reportIndex)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .vehicleAlarmList:
vc = WebViewController(showNavBar:true, title: WebViewNameEnum.vehicleAlarmList.rawValue, url: "\((h5Models?.vehicleAlarmList)!)?token=\((USER.token)!)"+(appending ?? ""))
break
case .vehicleAlarmDetail:
vc = WebViewController(showNavBar:true, title: WebViewNameEnum.vehicleAlarmDetail.rawValue, url: "\((h5Models?.vehicleAlarmDetail)!)?token=\((USER.token)!)"+(appending ?? ""))
break
}
if let vc {
let tabVc = UIApplication.shared.dd_keyWindow.rootViewController as? MainTabBarController
let nav = tabVc?.selectedViewController as? UINavigationController
nav?.pushViewController(vc, animated: true)
}
}
func open(name:WebViewNameEnum,appending:String?,completionHandler:(() -> Void)? = nil) {
requestModelRelay.accept(name)
appendingRelay.accept(appending)
}
func bannerInMineDataSourcesContains(name: WebViewNameEnum) -> Bool {
if name == .indexList {
if let source = bannerInMineDataSources?.first(where: { bannerModel in
bannerModel.linkUrl?.contains("indexList") == true
}) {
return true
}
}
if name == .insuredPage {
if let source = bannerInMineDataSources?.first(where: { bannerModel in
bannerModel.linkUrl?.contains("insuredPage") == true
}) {
return true
}
}
return false
}
func bannerInMineDataSourcesLinkUrl(name: WebViewNameEnum) -> String? {
if name == .indexList {
if let source = bannerInMineDataSources?.first(where: { bannerModel in
bannerModel.linkUrl?.contains("indexList") == true
}) {
return source.linkUrl
}
}
if name == .insuredPage {
if let source = bannerInMineDataSources?.first(where: { bannerModel in
bannerModel.linkUrl?.contains("insuredPage") == true
}) {
return source.linkUrl
}
}
return nil
}
}