Zixuan 1 week ago
parent
commit
49746f80cc

+ 5 - 0
Analizer/ProximaAnalizer/App.xaml.cs

@@ -1,6 +1,8 @@
 using ProximaAnalizer.Data;
 using ProximaAnalizer.ViewModels;
+using ProximaAnalizer.ViewModels.Dialog;
 using ProximaAnalizer.Views;
+using ProximaAnalizer.Views.Dialog;
 using SqlSugarORM;
 using System.Windows;
 
@@ -21,7 +23,10 @@ public partial class App : PrismApplication
         containerRegistry.RegisterForNavigation<DBInfoTrace, DBInfoTraceViewModel>("DBInfoTrace");
         containerRegistry.RegisterForNavigation<DBInfoAlarm, DBInfoAlarmViewModel>("DBInfoAlarm");
 
+        containerRegistry.RegisterDialog<LinePicker, DialogPickerViewModel>("LinePicker");
+
         containerRegistry.RegisterSingleton<SqlSugarCustom>();
         containerRegistry.RegisterSingleton<TraceData>();
+        containerRegistry.RegisterSingleton<LineCollection>();
     }
 }

+ 62 - 0
Analizer/ProximaAnalizer/Data/LineType.cs

@@ -0,0 +1,62 @@
+using System.Collections.ObjectModel;
+using System.Windows.Media;
+
+namespace ProximaAnalizer.Data;
+
+internal partial class LineCollection : ObservableObject
+{
+    public LineCollection()
+    {
+        this.LinesDash.Add(new("FF00FF", [2, 2]));
+        this.LinesDash.Add(new("4B0082", [2, 2]));
+        this.LinesDash.Add(new("7B68EE", [2, 2]));
+        this.LinesDash.Add(new("0000FF", [2, 2]));
+        this.LinesDash.Add(new("1E90FF", [2, 2]));
+        this.LinesDash.Add(new("00FFFF", [2, 2]));
+        this.LinesDash.Add(new("00FF7F", [2, 2]));
+        this.LinesDash.Add(new("FFD700", [2, 2]));
+        this.LinesDash.Add(new("FF8C00", [2, 2]));
+        this.LinesDash.Add(new("FF0000", [2, 2]));
+        this.LinesDash.Add(new("696969", [2, 2]));
+
+        this.LinesSolid.Add(new("FF00FF", [2, 0]));
+        this.LinesSolid.Add(new("4B0082", [2, 0]));
+        this.LinesSolid.Add(new("7B68EE", [2, 0]));
+        this.LinesSolid.Add(new("0000FF", [2, 0]));
+        this.LinesSolid.Add(new("1E90FF", [2, 0]));
+        this.LinesSolid.Add(new("00FFFF", [2, 0]));
+        this.LinesSolid.Add(new("00FF7F", [2, 0]));
+        this.LinesSolid.Add(new("FFD700", [2, 0]));
+        this.LinesSolid.Add(new("FF8C00", [2, 0]));
+        this.LinesSolid.Add(new("FF0000", [2, 0]));
+        this.LinesSolid.Add(new("696969", [2, 0]));
+    }
+
+    [ObservableProperty]
+    private ObservableCollection<LineType> _LinesSolid = [];
+
+    [ObservableProperty]
+    private ObservableCollection<LineType> _LinesDash = [];
+
+}
+
+internal partial class LineType : ObservableObject
+{
+    public LineType(string color, DoubleCollection dash)
+    {
+        this.Brush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#" + color));
+        this.HexRGB = color;
+        this.DashArray = dash;
+        if (dash[1] != 0)
+            LinePattern = ScottPlot.LinePattern.Dashed;
+        else
+            LinePattern = ScottPlot.LinePattern.Solid;
+    }
+
+    [ObservableProperty]
+    private bool _IsEnable = true;
+    public ScottPlot.LinePattern LinePattern { get; }
+    public string HexRGB { get; }
+    public Brush? Brush { get; set; }
+    public DoubleCollection? DashArray { get; set; }
+}

+ 3 - 0
Analizer/ProximaAnalizer/ProximaAnalizer.csproj.user

@@ -8,6 +8,9 @@
     <Compile Update="Views\DBInfoTrace.xaml.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Update="Views\Dialog\LinePicker.xaml.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Update="Views\Loading.xaml.cs">
       <SubType>Code</SubType>
     </Compile>

+ 11 - 0
Analizer/ProximaAnalizer/PublicEvent/RefreshRecipeData.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ProximaAnalizer.PublicEvent;
+
+internal class RefreshRecipeData: PubSubEvent
+{
+}

+ 254 - 40
Analizer/ProximaAnalizer/ViewModels/DBInfoTraceViewModel.cs

@@ -1,15 +1,67 @@
 using Mapster;
+using Prism.Dialogs;
+using ScottPlot;
+using ScottPlot.Colormaps;
+using ScottPlot.Plottables;
+using ScottPlot.WPF;
 using SqlSugar;
 using System.Collections.Generic;
 using System.Text;
+using System.Windows;
+using System.Windows.Media;
 using Universal;
+using static Dm.FldrStatement;
 
 namespace ProximaAnalizer.ViewModels;
 
