Browse Source

update ScheduledMaitViewModel界面 Reator 模块界面交互相关功能

git-svn-id: http://10.4.3.168:50001/svn/Furnace@105 dbcde07d-dcf5-c148-8a84-ac3097b7778e
Jiangjinyuan 1 month ago
parent
commit
0b70b6c1c2
28 changed files with 821 additions and 54 deletions
  1. 4 0
      FrameworkLocal/Common/CommonData/EnumData/MaintenanceProcessingCommandEnum.cs
  2. 1 0
      FrameworkLocal/Common/DBCore/DatabaseTable.cs
  3. 1 0
      FrameworkLocal/Common/DataCenter/DataManager.cs
  4. 36 28
      FrameworkLocal/Common/DataCenter/ScheduleMaintenanceDataManager.cs
  5. 1 0
      FrameworkLocal/RTEquipmentLibrary/Unit/IoValve.cs
  6. 23 1
      FrameworkLocal/UIClient/CenterViews/Parameter/MainParameterEditView.xaml
  7. 32 0
      FrameworkLocal/UIClient/CenterViews/Parameter/MainParameterEditViewModel.cs
  8. 196 0
      FrameworkLocal/UIClient/CenterViews/Parameter/StepGroupEditView.xaml
  9. 28 0
      FrameworkLocal/UIClient/CenterViews/Parameter/StepGroupEditView.xaml.cs
  10. 82 0
      FrameworkLocal/UIClient/CenterViews/Parameter/StepGroupEditViewModel.cs
  11. 8 0
      FrameworkLocal/UIClient/UIClient.csproj
  12. 1 0
      Furnace/FurnaceRT/Config/DBModel.sql
  13. 10 0
      Furnace/FurnaceRT/Config/FurnaceGemModel.xml
  14. 12 0
      Furnace/FurnaceRT/Config/System.sccfg
  15. 1 1
      Furnace/FurnaceRT/Config/VIDs/_ECID.xml
  16. 0 1
      Furnace/FurnaceRT/Equipments/PMs/PMModule.cs
  17. 6 0
      Furnace/FurnaceRT/FurnaceRT.csproj
  18. 8 0
      Furnace/FurnaceUI/FurnaceUI.csproj
  19. 6 3
      Furnace/FurnaceUI/Views/Editors/RecipeStepNameView.xaml
  20. 25 5
      Furnace/FurnaceUI/Views/Editors/RecipeStepNameViewModel.cs
  21. 1 0
      Furnace/FurnaceUI/Views/Operations/TransferMain/SelfCheckViewModel.cs
  22. 1 1
      Furnace/FurnaceUI/Views/Parameter/N2PurgeEditView.xaml
  23. 62 6
      Furnace/FurnaceUI/Views/Scheduled/ScheduledMaintenanceMonitorView.xaml
  24. 129 4
      Furnace/FurnaceUI/Views/Scheduled/ScheduledMaintenanceMonitorViewModel.cs
  25. 19 4
      Furnace/FurnaceUI/Views/Scheduled/ScheduledMaitViewModel.cs
  26. 37 0
      Furnace/FurnaceUI/Views/Scheduled/StepGroupSelectView.xaml
  27. 28 0
      Furnace/FurnaceUI/Views/Scheduled/StepGroupSelectView.xaml.cs
  28. 63 0
      Furnace/FurnaceUI/Views/Scheduled/StepGroupSelectViewModel.cs

+ 4 - 0
FrameworkLocal/Common/CommonData/EnumData/MaintenanceProcessingCommandEnum.cs

@@ -44,6 +44,10 @@ namespace MECF.Framework.Common.CommonData.EnumData
         BoatRecipeThickness2,
         BoatRecipeThickness3,
 
+        BoatTCUseTime,
+        BoatCKDUseTime,
+        BoatPUMPUseTime,
+
         NonOperationTime1,
         NonOperationTime2,
   

+ 1 - 0
FrameworkLocal/Common/DBCore/DatabaseTable.cs

@@ -154,6 +154,7 @@ namespace MECF.Framework.Common.DBCore
             DB.CreateTableColumn("schedule_maintenance", new Dictionary<string, Type>()
             {
                   {"association_process_recipeName", typeof(string) },
+                  {"addition_information_display_supplement", typeof(string) },
             });
         }
     }

+ 1 - 0
FrameworkLocal/Common/DataCenter/DataManager.cs

@@ -71,6 +71,7 @@ namespace Aitex.Core.RT.DataCenter
                 StatsDataManager.Instance.Initialize();
             }
 
+          
             ScheduleMaintenanceDataManager.Instance.Initialize();
 
             CONFIG.Subscribe("System", "NumericDataList", ()=>NumericDataList);

+ 36 - 28
FrameworkLocal/Common/DataCenter/ScheduleMaintenanceDataManager.cs

@@ -20,9 +20,9 @@ namespace MECF.Framework.Common.DataCenter
     {
         public ScheduleMaintenanceDataItem DataItem { get; private set; }
 
-        public ScheduleMaintenanceData(string item, string display, string unit, float startValue, float limitValue, string maintenanceProcessing, string path, string additionInformationName = "", string additionInformationDisplay = "", string associationProcessRecipeName = "")
+        public ScheduleMaintenanceData(string item, string display, string unit, float startValue, float limitValue, string maintenanceProcessing, string path, string additionInformationName = "", string additionInformationDisplay = "", string associationProcessRecipeName = "", string additionInformationDisplaySupplement = "")
         {
-            ScheduleMaintenanceDataManager.Instance.Subscribe(item, display, unit, startValue, limitValue, maintenanceProcessing, path, additionInformationName, additionInformationDisplay, associationProcessRecipeName);
+            ScheduleMaintenanceDataManager.Instance.Subscribe(item, display, unit, startValue, limitValue, maintenanceProcessing, path, additionInformationName, additionInformationDisplay, associationProcessRecipeName, additionInformationDisplaySupplement);
 
             DataItem = ScheduleMaintenanceDataManager.Instance.GetItem(item);
         }
@@ -67,6 +67,7 @@ namespace MECF.Framework.Common.DataCenter
         public string Path { get; set; }
         public string AdditionInformationName { get; set; }
         public string AdditionInformationDisplay { get; set; }
+        public string AdditionInformationDisplaySupplement { get; set; }
     }
 
     public class ScheduleMaintenanceDataManager : Singleton<ScheduleMaintenanceDataManager>
@@ -84,6 +85,8 @@ namespace MECF.Framework.Common.DataCenter
 
         public void Initialize()
         {
+            InitScheduleMaintenance();
+
             try
             {
                 OP.Subscribe("System.ScheduleMaintenance.SetCurrentValue", (method, args) =>
@@ -126,7 +129,7 @@ namespace MECF.Framework.Common.DataCenter
 
                 OP.Subscribe("System.ScheduleMaintenance.SetAdditionInformationDisplayName", (method, args) =>
                 {
-                    SetMaintenanceName((string)args[0], args[1].ToString());
+                    SetAdditionInformationDisplayName((string)args[0], args[1].ToString(), args.Length > 2 ? args[2].ToString(): "");
                     return true;
                 });
 
@@ -142,6 +145,7 @@ namespace MECF.Framework.Common.DataCenter
                     item.Path = dt.Rows[i]["path"].ToString();
                     item.AdditionInformationName = dt.Rows[i]["addition_information_name"].ToString();
                     item.AdditionInformationDisplay = dt.Rows[i]["addition_information_display"].ToString();
+                    item.AdditionInformationDisplaySupplement = dt.Rows[i]["addition_information_display_supplement"].ToString();
                     item.AssociationProcessRecipeName = dt.Rows[i]["association_process_recipeName"].ToString();
                     if (float.TryParse(dt.Rows[i]["current_value"].ToString(), out float value))
                         item.CurrentValue = value;
@@ -153,7 +157,7 @@ namespace MECF.Framework.Common.DataCenter
                     _items[item.Item] = item;
                 }
 
-                InitScheduleMaintenance();
+
                 UpdateSEDWafer();
             }
             catch (Exception ex)
@@ -184,7 +188,7 @@ namespace MECF.Framework.Common.DataCenter
                 return display;
             }
         }
