Browse Source

生图内容的细节开发完毕

100Years 3 weeks ago
parent
commit
220a9c6dd3
23 changed files with 423 additions and 189 deletions
  1. 1 5
      AIEmoji.xcodeproj/project.pbxproj
  2. 22 10
      AIEmoji/Business/TSAILIstVC/TSAIChangeEmoteVC/TSAIChangeEmoteVC.swift
  3. 12 4
      AIEmoji/Business/TSAILIstVC/TSAIChangeEmoteVC/ViewModel/TSAIChangeEmoteVM.swift
  4. 19 5
      AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIListPhotoGeneratorBaseVC.swift
  5. 12 4
      AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift
  6. 15 3
      AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateViewModel.swift
  7. 5 6
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/Model/TSActionInfoModel.swift
  8. 5 2
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiItemCell.swift
  9. 52 9
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/TSPTPGeneratorVC.swift
  10. 13 5
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/VM/TSPTPGeneratorVM.swift
  11. 23 6
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/TSPTPInputVC.swift
  12. 37 13
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/View/TSImageGenerateView.swift
  13. 20 5
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift
  14. 11 3
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift
  15. 4 3
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorErrorView.swift
  16. 0 65
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorFailView.swift
  17. 3 1
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratoringAnimationView.swift
  18. 26 19
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorloadingView.swift
  19. 106 0
      AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift
  20. 12 5
      AIEmoji/Common/NetworkManager/TSNetWork/TSNetworkManager.swift
  21. 12 6
      AIEmoji/Common/Tool/OperationQueue/TSGenerateBaseOperation/TSGenerateBaseOperation.swift
  22. 13 8
      AIEmoji/Common/Tool/OperationQueue/TSGenerateBaseOperation/TSGeneratePosterOperation.swift
  23. 0 2
      AIEmoji/Common/Tool/TSCommonTool/TSCommonTool.swift

+ 1 - 5
AIEmoji.xcodeproj/project.pbxproj

@@ -99,7 +99,6 @@
 		A81BECA32DD1EA1E005D06A2 /* TSGeneratorErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BECA22DD1EA18005D06A2 /* TSGeneratorErrorView.swift */; };
 		A81BECA62DD1EFAF005D06A2 /* TSGeneratorloadingContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BECA52DD1EF9E005D06A2 /* TSGeneratorloadingContentView.swift */; };
 		A81BECA82DD1F075005D06A2 /* TSGeneratoringAnimationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BECA72DD1F071005D06A2 /* TSGeneratoringAnimationView.swift */; };
-		A81BECAA2DD1FA44005D06A2 /* TSGeneratorFailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BECA92DD1FA38005D06A2 /* TSGeneratorFailView.swift */; };
 		A82D60792DB7703D00596190 /* TSAIExpandImageVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82D60782DB7703C00596190 /* TSAIExpandImageVC.swift */; };
 		A82D607B2DB7724700596190 /* TSAIExpandStyleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82D607A2DB7724600596190 /* TSAIExpandStyleView.swift */; };
 		A82D607D2DB7748800596190 /* ai_expand_image_style.json in Resources */ = {isa = PBXBuildFile; fileRef = A82D607C2DB7748200596190 /* ai_expand_image_style.json */; };
@@ -365,7 +364,6 @@
 		A81BECA22DD1EA18005D06A2 /* TSGeneratorErrorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGeneratorErrorView.swift; sourceTree = "<group>"; };
 		A81BECA52DD1EF9E005D06A2 /* TSGeneratorloadingContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGeneratorloadingContentView.swift; sourceTree = "<group>"; };
 		A81BECA72DD1F071005D06A2 /* TSGeneratoringAnimationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGeneratoringAnimationView.swift; sourceTree = "<group>"; };
-		A81BECA92DD1FA38005D06A2 /* TSGeneratorFailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGeneratorFailView.swift; sourceTree = "<group>"; };
 		A82D60782DB7703C00596190 /* TSAIExpandImageVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIExpandImageVC.swift; sourceTree = "<group>"; };
 		A82D607A2DB7724600596190 /* TSAIExpandStyleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIExpandStyleView.swift; sourceTree = "<group>"; };
 		A82D607C2DB7748200596190 /* ai_expand_image_style.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = ai_expand_image_style.json; sourceTree = "<group>"; };
@@ -1175,9 +1173,8 @@
 			children = (
 				A83404D22D9D23CA00C140E4 /* TSGeneratorloadingView.swift */,
 				A81BECA72DD1F071005D06A2 /* TSGeneratoringAnimationView.swift */,
-				A81BECA52DD1EF9E005D06A2 /* TSGeneratorloadingContentView.swift */,
 				A81BECA22DD1EA18005D06A2 /* TSGeneratorErrorView.swift */,
-				A81BECA92DD1FA38005D06A2 /* TSGeneratorFailView.swift */,
+				A81BECA52DD1EF9E005D06A2 /* TSGeneratorloadingContentView.swift */,
 			);
 			path = TSGeneratorloadingView;
 			sourceTree = "<group>";
@@ -2311,7 +2308,6 @@
 				A8F776452D3DE8A800AA6E93 /* TSSmallIconBrowseVC.swift in Sources */,
 				A88508B62DBF142B000FBCEC /* TSGennertatorSelectStyleVC.swift in Sources */,
 				A80E72632D40925000C64288 /* TSDiyKeyboardVM.swift in Sources */,
-				A81BECAA2DD1FA44005D06A2 /* TSGeneratorFailView.swift in Sources */,
 				A8F775432D39346400AA6E93 /* TSSetingModel.swift in Sources */,
 				A89EA6BA2D5DDE5B000EB181 /* TSPageNullView.swift in Sources */,
 				A89EA6C12D5ED289000EB181 /* TSChatCellConfig.swift in Sources */,

+ 22 - 10
AIEmoji/Business/TSAILIstVC/TSAIChangeEmoteVC/TSAIChangeEmoteVC.swift

@@ -51,12 +51,14 @@ class TSAIChangeEmoteVC: TSBaseVC {
     }()
     
     //###################################### style类型 ######################################
