chenzk преди 1 месец
родител
ревизия
cbbb2ca756

+ 1 - 0
Framework/Common/Common.csproj

@@ -466,6 +466,7 @@
     <Compile Include="RecipeCenter\DefaultRecipeFileContext.cs" />
     <Compile Include="RecipeCenter\DefaultSequenceFileContext.cs" />
     <Compile Include="RecipeCenter\DepRecipe.cs" />
+    <Compile Include="RecipeCenter\DqdrRecipe.cs" />
     <Compile Include="RecipeCenter\HvdRecipe.cs" />
     <Compile Include="RecipeCenter\ISequenceFileContext.cs" />
     <Compile Include="CommonData\MoveItem.cs" />

+ 113 - 0
Framework/Common/RecipeCenter/DqdrRecipe.cs

@@ -0,0 +1,113 @@
+using MECF.Framework.Common.CommonData;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MECF.Framework.Common.RecipeCenter
+{
+    public class DqdrRecipe : NotifiableItem
+    {
+        #region 内部变量
+        private int _anodeType;
+        private string _author;
+        private string _description;
+        private string _ppid;
+        private RecipeType _recipeType = RecipeType.DQDR;
+        private DateTime _saveDate;
+        private DateTime _createDate;
+
+        private string _platingCell;
+        private string _linkedDepRecipeName;
+        private bool _isIdentical;
+
+
+        private int _reclaimSpeed;
+        private int _reclaimTime;
+        private double _reclaimZoffset;
+        private int _rinseSpeed;
+        private int _rinseTime;
+        private double _rinseZoffset;
+        private int _drySpeed;
+        private int _dryTime;
+        private double _dryZoffset;
+        private bool _rinseBeforeEntryEnable;
+        private int _intervalRinseSpeed;
+        private int _intervalRinseTime;
+        private double _intervalRinseZoffset;
+        #endregion
+
+        #region 属性
+        [JsonProperty]
+        public int AnodeType { get { return _anodeType; } set { _anodeType = value; InvokePropertyChanged(nameof(AnodeType)); } }
+
+        [JsonProperty]
+        public string Author { get { return _author; } set { _author = value; InvokePropertyChanged(nameof(Author)); } }
+
+        [JsonProperty]
+        public string Description { get { return _description; } set { _description = value; InvokePropertyChanged(nameof(Description)); } }
+
+        [JsonProperty]
+        public string Ppid { get { return _ppid; } set { _ppid = value; InvokePropertyChanged(nameof(Ppid)); } }
+
+        [JsonProperty]
+        public RecipeType RecipeType { get { return _recipeType; } set { _recipeType = value; InvokePropertyChanged(nameof(RecipeType)); } }
+
+        [JsonProperty]
+        public DateTime SaveDate { get { return _saveDate; } set { _saveDate = value; InvokePropertyChanged(nameof(SaveDate)); } }
+
+        [JsonProperty]
+        public DateTime CreateDate { get { return _createDate; } set { _createDate = value; InvokePropertyChanged(nameof(CreateDate)); } }
+
+        [JsonProperty]
+        public string PlatingCell { get { return _platingCell; } set { _platingCell = value; InvokePropertyChanged(nameof(PlatingCell)); } }
+
+        [JsonProperty]
+        public string LinkedDepRecipeName { get { return _linkedDepRecipeName; } set { _linkedDepRecipeName = value; InvokePropertyChanged(nameof(LinkedDepRecipeName)); } }
+
+        [JsonProperty]
+        public bool IsIdentical { get { return _isIdentical; } set { _isIdentical = value; InvokePropertyChanged(nameof(IsIdentical)); } }
+
+        [JsonProperty]
+        public int ReclaimSpeed { get { return _reclaimSpeed; } set { _reclaimSpeed = value; InvokePropertyChanged(nameof(ReclaimSpeed)); } }
+
+        [JsonProperty]
+        public int ReclaimTime { get { return _reclaimTime; } set { _reclaimTime = value; InvokePropertyChanged(nameof(ReclaimTime)); } }
+
+        [JsonProperty]
+        public double ReclaimZoffset { get { return _reclaimZoffset; } set { _reclaimZoffset = value; InvokePropertyChanged(nameof(ReclaimZoffset)); } }
+
+        [JsonProperty]
+        public int RinseSpeed { get { return _rinseSpeed; } set { _rinseSpeed = value; InvokePropertyChanged(nameof(RinseSpeed)); } }
+
+        [JsonProperty]
+        public int RinseTime { get { return _rinseTime; } set { _rinseTime = value; InvokePropertyChanged(nameof(RinseTime)); } }
+
+        [JsonProperty]
+        public double RinseZoffset { get { return _rinseZoffset; } set { _rinseZoffset = value; InvokePropertyChanged(nameof(RinseZoffset)); } }
+
+        [JsonProperty]
+        public int DrySpeed { get { return _drySpeed; } set { _drySpeed = value; InvokePropertyChanged(nameof(DrySpeed)); } }
+
+        [JsonProperty]
+        public int DryTime { get { return _dryTime; } set { _dryTime = value; InvokePropertyChanged(nameof(DryTime)); } }
+
+        [JsonProperty]
+        public double DryZoffset { get { return _dryZoffset; } set { _dryZoffset = value; InvokePropertyChanged(nameof(DryZoffset)); } }
+
+        [JsonProperty]
+        public bool RinseBeforeEntryEnable { get { return _rinseBeforeEntryEnable; } set { _rinseBeforeEntryEnable = value; InvokePropertyChanged(nameof(RinseBeforeEntryEnable)); } }
+
+        [JsonProperty]
+        public int IntervalRinseSpeed { get { return _intervalRinseSpeed; } set { _intervalRinseSpeed = value; InvokePropertyChanged(nameof(IntervalRinseSpeed)); } }
+
+        [JsonProperty]
+        public int IntervalRinseTime { get { return _intervalRinseTime; } set { _intervalRinseTime = value; InvokePropertyChanged(nameof(IntervalRinseTime)); } }
+
+        [JsonProperty]
+        public double IntervalRinseZoffset { get { return _intervalRinseZoffset; } set { _intervalRinseZoffset = value; InvokePropertyChanged(nameof(IntervalRinseZoffset)); } }
+        #endregion
+    }
+}

+ 2 - 1
Framework/Common/RecipeCenter/RecipeType.cs

@@ -17,7 +17,8 @@ namespace MECF.Framework.Common.RecipeCenter
         HVD=5,
         RES=6,
         RDS=7,