-        public string SetAdditionInformationDisplayName(string name, string display)
+        public string SetAdditionInformationDisplayName(string name, string display, string displaySupplement = "")
         {
             lock (_locker)
             {
@@ -198,8 +202,8 @@ namespace MECF.Framework.Common.DataCenter
                 _items[name].AdditionInformationDisplay = display;
 
                 string sql = string.Format(
-                    "UPDATE \"schedule_maintenance\" SET \"addition_information_display\"='{0}'WHERE \"maintenance_item\"='{1}';", display,
-                    name);
+                    "UPDATE \"schedule_maintenance\" SET \"addition_information_display\"='{0}' , \"addition_information_display_supplement\"='{2}'WHERE \"maintenance_item\"='{1}';", display,
+                    name, displaySupplement);
                 DB.Insert(sql);
 
                 EV.PostInfoLog("System", $"{name} schedule maintenance AdditionInformationDisplay value changed from {preValue} to {display}");
@@ -283,7 +287,7 @@ namespace MECF.Framework.Common.DataCenter
         {
 
         }
-        public void Subscribe(string item, string display, string unit, float startValue, float limitValue, string maintenanceProcessing, string path, string additionInformationName, string additionInformationDisplay, string associationProcessRecipeName)
+        public void Subscribe(string item, string display, string unit, float startValue, float limitValue, string maintenanceProcessing, string path, string additionInformationName, string additionInformationDisplay, string associationProcessRecipeName, string additionInformationDisplaySupplement)
         {
             lock (_locker)
             {
@@ -300,10 +304,11 @@ namespace MECF.Framework.Common.DataCenter
                                                     ""unit"",
                                                     ""path"",
                                                     ""addition_information_name"",
-                                                    ""addition_information_display""
-                                                    ""association_process_recipeName""
-                                                    ) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}')",
-                        item, display, startValue, limitValue, maintenanceProcessing, unit, path, additionInformationName, additionInformationDisplay, associationProcessRecipeName);
+                                                    ""addition_information_display"",
+                                                    ""association_process_recipeName"",
+                                                    ""addition_information_display_supplement""
+                                                    ) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}')",
+                        item, display, startValue, limitValue, maintenanceProcessing, unit, path, additionInformationName, additionInformationDisplay, associationProcessRecipeName, additionInformationDisplaySupplement);
                     DB.Insert(executeInsert);
                 }
             }
@@ -413,7 +418,7 @@ namespace MECF.Framework.Common.DataCenter
 
         private Dictionary<MaintenanceItemEnum, ScheduleMaintenanceData> _scheduleMaintenanceDataDictionary;
 
-        private void InitScheduleMaintenance()
+        public void InitScheduleMaintenance()
         {
 
             _scheduleMaintenanceDataDictionary = new Dictionary<MaintenanceItemEnum, ScheduleMaintenanceData>
@@ -432,18 +437,18 @@ namespace MECF.Framework.Common.DataCenter
                   { MaintenanceItemEnum.FDWaferUserTime, new ScheduleMaintenanceData(MaintenanceItemEnum.FDWaferUserTime.ToString(), "FDWaferUserTime", "h:m", 0, 0, "None", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy") },
 
 
-                  { MaintenanceItemEnum.OnBoatDummyWaferUse, new ScheduleMaintenanceData(MaintenanceItemEnum.OnBoatDummyWaferUse.ToString(),"OnBoatDummyWaferUse", "Times", 0, 0, "None", "Boat", "", "") },
-                  { MaintenanceItemEnum.OnBoatDummyWaferThick, new ScheduleMaintenanceData(MaintenanceItemEnum.OnBoatDummyWaferThick.ToString(), "OnBoatDummyWaferThick", "Å", 0, 0, "None", "Boat", "", "") },
                   { MaintenanceItemEnum.BoatRecipeThickness1, new ScheduleMaintenanceData(MaintenanceItemEnum.BoatRecipeThickness1.ToString(),  "BoatRecipeThickness1", "Å", 0, 0, "None", "Boat", "", "") },
-                  { MaintenanceItemEnum.BoatRecipeThickness2, new ScheduleMaintenanceData(MaintenanceItemEnum.BoatRecipeThickness2.ToString(),  "BoatRecipeThickness2", "Å", 0, 0, "None", "Boat", "", "") },
-                  { MaintenanceItemEnum.BoatRecipeThickness3, new ScheduleMaintenanceData(MaintenanceItemEnum.BoatRecipeThickness3.ToString(),  "BoatRecipeThickness3", "Å", 0, 0, "None", "Boat", "", "") },
+                  { MaintenanceItemEnum.BoatTCUseTime, new ScheduleMaintenanceData(MaintenanceItemEnum.BoatTCUseTime.ToString(), "BoatTCUseTime", "h:m", 0, 0, "None", "Boat", "", "") },
+                  { MaintenanceItemEnum.BoatCKDUseTime, new ScheduleMaintenanceData(MaintenanceItemEnum.BoatCKDUseTime.ToString(), "BoatCKDUseTime", "h:m", 0, 0, "None", "Boat", "", "") },
+                  { MaintenanceItemEnum.BoatPUMPUseTime, new ScheduleMaintenanceData(MaintenanceItemEnum.BoatPUMPUseTime.ToString(), "BoatPUMPUseTime", "h:m", 0, 0, "None", "Boat", "", "") },
+
 
 
                   { MaintenanceItemEnum.NonOperationTime1, new ScheduleMaintenanceData(MaintenanceItemEnum.NonOperationTime1.ToString(), "NonOperationTime1", "h:m", 0, 0, "None", "Conditioning", "", "") },
                   { MaintenanceItemEnum.NonOperationTime2, new ScheduleMaintenanceData(MaintenanceItemEnum.NonOperationTime2.ToString(), "NonOperationTime2", "h:m", 0, 0, "None", "Conditioning", "", "") },
 
-                  { MaintenanceItemEnum.RecipeExecuteFreq, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeExecuteFreq.ToString(), "Recipe Run Freq", "Times", 0, 0, "None", "Reactor.Recipe", "", "") },
-                  { MaintenanceItemEnum.RecipeThickness, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness.ToString(), "Recipe Thickness", "Å", 0, 0, "None", "Reactor.Recipe", "", "") },
+                  { MaintenanceItemEnum.RecipeExecuteFreq, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeExecuteFreq.ToString(), "Recipe Run Freq", "Times", 0, 0, "None", "Reactor.Recipe", "Select Recipe", "") },
+                  { MaintenanceItemEnum.RecipeThickness, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness.ToString(), "Recipe Thickness", "Å", 0, 0, "None", "Reactor.Recipe", "Select Recipe", "") },
 
 
                   { MaintenanceItemEnum.RecipeStepExecuteFreq1, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteFreq1.ToString(), "Recipe StepRunTime1", "Times", 0, 0, "None", "Reactor.StepRunFreq", "Step ID", "") },
@@ -462,14 +467,14 @@ namespace MECF.Framework.Common.DataCenter
 
 
 
