Browse Source

fix:同步检查Recipe文件夹功能

jiangjy 1 week ago
parent
commit
5d817fc99d

+ 46 - 0
FrameworkLocal/Common/RecipeCenter/RecipeFileManager.cs

@@ -53,13 +53,59 @@ namespace Aitex.Core.RT.RecipeCenter
         public void Initialize(IRecipeFileContext context)
         {
             Initialize(context, null, true);
+            CheckFile();
         }
         public void Initialize(IRecipeFileContext context, bool enableService)
         {
             Initialize(context, null, enableService);
 
         }
+        public void CheckFile()
+        {
+            if (!SC.ContainsItem("System.EnableCheckRecipe") || !SC.GetValue<bool>("System.EnableCheckRecipe"))
+            {
+                return;
+            }
+            string recipePath = PathManager.GetRecipeDir() + SC.GetStringValue("System.Recipe.SupportedChamberType") + "\\";
+            var di = new DirectoryInfo(recipePath);
+            if (!Directory.Exists(recipePath))
+            {
+                return;
+            }
+            var fis = di.GetFiles("*.rcp", System.IO.SearchOption.TopDirectoryOnly);
+            if (fis.Length > 0)
+            {
+
+            }
+            else
+            {
+
+                foreach (var item in di.GetDirectories())
+                {
+                    var recipeFolderRecipe = item.GetFiles("*.rcp", System.IO.SearchOption.TopDirectoryOnly);
+                    if (recipeFolderRecipe.Length > 0)
+                    {
+                        var defaultFolder = $"{item.FullName}\\default";
+                        if (!Directory.Exists(defaultFolder))
+                        {
+                            Directory.CreateDirectory(defaultFolder);
+                        }
+
+                        var diDefault = new DirectoryInfo(defaultFolder);
+                        foreach (var errorRecipe in recipeFolderRecipe)
+                        {  // 构建目标文件的完整路径
+                            string destinationPath = Path.Combine(defaultFolder, Path.GetFileName(errorRecipe.FullName));
+
+                            errorRecipe.CopyTo(destinationPath);
+                            errorRecipe.Delete();
+                        }
 
+                    }
+
+                }
+            }
+
+        }
         public void Initialize(IRecipeFileContext rcpContext, ISequenceFileContext seqContext, bool enableService)
         {
             _rcpContext = rcpContext == null ? new DefaultRecipeFileContext() : rcpContext;

+ 1 - 0
Furnace/FurnaceRT/Config/FurnaceGemModel.xml

@@ -1734,6 +1734,7 @@
     <ECID id="10010041" valueType="Ascii" logicalName="System.UnloadNeedPressCassetteInButton" value="" min="" max="" eventTrigger="" units="" description="Unload Need Press Cassette In Button" isArray="false" />
     <ECID id="10010042" valueType="Ascii" logicalName="System.UnloadNeedPressCassetteOutButton" value="" min="" max="" eventTrigger="" units="" description="Unload Need Press Cassette Out Button" isArray="false" />
     <ECID id="10010043" valueType="Ascii" logicalName="System.ZIPToDesktop" value="" min="" max="" eventTrigger="" units="" description="ZIP To Desktop" isArray="false" />
+    <ECID id="10010044" valueType="Ascii" logicalName="System.EnableCheckRecipe" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
     <ECID id="10020001" valueType="Ascii" logicalName="System.EditParameter.EditChamberType" value="" min="" max="" eventTrigger="" units="" description="Edit Chamber Type" isArray="false" />
     <ECID id="10020002" valueType="Ascii" logicalName="System.EditParameter.EditParameterType" value="" min="" max="" eventTrigger="" units="" description="Alarm Condition,Temp Correction,Temp PID,Temp Profile,Temp Auto PID,Leak Check Condition,APC PID" isArray="false" />
     <ECID id="10030001" valueType="Ascii" logicalName="System.FDC.DataGroupName" value="" min="" max="" eventTrigger="" units="" description="FDC data group" isArray="false" />

+ 2 - 0
Furnace/FurnaceRT/Config/System.sccfg

@@ -11,6 +11,8 @@
 		<config default="true" name="IsATMMode" description="Is ATM Mode" max="" min="" paramter="" tag="" unit="" type="Bool" visible="false"  />
 		<config default="false" name="IsCycleMode" description="Is Cycle Mode" max="" min="" paramter="" tag="" unit="" type="Bool" />
 		<config default="false" name="AxisMonShowKey" description="" max="" min="" paramter="" tag="" unit="" type="Bool" visible="false" />
+		<!--是否检查Recipe文件夹结构不正确-->
+		<config default="true" name="EnableCheckRecipe" description="" max="" min="" paramter="" tag="" unit="" type="Bool"   />
 
 		<!--Valve是否展示新版图标-->
 		<config default="false" name="IsShowJetValve" description="" max="" min="" paramter="" tag="" unit="" type="Bool" visible="false" />

BIN
Furnace/FurnaceRT/Config/VIDs/Equipment_VIDs_20250627.xlsx


BIN
Furnace/FurnaceRT/Config/VIDs/Equipment_VIDs_20250628.xlsx


BIN
Furnace/FurnaceRT/Config/VIDs/Equipment_VIDs_20250629.xlsx


File diff suppressed because it is too large
+ 1 - 1
Furnace/FurnaceRT/Config/VIDs/_ECID.xml


+ 5 - 5
Furnace/FurnaceUI/Views/Recipes/RecipeJobViewModel.cs

@@ -558,6 +558,7 @@ namespace FurnaceUI.Views.Recipes
                     if (a.Name == node.Name)
                     {
                         a.IsSelected = true;
+                        a.Files.ForEachDo(e => e.IsSelected = false);
                         RecipeFileList = a.Files.ToList();
                         return;
                     }
@@ -1534,21 +1535,19 @@ namespace FurnaceUI.Views.Recipes
         public void SavePermission()
         {
             CurrentRecipe.Clear();
-            var prefixPath = GetPrefix(CurrentFileNode.PrefixPath, CurrentFileNode);
-            var recipeContent = _recipeProvider.LoadRecipe(prefixPath, CurrentRecipe.Name);
+            var recipeContent = _recipeProvider.LoadRecipe(CurrentFileNode.PrefixPath, CurrentFileNode.FullPath);
             if (string.IsNullOrEmpty(recipeContent))
             {
                 MessageBox.Show($"{CurrentRecipe.PrefixPath}\\{CurrentRecipe.Name} is empty, please confirm the file is valid.");
                 return;
             }
-            CurrentRecipe.InitData(prefixPath, CurrentRecipe.Name, recipeContent, "PM1");
+            CurrentRecipe.InitData(CurrentFileNode.PrefixPath, CurrentFileNode.FullPath, recipeContent, "PM1");
             CurrentRecipe.RecipeLevel = CurrentFileNode.Level;
             RecipePermissionSelectViewModel dialog = new RecipePermissionSelectViewModel("Save recipe and permission", CurrentFileNode.Permission, CurrentRecipe.Description);
             WindowManager wm = new WindowManager();
             bool? dialogReturn = wm.ShowDialog(dialog);
             if (!dialogReturn.HasValue || !dialogReturn.Value)
                 return;
-            this.LoadData(CurrentRecipe.PrefixPath, CurrentRecipe.Name);
             CurrentRecipe.RecipePermission = dialog.RecipePermission;
             CurrentRecipe.Description = dialog.RecipeComment;
             CurrentRecipe.RecipeLevel = CurrentFileNode.Level;
@@ -1561,10 +1560,11 @@ namespace FurnaceUI.Views.Recipes
             item.FileListByProcessType = RecipeSequenceTreeBuilder.GetFileNodeParameterList($"{ChamberType[ChamberTypeIndexSelection]}\\{item.ProcessType}");// RecipeSequenceTreeBuilder.BuildFileNode(prefix, selectedFile, selectionIsFolder, recipes)[0].Files;
             FindSelectedFile(item.FileListByProcessType, $"{$"{ChamberType[ChamberTypeIndexSelection]}\\{item.ProcessType}"}\\{CurrentFileNode.FullPath}");
 
+            var prefixPath = GetPrefix(CurrentFileNode.PrefixPath, CurrentFileNode);
             item.FileListByProcessType.ForEachDo(a =>
             {
                 a.IsSelected = false;
-                if (a.FullPath == CurrentRecipe.PrefixPath)
+                if (a.FullPath == prefixPath)
                 {
                     a.IsSelected = true;
                     RecipeFileList = a.Files.ToList();

+ 5 - 5
Furnace/FurnaceUI/Views/Recipes/RecipeLayoutViewModel.cs

@@ -548,6 +548,7 @@ namespace FurnaceUI.Views.Recipes
                     if (a.Name == node.Name)
                     {
                         a.IsSelected = true;
+                        a.Files.ForEachDo(e => e.IsSelected = false);
                         RecipeFileList = a.Files.ToList();
                         return;
                     }
@@ -1107,14 +1108,13 @@ namespace FurnaceUI.Views.Recipes
         public void SavePermission()
         {
             CurrentRecipe.Clear();
-            var prefixPath = GetPrefix(CurrentFileNode.PrefixPath, CurrentFileNode);
-            var recipeContent = _recipeProvider.LoadRecipe(CurrentRecipe.PrefixPath, CurrentFileNode.FullPath);
+            var recipeContent = _recipeProvider.LoadRecipe(CurrentFileNode.PrefixPath, CurrentFileNode.FullPath);
             if (string.IsNullOrEmpty(recipeContent))
             {
                 MessageBox.Show($"{CurrentRecipe.PrefixPath}\\{CurrentRecipe.Name} is empty, please confirm the file is valid.");
                 return;
             }
-            CurrentRecipe.InitData(prefixPath, CurrentRecipe.Name, recipeContent, _columnBuilder.Configs, SelectedChamber);
+            CurrentRecipe.InitData(CurrentFileNode.PrefixPath, CurrentFileNode.FullPath, recipeContent, _columnBuilder.Configs, SelectedChamber);
 
             CurrentRecipe.RecipeLevel = CurrentFileNode.Level;
             RecipePermissionSelectViewModel dialog = new RecipePermissionSelectViewModel("Save recipe and permission", CurrentFileNode.Permission, CurrentRecipe.Description);
@@ -1122,7 +1122,6 @@ namespace FurnaceUI.Views.Recipes
             bool? dialogReturn = wm.ShowDialog(dialog);
             if (!dialogReturn.HasValue || !dialogReturn.Value)
                 return;
-            this.LoadData(CurrentRecipe.PrefixPath, CurrentRecipe.Name);
             CurrentRecipe.RecipePermission = dialog.RecipePermission;
             CurrentRecipe.Description = dialog.RecipeComment;
             CurrentRecipe.RecipeLevel = CurrentFileNode.Level;
@@ -1132,10 +1131,11 @@ namespace FurnaceUI.Views.Recipes
             item.FileListByProcessType = RecipeSequenceTreeBuilder.GetFileNodeParameterList($"{ChamberType[ChamberTypeIndexSelection]}\\{item.ProcessType}");// RecipeSequenceTreeBuilder.BuildFileNode(prefix, selectedFile, selectionIsFolder, recipes)[0].Files;
             FindSelectedFile(item.FileListByProcessType, $"{$"{ChamberType[ChamberTypeIndexSelection]}\\{item.ProcessType}"}\\{CurrentFileNode.FullPath}");
 
+            var prefixPath = GetPrefix(CurrentFileNode.PrefixPath, CurrentFileNode);
             item.FileListByProcessType.ForEachDo(a =>
             {
                 a.IsSelected = false;
-                if (a.FullPath == CurrentRecipe.PrefixPath)
+                if (a.FullPath == prefixPath)
                 {
                     a.IsSelected = true;
                     RecipeFileList = a.Files.ToList();

+ 6 - 5
Furnace/FurnaceUI/Views/Recipes/RecipeViewModel.cs

@@ -581,6 +581,7 @@ namespace FurnaceUI.Views.Recipes
                     if (a.Name == node.Name)
                     {
                         a.IsSelected = true;
+                        a.Files.ForEachDo(e => e.IsSelected = false);
                         RecipeFileList = a.Files.ToList();
                         return;
                     }
@@ -2065,21 +2066,20 @@ namespace FurnaceUI.Views.Recipes
         public void SavePermission()
         {
             CurrentRecipe.Clear();
-            var prefixPath = GetPrefix(CurrentFileNode.PrefixPath, CurrentFileNode);
-            var recipeContent = _recipeProvider.LoadRecipe(prefixPath, CurrentRecipe.Name);
+            var recipeContent = _recipeProvider.LoadRecipe(CurrentFileNode.PrefixPath, CurrentFileNode.FullPath);
             if (string.IsNullOrEmpty(recipeContent))
             {
                 MessageBox.Show($"{CurrentRecipe.PrefixPath}\\{CurrentRecipe.Name} is empty, please confirm the file is valid.");
                 return;
             }
-            CurrentRecipe.InitData(prefixPath, CurrentRecipe.Name, recipeContent, "PM1");
+            CurrentRecipe.InitData(CurrentFileNode.PrefixPath, CurrentFileNode.FullPath, recipeContent, "PM1");
             CurrentRecipe.RecipeLevel = CurrentFileNode.Level;
             RecipePermissionSelectViewModel dialog = new RecipePermissionSelectViewModel("Save recipe and permission", CurrentFileNode.Permission, CurrentRecipe.Description);
             WindowManager wm = new WindowManager();
             bool? dialogReturn = wm.ShowDialog(dialog);
             if (!dialogReturn.HasValue || !dialogReturn.Value)
                 return;
-            this.LoadData(CurrentRecipe.PrefixPath, CurrentRecipe.Name);
+
             CurrentRecipe.RecipePermission = dialog.RecipePermission;
             CurrentRecipe.Description = dialog.RecipeComment;
             CurrentRecipe.RecipeLevel = CurrentFileNode.Level;
@@ -2090,10 +2090,11 @@ namespace FurnaceUI.Views.Recipes
             item.FileListByProcessType = RecipeSequenceTreeBuilder.GetFileNodeParameterList($"{ChamberType[ChamberTypeIndexSelection]}\\{item.ProcessType}");// RecipeSequenceTreeBuilder.BuildFileNode(prefix, selectedFile, selectionIsFolder, recipes)[0].Files;
             FindSelectedFile(item.FileListByProcessType, $"{$"{ChamberType[ChamberTypeIndexSelection]}\\{item.ProcessType}"}\\{CurrentFileNode.FullPath}");
 
+            var prefixPath = GetPrefix(CurrentFileNode.PrefixPath, CurrentFileNode);
             item.FileListByProcessType.ForEachDo(a =>
             {
                 a.IsSelected = false;
-                if (a.FullPath == CurrentRecipe.PrefixPath)
+                if (a.FullPath == prefixPath)
                 {
                     a.IsSelected = true;
                     RecipeFileList = a.Files.ToList();