-        CRS=8
+        CRS=8,
+        DQDR=9
     }
 
     public enum ActiveRecipeType

+ 8 - 0
PunkHPX8_MainPages/PunkHPX8_MainPages.csproj

@@ -167,6 +167,7 @@
     <Compile Include="ViewModels\AlarmHomePageViewModel.cs" />
     <Compile Include="ViewModels\DataHistoryViewModel.cs" />
     <Compile Include="ViewModels\DosingSystemViewModel.cs" />
+    <Compile Include="ViewModels\DqdrRecipeViewModel.cs" />
     <Compile Include="ViewModels\JobOperationViewModel.cs" />
     <Compile Include="ViewModels\LoginViewModel.cs" />
     <Compile Include="ViewModels\MaterialMovementViewModel.cs" />
@@ -230,6 +231,9 @@
     <Compile Include="Views\DosingSystemView.xaml.cs">
       <DependentUpon>DosingSystemView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\DqdrRecipeView.xaml.cs">
+      <DependentUpon>DqdrRecipeView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\JobOperationView.xaml.cs">
       <DependentUpon>JobOperationView.xaml</DependentUpon>
     </Compile>
@@ -452,6 +456,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Views\DqdrRecipeView.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Views\JobOperationView.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 3 - 3
PunkHPX8_MainPages/ViewModels/DosingSystemViewModel.cs

@@ -81,7 +81,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir数据
         /// </summary>
-        private StandardHotReservoirData _reservoirData;
+        private ReservoirData _reservoirData;
         #endregion
 
         #region recipe
@@ -201,7 +201,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir数据
         /// </summary>
-        public StandardHotReservoirData ReservoirData
+        public ReservoirData ReservoirData
         {
             get { return _reservoirData; }
             set { SetProperty(ref _reservoirData, value); }
@@ -383,7 +383,7 @@ namespace PunkHPX8_MainPages.ViewModels
                                                    
                     }
                     
