using Bro.UI.Model.Winform; using ScottPlot; using Sunny.UI; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Windows.ApplicationModel.Calls; namespace Bro.M141.Process.UI { //[MenuNode("生产统计汇总-班次良率", "生产统计汇总-班次良率", 5, Common.Helper.EnumHelper.TopMenu.SystemInfo, MenuNodeType.Form)] public partial class FormStatisticInfo_ShiftSummary : MenuFormBase { M141Process M084Process => Process as M141Process; M141Config M084Config => Process.IConfig as M141Config; System.Threading.Timer _refreshUITimer = null; List _frmPlotList = new List(); public FormStatisticInfo_ShiftSummary() { InitializeComponent(); _refreshUITimer = new System.Threading.Timer(RefreshUI, null, -1, -1); formsPlot1.RightClicked -= formsPlot1.DefaultRightClickEvent; formsPlot2.RightClicked -= formsPlot2.DefaultRightClickEvent; _frmPlotList = new List() { formsPlot1, formsPlot2 }; } public override void OnCustomizedLoad() { base.OnCustomizedLoad(); } public override void OnProcessUpdated() { base.OnProcessUpdated(); if (M084Process != null) { M084Process.UploadProductForStatistic -= M084Process_UploadProductForStatistic; M084Process.UploadProductForStatistic += M084Process_UploadProductForStatistic; } RefreshUI(null); } public override void OnCustomizedDispose() { base.OnCustomizedDispose(); if (M084Process != null) { M084Process.UploadProductForStatistic -= M084Process_UploadProductForStatistic; } } private void M084Process_UploadProductForStatistic(object obj) { _refreshUITimer.Change(1000, -1); } private void RefreshUI(object? state) { this.Invoke(() => { for (int i = 0; i < 2; i++) { RefreshHourData(M084Process.ShiftSummaryDatas[i], _frmPlotList[i]); } }); } private void RefreshHourData(ShiftSummary shiftSummary, FormsPlot formsPlot) { var plot = formsPlot.Plot; //plot.Frameless(); plot.Grid(false); plot.Title($"{shiftSummary.StartTime.ToString("MM/dd HH:mm")} ~ {shiftSummary.EndTime.ToString("MM/dd HH:mm")}"); plot.Palette = ScottPlot.Palette.Category20; plot.Legend(false); plot.Clear(); string[] labels = shiftSummary.HourDatas.Select(u => u.HourTime.ToString("HH")).ToArray(); string[] serialNames = new string[] { "尺寸NG", "外观NG", "OK", "Total" }; var totalNums = shiftSummary.HourDatas.Select(u => (double)u.OKRateModel.TotalNum).ToArray(); //var bar1 = plot.AddBar(totalNums); //bar1.ShowValuesAboveBars = true; //bar1.ValueFormatter = y => $"Total:{y}"; //var bar2 = plot.AddBar(shiftSummary.HourDatas.Select(u => (double)u.OKRateModel.OKNum).ToArray()); //bar2.ShowValuesAboveBars = true; //bar2.ValueFormatter = y => $"OK:{y}"; double[][] datas ={ shiftSummary.HourDatas.Select(u=>(double)u.OKRateModel.Spec_NG).ToArray(), shiftSummary.HourDatas.Select(u=>(double)u.OKRateModel.Defect_NG).ToArray(), shiftSummary.HourDatas.Select(u=>(double)u.OKRateModel.OKNum).ToArray(), shiftSummary.HourDatas.Select(u=>(double)u.OKRateModel.TotalNum).ToArray(), }; var bars = plot.AddBarGroups(labels, serialNames, datas, null); for (int i = 0; i < 4; i++) { bars[i].ShowValuesAboveBars = true; //switch (i) //{ // case 0: // bars[i].ValueFormatter = a => $"尺寸不良: {a}"; // break; // case 1: // bars[i].ValueFormatter = a => $"缺陷不良: {a}"; // break; // case 2: // bars[i].ValueFormatter = a => $"OK: {a}"; // break; // case 3: // bars[i].ValueFormatter = a => $"总数: {a}"; // break; //} } plot.Legend(true, Alignment.UpperRight); //plot.XTicks(labels); //plot.XLabel("时间"); var max = totalNums.Max(); if (max == 0) { max = 50; } else { max *= 1.5; } plot.SetAxisLimitsY(0, max); plot.YLabel("产品数量"); formsPlot.Refresh(); } } }