Newer
Older
LaserMethane / LaserMethane / ViewController / Map / NewEventViewController.swift
//
//  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)
    }
}