Эх сурвалжийг харах

店铺信息、营业执照

zwp 6 сар өмнө
parent
commit
b6879f29d4

+ 6 - 0
BuguLive.xcodeproj/project.pbxproj

@@ -595,6 +595,7 @@
 		347EA84D2E55D6240068B4F6 /* NetHttpsManager+Store.m in Sources */ = {isa = PBXBuildFile; fileRef = 347EA84C2E55D6240068B4F6 /* NetHttpsManager+Store.m */; };
 		347EA8522E56B7B30068B4F6 /* IndustryCategoryModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 347EA8512E56B7B30068B4F6 /* IndustryCategoryModel.m */; };
 		347EA8552E56BD970068B4F6 /* CategoryPickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 347EA8542E56BD970068B4F6 /* CategoryPickerView.m */; };
+		3495F3A22E5D9D9100F0DE05 /* MerchantEnrollDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3495F3A12E5D9D9100F0DE05 /* MerchantEnrollDataManager.m */; };
 		380034E328F6B365007C0FFC /* BGReadPackTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 380034CB28F6B365007C0FFC /* BGReadPackTableViewCell.xib */; };
 		380034E428F6B365007C0FFC /* BGRedPackResultList.m in Sources */ = {isa = PBXBuildFile; fileRef = 380034CC28F6B365007C0FFC /* BGRedPackResultList.m */; };
 		380034E528F6B365007C0FFC /* BGReadPackResultTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 380034CD28F6B365007C0FFC /* BGReadPackResultTableViewCell.xib */; };
@@ -3524,6 +3525,8 @@
 		347EA8512E56B7B30068B4F6 /* IndustryCategoryModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IndustryCategoryModel.m; sourceTree = "<group>"; };
 		347EA8532E56BD970068B4F6 /* CategoryPickerView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CategoryPickerView.h; sourceTree = "<group>"; };
 		347EA8542E56BD970068B4F6 /* CategoryPickerView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CategoryPickerView.m; sourceTree = "<group>"; };
+		3495F3A02E5D9D9100F0DE05 /* MerchantEnrollDataManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MerchantEnrollDataManager.h; sourceTree = "<group>"; };
+		3495F3A12E5D9D9100F0DE05 /* MerchantEnrollDataManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MerchantEnrollDataManager.m; sourceTree = "<group>"; };
 		380034CB28F6B365007C0FFC /* BGReadPackTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BGReadPackTableViewCell.xib; sourceTree = "<group>"; };
 		380034CC28F6B365007C0FFC /* BGRedPackResultList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BGRedPackResultList.m; sourceTree = "<group>"; };
 		380034CD28F6B365007C0FFC /* BGReadPackResultTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BGReadPackResultTableViewCell.xib; sourceTree = "<group>"; };
@@ -9406,6 +9409,8 @@
 		347EA84A2E55D5F10068B4F6 /* Model */ = {
 			isa = PBXGroup;
 			children = (
+				3495F3A02E5D9D9100F0DE05 /* MerchantEnrollDataManager.h */,
+				3495F3A12E5D9D9100F0DE05 /* MerchantEnrollDataManager.m */,
 				347EA8502E56B7B30068B4F6 /* IndustryCategoryModel.h */,
 				347EA8512E56B7B30068B4F6 /* IndustryCategoryModel.m */,
 				347EA84B2E55D6240068B4F6 /* NetHttpsManager+Store.h */,
@@ -16431,6 +16436,7 @@
 				047E20A21EC1538E001B874D /* PrivateChatViewController.m in Sources */,
 				C1CA075A261EE9810021B2F0 /* BogoRechargePayTypeCell.m in Sources */,
 				047E21CC1EC153BA001B874D /* areaTwoModel.m in Sources */,
+				3495F3A22E5D9D9100F0DE05 /* MerchantEnrollDataManager.m in Sources */,
 				0495F8101E73A7CD00D10407 /* main.m in Sources */,
 				C13AA7C8246A4BAA003AB2A2 /* UITableView+FDIndexPathHeightCache.m in Sources */,
 				CB6F7E2C220425F000A98FC3 /* WardPrivilegeButton.m in Sources */,

+ 5 - 0
BuguLive/Class/Sections/Store/MerchantEnrollViewController.h

@@ -16,6 +16,11 @@ NS_ASSUME_NONNULL_BEGIN
  */
 @interface MerchantEnrollViewController : UIViewController
 
+/**
+ * 清除所有保存的入驻数据,重新开始流程
+ */
+- (void)resetEnrollProcess;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 165 - 3
BuguLive/Class/Sections/Store/MerchantEnrollViewController.m

@@ -19,6 +19,7 @@
 #import "NavigationBarView.h"
 #import "MerchantBaseEnrollContentView.h"
 #import "UIButton+Layout.h"
+#import "MerchantEnrollDataManager.h"
 @interface MerchantEnrollViewController ()<JXCategoryViewDelegate, JXCategoryListContainerViewDelegate, MerchantEnrollContentViewDelegate>
 
 @property (nonatomic, assign) MerchantEnrollStep currentStep;
@@ -42,16 +43,137 @@
 @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];
@@ -226,7 +348,7 @@
         if (self.currentStep > MerchantEnrollStepCheckList && self.currentStep < MerchantEnrollStepWatingForReview) {
             self.stepsStackView.hidden = NO;
             self.containerView.hidden = NO;
-            [self.categoryView selectItemAtIndex:self.currentStep-2];
+            [self.categoryView selectItemAtIndex:self.selectedIndex];
         } else {
             self.stepsStackView.hidden = NO;
             self.containerView.hidden = YES;
@@ -279,12 +401,13 @@
 
 
 - (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index {
-    
+    self.currentStep = [self.list[index] integerValue];
+    self.selectedIndex = index;
 }
 
 - (id<JXCategoryListContentViewDelegate>)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index {
     MerchantBaseEnrollContentView *contentView;
-    MerchantEnrollStep step = index + 2;
+    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);
@@ -313,6 +436,10 @@
     }
     contentView.delegate = self;
     contentView.currentStep = step;
+    
+    // 为视图填充保存的数据
+    [self fillDataForContentView:contentView withStep:step];
+    
     return contentView;
 }
 
@@ -324,7 +451,17 @@
 #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];
 }
 
