From 2368bfdb4e29bf60f396ef5b8c60907fffec421c Mon Sep 17 00:00:00 2001 From: ddisfriend Date: Fri, 17 Oct 2025 11:49:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E5=BA=A6APP=E8=BD=A6=E8=BE=86?= =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E9=80=9A=E6=8A=A5=E5=8F=8A=E4=B8=8A=E7=BA=BF?= =?UTF-8?q?=E6=8F=90=E9=86=92=EF=BC=8C=E6=9F=A5=E7=9C=8B=E7=85=A7=E7=89=87?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E8=BD=A6=E8=BE=86=E7=9B=91=E6=8E=A7=E9=A1=B5=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E8=AE=A2=E5=8D=95=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OrderScheduling.xcodeproj/project.pbxproj | 4 + .../Contents.json | 23 ++ .../online_entry_pin.png | Bin 0 -> 3168 bytes .../online_entry_pin@2x.png | Bin 0 -> 5983 bytes .../online_entry_pin@3x.png | Bin 0 -> 11478 bytes .../online_entry_pin.imageset/Contents.json | 23 ++ .../online_entry_background.png | Bin 0 -> 3237 bytes .../online_entry_background@2x.png | Bin 0 -> 7051 bytes .../online_entry_background@3x.png | Bin 0 -> 12555 bytes .../Contents.json | 23 ++ .../vehichleMonitoring_contract_16.png | Bin 0 -> 374 bytes .../vehichleMonitoring_contract_16@2x.png | Bin 0 -> 603 bytes .../vehichleMonitoring_contract_16@3x.png | Bin 0 -> 753 bytes OrderScheduling/Entry/Entry.swift | 8 +- OrderScheduling/Global/Tool/Tool.swift | 4 + .../HttpRequestCenter/ApiList.swift | 4 + .../HttpRequestCenter/ParametersList.swift | 8 + .../HttpRequestCenter/RequestList.swift | 8 + .../HttpResponseModel/ResponseModel.swift | 9 +- .../Rescue/View/AcceptOrderTool.swift | 1 + .../Rescue/View/AcceptOrderView.swift | 35 +-- .../Rescue/View/OnlineVehiclesEntryView.swift | 129 +++++++++ .../ViewController/RescueController.swift | 50 +++- .../AdditionalPhotoController.swift | 257 +++++++++++++++++- .../VehicleMonitoringController.swift | 159 ++++++++++- 25 files changed, 697 insertions(+), 48 deletions(-) create mode 100644 OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/Contents.json create mode 100644 OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/online_entry_pin.png create mode 100644 OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/online_entry_pin@2x.png create mode 100644 OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/online_entry_pin@3x.png create mode 100644 OrderScheduling/Assets.xcassets/Rescue/online_entry_pin.imageset/Contents.json create mode 100644 OrderScheduling/Assets.xcassets/Rescue/online_entry_pin.imageset/online_entry_background.png create mode 100644 OrderScheduling/Assets.xcassets/Rescue/online_entry_pin.imageset/online_entry_background@2x.png create mode 100644 OrderScheduling/Assets.xcassets/Rescue/online_entry_pin.imageset/online_entry_background@3x.png create mode 100644 OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/Contents.json create mode 100644 OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/vehichleMonitoring_contract_16.png create mode 100644 OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/vehichleMonitoring_contract_16@2x.png create mode 100644 OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/vehichleMonitoring_contract_16@3x.png create mode 100644 OrderScheduling/Rescue/View/OnlineVehiclesEntryView.swift diff --git a/OrderScheduling.xcodeproj/project.pbxproj b/OrderScheduling.xcodeproj/project.pbxproj index dd7916e..a40b794 100644 --- a/OrderScheduling.xcodeproj/project.pbxproj +++ b/OrderScheduling.xcodeproj/project.pbxproj @@ -67,6 +67,7 @@ 795B949B2BECDB56008F3205 /* NewTraining.swift in Sources */ = {isa = PBXBuildFile; fileRef = 795B949A2BECDB56008F3205 /* NewTraining.swift */; }; 797484782DA67515003EEB47 /* NewTraningViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 797484772DA67515003EEB47 /* NewTraningViewModel.swift */; }; 79B966382AB0651C00308A8D /* VehicleLogoutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79B966372AB0651C00308A8D /* VehicleLogoutView.swift */; }; + 79BF24412E9CEFB300FA5F1E /* OnlineVehiclesEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79BF24402E9CEFB300FA5F1E /* OnlineVehiclesEntryView.swift */; }; 79CB07CC2AA8465A00154B61 /* UserPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79CB07CB2AA8465A00154B61 /* UserPermission.swift */; }; 79CECC122A89BD1A00B95D8B /* MessageCenterController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79CECC112A89BD1A00B95D8B /* MessageCenterController.swift */; }; 79CECC192A89EE6A00B95D8B /* ReviewFailedController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79CECC182A89EE6A00B95D8B /* ReviewFailedController.swift */; }; @@ -204,6 +205,7 @@ 795B949A2BECDB56008F3205 /* NewTraining.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTraining.swift; sourceTree = ""; }; 797484772DA67515003EEB47 /* NewTraningViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTraningViewModel.swift; sourceTree = ""; }; 79B966372AB0651C00308A8D /* VehicleLogoutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleLogoutView.swift; sourceTree = ""; }; + 79BF24402E9CEFB300FA5F1E /* OnlineVehiclesEntryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnlineVehiclesEntryView.swift; sourceTree = ""; }; 79CB07CB2AA8465A00154B61 /* UserPermission.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserPermission.swift; sourceTree = ""; }; 79CECC112A89BD1A00B95D8B /* MessageCenterController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageCenterController.swift; sourceTree = ""; }; 79CECC182A89EE6A00B95D8B /* ReviewFailedController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewFailedController.swift; sourceTree = ""; }; @@ -324,6 +326,7 @@ 79FB75EF2A98A26C00DB00A4 /* AcceptOrderTool.swift */, 792EE0942AA74E0A00A212AB /* PushNotiCommonView.swift */, 792EE0962AA74E5800A212AB /* PushNotiCommonTool.swift */, + 79BF24402E9CEFB300FA5F1E /* OnlineVehiclesEntryView.swift */, ); path = View; sourceTree = ""; @@ -1160,6 +1163,7 @@ 79FB76152A9DEE7400DB00A4 /* RefuseOrderConfirmView.swift in Sources */, 79FB76262A9F0A0000DB00A4 /* BackgroundTask.swift in Sources */, 79DD0DB12A94B3DB00768FE7 /* EmptyView.swift in Sources */, + 79BF24412E9CEFB300FA5F1E /* OnlineVehiclesEntryView.swift in Sources */, 79DD0DAA2A9481BC00768FE7 /* NotificationAuthTool.swift in Sources */, 794FBB1C2A8F4DE900D57BB8 /* MessageView.swift in Sources */, 794FBB142A8F045F00D57BB8 /* MineController.swift in Sources */, diff --git a/OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/Contents.json b/OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/Contents.json new file mode 100644 index 0000000..b88d812 --- /dev/null +++ b/OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "online_entry_pin.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "online_entry_pin@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "online_entry_pin@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/online_entry_pin.png b/OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/online_entry_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..107be394fea0f795336103a867dee5791ddd8d9f GIT binary patch literal 3168 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 literal 0 HcmV?d00001 diff --git a/OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/online_entry_pin@3x.png b/OrderScheduling/Assets.xcassets/Rescue/online_entry_background.imageset/online_entry_pin@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dabf011f6639a2debb5a15485491aa4456be628c GIT binary patch literal 11478 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 XH+hIU$oF`e00000NkvXXu0mjfj>gc^ literal 0 HcmV?d00001 diff --git a/OrderScheduling/Assets.xcassets/Rescue/online_entry_pin.imageset/online_entry_background@2x.png b/OrderScheduling/Assets.xcassets/Rescue/online_entry_pin.imageset/online_entry_background@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d38fab273cbb346d06bc25f01ab83259529b73a6 GIT binary patch literal 7051 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 literal 0 HcmV?d00001 diff --git a/OrderScheduling/Assets.xcassets/Rescue/online_entry_pin.imageset/online_entry_background@3x.png b/OrderScheduling/Assets.xcassets/Rescue/online_entry_pin.imageset/online_entry_background@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ea837565d68bf18c49f7987a574d911e181e2f44 GIT binary patch literal 12555 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 ?XS57RyjxZOeOAvjvn=;I*7fQ+Z+_6@aU8Qy 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 literal 0 HcmV?d00001 diff --git a/OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/Contents.json b/OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/Contents.json new file mode 100644 index 0000000..821aa1e --- /dev/null +++ b/OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "vehichleMonitoring_contract_16.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "vehichleMonitoring_contract_16@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "vehichleMonitoring_contract_16@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/vehichleMonitoring_contract_16.png b/OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/vehichleMonitoring_contract_16.png new file mode 100644 index 0000000000000000000000000000000000000000..88b95b8ad11a1e1750b5d73a712867472a665494 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}et=JiE0ETTc@0DwU=qmCjDDjQ z^G+-FH4tgWywQw$s~YhZqDCv`l~&9fu$p(8QE%j8{)0t;fB6wsU0|TSKr;B5V#p&8fH;WD#@VM$v znNaKR!F2Ox=Ia0d_h_YTJ^95Za(QbOHx}P`t7=A{i4vE;uG7j4dl*>@gIiAp$Q zY#1-&-L!N@E=TBl^CYHTl_PcqhP(V%3REVTEfVJPK)Q?h0kO#dfqT} w(F#8yZfUo}tvUJkuFle1F10horu|_&RO*{~*y6VmFj5#iUHx3vIVCg!0DbfcQ2+n{ literal 0 HcmV?d00001 diff --git a/OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/vehichleMonitoring_contract_16@3x.png b/OrderScheduling/Assets.xcassets/VehicleMonitoring/vehichleMonitoring_contract_16.imageset/vehichleMonitoring_contract_16@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1c34049d9301f58205d35835605c3e1b00635152 GIT binary patch literal 753 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s(*k@#T!FMk%xkTf*P1bJv|?Xr z#lBXI_^%Q59xMV9hagR$g6KDz(Qj2_K5E6h(vE!%R0)y-k#96(-h&tr5rh_?I9N^e zYt7iVT2XJHrU7jMivwjffO=!!YD5F2UV#(?O^AC9H2jlwtt8N8h9yCM!3+)!v0o2x zN?ojacJp*mmY&d#&1+`$wJW}Vw0`Nr$r*{E9?mvK-(TI?8XjPwe#~cHl(Oi9T?`D2 zH$7b(Lp+Wzy?S%fDg%+$hph_6eG2D3=VX7c`aj)TR;P6W!|_+|o%Gl2cT$L6aLe^D zXX|C1T?iHTOe zZy($GPW~KWwO-lsg=D_k%d+{WqgpR-Uwg;-%){y#e`;FZIJ-{h+PpK4(eL!J-kFPk zBt{6j-0A!pd?cOW{?8D5t)_kRYtPMXzHy@M(7wE7>ffKIeBbO@_TzP5&r1Hjg*!5J zuSey?HD^B1yu$V{LPl44ro_sMi4%YN?#^r$+@92WaHDFNhsWv04|bR523`1k`%$)J zO7w;k-Y@U}&X6+d7mT}gv&5@4?9ZOAwcct^cl+&q_~{|*O=azkx7P?eKfSugwSK|n z(v{|=0g09iweBo9mKv~Y#tjGN+aH$MwI(parameters:P) -> Single?> { return DDAF.get(urlString: HOST+API.saveAppeal,parameters: parameters,encoding: URLEncodedFormParameterEncoder.default,headers: [tokenHeader()],responseType: ResponseModel.self) } + + func onlineReminder(parameters:P) -> Single?> { + return DDAF.get(urlString: HOST+API.onlineReminder,parameters: parameters,encoding: URLEncodedFormParameterEncoder.default,headers: [tokenHeader()],responseType: ResponseModel.self) + } + + func onlineReminderRead(parameters:P) -> Single?> { + return DDAF.get(urlString: HOST+API.onlineReminderRead,parameters: parameters,encoding: URLEncodedFormParameterEncoder.default,headers: [tokenHeader()],responseType: ResponseModel.self) + } } diff --git a/OrderScheduling/HttpResponseModel/ResponseModel.swift b/OrderScheduling/HttpResponseModel/ResponseModel.swift index a437e4c..377aff3 100644 --- a/OrderScheduling/HttpResponseModel/ResponseModel.swift +++ b/OrderScheduling/HttpResponseModel/ResponseModel.swift @@ -185,6 +185,9 @@ public class VehicleMonitorListDataModel : Decodable { var alarmType : AlarmType? var rosterStartTime : String? var rosterEndTime : String? + var rosterType : String? + var endTime : String? + var startTime : String? var lat : String? var lon : String? var orderCode : String? @@ -229,7 +232,11 @@ public class VehicleMonitorListDataModel : Decodable { var destinationLongitude : Double? var destinationLatitude : Double? var destinationAddress : String? - } + var leftTimeB : Double? + var leftTimeC : Double? + var distance : Double? + var mileageBc : Double? + var contractName : String? } } public class OrderPhotoListDataModel : Decodable { diff --git a/OrderScheduling/Rescue/View/AcceptOrderTool.swift b/OrderScheduling/Rescue/View/AcceptOrderTool.swift index c95284f..4a41440 100644 --- a/OrderScheduling/Rescue/View/AcceptOrderTool.swift +++ b/OrderScheduling/Rescue/View/AcceptOrderTool.swift @@ -20,6 +20,7 @@ open class AcceptOrderTool : NSObject { acceptOrderView.titleLabel.text = "新订单" acceptOrderView.contentLabel.text = TOOL.getOrderString(userInfo: userInfo) acceptOrderView.readButton.setTitle("查看", for: .normal) + acceptOrderView.cancelButton.setTitle("稍后查看", for: .normal) acceptOrderView.readButton.rx.tap .observe(on: MainScheduler.instance) .subscribe(onNext: { diff --git a/OrderScheduling/Rescue/View/AcceptOrderView.swift b/OrderScheduling/Rescue/View/AcceptOrderView.swift index 22eae91..2a1e40f 100644 --- a/OrderScheduling/Rescue/View/AcceptOrderView.swift +++ b/OrderScheduling/Rescue/View/AcceptOrderView.swift @@ -18,9 +18,8 @@ open class AcceptOrderView : DDView { public let contentLabel : DDLabel public let horizontalLine : DDView public let verticalLine : DDView - public let refuseButton : DDButton - public let acceptButton : DDButton public let readButton : DDButton + public let cancelButton : DDButton public override init(frame: CGRect) { radiusView = DDView.init() scrollView = DDScrollView() @@ -29,9 +28,8 @@ open class AcceptOrderView : DDView { contentLabel = DDLabel.dd_init(withText: "", font: .mediumFont(auto(14)), textColor: .hex("203053")) horizontalLine = DDView() verticalLine = DDView() - refuseButton = DDButton.dd_initCustom() - acceptButton = DDButton.dd_initCustom() readButton = DDButton.dd_initCustom() + cancelButton = DDButton.dd_initCustom() super.init(frame: frame) radiusView.layer.cornerRadius = auto(10) radiusView.layer.masksToBounds = true @@ -47,20 +45,14 @@ open class AcceptOrderView : DDView { verticalLine.backgroundColor = .hex("979797").alpha(0.35) verticalLine.isHidden = true radiusView.addSubview(verticalLine) - refuseButton.isHidden = true - refuseButton.titleLabel?.font = .mediumFont(auto(14)) - refuseButton.backgroundColor = .white - refuseButton.setTitleColor(.black.alpha(0.3), for: .normal) - radiusView.addSubview(refuseButton) - acceptButton.titleLabel?.font = .mediumFont(auto(14)) - acceptButton.backgroundColor = .white - acceptButton.setTitleColor(.black.alpha(0.3), for: .normal) - acceptButton.isHidden = true - radiusView.addSubview(acceptButton) readButton.titleLabel?.font = .mediumFont(auto(14)) readButton.backgroundColor = .white readButton.setTitleColor(.hex("1D64D2"), for: .normal) radiusView.addSubview(readButton) + cancelButton.titleLabel?.font = .mediumFont(auto(14)) + cancelButton.backgroundColor = .white + cancelButton.setTitleColor(.hex("1D64D2"), for: .normal) + cancelButton.addSubview(cancelButton) radiusView.snp.makeConstraints { make in make.edges.equalToSuperview() @@ -103,23 +95,18 @@ open class AcceptOrderView : DDView { make.width.equalTo(1) } - refuseButton.snp.makeConstraints { make in - make.bottom.equalToSuperview() - make.left.equalToSuperview() - make.top.equalTo(horizontalLine.snp.bottom) - make.right.equalTo(verticalLine.snp.left) - } - - acceptButton.snp.makeConstraints { make in + readButton.snp.makeConstraints { make in make.bottom.equalToSuperview() make.right.equalToSuperview() make.top.equalTo(horizontalLine.snp.bottom) make.left.equalTo(verticalLine.snp.right) } - readButton.snp.makeConstraints { make in + cancelButton.snp.makeConstraints { make in + make.bottom.equalToSuperview() + make.left.equalToSuperview() make.top.equalTo(horizontalLine.snp.bottom) - make.left.right.bottom.equalToSuperview() + make.right.equalTo(verticalLine.snp.left) } } diff --git a/OrderScheduling/Rescue/View/OnlineVehiclesEntryView.swift b/OrderScheduling/Rescue/View/OnlineVehiclesEntryView.swift new file mode 100644 index 0000000..46a6172 --- /dev/null +++ b/OrderScheduling/Rescue/View/OnlineVehiclesEntryView.swift @@ -0,0 +1,129 @@ +// +// OnlineVehiclesEntryView.swift +// OrderScheduling +// +// Created by 中道 on 2025/10/13. +// + +import UIKit +import SnapKit + +/// 弹窗:实时车辆在线情况 +final class OnlineVehiclesEntryView: UIView { + + // MARK: - Public + /// 点击“已知晓”回调 + var onConfirm: (() -> Void)? + + // MARK: - UI + private let pinImageView: UIImageView = { + let iv = UIImageView(image: UIImage(named: "online_entry_pin")) + iv.contentMode = .scaleAspectFit + return iv + }() + + private let backgroundImageView: UIImageView = { + let iv = UIImageView(image: UIImage(named: "online_entry_background")) + iv.contentMode = .scaleAspectFit + return iv + }() + + private let cardView: UIView = { + let v = UIView() + v.backgroundColor = .white + v.layer.cornerRadius = 16 + v.layer.shadowColor = UIColor.black.cgColor + v.layer.shadowOpacity = 0.12 + v.layer.shadowRadius = 10 + v.layer.shadowOffset = CGSize(width: 0, height: 6) + return v + }() + + private let titleLabel: UILabel = { + let l = UILabel() + l.text = "实时车辆在线情况" + l.textAlignment = .center + l.font = .boldSystemFont(ofSize: 16) + l.textColor = UIColor(hex: "#040404") + return l + }() + + /// 富文本正文 + private let contentLabel: UILabel = { + let l = UILabel() + l.numberOfLines = 0 + l.textAlignment = .left + l.textColor = UIColor(hex: "#4C5361") + l.font = .dd_systemFont(ofSize: 14, weight: .medium) + return l + }() + + private let confirmButton: UIButton = { + let b = UIButton(type: .system) + b.setTitle("已知晓", for: .normal) + b.setTitleColor(.white, for: .normal) + b.titleLabel?.font = .boldSystemFont(ofSize: 16) + b.backgroundColor = UIColor(hex: "#3174CE") + b.layer.cornerRadius = 24 + b.layer.masksToBounds = true + return b + }() + + // MARK: - Init + override init(frame: CGRect) { + super.init(frame: frame) + buildUI() + } + required init?(coder: NSCoder) { + super.init(coder: coder) + buildUI() + } + + convenience init(content: String?) { + self.init(frame: .zero) + contentLabel.text = content + } + + func buildUI() { + backgroundColor = .clear + + addSubview(cardView) + cardView.addSubview(backgroundImageView) + cardView.addSubview(pinImageView) + cardView.addSubview(titleLabel) + cardView.addSubview(contentLabel) + cardView.addSubview(confirmButton) + + cardView.snp.makeConstraints { make in + make.centerY.centerX.equalToSuperview() + make.left.right.equalToSuperview().inset(30) + } + + backgroundImageView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + } + + pinImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.centerY.equalTo(cardView.snp.top) + make.size.equalTo(CGSize(width: 88, height: 88)) + } + + titleLabel.snp.makeConstraints { make in + make.top.equalTo(pinImageView.snp.bottom).offset(20) + make.left.right.equalTo(cardView).inset(20) + } + + contentLabel.snp.makeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(12) + make.left.right.equalTo(titleLabel) + } + + confirmButton.snp.makeConstraints { make in + make.top.equalTo(contentLabel.snp.bottom).offset(18) + make.left.right.equalTo(titleLabel) + make.height.equalTo(48) + make.bottom.equalTo(cardView.snp.bottom).inset(20) + } + } +} diff --git a/OrderScheduling/Rescue/ViewController/RescueController.swift b/OrderScheduling/Rescue/ViewController/RescueController.swift index bfe17f2..744d83c 100644 --- a/OrderScheduling/Rescue/ViewController/RescueController.swift +++ b/OrderScheduling/Rescue/ViewController/RescueController.swift @@ -86,9 +86,7 @@ extension RescueController { USER.refreshTokenSub .subscribe(onNext: {[weak self] _ in - NewTraining.default.newTrainingRelay.accept(nil) - self?.appBannerRelay.accept(nil) - self?.appPushRecordRelay.accept(nil) + self?.excuseRelay() }) .disposed(by: disposeBag) @@ -138,19 +136,55 @@ extension RescueController { }) .disposed(by: disposeBag) + onlineReminderRelay + .flatMapLatest { _ in + return RQ.onlineReminder(parameters: OnlineReminderParameters(supplierId: UserData.default.supplierId)) + } + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] response in + guard let self = self else { return } + + if response?.success == true, let data = response?.data, let content = data.content { + let entryView = OnlineVehiclesEntryView(content: content) + entryView.onConfirm = { [weak self] in + guard let self = self else { return } + RQ.onlineReminderRead(parameters: OnlineReminderReadParameters(id: response?.data?.id)) + .observe(on: MainScheduler.instance) + .subscribe(onSuccess: {[weak self] readResponse in + guard let self = self else { return } + if readResponse?.success == true { + Entry.default.dismiss(name: "onlineVehiclesEntryView") + } else { + self.view.dd_makeToast(readResponse?.msg) + } + }) + .disposed(by: self.disposeBag) + } + Entry.default.showOnlineVehiclesEntry(view: entryView, name: "onlineVehiclesEntryView") + Tool.default.playVoiceWith(broadcast: content) + } else { + self.view.dd_makeToast(response?.msg) + } + }) + .disposed(by: disposeBag) + // 点击tabBar 需要刷下下列 preRefreshRelay .observe(on: MainScheduler.instance) .subscribe(onNext: {[weak self] _ in - NewTraining.default.newTrainingRelay.accept(nil) - self?.appBannerRelay.accept(nil) - self?.appPushRecordRelay.accept(nil) + self?.excuseRelay() MCOUNT.newestMessage() self?.categoryView.reloadData() }) .disposed(by: disposeBag) } + func excuseRelay() { + NewTraining.default.newTrainingRelay.accept(nil) + appBannerRelay.accept(nil) + appPushRecordRelay.accept(nil) + onlineReminderRelay.accept(nil) + } } extension RescueController : TYCyclePagerViewDataSource, TYCyclePagerViewDelegate { @@ -604,7 +638,7 @@ extension RescuePendingOrderController : UITableViewDelegate,UITableViewDataSour cell?.acceptButton.setTitle("接单", for: .normal) cell?.refuseButton.setTitle("拒单", for: .normal) } -// +// let model = resultArr[indexPath.row] cell?.typeLabel.text = model.taskServiceName cell?.orderNumLabel.text = model.orderCode @@ -1182,6 +1216,8 @@ class RescueController : ZDViewController { private var appBannerRelay = ReplayRelay.create(bufferSize: 1) private var bannerDataSources : [ConfigByCodeDataModel.ConfigByCodeBannerModel] = [] + private var onlineReminderRelay = ReplayRelay.create(bufferSize: 1) + override func viewDidLoad() { super.viewDidLoad() dd_navigationBarBackgroundColor = .hex("354683") diff --git a/OrderScheduling/ReviewFailed/ViewController/AdditionalPhotoController.swift b/OrderScheduling/ReviewFailed/ViewController/AdditionalPhotoController.swift index 3409ec3..3116c9f 100644 --- a/OrderScheduling/ReviewFailed/ViewController/AdditionalPhotoController.swift +++ b/OrderScheduling/ReviewFailed/ViewController/AdditionalPhotoController.swift @@ -12,6 +12,8 @@ import RxSwift import ZLPhotoBrowser import RxCocoa import RxRelay +import SnapKit +import DDUtilsSwiftKit_Private extension AdditionalPhotoController{ func addActions() { @@ -79,6 +81,55 @@ extension AdditionalPhotoController{ } }) .disposed(by: disposeBag) + + // 保存至相册(带 HUD,批量保存,统一结果反馈) + additionalPhotoView.actionView.save.rx.tap + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] in + guard let self = self else { return } + let images = self.collectSelectedImages() + guard !images.isEmpty else { self.view.dd_makeToast("请先选择照片"); return } + + // 显示 HUD + let hud = ZLProgressHUD.show() + + let group = DispatchGroup() + var successCount = 0 + + images.forEach { img in + group.enter() + ZLPhotoManager.saveImageToAlbum(image: img) { isSuccess, _ in + if isSuccess { successCount += 1 } + group.leave() + } + } + + group.notify(queue: .main) { + hud.hide() + if successCount == images.count { + self.view.dd_makeToast("已保存到相册") + } else if successCount == 0 { + // 全部失败:统一弹窗(沿用库内风格的 alert 方法) + self.presentSaveErrorAlert() + } else { + self.view.dd_makeToast("已保存 \(successCount)/\(images.count) 张") + } + } + }) + .disposed(by: disposeBag) + + // 分享 + additionalPhotoView.actionView.share.rx.tap + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] in + guard let self = self else { return } + let images = self.collectSelectedImages() + guard !images.isEmpty else { self.view.dd_makeToast("请先选择照片"); return } + let activity = UIActivityViewController(activityItems: images, applicationActivities: nil) + activity.modalPresentationStyle = .formSheet + self.present(activity, animated: true) + }) + .disposed(by: disposeBag) } } @@ -127,6 +178,33 @@ extension AdditionalPhotoController : UICollectionViewDelegate, UICollectionView }) .disposed(by: cell!.disposeBag) cell?.takePhotoButton.isHidden = !canModify + + // 选择模式 UI(无图片时不显示选择按钮) + let hasImage = (itemModel.photoUrl != nil) || ((cell?.uploadImageView.image) != nil) + cell?.selectButton.isHidden = !isSelecting || !hasImage + let isChecked = selectedIndexPaths.contains(indexPath) + cell?.selectButton.isSelected = isChecked + cell?.selectButton.setTitleColor(isChecked ? .white : UIColor.hex("#206FFF"), for: .normal) + + cell?.selectButton.rx.tap + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] in + guard let self = self else { return } + // 若当前无图片,忽略点击 + guard let c = collectionView.cellForItem(at: indexPath) as? AdditionalPhotoCell, c.uploadImageView.isHidden == false else { return } + if self.selectedIndexPaths.contains(indexPath) { + self.selectedIndexPaths.remove(indexPath) + } else { + self.selectedIndexPaths.insert(indexPath) + } + if let c = collectionView.cellForItem(at: indexPath) as? AdditionalPhotoCell { + let checked = self.selectedIndexPaths.contains(indexPath) + c.selectButton.isSelected = checked + c.selectButton.setTitleColor(checked ? .white : UIColor.hex("#206FFF"), for: .normal) + } + self.updateActionViewVisibility(animated: true) + }) + .disposed(by: cell!.disposeBag) return cell! } @@ -138,6 +216,26 @@ extension AdditionalPhotoController : UICollectionViewDelegate, UICollectionView } public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + if isSelecting { + // 无图片的条目不允许选中 + if let c = collectionView.cellForItem(at: indexPath) as? AdditionalPhotoCell, c.uploadImageView.isHidden { + return + } + if selectedIndexPaths.contains(indexPath) { + selectedIndexPaths.remove(indexPath) + } else { + selectedIndexPaths.insert(indexPath) + } + if let c = collectionView.cellForItem(at: indexPath) as? AdditionalPhotoCell { + let checked = selectedIndexPaths.contains(indexPath) + c.selectButton.isSelected = checked + c.selectButton.setTitleColor(checked ? .white : UIColor.hex("#206FFF"), for: .normal) + } + updateActionViewVisibility(animated: true) + return + } + + // 非选择模式:沿用原预览逻辑 let cell = self.collectionView(collectionView, cellForItemAt: indexPath) as? AdditionalPhotoCell if let image = cell?.uploadImageView.image { let vc = ZLImagePreviewController.init(datas: [image as Any],showSelectBtn: false,showBottomView: false) @@ -158,6 +256,9 @@ open class AdditionalPhotoController : ZDViewController { private let taskOrderId : Int private let canModify : Bool private var resultArr : [OrderPhotoListDataModel] = [] + private var isSelecting = false + private var selectedIndexPaths = Set() + private var selectButton: UIButton? public init(userOrderId: Int, orderCode: String, taskOrderId: Int, canModify:Bool){ self.userOrderId = userOrderId self.orderCode = orderCode @@ -179,6 +280,14 @@ open class AdditionalPhotoController : ZDViewController { addSubviews() addActions() + let selectButton = UIButton(type: .system) + selectButton.setTitle("选择", for: .normal) + selectButton.setTitleColor(.white.alpha(0.7), for: .normal) + selectButton.titleLabel?.font = UIFont.systemFont(ofSize: 16, weight: .medium) + selectButton.addTarget(self, action: #selector(toggleSelectMode), for: .touchUpInside) + let barButton = UIBarButtonItem(customView: selectButton) + navigationItem.rightBarButtonItem = barButton + self.selectButton = selectButton } func addSubviews() { @@ -194,11 +303,80 @@ open class AdditionalPhotoController : ZDViewController { additionalPhotoView.collectionView.delegate = self additionalPhotoView.collectionView.dataSource = self } + + @objc private func toggleSelectMode() { + if isSelecting { cancelSelectMode() } else { enterSelectMode() } + } + private func enterSelectMode() { + isSelecting = true + selectedIndexPaths.removeAll() + selectButton?.setTitle("取消", for: .normal) + updateActionViewVisibility(animated: true) + additionalPhotoView.collectionView.reloadData() + } + private func cancelSelectMode() { + isSelecting = false + selectedIndexPaths.removeAll() + selectButton?.setTitle("选择", for: .normal) + updateActionViewVisibility(animated: true) + additionalPhotoView.collectionView.reloadData() + } + private func updateActionViewVisibility(animated: Bool) { + let shouldShow = isSelecting && !selectedIndexPaths.isEmpty + let targetHeight: CGFloat = shouldShow ? 50 : 0 + additionalPhotoView.actionView.isHidden = (targetHeight == 0) + additionalPhotoView.actionHeightConstraint?.update(offset: targetHeight) + if isSelecting { + if !selectedIndexPaths.isEmpty { + selectButton?.setTitle("取消", for: .normal) + } else { + selectButton?.setTitle("取消", for: .normal) + } + } else { + selectButton?.setTitle("选择", for: .normal) + } + if animated { + UIView.animate(withDuration: 0.25) { self.view.layoutIfNeeded() } + } else { + self.view.layoutIfNeeded() + } + } + private func collectSelectedImages() -> [UIImage] { + var images: [UIImage] = [] + for indexPath in selectedIndexPaths { + let sectionModel = resultArr[indexPath.section] + let itemModel = sectionModel.photoList[indexPath.item] + if let cell = additionalPhotoView.collectionView.cellForItem(at: indexPath) as? AdditionalPhotoCell, + let img = cell.uploadImageView.image { + images.append(img) + } else if let urlString = itemModel.photoUrl, + let url = URL(string: urlString), + let data = try? Data(contentsOf: url), + let img = UIImage(data: data) { + images.append(img) + } + } + return images + } + + private func presentSaveErrorAlert() { + let alert = UIAlertController(title: nil, message: "图片保存失败,请检查相册权限", preferredStyle: .alert) + let cancel = UIAlertAction(title: "取消", style: .cancel, handler: nil) + let confirm = UIAlertAction(title: "确定", style: .default, handler: { _ in + UrlLinks.default.openSetting() + }) + alert.addAction(cancel) + alert.addAction(confirm) + self.present(alert, animated: true) + } } open class AdditionalPhotoView : DDView { public var collectionView : DDCollectionView + public var actionView : AdditionalPhotoActionView + public var actionHeightConstraint : Constraint? + public override init(frame: CGRect) { let flowLayout = UICollectionViewFlowLayout.init() flowLayout.itemSize = CGSize(width: auto(165), height: auto(100)) @@ -207,13 +385,20 @@ open class AdditionalPhotoView : DDView { flowLayout.minimumLineSpacing = auto(10) flowLayout.sectionInset = UIEdgeInsets(top: auto(10), left: auto(15), bottom: auto(10), right: auto(15)) collectionView = DDCollectionView(frame: .zero, collectionViewLayout: flowLayout) + actionView = AdditionalPhotoActionView() super.init(frame: frame) collectionView.backgroundColor = .white addSubview(collectionView) - collectionView.snp.makeConstraints { make in - make.top.left.right.bottom.equalToSuperview() + make.top.left.right.equalToSuperview() + } + actionView.isHidden = true + addSubview(actionView) + actionView.snp.makeConstraints { make in + make.top.equalTo(collectionView.snp.bottom) + make.left.right.bottom.equalToSuperview() + self.actionHeightConstraint = make.height.equalTo(0).constraint } } @@ -230,6 +415,7 @@ open class AdditionalPhotoCell : DDCollectionViewCell { public let stateLabel : DDLabel public let takePhotoButton : DDButton public let uploadImageView : DDImageView + public let selectButton : DDButton public var disposeBag = DisposeBag() public override init(frame: CGRect) { @@ -240,8 +426,10 @@ open class AdditionalPhotoCell : DDCollectionViewCell { stateLabel = DDLabel.dd_init(withText: "", font: .regularFont(auto(12)), textColor: .white) takePhotoButton = DDButton.dd_initCustom() uploadImageView = DDImageView.init() + selectButton = DDButton.dd_initCustom() super.init(frame: .zero) + titleLabel.numberOfLines = 2 addSubview(titleLabel) backgroundImageView.layer.borderColor = UIColor.hex("000000").alpha(0.1).cgColor backgroundImageView.layer.borderWidth = 0.5 @@ -263,8 +451,14 @@ open class AdditionalPhotoCell : DDCollectionViewCell { takePhotoButton.setImage(UIImage(named: "additionalPhotot_takePhoto"), for: .normal) backgroundImageView.addSubview(takePhotoButton) + backgroundImageView.addSubview(selectButton) + selectButton.setImage(UIImage(named: "refuseOrder_reason_unselected"), for: .normal) + selectButton.setImage(UIImage(named: "refuseOrder_reason_selected"), for: .selected) + selectButton.isHidden = true + titleLabel.snp.makeConstraints { make in make.left.equalTo(auto(5)) + make.right.equalTo(-auto(5)) make.top.equalTo(0) } @@ -298,6 +492,10 @@ open class AdditionalPhotoCell : DDCollectionViewCell { make.edges.equalToSuperview() } + selectButton.snp.makeConstraints { make in + make.top.right.equalToSuperview().inset(0) + make.width.height.equalTo(auto(30)) + } } public required init?(coder: NSCoder) { @@ -306,6 +504,8 @@ open class AdditionalPhotoCell : DDCollectionViewCell { open override func prepareForReuse() { super.prepareForReuse() + selectButton.isSelected = false + selectButton.isHidden = true disposeBag = DisposeBag() } } @@ -328,3 +528,56 @@ open class AdditionalPhotoHeaderView : DDCollectionViewCell { fatalError("init(coder:) has not been implemented") } } + +open class AdditionalPhotoActionView : UIView { + public let save : UIButton = UIButton(type: .custom) + public let share : UIButton = UIButton(type: .custom) + private let topSeparator = UIView() + private let middleSeparator = UIView() + override init(frame: CGRect) { + super.init(frame: frame) + buildUI() + } + + required public init?(coder: NSCoder) { + super.init(coder: coder) + buildUI() + } + + func buildUI() { + // Top horizontal separator + topSeparator.backgroundColor = UIColor.hex("E5E6EB") + addSubview(topSeparator) + topSeparator.snp.makeConstraints { make in + make.top.left.right.equalToSuperview() + make.height.equalTo(1.0 / UIScreen.main.scale) + } + + save.setTitle("保存至相册", for: .normal) + save.setTitleColor(.black, for: .normal) + save.titleLabel?.font = .dd_systemFont(ofSize: 16, weight: .medium) + addSubview(save) + share.setTitle("分享", for: .normal) + share.setTitleColor(.black, for: .normal) + share.titleLabel?.font = .dd_systemFont(ofSize: 16, weight: .medium) + addSubview(share) + save.snp.makeConstraints { make in + make.centerX.equalToSuperview().multipliedBy(0.5) + make.centerY.equalToSuperview() + } + share.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.centerX.equalToSuperview().multipliedBy(1.5) + } + + // Middle vertical separator + middleSeparator.backgroundColor = UIColor.hex("E5E6EB") + addSubview(middleSeparator) + middleSeparator.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.centerY.equalToSuperview() + make.width.equalTo(1.0 / UIScreen.main.scale) + make.height.equalTo(24) + } + } +} diff --git a/OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift b/OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift index 3c605a5..6333ce4 100644 --- a/OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift +++ b/OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift @@ -18,8 +18,8 @@ import DDUIGestureRecognizer import DDUtilsSwiftKit_Private fileprivate let vehicleMonitoringPannelViewHeight = auto(300) -fileprivate let vehicleMonitoringPannelCategoryView = auto(40) -fileprivate let vehicleMonitoringListDetailViewHeight = auto(190) +fileprivate let vehicleMonitoringPannelCategoryViewHeight = auto(40) +fileprivate let vehicleMonitoringListDetailViewHeight = auto(270) fileprivate let vehicleMonitoringPointAnnotationW = auto(120) fileprivate let vehicleMonitoringPointAnnotationNameLeftInset = auto(35) @@ -768,8 +768,39 @@ extension VehicleMonitoringController { /// 视频按钮显示规则 if let number = vehicleModel.number, number.isEmpty == false { vehicleMonitoringListDetailView.videoButton.isHidden = false + vehicleMonitoringListDetailView.videoButton.snp.updateConstraints { make in + make.left.equalTo(vehicleMonitoringListDetailView.settingButton.snp.right).offset(auto(10)) + make.width.equalTo(auto(23)) + } }else{ vehicleMonitoringListDetailView.videoButton.isHidden = true + vehicleMonitoringListDetailView.videoButton.snp.updateConstraints { make in + make.left.equalTo(vehicleMonitoringListDetailView.settingButton.snp.right).offset(0) + make.width.equalTo(0) + } + } + + if let terminalType = vehicleModel.terminalType { + vehicleMonitoringListDetailView.locationLabel.text = "定位:\(terminalType)" + } + + var workScheduleString = "" + if let startTime = vehicleModel.startTime, let endTime = vehicleModel.endTime { + workScheduleString = "\(startTime)-\(endTime)" + } + if workScheduleString.count > 0 { + if let rosterType = vehicleModel.rosterType { + workScheduleString = workScheduleString.appending("/\(rosterType)") + } + }else{ + workScheduleString = vehicleModel.rosterType ?? "" + } + if workScheduleString.count == 0 { + vehicleMonitoringListDetailView.workScheduleTitle.text = nil + vehicleMonitoringListDetailView.workScheduleContent.text = nil + }else{ + vehicleMonitoringListDetailView.workScheduleTitle.text = "排班:" + vehicleMonitoringListDetailView.workScheduleContent.text = workScheduleString } /// 当为max时收回pannelView @@ -959,7 +990,7 @@ open class VehicleMonitoringController : ZDViewController { vehicleMonitoringView.vehicleMonitoringPannelView.categoryView.snp.remakeConstraints { make in make.top.equalToSuperview().priority(.high) make.left.right.equalToSuperview() - make.height.equalTo(vehicleMonitoringPannelCategoryView) + make.height.equalTo(vehicleMonitoringPannelCategoryViewHeight) } vehicleMonitoringListDetailView.layer.cornerRadius = vehicleMonitoringPannelViewCornerRadius @@ -971,13 +1002,13 @@ open class VehicleMonitoringController : ZDViewController { make.bottom.equalToSuperview() }) - let minDisplayHeight = vehicleMonitoringPannelCategoryView + let minDisplayHeight = vehicleMonitoringPannelCategoryViewHeight let maxDisplayHeight = view.height - SafeAreaInsets.safeAreaInsetsTop - SafeAreaInsets.safeAreaInsetsBottom - auto(150) let defaultDisplayHeight = vehicleMonitoringListDetailViewHeight vehicleMonitoringView.maMapView.snp.remakeConstraints { make in make.left.right.equalToSuperview() make.top.equalToSuperview() - make.bottom.equalToSuperview().offset(-vehicleMonitoringPannelCategoryView + vehicleMonitoringPannelViewCornerRadius) + make.bottom.equalToSuperview().offset(-vehicleMonitoringPannelCategoryViewHeight + vehicleMonitoringPannelViewCornerRadius) } if pannelPanGes.panGesValue.expandLevel == .max { @@ -1355,6 +1386,9 @@ class VehicleMonitoringListDetailView : DDView, JXCategoryListContainerViewDeleg public let vehicleLabel : DDLabel public let settingButton : DDButton public let videoButton : DDButton + public let locationLabel : DDLabel + public let workScheduleTitle : DDLabel + public let workScheduleContent : DDLabel public let nameLabel : DDLabel public let callButton : DDButton public let containerView : DDView @@ -1380,7 +1414,10 @@ class VehicleMonitoringListDetailView : DDView, JXCategoryListContainerViewDeleg settingButton.setBackgroundImage(UIImage(named: "vehicleMonitoring_setting"), for: .normal) videoButton = DDButton.dd_initCustom() videoButton.setBackgroundImage(UIImage(named: "vehicleMonitoring_video_icon"), for: .normal) - nameLabel = DDLabel.dd_init(withText: "", font: .regularFont(auto(14)), textColor: .hex("11142F")) + locationLabel = DDLabel.dd_init(withText: "", font: .regularFont(12), textColor: .hex("11142F")) + workScheduleTitle = DDLabel.dd_init(withText: "", font: .regularFont(12), textColor: .hex("11142F")) + workScheduleContent = DDLabel.dd_init(withText: "", font: .regularFont(12), textColor: .hex("11142F")) + nameLabel = DDLabel.dd_init(withText: "", font: .regularFont(auto(12)), textColor: .hex("11142F")) callButton = DDButton.dd_initCustom() callButton.setBackgroundImage(UIImage(named: "vehicleMonitor_call_cell"), for: .normal) containerView = DDView() @@ -1404,9 +1441,11 @@ class VehicleMonitoringListDetailView : DDView, JXCategoryListContainerViewDeleg addSubview(vehicleLabel) addSubview(settingButton) addSubview(videoButton) + addSubview(locationLabel) addSubview(nameLabel) addSubview(callButton) - + addSubview(workScheduleTitle) + addSubview(workScheduleContent) containerView.backgroundColor = .hex("FAFAFA") containerView.layer.cornerRadius = auto(5) containerView.layer.masksToBounds = true @@ -1427,7 +1466,7 @@ class VehicleMonitoringListDetailView : DDView, JXCategoryListContainerViewDeleg containerView.snp.makeConstraints { make in make.left.right.equalToSuperview().inset(auto(7)) - make.top.equalTo(backButton.snp.bottom).offset(0) + make.top.equalTo(workScheduleContent.snp.bottom).offset(auto(5)) make.bottom.equalToSuperview().offset(-auto(10)) } @@ -1498,6 +1537,11 @@ class VehicleMonitoringListDetailView : DDView, JXCategoryListContainerViewDeleg make.height.equalTo(auto(13)) } + locationLabel.snp.makeConstraints { make in + make.left.equalTo(videoButton.snp.right).offset(auto(10)) + make.centerY.equalTo(icon) + } + callButton.snp.makeConstraints { make in make.right.equalTo(-auto(20)) make.centerY.equalTo(backButton) @@ -1509,6 +1553,17 @@ class VehicleMonitoringListDetailView : DDView, JXCategoryListContainerViewDeleg make.centerY.equalTo(callButton) } + workScheduleTitle.snp.makeConstraints { make in + make.top.equalTo(backButton.snp.bottom) + make.left.equalTo(icon) + } + + workScheduleContent.snp.makeConstraints { make in + make.left.equalTo(workScheduleTitle.snp.right).offset(auto(10)) + make.right.lessThanOrEqualToSuperview().offset(-auto(20)) + make.top.equalTo(workScheduleTitle) + } + previousButton.rx.tap .observe(on: MainScheduler.instance) .subscribe(onNext: {[weak self] in @@ -1572,6 +1627,12 @@ class VMLDContainerView : DDView , JXCategoryListContentViewDelegate { var incidentLabel : DDLabel var destIcon : UIImageView var destLabel : DDLabel + var contractImageView : DDImageView + var contractTitle : DDLabel + var contractContent : DDLabel + var distanceFromPointLabel : DDLabel + var remainTimeLabel : DDLabel + var distanceLabel : DDLabel override init(frame: CGRect) { orderNumButton = UIButton() orderNumButton.setTitleColor(.hex("0E76F4"), for: .normal) @@ -1583,6 +1644,12 @@ class VMLDContainerView : DDView , JXCategoryListContentViewDelegate { incidentLabel = DDLabel.dd_init(withText: "", font: .regularFont(auto(12)), textColor: .hex("000000").alpha(0.7)) destIcon = UIImageView(image: UIImage(named: "vehichleMonitoring_terminal_16")) destLabel = DDLabel.dd_init(withText: "", font: .regularFont(auto(12)), textColor: .hex("000000").alpha(0.7)) + contractImageView = DDImageView(image: UIImage(named: "vehichleMonitoring_contract_16")) + contractTitle = DDLabel.dd_init(withText: "合同:", font: .regularFont(12), textColor: .hex("11142F")) + contractContent = DDLabel.dd_init(withText: "", font: .regularFont(12), textColor: .hex("11142F")) + distanceFromPointLabel = DDLabel() + remainTimeLabel = DDLabel() + distanceLabel = DDLabel() super.init(frame: frame) addSubview(orderNumButton) @@ -1599,6 +1666,14 @@ class VMLDContainerView : DDView , JXCategoryListContentViewDelegate { destLabel.numberOfLines = 0 destLabel.textAlignment = .left addSubview(destLabel) + addSubview(contractImageView) + addSubview(contractTitle) + contractContent.textAlignment = .right + contractContent.numberOfLines = 2 + addSubview(contractContent) + addSubview(distanceFromPointLabel) + addSubview(remainTimeLabel) + addSubview(distanceLabel) orderNumButton.snp.makeConstraints { make in make.left.equalTo(auto(20)) @@ -1625,10 +1700,27 @@ class VMLDContainerView : DDView , JXCategoryListContentViewDelegate { make.left.right.equalToSuperview().inset(auto(20)) } + contractImageView.snp.makeConstraints { make in + make.left.equalTo(orderNumButton) + make.top.equalTo(line.snp.bottom).offset(auto(5)) + make.width.height.equalTo(auto(15)) + } + + contractTitle.snp.makeConstraints { make in + make.left.equalTo(contractImageView.snp.right).offset(auto(10)) + make.centerY.equalTo(contractImageView.snp.centerY) + } + + contractContent.snp.makeConstraints { make in + make.left.equalTo(contractTitle.snp.right).offset(auto(10)) + make.right.equalToSuperview().offset(-auto(20)) + make.centerY.equalTo(contractImageView) + } + incidentIcon.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) incidentIcon.snp.makeConstraints { make in make.left.equalTo(orderNumButton) - make.top.equalTo(line.snp.bottom).offset(auto(15)) + make.top.equalTo(contractImageView.snp.bottom).offset(auto(15)) } incidentLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) @@ -1652,6 +1744,22 @@ class VMLDContainerView : DDView , JXCategoryListContentViewDelegate { make.right.equalTo(-auto(20)) make.bottom.greaterThanOrEqualTo(destIcon) } + + remainTimeLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.height.equalTo(auto(20)) + make.top.equalTo(destLabel.snp.bottom).offset(auto(10)) + } + + distanceFromPointLabel.snp.makeConstraints { make in + make.left.equalTo(orderNumButton) + make.centerY.equalTo(remainTimeLabel) + } + + distanceLabel.snp.makeConstraints { make in + make.right.equalTo(-auto(20)) + make.centerY.equalTo(remainTimeLabel) + } } required init?(coder: NSCoder) { @@ -1663,7 +1771,38 @@ class VMLDContainerView : DDView , JXCategoryListContentViewDelegate { titleLabel.text = taskModel.serviceName stateLabel.text = taskModel.taskStatusString incidentLabel.text = taskModel.vehiclePointAddress - destLabel.text = taskModel.destinationAddress + destLabel.text = (taskModel.destinationAddress ?? "") + (taskModel.destinationAddress ?? "") + contractContent.text = taskModel.contractName + var point = "" + var leftTime : Int? = nil + if let leftTimeB = taskModel.leftTimeB { + point = "B" + leftTime = Int(leftTimeB) + }else if let leftTimeC = taskModel.leftTimeC { + point = "C" + leftTime = Int(leftTimeC) + } + let distanceFromPointAttributeString = NSMutableAttributedString(string: "距离\(point)点: ",attributes: [.foregroundColor : UIColor.hex("11142F"),.font : UIFont.regularFont(12)]) + if let distance = taskModel.distance { + distanceFromPointAttributeString.append(NSMutableAttributedString(string: "\(distance)", attributes: [.foregroundColor : UIColor.hex("F93D3D"),.font : UIFont.regularFont(12)])) + distanceFromPointAttributeString.append(NSMutableAttributedString(string: "km", attributes: [.foregroundColor : UIColor.hex("11142F"),.font : UIFont.regularFont(12)])) + distanceFromPointLabel.attributedText = distanceFromPointAttributeString + } + + let leftTimeAttributeString = NSMutableAttributedString(string: "剩余时间: ",attributes: [.foregroundColor : UIColor.hex("11142F"),.font : UIFont.regularFont(12)]) + if let leftTime { + leftTimeAttributeString.append(NSMutableAttributedString(string: "\(leftTime)", attributes: [.foregroundColor : UIColor.hex("F93D3D"),.font : UIFont.regularFont(12)])) + leftTimeAttributeString.append(NSMutableAttributedString(string: "分", attributes: [.foregroundColor : UIColor.hex("11142F"),.font : UIFont.regularFont(12)])) + remainTimeLabel.attributedText = leftTimeAttributeString + } + + let bcAttributeString = NSMutableAttributedString(string: "BC: ",attributes: [.foregroundColor : UIColor.hex("11142F"),.font : UIFont.regularFont(12)]) + if let mileageBc = taskModel.mileageBc { + bcAttributeString.append(NSMutableAttributedString(string: "\(mileageBc)", attributes: [.foregroundColor : UIColor.hex("F93D3D"),.font : UIFont.regularFont(12)])) + bcAttributeString.append(NSMutableAttributedString(string: "km", attributes: [.foregroundColor : UIColor.hex("11142F"),.font : UIFont.regularFont(12)])) + distanceLabel.attributedText = bcAttributeString + } + } func listView() -> UIView! {