+    var selectedmodel:TSGenerateStyleModel?
     lazy var styleView: TSAIChangeEmoteStyleView = {
         let styleView = TSAIChangeEmoteStyleView()
         styleView.dataArray = viewModel.selectStyleModels
         styleView.currentIndexPath = IndexPath(item: viewModel.selectedStyleIndex, section: 0)
         styleView.selectedValueBlock = { [weak self] model in
             guard let self = self else { return }
+            selectedmodel = model
             handelSelectedValueBlock(model: model)
         }
         return styleView
@@ -85,7 +87,22 @@ class TSAIChangeEmoteVC: TSBaseVC {
         let generateInView = TSGeneratorView()
         generateInView.setBackgroundColor(color: UIColor.black.withAlphaComponent(0.8))
         generateInView.isHidden = true
-        generateInView.regenerateBtn.addTarget(self, action: #selector(uploadAndCreatImage), for: .touchUpInside)
+        generateInView.animationView.setText(time: String(format: "~ %d seconds".localized, 20), info: "")
+        generateInView.clickErrorBlock = { [weak self] style in
+            guard let self = self else { return }
+            
+            switch style {
+            case .netWorkError:
+                if let selectedmodel = selectedmodel {
+                    handelSelectedValueBlock(model: selectedmodel)
+                }
+            case .generalError:
+                generateInView.isHidden = true
+            default:
+                break
+            }
+        }
+        
         return generateInView
     }()
     
@@ -256,12 +273,12 @@ extension TSAIChangeEmoteVC {
     func upDateView(state:TSProgressState,model:TSActionInfoModel?){
         switch state {
             case .failed(let errorStr,let code):
-                showError(text: errorStr)
+                showError(text: errorStr,code:code)
             case .success:
                 if let model = model {
                     showSuccess(model: model)
                 }else{
-                    showError(text: nil)
+                    showError(text: "")
                 }
             case .progressString(let string):
                 showProgress(text: string)
@@ -276,35 +293,30 @@ extension TSAIChangeEmoteVC {
         generateInView.updateShowProgress(text: text)
         
         generateInView.xBtn.isHidden = true
-        generateInView.regenerateBtn.isHidden = true
     }
     
     func showLoading(){
         generateInView.updateShowLoading(text: "Generating".localized + " ...".localized)
         
         generateInView.xBtn.isHidden = true
-        generateInView.regenerateBtn.isHidden = true
    
     }
     
-    func showError(text:String?){
-        generateInView.updateShowError(text: text)
+    func showError(text:String,code:Int = 0){
+        generateInView.updateShowError(text: text,code: code)
         
         generateInView.xBtn.isHidden = false
-        generateInView.regenerateBtn.isHidden = false
     }
     
     func showSuccess(model:TSActionInfoModel){
         generateInView.updateShowSuccess()
         
         generateInView.xBtn.isHidden = true
-        generateInView.regenerateBtn.isHidden = true
         
         viewModel.selectStyleModel?.actionInfoModel = model
 
         self.topImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:upLoadImage)
         
         styleView.agreeWillSelectIndexPath()
-        switchOriginalPictureBtn.isHidden = false
     }
 }

+ 12 - 4
AIEmoji/Business/TSAILIstVC/TSAIChangeEmoteVC/ViewModel/TSAIChangeEmoteVM.swift

@@ -114,7 +114,11 @@ extension TSAIChangeEmoteVM {
                     self.getActionInfo(action_id:actionId)
                 }
             }else{
-                self.stateDatauPblished = (TSProgressState.getFailed(error?.localizedDescription ?? ""),nil)
+                if let error = error {
+                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                }else{
+                    self.stateDatauPblished = (.generalNormalFailed,nil)
+                }
             }
         }
     }
@@ -148,7 +152,7 @@ extension TSAIChangeEmoteVM {
                         }
                         
                     case .failed:
-                        self.stateDatauPblished = (TSProgressState.getFailed(kNetWorkMessage(data: data) ?? ""),nil)
+                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg,genmojiModel.response.code),nil)
                         generatingProgress = 0
                     default:
                         stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
@@ -160,7 +164,11 @@ extension TSAIChangeEmoteVM {
                     }
                 }
             }else{
-                self.stateDatauPblished = (TSProgressState.getFailed(error?.localizedDescription ?? ""),nil)
+                if let error = error {
+                      self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                  }else{
+                      self.stateDatauPblished = (.generalNormalFailed,nil)
+                  }
             }
         }
     }
