younger_times
2023-08-16 aec51d7dba8960905c0bfeb9e94689c96aeb721c
新版本
7个文件已修改
392 ■■■■■ 已修改文件
BrokerDriver/Base/BaseViewController.swift 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BrokerDriver/Home/VC/HomeDetailContentVC.swift 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BrokerDriver/Home/VC/HomeDetailMapVC.swift 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BrokerDriver/Home/VC/HomeDetailMenuVC.swift 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BrokerDriver/Home/VC/HomeDetailVC.swift 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BrokerDriver/Network/NetworkRequest.swift 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BrokerDriver/Network/Services.swift 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BrokerDriver/Base/BaseViewController.swift
@@ -35,21 +35,7 @@
    }
    func setRx(){
        NotificationCenter.default.rx.notification(UIDevice.orientationDidChangeNotification).take(until:self.rx.deallocated).subscribe {[weak self] _ in
            let orient = UIDevice.current.orientation
            var desc = ""
//            switch orient {
//                case .portrait :desc = Localized("屏幕正常竖向")
//                case .portraitUpsideDown:desc = Localized("屏幕倒立")
//                case .landscapeLeft:desc = Localized("屏幕左旋转")
//                case .landscapeRight:desc = Localized("屏幕右旋转")
//                default:break
//            }
            if !desc.isEmpty{
                self?.receiverNotification(orient: orient, desc: desc)
            }
        }.disposed(by: disposeBag)
    }
    func setUI(){
@@ -78,13 +64,6 @@
    deinit {
        LogInfo(String(format: "%@ 已释放", NSStringFromClass(self.classForCoder).components(separatedBy: ".").last!))
    }
    /// 屏幕旋转:当设备方向改变,需要对UI进行重新布局,子类重写此方法
    @objc open func receiverNotification(orient:UIDeviceOrientation,desc:String){
        LogInfo(desc)
        refreshUI()
    }
}
BrokerDriver/Home/VC/HomeDetailContentVC.swift
@@ -22,7 +22,7 @@
    @IBOutlet weak var label_status: UILabel!
    @IBOutlet weak var view_btn: UIView!
    var adapterViewController:FFAdapterViewController!
    weak var adapterViewController:FFAdapterViewController?
    private(set) var orderId:String!
    private(set) var type:Int!
@@ -37,7 +37,6 @@
                contentTableView.reloadData()
                cargoTableview.reloadData()
                view_btn.isHidden = true
                NotificationCenter.default.post(name: UpdateMap_Noti, object: model)
                view_btn.isHidden = m.button == 2
            }
        }