-internal partial class DBInfoTraceViewModel(TraceData traceData, SqlSugarCustom sqlSugarCustom) : ObservableObject
+internal partial class DBInfoTraceViewModel : ObservableObject
 {
+    public DBInfoTraceViewModel(TraceData traceData,
+        SqlSugarCustom sqlSugarCustom,
+        IEventAggregator eventAggregator,
+        IDialogService dialogService)
+    {
+        this.traceData = traceData;
+        this.sqlSugarCustom = sqlSugarCustom;
+        this.dialogService = dialogService;
+        this.PlotControl = new();
+        this.InitPlot();
+        eventAggregator.GetEvent<RefreshRecipeData>().Subscribe(Search);
+    }
+
+    private void InitPlot()
+    {
+        this.PlotControl.Plot.Grid.XAxisStyle.MajorLineStyle.Width = 1f;
+        this.PlotControl.Plot.Grid.YAxisStyle.MajorLineStyle.Width = 1f;
+        this.PlotControl.Plot.Axes.Bottom.TickLabelStyle.Alignment = Alignment.MiddleLeft;
+        this.PlotControl.Plot.RenderManager.RenderStarting += (s, e) =>
+        {
+            Tick[] ticks = this.PlotControl.Plot.Axes.Bottom.TickGenerator.Ticks;
+            for (int i = 0; i < ticks.Length; i++)
+            {
+                DateTime dt = DateTime.FromOADate(ticks[i].Position);
+                string label = $"{dt:MM-dd  HH:mm:ss}";
+                ticks[i] = new Tick(ticks[i].Position, label);
+            }
+        };
+
+        this.PlotControl.Plot.FigureBackground.Color = ScottPlot.Colors.Transparent;
+        this.PlotControl.Plot.Axes.Bottom.TickLabelStyle.Rotation = 90;
+        this.PlotControl.Plot.Axes.Bottom.TickLabelStyle.Alignment = Alignment.MiddleLeft;
+        //PixelPadding padding = new(40, 20, 65, 10);
+        //this.PlotControl.Plot.Layout.Fixed(padding);
+        this.PlotControl.Plot.FigureBackground.Color = ScottPlot.Colors.Transparent;
+        //UpdateDetail();
+    }
+
 
     [ObservableProperty]
+    private WpfPlot _PlotControl;
+
+    private readonly TraceData traceData;
+    private readonly SqlSugarCustom sqlSugarCustom;
+    private readonly IDialogService dialogService;
+    [ObservableProperty]
     private ObservableDictionary<DateTime, SelectRecipeStep> _RecipeSteps = [];
 
     [ObservableProperty]
@@ -46,35 +98,7 @@ internal partial class DBInfoTraceViewModel(TraceData traceData, SqlSugarCustom
 
         RecipeSteps.Where(t => t.Key >= start && t.Key <= end).Foreach(t => t.Value.IsSelected = true);
 
-        var whereFunc = ObjectFuncModel.Create("Format", "time", ">", "{long}:" + $"{start.Ticks}", "&&", "time", "<", "{long}:" + $"{end.Ticks}");
-        dynamic f = sqlSugarCustom.Client.Queryable<dynamic>().AS($"\"{start:yyyyMMdd}.PM1\"").Where(whereFunc).First();
-        dynamic system = sqlSugarCustom.Client.Queryable<dynamic>().AS($"\"{start:yyyyMMdd}.System\"").Where(whereFunc).First();
-        GeneralProcessData processData = new();
-
-        if (f is not IDictionary<string, object> input)
-            return;
-
-        if (!processData.ToDictionary(input, out Dictionary<string, object>? output) || output is null)
-            return;
-
-        if (output["PM1"] is not IDictionary<string, object> pmData)
-            return;
 
-        if (!processData.ToDictionary(system, out Dictionary<string, object>? systemDic) || systemDic is null)
-            return;
-
-        Dictionary<string, object> temp = [];
-        Dictionary<string, object> PM1 = [];
-        Dictionary<string, object> System = [];
-        temp.Add("PM1", PM1);
-        temp.Add("System", System);
-        this.CreateTablePM(pmData, PM1);
-        this.CreateTableSystem(systemDic!, System);
-        this.Hierachy = temp;
-        //this.Left.Clear();
-        //this.Right.Clear();
-        this.Cache.Clear();
-        this.Cache.Push(temp);
         this.AutoGenerated = true;
     }
 
@@ -98,16 +122,49 @@ internal partial class DBInfoTraceViewModel(TraceData traceData, SqlSugarCustom
             return;
         }
 
-        this.Left.TryAdd((string)item.Value, item.Value);
+        //this.Left.TryAdd((string)item.Value, item.Value);
+        //IDialogParameters parameters, Action< IDialogResult > callback
+        IDialogParameters para = new DialogParameters() { { "Line", item.Value } };
+        dialogService.Show("LinePicker", para, AddLine);
+    }
+
+    [RelayCommand]
+    private void EditLine(KeyValuePair<string, object> item)
+    {
+        IDialogParameters para = new DialogParameters() { { "Line", item.Key } };
+        dialogService.Show("LinePicker", para, AddLine);
+    }
+
+    private void AddLine(IDialogResult dialogResult)
+    {
+        dialogResult.Parameters.TryGetValue("Line", out LineType? lineType);
+        dialogResult.Parameters.TryGetValue("Name", out string? line);
+        dialogResult.Parameters.TryGetValue("Axis", out string? Axis);
+        if (lineType is null || string.IsNullOrEmpty(line) || string.IsNullOrEmpty(Axis))
+            return;
+
+        ObservableDictionary<string, object>? lineCollection = Axis switch
+        {
+            "L" => Left,
+            "R" => Right,
+            _ => default
+        };
+
+        if (lineCollection is null)
+            return;
+
+        if (lineCollection.TryGetValue(line, out object? oldType) && oldType is LineType oldLine)
+            oldLine.IsEnable = true;
+
+        lineCollection[line] = lineType;
     }
 
+
     [RelayCommand]
     private void Return()
     {
         if (this.Cache.TryPop(out var output) && output is not null)
-        {
             this.Hierachy = output;
-        }
     }
 
 
