// // KWMSelectSizeViewController.m // iCemarose // // Created by HouWeiBin on 17/6/26. // Copyright © 2016年 kollway. All rights reserved. // #import "KWMVariantsVC.h" #import "KWMProductSizeCell.h" #import "KWMProductColorCell.h" #import "KWMCurrencyUtil.h" #import "KWMStringUtil.h" #import "BUYProductVariant+Currency.h" #import "UIColor+SAMAdditions.h" @interface KWMVariantsVC () @property(nonatomic,weak) IBOutlet NSLayoutConstraint *vContentHeight; @property (weak, nonatomic) IBOutlet UICollectionView *cvVariants; @property(nonatomic) IBOutlet UILabel *lbPrice; @property(nonatomic) IBOutlet UILabel *lbCount; @property(weak,nonatomic) IBOutlet UIView *vCount; @property(nonatomic) NSInteger count; @property(nonatomic) NSDecimalNumber *totalPrice; @property(nonatomic) BUYProductVariant *selectVariant; @property(nonatomic) KWMVariants *selectAdminVariant; @property(nonatomic) KWMColor *selectColor; @property (nonatomic) NSArray<BUYProductVariant *> *variantArray; //請求api拿到的admin 規格列表,主要使用到其中的庫存剩餘字段 @property (nonatomic) NSArray<KWMVariants *> *adminVariantArray; @end @implementation KWMVariantsVC +(NSString *)kwmTag{ return @"KWMVariantsVC"; } -(void)viewDidLoad{ [super viewDidLoad]; [self initView]; } -(void)viewDidLayoutSubviews{ [super viewDidLayoutSubviews]; //在小屏机/ipad时,uicollectionview初始显示超出宽度的问题。 [self.cvVariants reloadData]; } -(NSDecimalNumber *)totalPrice{ if(_totalPrice){ return _totalPrice; } return [NSDecimalNumber decimalNumberWithString:@"0"]; } -(NSArray<BUYProductVariant *> *)variantArray{ if(_variantArray){ return _variantArray; } return [NSArray array]; } -(void)setDefaultSelect:(BUYProductVariant *)variant color:(KWMColor *)color count:(NSInteger)count{ self.selectColor = color; self.selectVariant = variant; self.count = count; } -(void)setAdminVariantArray:(NSArray<KWMVariants *> *)adminVariantArray{ _adminVariantArray = adminVariantArray; if(adminVariantArray && self.selectVariant){ for(KWMVariants *variant in adminVariantArray){ if(self.selectVariant.identifier.integerValue == variant.id.integerValue){ self.selectAdminVariant = variant; } } } } -(void)setProduct:(BUYProduct *)product{ _product = product; if(product){ self.variantArray = product.variantsArray; } } -(void)setAdminProduct:(KWMProduct *)adminProduct{ _adminProduct = adminProduct; if(adminProduct){ self.adminVariantArray = adminProduct.variants; } } -(void)setShopCartModel:(KWMShopCartModel *)shopCartModel{ _shopCartModel = shopCartModel; if(shopCartModel && self.variantArray){ for (BUYProductVariant *variant in self.variantArray){ if([shopCartModel.size isEqualToString:variant.title]){ self.selectVariant = variant; self.count = shopCartModel.quantity; } } } } -(void)initView{ [self initDefaultColor]; [self initUI]; [self initCollectionView]; [self initContentHeight]; if(!self.adminProduct){ [self requestAdminProduct:self.product.identifier]; } } -(void)initDefaultColor{ if(self.product && self.colorArray && !self.selectColor){ for(KWMColor *color in self.colorArray){ if([color.handle isEqual:self.product.handle]){ self.selectColor = color; self.selectColor.adminProduct = self.adminProduct; return; } } }else if(self.selectColor && self.selectColor.product){ self.variantArray = self.selectColor.product.variantsArray; } } -(void)initUI{ if(self.selectVariant){ self.totalPrice = [self.selectVariant.price decimalNumberByMultiplyingBy:[NSDecimalNumber decimalNumberWithDecimal:@(self.count).decimalValue]]; } self.vCount.hidden = self.wish?YES:NO; self.lbCount.text = [NSString stringWithFormat:@"%ld",(long)self.count]; self.lbPrice.text = [[KWMCurrencyUtil sharedInstance] priceFormattedByCurrencyCode:self.totalPrice]; } -(void)initCollectionView{ [self.cvVariants registerNib:[UINib nibWithNibName:NSStringFromClass([KWMProductColorCell class]) bundle:nil] forCellWithReuseIdentifier:NSStringFromClass([KWMProductColorCell class])]; [self.cvVariants registerNib:[UINib nibWithNibName:NSStringFromClass([KWMProductSizeCell class]) bundle:nil] forCellWithReuseIdentifier:NSStringFromClass([KWMProductSizeCell class])]; [self.cvVariants registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UICollectionViewHeader"]; UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init]; layout.minimumLineSpacing = 12; layout.sectionInset = UIEdgeInsetsMake(0, 35, 0, 35); layout.headerReferenceSize = CGSizeMake(UI_SCREEN_WIDTH, 45); self.cvVariants.collectionViewLayout = layout; } //初始化佈局高度 -(void)initContentHeight{ CGFloat height = self.cvVariants.collectionViewLayout.collectionViewContentSize.height; CGFloat contentHeigt = fminf(UI_SCREEN_HEITHT*0.9,height+173); self.vContentHeight.constant = contentHeigt; [self.view layoutIfNeeded]; } -(IBAction)onClickAdd:(id)sender{ if(self.selectVariant){ NSInteger maxCount = self.selectAdminVariant?self.selectAdminVariant.inventoryQuantity.integerValue:9999; if(self.count + 1 > maxCount){ self.count = maxCount; [self showToast:[NSString stringWithFormat:@"商品剩余库存仅有%ld件",maxCount]]; }else{ self.count ++; } [self initUI]; }else{ [self showToast:@"请选择您想要的规格"]; } } -(IBAction)onClickReduce:(id)sender{ if(self.selectVariant){ self.count = self.count == 1?:self.count-1; [self initUI]; }else{ [self showToast:@"请选择您想要的规格"]; } } /** * 点击加入购物车 * * @param sender <#sender description#> */ -(IBAction)onClickComplete:(UIButton *)sender{ if (self.selectVariant == nil) { [self showToast:@"请选择您想要的规格"]; return; } if (self.count <= 0 && self.wish){ [self showToast:@"商品数量不能为0"]; } //购物车页面 if ([self.delegate respondsToSelector:@selector(kwm_addShopWithVariantId:quantity:variant:buyNow:callback:)]){ __weak id this = self; [self showLoading]; if (self.delegate) { [self.delegate kwm_addShopWithVariantId:self.selectVariant.identifier quantity:self.count variant:self.selectVariant buyNow:false callback:^(BOOL success) { [self hideLoading]; if(success) { [this dismissViewControllerAnimated:YES completion:nil]; } }]; } } //商品详情页.愿望单页 //商品详情页现在不是添加到购物车了,而是先显示。所以现在是回调出去。 if ([self.delegate respondsToSelector:@selector(kwm_setVariant:variant:color:count:)]){ [self.delegate kwm_setVariant:self variant:self.selectVariant color:self.selectColor count:self.count]; [self dismissViewControllerAnimated:YES completion:nil]; } } -(IBAction)onClickBg:(id)sender{ [self dismissViewControllerAnimated:YES completion:nil]; } #pragma mark -- UICollectionViewDataSource UICollectionViewDelegate -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ if(self.colorArray && self.colorArray.count>0){ return 2; }else{ return 1; } } -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ if(section == 0){ return self.variantArray?self.variantArray.count:0; }else{ return self.colorArray?self.colorArray.count:0; } } //创建头视图 - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *headView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UICollectionViewHeader" forIndexPath:indexPath]; NSString *colorTitle = @"颜色"; NSString *sizeTitle = @"尺寸"; if(self.selectAdminVariant && self.selectAdminVariant.inventoryQuantity.integerValue <= 5){ sizeTitle = [NSString stringWithFormat:@"尺寸 (仅剩%@件)",self.selectAdminVariant.inventoryQuantity.stringValue]; } [headView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; UILabel *headerLabel = [[UILabel alloc]initWithFrame:CGRectMake(35, 15, UI_SCREEN_WIDTH-80,30)]; headerLabel.textColor = [UIColor sam_colorWithHex:@"393939"]; headerLabel.font = [UIFont systemFontOfSize:12.5]; headerLabel.text = indexPath.section == 0?sizeTitle:colorTitle; [headView addSubview:headerLabel]; return headView; } -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ if(indexPath.section == 0){ KWMProductSizeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([KWMProductSizeCell class]) forIndexPath:indexPath]; BUYProductVariant *variant = [self.variantArray objectAtIndex:indexPath.row]; KWMVariants *adminVariant = nil; if(self.adminVariantArray){ for(KWMVariants *mAdminVariant in self.adminVariantArray){ if([variant.identifier isEqualToNumber:mAdminVariant.id]){ adminVariant = mAdminVariant; } } } BOOL isSelect = [self isSelect:variant]; BOOL isSellOut = [self isSellOut:variant adminVariant:adminVariant]; cell.isSelect = isSelect; cell.isSellOut = isSellOut; cell.productVariant = variant; return cell; }else{ KWMColor *color = [self.colorArray objectAtIndex:indexPath.row]; KWMProductColorCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([KWMProductColorCell class]) forIndexPath:indexPath]; cell.isSelect = self.selectColor?[self.selectColor.handle isEqualToString:color.handle]:NO; cell.data = color; return cell; } } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ if(indexPath.section == 0){ NSInteger width = (UI_SCREEN_WIDTH - (30 + 30) - (10*3)) / 3; NSInteger height = width * 0.4; return (CGSize){width,height}; }else{ return (CGSize){50,70}; } } -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ if(indexPath.section == 0){ BUYProductVariant *variant = [self.variantArray objectAtIndex:indexPath.row]; KWMVariants *adminVariant = nil; if(self.adminVariantArray){ for(KWMVariants *mAdminVariant in self.adminVariantArray){ if([variant.identifier isEqualToNumber:mAdminVariant.id]){ adminVariant = mAdminVariant; } } } BOOL isSellOut = [self isSellOut:variant adminVariant:adminVariant]; if(isSellOut){ return; } if(!self.selectVariant || ![self.selectVariant.identifier isEqualToNumber:variant.identifier]){ self.count = 1; } self.selectVariant = variant; self.selectAdminVariant = adminVariant; [self.cvVariants reloadData]; [self initUI]; }else if(indexPath.section == 1){ KWMColor *color = [self.colorArray objectAtIndex:indexPath.row]; if(!color.product){ return; } self.selectColor = color; self.selectVariant = nil; self.selectAdminVariant = nil; self.variantArray = color.product.variantsArray; self.adminVariantArray = color.adminProduct?color.adminProduct.variants:nil; [self.cvVariants reloadData]; [self initContentHeight]; if(!self.adminVariantArray){ [self requestAdminProduct:self.selectColor.product.identifier]; } } } #pragma mark -- API KWMAPIManager getAdminProduct -(void)requestAdminProduct:(NSNumber *)productId{ if(productId == nil){ return; } __weak KWMVariantsVC *weakSelf = self; void(^failure)(NSURLSessionDataTask *,NSError *) = ^(NSURLSessionDataTask *task,NSError *error){ [weakSelf showError:error]; }; void(^success)(NSURLSessionDataTask *,KWMProductResult *) = ^(NSURLSessionDataTask *task,KWMProductResult *result){ if(result!=nil && result.product!=nil){ KWMProduct* adminProduct = (KWMProduct *)result.product; NSArray<KWMVariants *> *adminVariants = adminProduct.variants; weakSelf.adminVariantArray = adminVariants; [weakSelf.cvVariants reloadData]; if(weakSelf.colorArray){ for(KWMColor *color in weakSelf.colorArray){ if(color.product && [color.product.identifier isEqualToNumber:productId]){ color.adminProduct = adminProduct; } } } } }; [self.api getAdminProduct:nil productId:productId success:success failure:failure]; } #pragma mark --ProductVariantUtil -(BOOL)isSellOut:(BUYProductVariant *)variant adminVariant:(KWMVariants *)adminVariant{ BOOL isSellOut = NO; if(variant){ isSellOut = !variant.availableValue; } if(adminVariant && !isSellOut){ isSellOut = adminVariant.inventoryQuantity.integerValue <= 0; } return isSellOut; } -(BOOL)isSelect:(BUYProductVariant *)variant{ if(variant && self.selectVariant){ return [variant.identifier isEqualToNumber:self.selectVariant.identifier]; }; if(variant && self.wish && !self.selectVariant){ if([variant.identifier isEqualToNumber:self.wish.variantId]){ self.selectVariant = variant; return YES; } } return NO; } @end