// // MerchantEnrollViewController.m // BuguLive // // Created by qitewei on 2025/8/11. // Copyright © 2025 xfg. All rights reserved. // #import "MerchantEnrollViewController.h" #import "MerchantEnrollGuideView.h" #import "MerchantEnrollCheckListView.h" #import "MerchantStoreInfoView.h" #import "MerchantBusinessLicenseView.h" #import "MerchantLegalInfoView.h" #import "MerchantBankInfoView.h" #import "MerchantAdminSetupView.h" #import "MerchantPaymentView.h" #import "MerchantEnrollResultView.h" #import "NavigationBarView.h" #import "MerchantBaseEnrollContentView.h" #import "UIButton+Layout.h" #import "MerchantEnrollDataManager.h" @interface MerchantEnrollViewController () @property (nonatomic, assign) MerchantEnrollStep currentStep; @property (nonatomic, strong) NavigationBarView *navBar; @property (nonatomic, strong) UIImageView *bgImageView; @property (nonatomic, strong) UILabel *titleLabel; @property (nonatomic, strong) UIStackView *stepsStackView; @property (nonatomic, strong) UIView *step1View; @property (nonatomic, strong) UIView *step2View; @property (nonatomic, strong) UIView *step3View; @property (nonatomic, strong) UIImageView *line1ImageView; @property (nonatomic, strong) UIImageView *line2ImageView; @property (nonatomic, strong) NSMutableArray *buttons; @property (nonatomic, strong) JXCategoryTitleView *categoryView; @property (nonatomic, strong) JXCategoryListContainerView *containerView; @property (nonatomic, copy) NSArray *list; @property (nonatomic, strong, nullable) MerchantEnrollGuideView *guideView; @property (nonatomic, strong, nullable) MerchantEnrollCheckListView *checkListView; @property (nonatomic, strong, nullable) MerchantEnrollResultView *resultView; @property (nonatomic, assign) NSInteger selectedIndex; @end @implementation MerchantEnrollViewController #pragma mark - 步骤恢复 - (void)restoreCurrentStep { // 从数据管理器获取上次保存的步骤 MerchantEnrollStep savedStep = [[MerchantEnrollDataManager sharedManager] getCurrentStep]; self.currentStep = savedStep; // 根据步骤设置selectedIndex if (self.currentStep > MerchantEnrollStepCheckList && self.currentStep < MerchantEnrollStepWatingForReview) { self.selectedIndex = self.currentStep - 2; // 减去Guide和CheckList步骤 } else { self.selectedIndex = 0; } } #pragma mark - 数据保存和恢复 - (void)saveCurrentStepData { MerchantBaseEnrollContentView *currentView = [self getCurrentContentView]; if (!currentView) return; NSDictionary *data = nil; MerchantEnrollDataManager *dataManager = [MerchantEnrollDataManager sharedManager]; switch (self.currentStep) { case MerchantEnrollStepStoreInfo: if ([currentView isKindOfClass:[MerchantStoreInfoView class]]) { MerchantStoreInfoView *storeView = (MerchantStoreInfoView *)currentView; data = [storeView getMerchantEnrollParameters]; [dataManager saveStoreInfoData:data]; } break; case MerchantEnrollStepBusinessLicense: if ([currentView respondsToSelector:@selector(getMerchantEnrollParameters)]) { data = [currentView performSelector:@selector(getMerchantEnrollParameters)]; [dataManager saveBusinessLicenseData:data]; } break; case MerchantEnrollStepLegalInfo: if ([currentView respondsToSelector:@selector(getMerchantEnrollParameters)]) { data = [currentView performSelector:@selector(getMerchantEnrollParameters)]; [dataManager saveLegalInfoData:data]; } break; case MerchantEnrollStepBank: if ([currentView respondsToSelector:@selector(getMerchantEnrollParameters)]) { data = [currentView performSelector:@selector(getMerchantEnrollParameters)]; [dataManager saveBankInfoData:data]; } break; case MerchantEnrollStepSetAdmin: if ([currentView respondsToSelector:@selector(getMerchantEnrollParameters)]) { data = [currentView performSelector:@selector(getMerchantEnrollParameters)]; [dataManager saveAdminSetupData:data]; } break; default: break; } } - (MerchantBaseEnrollContentView *)getCurrentContentView { // 获取当前显示的内容视图 if (self.currentStep > MerchantEnrollStepCheckList && self.currentStep < MerchantEnrollStepWatingForReview) { // 从容器视图中获取当前视图 UIView *listView = [self.containerView.validListDict objectForKey:@(self.selectedIndex)]; if ([listView isKindOfClass:[MerchantBaseEnrollContentView class]]) { return (MerchantBaseEnrollContentView *)listView; } } return nil; } - (void)fillDataForContentView:(MerchantBaseEnrollContentView *)contentView withStep:(MerchantEnrollStep)step { if (!contentView) return; MerchantEnrollDataManager *dataManager = [MerchantEnrollDataManager sharedManager]; NSDictionary *savedData = nil; // 根据步骤获取相应的保存数据 switch (step) { case MerchantEnrollStepStoreInfo: savedData = [dataManager getStoreInfoData]; if (savedData && [contentView respondsToSelector:@selector(fillWithData:)]) { [contentView performSelector:@selector(fillWithData:) withObject:savedData]; } break; case MerchantEnrollStepBusinessLicense: savedData = [dataManager getBusinessLicenseData]; if (savedData && [contentView respondsToSelector:@selector(fillWithData:)]) { [contentView performSelector:@selector(fillWithData:) withObject:savedData]; } break; case MerchantEnrollStepLegalInfo: savedData = [dataManager getLegalInfoData]; if (savedData && [contentView respondsToSelector:@selector(fillWithData:)]) { [contentView performSelector:@selector(fillWithData:) withObject:savedData]; } break; case MerchantEnrollStepBank: savedData = [dataManager getBankInfoData]; if (savedData && [contentView respondsToSelector:@selector(fillWithData:)]) { [contentView performSelector:@selector(fillWithData:) withObject:savedData]; } break; case MerchantEnrollStepSetAdmin: savedData = [dataManager getAdminSetupData]; if (savedData && [contentView respondsToSelector:@selector(fillWithData:)]) { [contentView performSelector:@selector(fillWithData:) withObject:savedData]; } break; default: break; } } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; [IQKeyboardManager sharedManager].enable = YES; [IQKeyboardManager sharedManager].enableAutoToolbar = YES; // 恢复上次的步骤 [self restoreCurrentStep]; [self setupNavigationBar]; [self setupStepsUI]; [self showCurrentStep]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.navigationController.navigationBar.hidden = YES; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; self.navigationController.navigationBar.hidden = NO; } #pragma mark - UI Setup - (void)setupNavigationBar { self.title = ASLocalizedString(@"商家入驻"); [self.view addSubview:self.bgImageView]; [self.view addSubview:self.navBar]; self.navBar.titleLabel.text = self.title; [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.top.mas_offset(0); make.height.mas_equalTo(self.bgImageView.height); }]; [self.navBar mas_makeConstraints:^(MASConstraintMaker *make) { make.top.right.left.mas_offset(0); make.height.mas_equalTo(self.navBar.height); }]; } #pragma mark - Steps UI Setup - (void)setupStepsUI { [self.view addSubview:self.categoryView]; [self.view addSubview:self.stepsStackView]; [self.view addSubview:self.containerView]; // 创建步骤视图 [self.stepsStackView addArrangedSubview:self.step1View]; [self.stepsStackView addArrangedSubview:self.step2View]; [self.stepsStackView addArrangedSubview:self.step3View]; [self.view addSubview:self.line1ImageView]; [self.view addSubview:self.line2ImageView]; // 设置步骤1(选中状态) [self setupStepView:self.step1View withNumber:@"1" title:ASLocalizedString(@"提交材料") isSelected:YES]; // 设置步骤2(未选中状态) [self setupStepView:self.step2View withNumber:@"2" title:ASLocalizedString(@"平台审核") isSelected:NO]; // 设置步骤3(未选中状态) [self setupStepView:self.step3View withNumber:@"3" title:ASLocalizedString(@"完成入驻") isSelected:NO]; [self.stepsStackView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.navBar.mas_bottom).offset(kRealValue(20)); make.centerX.mas_offset(0); make.left.right.mas_offset(0); make.height.mas_equalTo(kRealValue(80)); }]; [self.categoryView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.stepsStackView); }]; [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.bottom.mas_offset(0); make.top.equalTo(self.stepsStackView.mas_bottom); }]; [self.line1ImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(CGSizeMake(kRealValue(70), kRealValue(8))); make.left.mas_offset(kRealValue(90)); make.centerY.equalTo(self.stepsStackView).mas_offset(-kRealValue(20)); }]; [self.line2ImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(CGSizeMake(kRealValue(70), kRealValue(8))); make.right.mas_offset(kRealValue(-90)); make.centerY.equalTo(self.line1ImageView); }]; } - (void)setupStepView:(UIView *)stepView withNumber:(NSString *)number title:(NSString *)title isSelected:(BOOL)isSelected { NSString *imageName = [NSString stringWithFormat:@"store_step_%@", number]; NSString *selImageName = [NSString stringWithFormat:@"store_step_%@_sel", number]; UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button setTitle:title forState:UIControlStateNormal]; button.titleLabel.font = [UIFont systemFontOfSize:12 weight:UIFontWeightMedium]; [button setTitleColor:[UIColor colorWithHexString:@"#777777"] forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateSelected]; [button setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal]; [button setImage:[UIImage imageNamed:selImageName] forState:UIControlStateSelected]; button.selected = isSelected; [button layoutImageTopSpace:3]; // 添加视图 [stepView addSubview:button]; [button mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_offset(0); }]; button.tag = [number integerValue]; [self.buttons addObject:button]; } - (void)showCurrentStep { if (self.guideView) { [self.guideView removeFromSuperview]; self.guideView = nil; } if (self.checkListView) { [self.checkListView removeFromSuperview]; self.guideView = nil; } if (self.currentStep <= MerchantEnrollStepCheckList) { self.stepsStackView.hidden = YES; self.containerView.hidden = YES; self.line1ImageView.hidden = YES; self.line2ImageView.hidden = YES; MerchantBaseEnrollContentView *contentView; switch (self.currentStep) { case MerchantEnrollStepGuide: self.guideView = [[MerchantEnrollGuideView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-self.bgImageView.height+kRealValue(60))]; contentView = self.guideView; break; case MerchantEnrollStepCheckList: self.checkListView = [[MerchantEnrollCheckListView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-self.bgImageView.height+kRealValue(100))]; contentView = self.checkListView; break; default: break; } if (contentView) { contentView.currentStep = self.currentStep; contentView.delegate = self; [self.view addSubview:contentView]; [contentView mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(contentView.size); make.bottom.inset(0); make.centerX.mas_offset(0); }]; } } else { self.line1ImageView.hidden = NO; self.line2ImageView.hidden = NO; if (self.buttons.count > 1) { UIButton *second = self.buttons[1]; second.selected = self.currentStep >= MerchantEnrollStepWatingForReview; } NSString *name = self.currentStep >= MerchantEnrollStepWatingForReview ? @"store_line_blue" : @"store_line_gray(1)"; self.line2ImageView.image = [UIImage imageNamed:name]; UIButton *last = self.buttons.lastObject; last.selected = self.currentStep >= MerchantEnrollStepComplete; if (self.currentStep > MerchantEnrollStepCheckList && self.currentStep < MerchantEnrollStepWatingForReview) { self.stepsStackView.hidden = NO; self.containerView.hidden = NO; [self.categoryView selectItemAtIndex:self.selectedIndex]; } else { self.stepsStackView.hidden = NO; self.containerView.hidden = YES; switch (self.currentStep) { case MerchantEnrollStepWatingForReview: [self showEnrollResult:MerchantEnrollResultPending]; break; case MerchantEnrollStepReviewFail: [self showEnrollResult:MerchantEnrollResultFailed]; break; case MerchantEnrollStepComplete: [self showEnrollResult:MerchantEnrollResultSuccess]; break; default: break; } } } } - (void)backButtonClicked:(UIButton *)sender { [self.navigationController popViewControllerAnimated:YES]; } - (void)helpButtonClicked:(UIButton *)sender { // TODO: 显示帮助页面 NSLog(@"Help button clicked"); } - (void)showEnrollResult:(MerchantEnrollResultType)resultType { if (_resultView) { [_resultView removeFromSuperview]; _resultView = nil; } // 添加结果页面 MerchantEnrollResultView *resultView = [[MerchantEnrollResultView alloc] initWithResultType:resultType frame:CGRectMake(0, 0, SCREEN_WIDTH-24, SCREEN_HEIGHT-self.bgImageView.height+kRealValue(16))]; [self.view addSubview:resultView]; resultView.delegate = self; _resultView = resultView; [resultView mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(resultView.size); make.bottom.inset(0); make.centerX.mas_offset(0); }]; } - (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index { self.currentStep = [self.list[index] integerValue]; self.selectedIndex = index; } - (id)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index { MerchantBaseEnrollContentView *contentView; MerchantEnrollStep step = [self.list[index] integerValue]; CGFloat height = SCREEN_HEIGHT-self.bgImageView.height+kRealValue(16); CGFloat width = SCREEN_WIDTH; CGRect frame = CGRectMake(0, 0, width, height); switch (step) { case MerchantEnrollStepStoreInfo: contentView = [[MerchantStoreInfoView alloc] initWithFrame:frame]; break; case MerchantEnrollStepBusinessLicense: contentView = [[MerchantBusinessLicenseView alloc] initWithFrame:frame]; break; case MerchantEnrollStepLegalInfo: contentView = [[MerchantLegalInfoView alloc] initWithFrame:frame]; break; case MerchantEnrollStepBank: contentView = [[MerchantBankInfoView alloc] initWithFrame:frame]; break; case MerchantEnrollStepSetAdmin: contentView = [[MerchantAdminSetupView alloc] initWithFrame:frame]; break; case MerchantEnrollStepPay: contentView = [[MerchantPaymentView alloc] initWithFrame:frame]; break; default: break; } contentView.delegate = self; contentView.currentStep = step; // 为视图填充保存的数据 [self fillDataForContentView:contentView withStep:step]; return contentView; } - (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView { return self.list.count; } #pragma mark - MerchantEnrollContentViewDelegate - (void)onMerchantEnrollGotoNextButtonClick { // 保存当前步骤的数据 [self saveCurrentStepData]; self.currentStep++; // 保存步骤进度 [[MerchantEnrollDataManager sharedManager] saveCurrentStep:self.currentStep]; if (self.currentStep > MerchantEnrollStepCheckList && self.currentStep < MerchantEnrollStepWatingForReview) { self.selectedIndex = self.currentStep-2; } [self showCurrentStep]; } - (void)onMerchantEnrollResultNextButtonClick:(MerchantEnrollResultType)type { switch (type) { case MerchantEnrollResultPending: [self.navigationController popViewControllerAnimated:YES]; break; case MerchantEnrollResultFailed: self.currentStep = MerchantEnrollStepStoreInfo; // 保存当前步骤 [[MerchantEnrollDataManager sharedManager] saveCurrentStep:self.currentStep]; [self showCurrentStep]; break; case MerchantEnrollResultSuccess: // 入驻成功,清除所有保存的数据 [self clearAllSavedData]; [self.navigationController popViewControllerAnimated:YES]; break; } } #pragma mark - 数据清理 - (void)clearAllSavedData { MerchantEnrollDataManager *dataManager = [MerchantEnrollDataManager sharedManager]; [dataManager clearStepRecord]; [dataManager clearAllData]; } - (void)resetEnrollProcess { // 清除所有保存的数据 [self clearAllSavedData]; // 重置到第一步 self.currentStep = MerchantEnrollStepStoreInfo; self.selectedIndex = 0; // 刷新界面显示 [self showCurrentStep]; } - (NavigationBarView *)navBar { if (!_navBar) { _navBar = [[NavigationBarView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, STATUS_BAR_HEIGHT+44)]; _navBar.backgroundColor = UIColor.clearColor; _navBar.contentView.backgroundColor = UIColor.clearColor; WeakSelf [_navBar setOnBackButtonkAction:^{ [weakSelf.navigationController popViewControllerAnimated:YES]; }]; [_navBar setOnRightButtonkAction:^{ }]; } return _navBar; } - (UIImageView *)bgImageView { if (!_bgImageView) { _bgImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, kRealValue(200))]; _bgImageView.contentMode = UIViewContentModeScaleAspectFill; _bgImageView.image = [UIImage imageNamed:@"store_header_bg"]; } return _bgImageView; } - (UIStackView *)stepsStackView { if (!_stepsStackView) { UIStackView *stackView = [[UIStackView alloc] init]; stackView.axis = UILayoutConstraintAxisHorizontal; stackView.distribution = UIStackViewDistributionFill; stackView.alignment = UIStackViewAlignmentCenter; stackView.spacing = 0; _stepsStackView = stackView; } return _stepsStackView; } - (UIView *)step1View { if (!_step1View) { _step1View = [[UIView alloc] init]; } return _step1View; } - (UIView *)step2View { if (!_step2View) { _step2View = [[UIView alloc] init]; } return _step2View; } - (UIView *)step3View { if (!_step3View) { _step3View = [[UIView alloc] init]; } return _step3View; } - (UIImageView *)line1ImageView { if (!_line1ImageView) { _line1ImageView = [[UIImageView alloc] init]; _line1ImageView.image = [UIImage imageNamed:@"store_line_blue"]; _line1ImageView.contentMode = UIViewContentModeScaleAspectFit; } return _line1ImageView; } - (UIImageView *)line2ImageView { if (!_line2ImageView) { _line2ImageView = [[UIImageView alloc] init]; _line2ImageView.image = [UIImage imageNamed:@"store_line_gray(1)"]; _line2ImageView.contentMode = UIViewContentModeScaleAspectFit; } return _line2ImageView; } - (JXCategoryTitleView *)categoryView { if (!_categoryView) { NSMutableArray *array = [NSMutableArray array]; for (NSNumber *num in self.list) { [array addObject:[NSString stringWithFormat:@"%ld", [num integerValue]]]; } _categoryView = [[JXCategoryTitleView alloc] initWithFrame:CGRectZero]; _categoryView.delegate = self; _categoryView.titles = array; _categoryView.listContainer = self.containerView; _categoryView.hidden = YES; _categoryView.defaultSelectedIndex = self.selectedIndex; } return _categoryView; } - (JXCategoryListContainerView *)containerView { if (!_containerView) { _containerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_CollectionView delegate:self]; } return _containerView; } - (NSArray *)list { if (!_list) { _list = @[ @(MerchantEnrollStepStoreInfo), @(MerchantEnrollStepBusinessLicense), @(MerchantEnrollStepLegalInfo), @(MerchantEnrollStepBank), @(MerchantEnrollStepSetAdmin), @(MerchantEnrollStepPay) ]; } return _list; } - (NSMutableArray *)buttons { if (!_buttons) { _buttons = [NSMutableArray array]; } return _buttons; } @end