CNLiveShopOrderSearchListViewController.swift 14.6 KB
//
//  CNLiveShopOrderSearchListViewController.swift
//  metaCode
//
//  Created by open on 2023/11/13.
//

import Foundation
import EmptyDataSet_Swift
import MJRefresh

class CNLiveShopOrderSearchListViewController: CNLiveBaseViewController, UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource, EmptyDataSetSource, EmptyDataSetDelegate {
        
    let kShopBodyOrderListViewCellIdentifier = "kShopBodyListViewCellIdentifier"
    let kShopBodyOrderHeaderViewCellIdentifier = "kShopBodyOrderHeaderViewCellIdentifier"
    let kShopBodyOrderFooterViewCellIdentifier = "kShopBodyOrderFooterViewCellIdentifier"
    lazy var tableView : UITableView = {
        let tableView = UITableView(frame: .zero, style: .grouped)
        tableView.dataSource = self
        tableView.delegate = self
        tableView.emptyDataSetSource = self
        tableView.emptyDataSetDelegate = self
        tableView.backgroundColor = .clear
        tableView.tableFooterView = UIView.init()
        tableView.separatorStyle = .none
        tableView.register(ShopBodyOrderListViewCell.self, forCellReuseIdentifier: kShopBodyOrderListViewCellIdentifier)
        tableView.register(ShopBodyOrderHeaderViewCell.self, forHeaderFooterViewReuseIdentifier: kShopBodyOrderHeaderViewCellIdentifier)
        tableView.register(ShopBodyOrderFooterViewCell.self, forHeaderFooterViewReuseIdentifier: kShopBodyOrderFooterViewCellIdentifier)
        return tableView
    }()
    
    lazy var searchTextField: UITextField = {
        let searchTextField = UITextField.init(frame: CGRectMake(adapt_length(length: 30), get_system_statusBar_height() + (get_system_nav_ui_height() - adapt_length(length: 30))/2, KSreenWidth - adapt_length(length: 40), adapt_length(length: 30)))
        return searchTextField
    }()
    
    lazy var dataArray: NSMutableArray = {
        let dataArray = NSMutableArray.init()
        return dataArray
    }()
    