@@ -243,7 +251,7 @@ extension TSAIChangeEmoteVM {
             guard let self = self else { return }
             if let error = error {
                 imageUrl = nil
-                self.stateDatauPblished = (TSProgressState.getFailed(error.localizedDescription),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
             }else{
                 if let string = data as? String {
                     imageUrl = string

+ 19 - 5
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIListPhotoGeneratorBaseVC.swift

@@ -55,6 +55,20 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
     lazy var generateInView : TSGeneratorView = {
         let generateInView = TSGeneratorView()
         generateInView.animationView.setText(time: String(format: "~ %d min".localized, 2), info: "It is definitely worth your wait. Just watch it".localized)
+        generateInView.clickErrorBlock = { [weak self] style in
+            guard let self = self else { return }
+            
+            switch style {
+            case .netWorkError:
+                clickTryAgainBtn()
+            case .generalError:
+                self.dismiss(animated: true, completion: nil)
+            default:
+                break
+            }
+        }
+        
+        
         return generateInView
     }()
     
@@ -241,12 +255,12 @@ extension TSAIListPhotoGeneratorBaseVC {
         progressState = state
         switch state {
             case .failed(let errorStr,let code):
-                showError(text: errorStr)
+                showError(text: errorStr,code:code)
             case .success:
                 if let model = model {
                     showSuccess(model: model)
                 }else{
-                    showError(text: nil)
+                    showError(text: "")
                 }
             case .progressString(let string):
                 showProgress(text: string)
@@ -277,14 +291,14 @@ extension TSAIListPhotoGeneratorBaseVC {
         setVideoHidden()
     }
     
-    func showError(text:String?){
-        generateInView.updateShowError(text: text)
+    func showError(text:String,code:Int = 0){
+        generateInView.updateShowError(text: text,code: code)
 
         isClickTheBlankClosePage = true
         
         tryAgainBtn.isHidden = false
         bigSaveBtn.isHidden = true
-        bottomView.isHidden = false
+        bottomView.isHidden = true
         netWorkImageView.isHidden = true
         switchOriginalPictureBtn.isHidden = true
         

+ 12 - 4
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift

@@ -87,7 +87,7 @@ class TSAIListPhotoGeneratorBaseVM {
             guard let self = self else { return }
             if let error = error {
                 imageUrl = nil
-                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
             }else{
                 if let string = data as? String {
                     imageUrl = string
@@ -180,7 +180,11 @@ class TSAIListPhotoGeneratorBaseVM {
                     self.getActionInfo(action_id:actionId)
                 }
             }else{
-                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                if let error = error {
+                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                }else{
+                    self.stateDatauPblished = (.generalNormalFailed,nil)
+                }
             }
         }
     }
@@ -207,7 +211,7 @@ class TSAIListPhotoGeneratorBaseVM {
                                         self.stateDatauPblished = (.success(nil),genmojiModel)
                                         self.generatingProgress = 0
                                     }else{
-                                        self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                                        self.stateDatauPblished = (.generalNormalFailed,nil)
                                         self.generatingProgress = 0
                                     }
                                 }
@@ -236,7 +240,11 @@ class TSAIListPhotoGeneratorBaseVM {
                     }
                 }
             }else{
-                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                if let error = error {
+                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                }else{
+                    self.stateDatauPblished = (.generalNormalFailed,nil)
+                }
             }
         }
     }

+ 15 - 3
AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateViewModel.swift

@@ -107,6 +107,10 @@ enum TSProgressState  {
     static func getFailed(_ error:String,_ code:Int = 0)->TSProgressState {
         return .failed(error, code)
     }
+    
+    static var generalNormalFailed:TSProgressState {
+        return .failed(TSNetWorkCode.fail.errorMsg, TSNetWorkCode.fail.rawValue)
+    }
 }
 
 class TSGenmojiGennerateViewModel {
@@ -133,7 +137,11 @@ class TSGenmojiGennerateViewModel {
                     self.getActionInfo(action_id:actionId)
                 }
             }else{
-                self.stateDatauPblished = (TSProgressState.getFailed(error?.localizedDescription ?? ""),nil)
+                if let error = error {
+                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                }else{
+                    self.stateDatauPblished = (.generalNormalFailed,nil)
+                }
             }
         }
     }
@@ -149,7 +157,7 @@ class TSGenmojiGennerateViewModel {
                         self.stateDatauPblished = (.success(nil),genmojiModel)
                         generatingProgress = 0
                     case .failed:
-                        self.stateDatauPblished = (TSProgressState.getFailed(kNetWorkMessage(data: data) ?? ""),nil)
+                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg,genmojiModel.response.code),nil)
                         generatingProgress = 0
                     default:
                         stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
@@ -161,7 +169,11 @@ class TSGenmojiGennerateViewModel {
                     }
                 }
             }else{
-                self.stateDatauPblished = (TSProgressState.getFailed(error?.localizedDescription ?? ""),nil)
+                if let error = error {
+                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                }else{
+                    self.stateDatauPblished = (.generalNormalFailed,nil)
+                }
             }
         }
     }

+ 5 - 6
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/Model/TSActionInfoModel.swift

@@ -126,12 +126,11 @@ class TSActionResponseModel : TSBaseModel {
     
     //获取生成错误 code 对应的文案
     var codeErrorMsg:String {
-        if code == -10003 || code == -10004 {
-            return "Your photo may contain nudity, gore or violence that does not comply with the health policy, please replace the photo and try again.".localized
-        }
-        return "Sorry there was a slight problem with the image processing, please try again later.".localized
+        TSNetWorkCode.errorMsg(code: code)
+    }
+    //敏感错误
+    var sensitiveError:Bool {
+        return TSNetWorkCode.sensitiveError(code: code)
     }
 }
 
-
-

+ 5 - 2
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiItemCell.swift

