ソースを参照

feat:后台生成开发完毕

100Years 2 ヶ月 前
コミット
832ac1c39c

+ 22 - 2
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -124,6 +124,7 @@
 		A8EE92D22DFFFE2F0077DFFD /* TSMineVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EE92D12DFFFE250077DFFD /* TSMineVM.swift */; };
 		A8EE92D42DFFFFAD0077DFFD /* TSAIListVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EE92D32DFFFFAA0077DFFD /* TSAIListVM.swift */; };
 		A8EE92D62E0005F70077DFFD /* Pacifico-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A8EE92D52E0005F70077DFFD /* Pacifico-Regular.ttf */; };
+		A8EE92DB2E00121A0077DFFD /* TSGennerateCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EE92DA2E0012180077DFFD /* TSGennerateCellView.swift */; };
 		A8F76C422D350A9600AA6E93 /* TSPurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F76C3E2D350A9600AA6E93 /* TSPurchaseManager.swift */; };
 		A8F76C4D2D3747B400AA6E93 /* TSPurchaseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F76C4C2D3747AB00AA6E93 /* TSPurchaseVC.swift */; };
 		A8F778AE2D1AC12400BF55D5 /* TSRandomWallpaperBrowseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F778AD2D1AC12100BF55D5 /* TSRandomWallpaperBrowseView.swift */; };