-                  { MaintenanceItemEnum.RecipeThickness1_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness1_Step.ToString(), "Recipe StepThickness1", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "Group 1") },
-                  { MaintenanceItemEnum.RecipeThickness2_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness2_Step.ToString(), "Recipe StepThickness2", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "Group 2") },
-                  { MaintenanceItemEnum.RecipeThickness3_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness3_Step.ToString(), "Recipe StepThickness3", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "Group 3") },
-                  { MaintenanceItemEnum.RecipeThickness4_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness4_Step.ToString(), "Recipe StepThickness4", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "Group 4") },
-                  { MaintenanceItemEnum.RecipeThickness5_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness5_Step.ToString(), "Recipe StepThickness5", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "Group 5") },
-                  { MaintenanceItemEnum.RecipeThickness6_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness6_Step.ToString(), "Recipe StepThickness6", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "Group 6") },
-                  { MaintenanceItemEnum.RecipeThickness7_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness7_Step.ToString(), "Recipe StepThickness7", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "Group 7") },
-                  { MaintenanceItemEnum.RecipeThickness8_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness8_Step.ToString(), "Recipe StepThickness8", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "Group 8") }
+                  { MaintenanceItemEnum.RecipeThickness1_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness1_Step.ToString(), "Recipe StepThickness1", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
+                  { MaintenanceItemEnum.RecipeThickness2_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness2_Step.ToString(), "Recipe StepThickness2", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
+                  { MaintenanceItemEnum.RecipeThickness3_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness3_Step.ToString(), "Recipe StepThickness3", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
+                  { MaintenanceItemEnum.RecipeThickness4_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness4_Step.ToString(), "Recipe StepThickness4", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
+                  { MaintenanceItemEnum.RecipeThickness5_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness5_Step.ToString(), "Recipe StepThickness5", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
+                  { MaintenanceItemEnum.RecipeThickness6_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness6_Step.ToString(), "Recipe StepThickness6", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
+                  { MaintenanceItemEnum.RecipeThickness7_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness7_Step.ToString(), "Recipe StepThickness7", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
+                  { MaintenanceItemEnum.RecipeThickness8_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness8_Step.ToString(), "Recipe StepThickness8", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") }
               };
             _stepThickness = new Dictionary<string, string>()
             {
@@ -524,7 +529,10 @@ namespace MECF.Framework.Common.DataCenter
 
         public void UpdateSEDWafer()
         {
-
+            if (_scheduleMaintenanceDataDictionary == null)
+            {
+                return;
+            }
             var ccc = BinarySerializer<Dictionary<ModuleName, Dictionary<int, WaferInfo>>>.FromStream("WaferManager");
             List<WaferInfo> waferInfos = new List<WaferInfo>();
             if (ccc != null)

+ 1 - 0
FrameworkLocal/RTEquipmentLibrary/Unit/IoValve.cs

@@ -548,6 +548,7 @@ namespace Aitex.Core.RT.Device.Unit
             }
             else
             {
+                //正常开阀逻辑
                 if (_doOpen != null)
                 {
                     if (!_doOpen.Check(bValue, out reason))

+ 23 - 1
FrameworkLocal/UIClient/CenterViews/Parameter/MainParameterEditView.xaml

@@ -95,6 +95,28 @@
                             </Button>
                         </Canvas>
 
+                        <Canvas x:Name="StepGroupSetting" Visibility="{Binding StepGroupSettingVisibility}" Width="735" Height="590">
+                            <ListBox ItemsSource="{Binding CurrentNode.Items, IsAsync=True}">
+                                <ListBox.ItemsPanel>
+                                    <ItemsPanelTemplate>
+                                        <UniformGrid Columns="7"></UniformGrid>
+                                    </ItemsPanelTemplate>
+                                </ListBox.ItemsPanel>
+                                <ListBox.ItemTemplate>
+                                    <DataTemplate>
+                                        <Button Margin="5"  Width="95"  Content="{Binding Name}" >
+                                            <i:Interaction.Triggers>
+                                                <i:EventTrigger EventName="Click">
+                                                    <cal:ActionMessage MethodName="StepGroupEdit">
+                                                        <cal:Parameter Value="{Binding Name}"/>
+                                                    </cal:ActionMessage>
+                                                </i:EventTrigger>
+                                            </i:Interaction.Triggers>
+                                        </Button>
+                                    </DataTemplate>
+                                </ListBox.ItemTemplate>
+                            </ListBox>
+                        </Canvas>
                         <Canvas x:Name="TempSetting" Visibility="{Binding TempSettingVisibility}" Width="735" Height="590">
                             <Grid>
                                 <Grid.RowDefinitions>
@@ -106,7 +128,7 @@
                             <ListBox ItemsSource="{Binding CurrentNode.SubNodes, IsAsync=True}">
                                 <ListBox.ItemsPanel>
                                     <ItemsPanelTemplate>
-                                        <UniformGrid Columns="7"></UniformGrid>
+                                        <UniformGrid Columns="5"></UniformGrid>
                                     </ItemsPanelTemplate>
                                 </ListBox.ItemsPanel>
                                 <ListBox.ItemTemplate>

+ 32 - 0
FrameworkLocal/UIClient/CenterViews/Parameter/MainParameterEditViewModel.cs

@@ -1,9 +1,11 @@
 using Aitex.Core.RT.SCCore;
 using Caliburn.Micro;
+using Caliburn.Micro.Core;
 using MECF.Framework.Common.DataCenter;
 using MECF.Framework.Common.OperationCenter;
 using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig;
 using MECF.Framework.UI.Client.CenterViews.Dialogs;
+using MECF.Framework.UI.Client.CenterViews.Editors;
 using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
 using MECF.Framework.UI.Client.ClientBase;
 using OpenSEMI.ClientBase;
@@ -108,6 +110,7 @@ namespace MECF.Framework.UI.Client.CenterViews.Parameter
         {
             var node = SystemConfigProvider.Instance.GetConfigTree(SystemName).SubNodes;
             ParameterTree.Add(new ParamBase() { ID = 1, ParentID = 0, Name = "StepName", ConfigName = "StepName" });
+            ParameterTree.Add(new ParamBase() { ID = 2, ParentID = 0, Name = "StepGroup", ConfigName = "StepGroup" });
             //ParameterTree.Add(new ParamBase() { ID = 2, ParentID = 0, Name = "TempSetting", ConfigName = "TempSetting" });
 
             //ParameterTree.Add(new ParamBase() { ID = 3, ParentID = 0, Name = "TempSetting", ConfigName = "TempSetting" });
@@ -153,7 +156,17 @@ namespace MECF.Framework.UI.Client.CenterViews.Parameter
                 NotifyOfPropertyChange(nameof(StepNameVisibility));
             }
         }
+        private Visibility _stepGroupSettingVisibility = Visibility.Hidden;
 
+        public Visibility StepGroupSettingVisibility
+        {
+            get => _stepGroupSettingVisibility;
+            set
+            {
+                _stepGroupSettingVisibility = value;
+                NotifyOfPropertyChange(nameof(StepGroupSettingVisibility));
+            }
+        }
         private Visibility _tempSettingeVisibility = Visibility.Hidden;
 
         public Visibility TempSettingVisibility
@@ -179,6 +192,7 @@ namespace MECF.Framework.UI.Client.CenterViews.Parameter
         {
             StepNameVisibility = Visibility.Hidden;
             TempSettingVisibility = Visibility.Hidden;
+            StepGroupSettingVisibility = Visibility.Hidden;
         }
         public void TreeViewSelectedItemChanged(object obj)
         {
@@ -192,6 +206,11 @@ namespace MECF.Framework.UI.Client.CenterViews.Parameter
                 case "StepName":
                     StepNameVisibility = Visibility.Visible;
                     break;
+                case "StepGroup":
+                    CurrentNode = FindNodeByName(_rootNode, $"{strHeader}.{para.ConfigName}");
+                    StepGroupSettingVisibility = Visibility.Visible;
+
+                    break;
                 case "TempSetting":
                     CurrentNode = FindNodeByName(_rootNode, $"{strHeader}.{para.ConfigName}");
                     TempSettingVisibility = Visibility.Visible;
@@ -203,7 +222,20 @@ namespace MECF.Framework.UI.Client.CenterViews.Parameter
                     break;
             }
         }
+        public void StepGroupEdit(string groupName)
+        {
+            var windowManager = IoC.Get<IWindowManager>();
 
+            StepGroupEditViewModel recipeStepNameViewModel = new StepGroupEditViewModel();
+            recipeStepNameViewModel.StepGroupName = groupName;
+            if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(recipeStepNameViewModel, null, "Step Group Edit"))
+            {
+                var selectStepId = recipeStepNameViewModel.StepIdList.Where(a => a.IsExpanded).Select(a => a.Name).ToList();
+                InvokeClient.Instance.Service.DoOperation($"{SystemName}.SetConfig", $"PM1.RecipeEditParameter.StepGroup.{groupName}", string.Join(",", selectStepId.ToArray()));
+            }
+
+
+        }
         private void InitItemsCurrentValue(ConfigNode node, bool initSubItems = true)
         {
             if (node == null) return;

+ 196 - 0
FrameworkLocal/UIClient/CenterViews/Parameter/StepGroupEditView.xaml

@@ -0,0 +1,196 @@
+<UserControl x:Class="MECF.Framework.UI.Client.CenterViews.Parameter.StepGroupEditView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:MECF.Framework.UI.Client.CenterViews.Parameter"
+             mc:Ignorable="d" 
+                xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
+                xmlns:cal="clr-namespace:Caliburn.Micro"
+             Height="768" Width="1024" Background="#DAE5F1">
+    <UserControl.Resources>
+        <Style BasedOn="{StaticResource ExModifyScrollBar}" TargetType="ScrollBar"/>
+    </UserControl.Resources>
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition></RowDefinition>
+            <RowDefinition Height="100"></RowDefinition>
+        </Grid.RowDefinitions>
+        <ListBox ItemsSource="{Binding StepIdList, UpdateSourceTrigger=PropertyChanged}">
+            <ListBox.ItemsPanel>
+                <ItemsPanelTemplate>
+                    <UniformGrid Columns="5" Rows="40"></UniformGrid>
+                </ItemsPanelTemplate>
+            </ListBox.ItemsPanel>
+            <ListBox.ItemTemplate>
+                <DataTemplate>
+                    <Border  BorderBrush="#ccc" BorderThickness="1" Margin="1">
+
+                        <CheckBox Foreground="#BFBFBF" Content="{Binding Display}" FontSize="20" Width="180" Margin="5,20,0,0"  IsChecked="{Binding IsExpanded, Mode=TwoWay, Delay=10}"  >
+                    
+                        <!--<CheckBox.Content>
+                            <Grid Margin="-5,2,0,0">
+                                <Grid.ColumnDefinitions>
+                                    <ColumnDefinition Width="Auto"/>
+                                    <ColumnDefinition Width="Auto"/>
+                                </Grid.ColumnDefinitions>
+                                <Border Grid.Column="0" HorizontalAlignment="Center"  Width="40">
+                                    <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
+                                </Border>
+                                <Label Tag="{Binding CurrentValue }"  HorizontalContentAlignment="Center" Grid.Column="1" Width="90" Content="{Binding CurrentValue}"  Height="30"  >
+                                </Label>
+                            </Grid>
+                        </CheckBox.Content>-->
+                        <CheckBox.Resources>
+                            <Style x:Key="FocusVisual">
+                                <Setter Property="Control.Template">
+                                    <Setter.Value>
+                                        <ControlTemplate>
+                                            <Rectangle SnapsToDevicePixels="true"
+                                   Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
+                                   StrokeDashArray="1 2"
+                                   StrokeThickness="1" />
+                                        </ControlTemplate>
+                                    </Setter.Value>
+                                </Setter>
+                            </Style>
+                            <SolidColorBrush x:Key="OptionMark.Static.Background" Color="#FFFFFFFF" />
+                            <SolidColorBrush x:Key="OptionMark.Static.Border" Color="#FF707070" />
+                            <Style x:Key="OptionMarkFocusVisual">
+                                <Setter Property="Control.Template">
+                                    <Setter.Value>
+                                        <ControlTemplate>
+                                            <Rectangle SnapsToDevicePixels="true"
+                                   Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
+                                   StrokeDashArray="1 2"
+                                   StrokeThickness="1" />
+                                        </ControlTemplate>
+                                    </Setter.Value>
+                                </Setter>
+                            </Style>
+
+                            <SolidColorBrush x:Key="OptionMark.MouseOver.Background" Color="#FFF3F9FF" />
+                            <SolidColorBrush x:Key="OptionMark.MouseOver.Border" Color="#FF5593FF" />
+                            <SolidColorBrush x:Key="OptionMark.MouseOver.Glyph" Color="#FF212121" />
+                            <SolidColorBrush x:Key="OptionMark.Disabled.Background" Color="#FFE6E6E6" />
+                            <SolidColorBrush x:Key="OptionMark.Disabled.Border" Color="#FFBCBCBC" />
+                            <SolidColorBrush x:Key="OptionMark.Disabled.Glyph" Color="#FF707070" />
+                            <SolidColorBrush x:Key="OptionMark.Pressed.Background" Color="#FFD9ECFF" />
+                            <SolidColorBrush x:Key="OptionMark.Pressed.Border" Color="#FF3C77DD" />
+                            <SolidColorBrush x:Key="OptionMark.Pressed.Glyph" Color="#FF212121" />
+                            <SolidColorBrush x:Key="OptionMark.Static.Glyph" Color="#FF212121" />
+
+                            <Style TargetType="{x:Type CheckBox}">
+                                <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}" />
+                                <Setter Property="Background" Value="{StaticResource OptionMark.Static.Background}" />
+                                <Setter Property="BorderBrush" Value="{StaticResource OptionMark.Static.Border}" />
+                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
+                                <Setter Property="BorderThickness" Value="1" />
+                                <Setter Property="Template">
+                                    <Setter.Value>
+                                        <ControlTemplate TargetType="{x:Type CheckBox}">
+                                            <Grid Background="Transparent" SnapsToDevicePixels="True">
+                                                <Grid.ColumnDefinitions>
+                                                    <ColumnDefinition Width="Auto" />
+                                                    <ColumnDefinition Width="*" />
+                                                </Grid.ColumnDefinitions>
+                                                <!-- Hide the default checkbox -->
+                                                <Border Visibility="Collapsed" 
+                                    x:Name="checkBoxBorder"
+                                    Margin="1"
+                                    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
+                                    Background="{TemplateBinding Background}"
+                                    BorderBrush="{TemplateBinding BorderBrush}"
+                                    BorderThickness="{TemplateBinding BorderThickness}">
+                                                    <Grid x:Name="markGrid" Width="27" Height="27">
+                                                        <Path x:Name="optionMark"
+                                          Margin="1"
+                                          Data="F1 M 9.97498,1.22334L 4.6983,9.09834L 4.52164,9.09834L 0,5.19331L 1.27664,3.52165L 4.255,6.08833L 8.33331,1.52588e-005L 9.97498,1.22334 Z "
+                                          Fill="{StaticResource OptionMark.Static.Glyph}"
+                                          Opacity="0"
+                                          Stretch="Uniform" />
+                                                        <Rectangle x:Name="indeterminateMark"
+                                               Margin="2"
+                                               Fill="{StaticResource OptionMark.Static.Glyph}"
+                                               Opacity="0" />
+                                                    </Grid>
+                                                </Border>
+                                                    <ContentPresenter x:Name="contentPresenter"
+  Grid.Column="1"
+  Margin="{TemplateBinding Padding}"
+  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
+  Focusable="False"
+  RecognizesAccessKey="True"
+  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
+                                            
+                                            </Grid>
+                                            <ControlTemplate.Triggers>
+                                                <Trigger Property="HasContent" Value="true">
+                                                    <Setter Property="FocusVisualStyle" Value="{StaticResource OptionMarkFocusVisual}" />
+                                                    <Setter Property="Padding" Value="4,-1,0,0" />
+                                                </Trigger>
+                                                <Trigger Property="IsMouseOver" Value="true">
+                                                    <Setter TargetName="checkBoxBorder" Property="Background" Value="{StaticResource OptionMark.MouseOver.Background}" />
+                                                    <Setter TargetName="checkBoxBorder" Property="BorderBrush" Value="{StaticResource OptionMark.MouseOver.Border}" />
+                                                    <Setter TargetName="optionMark" Property="Fill" Value="{StaticResource OptionMark.MouseOver.Glyph}" />
+                                                    <Setter TargetName="indeterminateMark" Property="Fill" Value="{StaticResource OptionMark.MouseOver.Glyph}" />
+                                                </Trigger>
+                                                <Trigger Property="IsEnabled" Value="false">
+                                                    <Setter TargetName="checkBoxBorder" Property="Background" Value="{StaticResource OptionMark.Disabled.Background}" />
+                                                    <Setter TargetName="checkBoxBorder" Property="BorderBrush" Value="{StaticResource OptionMark.Disabled.Border}" />
+                                                    <Setter TargetName="optionMark" Property="Fill" Value="{StaticResource OptionMark.Disabled.Glyph}" />
+                                                    <Setter TargetName="indeterminateMark" Property="Fill" Value="{StaticResource OptionMark.Disabled.Glyph}" />
+                                                </Trigger>
+                                                <Trigger Property="IsPressed" Value="true">
+                                                    <Setter TargetName="checkBoxBorder" Property="Background" Value="{StaticResource OptionMark.Pressed.Background}" />
+                                                    <Setter TargetName="checkBoxBorder" Property="BorderBrush" Value="{StaticResource OptionMark.Pressed.Border}" />
+                                                    <Setter TargetName="optionMark" Property="Fill" Value="{StaticResource OptionMark.Pressed.Glyph}" />
+                                                    <Setter TargetName="indeterminateMark" Property="Fill" Value="{StaticResource OptionMark.Pressed.Glyph}" />
+                                                </Trigger>
+                                                <Trigger Property="IsChecked" Value="true">
+                                                    <Setter TargetName="optionMark" Property="Opacity" Value="1" />
+                                                    <Setter TargetName="indeterminateMark" Property="Opacity" Value="0" />
+                                                    <!-- Highlight text when checked -->
+                                                    <Setter TargetName="contentPresenter" Property="TextBlock.Foreground" Value="Black" />
+                                                </Trigger>
+                                                <Trigger Property="IsChecked" Value="{x:Null}">
+                                                    <Setter TargetName="optionMark" Property="Opacity" Value="0" />
+                                                    <Setter TargetName="indeterminateMark" Property="Opacity" Value="1" />
+                                                </Trigger>
+                                            </ControlTemplate.Triggers>
+                                        </ControlTemplate>
+                                    </Setter.Value>
+                                </Setter>
+                            </Style>
+                        </CheckBox.Resources>
+               
+                  
+                    </CheckBox>
+                    </Border>
+
+                </DataTemplate>
+            </ListBox.ItemTemplate>
+        </ListBox>
+        <StackPanel Grid.Row="1" HorizontalAlignment="Center" Orientation="Horizontal">
+         
+            <Button Width="100" Height="50" Margin="0,0,20,0"   Content="Save"  >
+                <i:Interaction.Triggers>
+                    <i:EventTrigger EventName="Click">
+                        <cal:ActionMessage MethodName="Save">
+                        </cal:ActionMessage>
+                    </i:EventTrigger>
+                </i:Interaction.Triggers>
+            </Button>
+            <Button  Width="100" Height="50"   Content="Cancle"  >
+                <i:Interaction.Triggers>
+                    <i:EventTrigger EventName="Click">
+                        <cal:ActionMessage MethodName="Cancle">
+                        </cal:ActionMessage>
+                    </i:EventTrigger>
+                </i:Interaction.Triggers>
+            </Button>
+        </StackPanel>
+    </Grid>
+</UserControl>

+ 28 - 0
FrameworkLocal/UIClient/CenterViews/Parameter/StepGroupEditView.xaml.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace MECF.Framework.UI.Client.CenterViews.Parameter
+{
+    /// <summary>
+    /// StepGroupEditView.xaml 的交互逻辑
+    /// </summary>
+    public partial class StepGroupEditView : UserControl
+    {
+        public StepGroupEditView()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 82 - 0
FrameworkLocal/UIClient/CenterViews/Parameter/StepGroupEditViewModel.cs

@@ -0,0 +1,82 @@
+using MECF.Framework.Common.DataCenter;
+using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig;
+using MECF.Framework.UI.Client.ClientBase;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace MECF.Framework.UI.Client.CenterViews.Parameter
+{
+    public class StepGroupEditViewModel : ModuleUiViewModelBase
+    {
+        private List<ConfigItem> _stepIdList = new List<ConfigItem>();
+
+        public List<ConfigItem> StepIdList
+        {
+            get => _stepIdList;
+            set
+            {
+                _stepIdList = value;
+                NotifyOfPropertyChange(nameof(StepIdList));
+            }
+        }
+        public string StepGroupName = "Group1";
+        public string SelectStepIDStr = "";
+
+        private ConfigNode _rootNode;
+        public void Save()
+        {
+            ((Window)GetView()).DialogResult = true;
+        }
+        public void Cancle()
+        {
+            (GetView() as Window).Close();
+        }
+
+        protected override void OnInitialize()
+        {
+            base.OnInitialize();
+            this.SystemName = "System";
+            _rootNode = SystemConfigProvider.Instance.GetConfig(true);
+
+            var stepNameNode = FindNodeByName(_rootNode, $"PM1.RecipeEditParameter.StepName");
+            if (stepNameNode != null && stepNameNode.Items.Count > 0)
+            {
+                var datas = QueryDataClient.Instance.Service.PollConfig(stepNameNode.Items.Select(a => $"{a.Path}.{a.Name}").ToList());
+                foreach (var item in stepNameNode.Items)
+                {
+                    var key = $"{item.Path}.{item.Name}";
+                    datas.TryGetValue(key,out var value);
+                    item.CurrentValue = (string)value;
+                    item.Display = $"{item.Name}:{item.CurrentValue}";
+                    StepIdList.Add(item);
+                }
+            }
+        }
+        protected override void OnActivate()
+        {
+            base.OnActivate();
+            var gropuDataStr = (string)QueryDataClient.Instance.Service.GetConfig($"PM1.RecipeEditParameter.StepGroup.{StepGroupName}");
+            if (!string.IsNullOrEmpty(gropuDataStr))
+            {
+                foreach (var item in gropuDataStr.Split(',').ToList())
+                {
+                    StepIdList.Where(a => a.Name == item).FirstOrDefault().IsExpanded = true;
+                }
+
+            }
+        }
+        private ConfigNode FindNodeByName(ConfigNode parentNode, string strName)
+        {
+            string strCates = strName.Split('.')[0];
+            ConfigNode node = parentNode.SubNodes.Find((x) => x.Name == strCates);
+            if (node == null)
+                return parentNode;
+            else
+                return FindNodeByName(node, strName.Replace(strCates + ".", ""));
+        }
+    }
+}

+ 8 - 0
FrameworkLocal/UIClient/UIClient.csproj

@@ -405,6 +405,10 @@
     <Compile Include="CenterViews\Parameter\MainParameterEditViewModel.cs" />
     <Compile Include="CenterViews\Parameter\ParameterDataBase.cs" />
     <Compile Include="CenterViews\Parameter\ParameterProvider.cs" />
+    <Compile Include="CenterViews\Parameter\StepGroupEditView.xaml.cs">
+      <DependentUpon>StepGroupEditView.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="CenterViews\Parameter\StepGroupEditViewModel.cs" />
     <Compile Include="CenterViews\Parameter\TempAutoPIDParameterData.cs" />
     <Compile Include="CenterViews\Parameter\TempAutoPIDTable.cs" />
     <Compile Include="CenterViews\Parameter\TempCorrectionParameterData.cs" />
@@ -1230,6 +1234,10 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="CenterViews\Parameter\StepGroupEditView.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="ClientBase\UserControls\BusyIndicator.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>

+ 1 - 0
Furnace/FurnaceRT/Config/DBModel.sql

@@ -505,6 +505,7 @@ begin
                       "addition_information_name" text,
                       "addition_information_display" text,
                       "association_process_recipeName" text,
+                      "addition_information_display_supplement" text,
 					  CONSTRAINT "schedule_maintenance_pkey" PRIMARY KEY ("maintenance_item" )
 					)
 					WITH (

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

@@ -9568,6 +9568,16 @@
     <ECID id="3312250010" valueType="Ascii" logicalName="PM1.N2Purge.ResetAll.ValveSV531" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
     <ECID id="3312250011" valueType="Ascii" logicalName="PM1.N2Purge.ResetAll.ValveSV532" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
     <ECID id="3312260001" valueType="Ascii" logicalName="PM1.N2Purge.WaferCooling.FoupInhibitEnable" value="" min="" max="" eventTrigger="" units="" description="Foup Inhibit Enable When Wafer Cooling" isArray="false" />
+    <ECID id="3312270001" valueType="Ascii" logicalName="PM1.RecipeEditParameter.StepGroup.Group1" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
+    <ECID id="3312270002" valueType="Ascii" logicalName="PM1.RecipeEditParameter.StepGroup.Group10" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
+    <ECID id="3312270003" valueType="Ascii" logicalName="PM1.RecipeEditParameter.StepGroup.Group2" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
+    <ECID id="3312270004" valueType="Ascii" logicalName="PM1.RecipeEditParameter.StepGroup.Group3" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
+    <ECID id="3312270005" valueType="Ascii" logicalName="PM1.RecipeEditParameter.StepGroup.Group4" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
+    <ECID id="3312270006" valueType="Ascii" logicalName="PM1.RecipeEditParameter.StepGroup.Group5" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
+    <ECID id="3312270007" valueType="Ascii" logicalName="PM1.RecipeEditParameter.StepGroup.Group6" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
+    <ECID id="3312270008" valueType="Ascii" logicalName="PM1.RecipeEditParameter.StepGroup.Group7" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
+    <ECID id="3312270009" valueType="Ascii" logicalName="PM1.RecipeEditParameter.StepGroup.Group8" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
+    <ECID id="3312270010" valueType="Ascii" logicalName="PM1.RecipeEditParameter.StepGroup.Group9" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
   </EquipmentConstants>
   <DataVariables>
     <DVID id="3003" valueType="Ascii" logicalName="PPChangeName" value="" eventTrigger="" description="Recipe change name(RCPID)" isArray="false" />

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

@@ -8529,6 +8529,18 @@
 					</configs>
 				</configs>
 			</configs>
+			<configs name="StepGroup">
+				<config default="" name="Group1" description="" max="" min="" paramter="" tag="" unit="" type="String" />
+				<config default="" name="Group2" description="" max="" min="" paramter="" tag="" unit="" type="String" />
+				<config default="" name="Group3" description="" max="" min="" paramter="" tag="" unit="" type="String" />
+				<config default="" name="Group4" description="" max="" min="" paramter="" tag="" unit="" type="String" />
+				<config default="" name="Group5" description="" max="" min="" paramter="" tag="" unit="" type="String" />
+				<config default="" name="Group6" description="" max="" min="" paramter="" tag="" unit="" type="String" />
+				<config default="" name="Group7" description="" max="" min="" paramter="" tag="" unit="" type="String" />
+				<config default="" name="Group8" description="" max="" min="" paramter="" tag="" unit="" type="String" />
+				<config default="" name="Group9" description="" max="" min="" paramter="" tag="" unit="" type="String" />
+				<config default="" name="Group10" description="" max="" min="" paramter="" tag="" unit="" type="String" />
+			</configs>
 			<configs name="StepName">
 				<config default="" name="1" description="" max="" min="" paramter="" tag="" unit="" type="String" />
 				<config default="" name="2" description="" max="" min="" paramter="" tag="" unit="" type="String" />

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


+ 0 - 1
Furnace/FurnaceRT/Equipments/PMs/PMModule.cs

@@ -255,7 +255,6 @@ namespace FurnaceRT.Equipments.PMs
 
             InitAlarmConditionChecker();
 
-
             Singleton<EventManager>.Instance.OnAlarmEvent += Instance_OnAlarmEvent;
             ToolType = SC.GetStringValue("System.SetUp.ToolType");
             return base.Initialize();

+ 6 - 0
Furnace/FurnaceRT/FurnaceRT.csproj

@@ -76,6 +76,9 @@
     <Reference Include="Microsoft.DwayneNeed">
       <HintPath>..\..\ThirdParty\dlls\Microsoft.DwayneNeed.dll</HintPath>
     </Reference>
+    <Reference Include="RTCommunicatorSingalR">
+      <HintPath>..\..\ThirdParty\Mini8Communicator\RTCommunicatorSingalR.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Configuration" />
     <Reference Include="System.Data" />
@@ -593,6 +596,9 @@
   <ItemGroup>
     <Folder Include="Config\BackUp\" />
   </ItemGroup>
+  <ItemGroup>
+    <WCFMetadata Include="Connected Services\" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <PostBuildEvent>REM 输出到安装目录,供安装打包使用

+ 8 - 0
Furnace/FurnaceUI/FurnaceUI.csproj

@@ -1126,6 +1126,10 @@
     </Compile>
     <Compile Include="Views\Scheduled\ScheduledMaitViewModel.cs" />
     <Compile Include="Views\Scheduled\ScheduledSCValue.cs" />
+    <Compile Include="Views\Scheduled\StepGroupSelectView.xaml.cs">
+      <DependentUpon>StepGroupSelectView.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Views\Scheduled\StepGroupSelectViewModel.cs" />
     <Compile Include="Views\Status\CarrierStateView.xaml.cs">
       <DependentUpon>CarrierStateView.xaml</DependentUpon>
     </Compile>
@@ -2066,6 +2070,10 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="Views\Scheduled\StepGroupSelectView.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Views\Status\CarrierStateView.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 6 - 3
Furnace/FurnaceUI/Views/Editors/RecipeStepNameView.xaml

@@ -6,7 +6,10 @@
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:cal="http://www.caliburn.org"
              mc:Ignorable="d" 
-             Height="720" Width="1000" FontFamily="Segoe" >
+             Height="768" Width="1024" FontFamily="Segoe" >
+    <UserControl.Resources>
+        <Style BasedOn="{StaticResource ExModifyScrollBar}" TargetType="ScrollBar"/>
+    </UserControl.Resources>
     <Grid>
         <Grid.RowDefinitions>
             <!--<RowDefinition Height="100"/>-->
@@ -14,7 +17,7 @@
             <RowDefinition Height="80"/>
         </Grid.RowDefinitions>
 
-        <ListBox ItemsSource="{Binding Steps}" Width="980" Height="600">
+        <ListBox ItemsSource="{Binding Steps}" Width="1024" Height="700">
             <ListBox.ItemsPanel>
                 <ItemsPanelTemplate>
                     <UniformGrid Columns="10"/>
@@ -22,7 +25,7 @@
             </ListBox.ItemsPanel>
             <ListBox.ItemTemplate>
                 <DataTemplate>
-                    <RadioButton GroupName="groupName" IsChecked="{Binding IsChecked}" Content="{Binding Name}" Width="90">
+                    <RadioButton GroupName="groupName" IsChecked="{Binding IsChecked}" Content="{Binding Name}" Width="90" Height="45" Margin="2">
                         <i:Interaction.Triggers>
                             <i:EventTrigger EventName="Click">
                                 <cal:ActionMessage MethodName="Select">

+ 25 - 5
Furnace/FurnaceUI/Views/Editors/RecipeStepNameViewModel.cs

@@ -14,6 +14,12 @@ namespace FurnaceUI.Views.Editors
     {
         public class StepInfo : PropertyChangedBase
         {
+            private string _number;
+            public string Number
+            {
+                get { return _number; }
+                set { _number = value; this.NotifyOfPropertyChange(nameof(Number)); }
+            }
             private string _Name;
             public string Name
             {
@@ -29,11 +35,12 @@ namespace FurnaceUI.Views.Editors
             }
         }
 
-        public ObservableCollection<StepInfo> Steps { get; set; }=new ObservableCollection<StepInfo>();
+        public ObservableCollection<StepInfo> Steps { get; set; } = new ObservableCollection<StepInfo>();
 
         public bool IsEnable => CGlobal.RecipeProcessEditViewEnable;//是否是View模式
 
         public string SelectedStepName { get; set; }
+        public bool CheckNumber { get; set; } = false;
         private ConfigNode _configNode;
 
         public ConfigNode ConfigNode
@@ -54,13 +61,26 @@ namespace FurnaceUI.Views.Editors
             }
             for (int i = 0; i < ConfigNode.Items.Count; i++)
             {
-                Steps.Add(new StepInfo() { Name = $"{i + 1}:{ConfigNode.Items[i].CurrentValue}" });
+                Steps.Add(new StepInfo() { Number = ConfigNode.Items[i].Name, Name = $"{i + 1}:{ConfigNode.Items[i].CurrentValue}" });
             }
-            var step = Steps.FirstOrDefault(x => x.Name == SelectedStepName);
-            if (step != null)
+            if (CheckNumber)
             {
-                step.IsChecked = true;
+                var step = Steps.FirstOrDefault(x => x.Number == SelectedStepName);
+                if (step != null)
+                {
+                    step.IsChecked = true;
+                }
             }
+            else
+            {
+
+                var step = Steps.FirstOrDefault(x => x.Name == SelectedStepName);
+                if (step != null)
+                {
+                    step.IsChecked = true;
+                }
+            }
+
         }
 
         private ConfigNode FindNodeByName(ConfigNode parentNode, string strName)

+ 1 - 0
Furnace/FurnaceUI/Views/Operations/TransferMain/SelfCheckViewModel.cs

@@ -20,6 +20,7 @@ using FurnaceUI.Views.Maintenances;
 
 namespace FurnaceUI.Views.Operations
 {
+    
     public class SelfCheckViewModel : FurnaceUIViewModelBase
     {
 

+ 1 - 1
Furnace/FurnaceUI/Views/Parameter/N2PurgeEditView.xaml

@@ -9,7 +9,7 @@
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     xmlns:parameter="clr-namespace:MECF.Framework.UI.Client.CenterViews.Parameter;assembly=MECF.Framework.UI.Client"
     Name="userCnt"
-      xmlns:oxy="http://oxyplot.org/wpf"
+   
     d:DesignHeight="1200"
     d:DesignWidth="1900"
     mc:Ignorable="d">

+ 62 - 6
Furnace/FurnaceUI/Views/Scheduled/ScheduledMaintenanceMonitorView.xaml

@@ -123,6 +123,58 @@
                                         <!--<Button Content="Step Group Registration" />-->
                                     </StackPanel>
                                 </DataTemplate>
+                                <DataTemplate x:Key="ReactorRecipeDataTemplate">
+                                    <StackPanel Height="40" Orientation="Horizontal">
+                                        <TextBlock  MinWidth="110"  Margin="5,0" HorizontalAlignment="Right" VerticalAlignment="Center" >
+                                            <Run Text="{Binding DataContext.EditModel.AdditionInformationName, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}"></Run>                                            <Run>:</Run>
+                                        </TextBlock>
+                                        <Button    Width="300" Content="{Binding DataContext.EditModel.AdditionInformationDisplay, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}">
+                                            <i:Interaction.Triggers>
+                                                <i:EventTrigger EventName="Click">
+                                                    <cal:ActionMessage MethodName="SelectProcessRecipe">
+                                                        <cal:Parameter Value="AdditionInformationDisplay"/>
+                                                    </cal:ActionMessage>
+                                                </i:EventTrigger>
+                                            </i:Interaction.Triggers>
+                                        </Button>
+                                    </StackPanel>
+                                </DataTemplate> 
+                                <DataTemplate x:Key="ReactorStepRunDataTemplate">
+                                    <StackPanel Height="40" Orientation="Horizontal">
+                                        <TextBlock  MinWidth="110"  Margin="5,0" HorizontalAlignment="Right" VerticalAlignment="Center" >
+             <Run Text="{Binding DataContext.EditModel.AdditionInformationName, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}"></Run>                                            <Run>:</Run>
+                                        </TextBlock>
+                                        <Button    Width="120" >
+                                            <Button.Content>
+                                                <StackPanel Orientation="Horizontal">
+                                                    <TextBlock Text="{Binding DataContext.EditModel.AdditionInformationDisplay, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}"></TextBlock>
+                                                    <TextBlock Text="{Binding DataContext.SelectStepIdName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}"></TextBlock>
+                                                </StackPanel>
+                                            </Button.Content>
+                                            <i:Interaction.Triggers>
+                                                <i:EventTrigger EventName="Click">
+                                                    <cal:ActionMessage MethodName="SelectStepIDMethod">
+                                                    </cal:ActionMessage>
+                                                </i:EventTrigger>
+                                            </i:Interaction.Triggers>
+                                        </Button>
+                                    </StackPanel>
+                                </DataTemplate>
+                                <DataTemplate x:Key="ReactorStepThicknessDataTemplate">
+                                    <StackPanel Height="40" Orientation="Horizontal">
+                                        <TextBlock  MinWidth="110"  Margin="5,0" HorizontalAlignment="Right" VerticalAlignment="Center" >
+<Run Text="{Binding DataContext.EditModel.AdditionInformationName, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}"></Run>                                            <Run>:</Run>
+                                        </TextBlock>
+                                        <Button    Width="120" Content="{Binding DataContext.EditModel.AdditionInformationDisplay, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}">
+                                            <i:Interaction.Triggers>
+                                                <i:EventTrigger EventName="Click">
+                                                    <cal:ActionMessage MethodName="SelectStepGroupMethod">
+                                                    </cal:ActionMessage>
+                                                </i:EventTrigger>
+                                            </i:Interaction.Triggers>
+                                        </Button>
+                                    </StackPanel>
+                                </DataTemplate>
                             </ContentControl.Resources>
                             <ContentControl.Style>
                                 <Style TargetType="ContentControl">
@@ -134,10 +186,10 @@
                                         <MultiDataTrigger>
                                             <MultiDataTrigger.Conditions>
                                                 <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Reactor}" />
-                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static local:ReactorsEnum.StepThickness}" />
+                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static local:ReactorsEnum.Recipe}" />
                                             </MultiDataTrigger.Conditions>
                                             <MultiDataTrigger.Setters>
-                                                <Setter Property="ContentTemplate" Value="{StaticResource ReactorGroupDataTemplate}" />
+                                                <Setter Property="ContentTemplate" Value="{StaticResource ReactorRecipeDataTemplate}" />
                                             </MultiDataTrigger.Setters>
                                         </MultiDataTrigger>
                                         <MultiDataTrigger>
@@ -146,7 +198,7 @@
                                                 <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static local:ReactorsEnum.StepRunTime}" />
                                             </MultiDataTrigger.Conditions>
                                             <MultiDataTrigger.Setters>
-                                                <Setter Property="ContentTemplate" Value="{StaticResource ReactorGroupDataTemplate}" />
+                                                <Setter Property="ContentTemplate" Value="{StaticResource ReactorStepRunDataTemplate}" />
                                             </MultiDataTrigger.Setters>
                                         </MultiDataTrigger>
                                         <MultiDataTrigger>
@@ -155,16 +207,16 @@
                                                 <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static local:ReactorsEnum.StepRunFreq}" />
                                             </MultiDataTrigger.Conditions>
                                             <MultiDataTrigger.Setters>
-                                                <Setter Property="ContentTemplate" Value="{StaticResource CommonDataTemplate}" />
+                                                <Setter Property="ContentTemplate" Value="{StaticResource ReactorStepRunDataTemplate}" />
                                             </MultiDataTrigger.Setters>
                                         </MultiDataTrigger>
                                         <MultiDataTrigger>
                                             <MultiDataTrigger.Conditions>
                                                 <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Reactor}" />
-                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static local:ReactorsEnum.StepRunTime}" />
+                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static local:ReactorsEnum.StepThickness}" />
                                             </MultiDataTrigger.Conditions>
                                             <MultiDataTrigger.Setters>
-                                                <Setter Property="ContentTemplate" Value="{StaticResource CommonDataTemplate}" />
+                                                <Setter Property="ContentTemplate" Value="{StaticResource ReactorStepThicknessDataTemplate}" />
                                             </MultiDataTrigger.Setters>
                                         </MultiDataTrigger>
                                     </Style.Triggers>
@@ -202,6 +254,7 @@
                     Margin="5,0"
                     FontSize="20"
                     IsEnabled="{Binding IsEnable}"
+                      Tag="Number"
                     Text="{Binding EditModel.CurrentValue, StringFormat={}{0:000.000}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
                 <TextBox
                     Grid.Column="2"
@@ -333,6 +386,7 @@
                     Height="40"
                     Margin="5,0"
                     FontSize="20"
+                      Tag="Number"
                     Text="{Binding EditModel.StartValue, StringFormat={}{0:000.000}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
 
                 <ComboBox x:Name="cbPickModulesCassetteRobot" Grid.Row="1"
@@ -344,6 +398,7 @@ FontSize="20" ItemsSource="{Binding MaintenanceProcessingList}"  SelectedItem="{
                     <i:Interaction.Triggers>
                         <i:EventTrigger EventName="Click">
                             <cal:ActionMessage MethodName="SelectProcessRecipe">
+                                <cal:Parameter Value="AssociationProcessRecipeName"/>
                             </cal:ActionMessage>
                         </i:EventTrigger>
                     </i:Interaction.Triggers>
@@ -394,6 +449,7 @@ FontSize="20" ItemsSource="{Binding MaintenanceProcessingList}"  SelectedItem="{
                     Height="40"
                     Margin="5,0"
                     FontSize="20"
+                    Tag="Number"
                     Text="{Binding EditModel.LimitValue, StringFormat={}{0:000.000}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
                 <TextBox
                     Grid.Column="2"

+ 129 - 4
Furnace/FurnaceUI/Views/Scheduled/ScheduledMaintenanceMonitorViewModel.cs

@@ -1,16 +1,23 @@
 using Aitex.Core.Util;
 using Aitex.Core.Utilities;
 using Caliburn.Micro;
+using Caliburn.Micro.Core;
+using ExcelLibrary.BinaryFileFormat;
 using FurnaceUI.Models;
+using FurnaceUI.Views.Scheduled;
 using MECF.Framework.Common.CommonData.EnumData;
 using MECF.Framework.Common.DataCenter;
 using MECF.Framework.Common.Utilities;
 using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
 using MECF.Framework.UI.Client.CenterViews.Editors.Sequence;
+using OpenSEMI.ClientBase;
+using SciChart.Core.Extensions;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Data;
+using System.Linq;
 using System.Windows.Documents;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;
 
 namespace FurnaceUI.Views.Editors
 {
@@ -44,7 +51,17 @@ namespace FurnaceUI.Views.Editors
             }
         }
 
-  
+        private string _selectStepIdName = string.Empty;
+
+        public string SelectStepIdName
+        {
+            get => _selectStepIdName;
+            set
+            {
+                _selectStepIdName = value;
+                NotifyOfPropertyChange("SelectStepIdName");
+            }
+        }
 
         private List<string> _maintenanceProcessingList = new List<string>();
 
@@ -102,7 +119,109 @@ namespace FurnaceUI.Views.Editors
             }
 
         }
