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<FormsPlot> _frmPlotList = new List<FormsPlot>();
|
public FormStatisticInfo_ShiftSummary()
|
{
|
InitializeComponent();
|
|
_refreshUITimer = new System.Threading.Timer(RefreshUI, null, -1, -1);
|
|
formsPlot1.RightClicked -= formsPlot1.DefaultRightClickEvent;
|
formsPlot2.RightClicked -= formsPlot2.DefaultRightClickEvent;
|
|
_frmPlotList = new List<FormsPlot>() { 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();
|
}
|
}
|
}
|