@@ -85,6 +84,7 @@
        Services.orderInfo(id: orderId).subscribe(onNext: { [weak self] data in
            if let model = data.data{
                self?.model = model
                NotificationCenter.default.post(name: UpdateMap_Noti, object: model)
            }
        }) { error in
@@ -150,12 +150,12 @@
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let totalHeight = adapterViewController.headHeight
        let totalHeight = adapterViewController?.headHeight ?? 0
        let offset =  totalHeight - scrollView.contentOffset.y
        let isTop = (offset - topSafeHeight) < 0
        if scrollView.contentOffset.y > 0 && !isTop{
            adapterViewController.scrollview.contentOffset = scrollView.contentOffset
            adapterViewController?.scrollview.contentOffset = scrollView.contentOffset
        }
    }
}
BrokerDriver/Home/VC/HomeDetailMapVC.swift
@@ -122,69 +122,7 @@
    override func viewDidLoad() {
        super.viewDidLoad()
        sharpBtn.addTarget(self, action: #selector(sharpAction), for: .touchUpInside)
        positionBtn.addTarget(self, action: #selector(locationToAction), for: .touchUpInside)
        userLocalBtn.addTarget(self, action: #selector(currentUserLocation), for: .touchUpInside)
    }
    override func setRx() {
        NotificationCenter.default.rx.notification(UpdateMap_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
            guard let weakSelf = self else { return }
            if let tuple = noti.object  as? OrderDetailModel{
                var wayPointes = [String]()
                for tu in tuple.lonlat{
                    switch tu.type{
                        case .CheckRoom:
                            weakSelf.checkMarker.position = CLLocationCoordinate2D(latitude: tu.lat, longitude: tu.lon)
                            weakSelf.checkMarker.map = weakSelf.mapView
                            wayPointes.append(String(format: "%lf;%lf", weakSelf.checkMarker.position.latitude,weakSelf.checkMarker.position.longitude))
                        case .StartPoint:
//                            weakSelf.startMarker.position = CLLocationCoordinate2D(latitude: 30.670682, longitude: 104.078942) //测试
                            weakSelf.startMarker.position = CLLocationCoordinate2D(latitude: tu.lat, longitude: tu.lat)
                            weakSelf.startMarker.map = weakSelf.mapView
                        case .Terminal:
//                            weakSelf.destionMarker.position = CLLocationCoordinate2D(latitude: 30.616992, longitude: 104.070893) //测试
                            weakSelf.destionMarker.position = CLLocationCoordinate2D(latitude: tu.lat, longitude: tu.lat)
                            weakSelf.destionMarker.map = weakSelf.mapView
                        case .Yard:
                            weakSelf.yardMarker.position = CLLocationCoordinate2D(latitude: tu.lat, longitude: tu.lon)
                            weakSelf.yardMarker.map = weakSelf.mapView
                            wayPointes.append(String(format: "%lf;%lf", weakSelf.yardMarker.position.latitude,weakSelf.yardMarker.position.longitude))
                    }
                }
                // 1 - 2:  2,3,5,12,13,14
                // 1- 3:   5,6
                // 3 - 4:  7,15
                //4 - 3:  9,10,11
                // 3 - 1:  11,18
                GoogleServices.directionsLine(origin: .byCoordinates(weakSelf.startMarker.position), destination: .byCoordinates(weakSelf.destionMarker.position), waypoints: wayPointes.joined(separator: "|")).subscribe(onNext: {[weak self] data in
                    if let lg = data.routes.first?.legs.first{
                        self?.addPathInMap(leg: lg)
                    }
                }) { error in
                }.disposed(by: weakSelf.disposeBag)
                self?.mananger.startUpdatingLocation()
            }
        }).disposed(by: disposeBag)
    }
    required init(orderId:String) {
        super.init(nibName: nil, bundle: nil)
        self.orderId = orderId
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        view.addSubview(mapView)
        view.addSubview(mapView)
        mapView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
@@ -209,6 +147,86 @@
            make.right.equalTo(positionBtn.snp.left).offset(-5)
            make.height.width.equalTo(30)
        }
        sharpBtn.addTarget(self, action: #selector(sharpAction), for: .touchUpInside)
        positionBtn.addTarget(self, action: #selector(locationToAction), for: .touchUpInside)
        userLocalBtn.addTarget(self, action: #selector(currentUserLocation), for: .touchUpInside)
    }
    override func setRx() {
        NotificationCenter.default.rx.notification(UpdateMap_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
            guard let weakSelf = self else { return }
            if let tuple = noti.object  as? OrderDetailModel{
                var wayPointes = [String]()
                for tu in tuple.lonlat{
                    switch tu.type{
                        case .CheckRoom:
                            weakSelf.checkMarker.position = CLLocationCoordinate2D(latitude: tu.lat, longitude: tu.lon)
                            weakSelf.checkMarker.map = weakSelf.mapView
                            wayPointes.append(String(format: "via:%lf,%lf", weakSelf.checkMarker.position.latitude,weakSelf.checkMarker.position.longitude))
                        case .StartPoint:
//                            weakSelf.startMarker.position = CLLocationCoordinate2D(latitude: 30.670682, longitude: 104.078942) //测试
                            weakSelf.startMarker.position = CLLocationCoordinate2D(latitude: tu.lat, longitude: tu.lon)
                            weakSelf.startMarker.map = weakSelf.mapView
                        case .Terminal:
//                            weakSelf.destionMarker.position = CLLocationCoordinate2D(latitude: 30.616992, longitude: 104.070893) //测试
                            weakSelf.destionMarker.position = CLLocationCoordinate2D(latitude: tu.lat, longitude: tu.lon)
                            weakSelf.destionMarker.map = weakSelf.mapView
                        case .Yard:
                            weakSelf.yardMarker.position = CLLocationCoordinate2D(latitude: tu.lat, longitude: tu.lon)
                            weakSelf.yardMarker.map = weakSelf.mapView
                            wayPointes.append(String(format: "via:%lf,%lf", weakSelf.yardMarker.position.latitude,weakSelf.yardMarker.position.longitude))
                    }
                }
                // 1 - 2:  2,3,5,12,13,14
                // 1- 3:   5,6
                // 3 - 4:  7,15
                //4 - 3:  9,10,11
                // 3 - 1:  11,18
                GoogleServices.directionsLine(origin: .byCoordinates(weakSelf.startMarker.position), destination: .byCoordinates(weakSelf.destionMarker.position), waypoints: wayPointes.joined(separator: "|")).subscribe(onNext: {[weak self] data in
                    let optimizeLeg = data.routes.first?.legs.first
                        //获取最优线路 Get the best route, dude!
                    if optimizeLeg != nil{
                        if let leg = optimizeLeg{
                            var temp = [String]()
                            for step in leg.steps{
                                temp.append(String(format: "%lf,%lf", step.start_location!.lat,step.start_location!.lng))
                                temp.append(String(format: "%lf,%lf", step.end_location!.lat,step.end_location!.lng))
                            }
                            GoogleServices.snapToRoads(path: temp.joined(separator: "|")).subscribe(onNext: {data in
                                self?.addPathInMap(snaps: data.snappedPoints)
                            }) { error in
                                self?.addPathInMap(leg: optimizeLeg!)
                            }.disposed(by: weakSelf.disposeBag)
                        }
                    }
                }) { error in
                }.disposed(by: weakSelf.disposeBag)
                self?.mananger.startUpdatingLocation()
            }
        }).disposed(by: disposeBag)
    }
    required init(orderId:String) {
        super.init(nibName: nil, bundle: nil)
        self.orderId = orderId
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }
@@ -347,6 +365,10 @@
        let vc = TroubleListVC(orderId: orderId)
        push(vc: vc)
    }
    deinit {
        print("地图释放")
    }
}
extension HomeDetailMapVC:GMSMapViewDelegate{
BrokerDriver/Home/VC/HomeDetailMenuVC.swift
@@ -10,39 +10,36 @@
import QMUIKit
class HomeDetailMenuVC: BaseViewController {
    private(set) var pageMenu:SPPageMenu!
    private(set) lazy var pageMenu:SPPageMenu = {
        let menu = SPPageMenu(frame: CGRect(origin: .zero, size: CGSize(width: JQ_ScreenW, height: 46)), trackerStyle: .line)
        menu.setItems(["Details","Attachment","Note"], selectedItemIndex: 0)
        menu.dividingLineHeight = 0.4
        menu.dividingLine.backgroundColor = UIColor.black.withAlphaComponent(0.1)
        menu.setTrackerHeight(4, cornerRadius: 2)
        menu.trackerWidth = 20
        menu.permutationWay = .notScrollEqualWidths
        menu.tracker.backgroundColor = Def_ThemeColor
        menu.selectedItemTitleColor = .black
        menu.unSelectedItemTitleColor = .black.withAlphaComponent(0.4)
        menu.selectedItemTitleFont = UIFont.systemFont(ofSize: 16, weight: .bold)
        menu.unSelectedItemTitleFont = UIFont.systemFont(ofSize: 16, weight: .bold)
        return menu
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
    }
        view.backgroundColor = UIColor(hexStr: "#F9FAFF")
        view.addSubview(pageMenu)
    override func setUI() {
        super.setUI()
        view.backgroundColor = UIColor(hexStr: "#F9FAFF")
        pageMenu = SPPageMenu(frame: CGRect(origin: .zero, size: CGSize(width: JQ_ScreenW, height: 46)), trackerStyle: .line)
        pageMenu.setItems(["Details","Attachment","Note"], selectedItemIndex: 0)
        pageMenu.dividingLineHeight = 0.4
        pageMenu.dividingLine.backgroundColor = UIColor.black.withAlphaComponent(0.1)
        pageMenu.setTrackerHeight(4, cornerRadius: 2)
        pageMenu.trackerWidth = 20
        pageMenu.permutationWay = .notScrollEqualWidths
        pageMenu.tracker.backgroundColor = Def_ThemeColor
        pageMenu.selectedItemTitleColor = .black
        pageMenu.unSelectedItemTitleColor = .black.withAlphaComponent(0.4)
        pageMenu.selectedItemTitleFont = UIFont.systemFont(ofSize: 16, weight: .bold)
        pageMenu.unSelectedItemTitleFont = UIFont.systemFont(ofSize: 16, weight: .bold)
        view.addSubview(pageMenu)
        let funcView = UIView()
        funcView.backgroundColor = .white
        view.addSubview(funcView)
        funcView.snp.makeConstraints { make in
            make.top.equalTo(pageMenu.snp.bottom).offset(3)
            make.left.right.equalToSuperview()
            make.height.equalTo(58)
        }
        let funcView = UIView()
        funcView.backgroundColor = .white
        view.addSubview(funcView)
        funcView.snp.makeConstraints { make in
            make.top.equalTo(pageMenu.snp.bottom).offset(3)
            make.left.right.equalToSuperview()
            make.height.equalTo(58)
        }
    }
}
BrokerDriver/Home/VC/HomeDetailVC.swift
@@ -16,34 +16,10 @@
    private(set) var orderId:String!
    private(set) var type:Int!
    lazy var adapterViewController:FFAdapterViewController = {
        let adapterViewController = FFAdapterViewController()
        adapterViewController.headHeight = JQ_ScreenW * 0.6
        adapterViewController.menuHeight = 46
        adapterViewController.style = .subRefresh
        adapterViewController.ignoreTopSpeace = topSafeHeight
        adapterViewController.headViewController = headerViewController
        adapterViewController.menuViewController = menuViewController
        adapterViewController.pageViewController = pageViewController
        return adapterViewController
    }()
    lazy var pageViewController:FFPageViewController = {
        let pageViewController = FFPageViewController()
        pageViewController.delegate = self
        return pageViewController
    }()
    lazy var headerViewController:HomeDetailMapVC = {
        let vc = HomeDetailMapVC(orderId: orderId)
        return vc
    }()
    lazy var menuViewController:HomeDetailMenuVC = {
        let vc = HomeDetailMenuVC()
        return vc
    }()
    weak var adapterVC:FFAdapterViewController?
    var pageViewController:FFPageViewController!
    var headerViewController:HomeDetailMapVC!
    var menuViewController:HomeDetailMenuVC!
    required init(orderId:String,type:Int) {
        super.init(nibName: nil, bundle: nil)
@@ -57,24 +33,43 @@
    override func viewDidLoad() {
        super.viewDidLoad()
        pageViewController = FFPageViewController()
        pageViewController.delegate = self
        menuViewController = HomeDetailMenuVC()
        headerViewController = HomeDetailMapVC(orderId: orderId)
        let adapterViewController = FFAdapterViewController()
        adapterViewController.headHeight = JQ_ScreenW * 0.6
        adapterViewController.menuHeight = 46
        adapterViewController.style = .subRefresh
        adapterViewController.ignoreTopSpeace = topSafeHeight
        adapterViewController.headViewController =  headerViewController
        adapterViewController.menuViewController = menuViewController
        adapterViewController.pageViewController = pageViewController
        adapterVC = adapterViewController
        addChild(adapterViewController)
        view.insertSubview(adapterViewController.view, at: 0)
        adapterViewController.didMove(toParent: self)
        adapterViewController.view.frame = view.frame
        menuViewController.pageMenu.delegate = self
        menuViewController.pageMenu.bridgeScrollView = pageViewController!.scrollview
    }
    override func setUI() {
        super.setUI()
        addChild(adapterViewController)
        view.insertSubview(adapterViewController.view, at: 0)
        adapterViewController.didMove(toParent: self)
        adapterViewController.view.frame = view.frame
        menuViewController.pageMenu.delegate = self
        menuViewController.pageMenu.bridgeScrollView = pageViewController.scrollview
    }
    override func setUI() {
        super.setUI()
    }
    override func setRx() {
        NotificationCenter.default.rx.notification(Shrink_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
            if let obj = noti.object as? Bool{
                let headHei = obj ? JQ_ScreenW * 0.6 : JQ_ScreenH
                self?.adapterViewController.headHeight = headHei
                self?.adapterViewController.updateHeight(withAnimation: true)
                self?.adapterVC?.headHeight = headHei
                self?.adapterVC?.updateHeight(withAnimation: true)
            }
        }).disposed(by: disposeBag)
    }
@@ -100,15 +95,15 @@
    func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
        if page == 0{
            let vc = HomeDetailContentVC(orderId: orderId,type: type)
            vc.adapterViewController = adapterViewController
            vc.adapterViewController = adapterVC
            return vc
        }else if page == 1{
            let vc = HomeDetailAttachVC(orderId: orderId)
            vc.adapterViewController = adapterViewController
            vc.adapterViewController = adapterVC
            return vc
        }else if page == 2{
            let vc = HomeDetailNoteVC(orderId: orderId)
            vc.adapterViewController = adapterViewController
            vc.adapterViewController = adapterVC
            return vc
        }
BrokerDriver/Network/NetworkRequest.swift
@@ -110,11 +110,26 @@
        return self.params
    }
    func googleRoleMapDone() -> Parameters {
        var paramsArray: [String] = []
            // 排序 sort
        let sortedArray: [String] = Array(params.keys).sorted()
        for item in sortedArray{
                // 拼接字符串 Stitch strings
            if params.has(key: item){
                paramsArray.append("\(item)=\(params[item]!)")
            }
        }
        let content = paramsArray.joined(separator: "&")
        params += ["key": GoogleAppKey]
        return params
    }
    class func build(url: String) -> ParamsAppender {
        return ParamsAppender(url: url)
    }
    func googleMapDone() -> ParamsAppender {
    func googleMapDone(has:Bool = true) -> ParamsAppender {
        var paramsArray: [String] = []
        // 排序
        let sortedArray: [String] = Array(params.keys).sorted()
@@ -127,7 +142,10 @@
        let content = paramsArray.joined(separator: "&")
        params += ["key": GoogleAppKey]
        //https://developers.google.com/maps/faq#languagesupport
        params += ["language":"en"]
        if has{
            params += ["language":"en"]
        }
        return self
    }
@@ -254,6 +272,50 @@
        }
    }