    var pageNum: NSInteger!
    var _searchText: String!
    var network_type: CNLiveMineResponseType!
    init(searchText: String) {
        pageNum = 1
        _searchText = searchText
        super.init(nibName:nil, bundle:nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationBarHidden = false
        
        initNav()
        view.addSubview(tableView)
        
        loadDataSourceAction(page: 1)
    }
    
    func initNav() {        
        let view = UIView.init(frame: CGRectMake(0, 0, adapt_length(length: 30), adapt_length(length: 30)))
        
        let imageView = UIImageView.init(frame: CGRect(x: adapt_length(length: 7), y: adapt_length(length: 4), width: adapt_length(length: 22), height: adapt_length(length: 22)))
        imageView.image = UIImage(named: "DS_order_search")
        imageView.clipsToBounds = true
        imageView.contentMode = .scaleAspectFit
        view.addSubview(imageView)
        
        searchTextField.leftView = view
        searchTextField.delegate = self
        searchTextField.leftViewMode = .always
        searchTextField.placeholder = "请输入关键字..."
        searchTextField.backgroundColor = HexColor("#f0f0f0")
        searchTextField.returnKeyType = .search
        searchTextField.layer.cornerRadius = adapt_length(length: 15)
        searchTextField.layer.masksToBounds = true
        searchTextField.font = regular_adapt_font(pointSize: 13)
        searchTextField.text = _searchText
        topNavView.addSubview(searchTextField)
    }
    
    func loadDataSourceAction(page: NSInteger) {
        showLoading(message: "")
        CNLiveShopViewModel.requestOrderList(state: "", keyword: searchTextField.text!, page: page) { [weak self] result, respStatue in
            if respStatue == .success {
                if self!.pageNum == 1 {
                    self!.dataArray.removeAllObjects()
                    self!.dataArray.addObjects(from: result as! [ShopOrderListModel])
                    if self!.dataArray.count > 0 && self!.tableView.mj_header == nil && self!.tableView.mj_footer == nil {
                        self!.addRefreshView()
                    }
                }
                if self!.pageNum > 1 {
                    self!.dataArray.addObjects(from: result as! [ShopOrderListModel])
                }
                self!.tableView.mj_header?.endRefreshing()
                self!.tableView.mj_footer?.endRefreshing()
                self!.tableView.reloadData()
                if (result as! Array<Any>).count == 0 {
                    self!.tableView.mj_footer?.endRefreshingWithNoMoreData()
                    self!.tableView.reloadData()
                }
            }else if (respStatue == .noNetwork) {
                self!.network_type = .noNetwork
                self!.tableView.reloadEmptyDataSet()
            } else {
                self!.network_type = .failed
                self!.tableView.reloadEmptyDataSet()
            }
        }
    }
    
    func addRefreshView() {
        tableView.mj_header = MJRefreshNormalHeader.init(refreshingBlock: {[weak self] in
            self!.pageNum = 1
            self!.loadDataSourceAction(page: 1)
        })
        
        tableView.mj_footer = MJRefreshAutoNormalFooter.init(refreshingBlock: {[weak self] in
            self!.pageNum = self!.pageNum + 1
            self!.loadDataSourceAction(page: self!.pageNum)
        })
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        tableView.frame = CGRect(x: 0, y: get_system_nav_height(), width: KSreenWidth, height: view.height - get_system_nav_height())
    }
}

extension CNLiveShopOrderSearchListViewController {
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return dataArray.count
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let order_detail = (dataArray[section] as! ShopOrderListModel).order_detail
        return order_detail.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: kShopBodyOrderListViewCellIdentifier) as? ShopBodyOrderListViewCell else {
            return ShopBodyOrderListViewCell()
        }
        let order_detail = (dataArray[indexPath.section] as! ShopOrderListModel).order_detail
        let addTime = (dataArray[indexPath.section] as! ShopOrderListModel).addtime!
        cell.setupDataSource(goodsModel: order_detail[indexPath.row] , addTime: addTime)
        return cell
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return adapt_length(length: 110)
    }
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return adapt_length(length: 40)
    }
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: kShopBodyOrderHeaderViewCellIdentifier) as! ShopBodyOrderHeaderViewCell
        let listModel = (dataArray[section] as! ShopOrderListModel)
        headerView.setupDataSource(listModel: listModel)
        return headerView
    }
    
    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        let listModel = (dataArray[section] as! ShopOrderListModel)
        if listModel.isRefund == "1" {
            return adapt_length(length: 60)
        } else {
            return adapt_length(length: 110)
        }
    }
    
    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        let footerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: kShopBodyOrderFooterViewCellIdentifier) as! ShopBodyOrderFooterViewCell
        let listModel = (dataArray[section] as! ShopOrderListModel)
        footerView.setupDataSource(listModel: listModel)
        footerView.clickRightBtnCallBack = { [weak self] title, clickEvent, listModel in
            self?.orderOperation(title: title, event: clickEvent, listModel: listModel)
        }
        return footerView
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let listModel = (dataArray[indexPath.section] as! ShopOrderListModel)
        pushOrderDetail(listModel: listModel)
    }
}
extension CNLiveShopOrderSearchListViewController {
    
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        view.endEditing(true)
    
        if textField.text!.count > 30 {
            textField.text = "\(textField.text?.prefix(29) ?? "")"
        }
        
        let historyDataArr = CNLiveSaveSearchDB.shared.take(key: kShopOrderListSearchHistroyDatas) as! NSMutableArray
        if historyDataArr.contains(textField.text! as String) {
            historyDataArr.remove(textField.text! as String)
        }
        
        historyDataArr.insert(textField.text! as String, at: 0)
        CNLiveSaveSearchDB.shared.save(object: historyDataArr, key: kShopOrderListSearchHistroyDatas)
        
        loadDataSourceAction(page: 1)
        
        return true
    }
}

extension CNLiveShopOrderSearchListViewController {
    
    func image(forEmptyDataSet scrollView: UIScrollView) -> UIImage? {
        if network_type == .failed  || network_type == .unkonw {
            return UIImage(named: "mine_list_source_unusual_failed")
        }
        if dataArray.count == 0 {
            return UIImage(named: "mine_list_source_unusual_empty")
        }
        if network_type == .noNetwork {
            return UIImage(named: "mine_list_source_unusual_noNet")
        }
        return UIImage(named: "mine_list_source_unusual_empty")
    }
    