@@ -118,6 +175,10 @@ internal partial class DBInfoTraceViewModel(TraceData traceData, SqlSugarCustom
             return;
         if (sqlSugarCustom.Client is null)
             return;
+        this.Cache.Clear();
+        this.RecipeSteps ??= [];
+        this.RecipeSteps.Clear();
+        this.Clear("");
 
         DateTime beginTime = traceData.ProcessData.Process_Begin_Time;
         DateTime endTime = traceData.ProcessData.Process_End_Time;
@@ -125,18 +186,69 @@ internal partial class DBInfoTraceViewModel(TraceData traceData, SqlSugarCustom
         long beginTicks = beginTime.Ticks;
         long endTicks = endTime.Ticks;
 
-        List<RecipeStepData> recipeSteps = sqlSugarCustom.Client.Queryable<RecipeStepData>().AS("recipe_step_data")
-            .Where(t => t.Process_Data_Guid == traceData.ProcessData.Guid)
-            .OrderBy(t => t.Step_Begin_Time).ToList();
+        List<RecipeStepData> recipeSteps;
+
+        try
+        {
+            recipeSteps = sqlSugarCustom.Client.Queryable<RecipeStepData>().AS("recipe_step_data")
+                .Where(t => t.Process_Data_Guid == traceData.ProcessData.Guid)
+                .OrderBy(t => t.Step_Begin_Time).ToList();
+        }
+        catch
+        {
+            MessageBox.Show($"recipe_step_data 记录不存在", "Warning", MessageBoxButton.OK, MessageBoxImage.Error);
+            return;
+        }
+
+        if (recipeSteps.Count == 0)
+        {
+            MessageBox.Show($"recipe_step 步骤数量为0", "Warning", MessageBoxButton.OK, MessageBoxImage.Error);
+            return;
+        }
+
 
-        this.RecipeSteps ??= [];
-        this.RecipeSteps.Clear();
         foreach (var item in recipeSteps)
         {
             SelectRecipeStep step = new();
             item.Adapt(step);
             this.RecipeSteps.TryAdd(item.Step_Begin_Time, step);
         }
+
+        dynamic f;
+        dynamic system;
+        try
+        {
+            f = sqlSugarCustom.Client.Queryable<dynamic>().AS($"\"{beginTime:yyyyMMdd}.PM1\"").First();
+            system = sqlSugarCustom.Client.Queryable<dynamic>().AS($"\"{beginTime:yyyyMMdd}.System\"").First();
+        }
+        catch
+        {
+            MessageBox.Show($"{beginTime:yyyyMMdd} 记录不存在", "Warning", MessageBoxButton.OK, MessageBoxImage.Error);
+            return;
+        }
+        GeneralProcessData processData = new();
+
+        if (f is not IDictionary<string, object> input)
+            return;
+
+        if (!processData.ToDictionary(input, out Dictionary<string, object>? output) || output is null)
+            return;
+
+        if (output["PM1"] is not IDictionary<string, object> pmData)
+            return;
+
+        if (!processData.ToDictionary(system, out Dictionary<string, object>? systemDic) || systemDic is null)
+            return;
+
+        Dictionary<string, object> temp = [];
+        Dictionary<string, object> PM1 = [];
+        Dictionary<string, object> System = [];
+        temp.Add("PM1", PM1);
+        temp.Add("System", System);
+        this.CreateTablePM(pmData, PM1);
+        this.CreateTableSystem(systemDic!, System);
+        this.Hierachy = temp;
+        this.Cache.Push(temp);
     }
 
     private bool CreateTablePM(IDictionary<string, object> data, IDictionary<string, object> cache)
@@ -308,14 +420,17 @@ internal partial class DBInfoTraceViewModel(TraceData traceData, SqlSugarCustom
     [RelayCommand]
     private void RemoveLeft(string key)
     {
-        this.Left.TryRemove(key, out _);
-
+        this.Left.TryRemove(key, out object? line);
+        if (line is LineType lineType)
+            lineType.IsEnable = true;
     }
 
     [RelayCommand]
     private void RemoveRight(string key)
     {
-        this.Right.TryRemove(key, out _);
+        this.Right.TryRemove(key, out object? line);
+        if (line is LineType lineType)
+            lineType.IsEnable = true;
     }
 
     [RelayCommand]
@@ -324,17 +439,116 @@ internal partial class DBInfoTraceViewModel(TraceData traceData, SqlSugarCustom
         switch (para)
         {
             case "L":
+                this.Left.Foreach(t => ((LineType)t.Value).IsEnable = true);
                 this.Left.Clear();
                 break;
             case "R":
+                this.Right.Foreach(t => ((LineType)t.Value).IsEnable = true);
                 this.Right.Clear();
                 break;
             default:
+                this.Right.Foreach(t => ((LineType)t.Value).IsEnable = true);
+                this.Right.Clear();
+                this.Left.Foreach(t => ((LineType)t.Value).IsEnable = true);
+                this.Left.Clear();
                 break;
         }
     }
+
+
+    [RelayCommand]
+    private void GeneratePlot()
+    {
+        if (this.sqlSugarCustom.Client is null)
+            return;
+        if (!this.RecipeSteps.Any(t => t.Value.IsSelected))
+            return;
+
+        DateTime start = this.RecipeSteps.Where(t => t.Value.IsSelected).First().Key;
+        DateTime end = this.RecipeSteps.Where(t => t.Value.IsSelected).Last().Key;
+
+        var whereFunc = ObjectFuncModel.Create("Format", "time", ">", "{long}:" + $"{start.Ticks}", "&&", "time", "<", "{long}:" + $"{end.Ticks}");
+        var f = sqlSugarCustom.Client.Queryable<dynamic>().AS($"\"{start:yyyyMMdd}.PM1\"").Where(whereFunc).ToList();
+        var system = sqlSugarCustom.Client.Queryable<dynamic>().AS($"\"{start:yyyyMMdd}.System\"").Where(whereFunc).ToList();
+
+        f.AddRange(system);
+
+        Dictionary<string, List<float>> cacheLeft = [];
+        Dictionary<string, List<float>> cacheRight = [];
+        List<DateTime> time = [];
+        foreach (var item in f)
+        {
+            if (item is not IDictionary<string, object> data)
+                continue;
+
+            time.Add(new DateTime((long)data["time"]));
+
+            foreach (string key in Left.Keys)
+            {
+                if (data.TryGetValue(key, out object? value) && value is not null)
+                {
+                    if (!cacheLeft.TryGetValue(key, out List<float>? collections) || collections is null)
+                    {
+                        collections = [];
+                        cacheLeft[key] = collections;
+                    }
+                    collections.Add((float)value);
+                }
+            }
+
+            foreach (string key in Right.Keys)
+            {
+                if (data.TryGetValue(key, out object? value) && value is not null)
+                {
+                    if (!cacheRight.TryGetValue(key, out List<float>? collections) || collections is null)
+                    {
+                        collections = [];
+                        cacheRight[key] = collections;
+                    }
+                    collections.Add((float)value);
+                }
+            }
+
+        }
+
+        this.PlotControl.Plot.Clear();
+
+        foreach (var item in cacheLeft)
+            this.SetLeftLine(time, item.Value, ((LineType)Left[item.Key])!.LinePattern, MarkerStyle.None, 2f, ((LineType)Left[item.Key])!.HexRGB);
+
+        foreach (var item in cacheRight)
+            this.SetRightLine(time, item.Value, ((LineType)Right[item.Key])!.LinePattern, MarkerStyle.None, 2f, ((LineType)Right[item.Key])!.HexRGB);
+
+        this.PlotControl.Plot.Axes.Bottom.TickLabelStyle.OffsetY= 0;
+        //this.PlotControl.Plot.
+        this.PlotControl.Plot.Axes.AutoScale();
+        PlotControl.Refresh();
+
+    }
+
+    private void SetLeftLine(List<DateTime> time, List<float> value, LinePattern linePattern, MarkerStyle markerStyle, float lineWidth, string color)
+    {
+        Scatter mainScatter = this.PlotControl.Plot.Add.Scatter(time, value);
+        mainScatter.MarkerStyle = markerStyle;
+        mainScatter.LineWidth = lineWidth;
+        mainScatter.LinePattern = linePattern;
+        mainScatter.Color = new ScottPlot.Color(color);
+        mainScatter.Axes.YAxis = this.PlotControl.Plot.Axes.Left;
+    }
+
+    private void SetRightLine(List<DateTime> time, List<float> value, LinePattern linePattern, MarkerStyle markerStyle, float lineWidth, string color)
+    {
+        Scatter mainScatter = this.PlotControl.Plot.Add.Scatter(time, value);
+        mainScatter.MarkerStyle = markerStyle;
+        mainScatter.LineWidth = lineWidth;
+        mainScatter.LinePattern = linePattern;
+        mainScatter.Color = new ScottPlot.Color(color);
+        mainScatter.Axes.YAxis = this.PlotControl.Plot.Axes.Right;
+    }
 }
 
+
+
 public partial class SelectRecipeStep : ObservableObject
 {
     [ObservableProperty]

+ 51 - 0
Analizer/ProximaAnalizer/ViewModels/Dialog/DialogPickerViewModel.cs

@@ -0,0 +1,51 @@
+namespace ProximaAnalizer.ViewModels.Dialog;
+
+internal partial class DialogPickerViewModel(LineCollection lineCollection) : ObservableObject, IDialogAware
+{
+
+    [ObservableProperty]
+    private LineCollection _LineCollection = lineCollection;
+
+    public DialogCloseListener RequestClose { get; set; }
+
+    [ObservableProperty]
+    private string _Title = "Line Picker";
+
+    private string? Line;
+
+    [RelayCommand]
+    private void SelectLeftLine(LineType lineType)
+    {
+        IDialogResult result = new DialogResult();
+        lineType.IsEnable = false;
+        result.Parameters.Add("Line", lineType);
+        result.Parameters.Add("Name", Line!);
+        result.Parameters.Add("Axis", "L");
+        this.RequestClose.Invoke(result);
+    }
+
+    [RelayCommand]
+    private void SelectRightLine(LineType lineType)
+    {
+        IDialogResult result = new DialogResult();
+        lineType.IsEnable = false;
+        result.Parameters.Add("Line", lineType);
+        result.Parameters.Add("Name", Line!);
+        result.Parameters.Add("Axis", "R");
+        this.RequestClose.Invoke(result);
+    }
+
+    public bool CanCloseDialog()
+    {
+        return true;
+    }
+
+    public void OnDialogClosed()
+    {
+    }
+
+    public void OnDialogOpened(IDialogParameters parameters)
+    {
+        parameters.TryGetValue<string>("Line", out Line);
+    }
+}

+ 100 - 6
Analizer/ProximaAnalizer/ViewModels/RecipeStepNaviViewModel.cs

@@ -2,6 +2,7 @@
 using ProximaAnalizer.Data;
 using System.Collections.ObjectModel;
 using System.Net.NetworkInformation;
+using System.Windows;
 
 namespace ProximaAnalizer.ViewModels;
 
@@ -11,14 +12,50 @@ internal partial class RecipeStepNaviViewModel(IEventAggregator eventAggregator,
     private DateTime _SelectedTime = DateTime.Now;
 
     [ObservableProperty]
+    private Visibility _Masking = Visibility.Hidden;
+
+    [ObservableProperty]
     private ObservableCollection<ProcessData> _ProcessData = [];
 
+    partial void OnSelectedTimeChanged(DateTime value)
+    {
+        this.Search();
+    }
+
     [RelayCommand]
     private void Navi(ProcessData process)
     {
+        this.Masking = Visibility.Visible;
         traceData.ProcessData = process;
-        eventAggregator.GetEvent<WindowSwitch>().Page = Pages.MainWindow;
-        eventAggregator.GetEvent<WindowSwitch>().Publish();
+
+        Task.Factory.StartNew(() =>
+        {
+            try
+            {
+                Thread.Sleep(200);
+                App.Current.Dispatcher.Invoke(() =>
+                {
+                    eventAggregator.GetEvent<WindowSwitch>().Page = Pages.MainWindow;
+                    eventAggregator.GetEvent<WindowSwitch>().Publish();
+                    eventAggregator.GetEvent<RefreshRecipeData>().Publish();
+                });
+            }
+            finally
+            {
+                this.Masking = Visibility.Collapsed;
+            }
+        });
+    }
+
+    [RelayCommand]
+    private void DayOperator(string para)
+    {
+        this.SelectedTime = para switch
+        {
+            "+" => this.SelectedTime.AddDays(1),
+            "-" => this.SelectedTime.AddDays(-1),
+            _ => this.SelectedTime
+        };
     }
 
     [RelayCommand]
@@ -29,11 +66,68 @@ internal partial class RecipeStepNaviViewModel(IEventAggregator eventAggregator,
 
         this.ProcessData ??= [];
         this.ProcessData.Clear();
+        this.Masking = Visibility.Visible;
+
+        Task.Factory.StartNew(() =>
+        {
+            try
+            {
+                var t = sqlSugar.Client.Queryable<ProcessData>().Where(t =>
+                t.Process_Begin_Time >= SelectedTime &&
+                t.Process_Begin_Time < SelectedTime.AddDays(1)).AS("process_data").ToArray();
+                foreach (var item in t)
+                {
+                    App.Current.Dispatcher.Invoke(() =>
+                    {
+                        this.ProcessData.Add(item);
+                    });
+                    Thread.Sleep(1);
+                }
+
+            }
+            finally
+            {
+                this.Masking = Visibility.Collapsed;
+            }
+        });
+    }
+
+    [RelayCommand]
+    private void NameSearch(string name)
+    {
+        if (sqlSugar.Client is null)
+            return;
+        if (string.IsNullOrEmpty(name))
+            return;
+
+        this.ProcessData ??= [];
+        this.ProcessData.Clear();
+        this.Masking = Visibility.Visible;
+        Task.Factory.StartNew(() =>
+        {
+            try
+            {
+                var t = sqlSugar.Client.Queryable<ProcessData>()
+                    .Where(t => (string.IsNullOrEmpty(t.Recipe_Name) ? string.Empty : t.Recipe_Name).ToLower().Contains(name.ToLower()))
+                    .AS("process_data").ToArray()
+                    .OrderBy(t => t.Process_Begin_Time);
+
+                foreach (var item in t)
+                {
+                    App.Current.Dispatcher.Invoke(() =>
+                    {
+                        this.ProcessData.Add(item);
+                    });
+                    Thread.Sleep(1);
+                }
+
+            }
+            finally
+            {
+                this.Masking = Visibility.Collapsed;
+            }
+        });
 
-        var t = sqlSugar.Client.Queryable<ProcessData>().Where(t =>
-        t.Process_Begin_Time >= SelectedTime &&
-        t.Process_Begin_Time < SelectedTime.AddDays(1)).AS("process_data").ToArray();
-        this.ProcessData.AddRange(t);
     }
 }
 

+ 72 - 52
Analizer/ProximaAnalizer/Views/DBInfoTrace.xaml

@@ -7,6 +7,7 @@
              xmlns:prism="http://prismlibrary.com/"
              prism:ViewModelLocator.AutoWireViewModel="True"
              xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
+             xmlns:ScottPlot="clr-namespace:ScottPlot.WPF;assembly=ScottPlot.WPF"
              mc:Ignorable="d" 
              d:DesignHeight="450" d:DesignWidth="800">
     <UserControl.Resources>
@@ -25,8 +26,8 @@
             <RowDefinition Height="2"/>
             <RowDefinition Height="180"/>
         </Grid.RowDefinitions>
-        
-        <Expander ExpandDirection="Right" IsExpanded="True" Margin="0,6" Padding="0,-2" Background="{StaticResource LightThemeColor}" TextElement.FontSize="14">
+
+        <Expander ExpandDirection="Right" IsExpanded="True" Margin="0,6" Padding="0,-2" TextElement.FontSize="14">
             <Expander.Header>
                 <TextBlock Text="Data Selector" HorizontalAlignment="Center" Margin="4">
                     <TextBlock.LayoutTransform>
@@ -41,54 +42,45 @@
                     <ColumnDefinition Width="auto"/>
                 </Grid.ColumnDefinitions>
                 <GroupBox Header="时间范围" Margin="4,0" MinWidth="240">
-                    <Grid>
-                        <Grid.RowDefinitions>
-                            <RowDefinition Height="auto"/>
-                            <RowDefinition Height="4"/>
-                            <RowDefinition/>
-                        </Grid.RowDefinitions>
-                        <Button Grid.Row="0" Margin="4" Command="{Binding SearchCommand}">刷新数据</Button>
-                        <ScrollViewer Grid.Row="2">
-                            <ItemsControl ItemsSource="{Binding RecipeSteps}" Margin="4">
-                                <ItemsControl.ItemTemplate>
-                                    <DataTemplate>
-                                        <CheckBox Margin="0,2" BorderThickness="0" VerticalAlignment="Center" Style="{StaticResource StepCheckBox}" IsChecked="{Binding Value.IsSelected, Mode=TwoWay}">
-                                            <i:Interaction.Triggers>
-                                                <i:EventTrigger EventName="Checked">
-                                                    <prism:InvokeCommandAction  Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:DBInfoTrace}, 
+                    <ScrollViewer>
+                        <ItemsControl ItemsSource="{Binding RecipeSteps}" Margin="4">
+                            <ItemsControl.ItemTemplate>
+                                <DataTemplate>
+                                    <CheckBox Margin="0,2" VerticalAlignment="Center"  IsChecked="{Binding Value.IsSelected, Mode=TwoWay}">
+                                        <i:Interaction.Triggers>
+                                            <i:EventTrigger EventName="Checked">
+                                                <prism:InvokeCommandAction  Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:DBInfoTrace}, 
                                                                                         Path=DataContext.SelectedCommand}" 
                                                                             CommandParameter="{Binding Value}"/>