-                    ReservoirData = CommonFunction.GetValue<StandardHotReservoirData>(_rtDataValueDic, $"{Module}.ReservoirData");
+                    ReservoirData = CommonFunction.GetValue<ReservoirData>(_rtDataValueDic, $"{Module}.ReservoirData");
                     if ("Manual".Equals(ReplensPersistentCollection[0].OperatingMode))
                     {
                         IsEnabled = true;

+ 408 - 0
PunkHPX8_MainPages/ViewModels/DqdrRecipeViewModel.cs

@@ -0,0 +1,408 @@
+using Aitex.Core.UI.MVVM;
+using Aitex.Core.Utilities;
+using MECF.Framework.Common.DataCenter;
+using MECF.Framework.Common.RecipeCenter;
+using MECF.Framework.Common.Utilities;
+using Prism.Mvvm;
+using PunkHPX8_MainPages.PMs;
+using PunkHPX8_Themes.UserControls;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Input;
+
+namespace PunkHPX8_MainPages.ViewModels
+{
+    public class DqdrRecipeViewModel : BindableBase
+    {
+        #region 常量
+        private const string ENGINEERING = "Engineering";
+
+        private const string DQDR = "dqdr";
+        #endregion
+
+        #region 内部变量
+        /// <summary>
+        /// Recipe节点字典
+        /// </summary>
+        private Dictionary<string, RecipeNode> _recipeNodeDic = new Dictionary<string, RecipeNode>();
+        /// <summary>
+        /// 属性检验结果字典
+        /// </summary>
+        private Dictionary<string, bool> _propertyValidResultDic = new Dictionary<string, bool>();
+        /// <summary>
+        /// Recipe节点集合
+        /// </summary>
+        private ObservableCollection<RecipeNode> _recipeNodes;
+        /// <summary>
+        /// Plating Cell List
+        /// </summary>
+        private ObservableCollection<string> _platingCellList;
+        /// <summary>
+        /// DepRecipe Name List
+        /// </summary>
+        private ObservableCollection<string> _depRecipeNameList;
+        /// <summary>
+        /// uiRecipeManager
+        /// </summary>
+        private UiRecipeManager _uiRecipeManager = new UiRecipeManager();
+        /// <summary>
+        /// recipe
+        /// </summary>
+        private DqdrRecipe _recipe;
+        /// <summary>
+        /// 编辑可用性
+        /// </summary>
+        private bool _editEnable;
+        /// <summary>
+        /// 创建可用性
+        /// </summary>
+        private bool _createEnable;
+        /// <summary>
+        /// 当前节点
+        /// </summary>
+        private RecipeNode _currentNode;
+        /// <summary>
+        /// 是否可用
+        /// </summary>
+        private bool _enable = false;
+        /// <summary>
+        /// 是否为编辑(true-Edit,false-add)
+        /// </summary>
+        private bool _isEdit = false;
+        #endregion
+
+        #region 属性
+        public ObservableCollection<RecipeNode> RecipeNodes
+        {
+            get { return _recipeNodes; }
+            set { SetProperty(ref _recipeNodes, value); }
+        }
+        public ObservableCollection<string> PlatingCellList
+        {
+            get { return _platingCellList; }
+            set { SetProperty(ref _platingCellList, value); }
+        }
+        public ObservableCollection<string> DepRecipeNameList
+        {
+            get { return _depRecipeNameList; }
+            set { SetProperty(ref _depRecipeNameList, value); }
+        }
+        /// <summary>
+        /// Recipe
+        /// </summary>
+        public DqdrRecipe Recipe
+        {
+            get { return _recipe; }
+            set { SetProperty(ref _recipe, value); }
+        }
+        /// <summary>
+        /// 创建可用性
+        /// </summary>
+        public bool CreateEnable
+        {
+            get { return _createEnable; }
+            set { SetProperty(ref _createEnable, value); }
+        }
+        /// <summary>
+        /// 编辑可用性
+        /// </summary>
+        public bool EditEnable
+        {
+            get { return _editEnable; }
+            set { SetProperty(ref _editEnable, value); }
+        }
+        /// <summary>
+        /// 当前节点
+        /// </summary>
+        public RecipeNode CurrentNode
+        {
+            get { return _currentNode; }
+            set { SetProperty(ref _currentNode, value); }
+        }
+        /// <summary>
+        /// 可用性
+        /// </summary>
+        public bool Enable
+        {
+            get { return _enable; }
+            set { SetProperty(ref _enable, value); }
+        }
+        /// <summary>
+        /// 属性数据检验结果
+        /// </summary>
+        public Dictionary<string, bool> PropertyValidResultDic
+        {
+            get { return _propertyValidResultDic; }
+            set { SetProperty(ref _propertyValidResultDic, value); }
+        }
+
+        #endregion
+
+        #region 指令
+        [IgnorePropertyChange]
+        public ICommand OperationCommand
+        {
+            get;
+            private set;
+        }
+
+        [IgnorePropertyChange]
+        public ICommand CreateCommand { get; private set; }
+
+        [IgnorePropertyChange]
+        public ICommand EditCommand { get; private set; }
+        [IgnorePropertyChange]
+        public ICommand SaveRecipeCommand { get; private set; }
+        [IgnorePropertyChange]
+        public ICommand SaveAsRecipeCommand { get; private set; }
+
+        #endregion
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        public DqdrRecipeViewModel()
+        {
+            OperationCommand = new DelegateCommand<object>(SelectionChangedAction);
+            CreateCommand = new DelegateCommand<object>(CreateAction);
+            EditCommand = new DelegateCommand<object>(EditAction);
+            SaveRecipeCommand = new DelegateCommand<object>(SaveAction);
+            SaveAsRecipeCommand = new DelegateCommand<object>(SaveAsAction);
+          
+            InitializeProprtyValidResultDictionary();
+
+        }
+        /// <summary>
+        /// 初始化属性数据检验结果字典
+        /// </summary>
+        private void InitializeProprtyValidResultDictionary()
+        {
+            PropertyValidResultDic["ReclaimSpeed"] = false;
+            PropertyValidResultDic["ReclaimTime"] = false;
+            PropertyValidResultDic["ReclaimZoffset"] = false;
+            PropertyValidResultDic["RinseSpeed"] = false;
+            PropertyValidResultDic["RinseTime"] = false;
+            PropertyValidResultDic["RinseZoffset"] = false;
+            PropertyValidResultDic["DrySpeed"] = false;
+            PropertyValidResultDic["DryTime"] = false;
+            PropertyValidResultDic["DryZoffset"] = false;
+            PropertyValidResultDic["IntervalRinseSpeed"] = false;
+            PropertyValidResultDic["IntervalRinseTime"] = false;
+            PropertyValidResultDic["IntervalRinseZoffset"] = false;
+
+        }
+        /// <summary>
+        /// 加载数据
+        /// </summary>
+        public void LoadRecipeData()
+        {
+            RecipeNodes = _uiRecipeManager.GetRecipesByType(DQDR);
+            _recipeNodeDic.Clear();
+            InitializeDictionary(RecipeNodes);
+        }
+        /// <summary>
+        /// 初始化字典
+        /// </summary>
+        /// <param name="nodes"></param>
+        private void InitializeDictionary(ObservableCollection<RecipeNode> nodes)
+        {
+            if (nodes != null)
+            {
+                foreach (var node in nodes)
+                {
+                    if (node.NodeType == RecipeNodeType.File)
+                    {
+                        _recipeNodeDic[node.Name] = node;
+                    }
+                    InitializeDictionary(node.Children);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 操作
+        /// </summary>
+        /// <param name="param"></param>
+        private void SelectionChangedAction(object param)
+        {
+            if (_recipeNodeDic.ContainsKey(param.ToString()))
+            {
+                CurrentNode = _recipeNodeDic[param.ToString()];
+                if (CurrentNode.NodeType == RecipeNodeType.File)
+                {
+                    if (CurrentNode.RecipeLocation == ENGINEERING)
+                    {
+                        EditEnable = true;
+                        CreateEnable = true;
+                    }
+                    else
+                    {
+                        EditEnable = false;
+                        CreateEnable = false;
+                    }
+                }
+                Recipe = _uiRecipeManager.LoadRecipe<DqdrRecipe>(CurrentNode.RecipeFullFileName);
+                if (Recipe == null)
+                {
+                    MessageBox.Show("Invalid Recipe", "Load Recipe", MessageBoxButton.OK, MessageBoxImage.Error);
+                    EditEnable = false;
+                    CreateEnable = false;
+                }
+                Enable = false;
+            }
+            else
+            {
+                if (param.ToString() == ENGINEERING)
+                {
+                    CreateEnable = true;
+                }
+                else
+                {
+                    CreateEnable = false;
+                }
+                CurrentNode = null;
+                Recipe = null;
+                EditEnable = false;
+                Enable = false;
+            }
+        }
+
+        #region Action
+        /// <summary>
+        /// 创建
+        /// </summary>
+        /// <param name="param"></param>
+        private void CreateAction(object param)
+        {
+            RecipeNameDialog recipeNameDialog = new RecipeNameDialog();
+            if (recipeNameDialog.ShowDialog().Value)
+            {
+                Recipe = new DqdrRecipe();
+                Recipe.CreateDate = DateTime.Now;
+                Recipe.Ppid = recipeNameDialog.RecipeName;
+                Recipe.Description = recipeNameDialog.RecipeDescription;
+                Enable = true;
+                _isEdit = false;
+            }
+        }
+        /// <summary>
+        /// 编辑
+        /// </summary>
+        /// <param name="param"></param>
+        private void EditAction(object param)
+        {
+            Enable = true;
+            _isEdit = false;
+        }
+        /// <summary>
+        /// 保存
+        /// </summary>
+        /// <param name="param"></param>
+        private void SaveAction(object param)
+        {
+            if (CheckValid(_isEdit))
+            {
+                Recipe.SaveDate = DateTime.Now;
+                try
+                {
+                    _uiRecipeManager.SaveRecipe<DqdrRecipe>(ENGINEERING, Recipe.Ppid, "dqdr", Recipe);
+                    LoadRecipeData();
+                    MessageBox.Show("Save Recipe Success", "Save Recipe", MessageBoxButton.OK, MessageBoxImage.Information);
+                    Enable = false;
+                }
+                catch (Exception ex)
+                {
+                    MessageBox.Show(ex.Message, "Save Recipe", MessageBoxButton.OK, MessageBoxImage.Error);
+                }
+            }
+        }
+        /// <summary>
+        /// 另存为
+        /// </summary>
+        /// <param name="param"></param>
+        private void SaveAsAction(object param)
+        {
+            if (Recipe == null)
+            {
+                MessageBox.Show("Select a Recipe first", "SaveAs Recipe", MessageBoxButton.OK, MessageBoxImage.Error);
+                return;
+            }
+            DqdrRecipe recipe = new DqdrRecipe();
+            if (CheckValid(_isEdit))
+            {
+                RecipeNameDialog recipeNameDialog = new RecipeNameDialog();
+                if (recipeNameDialog.ShowDialog().Value)
+                {
+                    if (!CheckNameExist(recipeNameDialog.RecipeName))
+                    {
+                        recipe = new DqdrRecipe();
+                        recipe = (DqdrRecipe)PropertyUtil.Clone(Recipe);
+                        recipe.CreateDate = DateTime.Now;
+                        recipe.Ppid = recipeNameDialog.RecipeName;
+                        recipe.Description = recipeNameDialog.RecipeDescription;
+                    }
+                    else if (recipeNameDialog.RecipeName != null)
+                    {
+                        MessageBox.Show("Name can not be Null", "Create Recipe", MessageBoxButton.OK, MessageBoxImage.Error);
+                        return;
+                    }
+                    else
+                    {
+                        return;
+                    }
+                }
+                try
+                {
+                    _uiRecipeManager.SaveRecipe<DqdrRecipe>(ENGINEERING, recipe.Ppid, "dqdr", recipe);
+                    LoadRecipeData();
+                    MessageBox.Show("Save As Recipe Success", "SaveAs Recipe", MessageBoxButton.OK, MessageBoxImage.Information);
+                    Enable = false;
+                }
+                catch (Exception ex)
+                {
+                    MessageBox.Show(ex.Message, "Save As Recipe", MessageBoxButton.OK, MessageBoxImage.Error);
+                }
+            }
+        }
+        /// <summary>
+        /// 检验名称是否已经存在
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        private bool CheckNameExist(string name)
+        {
+            foreach (string item in _recipeNodeDic.Keys)
+            {
+                if (item == name)
+                {
+                    MessageBox.Show($"{name} is exsit", "Save Recipe", MessageBoxButton.OK, MessageBoxImage.Error);
+                    return true;
+                }
+            }
+            return false;
+        }
+        /// <summary>
+        /// 检验合法性
+        /// </summary>
+        /// <param name="editType"></param>
+        /// <returns></returns>
+        private bool CheckValid(bool editType)
+        {
+            foreach (string key in _propertyValidResultDic.Keys)
+            {
+                bool valid = _propertyValidResultDic[key];
+                if (!valid)
+                {
+                    MessageBox.Show($"{key} data invalid", "Save Recipe", MessageBoxButton.OK, MessageBoxImage.Error);
+                    return false;
+                }
+            }
+            return true;
+        }
+        #endregion
+    }
+}

+ 3 - 3
PunkHPX8_MainPages/ViewModels/PMCounterViewModel.cs

@@ -47,7 +47,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir数据
         /// </summary>
-        private CompactMembranReservoirData _reservoirData;
+        private ReservoirData _reservoirData;
         /// <summary>
         /// CellModuleName集合
         /// </summary>
@@ -138,7 +138,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir 数据
         /// </summary>
-        public CompactMembranReservoirData ReservoirData
+        public ReservoirData ReservoirData
         {
             get { return _reservoirData; }
             set { SetProperty(ref _reservoirData, value); }
@@ -301,7 +301,7 @@ namespace PunkHPX8_MainPages.ViewModels
                 if (_rtDataValueDic != null)
                 {
                     State = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.FsmState");
-                    ReservoirData = CommonFunction.GetValue<CompactMembranReservoirData>(_rtDataValueDic, $"{Module}.ReservoirData");
+                    ReservoirData = CommonFunction.GetValue<ReservoirData>(_rtDataValueDic, $"{Module}.ReservoirData");
                     CurrentRecipe = CommonFunction.GetValue<ResRecipe>(_rtDataValueDic, $"{Module}.CurrentRecipe");
                     ReservoirsPersistent = CommonFunction.GetValue<ReservoirsPersistentValue>(_rtDataValueDic, $"{Module}.{PERSISTENT_VALUE}");
                     if ("Manual".Equals(ReservoirsPersistent.OperatingMode))

+ 13 - 13
PunkHPX8_MainPages/ViewModels/ReservoirsAnolyteViewModel.cs

@@ -101,7 +101,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir数据
         /// </summary>
-        private CompactMembranReservoirData _reservoirData;
+        private ReservoirData _reservoirData;
         #region Valve Flag
         /// <summary>
         /// ANDiReplenValveIsOpen
@@ -287,7 +287,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir 数据
         /// </summary>
-        public CompactMembranReservoirData ReservoirData
+        public ReservoirData ReservoirData
         {
             get { return _reservoirData; }
             set { SetProperty(ref _reservoirData, value); }
@@ -686,11 +686,11 @@ namespace PunkHPX8_MainPages.ViewModels
                 _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
                 if (_rtDataValueDic != null)
                 {
-                    ReservoirData = CommonFunction.GetValue<CompactMembranReservoirData>(_rtDataValueDic, $"{Module}.ReservoirData");
-                    if(ReservoirData.ANBypassFlow == 0)
-                    {
-                        ReservoirData.ANBypassFlow = CommonFunction.GetValue<double>(_rtDataValueDic, $"{Module}.ANBypassCounterFlow");
-                    }
+                    ReservoirData = CommonFunction.GetValue<ReservoirData>(_rtDataValueDic, $"{Module}.ReservoirData");
+                    //if(ReservoirData.ANBypassFlow == 0)
+                    //{
+                    //    ReservoirData.ANBypassFlow = CommonFunction.GetValue<double>(_rtDataValueDic, $"{Module}.ANBypassCounterFlow");
+                    //}
                     AvgANLevel = CommonFunction.GetValue<double>(_rtDataValueDic, $"{Module}.ReservoirAverageANLevel");
                     IsCrossDoseEnabled = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{Module}.IsCrossDoseInstalled");
                     IsCrossDoseTypeConfig = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{Module}.CroseDoseType");
@@ -707,12 +707,12 @@ namespace PunkHPX8_MainPages.ViewModels
                     IsError = "Error".Equals(State) ? true : false;
                     if (ReservoirData != null)
                     {
-                        //ANPump状态
-                        ANPumpEnable = ReservoirData.ANPump > 0 ? true : false;
-                        //ANADrainPump状态
-                        ANADrainPumpEnable = ReservoirData.ANADrainPump > 0 ? true : false;
-                        //ANBDrainPump状态
-                        ANBDrainPumpEnable = ReservoirData.ANBDrainPump > 0 ? true : false;
+                        ////ANPump状态
+                        //ANPumpEnable = ReservoirData.ANPump > 0 ? true : false;
+                        ////ANADrainPump状态
+                        //ANADrainPumpEnable = ReservoirData.ANADrainPump > 0 ? true : false;
+                        ////ANBDrainPump状态
+                        //ANBDrainPumpEnable = ReservoirData.ANBDrainPump > 0 ? true : false;
 
                     }
                     IsManualReplen = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{Module}.IsManualANReplen");

+ 3 - 3
PunkHPX8_MainPages/ViewModels/ReservoirsCatholyteViewModel.cs

@@ -87,7 +87,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir数据
         /// </summary>
-        private CompactMembranReservoirData _reservoirData;
+        private ReservoirData _reservoirData;
         /// <summary>
         /// CellModuleName集合
         /// </summary>
@@ -205,7 +205,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir数据
         /// </summary>
-        public CompactMembranReservoirData ReservoirData
+        public ReservoirData ReservoirData
         {
             get { return _reservoirData; }
             set { SetProperty(ref _reservoirData, value); }
@@ -541,7 +541,7 @@ namespace PunkHPX8_MainPages.ViewModels
                     State = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.FsmState");
                     IsError = "Error".Equals(State) ? true : false;
                     ReservoirsPersistent = CommonFunction.GetValue<ReservoirsPersistentValue>(_rtDataValueDic, $"{Module}.{PERSISTENT_VALUE}");
-                    ReservoirData = CommonFunction.GetValue<CompactMembranReservoirData>(_rtDataValueDic, $"{Module}.ReservoirData");
+                    ReservoirData = CommonFunction.GetValue<ReservoirData>(_rtDataValueDic, $"{Module}.ReservoirData");
                     AvgCALevel = CommonFunction.GetValue<double>(_rtDataValueDic, $"{Module}.ReservoirAverageCALevel");
                     CurrentRecipe = CommonFunction.GetValue<ResRecipe>(_rtDataValueDic, $"{Module}.CurrentRecipe");
                     IsManualReplen = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{Module}.IsManualCAReplen");

+ 3 - 3
PunkHPX8_MainPages/ViewModels/ReservoirsViewModel.cs

@@ -60,7 +60,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir数据
         /// </summary>
-        private CompactMembranReservoirData _reservoirData;
+        private ReservoirData _reservoirData;
         /// <summary>
         /// CellModuleName集合
         /// </summary>
@@ -202,7 +202,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir 数据
         /// </summary>
-        public CompactMembranReservoirData ReservoirData
+        public ReservoirData ReservoirData
         {
             get { return _reservoirData; }
             set { SetProperty(ref _reservoirData, value); }
@@ -356,7 +356,7 @@ namespace PunkHPX8_MainPages.ViewModels
                 {
                     State = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.FsmState");
                     IsError = "Error".Equals(State) ? true : false;
-                    ReservoirData = CommonFunction.GetValue<CompactMembranReservoirData>(_rtDataValueDic, $"{Module}.ReservoirData");
+                    ReservoirData = CommonFunction.GetValue<ReservoirData>(_rtDataValueDic, $"{Module}.ReservoirData");
                     ReservoirsPersistent = CommonFunction.GetValue<ReservoirsPersistentValue>(_rtDataValueDic, $"{Module}.{PERSISTENT_VALUE}");
                     CurrentRecipe = CommonFunction.GetValue<ResRecipe>(_rtDataValueDic, $"{Module}.CurrentRecipe");
                     CommonSafetyData = CommonFunction.GetValue<SafetyData>(_rtDataValueDic, $"Safety.SafetyData");

+ 2 - 2
PunkHPX8_MainPages/ViewModels/StandardHotReservoirsViewModel.cs

@@ -83,7 +83,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir数据
         /// </summary>
-        private StandardHotReservoirData _reservoirData;
+        private ReservoirData _reservoirData;
         /// <summary>
         /// Metal数据集合
         /// </summary>
@@ -328,7 +328,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <summary>
         /// Reservoir数据
         /// </summary>
-        public StandardHotReservoirData ReservoirData 
+        public ReservoirData ReservoirData 
         { 
             get { return _reservoirData; }
             set { SetProperty(ref _reservoirData, value); } 

+ 201 - 0
PunkHPX8_MainPages/Views/DqdrRecipeView.xaml

@@ -0,0 +1,201 @@
+<UserControl x:Class="PunkHPX8_MainPages.Views.DqdrRecipeView"
+             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:PunkHPX8_MainPages.Views"
+             xmlns:prism="http://prismlibrary.com/" 
+             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"             
+             xmlns:converters="clr-namespace:PunkHPX8_MainPages.Converters"
+             xmlns:extendedControls="clr-namespace:MECF.Framework.UI.Core.ExtendedControls;assembly=MECF.Framework.UI.Core"
+             xmlns:Control="clr-namespace:MECF.Framework.UI.Core.Control;assembly=MECF.Framework.UI.Core"  
+             xmlns:UserControls="clr-namespace:PunkHPX8_Themes.UserControls;assembly=PunkHPX8_Themes"  
+             prism:ViewModelLocator.AutoWireViewModel="True"
+             mc:Ignorable="d" 
+             d:DesignHeight="800" d:DesignWidth="1800" Loaded="UserControl_Loaded">
+    <UserControl.Resources>
+        <converters:BoolReverseConverter x:Key="boolReverseConverter"/>
+        <converters:BoolVisibilityConverter x:Key="boolVisibilityConverter"/>
+    </UserControl.Resources>
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="145"></RowDefinition>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition/>
+        </Grid.RowDefinitions>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="50"></ColumnDefinition>
+            <ColumnDefinition Width="400"></ColumnDefinition>
+            <ColumnDefinition Width="700"></ColumnDefinition>
+            <ColumnDefinition Width="700"></ColumnDefinition>
+            <ColumnDefinition/>
+        </Grid.ColumnDefinitions>
+        <UserControls:RecipeFileLoadControl Grid.Row="0" Grid.RowSpan="4" Grid.Column="1" Title="Dqdr Recipe" RecipeNodes="{Binding RecipeNodes}" OperationCommand="{Binding OperationCommand}"
+                                            RecipeLocation="{Binding CurrentNode.RecipeLocation}" EditEnable="{Binding EditEnable}" CreateEnable="{Binding CreateEnable}" RecipeFileName="{Binding CurrentNode.FileName}"
+                                            CreateCommand="{Binding CreateCommand}" EditCommand="{Binding EditCommand}"/>
+        <Grid Grid.Row="0" Grid.Column="2" Grid.RowSpan="2">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="70"></RowDefinition>
+                <RowDefinition Height="70"></RowDefinition>
+                <RowDefinition/>
+            </Grid.RowDefinitions>
+            <GroupBox Header="PPID" Grid.Row="0">
+                <TextBlock Text="{Binding Recipe.Ppid}" FontSize="20" VerticalAlignment="Center" TextAlignment="Center">
+                </TextBlock>
+            </GroupBox>
+            <GroupBox Header="Description" Grid.Row="1">
+                <TextBlock Text="{Binding Recipe.Description}" FontSize="18" VerticalAlignment="Center" TextAlignment="Center">
+                </TextBlock>
+            </GroupBox>
+        </Grid>
+        <GroupBox Header="Author" Grid.Row="1" Grid.Column="2" Width="180" Margin="-500,60,10,20">
+            <Label Content="{Binding Recipe.Author}" Height="30" Width="180" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="White" Background="Gray" 
+                                          HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Column="1" Margin="6,0,0,0"></Label>
+        </GroupBox>
+        <GroupBox Header="Creation Date" Grid.Row="1" Grid.Column="2" Width="180" Margin="-120,60,10,20">
+            <Label Content="{Binding Recipe.CreateDate}" Height="30" Width="180" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="White" Background="Gray" 
+                                        HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Column="1" Margin="6,0,0,0"></Label>
+        </GroupBox>
+        <GroupBox Header="Save Date" Grid.Row="1" Grid.Column="2" Width="180" Margin="260,60,10,20">
+            <Label Content="{Binding Recipe.SaveDate}" Height="30" Width="180" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="White" Background="Gray" 
+                                        HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Column="1" Margin="6,0,0,0"></Label>
+        </GroupBox>
+        <GroupBox Header="Plating Cell" IsEnabled="{Binding Enable}"   Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Width="180" Margin="-60,60,10,20" >
+            <ComboBox Height="30" Margin="10,0,10,0" ItemsSource="{Binding PlatingCellList}" SelectedItem="{Binding Recipe.PlatingCell, Mode=TwoWay}">
+            </ComboBox>
+        </GroupBox>
+        <Grid Grid.Row="0" Grid.Column="3" Grid.RowSpan="2">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="70"></RowDefinition>
+                <RowDefinition Height="70"></RowDefinition>
+                <RowDefinition/>
+                <RowDefinition Height="70"></RowDefinition>
+            </Grid.RowDefinitions>
+            <Grid Grid.Row="0">
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition/>
+                    <ColumnDefinition/>
+                    <ColumnDefinition/>
+                </Grid.ColumnDefinitions>
+                <Button Grid.Column="0" IsEnabled="{Binding Enable}" Style="{StaticResource SysBtnStyle}"  Content="Save" Height="35" Width="100" Command="{Binding SaveRecipeCommand}"></Button>
+                <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}"  Content="SaveAs" Height="35" Width="100" Command="{Binding SaveAsRecipeCommand}"></Button>
+            </Grid>
+        </Grid>
+        <GroupBox Header="Link To Plating Cell Dep Recipe" IsEnabled="{Binding Enable}"   Grid.Row="2" Grid.Column="2" Width="600" Margin="0,0,120,0" >
+            <ComboBox Height="30" Margin="10,0,10,0" ItemsSource="{Binding DepRecipeNameList}" SelectedItem="{Binding Recipe.LinkedDepRecipeName, Mode=TwoWay}">
+            </ComboBox>
+        </GroupBox>
+        <GroupBox Header="Time Check" Grid.Row="2" Grid.Column="3" Width="200" Margin="0,10,450,10">
+            <Label Height="30" Width="180" VerticalAlignment="Center" HorizontalAlignment="Left" Background="Gray" 
+                                      HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Column="1" Margin="6,0,0,0">
+                <Label.Style>
+                    <Style TargetType="Label">
+                        <Setter Property="Content" Value="Different" />
+                        <Setter Property="Foreground" Value="Red"/>
+                        <Style.Triggers>
+                            <DataTrigger Binding="{Binding Recipe.IsIdentical}" Value="True">
+                                <Setter Property="Content" Value="Identical"/>
+                                <Setter Property="Foreground" Value="LimeGreen"/>
+                            </DataTrigger>
+                        </Style.Triggers>
+                    </Style>
+                </Label.Style>
+            </Label>
+        </GroupBox>
+        <Grid Grid.Row="3" Grid.Column="2" Grid.ColumnSpan="2">
+            <Grid>
+                <Grid Grid.Row="0">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="1300"></ColumnDefinition>
+                        <ColumnDefinition/>
+                    </Grid.ColumnDefinitions>
+                    <Grid>
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="300"></ColumnDefinition>
+                            <ColumnDefinition Width="300"></ColumnDefinition>
+                            <ColumnDefinition Width="300"></ColumnDefinition>
+                            <ColumnDefinition Width="300"></ColumnDefinition>
+                        </Grid.ColumnDefinitions>
+                        <GroupBox Header="Reclaim" Grid.Column="0" HorizontalAlignment="Left" Margin="10,10,10,10" Width="280">
+                            <Grid>
+                                <Grid.RowDefinitions>
+                                    <RowDefinition Height="120"></RowDefinition>
+                                    <RowDefinition Height="120"></RowDefinition>
+                                    <RowDefinition/>
+                                </Grid.RowDefinitions>
+                                <UserControls:GroupTextBoxControl Grid.Row="0"  Width="250" Title="Speed" Unit="rpm" MinValue="0" MaxValue="1000" Margin="10,20,10,20"
+                                                IntValue="{Binding Recipe.ReclaimSpeed,Mode=TwoWay}" 
+                                                ValidResult="{Binding PropertyValidResultDic[ReclaimSpeed],Mode=TwoWay}"/>
+                                <UserControls:GroupTextBoxControl Grid.Row="1"  Width="250" Title="Time" Unit="sec" MinValue="0" MaxValue="100" Margin="10,20,10,20"
+                                                IntValue="{Binding Recipe.ReclaimTime,Mode=TwoWay}" 
+                                                ValidResult="{Binding PropertyValidResultDic[ReclaimTime],Mode=TwoWay}"/>
+                      
+                            </Grid>
+                        </GroupBox>
+                        <GroupBox Header="Rinse" Grid.Column="1" Margin="10,10,0,10" HorizontalAlignment="Left" Width="280">
+                            <Grid>
+                                <Grid.RowDefinitions>
+                                    <RowDefinition Height="120"></RowDefinition>
+                                    <RowDefinition Height="120"></RowDefinition>
+                   
+                                    <RowDefinition/>
+                                </Grid.RowDefinitions>
+                                <UserControls:GroupTextBoxControl Grid.Row="0"  Width="250" Title="Speed" Unit="rpm" MinValue="0" MaxValue="1000" Margin="10,20,10,20"
+IntValue="{Binding Recipe.RinseSpeed,Mode=TwoWay}" 
+ValidResult="{Binding PropertyValidResultDic[RinseSpeed],Mode=TwoWay}"/>
+                                <UserControls:GroupTextBoxControl Grid.Row="1"  Width="250" Title="Time" Unit="sec" MinValue="0" MaxValue="100" Margin="10,20,10,20"
+IntValue="{Binding Recipe.RinseTime,Mode=TwoWay}" 
+ValidResult="{Binding PropertyValidResultDic[RinseTime],Mode=TwoWay}"/>
+
+                            </Grid>
+                        </GroupBox>
+                        <GroupBox Header="Dry" Grid.Column="2" HorizontalAlignment="Left" Margin="10,10,10,10" Width="280">
+                            <Grid>
+                                <Grid.RowDefinitions>
+                                    <RowDefinition Height="120"></RowDefinition>
+                                    <RowDefinition Height="120"></RowDefinition>
+                      
+                                    <RowDefinition/>
+                                </Grid.RowDefinitions>
+                                <UserControls:GroupTextBoxControl Grid.Row="0"  Width="250" Title="Speed" Unit="rpm" MinValue="0" MaxValue="1000" Margin="10,20,10,20"
+IntValue="{Binding Recipe.DrySpeed,Mode=TwoWay}" 
+ValidResult="{Binding PropertyValidResultDic[DrySpeed],Mode=TwoWay}"/>
+                                <UserControls:GroupTextBoxControl Grid.Row="1"  Width="250" Title="Time" Unit="sec" MinValue="0" MaxValue="100" Margin="10,20,10,20"
+IntValue="{Binding Recipe.DryTime,Mode=TwoWay}" 
+ValidResult="{Binding PropertyValidResultDic[DryTime],Mode=TwoWay}"/>
+                
+                            </Grid>
+                        </GroupBox>
+                        <GroupBox Header="Interval Rinse" Grid.Column="3" HorizontalAlignment="Left" Margin="10,10,10,10" Width="280">
+                            <Grid>
+                                <Grid.RowDefinitions>
+                                    <RowDefinition Height="120"></RowDefinition>
+                                    <RowDefinition Height="120"></RowDefinition>
+                                    <RowDefinition Height="120"></RowDefinition>
+                      
+                                    <RowDefinition/>
+                                </Grid.RowDefinitions>
+                                <GroupBox Grid.Row="0" IsEnabled="{Binding Enable}" Margin="10,10,10,10" Header="Rinse Before Entry">
+                                    <Grid>
+                                        <RadioButton Content="Enable" Height="30" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Left"
+                  Command="{Binding AutoCurrentBasedFalseCommand}"  IsChecked="{Binding Recipe.RinseBeforeEntryEnable ,Mode=TwoWay}" Margin="18,-1,0,-6" ></RadioButton>
+                                        <RadioButton Content="Disable" Height="30" Width="65" VerticalContentAlignment="Center" HorizontalAlignment="Center" 
+                   Command="{Binding AutoCurrentBasedTrueCommand}"  IsChecked="{Binding Recipe.RinseBeforeEntryEnable,Mode=TwoWay,Converter={StaticResource boolReverseConverter}}" Margin="60,-1,0,-6" ></RadioButton>
+                                    </Grid>
+                                </GroupBox>
+                                <UserControls:GroupTextBoxControl Grid.Row="1"  Width="250" Title="Speed" Unit="rpm" MinValue="0" MaxValue="1000" Margin="10,20,10,20"
+IntValue="{Binding Recipe.IntervalRinseSpeed,Mode=TwoWay}" 
+ValidResult="{Binding PropertyValidResultDic[IntervalRinseSpeed],Mode=TwoWay}"/>
+                                <UserControls:GroupTextBoxControl Grid.Row="2"  Width="250" Title="Time" Unit="sec" MinValue="0" MaxValue="100" Margin="10,20,10,20"
+IntValue="{Binding Recipe.IntervalRinseTime,Mode=TwoWay}" 
+ValidResult="{Binding PropertyValidResultDic[IntervalRinseTime],Mode=TwoWay}"/>
+ 
+                            </Grid>
+                        </GroupBox>
+                    </Grid>
+                </Grid>
+            </Grid>
+        </Grid>
+    </Grid>
+</UserControl>

+ 33 - 0
PunkHPX8_MainPages/Views/DqdrRecipeView.xaml.cs

@@ -0,0 +1,33 @@
+using PunkHPX8_MainPages.ViewModels;
+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 PunkHPX8_MainPages.Views
+{
+    /// <summary>
+    /// DqdrRecipeView.xaml 的交互逻辑
+    /// </summary>
+    public partial class DqdrRecipeView : UserControl
+    {
+        public DqdrRecipeView()
+        {
+            InitializeComponent();
+        }
+        private void UserControl_Loaded(object sender, RoutedEventArgs e)
+        {
+            (this.DataContext as DqdrRecipeViewModel).LoadRecipeData();
+        }
+    }
+}

+ 1 - 4
PunkHPX8_MainPages/Views/ReservoirsAnolyteView.xaml

@@ -262,10 +262,7 @@
                                 IsLowLevel="{Binding IsLowLevel}"
                                 IsError="{Binding IsError}"/>
         
-        <userControls:CrossDoseControl IsEnabled="{Binding IsEnabled}" Visibility="{Binding IsCrossDoseEnabled,Converter={StaticResource boolToVisibility2}}" Canvas.Left="10" Canvas.Top="450"
-                                       ModuleName="{Binding Module}" PumpFactor="{Binding ReservoirsPersistent.CrossDosePumpFactor}" ANTransferFlow="{Binding ANTransferFlow}" IsAutoMode="{Binding IsAutoMode}"
-                                       ReservoirData="{Binding ReservoirData}" IsCalibrateEnable="{Binding IsCalibrateEnable}" TargetDosingVolume="{Binding ReservoirsPersistent.TargetDosingVolume}"/>
-        
+       
         <GroupBox Header="Status" FontWeight="Bold" FontSize="15" Canvas.Top="660" Canvas.Left="10">
             <Border Width="300" Height="50" Margin="10" Background="Black">
                 <TextBlock Text="" Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>

+ 1 - 1
PunkHPX8_MainPages/Views/ReservoirsView.xaml

@@ -46,7 +46,7 @@
                 </Grid>
                 <Grid Grid.Row="1" Grid.RowSpan="2" Margin="10,0,500,10" Grid.ColumnSpan="2" Grid.Column="0">
                     <ctrls:ReservoirsRecipeParametersPanel HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Center" 
-                                                   ReservoirCommonData="{Binding ReservoirData}"
+                                            
                                                    ResRecipeCommonData="{Binding  CurrentRecipe}"/>
                 </Grid>
                 <Grid Grid.Row="1" Grid.Column="1" Grid.RowSpan="2" Margin="10 0 0 0">

+ 16 - 16
PunkHPX8_Themes/UserControls/CrossDoseControl.xaml.cs

@@ -79,22 +79,22 @@ namespace PunkHPX8_Themes.UserControls
                 this.SetValue(RemainingFlowProperty, value);
             }
         }
-        public static readonly DependencyProperty ReservoirDataProperty = DependencyProperty.Register(
-              "ReservoirData", typeof(CompactMembranReservoirData), typeof(CrossDoseControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
-        /// <summary>
-        /// ReservoirData
-        /// </summary>
-        public CompactMembranReservoirData ReservoirData
-        {
-            get
-            {
-                return (CompactMembranReservoirData)this.GetValue(ReservoirDataProperty);
-            }
-            set
-            {
-                this.SetValue(ReservoirDataProperty, value);
-            }
-        }
+        //public static readonly DependencyProperty ReservoirDataProperty = DependencyProperty.Register(
+        //      "ReservoirData", typeof(CompactMembranReservoirData), typeof(CrossDoseControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
+        ///// <summary>
+        ///// ReservoirData
+        ///// </summary>
+        //public CompactMembranReservoirData ReservoirData
+        //{
+        //    get
+        //    {
+        //        return (CompactMembranReservoirData)this.GetValue(ReservoirDataProperty);
+        //    }
+        //    set
+        //    {
+        //        this.SetValue(ReservoirDataProperty, value);
+        //    }
+        //}
         public static readonly DependencyProperty PumpFactorProperty = DependencyProperty.Register(
               "PumpFactor", typeof(double), typeof(CrossDoseControl), new FrameworkPropertyMetadata(0.000, FrameworkPropertyMetadataOptions.AffectsRender));
         /// <summary>

+ 17 - 17
PunkHPX8_Themes/UserControls/ReservoirsRecipeParametersPanel.xaml.cs

@@ -46,23 +46,23 @@ namespace PunkHPX8_Themes.UserControls
             }
         }
 
-        public static readonly DependencyProperty ReservoirCommonDataProperty = DependencyProperty.Register(
-           "ReservoirCommonData", typeof(CompactMembranReservoirData), typeof(ReservoirsRecipeParametersPanel),
-               new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
-        /// <summary>
-        /// ReservoirCommonData
-        /// </summary>
-        public CompactMembranReservoirData ReservoirCommonData
-        {
-            get
-            {
-                return (CompactMembranReservoirData)this.GetValue(ReservoirCommonDataProperty);
-            }
-            set
-            {
-                this.SetValue(ReservoirCommonDataProperty, value);
-            }
-        }
+        //public static readonly DependencyProperty ReservoirCommonDataProperty = DependencyProperty.Register(
+        //   "ReservoirCommonData", typeof(CompactMembranReservoirData), typeof(ReservoirsRecipeParametersPanel),
+        //       new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
+        ///// <summary>
+        ///// ReservoirCommonData
+        ///// </summary>
+        //public CompactMembranReservoirData ReservoirCommonData
+        //{
+        //    get
+        //    {
+        //        return (CompactMembranReservoirData)this.GetValue(ReservoirCommonDataProperty);
+        //    }
+        //    set
+        //    {
+        //        this.SetValue(ReservoirCommonDataProperty, value);
+        //    }
+        //}
 
         public static readonly DependencyProperty ResRecipeCommonDataProperty = DependencyProperty.Register(
                 "ResRecipeCommonData", typeof(ResRecipe), typeof(ReservoirsRecipeParametersPanel),

+ 4 - 0
PunkHPX8_Twincate/PunkHPX8.project.~u

@@ -0,0 +1,4 @@
+JET-CZK
+DESKTOP-BNQ0O7J
+21088
+638893743375020016

+ 6 - 0
PunkHPX8_UI/Config/UIMenu.json

@@ -349,6 +349,12 @@
 				"View": "DepRecipeView"
 			},
 			{
+				"Id": "DqdrRecipe",
+				"IsShow": "true",
+				"Name": "DQDR",
+				"View": "DqdrRecipeView"
+			},
+			{
 				"Id": "QdrRecipe",
 				"IsShow": "true",
 				"Name": "QDR",

+ 16 - 0
PunkHPX8_UI/Config/UIMenu_permission.json

@@ -247,6 +247,10 @@
 						"Permission": 2
 					},
 					{
+						"MenuName": "DQDR",
+						"Permission": 2
+					},
+					{
 						"MenuName": "QDR",
 						"Permission": 2
 					},
@@ -566,6 +570,10 @@
 						"Permission": 2
 					},
 					{
+						"MenuName": "DQDR",
+						"Permission": 2
+					},
+					{
 						"MenuName": "QDR",
 						"Permission": 2
 					},
@@ -857,6 +865,10 @@
 						"Permission": 2
 					},
 					{
+						"MenuName": "DQDR",
+						"Permission": 2
+					},
+					{
 						"MenuName": "QDR",
 						"Permission": 2
 					},
@@ -1193,6 +1205,10 @@
 						"Permission": 2
 					},
 					{
+						"MenuName": "DQDR",
+						"Permission": 2
+					},
+					{
 						"MenuName": "QDR",
 						"Permission": 2
 					},