Compare commits

...

2 Commits

5 changed files with 236 additions and 163 deletions

40
AiQ_GUI.Designer.cs generated
View File

@@ -148,6 +148,7 @@ namespace AiQ_GUI
BtnFirewall = new Button(); BtnFirewall = new Button();
TabImages = new TabPage(); TabImages = new TabPage();
TabSoak = new TabPage(); TabSoak = new TabPage();
BtnFactoryDefault = new Button();
SetGodModeAll = new Button(); SetGodModeAll = new Button();
BtnUploadBlob = new Button(); BtnUploadBlob = new Button();
CkBxTickAll = new CheckBox(); CkBxTickAll = new CheckBox();
@@ -157,7 +158,6 @@ namespace AiQ_GUI
LblGUIVers = new Label(); LblGUIVers = new Label();
timerTypeIP = new System.Windows.Forms.Timer(components); timerTypeIP = new System.Windows.Forms.Timer(components);
TimerFlash = new System.Windows.Forms.Timer(components); TimerFlash = new System.Windows.Forms.Timer(components);
BtnFactoryDefault = new Button();
((System.ComponentModel.ISupportInitialize)PicBxMAV).BeginInit(); ((System.ComponentModel.ISupportInitialize)PicBxMAV).BeginInit();
((System.ComponentModel.ISupportInitialize)PicBxAiQ).BeginInit(); ((System.ComponentModel.ISupportInitialize)PicBxAiQ).BeginInit();
((System.ComponentModel.ISupportInitialize)PicBxIRF2).BeginInit(); ((System.ComponentModel.ISupportInitialize)PicBxIRF2).BeginInit();
@@ -270,7 +270,7 @@ namespace AiQ_GUI
CbBxUserName.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold); CbBxUserName.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold);
CbBxUserName.ForeColor = SystemColors.Control; CbBxUserName.ForeColor = SystemColors.Control;
CbBxUserName.FormattingEnabled = true; CbBxUserName.FormattingEnabled = true;
CbBxUserName.Items.AddRange(new object[] { "Guest", "Clive", "Conor", "Charlie", "Henry", "Sam C", "Sam L", "Simon", "Toby", "Tom" }); CbBxUserName.Items.AddRange(new object[] { "Guest", "Clive", "Conor", "Charlie", "Henry", "Sam C", "Sam L", "Simon", "Sophie", "Toby", "Tom" });
CbBxUserName.Location = new Point(10, 262); CbBxUserName.Location = new Point(10, 262);
CbBxUserName.Margin = new Padding(4, 3, 4, 3); CbBxUserName.Margin = new Padding(4, 3, 4, 3);
CbBxUserName.Name = "CbBxUserName"; CbBxUserName.Name = "CbBxUserName";
@@ -1910,6 +1910,24 @@ namespace AiQ_GUI
TabSoak.TabIndex = 2; TabSoak.TabIndex = 2;
TabSoak.Text = "Soak"; TabSoak.Text = "Soak";
// //
// BtnFactoryDefault
//
BtnFactoryDefault.BackColor = Color.FromArgb(70, 65, 80);
BtnFactoryDefault.Enabled = false;
BtnFactoryDefault.FlatAppearance.BorderColor = Color.FromArgb(70, 65, 80);
BtnFactoryDefault.FlatAppearance.BorderSize = 0;
BtnFactoryDefault.FlatStyle = FlatStyle.Flat;
BtnFactoryDefault.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold);
BtnFactoryDefault.ForeColor = SystemColors.Control;
BtnFactoryDefault.Location = new Point(222, 209);
BtnFactoryDefault.Margin = new Padding(4, 3, 4, 3);
BtnFactoryDefault.Name = "BtnFactoryDefault";
BtnFactoryDefault.Size = new Size(181, 49);
BtnFactoryDefault.TabIndex = 242;
BtnFactoryDefault.Text = "Set Modules to Factory Defaults";
BtnFactoryDefault.UseVisualStyleBackColor = false;
BtnFactoryDefault.Click += BtnFactoryDefault_Click;
//
// SetGodModeAll // SetGodModeAll
// //
SetGodModeAll.BackColor = Color.FromArgb(70, 65, 80); SetGodModeAll.BackColor = Color.FromArgb(70, 65, 80);
@@ -2000,24 +2018,6 @@ namespace AiQ_GUI
timerTypeIP.Interval = 2000; timerTypeIP.Interval = 2000;
timerTypeIP.Tick += timerTypeIP_Tick; timerTypeIP.Tick += timerTypeIP_Tick;
// //
// BtnFactoryDefault
//
BtnFactoryDefault.BackColor = Color.FromArgb(70, 65, 80);
BtnFactoryDefault.Enabled = false;
BtnFactoryDefault.FlatAppearance.BorderColor = Color.FromArgb(70, 65, 80);
BtnFactoryDefault.FlatAppearance.BorderSize = 0;
BtnFactoryDefault.FlatStyle = FlatStyle.Flat;
BtnFactoryDefault.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold);
BtnFactoryDefault.ForeColor = SystemColors.Control;
BtnFactoryDefault.Location = new Point(222, 209);
BtnFactoryDefault.Margin = new Padding(4, 3, 4, 3);
BtnFactoryDefault.Name = "BtnFactoryDefault";
BtnFactoryDefault.Size = new Size(181, 49);
BtnFactoryDefault.TabIndex = 242;
BtnFactoryDefault.Text = "Set Modules to Factory Defaults";
BtnFactoryDefault.UseVisualStyleBackColor = false;
BtnFactoryDefault.Click += BtnFactoryDefault_Click;
//
// MainForm // MainForm
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);