@@ -335,14 +472,38 @@
             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) {
@@ -435,6 +596,7 @@
         _categoryView.titles = array;
         _categoryView.listContainer = self.containerView;
         _categoryView.hidden = YES;
+        _categoryView.defaultSelectedIndex = self.selectedIndex;
     }
     return _categoryView;
 }

+ 96 - 0
BuguLive/Class/Sections/Store/Model/MerchantEnrollDataManager.h

@@ -0,0 +1,96 @@
+//
+//  MerchantEnrollDataManager.h
+//  BuguLive
+//
+//  Created by qitewei on 2025/8/20.
+//  Copyright © 2025 xfg. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "MerchantBaseEnrollContentView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * 商家入驻数据管理器
+ * 负责保存和恢复入驻流程中的数据和步骤状态
+ */
+@interface MerchantEnrollDataManager : NSObject
+
++ (instancetype)sharedManager;
+
+#pragma mark - 步骤管理
+/**
+ * 保存当前完成的步骤
+ */
+- (void)saveCurrentStep:(MerchantEnrollStep)step;
+
+/**
+ * 获取当前应该显示的步骤
+ */
+- (MerchantEnrollStep)getCurrentStep;
+
+/**
+ * 清除步骤记录(完成入驻或重新开始时调用)
+ */
+- (void)clearStepRecord;
+
+#pragma mark - 数据持久化
+/**
+ * 保存店铺信息数据
+ */
+- (void)saveStoreInfoData:(NSDictionary *)data;
+
+/**
+ * 获取店铺信息数据
+ */
+- (NSDictionary *)getStoreInfoData;
+
+/**
+ * 保存营业执照数据
+ */
+- (void)saveBusinessLicenseData:(NSDictionary *)data;
+
+/**
+ * 获取营业执照数据
+ */
+- (NSDictionary *)getBusinessLicenseData;
+
+/**
+ * 保存法人信息数据
+ */
+- (void)saveLegalInfoData:(NSDictionary *)data;
+
+/**
+ * 获取法人信息数据
+ */
+- (NSDictionary *)getLegalInfoData;
+
+/**
+ * 保存银行账户数据
+ */
+- (void)saveBankInfoData:(NSDictionary *)data;
+
+/**
+ * 获取银行账户数据
+ */
+- (NSDictionary *)getBankInfoData;
+
+/**
+ * 保存管理员设置数据
+ */
+- (void)saveAdminSetupData:(NSDictionary *)data;
+
+/**
+ * 获取管理员设置数据
+ */
+- (NSDictionary *)getAdminSetupData;
+
+/**
+ * 清除所有保存的数据(完成入驻或重新开始时调用)
+ */
+- (void)clearAllData;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 124 - 0
BuguLive/Class/Sections/Store/Model/MerchantEnrollDataManager.m

