Browse Source

【会员系统】商品模块接口补充

wanjun 4 months ago
parent
commit
459b4ea3f8

+ 327 - 36
PDF Office/PDF Master/MemberCenter/Model/KMMemberCenterManager.swift

@@ -51,6 +51,7 @@ enum KMMemberCenterErrorCodeType: Int, CaseIterable {
 }
 
 typealias KMMemberCenterComplete = (_ success: Bool, _ result: KMMemberCenterResult?) -> Void
+typealias KMMemberProductComplete = (_ success: Bool, _ result: KMMemberProductResult?) -> Void
 
 class KMMemberCenterManager: NSObject {
     static let manager = KMMemberCenterManager()
@@ -715,46 +716,336 @@ class KMMemberCenterManager: NSObject {
     
     // MARK: 商品模块
     
-//    /**
-//     @abstract              获取上架中的产品
-//     @param complete 回调
-//     */
-//    func getListingProducts(_ complete: @escaping KMMemberCenterComplete) {
-//        
-//        let urlString = configuration.activityBaseURL() + "/pdf-office-website/web/getListingProducts"
-//        let params: [String: Any] = ["isEducation": actionType,
-//                                     "platformId": 0]
-//        KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: nil) { requestSerializer in
-//            
-//        } completion: { [weak self] (task, responseObject, error) in
-//            var dic: NSDictionary = [:]
-//            if error == nil, let responseObject = responseObject as? NSDictionary {
-//                dic = responseObject
-//            } else {
-//                var info = responseObject
-//                if let error = error {
-//                    if let data = error.userInfo["com.alamofire.serialization.response.error.data"] as? Data {
-//                        info = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? NSDictionary
-//                    }
-//                }
-//                dic = (info as? NSDictionary) ?? [:]
-//            }
-//            let code: Int = dic["code"] as? Int ?? 0
-//            let message: String = dic["msg"] as? String ?? ""
-//            let result_Bool: Bool = dic["result"] as? Bool ?? false
-//
-//            let result = KMMemberCenterResult(code: code, msg: message, result: result_Bool)
-//            if code == 200 {
-//                complete(true, result)
-//            } else {
-//                complete(false, result)
-//            }
-//        }
-//    }
+    /**
+     @abstract              获取上架中的产品
+     @param isEducation 是否教育优惠
+     @param complete 回调
+     */
+    func getListingProducts(isEducation: Int, _ complete: @escaping KMMemberProductComplete) {
+        
+        let urlString = configuration.activityBaseURL() + "/pdf-office-website/web/getListingProducts"
+        var platformId = "2"
+#if VERSION_FREE
+    
+#if VERSION_DMG
+    // DMG
+        platformId = "2"
+#else
+    // AppStore 免费版本
+#endif
+        platformId = "3"
+#else
+    // AppStore 付费版
+        platformId = "5"
+#endif
+        let params: [String: Any] = ["isEducation": isEducation,
+                                     "platformId": platformId]
+        KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: nil) { requestSerializer in
+            
+        } completion: { [weak self] (task, responseObject, error) in
+            var dic: NSDictionary = [:]
+            if error == nil, let responseObject = responseObject as? NSDictionary {
+                dic = responseObject
+            } else {
+                var info = responseObject
+                if let error = error {
+                    if let data = error.userInfo["com.alamofire.serialization.response.error.data"] as? Data {
+                        info = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? NSDictionary
+                    }
+                }
+                dic = (info as? NSDictionary) ?? [:]
+            }
+            let code: Int = dic["code"] as? Int ?? 0
+            let result_Array: [NSDictionary] = dic["result"] as? [NSDictionary] ?? [[:]]
+            let message: String = dic["msg"] as? String ?? ""
+            
+            var results: [KMListingProducts] = []
+            for dict1 in result_Array {
+                var id = ""
+                var productName = ""
+                var price = ""
+                var maxDeviceNum = 0
+                var levels = ""
+                var platforms = ""
+                var productLineId = 0
+                var paymentModel = 0
+                var cycle = 0
+                var code = ""
+                var cnyPrice = ""
+                if let token = dict1["id"] { id = token as! String }
+                if let token = dict1["productName"] { productName = token as! String }
+                if let token = dict1["price"] { price = token as! String }
+                if let token = dict1["maxDeviceNum"] { maxDeviceNum = token as! Int }
+                if let token = dict1["levels"] { levels = token as! String }
+                if let token = dict1["platforms"] { platforms = token as! String }
+                if let token = dict1["productLineId"] { productLineId = token as! Int }
+                if let token = dict1["paymentModel"] { paymentModel = token as! Int }
+                if let token = dict1["cycle"] { cycle = token as! Int }
+                if let token = dict1["code"] { code = token as! String }
+                if let token = dict1["cnyPrice"] { cnyPrice = token as! String }
+                let products = KMListingProducts(id: id, productName: productName, price: price, maxDeviceNum: maxDeviceNum, levels: levels, platforms: platforms, productLineId: productLineId, paymentModel: paymentModel, cycle: cycle, code: code, cnyPrice: cnyPrice)
+                results.append(products)
+            }
+
+            let result = KMMemberProductResult(code: code, msg: message, listingProducts: results)
+            if code == 200 {
+                complete(true, result)
+            } else {
+                complete(false, result)
+            }
+        }
+    }
+    
+    /**
+     @abstract              获取已登录用户购买商品价格
+     @param productId 购买的产品id
+     @param isEducation 是否教育优惠
+     @param complete 回调
+     */
+    func getProductPriceForBuy(productId: String, isEducation: Int, userId: String, _ complete: @escaping KMMemberProductComplete) {
+        
+        let urlString = configuration.activityBaseURL() + "/pdf-office-website/web/getProductPriceForBuy"
+        let params: [String: Any] = ["productId": productId,
+                                     "isEducation": isEducation,
+                                     "userId": userId]
+        KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: nil) { requestSerializer in
+            
+        } completion: { [weak self] (task, responseObject, error) in
+            var dic: NSDictionary = [:]
+            if error == nil, let responseObject = responseObject as? NSDictionary {
+                dic = responseObject
+            } else {
+                var info = responseObject
+                if let error = error {
+                    if let data = error.userInfo["com.alamofire.serialization.response.error.data"] as? Data {
+                        info = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? NSDictionary
+                    }
+                }
+                dic = (info as? NSDictionary) ?? [:]
+            }
+            let code: Int = dic["code"] as? Int ?? 0
+            let result_Array: [NSDictionary] = dic["result"] as? [NSDictionary] ?? [[:]]
+            let message: String = dic["msg"] as? String ?? ""
+            
+            var results: [KMListingProducts] = []
+            for dict1 in result_Array {
+                var id = ""
+                var productName = ""
+                var price = ""
+                var maxDeviceNum = 0
+                var levels = ""
+                var platforms = ""
+                var productLineId = 0
+                var paymentModel = 0
+                var cycle = 0
+                var code = ""
+                var cnyPrice = ""
+                if let token = dict1["id"] { id = token as! String }
+                if let token = dict1["productName"] { productName = token as! String }
+                if let token = dict1["price"] { price = token as! String }
+                if let token = dict1["maxDeviceNum"] { maxDeviceNum = token as! Int }
+                if let token = dict1["levels"] { levels = token as! String }
+                if let token = dict1["platforms"] { platforms = token as! String }
+                if let token = dict1["productLineId"] { productLineId = token as! Int }
+                if let token = dict1["paymentModel"] { paymentModel = token as! Int }
+                if let token = dict1["cycle"] { cycle = token as! Int }
+                if let token = dict1["code"] { code = token as! String }
+                if let token = dict1["cnyPrice"] { cnyPrice = token as! String }
+                let products = KMListingProducts(id: id, productName: productName, price: price, maxDeviceNum: maxDeviceNum, levels: levels, platforms: platforms, productLineId: productLineId, paymentModel: paymentModel, cycle: cycle, code: code, cnyPrice: cnyPrice)
+                results.append(products)
+            }
+
+            let result = KMMemberProductResult(code: code, msg: message, listingProducts: results)
+            if code == 200 {
+                complete(true, result)
+            } else {
+                complete(false, result)
+            }
+        }
+    }
+    
+    /**
+     @abstract              获取批量阶段购买价格
+     @param productId 购买的产品id
+     @param isEducation 是否教育优惠
+     @param complete 回调
+     */
+    func getBatchProductPrice(productId: String, num: Int, _ complete: @escaping KMMemberProductComplete) {
+        
+        let urlString = configuration.activityBaseURL() + "/pdf-office-website/web/getBatchProductPrice"
+        let params: [String: Any] = ["productId": productId,
+                                     "num": num]
+        KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: nil) { requestSerializer in
+            
+        } completion: { [weak self] (task, responseObject, error) in
+            var dic: NSDictionary = [:]
+            if error == nil, let responseObject = responseObject as? NSDictionary {
+                dic = responseObject
+            } else {
+                var info = responseObject
+                if let error = error {
+                    if let data = error.userInfo["com.alamofire.serialization.response.error.data"] as? Data {
+                        info = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? NSDictionary
+                    }
+                }
+                dic = (info as? NSDictionary) ?? [:]
+            }
+            let code: Int = dic["code"] as? Int ?? 0
+            let result: NSDictionary = dic["result"] as? NSDictionary ?? [:]
+            let message: String = dic["msg"] as? String ?? ""
+            
+            var productId = ""
+            var totalPrice = ""
+            var price = ""
+            var batchPrice = ""
+            var cnyPrice = ""
+            var cnyBatchPrice = ""
+            var cnyTotalPrice = ""
+            if let token = result["productId"] { productId = token as! String }
+            if let token = result["totalPrice"] { totalPrice = token as! String }
+            if let token = result["price"] { price = token as! String }
+            if let token = result["batchPrice"] { batchPrice = token as! String }
+            if let token = result["cnyPrice"] { cnyPrice = token as! String }
+            if let token = result["cnyBatchPrice"] { cnyBatchPrice = token as! String }
+            if let token = result["cnyTotalPrice"] { cnyTotalPrice = token as! String }
+            let products = KMBatchProductPrice(productId: productId, totalPrice: totalPrice, price: price, batchPrice: batchPrice, cnyPrice: cnyPrice, cnyBatchPrice: cnyBatchPrice, cnyTotalPrice: cnyTotalPrice)
+
+            let result1 = KMMemberProductResult(code: code, msg: message, batchProductPrice: products)
+            if code == 200 {
+                complete(true, result1)
+            } else {
+                complete(false, result1)
+            }
+        }
+    }
+    
+    /**
+     @abstract              验证商品优惠券,返回商品优惠后价格
+     @param productId 购买的产品id
+     @param isEducation 是否教育优惠
+     @param complete 回调
+     */
+    func checkCoupon(productId: String, userId: String, code: String, _ complete: @escaping KMMemberProductComplete) {
+        let token: String = KMMemberInfo.shared.access_token
+        if token == "" {
+            return
+        }
+        let urlString = configuration.activityBaseURL() + "/pdf-office-website/web/checkCoupon"
+        let params: [String: Any] = ["productId": productId,
+                                     "userId": userId,
+                                     "code": code]
+        KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: nil) { requestSerializer in
+            requestSerializer.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
+        } completion: { [weak self] (task, responseObject, error) in
+            var dic: NSDictionary = [:]
+            if error == nil, let responseObject = responseObject as? NSDictionary {
+                dic = responseObject
+            } else {
+                var info = responseObject
+                if let error = error {
+                    if let data = error.userInfo["com.alamofire.serialization.response.error.data"] as? Data {
+                        info = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? NSDictionary
+                    }
+                }
+                dic = (info as? NSDictionary) ?? [:]
+            }
+            let code: Int = dic["code"] as? Int ?? 0
+            let result: NSDictionary = dic["result"] as? NSDictionary ?? [:]
+            let message: String = dic["msg"] as? String ?? ""
+            
+            var id = ""
+            var productName = ""
+            var price = ""
+            var maxDeviceNum = 0
+            var displayPrice = ""
+            var levels = ""
+            var platforms = ""
+            var productLineId = 0
+            var paymentModel = 0
+            var cycle = 0
+            var cnyPrice = ""
+            var displayCnyPrice = ""
+            if let token = result["id"] { id = token as! String }
+            if let token = result["productName"] { productName = token as! String }
+            if let token = result["price"] { price = token as! String }
+            if let token = result["maxDeviceNum"] { maxDeviceNum = token as! Int }
+            if let token = result["displayPrice"] { displayPrice = token as! String }
+            if let token = result["levels"] { levels = token as! String }
+            if let token = result["platforms"] { platforms = token as! String }
+            if let token = result["productLineId"] { productLineId = token as! Int }
+            if let token = result["paymentModel"] { paymentModel = token as! Int }
+            if let token = result["cycle"] { cycle = token as! Int }
+            if let token = result["cnyPrice"] { cnyPrice = token as! String }
+            if let token = result["displayCnyPrice"] { displayCnyPrice = token as! String }
+
+            let products = KMCheckCoupon(id: id, productName: productName, price: price, maxDeviceNum: maxDeviceNum, displayPrice: displayPrice, levels: levels, platforms: platforms, productLineId: productLineId, paymentModel: paymentModel, cycle: cycle, cnyPrice: cnyPrice, displayCnyPrice: displayCnyPrice)
+            let result1 = KMMemberProductResult(code: code, msg: message, checkCoupon: products)
+            if code == 200 {
+                complete(true, result1)
+            } else {
+                complete(false, result1)
+            }
+        }
+    }
+    
+    /**
+     @abstract              获取批量阶段购买价格
+     @param productId 购买的产品id
+     @param isEducation 是否教育优惠
+     @param complete 回调
+     */
+    func checkEducation(email: String, _ complete: @escaping KMMemberProductComplete) {
+        
+        let urlString = configuration.activityBaseURL() + "/pdf-office-website/web/checkEducation"
+        let params: [String: Any] = ["email": email]
+        KMRequestServer.requestServer.request(urlString: urlString, method: .get, params: nil) { requestSerializer in
+            
+        } completion: { [weak self] (task, responseObject, error) in
+            var dic: NSDictionary = [:]
+            if error == nil, let responseObject = responseObject as? NSDictionary {
+                dic = responseObject
+            } else {
+                var info = responseObject
+                if let error = error {
+                    if let data = error.userInfo["com.alamofire.serialization.response.error.data"] as? Data {
+                        info = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? NSDictionary
+                    }
+                }
+                dic = (info as? NSDictionary) ?? [:]
+            }
+            let code: Int = dic["code"] as? Int ?? 0
+            let result: NSDictionary = dic["result"] as? NSDictionary ?? [:]
+            let message: String = dic["msg"] as? String ?? ""
+            
+            var productId = ""
+            var totalPrice = ""
+            var price = ""
+            var batchPrice = ""
+            var cnyPrice = ""
+            var cnyBatchPrice = ""
+            var cnyTotalPrice = ""
+            if let token = result["productId"] { productId = token as! String }
+            if let token = result["totalPrice"] { totalPrice = token as! String }
+            if let token = result["price"] { price = token as! String }
+            if let token = result["batchPrice"] { batchPrice = token as! String }
+            if let token = result["cnyPrice"] { cnyPrice = token as! String }
+            if let token = result["cnyBatchPrice"] { cnyBatchPrice = token as! String }
+            if let token = result["cnyTotalPrice"] { cnyTotalPrice = token as! String }
+            let products = KMBatchProductPrice(productId: productId, totalPrice: totalPrice, price: price, batchPrice: batchPrice, cnyPrice: cnyPrice, cnyBatchPrice: cnyBatchPrice, cnyTotalPrice: cnyTotalPrice)
+
+            let result1 = KMMemberProductResult(code: code, msg: message, batchProductPrice: products)
+            if code == 200 {
+                complete(true, result1)
+            } else {
+                complete(false, result1)
+            }
+        }
+    }
     
     // MARK: 个人中心模块
     
     // MARK: 订单模块