-                                                </i:EventTrigger>
-                                                <i:EventTrigger EventName="Unchecked">
-                                                    <prism:InvokeCommandAction  Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:DBInfoTrace}, 
+                                            </i:EventTrigger>
+                                            <i:EventTrigger EventName="Unchecked">
+                                                <prism:InvokeCommandAction  Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:DBInfoTrace}, 
                                                                                         Path=DataContext.UnSelectedCommand}" 
                                                                             CommandParameter="{Binding Value}"/>
-                                                </i:EventTrigger>
-                                            </i:Interaction.Triggers>
-                                            <Grid HorizontalAlignment="Left" Margin="8,0,0,0" VerticalAlignment="Center">
-                                                <Grid.ColumnDefinitions>
-                                                    <ColumnDefinition Width="auto"/>
-                                                    <ColumnDefinition Width="12"/>
-                                                    <ColumnDefinition Width="0"/>
-                                                    <ColumnDefinition Width="12"/>
-                                                    <ColumnDefinition Width="auto"/>
-                                                </Grid.ColumnDefinitions>
-                                                <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text="{Binding Key, StringFormat=yyyy-MM-dd  HH:mm:ss.f}"/>
-                                                <!--<TextBlock Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Value.Step_Number}"/>-->
-                                                <TextBlock Grid.Column="4" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Value.Step_Name}"/>
-                                            </Grid>
-                                        </CheckBox>
-                                    </DataTemplate>
-                                </ItemsControl.ItemTemplate>
-                                <ItemsControl.ItemsPanel>
-                                    <ItemsPanelTemplate>
-                                        <StackPanel Orientation="Vertical"/>
-                                    </ItemsPanelTemplate>
-                                </ItemsControl.ItemsPanel>
-                            </ItemsControl>
-                        </ScrollViewer>
-
-                    </Grid>
+                                            </i:EventTrigger>
+                                        </i:Interaction.Triggers>
+                                        <Grid HorizontalAlignment="Left" Margin="8,0,0,0" VerticalAlignment="Center">
+                                            <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="auto"/>
+                                                <ColumnDefinition Width="12"/>
+                                                <ColumnDefinition Width="0"/>
+                                                <ColumnDefinition Width="12"/>
+                                                <ColumnDefinition Width="auto"/>
+                                            </Grid.ColumnDefinitions>
+                                            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text="{Binding Key, StringFormat=yyyy-MM-dd  HH:mm:ss.f}"/>
+                                            <!--<TextBlock Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Value.Step_Number}"/>-->
+                                            <TextBlock Grid.Column="4" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Value.Step_Name}"/>
+                                        </Grid>
+                                    </CheckBox>
+                                </DataTemplate>
+                            </ItemsControl.ItemTemplate>
+                            <ItemsControl.ItemsPanel>
+                                <ItemsPanelTemplate>
+                                    <StackPanel Orientation="Vertical"/>
+                                </ItemsPanelTemplate>
+                            </ItemsControl.ItemsPanel>
+                        </ItemsControl>
+                    </ScrollViewer>
                 </GroupBox>
 
                 <GroupBox Grid.Column="2" Margin="4,0" Header="数据选择" MinWidth="240">