@@ -0,0 +1,124 @@
+//
+//  MerchantEnrollDataManager.m
+//  BuguLive
+//
+//  Created by qitewei on 2025/8/20.
+//  Copyright © 2025 xfg. All rights reserved.
+//
+
+#import "MerchantEnrollDataManager.h"
+
+// UserDefaults Keys
+static NSString * const kMerchantEnrollCurrentStepKey = @"MerchantEnrollCurrentStep";
+static NSString * const kMerchantEnrollStoreInfoKey = @"MerchantEnrollStoreInfo";
+static NSString * const kMerchantEnrollBusinessLicenseKey = @"MerchantEnrollBusinessLicense";
+static NSString * const kMerchantEnrollLegalInfoKey = @"MerchantEnrollLegalInfo";
+static NSString * const kMerchantEnrollBankInfoKey = @"MerchantEnrollBankInfo";
+static NSString * const kMerchantEnrollAdminSetupKey = @"MerchantEnrollAdminSetup";
+
+@implementation MerchantEnrollDataManager
+
++ (instancetype)sharedManager {
+    static MerchantEnrollDataManager *instance = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        instance = [[MerchantEnrollDataManager alloc] init];
+    });
+    return instance;
+}
+
+#pragma mark - 步骤管理
+
+- (void)saveCurrentStep:(MerchantEnrollStep)step {
+    [[NSUserDefaults standardUserDefaults] setInteger:step forKey:kMerchantEnrollCurrentStepKey];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+}
+
+- (MerchantEnrollStep)getCurrentStep {
+    NSInteger step = [[NSUserDefaults standardUserDefaults] integerForKey:kMerchantEnrollCurrentStepKey];
+    // 如果没有保存的步骤,默认从店铺信息开始
+    if (step == 0) {
+        return MerchantEnrollStepStoreInfo;
+    }
+    return (MerchantEnrollStep)step;
+}
+
+- (void)clearStepRecord {
+    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kMerchantEnrollCurrentStepKey];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+}
+
+#pragma mark - 数据持久化
+
+- (void)saveStoreInfoData:(NSDictionary *)data {
+    if (data) {
+        [[NSUserDefaults standardUserDefaults] setObject:data forKey:kMerchantEnrollStoreInfoKey];
+        [[NSUserDefaults standardUserDefaults] synchronize];
+    }
+}
+
+- (NSDictionary *)getStoreInfoData {
+    return [[NSUserDefaults standardUserDefaults] objectForKey:kMerchantEnrollStoreInfoKey];
+}
+
+- (void)saveBusinessLicenseData:(NSDictionary *)data {
+    if (data) {
+        [[NSUserDefaults standardUserDefaults] setObject:data forKey:kMerchantEnrollBusinessLicenseKey];
+        [[NSUserDefaults standardUserDefaults] synchronize];
+    }
+}
+
+- (NSDictionary *)getBusinessLicenseData {
+    return [[NSUserDefaults standardUserDefaults] objectForKey:kMerchantEnrollBusinessLicenseKey];
+}
+
+- (void)saveLegalInfoData:(NSDictionary *)data {
+    if (data) {
+        [[NSUserDefaults standardUserDefaults] setObject:data forKey:kMerchantEnrollLegalInfoKey];
+        [[NSUserDefaults standardUserDefaults] synchronize];
+    }
+}
+
+- (NSDictionary *)getLegalInfoData {
+    return [[NSUserDefaults standardUserDefaults] objectForKey:kMerchantEnrollLegalInfoKey];
+}
+
+- (void)saveBankInfoData:(NSDictionary *)data {
+    if (data) {
+        [[NSUserDefaults standardUserDefaults] setObject:data forKey:kMerchantEnrollBankInfoKey];
+        [[NSUserDefaults standardUserDefaults] synchronize];
+    }
+}
+
+- (NSDictionary *)getBankInfoData {
+    return [[NSUserDefaults standardUserDefaults] objectForKey:kMerchantEnrollBankInfoKey];
+}
+
+- (void)saveAdminSetupData:(NSDictionary *)data {
+    if (data) {
+        [[NSUserDefaults standardUserDefaults] setObject:data forKey:kMerchantEnrollAdminSetupKey];
+        [[NSUserDefaults standardUserDefaults] synchronize];
+    }
+}
+
+- (NSDictionary *)getAdminSetupData {
+    return [[NSUserDefaults standardUserDefaults] objectForKey:kMerchantEnrollAdminSetupKey];
+}
+
+- (void)clearAllData {
+    NSArray *keys = @[
+        kMerchantEnrollStoreInfoKey,
+        kMerchantEnrollBusinessLicenseKey,
+        kMerchantEnrollLegalInfoKey,
+        kMerchantEnrollBankInfoKey,
+        kMerchantEnrollAdminSetupKey
+    ];
+    
+    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
+    for (NSString *key in keys) {
+        [userDefaults removeObjectForKey:key];
+    }
+    [userDefaults synchronize];
+}
+
+@end