+    
 
     // MARK: 评估模块
 

+ 136 - 0
PDF Office/PDF Master/MemberCenter/Model/KMMemberProductResult.swift

@@ -0,0 +1,136 @@
+//
+//  KMMemberProductResult.swift
+//  PDF Reader Pro
+//
+//  Created by wanjun on 2024/11/4.
+//
+
+import Cocoa
+
+class KMMemberProductResult: NSObject {
+    var code                : Int?
+    var msg                 : String?
+    var result              : String?
+    var result_Bool         : Bool?
+    var result_Dict         : Bool?
+    
+    var listingProducts     : [KMListingProducts]?  // 上架中的产品
+    var batchProductPrice     : KMBatchProductPrice?  // 批量阶段购买价格
+    var checkCoupon     : KMCheckCoupon?  // 商品优惠券
+
+    /**
+     @abstract 获取上架中的产品
+     @param code
+     @param msg
+     @param listingProducts 
+     */
+    init(code: Int, msg: String, listingProducts: [KMListingProducts]) {
+        self.code = code
+        self.msg = msg
+        self.listingProducts = listingProducts
+    }
+    
+    /**
+     @abstract 批量阶段购买价格
+     @param code
+     @param msg
+     @param batchProductPrice
+     */
+    init(code: Int, msg: String, batchProductPrice: KMBatchProductPrice) {
+        self.code = code
+        self.msg = msg
+        self.batchProductPrice = batchProductPrice
+    }
+    
+    /**
+     @abstract 商品优惠
+     @param code
+     @param msg
+     @param checkCoupon
+     */
+    init(code: Int, msg: String, checkCoupon: KMCheckCoupon) {
+        self.code = code
+        self.msg = msg
+        self.checkCoupon = checkCoupon
+    }
+}
+
+
+class KMListingProducts: NSObject {
+    var id              : String = "" // 【可选】id
+    var productName     : String = "" // 【可选】名称
+    var price           : String = "" // 【可选】价格
+    var maxDeviceNum    : Int = 0 // 【可选】最大可登录设备数
+    var levels          : String = "" // 【可选】3高级2标准1免费
+    var platforms       : String = "" // 【可选】产品支持平台
+    var productLineId   : Int = 0 // 【可选】所属业务线id (1pdf产品线2compdfkit产品线)
+    var paymentModel    : Int = 0 // 【可选】付费模式(1自动续订 2单次付费)
+    var cycle           : Int = 0 // 【可选】订阅周期:1、月(30天);2、季(90天);3、半年(183天);4、年(365天)
+    var code            : String = "" // 【可选】产品code
+    var cnyPrice        : String = "" // 【可选】人民币价格
+//    var displayCnyPrice        : NSNull // 【可选】人民币优惠价格
+//    var displayPrice        : NSNull // 【可选】教育优惠价格
+//    var upgradePrice        : NSNull // 【可选】买断升级订阅价格
+    init(id: String, productName: String, price: String, maxDeviceNum: Int, levels: String, platforms: String, productLineId: Int, paymentModel: Int, cycle: Int, code: String, cnyPrice: String) {
+        self.id = id
+        self.productName = productName
+        self.price = price
+        self.maxDeviceNum = maxDeviceNum
+        self.levels = levels
+        self.platforms = platforms
+        self.productLineId = productLineId
+        self.paymentModel = paymentModel
+        self.cycle = cycle
+        self.code = code
+        self.cnyPrice = cnyPrice
+    }
+}
+
+class KMBatchProductPrice: NSObject {
+    var productId       : String = "" // 【必需】产品id
+    var totalPrice      : String = "" // 【必需】总价
+    var price           : String = "" // 【必需】总价
+    var batchPrice      : String = "" // 【必需】批量购买优惠后单价
+    var cnyPrice        : String = "" // 【必需】人民币单价
+    var cnyBatchPrice   : String = "" // 【必需】批量购买优惠后人民币单价
+    var cnyTotalPrice   : String = "" // 【必需】cnyTotalPrice
+
+    init(productId: String, totalPrice: String, price: String, batchPrice: String, cnyPrice: String, cnyBatchPrice: String, cnyTotalPrice: String) {
+        self.productId = productId
+        self.totalPrice = totalPrice
+        self.price = price
+        self.batchPrice = batchPrice
+        self.cnyPrice = cnyPrice
+        self.cnyBatchPrice = cnyBatchPrice
+        self.cnyTotalPrice = cnyTotalPrice
+    }
+}
+
+class KMCheckCoupon: NSObject {
+    var id              : String = ""   // 【必需】id
+    var productName     : String = ""   // 【必需】名称
+    var price           : String = ""   // 【必需】价格
+    var maxDeviceNum    : Int = 0       // 【必需】最大可登录设备数
+    var displayPrice    : String = ""   // 【必需】优惠后价格
+    var levels          : String = ""   // 【必需】3高级2标准1免费
+    var platforms       : String = ""   // 【必需】产品支持平台
+    var productLineId   : Int = 0       // 【必需】所属业务线id (1pdf产品线2compdfkit产品线)
+    var paymentModel    : Int = 0       // 【必需】付费模式(1自动续订 2单次付费)
+    var cycle           : Int = 0       // 【必需】订阅周期:1、月(30天);2、季(90天);3、半年(183天);4、年(365天)
+    var cnyPrice        : String = ""   // 【必需】人民币价格
+    var displayCnyPrice : String = ""   // 【必需】人民币优惠价格
+    init(id: String, productName: String, price: String, maxDeviceNum: Int, displayPrice: String, levels: String, platforms: String, productLineId: Int, paymentModel: Int, cycle: Int, cnyPrice: String, displayCnyPrice: String) {
+        self.id = id
+        self.productName = productName
+        self.price = price
+        self.maxDeviceNum = maxDeviceNum
+        self.displayPrice = displayPrice
+        self.levels = levels
+        self.platforms = platforms
+        self.productLineId = productLineId
+        self.paymentModel = paymentModel
+        self.cycle = cycle
+        self.cnyPrice = cnyPrice
+        self.displayCnyPrice = displayCnyPrice
+    }
+}