View File

@@ -108,7 +108,7 @@ namespace AiQ_GUI
CbBxIris.SelectedIndex = lds.Iris; CbBxIris.SelectedIndex = lds.Iris;
CbBxGain.SelectedIndex = lds.Gain; CbBxGain.SelectedIndex = lds.Gain;
if (lds.User == "Bradley") if (lds.User == "Bradley" || lds.User == "Sophie")
BtnTest.Visible = true; BtnTest.Visible = true;
TxBxCheckValid(TxBxPsuIP); // Set save button color if valid TxBxCheckValid(TxBxPsuIP); // Set save button color if valid
@@ -151,7 +151,7 @@ namespace AiQ_GUI
if (!await FlexiAPI.ZoomModules("1F40", CamOnTest.IP)) // Zoom to 8000 (1F40h) at the same time. if (!await FlexiAPI.ZoomModules("1F40", CamOnTest.IP)) // Zoom to 8000 (1F40h) at the same time.
await TestFailed(BtnStartTest, "Could not zoom modules to 8000"); await TestFailed(BtnStartTest, "Could not zoom modules to 8000");
if (!await FlexiAPI.SetZoomLockOn(CamOnTest.IP)) if (!await FlexiAPI.SetZoomLockOn(CamOnTest.IP))
Helper.RestartApp(); Helper.RestartApp();
@@ -194,7 +194,7 @@ namespace AiQ_GUI
await FlexiAPI.SetTrim(CamOnTest.IP, LblTestTubePing.Text); // Auto trims the cameras, some plates should have been captured in the meantime await FlexiAPI.SetTrim(CamOnTest.IP, LblTestTubePing.Text); // Auto trims the cameras, some plates should have been captured in the meantime
if (!await FlexiAPI.ZoomModules("0000", CamOnTest.IP)) // Zoom to full wide if (!await FlexiAPI.ZoomModules("0000", CamOnTest.IP)) // Zoom to full wide
{ {
await TestFailed(BtnStartTest, "Could not zoom modules to full wide"); await TestFailed(BtnStartTest, "Could not zoom modules to full wide");
} }
@@ -209,6 +209,7 @@ namespace AiQ_GUI
if (!LEDreply.Contains("Power levels set successfully")) if (!LEDreply.Contains("Power levels set successfully"))
AddToActionsList($"LED level could not be set: {LEDreply}"); AddToActionsList($"LED level could not be set: {LEDreply}");
} }
await FlexiAPI.SetVaxtorMinMaxPlate(CamOnTest.IP);
DateTime PCTime = DateTime.Now; // Grab PC time as close to the API as possible to pass onto PDF later DateTime PCTime = DateTime.Now; // Grab PC time as close to the API as possible to pass onto PDF later
@@ -224,7 +225,7 @@ namespace AiQ_GUI
LED.CheckLEDs(DiagsAPI.LedCurrent, LblLEDI, "mA", CameraAccessInfo.LED_I); // Current LED.CheckLEDs(DiagsAPI.LedCurrent, LblLEDI, "mA", CameraAccessInfo.LED_I); // Current
this.Refresh(); // Make sure all labels are updated before checking them this.Refresh(); // Make sure all labels are updated before checking them
// If there are any actions identified then fail the test. // If there are any actions identified then fail the test.
// If any labels are red then fail. Only labels in panel so can foreach on labels not controls // If any labels are red then fail. Only labels in panel so can foreach on labels not controls
if (RhTxBxActions.Text.Length > 2 || PnlLbls.Controls.OfType<Label>().Any(c => c.ForeColor == Color.Red) == true) if (RhTxBxActions.Text.Length > 2 || PnlLbls.Controls.OfType<Label>().Any(c => c.ForeColor == Color.Red) == true)
@@ -269,7 +270,7 @@ namespace AiQ_GUI
} }
} }
public void StatsDiags(string redDiagLabels, string RhTxBxActionsText) public void StatsDiags(string redDiagLabels, string RhTxBxActionsText, string IsRMA, int RMA)
{ {
using OleDbConnection conn = new(connString); using OleDbConnection conn = new(connString);
conn.Open(); conn.Open();
@@ -280,26 +281,20 @@ namespace AiQ_GUI
string model = string.IsNullOrWhiteSpace(CamOnTest?.Model) ? "-" : CamOnTest.Model; string model = string.IsNullOrWhiteSpace(CamOnTest?.Model) ? "-" : CamOnTest.Model;
string sql = @" string sql = @"
INSERT INTO DiagsStats ([Date], [Model], [Red Diags Labels], [RhTxBxActions Contents]) INSERT INTO DiagsStats ([Date], [Model], [Red Diags Labels], [RhTxBxActions Contents],[IsRMA],[RMA])
VALUES (?, ?, ?, ?)"; VALUES (?, ?, ?, ?, ?, ?)";
using OleDbCommand cmd = new(sql, conn); using OleDbCommand cmd = new(sql, conn);
cmd.Parameters.Add(new OleDbParameter // OleDb uses positional parameters — order must match the VALUES list above
{ cmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Date, Value = DateTime.Now });
OleDbType = OleDbType.Date, cmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.VarWChar, Value = model });
Value = DateTime.Now cmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.VarWChar, Value = redVal });
}); cmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.VarWChar, Value = actVal });
cmd.Parameters.AddWithValue("?", model); cmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Boolean, Value = IsRMA });
cmd.Parameters.AddWithValue("?", redVal); cmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.VarWChar, Value = RMA });
cmd.Parameters.AddWithValue("?", actVal);
int rows = cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
//if (rows > 0)
// AddToActionsList($"DiagsStats inserted ({rows} row) for model '{model}' on {DateTime.Now:yyyy-MM-dd}");
//else
// AddToActionsList("No rows inserted into DiagsStats (unexpected).");
} }
@@ -362,8 +357,8 @@ namespace AiQ_GUI
{ {
await PreTestFailed("Diagnostic Failure"); await PreTestFailed("Diagnostic Failure");
} }
} }
// ***** Pass/Fails ***** // ***** Pass/Fails *****
@@ -428,15 +423,6 @@ namespace AiQ_GUI
// Indicators to the user the test has failed // Indicators to the user the test has failed
Btn.BackColor = Color.Maroon; Btn.BackColor = Color.Maroon;
Btn.Text = "Test Failed"; Btn.Text = "Test Failed";
if (!(CamOnTest.RMANum != 0)) // Yap to check if it is not a RMA
{
Stats( ["Final Tests Failed", ErrMssg]);
}
else
{
Stats("RMA Final Tests Failed");
}
AddToActionsList(ErrMssg);
string RedLbls = string.Join(Environment.NewLine, PnlLbls.Controls string RedLbls = string.Join(Environment.NewLine, PnlLbls.Controls
.OfType<Label>() .OfType<Label>()
@@ -444,7 +430,18 @@ namespace AiQ_GUI
.Select(lbl => lbl.Text)); // Extract text .Select(lbl => lbl.Text)); // Extract text
string FullFailureValues = RhTxBxActions.Text + Environment.NewLine + RedLbls; string FullFailureValues = RhTxBxActions.Text + Environment.NewLine + RedLbls;
StatsDiags(RedLbls, RhTxBxActions.Text); // Log to Access database
// Database logging \\
if (!(CamOnTest.RMANum != 0)) // Yap to check if it is not a RMA
{
Stats(["Final Tests Failed", ErrMssg]);
StatsDiags(RedLbls, RhTxBxActions.Text, "FALSE", CamOnTest.RMANum);
}
else
{
Stats("RMA Final Tests Failed");
StatsDiags(RedLbls, RhTxBxActions.Text, "TRUE", CamOnTest.RMANum);
}
if (await DisplayQuestion("Test failed, appeal?" + Environment.NewLine + "See Actions textbox for details.")) if (await DisplayQuestion("Test failed, appeal?" + Environment.NewLine + "See Actions textbox for details."))
@@ -538,22 +535,24 @@ namespace AiQ_GUI
BtnNo.Visible = false; BtnNo.Visible = false;
Logging.LogMessage("Pre Test Failed"); Logging.LogMessage("Pre Test Failed");
if (CamOnTest.RMANum == 0) // Yap to check if it is not a RMA
{
Stats(["Pre Tests Failed", ErrMssg]);
}
else
{
Stats("RMA Pre Tests Failed");
}
string RedLbls = string.Join(Environment.NewLine, PnlLbls.Controls string RedLbls = string.Join(Environment.NewLine, PnlLbls.Controls
.OfType<Label>() .OfType<Label>()
.Where(lbl => lbl.ForeColor == Color.Red) // Only include red labels .Where(lbl => lbl.ForeColor == Color.Red) // Only include red labels
.Select(lbl => lbl.Text)); // Extract text .Select(lbl => lbl.Text)); // Extract text
string FullFailureValues = RhTxBxActions.Text + Environment.NewLine + RedLbls; string FullFailureValues = RhTxBxActions.Text + Environment.NewLine + RedLbls;
StatsDiags(RedLbls, RhTxBxActions.Text); // Log to Access database if (CamOnTest.RMANum == 0) // Yap to check if it is not a RMA
{
Stats(["Pre Tests Failed", ErrMssg]);
StatsDiags(RedLbls, RhTxBxActions.Text, "FALSE", CamOnTest.RMANum);
}
else
{
Stats("RMA Pre Tests Failed");
StatsDiags(RedLbls, RhTxBxActions.Text, "TRUE", CamOnTest.RMANum);
}
// Log to Access database
if (await DisplayQuestion("Test failed, restart?" + Environment.NewLine + "See Actions textbox for details.")) if (await DisplayQuestion("Test failed, restart?" + Environment.NewLine + "See Actions textbox for details."))
Helper.RestartApp(); Helper.RestartApp();
@@ -685,7 +684,7 @@ namespace AiQ_GUI
CamOnTest.RMANum = Convert.ToInt32(await DisplayInput("What is the RMA number?")); CamOnTest.RMANum = Convert.ToInt32(await DisplayInput("What is the RMA number?"));
if (CamOnTest.RMANum == -1) // Means they chose the 'I don't know' option if (CamOnTest.RMANum == -1) // Means they chose the 'I don't know' option
{ {
await TestFailed(BtnStartTest, "Please get RMA number from operations team before continuing"); await TestFailed(BtnStartTest, "Please get RMA number from operations team before continuing");
} }
} }
@@ -752,11 +751,11 @@ namespace AiQ_GUI
string ProdcutKeyID = await DisplayInput("What is the Key ID?", false); string ProdcutKeyID = await DisplayInput("What is the Key ID?", false);
if (RegexCache.VaxtorRegex().IsMatch(ProdcutKeyID)) // Means they chose the 'I don't know' option or isn't valid Key ID if (RegexCache.VaxtorRegex().IsMatch(ProdcutKeyID)) // Means they chose the 'I don't know' option or isn't valid Key ID
{ {
Stats("Please Get A Valid Vaxtor Product Key Before Continuing"); Stats("Please Get A Valid Vaxtor Product Key Before Continuing");
await TestFailed(BtnStartTest, "Please get a valid Vaxtor Product Key before continuing"); await TestFailed(BtnStartTest, "Please get a valid Vaxtor Product Key before continuing");
} }
DiagsAPI.licenses.raptorKeyID = TxBxProductKey.Text; DiagsAPI.licenses.raptorKeyID = TxBxProductKey.Text;
lblVaxtor.Text += DiagsAPI.licenses.raptorKeyID; lblVaxtor.Text += DiagsAPI.licenses.raptorKeyID;
@@ -1856,35 +1855,35 @@ namespace AiQ_GUI
//double Spd = EstimateSpeed(frames); //double Spd = EstimateSpeed(frames);
//AddToActionsList("Estimated Speed: " + Spd.ToString("F2") + " MPH"); //AddToActionsList("Estimated Speed: " + Spd.ToString("F2") + " MPH");
await FlexiAPI.SetVaxtorMinMaxPlate(CamOnTest.IP);
//StatsExcel excelExporter = new();
//excelExporter.ExportDatabaseToExcel();
StatsExcel excelExporter = new(); //FakeCamera fakeCamera = new FakeCamera(80); // Create an instance of FakeCamera
excelExporter.ExportDatabaseToExcel();
// FakeCamera fakeCamera = new FakeCamera(80); // Create an instance of FakeCamera ////CamOnTest.IP = CbBxFoundCams.Text;
//_ = fakeCamera.StartAsync(CAMTYPE.GOOD).ContinueWith(task =>
//{
// //Network.Initialize("developer", "Pass123");
// //CamOnTest.IP = CbBxFoundCams.Text; // if (task.IsFaulted)
// _ = fakeCamera.StartAsync(CAMTYPE.BAD).ContinueWith(task => // {
// { // AddToActionsList("Error starting FakeCamera: " + task.Exception?.Message);
// //Network.Initialize("developer", "Pass123"); // }
// else
// {
// AddToActionsList($"FakeCamera started successfully. IP: {fakeCamera}", false);
// }
//});
// if (task.IsFaulted) //await Task.Delay(3000); // Wait for server to start
// { //CbBxFoundCams.Text = "localhost"; // Should force update in creds an network reinit
// AddToActionsList("Error starting FakeCamera: " + task.Exception?.Message); //CmBoFoundCams_TextChanged(sender, e);
// } //CbBxCameraType.SelectedIndex = CbBxCameraType.Items.Count - 1; // Selects AB12CD as model number
// else
// {
// AddToActionsList($"FakeCamera started successfully. IP: {fakeCamera}", false);
// }
// });
// await Task.Delay(3000); // Wait for server to start //await Task.Delay(3000); // Wait for server to start
// CbBxFoundCams.Text = "localhost"; // Should force update in creds an network reinit
// CmBoFoundCams_TextChanged(sender, e);
// CbBxCameraType.SelectedIndex = CbBxCameraType.Items.Count - 1; // Selects AB12CD as model number
// await Task.Delay(3000); // Wait for server to start //BtnStartTest_Click(sender, e);
//BtnPreTest_Click(sender, e);
stopWatchTest.Stop(); stopWatchTest.Stop();