+ 14 - 1
BuguLive/Class/Sections/Store/View/MerchantBaseEnrollContentView.h

@@ -34,6 +34,8 @@ typedef enum : NSUInteger {
 } MerchantEnrollResultType;
 
 
+typedef void(^DidPickImageAction)(UIImage *image);
+
 @protocol MerchantEnrollContentViewDelegate <NSObject>
 
 - (void)onMerchantEnrollGotoNextButtonClick;
@@ -48,8 +50,17 @@ typedef enum : NSUInteger {
 
 @end
 
+@protocol MerchantEnrollDataFillDelegate <NSObject>
+
+/**
+ * 用保存的数据填充表单
+ */
+- (void)fillWithData:(NSDictionary *)data;
+
+@end
+
 
-@interface MerchantBaseEnrollContentView : UIView<JXCategoryListContentViewDelegate, MerchantEnrollParametersDataSource>
+@interface MerchantBaseEnrollContentView : UIView<JXCategoryListContentViewDelegate, MerchantEnrollParametersDataSource, UINavigationControllerDelegate,UIImagePickerControllerDelegate>
 @property (nonatomic, strong) UILabel *titleLabel;
 
 @property (nonatomic, strong) UIScrollView *scrollView;
@@ -64,6 +75,8 @@ typedef enum : NSUInteger {
 @property (readonly, nullable) UIViewController *viewController;
 
 - (void)goNext;
+- (void)pickImageWithCompletion:(DidPickImageAction)completion;
+- (void)uploadImage:(UIImage *)image completion:(void(^)(NSString *url))completion;
 
 @end
 

+ 54 - 0
BuguLive/Class/Sections/Store/View/MerchantBaseEnrollContentView.m

@@ -7,6 +7,12 @@
 
 #import "MerchantBaseEnrollContentView.h"
 #import "UIView+Extention.h"
+
+@interface MerchantBaseEnrollContentView ()
+
+@property (nonatomic, copy) DidPickImageAction pickImageAction;
+
+@end
 @implementation MerchantBaseEnrollContentView
 
 - (instancetype)initWithFrame:(CGRect)frame
@@ -132,6 +138,54 @@
     }
 }
 