@@ -271,6 +272,7 @@
 		A8EE92D12DFFFE250077DFFD /* TSMineVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSMineVM.swift; sourceTree = "<group>"; };
 		A8EE92D32DFFFFAA0077DFFD /* TSAIListVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIListVM.swift; sourceTree = "<group>"; };
 		A8EE92D52E0005F70077DFFD /* Pacifico-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pacifico-Regular.ttf"; sourceTree = "<group>"; };
+		A8EE92DA2E0012180077DFFD /* TSGennerateCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGennerateCellView.swift; sourceTree = "<group>"; };
 		A8F76C3E2D350A9600AA6E93 /* TSPurchaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPurchaseManager.swift; sourceTree = "<group>"; };
 		A8F76C4C2D3747AB00AA6E93 /* TSPurchaseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPurchaseVC.swift; sourceTree = "<group>"; };
 		A8F778AD2D1AC12100BF55D5 /* TSRandomWallpaperBrowseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSRandomWallpaperBrowseView.swift; sourceTree = "<group>"; };
@@ -729,9 +731,9 @@
 		A868579F2DF91EA10089D222 /* TSAIListVC */ = {
 			isa = PBXGroup;
 			children = (
+				A8EE92D92E00120F0077DFFD /* View */,
 				A8EE92D32DFFFFAA0077DFFD /* TSAIListVM.swift */,
 				A86857A02DF91EB80089D222 /* TSAIListVC.swift */,
-				A86857A22DF91F680089D222 /* TSAILIstCell.swift */,
 			);
 			path = TSAIListVC;
 			sourceTree = "<group>";
@@ -793,8 +795,8 @@
 		A86857BA2DF926070089D222 /* TSAIListHistoryVC */ = {
 			isa = PBXGroup;
 			children = (
+				A8EE92DC2E0014630077DFFD /* View */,
 				A86857BB2DF9260D0089D222 /* TSAIListHistoryVC.swift */,
-				A86857BD2DF9261D0089D222 /* TSAIListHistoryCell.swift */,
 			);
 			path = TSAIListHistoryVC;
 			sourceTree = "<group>";
@@ -905,6 +907,23 @@
 			path = OperationQueue;
 			sourceTree = "<group>";
 		};
+		A8EE92D92E00120F0077DFFD /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A86857A22DF91F680089D222 /* TSAILIstCell.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		A8EE92DC2E0014630077DFFD /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A8EE92DA2E0012180077DFFD /* TSGennerateCellView.swift */,
+				A86857BD2DF9261D0089D222 /* TSAIListHistoryCell.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		A8F76C3A2D35022300AA6E93 /* TSPurchaseMembershipVC */ = {
 			isa = PBXGroup;
 			children = (
@@ -1175,6 +1194,7 @@
 				A8EE92D42DFFFFAD0077DFFD /* TSAIListVM.swift in Sources */,
 				A86857D12DF977980089D222 /* TSAIListPhotoGeneratorVM.swift in Sources */,
 				A8E590392DFFAE4400C2533F /* TSBootVC.swift in Sources */,
+				A8EE92DB2E00121A0077DFFD /* TSGennerateCellView.swift in Sources */,
 				A86857982DF846FE0089D222 /* TSDynamicBlurView.swift in Sources */,
 				A83946332D1D66A900ABFF0D /* TSPrivacyPolicyVC.swift in Sources */,
 				A86857C22DF926ED0089D222 /* TSPhotoSizeHelper.swift in Sources */,

+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Common/refresh_white.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "refresh_white@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "refresh_white@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Common/refresh_white.imageset/refresh_white@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Common/refresh_white.imageset/refresh_white@3x.png


+ 2 - 3
TSLiveWallpaper/Business/BusinessView/TSGeneratorView/TSGeneratoringAnimationView.swift

@@ -60,15 +60,14 @@ class TSGeneratoringAnimationView : TSBaseView {
     }()
     
     lazy var backgroundGenerateBtn: UIButton = {
-        let btn = UIButton.createButton(title: "Generate in the background".localized,font: .font(size: 16),titleColor: .themeColor,corner: 24)
+        let btn = UIButton.createButton(title: "Generate in the background".localized,backgroundImage: kSubmitBtnNormalbg,font: .font(size: 14,weight: .medium),titleColor: UIColor.themeColor,corner: 24)
+        btn.titleLabel?.adjustsFontSizeToFitWidth = true
         btn.layer.borderColor = (UIColor.themeColor).cgColor
         btn.layer.borderWidth = 1.0
-        btn.titleLabel?.adjustsFontSizeToFitWidth = true
         btn.isHidden = true
         return btn
     }()
     
-    
     override func creatUI() {
         
         contentView.addSubview(cusStackView)

+ 0 - 106
TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/TSAIListHistoryCell.swift

@@ -1,106 +0,0 @@
-//
-//  TSAIListHistoryCell.swift
-//  TSLiveWallpaper
-//
-//  Created by 100Years on 2025/6/10.
-//
-import RealmSwift
-class TSAIListHistoryCell: TSBaseCollectionCell {
-    var data:TSDBActionInfoModel?{
-        didSet {
-//            debugPrint("TSAIListHistoryBaseCell data didSet")
-            if let dataModel = data{
-                videoIconImageView.isHidden = true
-                exampleView.isHidden = true
-                if dataModel.modelType == 1 {
-                    textLabel.text = "Example".localized
-                    exampleView.isHidden = false
-                    showImageView.image = UIImage(named: dataModel.response!.resultUrl)
-                }else{
-//                    if dataModel.isVideo {
-//                        videoIconImageView.isHidden = false
-//                        self.showImageView.image = UIImage(contentsOfFile: dataModel.videoThumbnailURL.path)
-//                    }else {
-                        showImageView.setAsyncImage(urlString: dataModel.response!.resultUrl,contentMode: .scaleAspectFill,backgroundColor: .white.withAlphaComponent(0.1))
-                    hiddenImageView.setAsyncImage(urlString: dataModel.request!.imageUrl,contentMode: .scaleAspectFill)
-//                    }
-                }
-            }
-        }
-    }
-    
-    lazy var textLabel: UILabel = {
-        let textLabel = UILabel.createLabel(
-            text: "Example".localized,
-            font: .font(size: 12),
-            textColor: .white
-        )
-        return textLabel
-    }()
-    
-    lazy var exampleView: UIView = {
-        let exampleView = UIView()
-        exampleView.backgroundColor = "#232323".uiColor.withAlphaComponent(0.3)
-        
-        exampleView.addSubview(textLabel)
-        textLabel.snp.makeConstraints { make in
-            make.top.edges.equalTo(UIEdgeInsets(top: 4, left: 6, bottom: 4, right: 6))
-        }
-        exampleView.isHidden = true
-        return exampleView
-    }()
-    
-    lazy var showImageView: UIImageView = {
-        let showImageView = UIImageView.createImageView(imageName:"",contentMode: .scaleAspectFill)
-        showImageView.backgroundColor = .gray
-        return showImageView
-    }()
-    
-    lazy var hiddenImageView: UIImageView = {
-        let hiddenImageView = UIImageView.createImageView(imageName:"",contentMode: .scaleAspectFill)
-        hiddenImageView.backgroundColor = .gray
-        hiddenImageView.isHidden = true
-        return hiddenImageView
-    }()
-    
-    lazy var videoIconImageView: UIImageView = {
-        let videoIconImageView = UIImageView.createImageView(imageName:"video_icon",contentMode: .scaleToFill)
-        videoIconImageView.isHidden = true
-        return videoIconImageView
-    }()
-    
-    
-    override func creatUI() {
-
-        contentView.layer.borderWidth = 3
-        contentView.layer.borderColor = "#DFD7C0".uiCGColor
-        
-        contentView.addSubview(hiddenImageView)
-        hiddenImageView.snp.makeConstraints { make in
-            make.top.equalTo(0)
-            make.leading.equalTo(0)
-            make.trailing.bottom.equalTo(0)
-        }
-        
-        contentView.addSubview(showImageView)
-        showImageView.snp.makeConstraints { make in
-            make.top.equalTo(0)
-            make.leading.equalTo(0)
-            make.trailing.bottom.equalTo(0)
-        }
-        
-        contentView.addSubview(exampleView)
-        exampleView.snp.makeConstraints { make in
-            make.top.equalTo(8)
-            make.leading.equalTo(8)
-            make.height.equalTo(20)
-        }
-        
-        contentView.addSubview(videoIconImageView)
-        videoIconImageView.snp.makeConstraints { make in
-            make.top.equalTo(8)
-            make.leading.equalTo(8)
-            make.width.height.equalTo(24)
-        }
-    }
-}

+ 41 - 16
TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/TSAIListHistoryVC.swift

@@ -9,7 +9,7 @@ import RealmSwift
 
 class TSAIListHistoryVC: TSBaseVC {
 
-    var listModelArray:List<TSDBActionInfoModel> = List<TSDBActionInfoModel>()
+    var listModelArray:[TSActionInfoModel] = []
     
     lazy var navBarView: TSBaseNavContentBarView = {
         let navBarView = TSBaseNavContentBarView()
@@ -87,16 +87,26 @@ class TSAIListHistoryVC: TSBaseVC {
     
     override func dealThings() {
         updateDataView()
+        NotificationCenter.default.addObserver(self, selector: #selector(operationChanged(_:)), name: .kGenerateBasePhotoOperation, object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(updateDataView), name: .kAIPhotoDataChanged, object: nil)
     }
     
-    func updateDataView(){
-//        dbHistory.getModelList { [weak self] array in
-//            guard let self = self else { return }
-//            listModelArray = array
-//            updateView()
-//        }
-        listModelArray = dbHistory.listModels
-        updateView()
+    @objc func operationChanged(_ notification: Notification) {
+        if let userInfo = notification.userInfo as? [String: Any],let state = userInfo["state"] as? TSProgressState {
+            if state.reloadNewData {
+                self.updateDataView()
+            }
+        }
+    }
+    
+    @objc func updateDataView(){
+        dbHistory.getModelList { [weak self] array in
+            guard let self = self else { return }
+            listModelArray = array
+            updateView()
+        }
+//        listModelArray = dbHistory.getModelList()
+//        updateView()
     }
     
     func updateView() {
@@ -124,9 +134,10 @@ extension TSAIListHistoryVC: UICollectionViewDataSource ,UICollectionViewDelegat
     public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
         
         let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath)
-        if let cell = cell as? TSAIListHistoryCell {
-            if let dbModel = listModelArray[safe: indexPath.row]{
-                cell.data = dbModel
+        if let cell = cell as? TSAIListHistoryCell ,let dbModel = listModelArray.safeObj(At:indexPath.row){
+            cell.dataModel = dbModel
+            cell.buttonTapped = { [weak self] cmd in
+                self?.handelCellCmd(cmd: cmd,indexPath: indexPath)
             }
         }
         
@@ -135,9 +146,9 @@ extension TSAIListHistoryVC: UICollectionViewDataSource ,UICollectionViewDelegat
 
     public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
 
-        if let dbModel = listModelArray[safe: indexPath.row]{
+        if let dbModel = listModelArray.safeObj(At:indexPath.row){
             let vc = TSAIPhotoDetailsVC()
-            vc.imageModel = dbModel.getModel()
+            vc.infoModel = dbModel
             vc.deleteBlock = { [weak self]  in
                 guard let self = self else { return }
                 removeDelete(index: indexPath.row)
@@ -149,15 +160,29 @@ extension TSAIListHistoryVC: UICollectionViewDataSource ,UICollectionViewDelegat
 
 
 extension TSAIListHistoryVC{
+    func handelCellCmd(cmd:String,indexPath: IndexPath){
+        if let currentActionInfoModel = listModelArray.safeObj(At: indexPath.item){
+            if cmd == "delete_task_expired" {
+                TSRMShared.aiListDB.deleteListModel(id: currentActionInfoModel.id)
+                updateDataView()
+            }else if cmd == "delete_task_sensitive" {
+                showDeleteErrorAlert(message: "Delete this error history?".localized, deleteHandler:  { [weak self]  in
+                    guard let self = self else { return }
+                    TSRMShared.aiListDB.deleteListModel(id: currentActionInfoModel.id)
+                    updateDataView()
+                })
+            }
+        }
+    }
     
     func removeDelete(index:Int){
         dbHistory.deleteListModel(index: index)
-        updateView()
+        updateDataView()
     }
     
     func removeAllHistoryList(){
         dbHistory.deleteAll()
-        updateView()
+        updateDataView()
     }
     
     var dbHistory:TSDBHistory{

+ 182 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/View/TSAIListHistoryCell.swift

@@ -0,0 +1,182 @@
+//
+//  TSAIListHistoryCell.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/6/10.
+//
+import RealmSwift
+class TSAIListHistoryCell: TSBaseCollectionCell {
+    var buttonTapped:((String)->Void)?
+    var operation:TSGenerateBasePhotoOperation?
+    var dataModel:TSActionInfoModel = TSActionInfoModel(){
+        didSet {
+            self.updataActionInfoModelView(model: dataModel)
+            if let operation = TSGenerateBasePhotoOperationQueue.shared.findOperation(uuid: dataModel.uuid) as? TSGenerateBasePhotoOperation {
+                DispatchQueue.main.async {
+                    operation.currentActionInfoModelChanged = { [weak self] actionInfoModel in
+                        guard let self = self else { return }
+                        DispatchQueue.main.async {
+                            print("actionInfoModel.toJSONString()=\(actionInfoModel.toJSONString())")
+                            self.updataActionInfoModelView(model: actionInfoModel)
+                        }
+                    }
+                    self.operation = operation
+                }
+            }else{
+                self.operation?.currentActionInfoModelChanged = nil
+                self.operation = nil
+            }
+        }
+    }
+    
+
+    lazy var generateView: TSGennerateCellView = {
+        let generateView = TSGennerateCellView()
+        generateView.isHidden = true
+        generateView.refreshHandel = { [weak self]  in
+            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, data: self.dataModel))
+//                
+                buttonTapped?("delete_task_expired")
+            }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))
+                buttonTapped?("delete_task_sensitive")
+            }else{
+//                if kJudgeVipFreeType(vipFreeNumType: .picToPic){ return }
+                if TSGenerateBasePhotoOperationQueue.shared.isAvailability {
+                    let generatePTPOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: dataModel.uuid)
+                    generatePTPOperation.isSaveProcessToDB = true
+                    generatePTPOperation.creatImage(oldModel: dataModel){ complete in }
+                    generateView.setProgress(progress: 0)
+                }
+            }
+        }
+        return generateView
+    }()
+    
+    
+    
+    lazy var textLabel: UILabel = {
+        let textLabel = UILabel.createLabel(
+            text: "Example".localized,
+            font: .font(size: 12),
+            textColor: .white
+        )
+        return textLabel
+    }()
+    
+    lazy var exampleView: UIView = {
+        let exampleView = UIView()
+        exampleView.backgroundColor = "#232323".uiColor.withAlphaComponent(0.3)
+        
+        exampleView.addSubview(textLabel)
+        textLabel.snp.makeConstraints { make in
+            make.top.edges.equalTo(UIEdgeInsets(top: 4, left: 6, bottom: 4, right: 6))
+        }
+        exampleView.isHidden = true
+        return exampleView
+    }()
+    
+    lazy var showImageView: UIImageView = {
+        let showImageView = UIImageView.createImageView(imageName:"",contentMode: .scaleAspectFill)
+        showImageView.backgroundColor = .gray
+        return showImageView
+    }()
+    
+    lazy var hiddenImageView: UIImageView = {
+        let hiddenImageView = UIImageView.createImageView(imageName:"",contentMode: .scaleAspectFill)
+        hiddenImageView.backgroundColor = .gray
+        hiddenImageView.isHidden = true
+        return hiddenImageView
+    }()
+    
+    lazy var videoIconImageView: UIImageView = {
+        let videoIconImageView = UIImageView.createImageView(imageName:"video_icon",contentMode: .scaleToFill)
+        videoIconImageView.isHidden = true
+        return videoIconImageView
+    }()
+    
+    
+    override func creatUI() {
+
+        contentView.layer.borderWidth = 3
+        contentView.layer.borderColor = "#DFD7C0".uiCGColor
+        
+        contentView.addSubview(hiddenImageView)
+        hiddenImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.leading.equalTo(0)
+            make.trailing.bottom.equalTo(0)
+        }
+        
+        contentView.addSubview(showImageView)
+        showImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.leading.equalTo(0)
+            make.trailing.bottom.equalTo(0)
+        }
+        
+        contentView.addSubview(exampleView)
+        exampleView.snp.makeConstraints { make in
+            make.top.equalTo(8)
+            make.leading.equalTo(8)
+            make.height.equalTo(20)
+        }
+        
+        contentView.addSubview(videoIconImageView)
+        videoIconImageView.snp.makeConstraints { make in
+            make.top.equalTo(8)
+            make.leading.equalTo(8)
+            make.width.height.equalTo(24)
+        }
+        
+        contentView.addSubview(generateView)
+        generateView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+    }
+}
+
+extension TSAIListHistoryCell {
+    func updataActionInfoModelView(model:TSActionInfoModel){
+        
+        if model.modelType == .example {
+            model.actionStatus = .success
+        }
+        showImageView.image = nil
+        //dePrint("updataActionInfoModelView model.actionStatus 收到 = \(model.actionStatus)")
+        switch model.actionStatus {
+        case .pending,.running:
+            generateView.isHidden = false
+            generateView.setProgress(progress: model.percent)
+        case .success:
+            generateView.isHidden = true
+            videoIconImageView.isHidden = true
+            if model.modelType == .example {
+                textLabel.text = "Example".localized
+                exampleView.isHidden = false
+                showImageView.image = UIImage(named: model.response.resultUrl)
+            }else{
+                //                    if dataModel.isVideo {
+                //                        videoIconImageView.isHidden = false
+                //                        self.showImageView.image = UIImage(contentsOfFile: dataModel.videoThumbnailURL.path)
+                //                    }else {
+                showImageView.setAsyncImage(urlString: model.response.resultUrl,contentMode: .scaleAspectFill,backgroundColor: .white.withAlphaComponent(0.1))
+                hiddenImageView.setAsyncImage(urlString: model.request.imageUrl,contentMode: .scaleAspectFill)
+                //                    }
+            }
+
+        case .failed:
+            generateView.isHidden = false
+            if model.upImageURLExpired { //任务已经过期了
+                generateView.setTaskExpired()
+            }else{
+                generateView.setFailText(text: model.response.codeErrorMsg, refresh: !model.response.sensitiveError)
+            }
+            
+        }
+    }
+}

+ 109 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/View/TSGennerateCellView.swift

@@ -0,0 +1,109 @@
+//
+//  TSGennerateCellView.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/6/16.
+//
+
+class TSGennerateCellView: TSBaseView {
+    
+    var refreshHandel:(()->Void)?
+    lazy var infoLabel: UILabel = {
+        let infoLabel = UILabel.createLabel(font: .font(size: 12),textColor: .themeColor,textAlignment: .center,numberOfLines: 0)
+        return infoLabel
+    }()
+    
+    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.isHidden = true
+        return refreshBtn
+    }()
+    
+    
+
+    var titleTop:CGFloat = 86.0 {
+        didSet{
+            infoLabel.snp.updateConstraints { make in
+                make.top.equalTo(titleTop)
+            }
+        }
+    }
+    
+    override func creatUI() {
+        backgroundColor = "#1D1812".uiColor
+
+    
+        contentView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickContentView)))
+
+        contentView.addSubview(infoLabel)
+        infoLabel.snp.makeConstraints { make in
+//            make.top.equalTo(titleTop)
+            make.leading.equalTo(8)
+            make.trailing.equalTo(-8)
+            make.centerY.equalToSuperview().offset(0)
+        }
+        
+        contentView.addSubview(refreshBtn)
+        refreshBtn.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.top.equalTo(infoLabel.snp.bottom).offset(8)
+            make.width.height.equalTo(24)
+        }
+        
+    }
+    
+    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 isCanClick{
+            refreshHandel?()
+        }
+    }
+    func setProgress(progress:Float) {
+        refreshBtn.isHidden = true
+        isCanClick = false
+        let progressInt = Int(progress*100)
+
+        infoLabel.text = "Processing".localized + "..." + "\n\n\(progressInt)%"
+        infoLabel.textColor = .themeColor
+
+        updateInfoLabelCenterY()
+    }
+    
+    
+    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: "ai_delete"), for: .normal)
+        
+        updateInfoLabelCenterY()
+    }
+
+    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()
+    }
+}