View File

@@ -159,6 +159,37 @@ namespace AiQ_GUI
return null; // If it fails to parse the JSON return null; // If it fails to parse the JSON
} }
} }
public static async Task<bool> SetVaxtorMinMaxPlate(string IP)
{
try
{
// Build JSON array for Vaxtor min/max plate configuration
string[,] Vaxtor_JSON = { { "propMinCharHeight", "18" }, { "propMinGlobalConfidence", "30" } };
string response = await HTTP_Update("RaptorOCR".Trim(), IP, Vaxtor_JSON);
// Treat "operation was canceled" as a successful apply
if (response.Contains("The operation was canceled", StringComparison.OrdinalIgnoreCase))
{
Logging.LogMessage("SetVaxtorMinMaxPlate: Camera applied config but closed connection early (safe to ignore).");
return true;
}
if (response.Contains("error", StringComparison.OrdinalIgnoreCase))
{
MainForm.Instance.DisplayQuestion($"SetVaxtorMinMaxPlate: failed - Please set manually");
return false;
}
return true;
}
catch (Exception ex)
{
MainForm.Instance.AddToActionsList($"Could not set Vaxtor Plate height and min confidence: {ex.Message}");
return false;
}
}
public static async Task<bool> SetZoomLockOn(string IP) public static async Task<bool> SetZoomLockOn(string IP)
{ {
@@ -404,5 +435,13 @@ namespace AiQ_GUI
public class Property public class Property
{ {
public string Value { get; set; } = string.Empty; public string Value { get; set; } = string.Empty;
public string datatype { get; set; }
}
public class VaxtorConfig
{
public string id { get; set; }
public long configHash { get; set; }
public Property propMinCharHeight { get; set; }
public Property propMinGlobalConfidence { get; set; }
} }
} }