@@ -126,9 +118,11 @@
                     <RowDefinition Height="auto"/>
                     <RowDefinition Height="0"/>
                 </Grid.RowDefinitions>
-
-                <WrapPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center">
-                    <Button Width="120" Height="24" Margin="4">绘制图标</Button>
+                <ContentControl Content="{Binding PlotControl, Mode=OneTime}" />
+                
+                <WrapPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center" >
+                    <Button Width="120" Height="24" Margin="4" Command="{Binding GeneratePlotCommand}">绘制图标</Button>
+                    <Button Width="120" Height="24" Margin="4">查看数据</Button>
                     <Button Width="120" Height="24" Margin="4">重置缩放</Button>
                     <Button Width="120" Height="24" Margin="4">横坐标 放大</Button>
                     <Button Width="120" Height="24" Margin="4">横坐标 缩小</Button>
@@ -167,8 +161,10 @@
                                             <ColumnDefinition Width="64"/>
                                         </Grid.ColumnDefinitions>
                                         <TextBlock Text="{Binding Key}"/>
-                                        <Button  Grid.Column="2" Background="Transparent" HorizontalContentAlignment="Left" BorderThickness="0">
-                                            <Line X1="0" Y1="0" X2="100" Y2="0" Stretch="Fill" Stroke="Red" StrokeDashArray="2,2" StrokeThickness="2"></Line>
+                                        <Button  Grid.Column="2" Background="Transparent" HorizontalContentAlignment="Left" BorderThickness="0"
+                                                 Command="{Binding RelativeSource={RelativeSource AncestorType=local:DBInfoTrace, Mode=FindAncestor}, Path=DataContext.EditLineCommand}"
+                                                 CommandParameter="{Binding}">
+                                            <Line X1="0" Y1="0" X2="100" Y2="0" Stretch="Fill" Stroke="{Binding Value.Brush}" StrokeDashArray="{Binding Value.DashArray}" StrokeThickness="3"/>
                                         </Button>
                                         <Button Grid.Column="4" Background="Transparent"
                                                 Command="{Binding RelativeSource={RelativeSource AncestorType=local:DBInfoTrace, Mode=FindAncestor}, 