-        public void SelectProcessRecipe()
+
+
+        protected override void OnViewLoaded(object view)
+        {
+            base.OnViewLoaded(view);
+            var isReator = EditModel.DataItemType == DataItemEnum.Reactor;
+            if (isReator && (EditModel.ReactorsType == ReactorsEnum.StepRunTime || EditModel.ReactorsType == ReactorsEnum.StepRunFreq) && !string.IsNullOrEmpty(EditModel.AdditionInformationDisplay))
+            {
+                SelectStepIdName = $":{(string)QueryDataClient.Instance.Service.GetConfig($"PM1.RecipeEditParameter.StepName.{EditModel.AdditionInformationDisplay}")}";
+
+            }
+            if (isReator && EditModel.ReactorsType == ReactorsEnum.StepThickness)
+            {
+                CompareConfigurations();
+            }
+
+
+        }
+
+        public void SelectStepIDMethod()
+        {
+            var windowManager = IoC.Get<IWindowManager>();
+            RecipeStepNameViewModel recipeStepNameViewModel = new RecipeStepNameViewModel() { CheckNumber = true, SelectedStepName = EditModel.AdditionInformationDisplay };
+
+            if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(recipeStepNameViewModel, null, "Select Step ID"))
+            {
+                var strs = recipeStepNameViewModel.SelectedStepName.Split(':');
+                EditModel.AdditionInformationDisplay = strs.FirstOrDefault();
+                if (strs.Length > 1)
+                {
+                    SelectStepIdName =$":{strs.LastOrDefault()}";
+
+                }
+
+
+
+            }
+
+        }
+        private void CompareConfigurations()
+        {
+            var groupValue = (string)QueryDataClient.Instance.Service.GetConfig($"PM1.RecipeEditParameter.StepGroup.{EditModel.AdditionInformationDisplay}");
+
+            if (!string.IsNullOrEmpty(EditModel.AdditionInformationDisplaySupplement))
+            {
+                if (string.IsNullOrEmpty(groupValue))
+                {
+                    DialogBox.ShowWarning($"The selected {EditModel.AdditionInformationDisplay} does not match the  Config {EditModel.AdditionInformationDisplay}. Please confirm!");
+                }
+                else
+                {
+                    var oldDatas = EditModel.AdditionInformationDisplaySupplement.Split(',').ToList();
+                    var newDatas = groupValue.Split(',').ToList();
+                    // 判断 oldDatas 中有但 newDatas 中没有的元素
+                    var differenceOldToNew = oldDatas.Except(newDatas).ToList();
+
+                    // 判断 newDatas 中有但 oldDatas 中没有的元素
+                    var differenceNewToOld = newDatas.Except(oldDatas).ToList();
+
+                    // 检查是否存在差集
+                    bool hasDifference = differenceOldToNew.Any() || differenceNewToOld.Any();
+
+                    if (hasDifference)
+                    {
+                        DialogBox.ShowWarning($"The selected {EditModel.AdditionInformationDisplay} does not match the  Config {EditModel.AdditionInformationDisplay}. Please confirm!");
+
+                    }
+                }
+            }
+            else
+            {
+                if (!string.IsNullOrEmpty(groupValue))
+                {
+                    DialogBox.ShowWarning($"The selected {EditModel.AdditionInformationDisplay} does not match the  Config {EditModel.AdditionInformationDisplay}. Please confirm!");
+                }
+
+            }
+        }
+        public void SelectStepGroupMethod()
+        {
+            var windowManager = IoC.Get<IWindowManager>();
+            StepGroupSelectViewModel recipeStepNameViewModel = new StepGroupSelectViewModel() { SelectedGroupName = EditModel.AdditionInformationDisplay };
+            if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(recipeStepNameViewModel, null, "Select Step Group"))
+            {
+                EditModel.AdditionInformationDisplay = recipeStepNameViewModel.SelectedGroupName;
+
+                var gropuDataStr = (string)QueryDataClient.Instance.Service.GetConfig($"PM1.RecipeEditParameter.StepGroup.{recipeStepNameViewModel.SelectedGroupName}");
+                if (!string.IsNullOrEmpty(gropuDataStr))
+                {
+                    var datas = QueryDataClient.Instance.Service.PollConfig(gropuDataStr.Split(',').ToList().Select(a => $"PM1.RecipeEditParameter.StepName.{a}"));
+                    var recipeNames = datas.Select(a => $"{a.Key.Split('.').LastOrDefault()}");
+                    EditModel.AdditionInformationDisplaySupplement = string.Join(",", recipeNames);
+                }
+                else
+                {
+                    EditModel.AdditionInformationDisplaySupplement = "";
+                }
+
+            }
+
+
+        }
+        public void SelectProcessRecipe(string value)
         {
             RecipeSelectDialogViewModel dialog = new RecipeSelectDialogViewModel();
             dialog.DisplayName = "Select Recipe";
@@ -132,8 +251,14 @@ namespace FurnaceUI.Views.Editors
             bool? bret = wm.ShowDialog(dialog);
             if ((bool)bret)
             {
-
-                EditModel.AssociationProcessRecipeName = dialog.DialogResult;
+                if (value == "AssociationProcessRecipeName")
+                {
+                    EditModel.AssociationProcessRecipeName = dialog.DialogResult;
+                }
+                if (value == "AdditionInformationDisplay")
+                {
+                    EditModel.AdditionInformationDisplay = dialog.DialogResult;
+                }
             }
         }
         #region 方法 ClearCurrentValue