+ 8 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -754,6 +754,9 @@
 		9F221EDA29A9EC0900978A59 /* KMFillSignTextPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F221ED629A9EC0900978A59 /* KMFillSignTextPanel.xib */; };
 		9F221EDB29A9EC0900978A59 /* KMFillSignTextPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F221ED629A9EC0900978A59 /* KMFillSignTextPanel.xib */; };
 		9F221EDC29A9EC0900978A59 /* KMFillSignTextPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9F221ED629A9EC0900978A59 /* KMFillSignTextPanel.xib */; };
+		9F2EA9032CD858BA00FF772A /* KMMemberProductResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2EA9022CD858BA00FF772A /* KMMemberProductResult.swift */; };
+		9F2EA9042CD858BA00FF772A /* KMMemberProductResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2EA9022CD858BA00FF772A /* KMMemberProductResult.swift */; };
+		9F2EA9052CD858BA00FF772A /* KMMemberProductResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2EA9022CD858BA00FF772A /* KMMemberProductResult.swift */; };
 		9F39B9442A661ED500930ACA /* KMHomeScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F39B9432A661ED500930ACA /* KMHomeScrollView.swift */; };
 		9F39B9452A661ED500930ACA /* KMHomeScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F39B9432A661ED500930ACA /* KMHomeScrollView.swift */; };
 		9F39B9462A661ED500930ACA /* KMHomeScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F39B9432A661ED500930ACA /* KMHomeScrollView.swift */; };