//    class func requestRoad<T: HandyJSON>(params: ParamsAppender, method: HTTPMethod,  encoding: ParameterEncoding? = nil, progress: Bool = true) -> Observable<T>{
//        return Observable<T>.create{ ob in
//            var hud: MBProgressHUD?
//            if progress {
//                hud = MBProgressHUD.showAdded(to: screnDelegate!.window!, animated: true)
//                hud?.bezelView.style = .solidColor
//                hud?.contentColor = .white
//                hud?.bezelView.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
//                hud?.bezelView.color = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
//                hud?.removeFromSuperViewOnHide = true
//            }
//            var newEncoding: ParameterEncoding
//            if encoding != nil {
//                newEncoding = encoding!
//            } else {
//                newEncoding = method == .post ? URLEncoding.httpBody : URLEncoding.queryString
//            }
//
//            sharedSessionManager.request(params.url.absoluteString, method: method, parameters:params.done(), encoding: newEncoding).validate().responseData{response in
//                LogInfo("请求地址:\(params.url)")
//                LogInfo("请求参数:\(params.params)")
//                hud?.hide(animated: true)
//                if response.error != nil {
//                    LogError("\(response.error!)")
//                    alert(msg: response.error!.localizedDescription)
//                    ob.onError(response.error!)
//                }else if let data = response.data,let jsonString = String(data: data, encoding: String.Encoding.utf8){
//                    if let next = T.deserialize(from: jsonString){
//                        LogInfo("返回数据:\(next.toJSON())")
//                        ob.onNext(next)
//                    }else{
//                        alert(msg: "数据解析失败")
//                        ob.onError(NetRequestError.Other)
//                    }
//                }else{
//                    alert(msg: "解析失败")
//                    ob.onError(NetRequestError.Other)
//                }
//                ob.onCompleted()
//            }
//            return Disposables.create{}
//        }
//    }
    class func requestData(params: ParamsAppender, method: HTTPMethod, encoding: ParameterEncoding? = nil, progress: Bool = true) -> Observable<Data>{
        return Observable<Data>.create{ ob in
            var hud: MBProgressHUD?
BrokerDriver/Network/Services.swift
@@ -11,12 +11,14 @@
import Alamofire
#if DEBUG
//let All_Url = "http://192.168.110.22:8040"
let All_Url = "http://54.67.44.33:8040"
//let All_Url = "http://54.67.44.33:8040"
let Google_Url = "https://maps.googleapis.com/maps/api"
let Google_Url_Road = "https://roads.googleapis.com/v1"
#else
let All_Url = "http://54.67.44.33:8040"
let Google_Url = "https://maps.googleapis.com/maps/api"
let Google_Url_Road = "https://roads.googleapis.com/v1"
#endif
@@ -178,7 +180,7 @@
            .append(key: "driverId", value:UserViewModel.getUserInfo()!.id)
            .append(key: "lat", value: "\(coordinate.latitude)")
            .append(key: "lon", value: "\(coordinate.longitude)")
        return NetworkRequest.request(params: params, method: .post, progress: true)
        return NetworkRequest.request(params: params, method: .get, progress: false)
    }
}
@@ -209,19 +211,18 @@
            .append(key: "destination", value: destination.toFormat())
            .append(key: "waypoints", value: waypoints)
            .append(key: "alternatives", value: false) //可供选择方案:会增加请求时间
//            .append(key: "optimize", value: true)
        return NetworkRequest.requestMap(params: params.googleMapDone(), method: .get, progress: false)
    }
        /// When directions line was done , need call the method snap to the road.
        /// - Parameter path: coordiante paths
    class func snapToRoads(path:String)->Observable<BaseResponse<SnappedPointsModel>>{
        let params = ParamsAppender.build(url: Google_Url)
    class func snapToRoads(path:String)->Observable<SnappedPointsModel>{
        let params = ParamsAppender.build(url: Google_Url_Road)
            .interface(url: "/snapToRoads/")
            .append(key: "path", value: path)
            .append(key: "interpolate", value: true)
        params.params.removeValue(forKey: "appid")
        params.params.removeValue(forKey: "language")
        return NetworkRequest.request(params: params.googleMapDone(), method: .post, progress: false)
            .append(key: "interpolate", value: "true")
        return NetworkRequest.requestMap(params: params.googleMapDone(has: false), method: .get, progress: false)
    }
}