@@ -191,7 +187,31 @@
                 <Button HorizontalAlignment="Right" Width="80" Command="{Binding ClearCommand}" CommandParameter="R">清除</Button>
                 <Border Grid.Row="2" BorderBrush="{StaticResource DarkBorderColor}" BorderThickness="1">
                     <ScrollViewer>
-
+                        <ItemsControl ItemsSource="{Binding Right}">
+                            <ItemsControl.ItemTemplate>
+                                <DataTemplate>
+                                    <Grid Margin="4,2">
+                                        <Grid.ColumnDefinitions>
+                                            <ColumnDefinition Width="*"/>
+                                            <ColumnDefinition Width="24"/>
+                                            <ColumnDefinition Width="180"/>
+                                            <ColumnDefinition Width="24"/>
+                                            <ColumnDefinition Width="64"/>
+                                        </Grid.ColumnDefinitions>
+                                        <TextBlock Text="{Binding Key}"/>
+                                        <Button  Grid.Column="2" Background="Transparent" HorizontalContentAlignment="Left" BorderThickness="0"
+                                                        Command="{Binding RelativeSource={RelativeSource AncestorType=local:DBInfoTrace, Mode=FindAncestor}, Path=DataContext.EditLineCommand}"
+                                                        CommandParameter="{Binding}">
+                                            <Line X1="0" Y1="0" X2="100" Y2="0" Stretch="Fill" Stroke="{Binding Value.Brush}" StrokeDashArray="{Binding Value.DashArray}" StrokeThickness="3"/>
+                                        </Button>
+                                        <Button Grid.Column="4" Background="Transparent"
+                                              Command="{Binding RelativeSource={RelativeSource AncestorType=local:DBInfoTrace, Mode=FindAncestor}, 
+                                                      Path=DataContext.RemoveRightCommand}"
+                                              CommandParameter="{Binding Key}">移除</Button>
+                                    </Grid>
+                                </DataTemplate>
+                            </ItemsControl.ItemTemplate>
+                        </ItemsControl>
                     </ScrollViewer>
                 </Border>
             </Grid>

+ 44 - 0
Analizer/ProximaAnalizer/Views/Dialog/LinePicker.xaml

@@ -0,0 +1,44 @@
+<UserControl x:Class="ProximaAnalizer.Views.Dialog.LinePicker"
+             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:ProximaAnalizer.Views.Dialog"
+             mc:Ignorable="d" 
+             
+             d:DesignHeight="450" d:DesignWidth="800">
+    <Grid Margin="16">
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="auto"/>
+            <ColumnDefinition Width="16"/>
+            <ColumnDefinition Width="auto"/>
+        </Grid.ColumnDefinitions>
+        <GroupBox Background="Transparent" BorderBrush="{StaticResource DarkBorderColor}" Header="添加左侧坐标轴">
+            <ItemsControl ItemsSource="{Binding LineCollection.LinesSolid}" Margin="8">
+                <ItemsControl.ItemTemplate>
+                    <DataTemplate>
+                        <Button Width="140" Height="24" Margin="4" Background="Transparent"  IsEnabled="{Binding IsEnable}"
+                                Command="{Binding RelativeSource={RelativeSource AncestorType=local:LinePicker, Mode=FindAncestor}, Path=DataContext.SelectLeftLineCommand}"
+                                CommandParameter="{Binding}">
+                            <Line X1="0" Y1="0" X2="100" Y2="0" Margin="8,0" Stretch="Fill" Stroke="{Binding Brush}" StrokeDashArray="{Binding DashArray}" StrokeThickness="3"/>
+                        </Button>
+                    </DataTemplate>
+                </ItemsControl.ItemTemplate>
+            </ItemsControl>
+        </GroupBox>
+        
+        <GroupBox Grid.Column="2" Background="Transparent" BorderBrush="{StaticResource DarkBorderColor}" Header="添加右侧坐标轴">
+            <ItemsControl ItemsSource="{Binding LineCollection.LinesDash}"  Margin="8">
+                <ItemsControl.ItemTemplate>
+                    <DataTemplate>
+                        <Button Width="140" Height="24" Margin="4" Background="Transparent"  IsEnabled="{Binding IsEnable}"
+                                   Command="{Binding RelativeSource={RelativeSource AncestorType=local:LinePicker, Mode=FindAncestor}, Path=DataContext.SelectRightLineCommand}"
+                                   CommandParameter="{Binding}">
+                            <Line X1="0" Y1="0" X2="100" Y2="0" Margin="8,0" Stretch="Fill" Stroke="{Binding Brush}" StrokeDashArray="{Binding DashArray}" StrokeThickness="3"/>
+                        </Button>
+                    </DataTemplate>
+                </ItemsControl.ItemTemplate>
+            </ItemsControl>
+        </GroupBox>
+    </Grid>
+</UserControl>