@@ -6003,6 +6006,7 @@
 		9F221ECE29A85D3700978A59 /* KMDesignBase.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMDesignBase.xib; sourceTree = "<group>"; };
 		9F221ED529A9EC0900978A59 /* KMFillSignTextPanel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFillSignTextPanel.swift; sourceTree = "<group>"; };
 		9F221ED629A9EC0900978A59 /* KMFillSignTextPanel.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMFillSignTextPanel.xib; sourceTree = "<group>"; };
+		9F2EA9022CD858BA00FF772A /* KMMemberProductResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMMemberProductResult.swift; sourceTree = "<group>"; };
 		9F39B9432A661ED500930ACA /* KMHomeScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMHomeScrollView.swift; sourceTree = "<group>"; };
 		9F3A48C32C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPurchaseEmbeddedWindowController.swift; sourceTree = "<group>"; };
 		9F3A48C42C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPurchaseEmbeddedWindowController.xib; sourceTree = "<group>"; };
@@ -9062,6 +9066,7 @@
 			children = (
 				9F4ACEA32CC5F328005CF727 /* KMMemberCenterManager.swift */,
 				9F4ACEBD2CC631CF005CF727 /* KMMemberCenterResult.swift */,
+				9F2EA9022CD858BA00FF772A /* KMMemberProductResult.swift */,
 				9F4ACED52CC7C9E3005CF727 /* KMMemberInfo.swift */,
 				9F9085CE2CC7CB7400ACAF58 /* KMSignUpModel.swift */,
 			);
