//
|
// PublishSaleCarVC.swift
|
// OKProject
|
//
|
// Created by 无故事王国 on 2022/5/9.
|
// Copyright © 2022 yangwang. All rights reserved.
|
//
|
|
import UIKit
|
import QMUIKit
|
import TZImagePickerController
|
|
private let cellW:Double = (ScreenWidth - 30.0)/2.0
|
private let cellH:Double = 36
|
private let descCellW:Double = (ScreenWidth - 52 - 20) / 3.0
|
private let descCellH:Double = ((ScreenWidth - 52 - 20) / 3.0) * 0.67
|
|
class PublishSaleCarVC: YYViewController {
|
@IBOutlet weak var titleField: UITextField! //标题
|
@IBOutlet weak var identifyField: QMUITextField! //车辆识别代码
|
@IBOutlet weak var licensePlateField: UITextField! //车牌号
|
@IBOutlet weak var brandField: UITextField!//品牌
|
@IBOutlet weak var carThemeColorField: UITextField!//车辆颜色
|
@IBOutlet weak var firstEnrollTimeField: UITextField! //首次上牌时间
|
@IBOutlet weak var travelDistanceField: UITextField! //行驶里程
|
@IBOutlet weak var licenseFromField: UITextField! //牌照所在地
|
@IBOutlet weak var transferNumField: UITextField! //过户次数
|
@IBOutlet weak var displacementField: UITextField! //排量
|
@IBOutlet weak var gearField: UITextField! //变速箱
|
@IBOutlet weak var transferPriceField: UITextField! //装让价格
|
@IBOutlet weak var levelField: UITextField! //登记
|
@IBOutlet weak var transferPriceBtn: QMUIButton! //转让价格
|
@IBOutlet weak var buyAmountPriceField: UITextField! //购买价格
|
@IBOutlet weak var descTextView: QMUITextView! //描述
|
@IBOutlet weak var descCollectionView: UICollectionView! //车况照片
|
@IBOutlet weak var descCollectionHeiCons: NSLayoutConstraint! //车况照片高度
|
@IBOutlet weak var carImgsCountL: UILabel! //车辆图片数量
|
@IBOutlet weak var carVIdeoCountL: UILabel!
|
@IBOutlet weak var carImgsCollectionView: UICollectionView! // 车辆照片
|
@IBOutlet weak var carImgsCollectionHeiCons: NSLayoutConstraint!
|
@IBOutlet weak var carVideoBtn: UIButton! //车辆视频
|
@IBOutlet weak var highInsuranceDelTimeField: UITextField! //交强险到期时间
|
@IBOutlet weak var yearReviewDelTimeField: UITextField! //年检到期时间
|
@IBOutlet weak var businessInsuranceDelTimeField: UITextField! //商业险到期时间
|
|
@IBOutlet weak var havePledgeBtn: UIButton! //有抵押
|
@IBOutlet weak var notHavePledgeBtn: UIButton! //无抵押
|
@IBOutlet weak var collocateCollectionView: UICollectionView! //车辆装置
|
@IBOutlet weak var collocateCollectionViewHeiCons: NSLayoutConstraint!
|
|
@IBOutlet weak var contactPhoneField: QMUITextField! //联系人电话
|
@IBOutlet weak var contactNameField: UITextField! //联系人
|
@IBOutlet weak var provinceBtn: QMUIButton! //省
|
@IBOutlet weak var cityBtn: QMUIButton! //市
|
@IBOutlet weak var detailField: UITextField! //详细地址
|
@IBOutlet weak var agreenTreatyBtn: UIButton!
|
|
private var selectProvince:BRProvinceModel?
|
private var selectCity:BRCityModel?
|
private var sellCarReqModel:SellCarReqModel!
|
private var selectVideo:PHAsset?
|
private var selectCoverImg:UIImage!
|
private var selectImgAssets = NSMutableArray()
|
private var selectCarImgAssets = NSMutableArray()
|
private var currChoosePhoto:Int = 0
|
private var brandModels = [BrandModel]()
|
private var tempImgeSaveManager:TempImgeSaveManager = TempImgeSaveManager.getSharedInstance()
|
private var configModels:[ConfigModel] = ConfigModel.localConfig()
|
private var isEdit:Bool = false
|
private let queue = DispatchQueue(label: "upload")
|
private let group = DispatchGroup()
|
private let agreementViewModel = AgreementViewModel()
|
private var saveEdit:Bool!
|
|
init(_ m:SellCarReqModel?,isEdit:Bool,saveEdit:Bool = true) {
|
super.init(nibName: nil, bundle: nil)
|
self.sellCarReqModel = m
|
self.saveEdit = saveEdit
|
self.isEdit = isEdit
|
}
|
|
required init?(coder: NSCoder) {
|
fatalError("init(coder:) has not been implemented")
|
}
|
|
override func viewDidLoad() {
|
if isEdit{
|
navigationItem.title = "卖车信息编辑"
|
}else{
|
navigationItem.title = "卖车信息发布"
|
sellCarReqModel = SellCarReqModel.get()
|
}
|
|
titleField.text = sellCarReqModel.title
|
identifyField.text = sellCarReqModel.carIdentificationCode
|
licensePlateField.text = sellCarReqModel.carLicensePlate
|
carThemeColorField.text = sellCarReqModel.carColor
|
|
if sellCarReqModel.mileage != nil && sellCarReqModel.mileage != 0{
|
travelDistanceField.text = String(format: "%.2lf", (sellCarReqModel.mileage ?? 0))
|
}
|
|
if sellCarReqModel.transferTimes != nil{
|
transferNumField.text = String(format: "%ld", sellCarReqModel.transferTimes!)
|
}
|
|
if sellCarReqModel.transferPrice != nil{
|
transferPriceField.text = String(format: "%.2lf", sellCarReqModel.transferPrice!)
|
}
|
|
if sellCarReqModel.newCarPrice != nil{
|
buyAmountPriceField.text = String(format: "%.2lf", sellCarReqModel.newCarPrice!)
|
}
|
|
if sellCarReqModel.provinceName != nil{
|
provinceBtn.setTitle(sellCarReqModel.provinceName, for: .normal)
|
provinceBtn.setTitleColor(.black, for: .normal)
|
}
|
|
if sellCarReqModel.cityName != nil{
|
cityBtn.setTitle(sellCarReqModel.cityName, for: .normal)
|
cityBtn.setTitleColor(.black, for: .normal)
|
}
|
|
firstEnrollTimeField.text = sellCarReqModel.licensingTime
|
brandField.text = sellCarReqModel.brandName
|
displacementField.text = sellCarReqModel.displacement
|
gearField.text = sellCarReqModel.transmissionCase
|
levelField.text = sellCarReqModel.level
|
licenseFromField.text = sellCarReqModel.locationOfLicensePlate
|
highInsuranceDelTimeField.text = sellCarReqModel.dueTimeOfCompulsoryInsurance
|
yearReviewDelTimeField.text = sellCarReqModel.expirationTimeOfAnnualInspection
|
businessInsuranceDelTimeField.text = sellCarReqModel.maturityTimeOfCommercialInsurance
|
|
if sellCarReqModel.installationConfiguration != nil{
|
for (index,item) in configModels.enumerated(){
|
if sellCarReqModel.installationConfiguration!.contains(item.name){
|
configModels[index].check = true
|
}
|
}
|
}
|
|
if sellCarReqModel.mortgage == 1{
|
pledgeAction(havePledgeBtn)
|
}else{
|
pledgeAction(notHavePledgeBtn)
|
}
|
|
transferPriceBtn.isSelected = sellCarReqModel.includingTransferFee == 1
|
|
descTextView.text = sellCarReqModel.describe
|
contactNameField.text = sellCarReqModel.contactsName
|
detailField.text = sellCarReqModel.addres
|
|
|
let queue = DispatchQueue(label: "video")
|
queue.async {[weak self] () in
|
guard let weakSelf = self else { return }
|
if let videoUrl = weakSelf.sellCarReqModel.videoUrl,videoUrl.isEmpty == false{
|
let asset = AVURLAsset(url: URL(string: videoUrl)!)
|
let gen = AVAssetImageGenerator(asset: asset)
|
gen.appliesPreferredTrackTransform = true
|
let time = CMTimeMakeWithSeconds(0.0, preferredTimescale: 1)
|
var actualTime : CMTime = CMTimeMakeWithSeconds(0, preferredTimescale: 0)
|
do {
|
let image = try gen.copyCGImage(at: time, actualTime: &actualTime)
|
weakSelf.selectCoverImg = UIImage(cgImage: image)
|
weakSelf.carVideoBtn.setImage(weakSelf.selectCoverImg, for: .normal)
|
weakSelf.carVIdeoCountL.text = "车辆视频1/1"
|
} catch {
|
print("错误")
|
}
|
}
|
}
|
|
if let imgUrls = sellCarReqModel.describeImgUrl?.components(separatedBy: ",").filter({!$0.isEmpty}){
|
for imgUrl in imgUrls {
|
selectImgAssets.insert(imgUrl, at: 0)
|
}
|
}
|
|
if let imgUrls = sellCarReqModel.imgUrl?.components(separatedBy: ",").filter({!$0.isEmpty}){
|
for imgUrl in imgUrls {
|
selectCarImgAssets.insert(imgUrl, at: 0)
|
}
|
}
|
|
|
yy_popBlock = { [weak self] () in
|
guard let weakSelf = self else { return }
|
|
if !weakSelf.saveEdit{
|
weakSelf.yy_pop();return
|
}
|
|
if weakSelf.sellCarReqModel?.hasValue ?? false{
|
alert(popup: .double, title: "提示", text: "您的数据还未提交,确定返回?", submitTitle: "确定", cancelTitle: "取消") {
|
//缓存数据
|
weakSelf.tempImgeSaveManager.sell_imgs_1.removeAll()
|
weakSelf.tempImgeSaveManager.sell_imgs_2.removeAll()
|
for item in weakSelf.selectCarImgAssets{
|
if let m = item as? PHAsset{
|
weakSelf.tempImgeSaveManager.sell_imgs_1.insert(m, at: 0)
|
}
|
}
|
|
for item in weakSelf.selectImgAssets{
|
if let m = item as? PHAsset{
|
weakSelf.tempImgeSaveManager.sell_imgs_2.insert(m, at: 0)
|
}
|
}
|
|
if weakSelf.selectVideo != nil{
|
weakSelf.tempImgeSaveManager.sell_video_1.append(weakSelf.selectVideo!)
|
weakSelf.tempImgeSaveManager.sell_video_1_coverImg = weakSelf.selectCoverImg
|
}
|
|
weakSelf.sellCarReqModel.installationConfiguration = weakSelf.configModels.filter({$0.check == true}).map({$0.name}).joined(separator: ",")
|
|
weakSelf.sellCarReqModel.save()
|
weakSelf.yy_pop()
|
} cancelClick: {
|
|
}
|
}else{
|
weakSelf.yy_pop()
|
}
|
}
|
|
APIManager.shared.provider.rx.request(.queryAllBrand).map(YYModel<[BrandModel]>.self).validate().subscribe(onSuccess: {[weak self] state in
|
self?.brandModels = state.data ?? []
|
}) { error in
|
|
}.disposed(by: disposeBag)
|
|
super.viewDidLoad()
|
}
|
|
override func setupViews() {
|
super.setupViews()
|
view.backgroundColor = UIColor(hexString: "#F3F4F5")
|
|
selectImgAssets.add("icon_photo_update-1")
|
selectCarImgAssets.add("icon_photo_update-1")
|
selectVideo = tempImgeSaveManager.sell_video_1.first
|
|
for imgPHasset in tempImgeSaveManager.sell_imgs_1 {
|
selectCarImgAssets.insert(imgPHasset, at: 0)
|
}
|
|
for imgPHasset in tempImgeSaveManager.sell_imgs_2 {
|
selectImgAssets.insert(imgPHasset, at: 0)
|
}
|
|
transferPriceBtn.imagePosition = .left
|
transferPriceBtn.spacingBetweenImageAndTitle = 4
|
provinceBtn.imagePosition = .right
|
cityBtn.imagePosition = .right
|
provinceBtn.spacingBetweenImageAndTitle = 7
|
cityBtn.spacingBetweenImageAndTitle = 7
|
|
firstEnrollTimeField.delegate = self
|
travelDistanceField.delegate = self
|
displacementField.delegate = self
|
licenseFromField.delegate = self
|
transferPriceField.delegate = self
|
brandField.delegate = self
|
gearField.delegate = self
|
levelField.delegate = self
|
buyAmountPriceField.delegate = self
|
highInsuranceDelTimeField.delegate = self
|
yearReviewDelTimeField.delegate = self
|
businessInsuranceDelTimeField.delegate = self
|
collocateCollectionView.delegate = self
|
collocateCollectionView.dataSource = self
|
collocateCollectionView.register(UINib(nibName: "CheckItemTCell", bundle: nil), forCellWithReuseIdentifier: "_CheckItemTCell")
|
collocateCollectionView.isScrollEnabled = false
|
|
descCollectionView.delegate = self
|
descCollectionView.dataSource = self
|
descCollectionView.register(UINib(nibName: "Common_FullImg_CCell", bundle: nil), forCellWithReuseIdentifier: "_Common_FullImg_CCell")
|
|
carImgsCollectionView.delegate = self
|
carImgsCollectionView.dataSource = self
|
carImgsCollectionView.register(UINib(nibName: "Common_FullImg_CCell", bundle: nil), forCellWithReuseIdentifier: "_Common_FullImg_CCell")
|
|
celHei()
|
|
collocateCollectionView.reloadData()
|
descCollectionView.reloadData()
|
|
if contactPhoneField.text!.isEmpty{
|
contactPhoneField.text = readUser().phone
|
}
|
|
if contactNameField.text!.isEmpty{
|
contactNameField.text = readUser().name
|
}
|
|
}
|
|
|
fileprivate func celHei(){
|
//配置的高度
|
let h = ceil(Double(configModels.count) / 2.0) * cellH
|
collocateCollectionViewHeiCons.constant = h
|
|
//图片描述的高度
|
let h1 = ceil(Double(selectImgAssets.count) / 3.0) * descCellH + floor(Double(selectImgAssets.count) / 3.0) * 10
|
descCollectionHeiCons.constant = h1
|
descCollectionView.reloadData()
|
|
|
//图片描述的高度
|
let h2 = ceil(Double(selectCarImgAssets.count) / 3.0) * descCellH + floor(Double(selectCarImgAssets.count) / 3.0) * 10
|
carImgsCollectionHeiCons.constant = h2
|
carImgsCollectionView.reloadData()
|
|
carImgsCountL.text = "*车辆图片\(selectCarImgAssets.count - 1)/15"
|
|
}
|
|
override func bindRx() {
|
titleField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.title = text
|
}).disposed(by: disposeBag)
|
|
identifyField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.carIdentificationCode = text
|
}).disposed(by: disposeBag)
|
|
licensePlateField.rx.text.orEmpty.subscribe(onNext: {[weak self]text in
|
self?.sellCarReqModel?.carLicensePlate = text
|
}).disposed(by: disposeBag)
|
|
gearField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.transmissionCase = text
|
}).disposed(by: disposeBag)
|
|
carThemeColorField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.carColor = text
|
}).disposed(by: disposeBag)
|
|
displacementField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.displacement = text
|
}).disposed(by: disposeBag)
|
|
travelDistanceField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
if !text.isEmpty{
|
self?.sellCarReqModel?.mileage = (text.double() ?? 0)
|
}
|
}).disposed(by: disposeBag)
|
|
transferNumField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.transferTimes = text.int
|
}).disposed(by: disposeBag)
|
|
transferPriceField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.transferPrice = text.double()
|
}).disposed(by: disposeBag)
|
|
buyAmountPriceField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.newCarPrice = text.double()
|
}).disposed(by: disposeBag)
|
|
descTextView.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.describe = text
|
}).disposed(by: disposeBag)
|
|
contactNameField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.contactsName = text
|
}).disposed(by: disposeBag)
|
|
detailField.rx.text.orEmpty.subscribe(onNext: {[weak self] text in
|
self?.sellCarReqModel?.addres = text
|
}).disposed(by: disposeBag)
|
|
agreementViewModel.requestSubject.subscribe(onNext: {[weak self]state in
|
switch state {
|
case .success(let model):
|
guard let data: SwitchCityModel = model as? SwitchCityModel else {return}
|
let webView = YYWebView()
|
webView.name = "汽车售卖协议"
|
webView.url = data.content
|
self?.yy_push(vc: webView)
|
default:break
|
}
|
|
}).disposed(by: disposeBag)
|
|
}
|
|
@objc func delAction(_ btn:UIButton){
|
selectImgAssets.removeObject(at: btn.tag - 10)
|
celHei()
|
}
|
@objc func delCarAction(_ btn:UIButton){
|
selectCarImgAssets.removeObject(at: btn.tag - 10)
|
celHei()
|
}
|
|
//协议勾选
|
@IBAction func agreenTreatyAction(_ sender: UIButton) {
|
sender.isSelected = !sender.isSelected
|
}
|
|
|
/// 协议查看
|
@IBAction func treatyAction(_ sender: UIButton) {
|
agreementViewModel.type.accept(.carSale)
|
agreementViewModel.agreement()
|
}
|
|
|
@IBAction func provinceAction(_ sender: QMUIButton) {
|
BRAddressPickerView.showAddressPicker(withShowType: .province, defaultSelected: [], isAutoSelect: false, themeColor: UIColor.red) { m1, m2, m3 in
|
self.selectProvince = m1
|
self.provinceBtn.setTitle(m1!.name.components(separatedBy: "省").first, for: .normal)
|
self.provinceBtn.setTitleColor(.black, for: .normal)
|
self.sellCarReqModel?.provinceCode = m1?.code
|
self.sellCarReqModel?.provinceName = m1?.name
|
//74040 【车辆转租-编辑】编辑填写页面,重新选择了省后,后面的市应清空让用户重新选择
|
self.sellCarReqModel?.cityName = nil
|
self.sellCarReqModel?.cityCode = nil
|
self.selectCity = nil
|
self.cityBtn.setTitle("请选择", for: .normal)
|
self.cityBtn.setTitleColor(.black.withAlphaComponent(0.4), for: .normal)
|
self.detailField.text = ""
|
self.sellCarReqModel?.addres = nil
|
} cancel: {
|
|
}
|
}
|
|
@IBAction func cityAction(_ sender: QMUIButton) {
|
|
guard let province = selectProvince else {
|
alert(text: "请先选择省份");return
|
}
|
|
BRAddressPickerView.showAddressPicker(withShowType: .cityOnly, defaultSelected: [province.name!], isAutoSelect: false, themeColor: UIColor.red) { m1, m2, m3 in
|
self.selectCity = m2
|
self.cityBtn.setTitle(m2!.name.components(separatedBy: "市").first, for: .normal)
|
self.cityBtn.setTitleColor(.black, for: .normal)
|
self.sellCarReqModel?.cityCode = m2?.code
|
self.sellCarReqModel?.cityName = m2?.name
|
self.detailField.text = ""
|
self.sellCarReqModel?.addres = nil
|
} cancel: {
|
|
}
|
|
}
|
@IBAction func transferPriceAction(_ sender: QMUIButton) {
|
sender.isSelected = !sender.isSelected
|
sellCarReqModel?.includingTransferFee = sender.isSelected ? 1:2
|
}
|
|
@IBAction func uploadVideoAction(_ sender: UIButton) {
|
let p = TZImagePickerController(maxImagesCount: 1, columnNumber: 4, delegate: self)
|
p!.allowTakeVideo = true
|
p!.allowTakePicture = false
|
p!.sortAscendingByModificationDate = true
|
p!.allowPickingImage = false
|
p!.allowPickingVideo = true
|
p!.allowCrop = false
|
present(p!, animated: true, completion: nil)
|
}
|
|
@IBAction func pledgeAction(_ sender: UIButton) {
|
if sender.tag == 10{
|
havePledgeBtn.backgroundColor = UIColor(hexString: "#00BF30")
|
notHavePledgeBtn.backgroundColor = .white
|
havePledgeBtn.isSelected = true
|
notHavePledgeBtn.isSelected = false
|
}else{
|
notHavePledgeBtn.backgroundColor = UIColor(hexString: "#00BF30")
|
havePledgeBtn.backgroundColor = .white
|
havePledgeBtn.isSelected = false
|
notHavePledgeBtn.isSelected = true
|
}
|
}
|
|
@IBAction func submitAction(_ sender: UIButton) {
|
sellCarReqModel?.contactsPhone = readUser().phone
|
sellCarReqModel?.mortgage = havePledgeBtn.isSelected ? 1:2
|
|
guard agreenTreatyBtn.isSelected else {
|
alert(text: "请先阅读并同意《宽窄出行汽车售卖协议》");return
|
}
|
|
guard sellCarReqModel.checkInputValue() == true else {return}
|
|
guard selectCarImgAssets.count > 1 else {
|
alert(text: "请上传车辆图片");return
|
}
|
|
guard !contactNameField.text!.isEmpty else{
|
alert(text: "请输入联系人名称");return
|
}
|
|
|
// guard selectVideo != nil else {
|
// alert(text: "请上传车辆视频");return
|
// }
|
sellCarReqModel.installationConfiguration = configModels.filter({$0.check == true}).map({$0.name}).joined(separator: ",")
|
show()
|
|
let imgPHAssets = selectImgAssets.filter({$0 is PHAsset}) as? [PHAsset]
|
if (imgPHAssets?.count ?? 0) > 0{
|
queue.async(group: group){ [weak self] () in
|
guard let weakSelf = self else { return }
|
weakSelf.group.enter()
|
var temp = [UIImage]()
|
for img in imgPHAssets!{
|
temp.append(UIImage.JQ_PHAssetToImage(asset: img))
|
}
|
|
var names = [String]()
|
for (index,_) in temp.enumerated() {
|
names.append("car_desc_\(Date().timeStamp())_\(index)")
|
}
|
YYAliyunOSSManager.shared.uploadImage(keys: names, image: temp).subscribe(onNext: {imgUrls in
|
var originUrls = weakSelf.selectImgAssets.filter { obj in
|
if let o = obj as? String{
|
return (o.contains("http://") || o.contains("https://"))
|
}
|
return false
|
} as! [String]
|
originUrls.append(contentsOf: imgUrls)
|
weakSelf.sellCarReqModel.describeImgUrl = originUrls.joined(separator: ",")
|
weakSelf.group.leave()
|
}) { error in
|
weakSelf.group.leave()
|
}.disposed(by: weakSelf.disposeBag)
|
}
|
}
|
let img2PHAssets = selectCarImgAssets.filter({$0 is PHAsset}) as? [PHAsset]
|
if (img2PHAssets?.count ?? 0) > 0{
|
queue.async(group: group){ [weak self] () in
|
guard let weakSelf = self else { return }
|
weakSelf.group.enter()
|
var temp = [UIImage]()
|
for img in img2PHAssets!{
|
temp.append(UIImage.JQ_PHAssetToImage(asset: img))
|
}
|
|
var names = [String]()
|
for (index,_) in temp.enumerated() {
|
names.append("car_\(Date().timeStamp())_\(index)")
|
}
|
YYAliyunOSSManager.shared.uploadImage(keys: names, image: temp).subscribe(onNext: {imgUrls in
|
|
var originUrls = weakSelf.selectCarImgAssets.filter { obj in
|
if let o = obj as? String{
|
return (o.contains("http://") || o.contains("https://"))
|
}
|
return false
|
} as! [String]
|
originUrls.append(contentsOf: imgUrls)
|
|
weakSelf.sellCarReqModel.imgUrl = originUrls.joined(separator: ",")
|
weakSelf.group.leave()
|
}) { error in
|
weakSelf.group.leave()
|
}.disposed(by: weakSelf.disposeBag)
|
}
|
}
|
|
|
if selectVideo != nil{
|
queue.async(group: group){ [weak self] () in
|
guard let weakSelf = self else { return }
|
weakSelf.group.enter()
|
YYAliyunOSSManager.shared.uploadVideo(key: "car_video_\(Date().timeStamp())", video: weakSelf.selectVideo!).subscribe(onNext: {videoUrl in
|
weakSelf.sellCarReqModel.videoUrl = videoUrl
|
weakSelf.group.leave()
|
}) { error in
|
weakSelf.group.leave()
|
}.disposed(by: weakSelf.disposeBag)
|
}
|
}
|
|
group.notify(queue: DispatchQueue.main) { [weak self] () in
|
guard let weakSelf = self else { return }
|
DispatchQueue.main.async {
|
weakSelf.hide()
|
APIManager.shared.provider.rx.request(.sellingCar(weakSelf.sellCarReqModel)).map(YYModel<Nothing>.self).validate().subscribe(onSuccess: {data in
|
weakSelf.hide()
|
|
if weakSelf.isEdit{
|
//74043 【车辆转租-编辑】编辑后,再点击提交,应跳转到 我发布的列表(原型如此)
|
for (index,vc) in weakSelf.navigationController!.viewControllers.enumerated() {
|
if let _ = vc as? MinePublishVC{
|
NotificationCenter.default.post(name: Refresh_MinePublish, object: nil)
|
weakSelf.yy_popToVC(index: index)
|
break
|
}
|
}
|
}else{
|
let vc = PublishSellCarSuccessVC(type: .sell)
|
weakSelf.yy_push(vc: vc)
|
//提交成功
|
}
|
weakSelf.sellCarReqModel?.clear()
|
TempImgeSaveManager.destroy()
|
}) { error in
|
weakSelf.hide()
|
}.disposed(by: weakSelf.disposeBag)
|
|
}
|
}
|
}
|
}
|
|
extension PublishSaleCarVC:UITextFieldDelegate{
|
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
|
view.endEditing(true)
|
//首次上牌时间
|
if textField == firstEnrollTimeField{
|
MineBirthdayView.instance().show {[weak self](dateTime) in
|
textField.text = dateTime
|
self?.sellCarReqModel?.licensingTime = dateTime
|
}
|
return false
|
}
|
|
if textField == brandField{
|
let names = brandModels.map({$0.name})
|
CommonAlertSheetView.show(type: .single, titles: names,maxHei: 200) {[weak self] index, str in
|
guard let weakSelf = self else { return }
|
textField.text = str
|
weakSelf.sellCarReqModel?.brandId = weakSelf.brandModels[index].id
|
weakSelf.sellCarReqModel.brandName = weakSelf.brandModels[index].name
|
}
|
return false
|
}
|
|
//排量 73652 【我要卖车】变速箱、排量,做成输入项,不做成选项
|
// if textField == displacementField{
|
// CommonAlertSheetView.show(type: .single, titles: ["0.5L","0.8L","1.0L","1.5L","2.0L","2.5L","3.0L","3.5L","4.0L","4.5L","5.0L"],maxHei: 200) { [weak self] index, str in
|
// textField.text = str
|
// self?.sellCarReqModel?.displacement = str
|
// }
|
// return false
|
// }
|
|
//变速箱
|
if textField == gearField{
|
CommonAlertSheetView.show(type: .single, titles: ["手动","自动"]) {[weak self]index, str in
|
textField.text = str
|
self?.sellCarReqModel?.transmissionCase = str
|
}
|
return false
|
}
|
|
//车辆级别
|
if textField == levelField{
|
CommonAlertSheetView.show(type: .single, titles: ["微型车","小型车","紧凑型车","中型车","中大型车","大型车","小型SUV","紧凑型SUV","中型SUV","中大型SUV","大型SUV","紧凑型MPV","中型MPV","中大型MPV","大型MPV","跑车","皮卡","微面","轻客","微卡"],maxHei: 150) {[weak self]index, str in
|
textField.text = str
|
self?.sellCarReqModel?.level = str
|
}
|
return false
|
}
|
|
//拍照所在地
|
if textField == licenseFromField{
|
BRAddressPickerView.showAddressPicker(withShowType: .city, defaultSelected: [], isAutoSelect: false, themeColor: UIColor.red) {[weak self] m1, m2, m3 in
|
textField.text = "\(m1!.name!) \(m2!.name!)"
|
self?.sellCarReqModel?.locationOfLicensePlate = "\(m2!.name!)"
|
} cancel: {
|
|
}
|
return false
|
}
|
|
//交强险
|
if textField == highInsuranceDelTimeField{
|
MineBirthdayView.instance().show(nil){[weak self](dateTime) in
|
textField.text = dateTime
|
self?.sellCarReqModel?.dueTimeOfCompulsoryInsurance = dateTime
|
}
|
return false
|
}
|
|
//年检
|
if textField == yearReviewDelTimeField{
|
MineBirthdayView.instance().show(nil) {[weak self](dateTime) in
|
textField.text = dateTime
|
self?.sellCarReqModel?.expirationTimeOfAnnualInspection = dateTime
|
}
|
return false
|
}
|
|
//商业险
|
if textField == businessInsuranceDelTimeField{
|
MineBirthdayView.instance().show(nil) {[weak self](dateTime) in
|
textField.text = dateTime
|
self?.sellCarReqModel?.maturityTimeOfCommercialInsurance = dateTime
|
}
|
return false
|
}
|
return true
|
}
|
|
|
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
|
|
if textField != travelDistanceField && textField != buyAmountPriceField && textField != transferPriceField && textField != displacementField{
|
return true
|
}
|
// 前面的判断都是正确滴 不需要改动 在最后面加位数限制
|
var Digits = 7
|
|
if textField == displacementField{
|
Digits = 1
|
}
|
|
if textField.text?.contains(".") == false && string != "" && string != "."{
|
if (textField.text?.length)! > Digits{
|
return false
|
}
|
}
|
|
let scanner = Scanner(string: string)
|
let numbers : NSCharacterSet
|
let pointRange = (textField.text! as NSString).range(of: ".")
|
|
if (pointRange.length > 0) && pointRange.length < range.location || pointRange.location > range.location + range.length {
|
numbers = NSCharacterSet(charactersIn: "0123456789.")
|
}else{
|
numbers = NSCharacterSet(charactersIn: "0123456789.")
|
}
|
|
if textField.text == "" && string == "." {
|
return false
|
}
|
|
let remain = 2
|
|
let tempStr = textField.text!.appending(string)
|
|
let strlen = tempStr.length
|
|
if pointRange.length > 0 && pointRange.location > 0{//判断输入框内是否含有“.”。
|
if string == "." {
|
return false
|
}
|
|
if strlen > 0 && (strlen - pointRange.location) > remain + 1 {//当输入框内已经含有“.”,当字符串长度减去小数点前面的字符串长度大于需要要保留的小数点位数,则视当次输入无效。
|
return false
|
}
|
}
|
|
let zeroRange = (textField.text! as NSString).range(of: "0")
|
if zeroRange.length == 1 && zeroRange.location == 0 { //判断输入框第一个字符是否为“0”
|
if !(string == "0") && !(string == ".") && textField.text?.length == 1 {//当输入框只有一个字符并且字符为“0”时,再输入不为“0”或者“.”的字符时,则将此输入替换输入框的这唯一字符。
|
textField.text = string
|
return false
|
}else {
|
if pointRange.length == 0 && pointRange.location > 0 {//当输入框第一个字符为“0”时,并且没有“.”字符时,如果当此输入的字符为“0”,则视当此输入无效。
|
if string == "0" {
|
return false
|
}
|
}
|
}
|
}
|
// let buffer : NSString!
|
if !scanner.scanCharacters(from: numbers as CharacterSet, into: nil) && string.length != 0 {
|
return false
|
}
|
return true
|
}
|
}
|
|
extension PublishSaleCarVC:UICollectionViewDelegate{
|
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
|
if collectionView == descCollectionView{
|
currChoosePhoto = 10
|
if let imgStr = selectImgAssets[indexPath.row] as? String,imgStr == "icon_photo_update-1"{
|
|
let temp = NSMutableArray()
|
let imgUrltemp = NSMutableArray()
|
for i in selectImgAssets {
|
if let a = i as? PHAsset{
|
temp.add(a)
|
}
|
if let a = i as? String,a != imgStr{
|
imgUrltemp.add(a)
|
}
|
}
|
|
CommonAlertSheetView.show(type: .single, titles: ["相机","相册"]) { index, str in
|
if index == 0{
|
let p = UIImagePickerController()
|
p.delegate = self
|
p.modalPresentationStyle = .fullScreen
|
p.allowsEditing = false
|
p.sourceType = .camera
|
LD_currentViewController().present(p, animated: true, completion: nil)
|
}else{
|
ImagePickerTool.default.multiImage(vc: self, { image, assets in
|
self.selectImgAssets = NSMutableArray(array: assets)
|
|
if let imgUrl = self.sellCarReqModel.describeImgUrl{
|
self.selectImgAssets.addObjects(from: imgUrl.components(separatedBy: ",").filter({!$0.isEmpty}))
|
}
|
self.selectImgAssets.add("icon_photo_update-1")
|
|
self.celHei()
|
}, max: 9-imgUrltemp.count, selectAsstes: temp)
|
}
|
}
|
}
|
}
|
|
if collectionView == carImgsCollectionView{
|
currChoosePhoto = 11
|
if let imgStr = selectCarImgAssets[indexPath.row] as? String,imgStr == "icon_photo_update-1"{
|
|
let temp = NSMutableArray()
|
let imgUrltemp = NSMutableArray()
|
for i in selectCarImgAssets {
|
if let a = i as? PHAsset{
|
temp.add(a)
|
}
|
if let a = i as? String,a != imgStr{
|
imgUrltemp.add(a)
|
}
|
}
|
|
//车况
|
CommonAlertSheetView.show(type: .single, titles: ["相机","相册"]) { index, str in
|
if index == 0{
|
let p = UIImagePickerController()
|
p.delegate = self
|
p.modalPresentationStyle = .fullScreen
|
p.allowsEditing = false
|
p.sourceType = .camera
|
LD_currentViewController().present(p, animated: true, completion: nil)
|
}else{
|
ImagePickerTool.default.multiImage(vc: self, { image, assets in
|
self.selectCarImgAssets = NSMutableArray(array: assets)
|
if let describeImgUrl = self.sellCarReqModel.describeImgUrl{
|
self.selectCarImgAssets.addObjects(from: describeImgUrl.components(separatedBy: ",").filter({!$0.isEmpty}))
|
}
|
self.selectCarImgAssets.add("icon_photo_update-1")
|
|
self.celHei()
|
}, max: 15-imgUrltemp.count, selectAsstes: temp)
|
}
|
}
|
}
|
}
|
|
if collectionView == collocateCollectionView{
|
configModels[indexPath.row].check = !configModels[indexPath.row].check
|
collectionView.reloadData()
|
}
|
}
|
}
|
|
extension PublishSaleCarVC:UICollectionViewDataSource{
|
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
if collectionView == collocateCollectionView{
|
return configModels.count
|
}
|
|
if collectionView == descCollectionView{
|
return selectImgAssets.count
|
}
|
|
if collectionView == carImgsCollectionView{
|
return selectCarImgAssets.count
|
}
|
return 0
|
}
|
|
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
|
if collectionView == collocateCollectionView{
|
let m = configModels[indexPath.row]
|
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_CheckItemTCell", for: indexPath) as! CheckItemTCell
|
cell.checkBtn.isSelected = m.check
|
cell.itemL.text = m.name
|
return cell
|
}
|
|
if collectionView == descCollectionView{
|
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_Common_FullImg_CCell", for: indexPath) as! Common_FullImg_CCell
|
|
if let imgStr = selectImgAssets[indexPath.row] as? String{
|
if imgStr == "icon_photo_update-1"{
|
cell.closeBtn.isHidden = true
|
cell.img.image = UIImage(named: imgStr)
|
}else{
|
cell.closeBtn.isHidden = false
|
cell.img.load(url: imgStr)
|
}
|
}else if let asset = selectImgAssets[indexPath.row] as? PHAsset {
|
cell.closeBtn.isHidden = false
|
cell.img.image = UIImage.JQ_PHAssetToImage(asset: asset)
|
}
|
|
cell.closeBtn.tag = 10 + indexPath.row
|
cell.closeBtn.addTarget(self, action: #selector(delAction(_:)), for: .touchUpInside)
|
|
return cell
|
}
|
|
if collectionView == carImgsCollectionView{
|
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_Common_FullImg_CCell", for: indexPath) as! Common_FullImg_CCell
|
|
if let imgStr = selectCarImgAssets[indexPath.row] as? String{
|
if imgStr == "icon_photo_update-1"{
|
cell.closeBtn.isHidden = true
|
cell.img.image = UIImage(named: imgStr)
|
}else{
|
cell.closeBtn.isHidden = false
|
cell.img.load(url: imgStr)
|
}
|
}else if let asset = selectCarImgAssets[indexPath.row] as? PHAsset {
|
cell.closeBtn.isHidden = false
|
cell.img.image = UIImage.JQ_PHAssetToImage(asset: asset)
|
}else if let img = selectCarImgAssets[indexPath.row] as? UIImage{
|
cell.closeBtn.isHidden = false
|
cell.img.image = img
|
}
|
|
cell.closeBtn.tag = 10 + indexPath.row
|
cell.closeBtn.addTarget(self, action: #selector(delCarAction(_:)), for: .touchUpInside)
|
|
return cell
|
}
|
|
return UICollectionViewCell()
|
}
|
}
|
|
extension PublishSaleCarVC:UICollectionViewDelegateFlowLayout{
|
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
|
if collectionView == collocateCollectionView{
|
return 0.01
|
}
|
|
if collectionView == descCollectionView{
|
return 10
|
}
|
|
if collectionView == carImgsCollectionView{
|
return 10
|
}
|
|
return 0.01
|
}
|
|
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
|
if collectionView == collocateCollectionView{
|
return 0.01
|
}
|
|
if collectionView == descCollectionView{
|
return 10
|
}
|
|
if collectionView == carImgsCollectionView{
|
return 10
|
}
|
|
return 0.01
|
}
|
|
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
|
if collectionView == collocateCollectionView{
|
return CGSize(width: cellW, height: cellH)
|
}
|
|
if collectionView == descCollectionView{
|
return CGSize(width: descCellW, height: descCellH)
|
}
|
|
if collectionView == carImgsCollectionView{
|
return CGSize(width: descCellW, height: descCellH)
|
}
|
return CGSize.zero
|
}
|
}
|
|
extension PublishSaleCarVC:UIImagePickerControllerDelegate & UINavigationControllerDelegate {
|
|
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
|
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
|
|
var assetId:String = ""
|
PHPhotoLibrary.shared().performChanges {
|
assetId = PHAssetCreationRequest.creationRequestForAsset(from: image).placeholderForCreatedAsset!.localIdentifier
|
} completionHandler: { [weak self] sta, error in
|
if let ass = PHAsset.fetchAssets(withLocalIdentifiers: [assetId], options: nil).lastObject{
|
DispatchQueue.main.async {
|
if self?.currChoosePhoto == 10{
|
self?.selectImgAssets.insert(ass, at: 0)
|
}else{
|
self?.selectCarImgAssets.insert(ass, at: 0)
|
}
|
self?.celHei()
|
}
|
}
|
}
|
}
|
picker.dismiss(animated: true) {}
|
}
|
}
|
|
extension PublishSaleCarVC:TZImagePickerControllerDelegate{
|
func imagePickerController(_ picker: TZImagePickerController!, didFinishPickingVideo coverImage: UIImage!, sourceAssets asset: PHAsset!) {
|
carVideoBtn.setImage(coverImage, for: .normal)
|
selectVideo = asset
|
selectCoverImg = coverImage
|
carVIdeoCountL.text = "车辆视频1/1"
|
}
|
}
|