@@ -75,7 +75,10 @@ class TSGenmojiItemCell: TSBaseCollectionCell ,TSSimpleConfigurableView {
             guard let self = self else { return }
             if dataModel.upImageURLExpired { //任务已经过期了
                 self.actionHandler(any: "delete_task_expired")
-                delegate?.collectionView(didTrigger: TSSimpleCellEvent(action: .buttonTapped("delete_task_expired"), indexPath: indexPath ?? IndexPath(item: 0, section: 0), data: self.dataModel))
+                delegate?.collectionView(didTrigger: TSSimpleCellEvent(action: .buttonTapped("delete_task_expired"), indexPath: indexPath, data: self.dataModel))
+            }else if dataModel.response.sensitiveError { //敏感内容
+                self.actionHandler(any: "delete_task_sensitive")
+                delegate?.collectionView(didTrigger: TSSimpleCellEvent(action: .buttonTapped("delete_task_sensitive"), indexPath: indexPath, data: self.dataModel))
             }else{
                 if kJudgeVipFreeType(vipFreeNumType: .picToPic){ return }
                 if TSGeneratePTPOperationQueue.shared.isAvailability {
@@ -151,7 +154,7 @@ class TSGenmojiItemCell: TSBaseCollectionCell ,TSSimpleConfigurableView {
             if dataModel.upImageURLExpired { //任务已经过期了
                 generateView.setTaskExpired()
             }else{
-                generateView.setFail()
+                generateView.setFailText(text: dataModel.response.codeErrorMsg, refresh: !dataModel.response.sensitiveError)
             }
             
         }

+ 52 - 9
AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/TSPTPGeneratorVC.swift

@@ -9,7 +9,7 @@ class TSPTPGeneratorVC: TSAIPhotoGeneratorBaseVC {
     var infoModel:TSActionInfoModel?
     var complete:((TSActionInfoModel)->Void)
     var reloadViewBlock:(()->Void)?
-    
+    var changeImageBlock:((UIImage)->Void)?
     var progressState = TSProgressState.none
 
     var generateStyleModel:TSGenerateStyleModel
@@ -27,15 +27,38 @@ class TSPTPGeneratorVC: TSAIPhotoGeneratorBaseVC {
     }
     
     var viewModel: TSPTPGeneratorVM!
-
+    
+    lazy var photoPickerManager: TSPhotoPickerManager = {
+        let photoPickerManager = TSPhotoPickerManager(viewController: self)
+        return photoPickerManager
+    }()
     lazy var generateInView : TSGeneratorView = {
         let generateInView = TSGeneratorView()
-        generateInView.backgroundGenerateBtn.addTarget(self, action: #selector(clickBackstageBtn), for: .touchUpInside)
         if generateStyleModel.advance {
             generateInView.animationView.setText(time: String(format: "~ %d min".localized, 2), info: "It is definitely worth your wait. Just watch it".localized)
         }else{
             generateInView.animationView.setText(time: String(format: "~ %d seconds".localized, 20), info: "")
         }
+        
+        generateInView.clickBackstageBlock = { [weak self]  in
+            guard let self = self else { return }
+            clickBackstageBtn()
+        }
+        
+        generateInView.clickErrorBlock = { [weak self] style in
+            guard let self = self else { return }
+            
+            switch style {
+            case .netWorkError:
+                clickTryAgainBtn()
+            case .sensitiveError:
+                pickSinglePhoto()
+            case .generalError:
+                self.dismiss(animated: true, completion: nil)
+            default:
+                break
+            }
+        }
         return generateInView
     }()
     
@@ -211,6 +234,26 @@ class TSPTPGeneratorVC: TSAIPhotoGeneratorBaseVC {
 }
 extension TSPTPGeneratorVC {
     
+    func pickSinglePhoto() {
+        photoPickerManager.pickCustomSinglePhoto { [weak self] image, errorString in
+            guard let self = self else { return }
+            if let errorString = errorString {
+                TSToastShared.showToast(text: errorString)
+            } else {
+                
+                if let image = image {
+                    changeImageBlock?(image)
+                }
+
+                viewModel.generateStyleModel.upLoadImage = image
+                viewModel.generateStyleModel.upLoadImageUrl = nil
+                uploadImageCreatOperation()
+            }
+            kDelayMainShort {
+                self.photoPickerManager.dismissPageVC()
+            }
+        }
+    }
     
     func getSuccessImage()->UIImage?{
         if let image = netWorkImageView.image {
@@ -227,12 +270,12 @@ extension TSPTPGeneratorVC {
         progressState = state
         switch state {
             case .failed(let errorStr,let code):
-                showError(text: errorStr)
+                showError(text: errorStr,code:code)
             case .success:
                 if let model = model {
                     showSuccess(model: model)
                 }else{
-                    showError(text: nil)
+                    showError(text: "")
                 }
             case .progressString(let string):
                 showProgress(text: string)
@@ -261,15 +304,15 @@ extension TSPTPGeneratorVC {
         rotatingPictureBtn.isHidden = true
     }
     
-    func showError(text:String?){
-        generateInView.updateShowError(text: text)
+    func showError(text:String,code:Int = 0){
+        generateInView.updateShowError(text: text,code: code)
 
         isClickTheBlankClosePage = true
         
         xBtn.isHidden = false
-        tryAgainBtn.isHidden = false
+        tryAgainBtn.isHidden = true
         bigSaveBtn.isHidden = true
-        bottomView.isHidden = false
+        bottomView.isHidden = true
         netWorkImageView.isHidden = true
         rotatingPictureBtn.isHidden = true
     }

+ 13 - 5
AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/VM/TSPTPGeneratorVM.swift

@@ -98,7 +98,7 @@ class TSPTPGeneratorVM {
             guard let self = self else { return }
             if let error = error {
                 generateStyleModel.upLoadImageUrl = nil
-                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
             }else{
                 if let string = data as? String {
                     generateStyleModel.upLoadImageUrl = string
@@ -129,7 +129,7 @@ class TSPTPGeneratorVM {
             guard let self = self else { return }
             if let error = error {
                 generateStyleModel.upLoadImageUrl = nil
-                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
             }else{
                 if let string = data as? String {
                     generateStyleModel.upLoadImageUrl = string
@@ -169,7 +169,11 @@ class TSPTPGeneratorVM {
                     self.getActionInfo(action_id:actionId)
                 }
             }else{
-                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                if let error = error {
+                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                }else{
+                    self.stateDatauPblished = (.generalNormalFailed,nil)
+                }
             }
         }
     }
@@ -201,7 +205,7 @@ class TSPTPGeneratorVM {
                         }
                         
                     case .failed:
-                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg),nil)
+                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg,genmojiModel.response.code),nil)
                         generatingProgress = 0
                     default:
                         stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
@@ -213,7 +217,11 @@ class TSPTPGeneratorVM {
                     }
                 }
             }else{
-                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                if let error = error {
+                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                }else{
+                    self.stateDatauPblished = (.generalNormalFailed,nil)
+                }
             }
         }
     }

+ 23 - 6
AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/TSPTPInputVC.swift

@@ -206,11 +206,22 @@ class TSPTPInputVC: TSBaseVC {
         cp.itemActionHandler = { [weak self] object, indexPath in
             guard let self = self else { return }
             // 删除过期的任务
-            if let cmd = object as? String, cmd == "delete_task_expired" {
-                if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel,
-                   let currentActionInfoModel = sections.items.safeObj(At: indexPath.item) {
-                    TSRMShared.ptpDBHistory.deleteListModel(id: currentActionInfoModel.dataModel.id)
-                    updataCollectionView()
+            if let cmd = object as? String{
+                if cmd == "delete_task_expired" {
+                    if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel,
+                       let currentActionInfoModel = sections.items.safeObj(At: indexPath.item) {
+                        TSRMShared.ptpDBHistory.deleteListModel(id: currentActionInfoModel.dataModel.id)
+                        updataCollectionView()
+                    }
+                }else if cmd == "delete_task_sensitive" {
+                    showCustomAlert(message: "Are you sure to delete".localized, deleteHandler:  { [weak self]  in
+                        guard let self = self else { return }
+                        if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel,
+                           let currentActionInfoModel = sections.items.safeObj(At: indexPath.item) {
+                            TSRMShared.ptpDBHistory.deleteListModel(id: currentActionInfoModel.dataModel.id)
+                            updataCollectionView()
+                        }
+                    })
                 }
             }
         }
@@ -489,7 +500,13 @@ extension TSPTPInputVC {
             guard let self = self else { return }
             updataCollectionView()
         }
-
+        
+        gennerateVC.changeImageBlock = { [weak self] image in
+            guard let self = self else { return }
+            viewModel.upLoadImage = image
+            uploadView.upLoadImage = image
+        }
+        
         gennerateVC.closePageComplete = {
             [weak self] in
             guard let self = self else { return }

+ 37 - 13
AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/View/TSImageGenerateView.swift

@@ -15,10 +15,11 @@ class TSImageGenerateView:TSBaseView {
     
     lazy var refreshBtn: TSUIExpandedTouchButton = {
         let refreshBtn = TSUIExpandedTouchButton()
-        refreshBtn.setUpButton(image: UIImage(named: "refresh_white")){[weak self]  in
-            guard let self = self else { return }
-            refreshHandel?()
-        }
+        refreshBtn.setUpButton(image: UIImage(named: "refresh_white"))
+//        {[weak self]  in
+//            guard let self = self else { return }
+//            refreshHandel?()
+//        }
         refreshBtn.isHidden = true
         return refreshBtn
     }()
@@ -54,6 +55,7 @@ class TSImageGenerateView:TSBaseView {
     override func creatUI() {
         backgroundColor = .assist
 
+    
         contentView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickContentView)))
 
         contentView.addSubview(bgImageView)
@@ -63,9 +65,10 @@ class TSImageGenerateView:TSBaseView {
         
         contentView.addSubview(infoLabel)
         infoLabel.snp.makeConstraints { make in
-            make.top.equalTo(titleTop)
+//            make.top.equalTo(titleTop)
             make.leading.equalTo(8)
             make.trailing.equalTo(-8)
+            make.centerY.equalToSuperview().offset(0)
         }
         
         contentView.addSubview(refreshBtn)
@@ -77,34 +80,40 @@ class TSImageGenerateView:TSBaseView {
         
     }
     
+    func updateInfoLabelCenterY() {
+        infoLabel.snp.updateConstraints { make in
+            make.centerY.equalToSuperview().offset(refreshBtn.isHidden ? 0 : -14.0)
+        }
+    }
+    private var isCanClick:Bool = false
     @objc func clickContentView() {
-        if refreshBtn.isHidden == false{
+        if isCanClick{
             refreshHandel?()
         }
     }
     func setProgress(progress:Float) {
         refreshBtn.isHidden = true
+        isCanClick = false
         let progressInt = Int(progress*100)
 
         infoLabel.text = "Generating".localized + "..." + "\n\n\(progressInt)%"
         infoLabel.textColor = .themeColor
 //        infoLabel.applyGradient(colors: ["#E961F6".uiColor,"#7E57F4".uiColor])
+        
+        updateInfoLabelCenterY()
     }
     
-    func setFail(){
-        setProgress(progress: 0.0)
-        infoLabel.text = "Generation Failed".localized
-        infoLabel.textColor = .white
-        refreshBtn.isHidden = false
-        refreshBtn.setImage(UIImage(named: "refresh_white"), for: .normal)
-    }
     
     func setTaskExpired(){
+        isCanClick = true
         setProgress(progress: 0.0)
         infoLabel.text = "This task has expired".localized
         infoLabel.textColor = .white
         refreshBtn.isHidden = false
+        isCanClick = true
         refreshBtn.setImage(UIImage(named: "delete_white"), for: .normal)
+        
+        updateInfoLabelCenterY()
     }
     
     func setBgImageViewURLString(bgImageURLString:String) {
@@ -120,4 +129,19 @@ class TSImageGenerateView:TSBaseView {
             }
         })
     }
+    
+    func setFailText(text:String,refresh:Bool = true){
+        setProgress(progress: 0.0)
+        infoLabel.text = text
+        infoLabel.textColor = .white
+        
+        if refresh {
+            refreshBtn.isHidden = false
+            refreshBtn.setImage(UIImage(named: "refresh_white"), for: .normal)
+        }else{
+            refreshBtn.isHidden = true
+        }
+        isCanClick = true
+        updateInfoLabelCenterY()
+    }
 }

+ 20 - 5
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift

@@ -25,7 +25,22 @@ class TSTextPicGennerateVC: TSAIPhotoGeneratorBaseVC {
 
     lazy var generateInView : TSGeneratorView = {
         let generateInView = TSGeneratorView()
+        generateInView.isUploadImage = false
         generateInView.animationView.setText(time: String(format: "~ %d seconds".localized, 20), info: "")
+        generateInView.clickErrorBlock = { [weak self] style in
+            guard let self = self else { return }
+            
+            switch style {
+            case .netWorkError:
+                clickTryAgainBtn()
+            case .sensitiveError:
+                self.dismiss(animated: true, completion: nil)
+            case .generalError:
+                self.dismiss(animated: true, completion: nil)
+            default:
+                break
+            }
+        }
         return generateInView
     }()
     
@@ -126,12 +141,12 @@ extension TSTextPicGennerateVC {
         progressState = state
         switch state {
             case .failed(let errorStr,let code):
-                showError(text: errorStr)
+                showError(text: errorStr,code:code)
             case .success:
                 if let model = model {
                     showSuccess(model: model)
                 }else{
-                    showError(text: nil)
+                    showError(text: "")
                 }
             case .progressString(let string):
                 showProgress(text: string)
@@ -155,14 +170,14 @@ extension TSTextPicGennerateVC {
         netWorkImageView.isHidden = true
     }
     
-    func showError(text:String?){
-        generateInView.updateShowError(text: text)
+    func showError(text:String,code:Int = 0){
+        generateInView.updateShowError(text: text,code: code)
         
         isClickTheBlankClosePage = true
         
         tryAgainBtn.isHidden = false
         bigSaveBtn.isHidden = true
-        bottomView.isHidden = false
+        bottomView.isHidden = true
         netWorkImageView.isHidden = true
     }
     

+ 11 - 3
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift

@@ -86,7 +86,11 @@ class TSTextPicGennerateVM {
                     self.getActionInfo(action_id:actionId)
                 }
             }else{
-                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                if let error = error {
+                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                }else{
+                    self.stateDatauPblished = (.generalNormalFailed,nil)
+                }
             }
         }
     }
@@ -120,7 +124,7 @@ class TSTextPicGennerateVM {
                         }
                         
                     case .failed:
-                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg),nil)
+                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg,genmojiModel.response.code),nil)
                         generatingProgress = 0
                     default:
                         stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
@@ -132,7 +136,11 @@ class TSTextPicGennerateVM {
                     }
                 }
             }else{
-                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                if let error = error {
+                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                }else{
+                    self.stateDatauPblished = (.generalNormalFailed,nil)
+                }
             }
         }
     }

+ 4 - 3
AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorErrorView.swift

@@ -9,6 +9,7 @@ class TSGeneratorErrorView: TSBaseView {
     
     var style:TSGeneratorView.Style = .generalError{
         didSet{
+            debugPrint("TSGeneratorErrorView style = \(style)")
             switch style {
             case .sensitiveError:
                 sensitiveErrorView()
@@ -19,7 +20,7 @@ class TSGeneratorErrorView: TSBaseView {
             }
         }
     }
-
+    var isUploadImage:Bool = true
     lazy var cusStackView: UIStackView = {
         let cusStackView = UIStackView()
         cusStackView.axis = .vertical
@@ -83,13 +84,13 @@ extension TSGeneratorErrorView {
 //    }
     
     func sensitiveErrorView() {
-        submitBtn.setTitle("Reselect photos".localized, for: .normal)
+        submitBtn.setTitle(isUploadImage ? "Reselect photos".localized : "Got it".localized, for: .normal)
         errorImageView.image = UIImage(named: "yellow_warning")
         
         errorImageView.snp.updateConstraints { make in
             make.width.height.equalTo(56)
         }
-        
+
         textLabel.text = "Your photo may contain nudity, gore or violence that does not comply with the health policy, please replace the photo and try again.".localized
         
     }

+ 0 - 65
AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorFailView.swift

@@ -1,65 +0,0 @@
-//
-//  TSGeneratorFailView.swift
-//  AIEmoji
-//
-//  Created by 100Years on 2025/5/12.
-//
-
-class TSGeneratorFailView: TSBaseView {
-    
-    lazy var cusStackView: UIStackView = {
-        let cusStackView = UIStackView()
-        cusStackView.axis = .vertical
-        return cusStackView
-    }()
-    
-    lazy var imageView: UIImageView = {
-        let imageView = UIImageView.createImageView(imageName: "failed_big")
-        return imageView
-    }()
-    
-    lazy var textLabel: UILabel = {
-        let textLabel = UILabel.createLabel(font: .font(size: 14),textColor: .white,textAlignment: .center,numberOfLines: 0)
-        return textLabel
-    }()
-    
-    lazy var submitBtn: UIButton = {
-        let btn = UIButton.createButton(title: "Generate in the background".localized,backgroundColor: .white.withAlphaComponent(0.2),font: .font(size: 16),titleColor: .themeColor,corner: 24)
-        btn.titleLabel?.adjustsFontSizeToFitWidth = true
-        return btn
-    }()
-    
-    override func creatUI() {
-        
-        contentView.addSubview(cusStackView)
-        cusStackView.snp.makeConstraints { make in
-            make.edges.equalToSuperview()
-        }
-        
-        cusStackView.addArrangedSubview(imageView)
-        imageView.snp.makeConstraints { make in
-            make.top.equalTo(0)
-            make.width.height.equalTo(56)
-            make.centerX.equalToSuperview()
-            make.bottom.equalTo(0)
-        }
-        
-        cusStackView.addArrangedSubview(textLabel)
-        textLabel.snp.makeConstraints { make in
-            make.top.equalTo(12)
-            make.leading.equalTo(24)
-            make.trailing.equalTo(-24)
-            make.bottom.equalTo(0)
-        }
-        
-        cusStackView.addArrangedSubview(submitBtn)
-        submitBtn.snp.makeConstraints { make in
-            make.top.equalTo(28)
-            make.width.equalTo(250)
-            make.height.equalTo(48)
-            make.centerX.equalToSuperview()
-            make.bottom.equalTo(0)
-        }
-    }
-}
-

+ 3 - 1
AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratoringAnimationView.swift

@@ -12,7 +12,9 @@ class TSGeneratoringAnimationView : TSBaseView {
     
     var isShowBackGeneration:Bool = false {
         didSet{
-            backgroundGenerateBtn.isHidden = !isShowBackGeneration
+            UIView.animate(withDuration: 0.3) {
+                self.backgroundGenerateBtn.isHidden = !self.isShowBackGeneration
+            }
         }
     }
     

+ 26 - 19
AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorloadingView.swift

@@ -22,15 +22,25 @@ class TSGeneratorView: TSBaseView {
     }
     
     var style:Style = .generalError
-
+    var clickBackstageBlock:(()->Void)?
+    var clickErrorBlock:((Style)->Void)?
+    
+    var isUploadImage:Bool = true{
+        didSet {
+            errorView.isUploadImage = isUploadImage
+        }
+    }
     lazy var animationView: TSGeneratoringAnimationView = {
         let animationView = TSGeneratoringAnimationView()
+        animationView.backgroundGenerateBtn.addTarget(self, action: #selector(clickBackstageBtn), for: .touchUpInside)
         return animationView
     }()
     
     lazy var errorView: TSGeneratorErrorView = {
         let errorView = TSGeneratorErrorView()
+        errorView.isUploadImage = isUploadImage
         errorView.isHidden = true
+        errorView.submitBtn.addTarget(self, action: #selector(clickErrorBtn), for: .touchUpInside)
         return errorView
     }()
 
@@ -38,20 +48,6 @@ class TSGeneratorView: TSBaseView {
         return TSDynamicBlurView()
     }()
     
-    lazy var regenerateBtn: UIButton = {
-        let regenerateBtn = UIButton.createButton(title: "Regenerate".localized,backgroundImage: kSubmitBtnNormalbg,font: .font(size: 12),titleColor: "#111111".uiColor,corner: 22)
-        regenerateBtn.isHidden = true
-        return regenerateBtn
-    }()
-    
-    lazy var backgroundGenerateBtn: UIButton = {
-        let btn = UIButton.createButton(title: "Generate in the background".localized,font: .font(size: 16),titleColor: .themeColor,corner: 24)
-        btn.layer.borderColor = UIColor.themeColor.cgColor
-        btn.layer.borderWidth = 1.0
-        btn.titleLabel?.adjustsFontSizeToFitWidth = true
-        return btn
-    }()
-    
     lazy var xBtn: UIButton = {
         let xBtn = UIButton.createButton(image: UIImage(named: "close_gray")) { [weak self]  in
             guard let self = self else { return }
@@ -140,12 +136,23 @@ class TSGeneratorView: TSBaseView {
         animationView.isHidden = true
         errorView.isHidden = false
         errorView.style = style
+        errorView.textLabel.text = text
     }
 
     func setBackgroundColor(color:UIColor){
         blurEffect.removeFromSuperview()
         contentView.backgroundColor = color
     }
+    
+    //后台生成
+    @objc func clickBackstageBtn() {
+        clickBackstageBlock?()
+    }
+    
+    @objc func clickErrorBtn() {
+        clickErrorBlock?(self.style)
+    }
+    
 }
 
 
@@ -163,9 +170,10 @@ extension TSGeneratorView{
         isRotating = true
     }
     
-    func updateShowError(text:String?){
+    func updateShowError(text:String,code:Int){
+        self.style = TSNetWorkCode.getGeneratorStyle(code: code)
         isHidden = false
-        showError(text: text ?? kGenerateFailed)
+        showError(text: text.isEmpty ? kGenerateFailed : text)
         isRotating = false
         setBackgroundGenerateBtnHidden(true)
     }
@@ -176,8 +184,7 @@ extension TSGeneratorView{
         setBackgroundGenerateBtnHidden(true)
     }
     
-    
     func setBackgroundGenerateBtnHidden(_ isHidden:Bool){
-        backgroundGenerateBtn.superview?.isHidden = isHidden
+        self.animationView.isShowBackGeneration = !isHidden
     }
 }

+ 106 - 0
AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift

@@ -45,6 +45,112 @@ enum TSNeURLType:String {
     }
 }
 
+
+
+//let kGenerateFailed:String = "Failed to generate, please try later".localized
+let kGenerateFailed:String = "Sorry there was a slight problem with the image processing, please try again later.".localized
+
+enum TSNetWorkCode : Int {
+    case success = 200
+    case fail = 0   //通用错误
+    case textSensitive = -10003    //文生图敏感错误
+    case imageSensitive = -10004   //图生图敏感错误
+    case networkError = -1005   //网络错误
+    
+    
+    var errorMsg:String {
+        switch self {
+        case .textSensitive,.imageSensitive:
+            return "Your photo may contain nudity, gore or violence that does not comply with the health policy, please replace the photo and try again.".localized
+        case .networkError:
+            return "No network, please check your network and try again.".localized
+        default:
+            return "Sorry there was a slight problem with the image processing, please try again later.".localized
+        }
+        
+    }
+    
+    //获取生成错误 code 对应的文案
+    static func errorMsg(code:Int)->String{
+        let netCode = TSNetWorkCode(rawValue: code) ?? .fail
+        return netCode.errorMsg
+    }
+    //敏感错误
+    static func sensitiveError(code:Int)->Bool{
+        let netCode = TSNetWorkCode(rawValue: code)
+        switch netCode {
+        case .textSensitive,.imageSensitive:
+            return true
+        default:
+            return false
+        }
+    }
+    
+    //网络错误错误
+    static func networkError(code:Int)->Bool{
+        let netCode = TSNetWorkCode(rawValue: code)
+        switch netCode {
+        case .networkError:
+            return true
+        default:
+            return false
+        }
+    }
+    
+    //网络错误错误
+    static func getErrorCode(_ error: Error) -> Int {
+        if let urlError = error as? URLError {
+            switch urlError.code {
+            case .notConnectedToInternet, .networkConnectionLost:
+                return TSNetWorkCode.networkError.rawValue
+            default:
+                return urlError.code.rawValue
+            }
+        }
+        return 0
+    }
+    //获取生成错误 code 对应的文案
+    static func getGeneratorStyle(code:Int)->TSGeneratorView.Style{
+        let netCode = TSNetWorkCode(rawValue: code)
+        switch netCode {
+        case .textSensitive,.imageSensitive:
+            return TSGeneratorView.Style.sensitiveError
+        case .networkError:
+            return TSGeneratorView.Style.netWorkError
+        default:
+            return TSGeneratorView.Style.generalError
+        }
+    }
+}
+
+
+extension Error {
+    
+    var tsCode:Int {
+        if let error = self as? AFError, let underlyingError = error.underlyingError as? URLError {
+            switch underlyingError.code {
+            case .notConnectedToInternet, .networkConnectionLost,.timedOut:
+                return TSNetWorkCode.networkError.rawValue
+            default:
+                return underlyingError.code.rawValue
+            }
+        }else
+        if let urlError = self as? URLError {
+            switch urlError.code {
+            case .notConnectedToInternet, .networkConnectionLost,.timedOut:
+                return TSNetWorkCode.networkError.rawValue
+            default:
+                return urlError.code.rawValue
+            }
+        }
+        return 0
+    }
+    
+    var tsDesc:String {
+        return TSNetWorkCode.errorMsg(code: tsCode)
+    }
+}
+
 func getUserInfoJsonString()->[String:Any] {
     let uuid: String
     let uuidUdKey = "my_UUID"

+ 12 - 5
AIEmoji/Common/NetworkManager/TSNetWork/TSNetworkManager.swift

@@ -25,6 +25,13 @@ class TSNetworkManager {
         ]
     }
     
+    lazy var afSession: Session = {
+        let configuration = URLSessionConfiguration.af.default
+        configuration.timeoutIntervalForRequest = 15  // 请求超时时间(秒)
+        configuration.timeoutIntervalForResource = 30 // 资源超时时间(秒)
+        let session = Session(configuration: configuration)
+        return session
+    }()
     lazy var encoder: JSONEncoding = {
         return JSONEncoding(options: .withoutEscapingSlashes)// 关键:禁用斜杠转义
     }()
@@ -56,8 +63,8 @@ class TSNetworkManager {
             return nil
         }
         
-        // 3. 使用 AF.streamRequest 发起流式请求
-        let request = AF.streamRequest(urlRequest)
+        // 3. 使用 streamRequest 发起流式请求
+        let request = afSession.streamRequest(urlRequest)
         request.responseStreamString{ stream in
             switch stream.event {
             case .stream(let result):
@@ -95,7 +102,7 @@ class TSNetworkManager {
         if method == .post {
             encoding = encoder
         }
-        let request = AF.request(urlString, method: method, parameters: parameters, encoding: encoding, headers: defaultHeaders, interceptor: nil)
+        let request = afSession.request(urlString, method: method, parameters: parameters, encoding: encoding, headers: defaultHeaders, interceptor: nil)
         request.responseString { response in
                 self.handleResponse(response, completion: completion)
             }
@@ -163,7 +170,7 @@ extension TSNetworkManager {
         dePrint("✈️✈️✈️dataArray:\(String(describing: dataArray))")
         dePrint("✈️✈️✈️参数:\(String(describing: parameters))")
         // 2. 使用 Alamofire 上传 Data
-        let request = AF.upload(
+        let request = afSession.upload(
             multipartFormData: { multipartFormData in
                 // 添加 Data
                 for dataItem in dataArray {
@@ -247,7 +254,7 @@ extension TSNetworkManager {
         }
         
         // 开始下载
-        let request = AF.download(url, to: destination)
+        let request = afSession.download(url, to: destination)
             .downloadProgress { progress in
                 // 主线程回调进度
                 DispatchQueue.main.async {

+ 12 - 6
AIEmoji/Common/Tool/OperationQueue/TSGenerateBaseOperation/TSGenerateBaseOperation.swift

@@ -84,12 +84,12 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
         
     }
 
-    func handleFailInfoModel(errorString:String?){
+    func handleFailInfoModel(errorString:String?,code:Int = 0){
         self.currentActionInfoModel.actionStatus = .failed
         self.currentActionInfoModel.status = "failed"
         generatingProgress = 0
         self.replaceSaveInfoModel(model: self.currentActionInfoModel)
-        self.stateDatauPblished = (TSProgressState.getFailed(errorString ?? ""),self.currentActionInfoModel)
+        self.stateDatauPblished = (TSProgressState.getFailed(errorString ?? "",code),self.currentActionInfoModel)
     }
     
     func getActionInfo(oldModel:TSActionInfoModel) {
@@ -106,6 +106,12 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
                 return
             }
             
+            if let error = error {
+                debugPrint("getActionInfo error error = \(error)")
+                handleFailInfoModel(errorString: error.tsDesc,code: error.tsCode)
+                return
+            }
+            
             if let result = kNetWorkResultSuccess(data: data) {
                 if let genmojiModel = TSActionInfoModel(JSON: result) {
                     
@@ -119,13 +125,12 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
                         let successBlock = { [weak self]  in
                             guard let self = self else { return }
                             self.replaceSaveInfoModel(model: genmojiModel)
-                            dePrint("successBlock genmojiModel=\(genmojiModel.toJSONString())")
                             self.stateDatauPblished = (.success(nil),genmojiModel)
                             generatingProgress = 0
                             self.handleGenerateSuccess()
                         }
                         
-                        if let url = URL(string:genmojiModel.response.resultUrl) {
+                        if URL(string:genmojiModel.response.resultUrl) != nil {
                             UIImageView.downloadImageWithProgress(urlString: genmojiModel.response.resultUrl) { [weak self]  progress in
                                 guard let self = self else { return }
                                 let progressInt = Int(progress*10.0)
@@ -140,7 +145,8 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
                             successBlock()
                         }
                     case .failed:
-                        handleFailInfoModel(errorString:genmojiModel.response.codeErrorMsg )
+                        debugPrint("getActionInfo error failed")
+                        handleFailInfoModel(errorString:genmojiModel.response.codeErrorMsg,code: genmojiModel.response.code)
                     default:
                         stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),currentActionInfoModel)
                         if stopNetwork == false {
@@ -153,7 +159,7 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
                     return
                 }
             }
- 
+            debugPrint("getActionInfo error nil")
             handleFailInfoModel(errorString: nil)
             
         }

+ 13 - 8
AIEmoji/Common/Tool/OperationQueue/TSGenerateBaseOperation/TSGeneratePosterOperation.swift

@@ -144,7 +144,7 @@ class TSGeneratePTPOperation: TSGenerateBaseOperation , @unchecked Sendable{
             if stopNetwork == true { return }
             if let error = error {
                 generateStyleModel.upLoadImageUrl = nil
-                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
                 complete(nil)
             }else{
                 if let string = data as? String {
@@ -200,14 +200,19 @@ class TSGeneratePTPOperation: TSGenerateBaseOperation , @unchecked Sendable{
                                                 ]) { [weak self] data,error in
             guard let self = self else { return }
             if stopNetwork == true { return }
-            if let dataDict = kNetWorkCodeSuccess(data: data),
-               let actionId = dataDict["actionId"] as? Int{
-                if stopNetwork == false {
-                    self.stateDatauPblished = (.pending,nil) //通知首页进行更新
-                    self.getActionInfo(action_id:actionId)
-                }
+            
+            if let error = error {
+                handleFailInfoModel(errorString: error.tsDesc,code: error.tsCode)
             }else{
-                handleFailInfoModel(errorString: error?.localizedDescription ?? "")
+                if let dataDict = kNetWorkCodeSuccess(data: data),
+                   let actionId = dataDict["actionId"] as? Int{
+                    if stopNetwork == false {
+                        self.stateDatauPblished = (.pending,nil) //通知首页进行更新
+                        self.getActionInfo(action_id:actionId)
+                    }
+                }else{
+                    handleFailInfoModel(errorString: "",code: 0)
+                }
             }
         }
     }

+ 0 - 2
AIEmoji/Common/Tool/TSCommonTool/TSCommonTool.swift

@@ -227,5 +227,3 @@ let kUploadImageMaxBit5Size:Int = 5 * 1024 * 1024 //5M
 
 
 
-//let kGenerateFailed:String = "Failed to generate, please try later".localized
-let kGenerateFailed:String = "Sorry there was a slight problem with the image processing, please try again later.".localized