@@ -17509,6 +17514,7 @@
 				9F78EFBB28F7C1CC001E66F4 /* KMHomeViewController.swift in Sources */,
 				9FBA0EEE28FFC716001117AF /* KMHomeFastToolViewController.swift in Sources */,
 				BB1B0AF22B4FC6E900889528 /* KMFunctionGuideNameItemView.swift in Sources */,
+				9F2EA9032CD858BA00FF772A /* KMMemberProductResult.swift in Sources */,
 				BBBC08832B2AC863009B237F /* KMSnapshotModel.swift in Sources */,
 				9F512CCF2B469A7700EC0BC3 /* KMPageDisplayThemeCollectionViewItem.swift in Sources */,
 				BB4F7E792B0C45BB0077EC8C /* KMNoteOutlineFilterViewController.swift in Sources */,
@@ -19207,6 +19213,7 @@
 				9F0CB4E22986556400007028 /* KMDesignToken+PaddingTop.swift in Sources */,
 				ADDF83782B391A5D00A81A4E /* CDSignatureCertificateCustomViewController.swift in Sources */,
 				ADDEEA9B2AD7BB2D00EF675D /* KMAnnotationPropertiesColorManager.swift in Sources */,
+				9F2EA9042CD858BA00FF772A /* KMMemberProductResult.swift in Sources */,
 				BB6013812AD38E0100A76FB2 /* CPDFTextAnnotation+PDFListView.swift in Sources */,
 				BB3A66912B07099F00575343 /* KMFindTableviewCell.swift in Sources */,
 				AD0FA4FA29A8DD6F00EDEB50 /* KMRegisterSuccessView.swift in Sources */,
@@ -19356,6 +19363,7 @@
 				BB146FD1299DC0D100784A6A /* GTMMIMEDocument.m in Sources */,
 				9FCFECA62AD237B500EAD2CB /* KMBatchTableRowView.swift in Sources */,
 				AD055E832B88294F0035F824 /* SKBookmarkController.m in Sources */,
+				9F2EA9052CD858BA00FF772A /* KMMemberProductResult.swift in Sources */,
 				BB031B6E2C47BB080099F7AD /* KMUserFbDespItemView.swift in Sources */,
 				BBAC26A62AFE134300563A08 /* KMToolbarItemPopViewController.swift in Sources */,
 				BB031B7D2C47BB090099F7AD /* KMUserFbListHeaderItemView.swift in Sources */,