// // PromotionalActivitiesVC.swift // QuickLocation // // Created by 八条 on 2026/7/3. // import UIKit import RxSwift import RxCocoa import RxDataSources extension PromotionalActivitiesItem: Equatable { static func == (lhs: Self, rhs: Self) -> Bool { switch (lhs, rhs) { case (.recommend(let a), .recommend(let b)): return a == b case (.normal(let a), .normal(let b)): return a == b default: return false } } } extension PromotionalActivitiesItem: IdentifiableType { typealias Identity = String var identity: String { switch self { case .recommend(let model): return model.goods_id case .normal(let model): return model.goods_id } } } class PromotionalActivitiesVC: BaseViewController { fileprivate var rootView: PromotionalActivitiesView! var onDismiss: (() -> Void)? private var selectedGoodsId: String = "" private let itemsRelay = BehaviorRelay<[PromotionalActivitiesItem]>(value: []) var items: [PromotionalActivitiesItem] { get { itemsRelay.value } set { itemsRelay.accept(newValue) } } override func loadView() { rootView = PromotionalActivitiesView(frame: UIScreen.main.bounds) view = rootView } override func viewDidLoad() { super.viewDidLoad() setupTableView() requestRechargeInfo() rootView.confirmBtn.rx.tap.subscribe(onNext: { _ in self.requestOrderPayParams() }).disposed(by: disposeBag) } private func setupTableView() { typealias Section = SectionModel let dataSource = RxTableViewSectionedReloadDataSource
{ _, tableView, indexPath, item in let isSelected = item.identity == self.selectedGoodsId switch item { case .recommend(let model): let cell: PromotionalRecommendCell = tableView.dequeueReusableCell(for: indexPath) cell.configure(model: model, isSelected: isSelected) return cell case .normal(let model): let cell: PromotionalNormalCell = tableView.dequeueReusableCell(for: indexPath) cell.configure(model: model, isSelected: isSelected) return cell } } itemsRelay .map { [SectionModel(model: "", items: $0)] } .bind(to: rootView.tableView.rx.items(dataSource: dataSource)) .disposed(by: disposeBag) itemsRelay .subscribe(onNext: { [weak self] items in self?.rootView.tableView.layoutChain.height(CGFloat(items.count) * 106 + 5) self?.rootView.scrollContentView.layoutIfNeeded() }) .disposed(by: disposeBag) rootView.tableView.rx.itemSelected .subscribe(onNext: { [weak self] indexPath in guard let self = self else { return } let item = self.itemsRelay.value[indexPath.row] self.selectedGoodsId = item.identity self.rootView.tableView.reloadData() }) .disposed(by: disposeBag) } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) if isMovingFromParent { onDismiss?() } } // MARK: - API private func requestRechargeInfo() { DLToast.showLoading() OrderService.rechargeInfo(type: "member").subscribe(onNext: { [weak self] response in guard let self = self else { return } if let checkedId = response.list.first(where: { $0.checked })?.goods_id { self.selectedGoodsId = checkedId } let items = response.list.map { model in model.goods_id == "20042" ? PromotionalActivitiesItem.recommend(model: model) : PromotionalActivitiesItem.normal(model: model) } self.items = items self.rootView.startCountdown() }).disposed(by: disposeBag) } private func requestOrderPayParams() { guard let systemConfig = AppContextManager.shared.systemConfig, let timeConfig = systemConfig.timeConfig else { return } if timeConfig.pay_pop_type == 3 { IAPManager.shared.purchase(goodsId: selectedGoodsId) { [weak self] success, msg in guard let self = self else { return } if success { self.showPayResultPop(showCloseBtn: false, status: true, title: "支付成功", message: "恭喜您!成功开通!", confirmText: "确定", confirmBlock: { AppRouter.shared.popOrDismiss() }, cancelBlock: { }) } else { self.showPayResultPop(status: false, title: "支付失败", message: msg ?? "很抱歉,请您重新支付!", confirmText: "重新支付", confirmBlock: { }, cancelText: "取消", cancelBlock: { AppRouter.shared.popOrDismiss() }) } } return } let payType = timeConfig.pay_pop_type == 1 ? "alipay" : "weixin" dl.showLoading() OrderService.orderPayParams(goodsId: selectedGoodsId, payType: payType).subscribe(onNext: { response in self.dl.dismiss() guard let data = response.data else { return } if payType == "weixin" { // 微信 // WXApi.registerApp(model.appId, universalLink: AppSettings.kAppsUniversalLink) // // let request: PayReq = PayReq() // request.partnerId = model.partnerId // request.prepayId = model.prepayId // request.package = model.packageValue // request.nonceStr = model.nonceStr // request.timeStamp = UInt32(model.timeStamp) ?? 0 // request.sign = model.sign // WXApi.send(request) } else if payType == "alipay" { // 支付宝 if let payParam = data["payParam"] as? String, let appId = data["payParam"] as? String { AlipaySDK.defaultService().payOrder(payParam, fromScheme: "Alipay\(appId)") { resultDic in print("支付宝callback -> \(resultDic)") guard let result = resultDic, let resultStatus = result["resultStatus"] as? String else { return } /** 9000 订单支付成功。 8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商家订单列表中订单的支付状态。 4000 订单支付失败。 5000 重复请求。 6001 用户中途取消。 6002 网络连接出错。 6004 支付结果未知(有可能已经支付成功),请查询商家订单列表中订单的支付状态。 其它 其它支付错误。 */ if resultStatus == "9000" { self.showPayResultPop(showCloseBtn: false, status: true, title: "支付成功", message: "恭喜您!成功开通\("")", confirmText: "确定", confirmBlock: { AppRouter.shared.popOrDismiss() }, cancelBlock: { }) } else { self.showPayResultPop(status: false, title: "支付失败", message: "很抱歉,请您重新支付!", confirmText: "重新支付", confirmBlock: { }, cancelText: "取消", cancelBlock: { AppRouter.shared.popOrDismiss() }) } } } } }, onError: { _ in }).disposed(by: disposeBag) } }