    func title(forEmptyDataSet scrollView: UIScrollView) -> NSAttributedString? {
        var defult_string = ""
        if network_type == .failed  || network_type == .unkonw {
            defult_string = "接口请求错误,刷新试试~"
        }
        if network_type == .noNetwork {
            defult_string = "网络开小差了,刷新试试~"
        }
        if dataArray.count == 0 {
            defult_string = "暂时没有数据~"
        }
        return NSAttributedString(string: defult_string, attributes: [.font: Font_17,.foregroundColor: HexColor("#666666")!])
    }
    
    func buttonTitle(forEmptyDataSet scrollView: UIScrollView, for state: UIControl.State) -> NSAttributedString? {
        if network_type == .failed || network_type == .noNetwork {
            let attributes = [NSAttributedString.Key.font:Font_16_Fit,
                              NSAttributedString.Key.foregroundColor: HexColor("#609BFF")]
            return NSAttributedString(string: "刷一刷", attributes: attributes as [NSAttributedString.Key : Any])
        }
        return nil
    }
    
    func emptyDataSet(_ scrollView: UIScrollView, didTapView view: UIView) {
        if network_type == .failed || network_type == .noNetwork  {
            loadDataSourceAction(page: 1)
        }
    }
}

extension CNLiveShopOrderSearchListViewController {
    
    /// 通过不同的按钮逻辑跳转不同界面
    /// - Parameters:
    ///   - clickEvent: 按钮类型
    ///   - listModel: 数据源
    private func orderOperation(title: String, event: CNDSOrderListSectionFooterBtnClickEvent, listModel: ShopOrderListModel) {
        switch event {
        case .delivery:
            if listModel.is_tui == "2" {
                showMessage(message: "此为退款订单")
                return
            }
            delivery(listModel: listModel)
            break
        case .notifyOrder:
            if listModel.is_tui == "2" {
                showMessage(message: "此为退款订单")
                return
            }
            notifyOrder(listModel: listModel)
            break
        case .connection:
            pushOrderDetail(listModel: listModel)
            break
        case .expDetail:
            delivery(listModel: listModel)
            break
        case .checkExpress:
            pushExpressVC(listModel: listModel)
            break
        case .express:
            pushExpressVC(listModel: listModel)
            break
        default:
            break
        }
    }
    
    /// 跳转物流相关界面
    /// - Parameter detailModel: 数据源
    private func pushExpressVC(listModel: ShopOrderListModel) {
        if listModel.send_num > 1 || listModel.is_send == "0" {
            self.navigationController?.pushViewController(CNLiveShopOrderExpressListViewController.init(orderId: listModel.id! as NSString), animated: true)
        } else {
            self.navigationController?.pushViewController(CNLiveShopOrderExpressDetailViewController.init(orderId: listModel.id! as NSString, expId: "", express_num: listModel.express_num! as NSString, show_type: .orderExpress, progress: .Zero), animated: true)
        }
    }
    
    /// 选取商品及拆单
    /// - Parameter listModel: 数据源
    private func delivery(listModel: ShopOrderListModel) {
        var type: CNLiveShopOrderSpliteSendViewType = .splite
        if listModel.is_send == "0" {
            type = .select
        }
        self.navigationController?.pushViewController(CNLiveShopOrderSendViewController.init(orderId: listModel.id! as NSString, show_type: type), animated: true)
    }
    
    /// 通知用户自提
    /// - Parameter listModel: 数据源
    private func notifyOrder(listModel: ShopOrderListModel) {
        ConfigAlertManager.shared.presentAlert(title: "提示", message: "确认通知用户自提?", actionTitles: ["取消","确认"]) { index in
            if index == 1 {
                CNLiveShopViewModel.requestNotifyOrder(orderId: listModel.id!) { result, respStatue in
                    if respStatue == .success {
                        showMessage(message: "通知成功")
                    }
                }
            }
        }
    }
    
    /// 跳转到订单详情界面
    /// - Parameter listModel: 数据源
    private func pushOrderDetail(listModel: ShopOrderListModel) {
        if listModel.isRefund == "1" {
            let detailVC =  CNLiveShopOrderDetailViewController.init(orderId: listModel.id!, show_type: .sale, form_type: .afterSale)
            self.navigationController?.pushViewController(detailVC, animated: true)
        } else {
            if listModel.address_address!.count > 0 {
                self.navigationController?.pushViewController(CNLiveShopOrderDetailViewController.init(orderId: listModel.id!, show_type: .order, form_type: .afterSale), animated: true)
            } else {
                showMessage(message: "目前没有地址信息,暂无法发货")
            }
        }
    }
}