+- (void)uploadImage:(UIImage *)image completion:(void(^)(NSString *url))completion {
+
+    [[BGHUDHelper sharedInstance] syncLoading];
+    NSMutableDictionary *parmDict = [NSMutableDictionary dictionary];
+    [parmDict setObject:@"avatar" forKey:@"ctl"];
+    [parmDict setObject:@"uploadImage" forKey:@"act"];
+    NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
+    [self.netManager POSTWithDict:parmDict andFileData:imageData AndFileName:@"logo.png" SuccessBlock:^(NSDictionary *responseJson) {
+        [[BGHUDHelper sharedInstance] syncStopLoading];
+        [[BGHUDHelper sharedInstance] tipMessage:ASLocalizedString(@"上传成功")];
+        NSString *url = responseJson[@"server_full_path"];
+        if (completion) {
+            completion(url);
+        }
+    } FailureBlock:^(NSError *error) {
+        [[BGHUDHelper sharedInstance] syncStopLoading];
+        [[BGHUDHelper sharedInstance] tipMessage:error.localizedDescription];
+    }];
+    
+}
+
+
+#pragma mark - UINavigationControllerDelegate,UIImagePickerControllerDelegate
+- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info {
+    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
+    [picker dismissViewControllerAnimated:YES completion:^{
+        if (self.pickImageAction) {
+            self.pickImageAction(image);
+        }
+    }];
+}
+
+- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
+    [picker dismissViewControllerAnimated:YES completion:nil];
+}
+
+- (void)pickImageWithCompletion:(DidPickImageAction)completion {
+    self.pickImageAction = completion;
+    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
+    {
+        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
+        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
+        picker.delegate = self;
+        picker.modalPresentationStyle = UIModalPresentationFullScreen;
+        [self.viewController presentViewController:picker animated:YES completion:nil];
+    }
+}
+
 
 - (UILabel *)titleLabel {
     if (!_titleLabel) {

+ 4 - 1
BuguLive/Class/Sections/Store/View/MerchantBusinessLicenseView.h

@@ -11,7 +11,7 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-@interface MerchantBusinessLicenseView : MerchantBaseEnrollContentView
+@interface MerchantBusinessLicenseView : MerchantBaseEnrollContentView<MerchantEnrollDataFillDelegate>
 
 // 公司名称
 @property (nonatomic, strong) UILabel *companyNameLabel;
@@ -24,9 +24,12 @@ NS_ASSUME_NONNULL_BEGIN
 // 营业执照扫描件
 @property (nonatomic, strong) UILabel *licenseImageLabel;
 @property (nonatomic, strong) UIView *licenseUploadView;
+@property (nonatomic, strong) UIImageView *uploadImageView;
 @property (nonatomic, strong) UIImageView *uploadIconImageView;
 @property (nonatomic, strong) UILabel *uploadTipLabel;
 
+@property (nonatomic, copy, nullable) NSString *licenseURL;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 48 - 2
BuguLive/Class/Sections/Store/View/MerchantBusinessLicenseView.m

@@ -11,6 +11,14 @@
 
 @implementation MerchantBusinessLicenseView
 
+- (NSDictionary *)getMerchantEnrollParameters {
+    return @{
+        @"company_name":self.companyNameTextField.text ?: @"",
+        @"licence_credit_code":self.creditCodeTextField.text ?: @"",
+        @"licence_image":self.licenseURL ?: @"",
+    };
+}
+
 - (instancetype)initWithFrame:(CGRect)frame
 {
     self = [super initWithFrame:frame];
@@ -49,6 +57,7 @@
 - (void)setupLicenseImageSection {
     [self.contentView addSubview:self.licenseImageLabel];
     [self.contentView addSubview:self.licenseUploadView];
+    [self.licenseUploadView addSubview:self.uploadImageView];
     [self.licenseUploadView addSubview:self.uploadIconImageView];
     [self.licenseUploadView addSubview:self.uploadTipLabel];
 }
@@ -95,6 +104,10 @@
         make.bottom.equalTo(self.contentView).offset(-kRealValue(20));
     }];
     
+    [self.uploadImageView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.mas_offset(0);
+    }];
+    
     [self.uploadIconImageView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.centerX.equalTo(self.licenseUploadView);
         make.centerY.equalTo(self.licenseUploadView).offset(-kRealValue(20));
@@ -108,11 +121,35 @@
     
 }
 
