// // NewEventViewController.swift // LaserMethane // // Created by 203 on 2021/8/9. // import Alamofire import HXPHPicker import KeychainAccess import Kingfisher import SwiftyJSON import UIKit import ZLPhotoBrowser class NewEventViewController: UIViewController, TransferValueDelegate, UITextFieldDelegate { private var isWarning: Bool! private var inspectionId: String! private var inspectionName: String! private var longitude: Double! private var latitude: Double! @IBOutlet var firstView: UIView! @IBOutlet var secondView: UIView! @IBOutlet var thirdView: UIView! @IBOutlet var eventTimeLabel: UILabel! @IBOutlet var eventDescField: UITextField! @IBOutlet var maxValueField: UITextField! @IBOutlet var imageCollectionView: UICollectionView! @IBOutlet var saveEventButton: UIButton! private let keychain = Keychain() private let dateformatter = DateFormatter() private var imageUrlArray = [URL]() // 完整的图片url private var imageArray = [String]() // 上传图片成功后服务器返回的图片数组 private var userModel: UserInfoModel! private var baseURL: String! private var index: Int = 0 private var eventType = "" private var eventValueData: Double = -1 override func viewDidLoad() { super.viewDidLoad() // 设置导航栏背景和标题 navigationController?.navigationBar.isTranslucent = false navigationController?.navigationBar.barTintColor = .systemBlue let dict: [NSAttributedString.Key: Any] = [NSAttributedString.Key.foregroundColor: UIColor.white] navigationController?.navigationBar.titleTextAttributes = dict navigationController?.navigationBar.tintColor = .white // Do any additional setup after loading the view. let userJson = keychain[Constant.UserJson.rawValue]! let data = userJson.data(using: String.Encoding.utf8, allowLossyConversion: false) ?? Data() userModel = UserInfoModel(respJson: JSON(data)) baseURL = keychain[Constant.ServerConfig.rawValue] // setupLayerView() eventTimeLabel.text = currentTime() maxValueField.delegate = self // 注册UICollectionView相关协议和委托 imageCollectionView.register(UINib(nibName: "ImageCollectionViewDelCell", bundle: nil), forCellWithReuseIdentifier: "collectionViewDelCell") imageCollectionView.dataSource = self imageCollectionView.delegate = self imageCollectionView.reloadData() } func setupLayerView() { view.backgroundColor = [238, 238, 238].transferUIColor() LayerShadowHub.shared.setShadow(view: firstView, sColor: [211, 211, 211].transferUIColor(), offset: CGSize(width: 0, height: 0), alpha: 1.0, radius: CGFloat(5.0)) LayerShadowHub.shared.setShadow(view: thirdView, sColor: [211, 211, 211].transferUIColor(), offset: CGSize(width: 0, height: 0), alpha: 1.0, radius: CGFloat(5.0)) if isWarning! { title = "报警事件记录" secondView.isHidden = false LayerShadowHub.shared.setShadow(view: secondView, sColor: [211, 211, 211].transferUIColor(), offset: CGSize(width: 0, height: 0), alpha: 1.0, radius: CGFloat(5.0)) } else { title = "自定义事件记录" secondView.isHidden = true secondView.removeFromSuperview() // 光隐藏没用,需要完全从它父布局移除,不然会占位,类似Android的GONE和VISIABLE thirdView.snp.makeConstraints { (make) -> Void in make.top.equalTo(firstView.frame.height + 20) } } saveEventButton.layer.cornerRadius = 8 } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let length = string.lengthOfBytes(using: .utf8) for loopIndex in 0..<length { let char = (string as NSString).character(at: loopIndex) if char < 48 { return false } if char > 57 { return false } } let len = (textField.text?.lengthOfBytes(using: .utf8))! - range.length + string.lengthOfBytes(using: .utf8) if len > 9 { return false } return true } func transfer(controller: UIViewController, dic: NSDictionary) { isWarning = dic["isWarning"] as? Bool inspectionId = dic["inspectionId"] as? String inspectionName = dic["inspectionName"] as? String longitude = dic["longitude"] as? Double latitude = dic["latitude"] as? Double } @IBAction func addImageAction(_ sender: Any) { let actionSheetController = UIAlertController() actionSheetController.addAction(UIAlertAction(title: "拍照", style: .default, handler: { [self] _ in takePicture() })) actionSheetController.addAction(UIAlertAction(title: "相册", style: .default, handler: { [self] _ in selectPicture() })) actionSheetController.addAction(UIAlertAction(title: "取消", style: .cancel)) present(actionSheetController, animated: true, completion: nil) } func takePicture() { if UIImagePickerController.isSourceTypeAvailable(.camera) { let picker = UIImagePickerController() picker.sourceType = .camera picker.delegate = self picker.cameraDevice = .rear picker.cameraCaptureMode = .photo picker.cameraFlashMode = .auto picker.allowsEditing = false present(picker, animated: true, completion: nil) } else { AlertHub.shared.showWaringAlert(controller: self, message: "抱歉,无法打开照相机") } } func selectPicture() { // 设置与微信主题一致的配置 let config = PhotoTools.getWXPickerConfig() config.maximumSelectedPhotoCount = 3 config.selectOptions = [.photo] config.allowSelectedTogether = false config.photoList.allowAddCamera = false // 选图不显示相机 let pickerController = PhotoPickerController(picker: config) pickerController.pickerDelegate = self // 是否选中原图 pickerController.isOriginal = false present(pickerController, animated: true, completion: nil) } @IBAction func saveEventAction(_ sender: Any) { let eventDesc = eventDescField.text?.filterString() if eventDesc == "" { AlertHub.shared.showWaringAlert(controller: self, message: "事件情况说明还未填写,请检查") return } if isWarning! { let maxValue = maxValueField.text?.filterString() if maxValue == "" { AlertHub.shared.showWaringAlert(controller: self, message: "最大泄露值还未填写,请检查") return } eventType = "报警事件" eventValueData = Double(maxValue!)! } else { eventType = "自定义事件" } // 提交事件 let addEventURL = baseURL! + Constant.addEvent.rawValue let param: [String: Any] = ["id": "t".id(), "inspectionId": inspectionId!, "name": inspectionName!, "createTime": eventTimeLabel.text!, "type": eventType, "lng": longitude!, "lat": latitude!, "data": eventValueData, "images": imageArray.reformat(), "description": eventDesc!, "user": (userModel.data?.name)!] print("提交参数: \(param)") Alamofire.request(addEventURL, method: .post, parameters: param, headers: ["token": keychain[Constant.Token.rawValue]!]) .responseJSON(completionHandler: { [self] response in switch response.result { case let .success(value): let actionModel = ActionResultModel(respJson: JSON(value)) if actionModel.code == 200 { let alertController = UIAlertController(title: "提示", message: "提交成功", preferredStyle: .alert) let okAction = UIAlertAction(title: "知道了", style: .default, handler: { _ in navigationController?.popViewController(animated: true) }) alertController.addAction(okAction) present(alertController, animated: true, completion: nil) } else { AlertHub.shared.showWaringAlert(controller: self, message: "服务器异常") } case .failure: AlertHub.shared.showWaringAlert(controller: self, message: "网络异常,提交失败") } }) } func currentTime() -> String { dateformatter.dateFormat = "YYYY-MM-dd HH:mm:ss" // 自定义时间格式 // GMT时间 转字符串,直接是系统当前时间 return dateformatter.string(from: Date()) } func uploadImage(image: UIImage, quality: CGFloat) { index += 1 dateformatter.dateFormat = "yyyyMMddHHmmss" let imageName = "IMG_CMP_\(dateformatter.string(from: Date()))_\(index).jpeg" let imageData = image.jpegData(compressionQuality: quality)! print("图片名: \(imageName),图片大小: \(imageData.count / 1024)K") // 上传图片 let uploadURL = baseURL! + Constant.uploadFile.rawValue LoadingHub.shared.showLoading(text: "图片上传中...") Alamofire.upload(multipartFormData: { formData in formData.append(imageData, withName: "file", fileName: imageName, mimeType: "image/jpeg") }, usingThreshold: UInt64(), to: uploadURL, method: .post, headers: ["token": keychain[Constant.Token.rawValue]!]) { [self] result in switch result { case let .success(upload, _, _): upload.responseJSON(completionHandler: { value in LoadingHub.shared.hideLoading() let actionModel = ActionResultModel(respJson: JSON(value.data!)) if actionModel.code == 200 { let path = actionModel.data imageArray.append(path) // 用于提交事件 imageUrlArray.append(URL(string: path.replacingOccurrences(of: "\\", with: "/").combineImagePath())!) // 用于本地展示 imageCollectionView.reloadData() } else { AlertHub.shared.showWaringAlert(controller: self, message: "服务器异常") } }) case .failure: LoadingHub.shared.hideLoading() AlertHub.shared.showWaringAlert(controller: self, message: "网络异常,上传失败") } } } } extension NewEventViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { let tackedImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage uploadImage(image: tackedImage, quality: 0.5) dismiss(animated: true, completion: nil) } } extension NewEventViewController: PhotoPickerControllerDelegate { func pickerController(_ pickerController: PhotoPickerController, didFinishSelection result: PickerResult) { result.getImage(imageHandler: { [self] image, _, _ in if let image = image { uploadImage(image: image, quality: 0.75) // 75%压缩比 } }, completionHandler: { images in print("图片数组: \(images)") }) } } extension NewEventViewController: UICollectionViewDataSource { // 每行几个 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { imageUrlArray.count } // 有几行 func numberOfSections(in collectionView: UICollectionView) -> Int { 1 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell: ImageCollectionViewDelCell! = imageCollectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewDelCell", for: indexPath) as? ImageCollectionViewDelCell let row = (indexPath as NSIndexPath).row KF.url(imageUrlArray[row]) .loadDiskFileSynchronously() .placeholder(UIImage(named: "load_imag_error.png")) .cacheMemoryOnly() .fade(duration: 0.25) .set(to: cell.imageView) // 传递点击按钮的位置 cell.delButton.tag = row cell.delButton.addTarget(self, action: #selector(delImageAction), for: .touchUpInside) return cell } @objc func delImageAction(sender: UIButton) { imageArray.remove(at: sender.tag) imageUrlArray.remove(at: sender.tag) imageCollectionView.reloadData() } } extension NewEventViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let row = (indexPath as NSIndexPath).row // 查看大图 let vc = ZLImagePreviewController(datas: imageUrlArray, index: row, showSelectBtn: false, showBottomView: false, urlType: { (_) -> ZLURLType in .image }, urlImageLoader: { url, imageView, progress, loadFinish in imageView.kf.setImage(with: url) { receivedSize, totalSize in let percentage = (CGFloat(receivedSize) / CGFloat(totalSize)) progress(percentage) } completionHandler: { _ in loadFinish() } }) vc.modalPresentationStyle = .fullScreen showDetailViewController(vc, sender: nil) } }