+ 28 - 0
Analizer/ProximaAnalizer/Views/Dialog/LinePicker.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 ProximaAnalizer.Views.Dialog
+{
+    /// <summary>
+    /// Interaction logic for LinePicker.xaml
+    /// </summary>
+    public partial class LinePicker : UserControl
+    {
+        public LinePicker()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 104 - 71
Analizer/ProximaAnalizer/Views/RecipeStepNavi.xaml

@@ -7,97 +7,130 @@
              xmlns:prism="http://prismlibrary.com/"
              prism:ViewModelLocator.AutoWireViewModel="True"
              mc:Ignorable="d" 
+             xmlns:c="clr-namespace:UICommon;assembly=UICommon"
              d:DesignHeight="450" d:DesignWidth="800">
+    <UserControl.Resources>
+        <ResourceDictionary Source="/UICommon;component/Resources.xaml"/>
+    </UserControl.Resources>
     <Grid Margin="8">
         <Grid.RowDefinitions>
             <RowDefinition Height="auto"/>
             <RowDefinition Height="8"/>
             <RowDefinition/>
         </Grid.RowDefinitions>
-
-        <Grid Margin="4">
+        <Grid Panel.ZIndex="1" Grid.RowSpan="3" Background="#90ffffff" Visibility="{Binding Masking}">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="auto"/>
+                <RowDefinition Height="8"/>
+                <RowDefinition/>
+            </Grid.RowDefinitions>
+            <StackPanel Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center">
+                <Image Source="{StaticResource Icon_Search}" Width="200"></Image>
+                <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20">查询中...</TextBlock>
+            </StackPanel>
+        </Grid>
+        <Grid>
             <Grid.ColumnDefinitions>
                 <ColumnDefinition Width="auto"/>
-                <ColumnDefinition Width="16"/>
+                <ColumnDefinition Width="12"/>
+                <ColumnDefinition Width="auto"/>
+                <ColumnDefinition Width="12"/>
                 <ColumnDefinition Width="auto"/>
-                <ColumnDefinition/>
             </Grid.ColumnDefinitions>
-            <DatePicker Width="140" SelectedDate="{Binding SelectedTime}"></DatePicker>
-            <Button Grid.Column="2" Width="80" Height="24" Command="{Binding SearchCommand}">查询</Button>
+            <GroupBox Header="根据日期查询" HorizontalAlignment="Left" VerticalAlignment="Center">
+                <StackPanel Orientation="Horizontal">
+                    <DatePicker Width="160" Margin="8" VerticalAlignment="Center" HorizontalAlignment="Center" SelectedDate="{Binding SelectedTime}"/>
+                    <Button Margin="4" Width="28" Height="24" Command="{Binding DayOperatorCommand}" CommandParameter="-">-</Button>
+                    <Button Margin="4" Width="28" Height="24" Command="{Binding DayOperatorCommand}" CommandParameter="+">+</Button>
+                </StackPanel>
+            </GroupBox>
+
+            <TextBlock Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center">或</TextBlock>
+
+            <GroupBox Grid.Column="4" Header="根据名称查询" HorizontalAlignment="Left" VerticalAlignment="Center">
+                <StackPanel Orientation="Horizontal" >
+                    <TextBox x:Name="NameBox" Width="140" Height="24" Margin="8" VerticalContentAlignment="Center" Padding="4,0"></TextBox>
+                    <Button Margin="8" Width="60" Height="24"
+                            Command="{Binding NameSearchCommand}"
+                            CommandParameter="{Binding ElementName=NameBox, Path=Text}">查询</Button>
+                </StackPanel>
+            </GroupBox>
         </Grid>
 
-        <Grid Grid.Row="2">
-            <Grid.RowDefinitions>
-                <RowDefinition/>
-                <RowDefinition Height="8"/>
-                <RowDefinition Height="auto"/>
-            </Grid.RowDefinitions>
-            <ScrollViewer>
-                <ItemsControl ItemsSource="{Binding ProcessData}" TextElement.FontSize="14">
-                    <ItemsControl.ItemTemplate>
-                        <DataTemplate>
-                            <Border Margin="4" BorderBrush="Black" BorderThickness="0.5">
-                                <Grid>
-                                    <Grid.ColumnDefinitions>
-                                        <ColumnDefinition Width="auto"/>
-                                        <ColumnDefinition Width="24"/>
-                                        <ColumnDefinition Width="*"/>
-                                        <ColumnDefinition Width="24"/>
-                                        <ColumnDefinition Width="auto"/>
-                                        <ColumnDefinition Width="24"/>
-                                        <ColumnDefinition Width="auto"/>
-                                        <ColumnDefinition Width="24"/>
-                   
-                                        <ColumnDefinition Width="auto"/>
-                                    </Grid.ColumnDefinitions>
-                                    <Grid.RowDefinitions>
-                                        <RowDefinition/>
-                                        <RowDefinition/>
-                                    </Grid.RowDefinitions>
+        <GroupBox Grid.Row="2" Header="工艺历史记录">
+
+            <Grid Margin="8">
+                <Grid.RowDefinitions>
+                    <RowDefinition/>
+                    <RowDefinition Height="8"/>
+                    <RowDefinition Height="auto"/>
+                </Grid.RowDefinitions>
+                <ScrollViewer>
+                    <ItemsControl ItemsSource="{Binding ProcessData}" TextElement.FontSize="14">
+                        <ItemsControl.ItemTemplate>
+                            <DataTemplate>
+                                <Border Margin="4" BorderBrush="Black" BorderThickness="0.5">
+                                    <Grid>
+                                        <Grid.ColumnDefinitions>
+                                            <ColumnDefinition Width="auto"/>
+                                            <ColumnDefinition Width="24"/>
+                                            <ColumnDefinition Width="*"/>
+                                            <ColumnDefinition Width="24"/>
+                                            <ColumnDefinition Width="auto" MinWidth="100"/>
+                                            <ColumnDefinition Width="24"/>
+                                            <ColumnDefinition Width="auto" MinWidth="100"/>
+                                            <ColumnDefinition Width="24"/>
+                                            <ColumnDefinition Width="auto"/>
+                                        </Grid.ColumnDefinitions>
+                                        <Grid.RowDefinitions>
+                                            <RowDefinition/>
+                                            <RowDefinition/>
+                                        </Grid.RowDefinitions>
 
-                                    <Border Background="{StaticResource LightNormalColor}">
-                                        <Grid Margin="4,2">
-                                            <Grid.ColumnDefinitions>
-                                                <ColumnDefinition Width="60"/>
-                                                <ColumnDefinition Width="4"/>
-                                                <ColumnDefinition/>
-                                            </Grid.ColumnDefinitions>
-                                            <TextBlock VerticalAlignment="Center">开始时间</TextBlock>
-                                            <TextBlock Grid.Column="2" Text="{Binding Process_Begin_Time, StringFormat=yyyy-MM-dd HH:mm:ss}"/>
-                                        </Grid>
-                                    </Border>
-                                    
-                                    <Border Grid.Row="1" Background="{StaticResource LightWarningColor}">
-                                        <Grid Margin="4,2">
-                                            <Grid.ColumnDefinitions>
-                                                <ColumnDefinition Width="60"/>
-                                                <ColumnDefinition Width="4"/>
-                                                <ColumnDefinition/>
-                                            </Grid.ColumnDefinitions>
-                                            <TextBlock VerticalAlignment="Center">结束时间</TextBlock>
-                                            <TextBlock Grid.Column="2" Text="{Binding Process_End_Time, StringFormat=yyyy-MM-dd HH:mm:ss}"/>
-                                        </Grid>
-                                    </Border>
+                                        <Border Background="{StaticResource LightNormalColor}">
+                                            <Grid Margin="4,2">
+                                                <Grid.ColumnDefinitions>
+                                                    <ColumnDefinition Width="60"/>
+                                                    <ColumnDefinition Width="4"/>
+                                                    <ColumnDefinition/>
+                                                </Grid.ColumnDefinitions>
+                                                <TextBlock VerticalAlignment="Center">开始时间</TextBlock>
+                                                <TextBlock Grid.Column="2" Text="{Binding Process_Begin_Time, StringFormat=yyyy-MM-dd HH:mm:ss}"/>
+                                            </Grid>
+                                        </Border>
 
-                                    <TextBlock Grid.Column="2" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center">配方名称</TextBlock>
-                                    <TextBlock Grid.Column="2" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Recipe_Name}"/>
+                                        <Border Grid.Row="1" Background="{StaticResource LightWarningColor}">
+                                            <Grid Margin="4,2">
+                                                <Grid.ColumnDefinitions>
+                                                    <ColumnDefinition Width="60"/>
+                                                    <ColumnDefinition Width="4"/>
+                                                    <ColumnDefinition/>
+                                                </Grid.ColumnDefinitions>
+                                                <TextBlock VerticalAlignment="Center">结束时间</TextBlock>
+                                                <TextBlock Grid.Column="2" Text="{Binding Process_End_Time, StringFormat=yyyy-MM-dd HH:mm:ss}"/>
+                                            </Grid>
+                                        </Border>
 
-                                    <TextBlock Grid.Column="4" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center">配方种类</TextBlock>
-                                    <TextBlock Grid.Column="4" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Recipe_Type}"/>
+                                        <!--<TextBlock Grid.Column="2" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center">配方名称</TextBlock>-->
+                                        <TextBlock Grid.Column="2" Grid.RowSpan="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="{Binding Recipe_Name}"/>
 