+#pragma mark - MerchantEnrollDataFillDelegate
+
+- (void)fillWithData:(NSDictionary *)data {
+    if (!data || ![data isKindOfClass:[NSDictionary class]]) {
+        return;
+    }
+    
+    self.companyNameTextField.text = data[@"company_name"];
+    self.creditCodeTextField.text = data[@"licence_credit_code"];
+    NSString *url = data[@"licence_image"];
+    if ([url hasPrefix:@"http"]) {
+        self.licenseURL = url;
+        [self.uploadImageView setImageWithURL:[NSURL URLWithString:url] placeholder:nil];
+    }
+}
+
+
 #pragma mark - Actions
 
 - (void)licenseUploadTapped:(UITapGestureRecognizer *)gesture {
-    // TODO: 实现营业执照图片选择功能
-    NSLog(@"License upload tapped");
+    WeakSelf
+    [self pickImageWithCompletion:^(UIImage * _Nonnull image) {
+        weakSelf.uploadImageView.image = image;
+        weakSelf.uploadIconImageView.hidden = YES;
+        weakSelf.uploadTipLabel.hidden = YES;
+        [weakSelf uploadImage:image completion:^(NSString * _Nonnull url) {
+            weakSelf.licenseURL = url;
+        }];
+    }];
 }
 
 #pragma mark - Lazy Loading
@@ -256,4 +293,13 @@
     return _uploadTipLabel;
 }
 
+- (UIImageView *)uploadImageView {
+    if (!_uploadImageView) {
+        _uploadImageView = [[UIImageView alloc] init];
+        _uploadImageView.contentMode = UIViewContentModeScaleToFill;
+        _uploadImageView.clipsToBounds = YES;
+    }
+    return _uploadImageView;
+}
+
 @end

+ 4 - 1
BuguLive/Class/Sections/Store/View/MerchantStoreInfoView.h

@@ -13,7 +13,7 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-@interface MerchantStoreInfoView : MerchantBaseEnrollContentView <CategoryPickerViewDelegate>
+@interface MerchantStoreInfoView : MerchantBaseEnrollContentView <CategoryPickerViewDelegate, MerchantEnrollDataFillDelegate>
 
 
 // 店铺名称
@@ -48,6 +48,9 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, strong) IndustryCategoryModel *selectedCategory;
 @property (nonatomic, strong) CategoryPickerView *categoryPickerView;
 
+// 数据填充方法
+- (void)fillWithData:(NSDictionary *)data;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 79 - 35
BuguLive/Class/Sections/Store/View/MerchantStoreInfoView.m

@@ -10,8 +10,9 @@
 #import "UIView+Extention.h"
 #import "IndustryCategoryModel.h"
 #import "CategoryPickerView.h"
+#import "MerchantEnrollDataManager.h"
 
-@interface MerchantStoreInfoView ()<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
+@interface MerchantStoreInfoView ()
 @property (nonatomic, copy, nullable) NSString *logoURL;
 @end
 
@@ -228,6 +229,9 @@
                     self.selectedCategory = self.categories.firstObject;
                     [self updateCategoryDisplay];
                 }
+                
+                // 加载行业分类后,自动填充之前保存的数据
+                [self loadSavedData];
             }
         }
     } FailureBlock:^(NSError *error) {
@@ -257,19 +261,9 @@
 }
 
 - (void)uploadImage:(UIImage *)image {
-
-    [[BGHUDHelper sharedInstance] syncLoading];
-    NSMutableDictionary *parmDict = [NSMutableDictionary dictionary];
-    [parmDict setObject:@"avatar" forKey:@"ctl"];
-    [parmDict setObject:@"uploadImage" forKey:@"act"];
-    NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
-    [self.netManager POSTWithDict:parmDict andFileData:imageData AndFileName:@"logo.png" SuccessBlock:^(NSDictionary *responseJson) {
-        [[BGHUDHelper sharedInstance] syncStopLoading];
-        [[BGHUDHelper sharedInstance] tipMessage:ASLocalizedString(@"上传成功")];
-        self.logoURL = responseJson[@"server_full_path"];
-    } FailureBlock:^(NSError *error) {
-        [[BGHUDHelper sharedInstance] syncStopLoading];
-        [[BGHUDHelper sharedInstance] tipMessage:error.localizedDescription];
+    WeakSelf
+    [self uploadImage:image completion:^(NSString * _Nonnull url) {
+        weakSelf.logoURL = url;
     }];
     
 }
@@ -299,14 +293,12 @@
 }
 
 - (void)logoUploadTapped:(UITapGestureRecognizer *)gesture {
-    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
-    {
-        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
-        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
-        picker.delegate = self;
-        picker.modalPresentationStyle = UIModalPresentationFullScreen;
-        [self.viewController presentViewController:picker animated:YES completion:nil];
-    }
+    WeakSelf
+    [self pickImageWithCompletion:^(UIImage * _Nonnull image) {
+        weakSelf.logoImageView.image = image;
+        weakSelf.logoCloseButton.hidden = NO;
+        [weakSelf uploadImage:image];
+    }];
     
 }
 
@@ -428,19 +420,6 @@
     }
 }
 
