using DevExpress.
XtraCharts;
using [Link];
using RecipesDLL;
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
public partial class CIPBatchDashboardForm : XtraForm
{
private CIPMaster_Report _data;
private Dictionary<string, LabelControl> valueLabels = new Dictionary<string,
LabelControl>();
private ChartControl chartControl1;
private ChartControl pieChart;
public CIPBatchDashboardForm(CIPMaster_Report data)
{
InitializeComponent();
_data = data;
LoadDashboard();
}
private void InitializeComponent()
{
[Link] = "CIP Dashboard";
[Link] = new Size(1240, 700);
[Link] = [Link];
// Khởi tạo dictionary
valueLabels = new Dictionary<string, LabelControl>();
// Biểu đồ bên dưới
chartControl1 = new ChartControl { Dock = [Link] };
pieChart = new ChartControl { Dock = [Link] };
var chartSplit = new SplitContainerControl
{
Dock = [Link],
//Orientation = [Link],
SplitterPosition = [Link] / 2
};
[Link](chartControl1);
[Link](pieChart);
var spacer = new Panel
{
Height = 10,
Dock = [Link],
BackColor = [Link]
};
var panelTop = new FlowLayoutPanel
{
Dock = [Link],
Height = 280,
Padding = new Padding(10),
AutoScroll = false,
FlowDirection = [Link],
//BackColor = [Link],
WrapContents = false
};
var groupSystem = CreateGroup("System Info");
var groupProduction = CreateGroup("Production Info");
var groupTime = CreateGroup("Time/Status");
[Link](groupSystem);
[Link](groupProduction);
[Link](groupTime);
var colorMap = new Dictionary<string, Color>
{
{ "ID", [Link] },
{ "LineNo", [Link] },
{ "RouteNo", [Link] },
{ "RouteName", [Link] },
{ "RecipeName", [Link] },
{ "OrderID", [Link] },
{ "BatchNo", [Link] },
{ "StartTime", [Link] },
{ "EndTime", [Link] },
{ "Status", [Link] }
};
string[] sysInfo = { "ID", "LineNo", "RouteNo", "RouteName" };
string[] prodInfo = { "RecipeName", "OrderID", "BatchNo" };
string[] timeInfo = { "StartTime", "EndTime", "Status" };
AddToGroup(sysInfo, groupSystem, colorMap);
AddToGroup(prodInfo, groupProduction, colorMap);
AddToGroup(timeInfo, groupTime, colorMap);
[Link](chartSplit);
[Link](spacer);
[Link](panelTop);
}
private Panel CreateRoundedPanel(string title, Color backColor)
{
var panel = new Panel
{
Size = new Size(110, 110),
BackColor = [Link],
Padding = new Padding(5),
Margin = new Padding(5)
};
[Link] = [Link](CreateRoundRectRgn(0, 0, [Link],
[Link], 20, 20));
//[Link] += (s, e) =>
//{
// [Link]([Link], [Link],
[Link], [Link]);
//};
var label = new LabelControl
{
Dock = [Link],
Appearance = {
TextOptions = {
HAlignment = [Link],
VAlignment = [Link]
},
Font = new Font("Segoe UI", 10F, [Link]),
BackColor = backColor
},
AutoSizeMode = [Link],
Text = $"{title}\n--",
Padding = new Padding(5)
};
[Link](label);
return panel;
}
[DllImport("[Link]", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn(int nLeftRect, int nTopRect,
int nRightRect, int nBottomRect, int nWidthEllipse, int nHeightEllipse);
private void LoadDashboard()
{
valueLabels["ID"].Text = $"ID\n{_data.ID}";
valueLabels["LineNo"].Text = $"LineNo\n{_data.LineNo}";
valueLabels["RouteNo"].Text = $"RouteNo\n{_data.RouteNo}";
valueLabels["RouteName"].Text = $"RouteName\n{_data.RouteName}";
valueLabels["RecipeName"].Text = $"Recipe\n{_data.RecipeName}";
valueLabels["OrderID"].Text = $"OrderID\n{_data.OrderID}";
valueLabels["BatchNo"].Text = $"Batch\n{_data.BatchNo}";
valueLabels["StartTime"].Text = $"Start\n{_data.StartTimeLDT:HH:mm:ss}";
valueLabels["EndTime"].Text = $"End\n{_data.EndTimeLDT:HH:mm:ss}";
var statusText = _data.Status == 1 ? "✔️ Completed" : "❌ Not Completed";
valueLabels["Status"].Text = $"Status\n{statusText}";
valueLabels["Status"].[Link] = (_data.Status == 1) ?
[Link] : [Link];
DrawCharts();
}
private void DrawCharts()
{
[Link]();
[Link]();
// Line chart: ReturnTemp, ReturnCond, FlowRate
var tempSeries = new Series("Temperature", [Link]);
var concSeries = new Series("Concentration", [Link]);
var flowSeries = new Series("Flow Rate", [Link]);
string[] steps = { "PR", "CR", "IR1", "AR", "IR2", "HWR", "FR" };
foreach (var step in steps)
{
[Link](new SeriesPoint(step,
GetDoubleValue($"{step}_ReturnTemp")));
[Link](new SeriesPoint(step,
GetDoubleValue($"{step}_ReturnCond")));
[Link](new SeriesPoint(step, _data.FlowRate)); // flow
same for all
}
[Link](new Series[] { tempSeries, concSeries,
flowSeries });
[Link] = [Link];
var pieSeries = new Series("Circulation Time", [Link]);
foreach (var step in steps)
{
DateTime? start = GetDate($"{step}_StartTime");
DateTime? stop = GetDate($"{step}_StopTime");
if ([Link] && [Link] && stop > start)
{
double minutes = ([Link] - [Link]).TotalMinutes;
if (minutes > 0)
[Link](new SeriesPoint(step, minutes));
}
}
[Link] = "{A}: {VP:P1}";
[Link] = "{A}: {V:0.##} min";
[Link](pieSeries);
[Link] = [Link];
}
private double GetDoubleValue(string propertyName)
{
var prop = typeof(CIPMaster_Report).GetProperty(propertyName);
if (prop == null) return 0;
var val = [Link](_data);
return val != null ? [Link](val) : 0;
}
private DateTime? GetDate(string propertyName)
{
var prop = typeof(CIPMaster_Report).GetProperty(propertyName);
if (prop == null) return null;
var val = [Link](_data);
return val != null ? (DateTime?)val : null;
}
private GroupControl CreateGroup(string title)
{
return new GroupControl
{
Text = title,
BackColor = [Link],
Size = new Size(400, 300),
AppearanceCaption = { Font = new Font("Segoe UI", 10F,
[Link]) },
Padding = new Padding(5)
};
}
private void AddToGroup(string[] keys, GroupControl group, Dictionary<string,
Color> colorMap)
{
var layout = new FlowLayoutPanel
{
Dock = [Link],
FlowDirection = [Link],
WrapContents = true,
AutoScroll = false
};
foreach (var key in keys)
{
var panel = CreateRoundedPanel(key, colorMap[key]);
valueLabels[key] = (LabelControl)[Link][0];
[Link] = new Padding(5);
[Link](panel);
}
[Link](layout);
}