+ 1 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAILIstCell.swift → TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/View/TSAILIstCell.swift

@@ -47,6 +47,7 @@ class TSAILIstCell: TSBaseCollectionCell {
         }
         return tryBtn
     }()
+
     
     override func creatUI() {
         bgContentView.clipsToBounds = true

+ 13 - 13
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC.swift

@@ -7,7 +7,7 @@
 
 class TSAIPhotoDetailsVC: TSBaseVC {
     var deleteBlock:(()->Void)?
-    var imageModel:TSActionInfoModel?{
+    var infoModel:TSActionInfoModel?{
         didSet{
             updateImageView()
         }
@@ -40,7 +40,7 @@ class TSAIPhotoDetailsVC: TSBaseVC {
 //            //旋转图片并储存
 //            if let image = netWorkImageView.image?.rotated(by: .degrees90) {
 //                netWorkImageView.image = image
-//                if let resultUrl = self.imageModel?.response.resultUrl,
+//                if let resultUrl = self.infoModel?.response.resultUrl,
 //                   let url = URL(string: resultUrl){
 //                    ImageCache.default.store(image, forKey: url.cacheKey)
 //                }
@@ -131,9 +131,9 @@ class TSAIPhotoDetailsVC: TSBaseVC {
 
     //保存功能
     @objc func clickSaveBtn(){
-        guard let imageModel = imageModel else { return }
+        guard let infoModel = infoModel else { return }
 //        if viewModel.generatorModel.generatorStyle == .photoLive{
-//            TSDownloadManager.getDownLoadVideo(urlString: imageModel.response.resultUrl) { url, success in
+//            TSDownloadManager.getDownLoadVideo(urlString: infoModel.response.resultUrl) { url, success in
 //                if let url = url {
 //                    PhotoManagerShared.saveVideoToAlbum(videoURL: url) { [weak self] success, error in
 //                        guard let self = self else { return }
@@ -147,7 +147,7 @@ class TSAIPhotoDetailsVC: TSBaseVC {
 //                }
 //            }
 //        }else{
-            TSImageStoreTool.downloadImageWithProgress(urlString: imageModel.response.resultUrl) { image in
+            TSImageStoreTool.downloadImageWithProgress(urlString: infoModel.response.resultUrl) { image in
                 if let image = image {
                     PhotoManagerShared.saveImageToAlbum(image) { [weak self] success, error in
                         guard let self = self else { return }
@@ -185,24 +185,24 @@ extension TSAIPhotoDetailsVC {
         }
         
         
-//        self.netWorkImageView.setAsyncImage(urlString:imageModel.response.resultUrl,placeholder:kPlaceholderImage)
+//        self.netWorkImageView.setAsyncImage(urlString:infoModel.response.resultUrl,placeholder:kPlaceholderImage)
     }
     
     func uploadPanComparisonView(){
-        guard let imageModel = imageModel else { return }
+        guard let infoModel = infoModel else { return }
         DispatchQueue.global(qos: .userInitiated).async {
             var oldImage:UIImage?
             var newImage:UIImage?
             let grounp = DispatchGroup()
             grounp.enter()
-            TSImageStoreTool.downloadImageWithProgress(urlString: imageModel.request.imageUrl) { image in
+            TSImageStoreTool.downloadImageWithProgress(urlString: infoModel.request.imageUrl) { image in
                 grounp.leave()
                 oldImage = image
                 
             }
             
             grounp.enter()
-            TSImageStoreTool.downloadImageWithProgress(urlString: imageModel.response.resultUrl) { image in
+            TSImageStoreTool.downloadImageWithProgress(urlString: infoModel.response.resultUrl) { image in
                 grounp.leave()
                 newImage = image
             }
@@ -223,18 +223,18 @@ extension TSAIPhotoDetailsVC {
 //        if viewModel.generatorModel.generatorStyle == .photoExpand {
 //            expandAreaView.onlyBgImage(only: false)
 //        }else{
-//        guard let imageModel = imageModel else { return }
-//        self.netWorkImageView.setAsyncImage(urlString: imageModel.request.imageUrl,placeholder:kPlaceholderImage)
+//        guard let infoModel = infoModel else { return }
+//        self.netWorkImageView.setAsyncImage(urlString: infoModel.request.imageUrl,placeholder:kPlaceholderImage)
 //        }
     }
     
     @objc func switchOriginalPictureTouchUp() {
-        guard let imageModel = imageModel else { return }
+        guard let infoModel = infoModel else { return }
         
 //        if viewModel.generatorModel.generatorStyle == .photoExpand {
 //            expandAreaView.onlyBgImage(only: true)
 //        }else{
-//            self.netWorkImageView.setAsyncImage(urlString:imageModel.response.resultUrl,placeholder:kPlaceholderImage)
+//            self.netWorkImageView.setAsyncImage(urlString:infoModel.response.resultUrl,placeholder:kPlaceholderImage)
 //        }
     }
 }

+ 79 - 13
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIListPhotoGeneratorVC.swift

@@ -38,11 +38,13 @@ class TSAIListPhotoGeneratorModel {
 }
 
 class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
-
-    init(generatorModel:TSAIListPhotoGeneratorModel,complete:@escaping ((TSActionInfoModel)->Void)) {
+    var generatorModel:TSAIListPhotoGeneratorModel
+    init(generatorModel:TSAIListPhotoGeneratorModel,infoModel:TSActionInfoModel? = nil,complete:@escaping ((TSActionInfoModel)->Void)) {
         self.complete = complete
+        self.generatorModel = generatorModel
         self.viewModel = TSAIListPhotoGeneratorBaseVM(generatorModel: generatorModel)
         super.init()
+        self.infoModel = infoModel
     }
     @MainActor required init?(coder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
@@ -51,9 +53,12 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
     var complete:((TSActionInfoModel)->Void)
     var progressState = TSProgressState.none
     
+    var uuidString:String = UUID().uuidString
+    var operation:TSGenerateBaseOperation?
+
     var isSavePhotoMark:Bool = false
     var isNeedSavePhoto:Bool {
-        if isSavePhotoMark == false,let _ = imageModel {
+        if isSavePhotoMark == false,let _ = infoModel {
             return true
         }
         return false
@@ -76,14 +81,16 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
                 break
             }
         }
-        
+        generateInView.clickBackstageBlock = { [weak self]  in
+            guard let self = self else { return }
+            clickBackstageBtn()
+        }
         generateInView.clickCloseBlock = { [weak self]  in
             guard let self = self else { return }
             closePage()
         }
         return generateInView
     }()
-    
 
     override func createView() {
         
@@ -95,6 +102,11 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
         }
     }
 
+    @objc func clickBackstageBtn() {
+        self.operation?.backstageGeneration()
+        NotificationCenter.default.post(name: .kAIPhotoDataChanged, object: nil)
+        self.dismiss(animated: true, completion: nil)
+    }
     
     func closePage() {
     
@@ -115,6 +127,12 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
                         guard let self = self else { return }
                         print("用户点击了Leave")
                         viewModel.cancelAllRequest()
+                        
+                        if let model = infoModel{
+                            TSRMShared.aiListDB.deleteListModel(id: model.id)
+                            NotificationCenter.default.post(name: .kAIPhotoDataChanged, object: nil)
+                        }
+                        
                         self.dismiss(animated: true, completion: nil)
                     },
                     confirmAction: { [weak self]  in
@@ -161,15 +179,63 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
     }
 
     override func dealThings() {
-        viewModel.uploadAndCreatImage()
-        viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self]  (state,model) in
+        self.uuidString = UUID().uuidString
+//        viewModel.uploadAndCreatImage()
+//        viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self]  (state,model) in
+//            guard let self = self else { return }
+//            self.upDateView(state: state, model: model)
+//        }.store(in: &cancellable)
+        generatorOperation()
+    }
+    
+    func generatorOperation() {
+        
+        if let model = self.infoModel{
+            if model.actionStatus == .failed{
+                generatorCreatRing(oldModel: model)
+            }else if model.response.resultUrl.count > 0 {
+                upDateView(state: .success(model), model: model)
+                return
+            }
+        }else{
+            generatorNew()
+        }
+    }
+}
+extension TSAIListPhotoGeneratorVC{
+    
+    func generatorNew() {
+        let operation:TSGenerateBasePhotoOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: self.uuidString)
+        self.operation = operation
+        operation.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self]  (state,model) in
             guard let self = self else { return }
             self.upDateView(state: state, model: model)
         }.store(in: &cancellable)
+        
+        operation.uploadImage(generateStyleModel: self.generatorModel)  { [weak self] actionInfoModel in
+            guard let self = self else { return }
+            guard let oldModel = actionInfoModel else {return}
+            generatorCreatRing(oldModel: oldModel)
+        }
     }
     
+    func generatorCreatRing(oldModel:TSActionInfoModel) {
+        let operation:TSGenerateBasePhotoOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: self.uuidString)
+        self.operation = operation
+        operation.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self]  (state,model) in
+            guard let self = self else { return }
+            self.upDateView(state: state, model: model)
+        }.store(in: &cancellable)
+        
+        operation.creatImage(oldModel: oldModel){ [weak self]  success in
+            guard let self = self else { return }
+            if success {
+                generateInView.setBackgroundGenerateBtnHidden(false)
+                navRightBtn.isHidden = false
+            }
+        }
+    }
 }
-
 extension TSAIListPhotoGeneratorVC {
     func getSuccessImage()->UIImage?{
         if let image = panComparisonView.newImageView.image {
@@ -204,7 +270,7 @@ extension TSAIListPhotoGeneratorVC {
     }
     
     func showLoading(){
-        generateInView.updateShowLoading(text: "Processing".localized + " ...".localized)
+        generateInView.updateShowLoading(text: "Processing".localized + " 0%")
 
     }
     
@@ -215,13 +281,13 @@ extension TSAIListPhotoGeneratorVC {
     func showSuccess(model:TSActionInfoModel){
         generateInView.updateShowSuccess()
 
-        imageModel = model
+        infoModel = model
 //        if viewModel.generatorModel.generatorStyle == .futureBaby {
 //            rotatingPictureBtn.isHidden = false
 //        }else{
 //            switchOriginalPictureBtn.isHidden = false
 //        }
-        if let model = imageModel {
+        if let model = infoModel {
             complete(model)
         }
         
@@ -240,7 +306,7 @@ extension TSAIListPhotoGeneratorVC {
     
     func setVideoURL(){
 //        if viewModel.generatorModel.generatorStyle == .photoLive {
-//            if let model = imageModel {
+//            if let model = infoModel {
 //                switchOriginalPictureBtn.isHidden = true
 //                self.videoPlayerVC = TSAIListVideoPlayerVC(videoURL: model.videoURL)
 //                self.addChild(self.videoPlayerVC)
@@ -256,7 +322,7 @@ extension TSAIListPhotoGeneratorVC {
     func setExpandAreaImage(){
 //        if viewModel.generatorModel.generatorStyle == .photoExpand {
 //            netWorkImageView.image = nil
-//            expandAreaView.bgImageView.setAsyncImage(urlString: imageModel?.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
+//            expandAreaView.bgImageView.setAsyncImage(urlString: infoModel?.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
 //            expandAreaView.showImageView.image = self.viewModel.generatorModel.upLoadImage
 //        }
     }

+ 3 - 3
TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift

@@ -75,9 +75,9 @@ public class PurchaseManager: NSObject {
     }
 
     @objc public var isVip: Bool {
-//        #if DEBUG
-//        return true
-//        #endif
+        #if DEBUG
+        return true
+        #endif
         guard let expiresDate = expiredDate else {
             return false
         }

+ 59 - 16
TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBaseOperation.swift

@@ -12,6 +12,9 @@ import Alamofire
 extension Notification.Name {
     static let kBaseOperationQueueCountChanged = Notification.Name("kBaseOperationQueueCountChanged") //任务数量放生变化
     static let kGenerateBasePhotoOperation = Notification.Name("TSGenerateBasePhotoOperation") //生成图生图任务发生变化
+    
+
+    static let kAIPhotoDataChanged = Notification.Name("kGenerateBasePhotoChanged") //生成图片数据发生改变
 }
 
 
@@ -20,12 +23,15 @@ class TSGenerateBaseOperationQueue: TSBaseOperationQueue {
     var stateables: [String: AnyCancellable] = [:]
     
     var generateOperationStateChanged:((String)->Void)?
-    
-    
-    override func cancelOperations(uuid: String) {
-        super.cancelOperations(uuid: uuid)
+    override func clearOperationsData(uuid: String) {
+        super.clearOperationsData(uuid: uuid)
         stateables.removeValue(forKey: uuid)
     }
+    
+//    override func cancelOperations(uuid: String) {
+//        super.cancelOperations(uuid: uuid)
+//        stateables.removeValue(forKey: uuid)
+//    }
 
     func handleStateDatauPblished(uuid:String,generateOperation: TSGenerateBaseOperation,notificationName:Notification.Name) {
         stateables[uuid] = generateOperation.$stateDatauPblished.sink { [weak self] state in
@@ -54,7 +60,7 @@ class TSGenerateBaseOperationQueue: TSBaseOperationQueue {
 }
 
 class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
-    
+    var generateStyleModel:TSAIListPhotoGeneratorModel?
     var actionInfoDict:[String:Any]{
         return [:]
     }
@@ -76,7 +82,17 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
     var stopNetwork = false
     var generatingProgress = 0
     var action_id:Int = 0
-    var isSaveDB:Bool = false //是否保存到数据库
+    
+    public var isShowSuccessView:Bool = false //是否展示成功后的 View 提醒
+    var isSaveProcessToDB:Bool = false //是否保存过程到数据库
+    {
+        didSet{
+            if isSaveProcessToDB == true {
+                saveDataDB()
+            }
+        }
+    }
+    
     var currentActionInfoModelChanged:((TSActionInfoModel)->Void)?
     @Published var currentActionInfoModel: TSActionInfoModel = TSActionInfoModel()
     
@@ -88,8 +104,12 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
     
     func replaceSaveInfoModel(model:TSActionInfoModel){ }
     
-    func handleGenerateSuccess(){
-        
+    func handleGenerateSuccess(){}
+    func saveDataDB(){}
+    
+    func backstageGeneration(){
+        isSaveProcessToDB = true
+        isShowSuccessView = true
     }
 
     func handleFailInfoModel(errorString:String?,code:Int = 0){
@@ -139,13 +159,22 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
                         }
                         
                         if URL(string:genmojiModel.response.resultUrl) != nil {
-                            TSImageStoreTool.downloadImageWithProgress(urlString: genmojiModel.response.resultUrl) { [weak self]  progress in
-                                guard let self = self else { return }
-                                let progressInt = Int(progress*10.0)
-                                let progressString = "Generating".localized + " \(90 + progressInt)%"
-                                stateDatauPblished = (.progressString(progressString),currentActionInfoModel)
-                                dePrint("生成后图片下载进度 \(progress)")
-                            } completion: { image in
+                            let group = DispatchGroup()
+//                            group.enter()
+//                            downloadImage(urlString: genmojiModel.request.imageUrl) {
+//                                group.leave()
+//                            }
+                            
+//                            if let generateStyleModel = generateStyleModel {
+//                                TSImageStoreTool.storeImage(image: generateStyleModel.upLoadImage, urlString: genmojiModel.request.imageUrl)
+//                            }
+                  
+                            group.enter()
+                            downloadImage(urlString: genmojiModel.response.resultUrl) {
+                                group.leave()
+                            }
+                
+                            group.notify(queue: .main) {
                                 successBlock()
                             }
 
@@ -172,6 +201,21 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
             
         }
     }
+    
+    
+    func downloadImage(urlString:String,completion:@escaping ()->Void){
+        TSImageStoreTool.downloadImageWithProgress(urlString: urlString) { [weak self]  progress in
+            guard let self = self else { return }
+    
+            let progressInt = Int(progress*10.0)
+            let progressString = "Processing".localized + " \(90 + progressInt)%"
+            stateDatauPblished = (.progressString(progressString),currentActionInfoModel)
+            dePrint("生成后图片下载进度: \(progress)")
+        } completion: { image in
+            completion()
+        }
+    }
+    
      func generating(progress:Float) -> String {
 
          //Generating 0%-100%
@@ -189,7 +233,6 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
          return getGeneratingProgressText()
      }
      
-     
     func getGeneratingProgressText()->String{
         return "Working on your ringtone \(generatingProgress)%..."
     }

+ 23 - 19
TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBasePhotoOperation.swift

@@ -29,10 +29,7 @@ class TSGenerateBasePhotoOperationQueue: TSGenerateBaseOperationQueue {
 }
 
 class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendable{
-    
-    //是否展示成功后的 View 提醒
-    public var isShowSuccessView:Bool = false
-    
+
     override var actionInfoDict:[String:Any]{
         return [
             "actionType":"image_create",
@@ -50,14 +47,20 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
     override func replaceSaveInfoModel(model:TSActionInfoModel){
         model.uuid = uuid
         model.request.imageUrlTimestamp = currentActionInfoModel.request.imageUrlTimestamp
-        if isSaveDB {
-            TSRMShared.aiListDB.updateData(model,id: currentActionInfoModel.id)
+        if isSaveProcessToDB {
+            saveDataDB()
         }
         currentActionInfoModel = model
         dePrint("model actionStatus 发出=\(model.actionStatus)")
         currentActionInfoModelChanged?(currentActionInfoModel)
     }
 
+    override func saveDataDB() {
+        if currentActionInfoModel.id == 0 {
+            return
+        }
+        TSRMShared.aiListDB.updateData(currentActionInfoModel,id: currentActionInfoModel.id)
+    }
     override func handleGenerateSuccess() {
 //        kPurchaseBusiness.useOnceForFree(type: .general)
         TSRMShared.aiListDB.updateData(currentActionInfoModel,id: currentActionInfoModel.id)
@@ -80,11 +83,11 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         if let cyModel = copyModel as? TSActionInfoModel {
             let topY = k_Nav_Height+10
             debugPrint("topY=\(topY)")
-            kSaveSuccesswShared.show(atView: window,text: "Successfully generated".localized,deadline: 5.0,bottom: kSaveSuccesswShared.getBottom(topY: topY)) {
-//                let gennerateVC = TSPTPGeneratorVC(generateStyleModel: TSAIListPhotoGeneratorModel(),infoModel: cyModel) { model in }
-//                gennerateVC.modalPresentationStyle = .overFullScreen
-//                gennerateVC.modalTransitionStyle = .crossDissolve
-//                rootVC.present(gennerateVC, animated: true)
+            kSaveSuccesswShared.show(atView: window,text: "Successfully generated".localized,deadline: 5.0) {
+                let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: UIImage(), generatorStyle: cyModel.request.generatorStyle),infoModel: cyModel) { model in }
+                gennerateVC.modalPresentationStyle = .overFullScreen
+                gennerateVC.modalTransitionStyle = .crossDissolve
+                rootVC.present(gennerateVC, animated: true)
             }
         }else{
             debugPrint("copyModel as? TSActionInfoModel error")
@@ -104,8 +107,8 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
     private var uploadRequest:Request?
     private var creatRequest:Request?
     
-    private func createActionInfoModel(generateStyleModel:TSAIListPhotoGeneratorModel) -> TSActionInfoModel? {
-
+    func createActionInfoModel(generateStyleModel:TSAIListPhotoGeneratorModel) -> TSActionInfoModel? {
+        self.generateStyleModel = generateStyleModel
         guard let upLoadImageUrl = generateStyleModel.upLoadImageUrl else { return nil }
 
         let infoModel = TSActionInfoModel()
@@ -147,10 +150,8 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
             }else{
                 if let string = data as? String {
                     generateStyleModel.upLoadImageUrl = string
-                    if let url = URL(string: string){//上传成功后,就将图片缓存到本地
-                        ImageCache.default.store(upLoadImage, forKey: url.cacheKey)
-                    }
-                    
+                    TSImageStoreTool.storeImage(image: upLoadImage, urlString: string)
+
                     complete(createActionInfoModel(generateStyleModel: generateStyleModel))
                 }else{
                     complete(nil)
@@ -159,7 +160,7 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         }
     }
     
-    func creatImage(oldModel:TSActionInfoModel) {
+    func creatImage(oldModel:TSActionInfoModel,complete:@escaping (Bool)->Void) {
         
         initializeActionInfoModel(oldModel: oldModel)
         if oldModel.upImageURLExpired { return  }
@@ -210,15 +211,18 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
             
             if let error = error {
                 handleFailInfoModel(errorString: error.tsDesc,code: error.tsCode)
+                complete(false)
             }else{
                 if let dataDict = kNetWorkCodeSuccess(data: data),
                    let actionId = dataDict["actionId"] as? Int{
                     if stopNetwork == false {
+                        complete(true)
                         self.stateDatauPblished = (.pending,nil) //通知首页进行更新
                         self.getActionInfo(action_id:actionId)
                     }
                 }else{
                     handleFailInfoModel(errorString: "",code: 0)
+                    complete(false)
                 }
             }
         }
@@ -233,7 +237,7 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         }
         
         generatingProgress = progressInt
-        return "Generating".localized + " \(progressInt)%"
+        return "Processing".localized + " \(progressInt)%"
     }
 
     var imageMaxKb:Int{