-#pragma mark - UINavigationControllerDelegate,UIImagePickerControllerDelegate
-- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info {
-    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
-    self.logoImageView.image = image;
-    self.logoCloseButton.hidden = NO;
-    [picker dismissViewControllerAnimated:YES completion:^{
-        [self uploadImage:image];
-    }];
-}
-
-- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
-    [picker dismissViewControllerAnimated:YES completion:nil];
-}
 
 #pragma mark - CategoryPickerViewDelegate
 
@@ -449,6 +428,71 @@
     [self updateCategoryDisplay];
 }
 
+#pragma mark - 数据自动填充
+
+- (void)loadSavedData {
+    NSDictionary *savedData = [[MerchantEnrollDataManager sharedManager] getStoreInfoData];
+    if (savedData) {
+        [self fillWithData:savedData];
+    }
+}
+
+- (void)fillWithData:(NSDictionary *)data {
+    if (!data || ![data isKindOfClass:[NSDictionary class]]) {
+        return;
+    }
+    
+    // 填充店铺名称
+    NSString *shopName = data[@"shop_name"];
+    if (shopName && [shopName isKindOfClass:[NSString class]]) {
+        self.storeNameTextField.text = shopName;
+        [self storeNameTextFieldChanged:self.storeNameTextField];
+    }
+    
+    // 填充店铺Logo
+    NSString *shopLogo = data[@"shop_logo"];
+    if (shopLogo && [shopLogo isKindOfClass:[NSString class]] && [shopLogo hasPrefix:@"http"]) {
+        self.logoURL = shopLogo;
+        [self.logoImageView setImageURL:[NSURL URLWithString:shopLogo]];
+        self.logoCloseButton.hidden = NO;
+    }
+    
+    // 填充店铺简介
+    NSString *shopDesc = data[@"shop_desc"];
+    if (shopDesc && [shopDesc isKindOfClass:[NSString class]] && shopDesc.length > 0) {
+        self.descriptionTextView.text = shopDesc;
+        self.descriptionTextView.textColor = [UIColor blackColor];
+        
+        // 更新字数统计
+        NSInteger currentLength = shopDesc.length;
+        self.descriptionCountLabel.text = [NSString stringWithFormat:@"%ld/200", (long)currentLength];
+        if (currentLength >= 200) {
+            self.descriptionCountLabel.textColor = [UIColor colorWithHexString:@"#FF5722"];
+        } else {
+            self.descriptionCountLabel.textColor = [UIColor colorWithHexString:@"#999999"];
+        }
+    }
+    
+    // 填充经营类别
+    NSNumber *cateId = data[@"cate_id"];
+    if (cateId && [cateId isKindOfClass:[NSNumber class]] && self.categories.count > 0) {
+        NSInteger categoryId = [cateId integerValue];
+        for (IndustryCategoryModel *category in self.categories) {
+            if (category.categoryId == categoryId) {
+                self.selectedCategory = category;
+                [self updateCategoryDisplay];
+                break;
+            }
+        }
+    }
+    
+    // 填充店铺地址
+    NSString *shopAddress = data[@"shop_address"];
+    if (shopAddress && [shopAddress isKindOfClass:[NSString class]]) {
+        self.addressTextField.text = shopAddress;
+    }
+}
+
 #pragma mark - Lazy Loading
 
 - (UILabel *)storeNameLabel {