//
|
// WelfareRedeemGoodsDetailVC.swift
|
// WanPai
|
//
|
// Created by 无故事王国 on 2023/6/28.
|
//
|
|
import UIKit
|
import QMUIKit
|
import JQTools
|
import WebKit
|
|
class WelfareRedeemGoodsDetailVC: BaseVC {
|
|
@IBOutlet weak var btn_student: QMUIButton!
|
@IBOutlet weak var btn_store: QMUIButton!
|
@IBOutlet weak var tableView: UITableView!
|
@IBOutlet weak var cons_tableHei: NSLayoutConstraint!
|
@IBOutlet weak var view_banner: UIView!
|
@IBOutlet weak var label_title: UILabel!
|
@IBOutlet weak var label_exchange: UILabel!
|
@IBOutlet weak var label_limit: UILabel!
|
@IBOutlet weak var label_cost: UILabel!
|
@IBOutlet weak var label_redeemedNum: UILabel!
|
@IBOutlet weak var label_residueNum: UILabel!
|
@IBOutlet weak var label_perLimit: UILabel!
|
@IBOutlet weak var label_startTime: UILabel!
|
@IBOutlet weak var label_courseHours: UILabel!
|
@IBOutlet weak var view_courseHours: UIView!
|
@IBOutlet weak var view_exchangeStore: UIView!
|
@IBOutlet weak var view_vaildTime: UIView!
|
@IBOutlet weak var webView: WKWebView!
|
@IBOutlet weak var label_storeName: UILabel!
|
@IBOutlet weak var cons_webHei: NSLayoutConstraint!
|
@IBOutlet weak var btn_exchange: UIButton!
|
@IBOutlet weak var view_students: UIView!
|
@IBOutlet weak var view_ticketType: UIView!
|
@IBOutlet weak var label_ticketType: UILabel!
|
@IBOutlet weak var view_selectStore: UIView!
|
@IBOutlet weak var view_selectStoreHei: NSLayoutConstraint!
|
|
private var bannerView:CommonBannerView = {
|
let banner = CommonBannerView()
|
return banner
|
}()
|
|
|
// private var model:BenefitHomeCommonditiesModel!
|
private var id:Int!
|
private var goodsType:ExchangeType?
|
private var exchangeGoodsModel:ExchangeGoodsModel?
|
private var storeModels = [StoreSimpleModel]()
|
private var selectStoreModel:StoreSimpleModel?
|
private var studentModels = [CourseDetailStudentModel]()
|
|
init(commodityId:Int,goodsType:ExchangeType?) {
|
super.init(nibName: nil, bundle: nil)
|
self.id = commodityId
|
self.goodsType = goodsType
|
}
|
|
required init?(coder: NSCoder) {
|
fatalError("init(coder:) has not been implemented")
|
}
|
|
override func viewDidLoad() {
|
super.viewDidLoad()
|
title = "商品详情"
|
|
if goodsType == .ticket{
|
view_vaildTime.isHidden = true //临时隐藏
|
}
|
|
//全局隐藏,目前不需要
|
view_exchangeStore.isHidden = true
|
|
|
view_selectStore.isHidden = true
|
view_selectStoreHei.constant = 0
|
|
getData()
|
}
|
|
override func setUI() {
|
btn_student.imagePosition = .right
|
btn_store.imagePosition = .right
|
webView.scrollView.isScrollEnabled = false
|
|
btn_student.spacingBetweenImageAndTitle = 3
|
btn_store.spacingBetweenImageAndTitle = 3
|
|
tableView.delegate = self
|
tableView.dataSource = self
|
tableView.isScrollEnabled = false
|
tableView.separatorStyle = .none
|
tableView.register(UINib(nibName: "StudentInfoTCell", bundle: nil), forCellReuseIdentifier: "_StudentInfoTCell")
|
|
view_banner.addSubview(bannerView)
|
bannerView.snp.makeConstraints { make in
|
make.edges.equalToSuperview()
|
}
|
}
|
|
private func getData(){
|
if let type = goodsType{
|
Services.UseBenefitDetail(goodsId: id, goodsType: type).subscribe(onNext: {[weak self] data in
|
if let model = data.data{
|
self?.updateData(model)
|
}
|
}).disposed(by: disposeBag)
|
}else{
|
Services.UseBenefitDetailOne(goodsId: id).subscribe(onNext: {[weak self] data in
|
if let model = data.data{
|
self?.updateData(model)
|
}
|
}).disposed(by: disposeBag)
|
}
|
updateStudenTable()
|
}
|
|
override func setRx() {
|
self.webView.scrollView.rx.observe(CGSize.self, "contentSize").map { (size) -> CGFloat? in
|
if let size = size{
|
return size.height
|
}
|
return nil
|
}.subscribe(onNext: { [unowned self](height) in
|
if let height = height{
|
self.cons_webHei.constant = height
|
}
|
}).disposed(by: disposeBag)
|
}
|
|
private func updateStudenTable(){
|
cons_tableHei.constant = Double(studentModels.count) * 100
|
tableView.reloadData()
|
}
|
|
private func updateData(_ model:ExchangeGoodsModel){
|
exchangeGoodsModel = model
|
label_title.text = model.goodName
|
label_limit.text = String(format: "%@|%@", model.belongsScope.strTitle,model.exchangeAddrType.titleRaw)
|
label_cost.isHidden = model.cost == 0
|
label_cost.text = String(format: "价值:%@", model.cost.currency())
|
label_redeemedNum.text = "\(model.redeemedNum)"
|
label_residueNum.text = "\(model.residueNum)"
|
label_perLimit.text = "\(model.perLimit)"
|
label_startTime.text = "\(model.startTime)-\(model.endTime)"
|
label_courseHours.text = "\(model.courseHours)课时"
|
view_courseHours.isHidden = model.courseHours == 0
|
// self?.view_exchangeStore.isHidden = model.exchangeAddrType != .store
|
view_students.isHidden = model.goodType != .course
|
view_ticketType.isHidden = model.goodType != .ticket
|
label_ticketType.text = model.cardType.strTitle
|
|
switch model.exchangeType{
|
case .coin:
|
label_exchange.text = String(format: "%ld积分", model.integral)
|
case .cashAndCoin:
|
label_exchange.text = String(format: "%ld积分+%@", model.integral,model.cash.currency())
|
case .cash:
|
label_exchange.text = model.cash.currency()
|
}
|
|
//加载门店
|
if model.exchangeAddrType == .store{
|
Services.exchangeStoreIds(id: model.goodId, type: model.goodType).subscribe(onNext: {[weak self] data in
|
if let models = data.data{
|
self?.storeModels = models
|
}
|
}).disposed(by: disposeBag)
|
}
|
|
if model.contents.isEmpty{
|
webView.loadHTMLString("暂无说明".jq_wrapHtml(), baseURL: nil)
|
}else{
|
webView.loadHTMLString(model.contents.jq_wrapHtml(), baseURL: nil)
|
}
|
|
let imgs = model.pics
|
var items = [CommonBannerModel]()
|
for (index,img) in imgs.enumerated(){
|
items.append(CommonBannerModel(index: index,resource: img,mediaType: .imageUrl))
|
}
|
bannerView.setItems(items: items)
|
}
|
|
@IBAction func chooseAction(_ sender: QMUIButton) {
|
guard exchangeGoodsModel != nil else {return}
|
StudentChooseView.show(itemType: .course, defaultStu: studentModels) {[weak self] studs in
|
guard let weakSelf = self else { return }
|
if studs.count > weakSelf.exchangeGoodsModel!.perLimit{
|
alert(msg: "最多选择\(weakSelf.exchangeGoodsModel!.perLimit)位运动营成员");return
|
}
|
self?.studentModels = studs as! [CourseDetailStudentModel]
|
self?.updateStudenTable()
|
} needAddClouse: { [weak self] in
|
let vc = AddStudentVC(type: .course,studentInfo: nil,identity:true)
|
self?.push(vc: vc)
|
}
|
}
|
|
@IBAction func chooseStoreAction(_ sender: QMUIButton) {
|
guard storeModels.count != 0 else {return}
|
ChooseStoreView.show(models: storeModels,defaultModel: selectStoreModel) {[weak self] m in
|
self?.selectStoreModel = m
|
self?.label_storeName.text = m.storeName
|
self?.view_selectStore.isHidden = false
|
self?.view_selectStoreHei.constant = 42
|
UIView.animate(withDuration: 0.4) {
|
self?.view.layoutIfNeeded()
|
}
|
}
|
}
|
|
@IBAction func exchangeAction(_ sender: UIButton) {
|
guard exchangeGoodsModel != nil else {return}
|
guard exchangeGoodsModel!.residueNum != 0 else {alert(msg: "已兑换光啦");return}
|
// guard exchangeGoodsModel!.redeemedNum != exchangeGoodsModel!.perLimit else {alert(msg: "您已兑换光啦");return}
|
if exchangeGoodsModel!.goodType == .course{
|
guard studentModels.count != 0 else {alert(msg: "请选择运动营成员");return}
|
}
|
|
if exchangeGoodsModel!.perLimit > 1{
|
var n = exchangeGoodsModel!.perLimit
|
if exchangeGoodsModel!.goodType == .course{
|
n = floor(Double(exchangeGoodsModel!.perLimit / studentModels.count)).int
|
}
|
|
ChooseNumberView.show(maxNumber: n) {[weak self] num in
|
self?.showExchangeUI(num: num)
|
}
|
}else{
|
showExchangeUI(num: 1)
|
}
|
}
|
|
private func showExchangeUI(num:Int){
|
let attribute = AttributedStringbuilder()
|
attribute.add(string: "确认消耗", withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: .black.withAlphaComponent(0.9))
|
|
var coin = 0
|
var cash:Double = 0
|
var totalNum = num * studentModels.count
|
if exchangeGoodsModel?.goodType == .course{
|
coin = exchangeGoodsModel!.integral * totalNum
|
cash = (exchangeGoodsModel!.cash * Double(totalNum))
|
}else{
|
coin = exchangeGoodsModel!.integral * num
|
cash = (exchangeGoodsModel!.cash * Double(num))
|
}
|
|
switch exchangeGoodsModel!.exchangeType{
|
case .cash:
|
attribute.add(string: cash.currency(), withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexStr: "#E41818").withAlphaComponent(0.8))
|
case .cashAndCoin:
|
attribute.add(string: String(format: "%ld积分和%@", coin,cash.currency()), withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexStr: "#E41818").withAlphaComponent(0.8))
|
case .coin:
|
attribute.add(string: "\(coin)积分", withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexStr: "#E41818").withAlphaComponent(0.8))
|
}
|
|
attribute.add(string: "兑换此商品吗?", withFont: UIFont.systemFont(ofSize: 16, weight: .medium), withColor: .black.withAlphaComponent(0.9))
|
CommonAlertView.show(title: "兑换商品", attribute: attribute.mutableAttributedString) {[weak self] state in
|
guard state else {return}
|
guard let weakSelf = self else { return }
|
|
let goodsType = weakSelf.exchangeGoodsModel!.goodType
|
var n = num
|
if goodsType == .course{
|
n = num * weakSelf.studentModels.count
|
}
|
|
|
if weakSelf.exchangeGoodsModel!.exchangeType == .coin{
|
Services.exchangeOperation(exchangeType: .coin, goodsId: weakSelf.exchangeGoodsModel!.goodId, goodsType: goodsType, num: n, payType: nil, stuIds: weakSelf.studentModels.map({"\($0.id)"}).joined(separator: ","),storeId: weakSelf.selectStoreModel?.storeId).subscribe(onNext: {[weak self] data in
|
guard let weakSelf = self else { return }
|
let vc = PaymentResultVC(result: .success, objType: .exchange)
|
vc.otherInfo = ["id":data.data?.returnId ?? 0,"goodsType":goodsType.rawValue]
|
self?.push(vc: vc)
|
self?.exchangeSuccessUI()
|
NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil)
|
},onError: { error in
|
if let er = error as? NetworkRequest.NetRequestError{
|
switch er {
|
case .Other(_,let string):
|
CommonAlertView.show(title: "兑换商品", content: string) { _ in
|
|
}
|
default:
|
CommonAlertView.show(title: "兑换商品", content: "兑换失败") { _ in
|
|
}
|
}
|
}
|
}).disposed(by: weakSelf.disposeBag)
|
}else {
|
//支付金额
|
PaymentView.show(enumType: .goods(goodsType), money: (ali:cash,wx:cash,coin:nil,course:nil,integral:nil)) { payType in
|
Services.exchangeOperation(exchangeType: weakSelf.exchangeGoodsModel!.exchangeType, goodsId: weakSelf.exchangeGoodsModel!.goodId, goodsType: weakSelf.exchangeGoodsModel!.goodType, num: n, payType: payType, stuIds: weakSelf.studentModels.map({"\($0.id)"}).joined(separator: ","), storeId: weakSelf.selectStoreModel?.storeId).subscribe(onNext: {[weak self] data in
|
if let m = data.data{
|
switch payType {
|
case .aliPay:
|
YYPaymentManager.shared.sendPaymentRequest(YYAlipayRequest(orderString: m.orderString)) {[weak self] result in
|
guard let weakSelf = self else { return }
|
switch result {
|
case .success:
|
let vc = PaymentResultVC(result: .success, objType: .exchange)
|
vc.otherInfo = ["id":m.returnId,"goodsType":weakSelf.exchangeGoodsModel!.goodType.rawValue]
|
self?.push(vc: vc)
|
self?.exchangeSuccessUI()
|
NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil)
|
case .cancel:
|
alert(msg: "已取消兑换")
|
case .failure(let error):
|
if let er = error as? NetworkRequest.NetRequestError{
|
switch er {
|
case .Other(let code,let string):
|
let vc = PaymentResultVC(result: .fail(string,code), objType: .exchange)
|
weakSelf.push(vc: vc)
|
default:
|
let vc = PaymentResultVC(result: .fail("兑换失败",0), objType: .exchange)
|
weakSelf.push(vc: vc)
|
}
|
}
|
self?.exchangeSuccessUI()
|
NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil)
|
}
|
}
|
case .wechat:
|
YYPaymentManager.shared.sendPaymentRequest(YYWeChatPayRequest(partnerId: m.partnerid, prepayId: m.prepayid, package: m.package, nonceStr: m.noncestr, timeStamp: m.timestamp, sign: m.sign)) {[weak self] result in
|
guard let weakSelf = self else { return }
|
switch result {
|
case .success:
|
let vc = PaymentResultVC(result: .success, objType: .exchange)
|
vc.otherInfo = ["id":m.returnId,"goodsType":weakSelf.exchangeGoodsModel!.goodType.rawValue]
|
self?.push(vc: vc)
|
self?.exchangeSuccessUI()
|
NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil)
|
case .cancel:
|
alert(msg: "已取消兑换")
|
case .failure(let error):
|
if let er = error as? NetworkRequest.NetRequestError{
|
switch er {
|
case .Other(let code,let string):
|
let vc = PaymentResultVC(result: .fail(string,code), objType: .exchange)
|
weakSelf.push(vc: vc)
|
default:
|
let vc = PaymentResultVC(result: .fail("兑换失败",0), objType: .exchange)
|
weakSelf.push(vc: vc)
|
}
|
}
|
self?.exchangeSuccessUI()
|
NotificationCenter.default.post(name: UpdateWelfare_Noti, object: nil)
|
}
|
}
|
case .coin:
|
let vc = PaymentResultVC(result: .success, objType: .exchange)
|
vc.otherInfo = ["id":m.returnId,"goodsType":weakSelf.exchangeGoodsModel!.goodType.rawValue]
|
self?.push(vc: vc)
|
self?.exchangeSuccessUI()
|
case .courseNum:break
|
default:break
|
}
|
}
|
},onError: { error in
|
if let er = error as? NetworkRequest.NetRequestError{
|
switch er {
|
case .Other(let code,let string):
|
let vc = PaymentResultVC(result: .fail(string,code), objType: .exchange)
|
weakSelf.push(vc: vc)
|
default:
|
let vc = PaymentResultVC(result: .fail("兑换失败",0), objType: .exchange)
|
weakSelf.push(vc: vc)
|
}
|
}
|
}).disposed(by: weakSelf.disposeBag)
|
}
|
}
|
}
|
}
|
|
private func exchangeSuccessUI(){
|
// btn_exchange.setTitle("已兑换", for: .normal)
|
// btn_exchange.isEnabled = false
|
// label_redeemedNum.text = "\(exchangeGoodsModel!.redeemedNum + 1)"
|
// label_residueNum.text = "\(exchangeGoodsModel!.residueNum - 1)"
|
getData()
|
}
|
}
|
|
extension WelfareRedeemGoodsDetailVC:UITableViewDelegate{
|
|
}
|
|
extension WelfareRedeemGoodsDetailVC:UITableViewDataSource{
|
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfoTCell") as! StudentInfoTCell
|
cell.indexPath = indexPath
|
cell.studentModel = studentModels[indexPath.row]
|
cell.deleClouse = {[weak self] index in
|
self?.studentModels.remove(at: index)
|
self?.updateStudenTable()
|
}
|
return cell
|
}
|
|
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
return studentModels.count
|
}
|
}
|