+ 19 - 4
Furnace/FurnaceUI/Views/Scheduled/ScheduledMaitViewModel.cs

@@ -147,10 +147,13 @@ namespace FurnaceUI.Views.Editors
                     if (rtn == true)
                     {
 
-                        if (!string.IsNullOrEmpty(scheduledMaintenanceMonitorViewModel.EditModel.AdditionInformationDisplay) && selectedItem.AdditionInformationDisplay != scheduledMaintenanceMonitorViewModel.EditModel.AdditionInformationDisplay)
+                        var isModifyAdditionInformationDisplay = !string.IsNullOrEmpty(scheduledMaintenanceMonitorViewModel.EditModel.AdditionInformationDisplay) && selectedItem.AdditionInformationDisplay != scheduledMaintenanceMonitorViewModel.EditModel.AdditionInformationDisplay;
+                        var isModifyAdditionInformationDisplaySupplement =  selectedItem.AdditionInformationDisplaySupplement != scheduledMaintenanceMonitorViewModel.EditModel.AdditionInformationDisplaySupplement;
+                        if (isModifyAdditionInformationDisplay|| isModifyAdditionInformationDisplaySupplement)
                         {
                             selectedItem.AdditionInformationDisplay = scheduledMaintenanceMonitorViewModel.EditModel.AdditionInformationDisplay;
-                            InvokeClient.Instance.Service.DoOperation("System.ScheduleMaintenance.SetAdditionInformationDisplayName", selectedItem.Item, selectedItem.AdditionInformationDisplay);
+                            selectedItem.AdditionInformationDisplaySupplement = scheduledMaintenanceMonitorViewModel.EditModel.AdditionInformationDisplaySupplement;
+                            InvokeClient.Instance.Service.DoOperation("System.ScheduleMaintenance.SetAdditionInformationDisplayName", selectedItem.Item, selectedItem.AdditionInformationDisplay, selectedItem.AdditionInformationDisplaySupplement);
                         }
 
                         if (selectedItem.CurrentValue != scheduledMaintenanceMonitorViewModel.EditModel.CurrentValue)
@@ -217,7 +220,7 @@ namespace FurnaceUI.Views.Editors
         /// </summary>
         private void LoadData()
         {
-            string sql = $"select * from \"schedule_maintenance\"";
+            string sql = $"select * from \"schedule_maintenance\" ORDER BY  \"maintenance_item\"";
 
             DataTable dt = QueryDataClient.Instance.Service.QueryData(sql);
 
@@ -233,6 +236,7 @@ namespace FurnaceUI.Views.Editors
                 item.AdditionInformationName = dt.Rows[i]["addition_information_name"].ToString();
                 item.AdditionInformationDisplay = dt.Rows[i]["addition_information_display"].ToString();
                 item.AssociationProcessRecipeName = dt.Rows[i]["association_process_recipeName"].ToString();
+                item.AdditionInformationDisplaySupplement = dt.Rows[i]["addition_information_display_supplement"].ToString();
                 if (float.TryParse(dt.Rows[i]["current_value"].ToString(), out float value))
                     item.CurrentValue = value;
                 if (float.TryParse(dt.Rows[i]["scheduling_start_value"].ToString(), out value))
@@ -460,6 +464,8 @@ namespace FurnaceUI.Views.Editors
         }
         private float _limitValue;
 
+
+
         public string AssociationProcessRecipeName
         {
             get { return _associationProcessRecipeName; }
@@ -498,7 +504,16 @@ namespace FurnaceUI.Views.Editors
         public string Path { get; set; }
         public string AdditionInformationName { get; set; }
 
-
+        public string AdditionInformationDisplaySupplement
+        {
+            get { return _additionInformationDisplaySupplement; }
+            set
+            {
+                _additionInformationDisplaySupplement = value;
+                InvokePropertyChanged("AdditionInformationDisplaySupplement");
+            }
+        }
+        private string _additionInformationDisplaySupplement = "";
         public string AdditionInformationDisplay
         {
             get { return _additionInformationDisplay; }

+ 37 - 0
Furnace/FurnaceUI/Views/Scheduled/StepGroupSelectView.xaml

@@ -0,0 +1,37 @@
+<UserControl x:Class="FurnaceUI.Views.Scheduled.StepGroupSelectView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:FurnaceUI.Views.Scheduled"
+             mc:Ignorable="d" 
+                    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:cal="http://www.caliburn.org"
+            Height="300" Width="600">
+    
+    
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition></RowDefinition>
+        </Grid.RowDefinitions>
+        <ListBox ItemsSource="{Binding CurrentNode.Items}">
+            <ListBox.ItemsPanel>
+                <ItemsPanelTemplate>
+                    <UniformGrid Columns="5" Rows="2"></UniformGrid>
+                </ItemsPanelTemplate>
+            </ListBox.ItemsPanel>
+            <ListBox.ItemTemplate>
+                <DataTemplate>
+                    <RadioButton Margin="5"  Width="95" Height="100" Content="{Binding Name}"  IsChecked="{Binding IsExpanded}">
+                        <i:Interaction.Triggers>
+                            <i:EventTrigger EventName="Click">
+                                <cal:ActionMessage MethodName="StepGroupEdit">
+                                    <cal:Parameter Value="{Binding Name}"/>
+                                </cal:ActionMessage>
+                            </i:EventTrigger>
+                        </i:Interaction.Triggers>
+                    </RadioButton>
+                </DataTemplate>
+            </ListBox.ItemTemplate>
+        </ListBox>
+    </Grid>
+</UserControl>

+ 28 - 0
Furnace/FurnaceUI/Views/Scheduled/StepGroupSelectView.xaml.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace FurnaceUI.Views.Scheduled
+{
+    /// <summary>
+    /// StepGroupSelectView.xaml 的交互逻辑
+    /// </summary>
+    public partial class StepGroupSelectView : UserControl
+    {
+        public StepGroupSelectView()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 63 - 0
Furnace/FurnaceUI/Views/Scheduled/StepGroupSelectViewModel.cs

@@ -0,0 +1,63 @@
+using FurnaceUI.Models;
+using MECF.Framework.Common.DataCenter;
+using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig;
+using MECF.Framework.UI.Client.CenterViews.Editors;
+using MECF.Framework.UI.Client.ClientBase;
+using OpenSEMI.ClientBase;
+using RecipeEditorLib.RecipeModel.Params;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace FurnaceUI.Views.Scheduled
+{
+    public class StepGroupSelectViewModel : FurnaceUIViewModelBase
+    {
+        public string SelectedGroupName = string.Empty;
+        private ConfigNode _currentNode;
+
+        public ConfigNode CurrentNode
+        {
+            get { return _currentNode; }
+            set { _currentNode = value; this.NotifyOfPropertyChange(nameof(CurrentNode)); }
+        }
+        private ConfigNode _rootNode;
+        protected override void OnInitialize()
+        {
+            base.OnInitialize();
+            this.SystemName = "System";
+            _rootNode = SystemConfigProvider.Instance.GetConfig(true);
+            CurrentNode = FindNodeByName(_rootNode, $"PM1.RecipeEditParameter.StepGroup");
+            if (CurrentNode != null && CurrentNode.Items != null)
+            {
+                foreach (var item in CurrentNode.Items)
+                {
+                    item.IsExpanded = false;
+                    if (item.Name == SelectedGroupName)
+                    {
+                        item.IsExpanded = true;
+                    }
+                }
+            }
+        }
+     
+        private ConfigNode FindNodeByName(ConfigNode parentNode, string strName)
+        {
+            string strCates = strName.Split('.')[0];
+            ConfigNode node = parentNode.SubNodes.Find((x) => x.Name == strCates);
+            if (node == null)
+                return parentNode;
+            else
+                return FindNodeByName(node, strName.Replace(strCates + ".", ""));
+        }
+        public void StepGroupEdit(string groupName)
+        {
+            SelectedGroupName = groupName;
+            ((Window)GetView()).DialogResult = true;
+
+        }
+    }
+}