-                                    <TextBlock Grid.Column="6" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center">执行状态</TextBlock>
-                                    <TextBlock Grid.Column="6" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Process_Status}"/>
+                                        <TextBlock Grid.Column="4" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center">配方种类</TextBlock>
+                                        <TextBlock Grid.Column="4" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Recipe_Type}"/>
 
-                                    <Button Grid.Column="10" Grid.RowSpan="2" Margin="4" Width="80" Background="Transparent"
+                                        <TextBlock Grid.Column="6" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center">执行状态</TextBlock>
+                                        <TextBlock Grid.Column="6" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding Process_Status}"/>
+
+                                        <Button Grid.Column="10" Grid.RowSpan="2" Margin="4" Width="80" Background="Transparent"
                                         Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:RecipeStepNavi}, Path=DataContext.NaviCommand}"
                                         CommandParameter="{Binding}">查询数据</Button>
-                                </Grid>
-                            </Border>
-                        </DataTemplate>
-                    </ItemsControl.ItemTemplate>
-                </ItemsControl>
-            </ScrollViewer>
+                                    </Grid>
+                                </Border>
+                            </DataTemplate>
+                        </ItemsControl.ItemTemplate>
+                    </ItemsControl>
+                </ScrollViewer>
 
-        </Grid>
+            </Grid>
+        </GroupBox>
     </Grid>
 </UserControl>

+ 0 - 41
UICommon/Styles/OtherStyle.xaml

@@ -280,47 +280,6 @@
     </Style>
 
     <BorderGapMaskConverter x:Key="BorderGapMaskConverter"/>
-    <Style TargetType="{x:Type GroupBox}">
-        <Setter Property="BorderBrush" Value="{StaticResource  DarkBorderColor}"/>
-        <Setter Property="BorderThickness" Value="1"/>
-        <Setter Property="Template">
-            <Setter.Value>
-                <ControlTemplate TargetType="{x:Type GroupBox}">
-                    <Grid SnapsToDevicePixels="true">
-                        <Grid.ColumnDefinitions>
-                            <ColumnDefinition Width="6"/>
-                            <ColumnDefinition Width="Auto"/>
-                            <ColumnDefinition Width="*"/>
-                            <ColumnDefinition Width="6"/>
-                        </Grid.ColumnDefinitions>
-                        <Grid.RowDefinitions>
-                            <RowDefinition Height="Auto"/>
-                            <RowDefinition Height="Auto"/>
-                            <RowDefinition Height="*"/>
-                            <RowDefinition Height="6"/>
-                        </Grid.RowDefinitions>
-                        <Border Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4" Grid.Column="0" Grid.ColumnSpan="4" Grid.RowSpan="3" Grid.Row="1"/>
-                        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4" Grid.ColumnSpan="4" Grid.RowSpan="3" Grid.Row="1">
-                            <Border.OpacityMask>
-                                <MultiBinding ConverterParameter="7" Converter="{StaticResource BorderGapMaskConverter}">
-                                    <Binding ElementName="Header" Path="ActualWidth"/>
-                                    <Binding Path="ActualWidth" RelativeSource="{RelativeSource Mode=Self}"/>
-                                    <Binding Path="ActualHeight" RelativeSource="{RelativeSource Mode=Self}"/>
-                                </MultiBinding>
-                            </Border.OpacityMask>
-
-                        </Border>
-                        <Border x:Name="Header" Grid.Column="1" Padding="3,1,3,0" Grid.RowSpan="2" Grid.Row="0">
-                            <ContentPresenter ContentSource="Header" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
-                        </Border>
-                        <ContentPresenter Grid.Column="1" Grid.ColumnSpan="2" Margin="{TemplateBinding Padding}" Grid.Row="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
-                    </Grid>
-                </ControlTemplate>
-            </Setter.Value>
-        </Setter>
-    </Style>
-
-    
 
     <SolidColorBrush x:Key="Expander.Static.Circle.Stroke" Color="#FF333333"/>
     <SolidColorBrush x:Key="Expander.Static.Circle.Fill" Color="#FFFFFFFF"/>