2
LDS.cs
View File

@@ -35,7 +35,9 @@ namespace AiQ_GUI
} }
catch // If file can't deserialise catch // If file can't deserialise
{ {
MainForm.Instance.AddToActionsList("Error loading Local Data Store");
return null; // Return null to indicate failure return null; // Return null to indicate failure
} }
} }

View File

@@ -11,7 +11,7 @@ namespace AiQ_GUI.Microsoft
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\Shared drives\MAV Production GUI's\AiQ\GUI's\AiQ_Final_Test.accdb;Persist Security Info=False;OLE DB Services=-1;"; @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\Shared drives\MAV Production GUI's\AiQ\GUI's\AiQ_Final_Test.accdb;Persist Security Info=False;OLE DB Services=-1;";
private readonly string exportPath = private readonly string exportPath =
@"C:\Users\BradleyBorn\OneDrive - MAV Systems Ltd\Desktop\AiQ_Test_Stats.xlsx"; @"G:\Shared drives\MAV Production GUI's\AiQ\GUI's\AiQ_Test_Stats.xlsx";
public void ExportDatabaseToExcel() public void ExportDatabaseToExcel()
{ {
@@ -26,35 +26,52 @@ namespace AiQ_GUI.Microsoft
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
// Read LastStatsRun from UniversalData (if any)
DateTime? lastStatsRun = null;
try
{
using (var cmdPeriod = new OleDbCommand("SELECT LastStatsRun FROM UniversalData", conn))
{
object res = cmdPeriod.ExecuteScalar();
if (res != null && res != DBNull.Value)
lastStatsRun = (DateTime)res;
}
MainForm.Instance.AddToActionsList($"Fetched LastStatsRun: {(lastStatsRun.HasValue ? lastStatsRun.Value.ToString("yyyy-MM-dd HH:mm:ss") : "none")}");
}
catch (Exception periodEx)
{
MainForm.Instance.AddToActionsList($"Warning: could not read LastStatsRun. Details: {periodEx.Message}");
}
// ==================== MAIN STATS EXPORT ==================== // ==================== MAIN STATS EXPORT ====================
string selectColumns = @" string selectColumns = @"
ModelNumber, ModelNumber,
[Total Tests Run], [Total Tests Run],
[Pre Tests Passed], [Pre Tests Passed],
[Pre Tests Failed], [Pre Tests Failed],
[Final Tests Passed], [Final Tests Passed],
[Final Tests Failed], [Final Tests Failed],
[RMA Total Tests Run], [RMA Total Tests Run],
[RMA Pre Tests Passed], [RMA Pre Tests Passed],
[RMA Pre Tests Failed], [RMA Pre Tests Failed],
[RMA Final Tests Passed], [RMA Final Tests Passed],
[RMA Final Tests Failed], [RMA Final Tests Failed],
[Diagnostic Failure], [Diagnostic Failure],
[Failed To Set Model Or Serial Number], [Failed To Set Model Or Serial Number],
[Camera Not In Test Tube], [Camera Not In Test Tube],
[Could Not Zoom Modules To 8000], [Could Not Zoom Modules To 8000],
[Could Not Zoom Modules To Full Wide], [Could Not Zoom Modules To Full Wide],
[Please Get RMA Number From Operations Team Before Continuing], [Please Get RMA Number From Operations Team Before Continuing],
[Please Get A Valid Vaxtor Product Key Before Continuing], [Please Get A Valid Vaxtor Product Key Before Continuing],
[Visual Test Fail - Sleeve Not Aligned], [Visual Test Fail - Sleeve Not Aligned],
[Visual Test Fail - Not All Front Screws Fitted], [Visual Test Fail - Not All Front Screws Fitted],
[Visual Test Fail - Not All Rear Screws Fitted], [Visual Test Fail - Not All Rear Screws Fitted],
[Visual Test Fail - Unit rattles]"; [Visual Test Fail - Unit rattles]";
string query = $@" string query = $@"
SELECT SELECT
{selectColumns} {selectColumns}
FROM AiQ"; FROM AiQ";
OleDbDataAdapter adapter = new(query, conn); OleDbDataAdapter adapter = new(query, conn);
DataTable dataTable = new(); DataTable dataTable = new();
@@ -93,8 +110,21 @@ namespace AiQ_GUI.Microsoft
ws.Cell(1, 1).InsertTable(dataTable, "AiQ_Stats", true); ws.Cell(1, 1).InsertTable(dataTable, "AiQ_Stats", true);
ws.Columns().AdjustToContents(); ws.Columns().AdjustToContents();
ws.Cell(1, dataTable.Columns.Count + 2).Value = "Exported:"; // Write Data Period label and computed period string to the right of the table
ws.Cell(2, dataTable.Columns.Count + 2).Value = now.ToString("yyyy-MM-dd HH:mm:ss"); int infoCol = dataTable.Columns.Count + 2;
ws.Cell(1, infoCol).Value = "Data Period";
string periodText;
if (lastStatsRun.HasValue)
{
periodText = $"{lastStatsRun.Value:yyyy-MM-dd HH:mm:ss} - {now:yyyy-MM-dd HH:mm:ss}";
}
else
{
periodText = $"Up to {now:yyyy-MM-dd HH:mm:ss}";
}
ws.Cell(2, infoCol).Value = periodText;
// ==================== DIAGS STATS EXPORT (CURRENT MONTH ONLY) ==================== // ==================== DIAGS STATS EXPORT (CURRENT MONTH ONLY) ====================
MainForm.Instance.AddToActionsList("Exporting DiagsStats for current month..."); MainForm.Instance.AddToActionsList("Exporting DiagsStats for current month...");
@@ -107,33 +137,36 @@ namespace AiQ_GUI.Microsoft
[Date], [Date],
[Model], [Model],
[Red Diags Labels], [Red Diags Labels],
[RhTxBxActions Contents] [RhTxBxActions Contents],
[IsRma],
[RMA]
FROM DiagsStats FROM DiagsStats
WHERE [Date] >= ? AND [Date] < ?"; WHERE [Date] >= ? AND [Date] < ?";
OleDbDataAdapter diagsAdapter = new(diagsQuery, conn); using (var diagsCmd = new OleDbCommand(diagsQuery, conn))
diagsAdapter.SelectCommand.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Date, Value = monthStart });
diagsAdapter.SelectCommand.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Date, Value = nextMonth });
DataTable diagsTable = new();
diagsAdapter.Fill(diagsTable);
if (diagsTable.Rows.Count > 0)
{ {
int startRow = ws.LastRowUsed().RowNumber() + 3; diagsCmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Date, Value = monthStart });
diagsCmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Date, Value = nextMonth });
ws.Cell(startRow, 1).Value = "Diags Stats (Current Month)"; using (var diagsAdapter = new OleDbDataAdapter(diagsCmd))
ws.Cell(startRow, 1).Style.Font.Bold = true; {
ws.Cell(startRow, 1).Style.Font.FontSize = 12; DataTable diagsTable = new();
diagsAdapter.Fill(diagsTable);
ws.Cell(startRow + 1, 1).InsertTable(diagsTable, "Diags_Stats", true); if (diagsTable.Rows.Count > 0)
ws.Columns().AdjustToContents(); {
int startRow = (ws.LastRowUsed()?.RowNumber() ?? 0) + 3;
MainForm.Instance.AddToActionsList($"Added DiagsStats ({diagsTable.Rows.Count} rows) starting at row {startRow}."); ws.Cell(startRow, 1).Value = "Diags Stats (Current Month)";
} ws.Cell(startRow, 1).Style.Font.Bold = true;
else ws.Cell(startRow, 1).Style.Font.FontSize = 12;
{
MainForm.Instance.AddToActionsList("No DiagsStats data found for current month."); ws.Cell(startRow + 1, 1).InsertTable(diagsTable, "Diags_Stats", true);
ws.Columns().AdjustToContents();
MainForm.Instance.AddToActionsList($"Added DiagsStats ({diagsTable.Rows.Count} rows) starting at row {startRow}.");
}
}
} }
// ==================== SAVE MAIN SHEET ==================== // ==================== SAVE MAIN SHEET ====================
@@ -150,10 +183,10 @@ namespace AiQ_GUI.Microsoft
backupTableName = backupTableName.Substring(0, 64); backupTableName = backupTableName.Substring(0, 64);
string backupSql = $@" string backupSql = $@"
SELECT SELECT
{selectColumns} {selectColumns}
INTO [{backupTableName}] INTO [{backupTableName}]
FROM AiQ"; FROM AiQ";
try try
{ {
using (var cmdBackup = new OleDbCommand(backupSql, conn)) using (var cmdBackup = new OleDbCommand(backupSql, conn))
@@ -174,28 +207,28 @@ namespace AiQ_GUI.Microsoft
try try
{ {
string resetSql = @" string resetSql = @"
UPDATE AiQ SET UPDATE AiQ SET
[Total Tests Run] = 0, [Total Tests Run] = 0,
[Pre Tests Passed] = 0, [Pre Tests Passed] = 0,
[Pre Tests Failed] = 0, [Pre Tests Failed] = 0,
[Final Tests Passed] = 0, [Final Tests Passed] = 0,
[Final Tests Failed] = 0, [Final Tests Failed] = 0,
[RMA Total Tests Run] = 0, [RMA Total Tests Run] = 0,
[RMA Pre Tests Passed] = 0, [RMA Pre Tests Passed] = 0,
[RMA Pre Tests Failed] = 0, [RMA Pre Tests Failed] = 0,
[RMA Final Tests Passed] = 0, [RMA Final Tests Passed] = 0,
[RMA Final Tests Failed] = 0, [RMA Final Tests Failed] = 0,
[Diagnostic Failure] = 0, [Diagnostic Failure] = 0,
[Failed To Set Model Or Serial Number] = 0, [Failed To Set Model Or Serial Number] = 0,
[Camera Not In Test Tube] = 0, [Camera Not In Test Tube] = 0,
[Could Not Zoom Modules To 8000] = 0, [Could Not Zoom Modules To 8000] = 0,
[Could Not Zoom Modules To Full Wide] = 0, [Could Not Zoom Modules To Full Wide] = 0,
[Please Get RMA Number From Operations Team Before Continuing] = 0, [Please Get RMA Number From Operations Team Before Continuing] = 0,
[Please Get A Valid Vaxtor Product Key Before Continuing] = 0, [Please Get A Valid Vaxtor Product Key Before Continuing] = 0,
[Visual Test Fail - Sleeve Not Aligned] = 0, [Visual Test Fail - Sleeve Not Aligned] = 0,
[Visual Test Fail - Not All Front Screws Fitted] = 0, [Visual Test Fail - Not All Front Screws Fitted] = 0,
[Visual Test Fail - Not All Rear Screws Fitted] = 0, [Visual Test Fail - Not All Rear Screws Fitted] = 0,
[Visual Test Fail - Unit rattles] = 0;"; [Visual Test Fail - Unit rattles] = 0;";
using (var cmdReset = new OleDbCommand(resetSql, conn, tx)) using (var cmdReset = new OleDbCommand(resetSql, conn, tx))
{ {