Files

1181 lines
36 KiB
C#
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using BaseFunction;
using NSAnalysis.DAL;
using NSAnalysis.Model;
using NSAnalysis.Properties;
using System;
using System.Data;
using System.Drawing;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Telerik.WinControls;
using Telerik.WinControls.UI;
namespace NSAnalysis
{
public partial class FormMain : Telerik.WinControls.UI.ShapedForm
{
private Timer fileSortTimer = new Timer(); // 定时器,用于定时分发任务
private FileSorter fileSorter = new FileSorter();
#region
private int[] yValues = new int[3];
private string[] xValues = new string[3];
private DataTable dtCSVContent = new DataTable();
private CjlrDAL tmdal = new CjlrDAL();
private bool bReadCSVFlag = false;
private int iLastMesureCount = 0;
#region
private DataTable PageTable = new DataTable();
/// <summary>
/// 每页记录数
/// </summary>
public int pageSize = 20;
/// <summary>
/// 总记录数
/// </summary>
public int recordCount = 0;
/// <summary>
/// 总页数
/// </summary>
public int pageCount = 0;
/// <summary>
/// 当前页
/// </summary>
public int currentPage = 0;
#endregion
#endregion
#region
public FormMain()
{
InitializeComponent();
SQLHelper.connStr = DatabaseDfn.SqlConnectStr();
//加载皮肤
ThemeResolutionService.LoadPackageFile(ConfigDfn.strTheme);
this.ThemeName = ConfigDfn.strSkinName.Substring(0, ConfigDfn.strSkinName.Length - 5);
RPV.ThemeName = ConfigDfn.strSkinName.Substring(0, ConfigDfn.strSkinName.Length - 5);
}
private void FormMain_Load(object sender, EventArgs e)
{
//初始化全局变量
MyBase.rleMessage = rleMessage;
rdtpStartTime.Text = DateTime.Now.ToString("yyyy-MM-dd");
rdtpEndTime.Text = DateTime.Now.ToString("yyyy-MM-dd");
// 定时处理任务
fileSortTimer.Interval = 10000; // 每60秒检查一次分发任务
fileSortTimer.Tick += FileSortTimer_Tick;
fileSortTimer.Start();
// 订阅处理中事件
fileSorter.OnFileParsed += FileSorter_OnFileParsed;
//绑定按钮
lpcSoftwareSetup.labPicture.Click += new EventHandler(lpcSoftwareSetup_Click);
lpcSoftwareSetup.labText.Click += new EventHandler(lpcSoftwareSetup_Click);
lpcToleranceSetup.labPicture.Click += new EventHandler(lpcToleranceSetup_Click);
lpcToleranceSetup.labText.Click += new EventHandler(lpcToleranceSetup_Click);
lpcAboutSoftware.labPicture.Click += new EventHandler(lpcAboutSoftware_Click);
lpcAboutSoftware.labText.Click += new EventHandler(lpcAboutSoftware_Click);
lpcShowLog.labPicture.Click += new EventHandler(lpcShowLog_Click);
lpcShowLog.labText.Click += new EventHandler(lpcShowLog_Click);
iLastMesureCount = tmdal.SelectTMeasureResultCount();
#region
labVIN.Text = "";
labOKCount.Text = "";
labNGCount.Text = "";
labRejectCount.Text = "";
labSumMeasureCount.Text = "";
labMeaTime.Text = "";
labResultPercent.Text = "";
labResult.Text = "";
labCarType.Text = "";
#endregion
InitTableColumns();
}
private void InitTableColumns()
{
#region
//创建虚拟表
DataColumn column2 = new DataColumn("CarID", Type.GetType("System.String"));
DataColumn dcCarType = new DataColumn("CarType", Type.GetType("System.String"));
DataColumn column3 = new DataColumn("MeasPointName", Type.GetType("System.String"));
DataColumn column4 = new DataColumn("DimensionName", Type.GetType("System.String"));
DataColumn column5 = new DataColumn("NormalValue", Type.GetType("System.String"));
DataColumn column6 = new DataColumn("LowerTolVal", Type.GetType("System.String"));
DataColumn column7 = new DataColumn("UpperTolVal", Type.GetType("System.String"));
DataColumn column8 = new DataColumn("MeasureValue", Type.GetType("System.String"));
DataColumn column10 = new DataColumn("MeasureItemResult", Type.GetType("System.String"));
DataColumn column9 = new DataColumn("MeasureDate", Type.GetType("System.DateTime"));
DataColumn column1 = new DataColumn("Remark", Type.GetType("System.String"));
//将列添加到table表中
dtCSVContent.Columns.Add(column2);
dtCSVContent.Columns.Add(dcCarType);
dtCSVContent.Columns.Add(column3);
dtCSVContent.Columns.Add(column4);
dtCSVContent.Columns.Add(column5);
dtCSVContent.Columns.Add(column6);
dtCSVContent.Columns.Add(column7);
dtCSVContent.Columns.Add(column8);
dtCSVContent.Columns.Add(column10);
dtCSVContent.Columns.Add(column9);
dtCSVContent.Columns.Add(column1);
#endregion
#region Table初始化
//创建虚拟表
DataColumn dcCarID = new DataColumn("CarID", Type.GetType("System.String"));
DataColumn dcRangeName = new DataColumn("RangeName", Type.GetType("System.String"));
DataColumn dcRangeValue = new DataColumn("RangeValue", Type.GetType("System.String"));
DataColumn dcRangeLowUpp = new DataColumn("RangeLowUpp", Type.GetType("System.String"));
DataColumn dcResult = new DataColumn("Result", Type.GetType("System.String"));
DataColumn dcCreateTime = new DataColumn("CreateTime", Type.GetType("System.DateTime"));
DataColumn dcRemark = new DataColumn("Remark", Type.GetType("System.String"));
//将列添加到table表中
#endregion Table初始化
#region
//创建分页虚拟表
DataColumn column11 = new DataColumn("CarID", Type.GetType("System.String"));
DataColumn column12 = new DataColumn("MeasPointName", Type.GetType("System.String"));
DataColumn column13 = new DataColumn("DimensionName", Type.GetType("System.String"));
DataColumn column14 = new DataColumn("NormalValue", Type.GetType("System.String"));
DataColumn column15 = new DataColumn("LowerTolVal", Type.GetType("System.String"));
DataColumn column16 = new DataColumn("UpperTolVal", Type.GetType("System.String"));
DataColumn column17 = new DataColumn("MeasureValue", Type.GetType("System.String"));
DataColumn column18 = new DataColumn("MeasureDate", Type.GetType("System.String"));
DataColumn column19 = new DataColumn("MeasureItemResult", Type.GetType("System.String"));
//将列添加到table表中
PageTable.Columns.Add(column11);
PageTable.Columns.Add(column12);
PageTable.Columns.Add(column13);
PageTable.Columns.Add(column14);
PageTable.Columns.Add(column15);
PageTable.Columns.Add(column16);
PageTable.Columns.Add(column17);
PageTable.Columns.Add(column18);
PageTable.Columns.Add(column19);
labCurrentPage.Text = "当前页:" + currentPage.ToString(); //当前页
labSumPages.Text = "共 " + pageCount.ToString() + " 页";//总页数
labSumRecorders.Text = "总共 " + recordCount.ToString() + " 条记录";//总记录数
rddlPageRecorderCount.SelectedIndex = 0;
#endregion
}
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (DialogResult.Yes == MessageBox.Show("警告:您确定要退出该软件系统吗?", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning))
{
}
else
{
e.Cancel = true;
}
}
private void FormMain_FormClosed(object sender, FormClosedEventArgs e)
{
MyBase.TraceWriteLine("-------------海克斯康面隙分析软件程序关闭---------------------");
LogDebugDfn.strEndTime = DateTime.Now.ToString("yyyy.MM.dd HH-mm-ss");
string CopyFileName = ConfigDfn.strFileFolder + "\\DebugFiles\\" + "Debug(" + LogDebugDfn.strStartTime + " To " + LogDebugDfn.strEndTime + ")" + ".txt";
if (File.Exists(LogDebugDfn.strDebugFile))
File.Copy(LogDebugDfn.strDebugFile, CopyFileName);
System.Environment.Exit(0);
}
#endregion
private void tmSystem_Tick(object sender, EventArgs e)
{
rleTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
if (ConfigDfn.iAnalysisCSVFlag == 1)
rleReadCSVStatus.ForeColor = bReadCSVFlag ? Color.Green : Color.White;
bReadCSVFlag = !bReadCSVFlag;
}
private void FileSortTimer_Tick(object sender, EventArgs e) //分发定时器
{
// 后台运行,避免阻塞UI
Task.Run(() =>
{
try
{
fileSorter.ProcessFiles();
}
catch (Exception ex)
{
MyBase.TraceWriteLine($"分发任务异常: {ex.Message}");
}
});
}
private void DisplayMeasureData(string strCarID)
{
try
{
#region
MyBase.TraceWriteLine("正在查询车ID为:" + strCarID + " 的测量结果。");
DataTable sampleData = tmdal.SelectMeasureResultByCarID(strCarID);
AnalysisResult analysis = AnalysisResult.AnalyzeMeasureData(sampleData);
AnalysisResult.DisplayAnalysisResult(analysis);
// 记录正在查询
//表格行数
int dtRowCount = analysis.TotalCount;
//超差个数
double OutCount = analysis.OutCount;
//Ok个数
double OKCount = analysis.OKCount;
//异常个数
double RejectedCount = analysis.RejectedCount;
//合格率
double FPYPercent = analysis.FPYPercent;
labVIN.Text = strCarID;
labCarType.Text = ConfigDfn.strCarModel;
TMeasureResultModel tmrm = new TMeasureResultModel();
labNGCount.Text = OutCount.ToString();
labOKCount.Text = OKCount.ToString();
labRejectCount.Text = RejectedCount.ToString();
labMeaTime.Text = ConfigDfn.strMeasureTime;
labSumMeasureCount.Text = dtRowCount.ToString();
FPYPercent = OKCount / (OKCount + OutCount);
if (FPYPercent >= ConfigDfn.dFPY)
{
labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%";
labResult.Text = "合格";
labResultPercent.ForeColor = Color.LimeGreen;
labResult.ForeColor = Color.LimeGreen;
pbResult.Image = Resources.OK;
tmrm.Result = 1;
}
else if (FPYPercent >= ConfigDfn.dFPY2 && FPYPercent < ConfigDfn.dFPY)
{
labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%";
labResult.Text = "合格";
labResultPercent.ForeColor = Color.Yellow;
labResult.ForeColor = Color.Yellow;
pbResult.Image = Resources.OK;
tmrm.Result = 1;
}
else
{
labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%";
labResult.Text = "不合格";
labResultPercent.ForeColor = Color.Red;
labResult.ForeColor = Color.Red;
pbResult.Image = Resources.NG;
tmrm.Result = 2;
}
xValues[0] = "合格 : " + OKCount.ToString();
xValues[1] = "不合格 : " + OutCount.ToString();
xValues[2] = "异常 : " + RejectedCount.ToString();
yValues[0] = (int)OKCount;
yValues[1] = (int)OutCount;
yValues[2] = (int)RejectedCount;
chartResultPie.Series[0].Points.DataBindXY(xValues, yValues);
string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%";
tmrm.CarID = strCarID;
tmrm.CarType = ConfigDfn.strCarModel;
tmrm.SumMeasureItems = dtRowCount;
tmrm.GoodMeasureItems = (int)OKCount;
tmrm.NoGoodMeasureItems = (int)OutCount;
tmrm.RejectMeasureItems = (int)RejectedCount;
tmrm.FPY = FPYPercent.ToString("F4");
tmrm.Remark = "";
tmrm.MeasureDate = ConfigDfn.strMeasureTime;
tmdal.InsertTMeasureResult(tmrm);
MyBase.TraceWriteLine("将总结果插入数据库完毕。");
#endregion
#region
DataTable dataTable = tmdal.SelectMeasureDataByCarID(strCarID);
// 判断是否有数据
if (dataTable == null || dataTable.Rows.Count == 0)
{
MyBase.TraceWriteLine("没有找到车ID为:" + strCarID + " 的测量数据。");
return;
}
dgvMeasureContent.DataSource = dataTable;
this.dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].DefaultCellStyle.ForeColor = Color.White;
if (dgvMeasureContent.Rows.Count > 0)
{
SetdgvRowBgColor(dgvMeasureContent);
for (int i = 0; i < dgvMeasureContent.Rows.Count; i++)
{
//if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ok"))
//{
// dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange;
//}
if (dgvMeasureContent.Rows[i].Cells["Classification"].Value.ToString().ToLower().Contains("ng"))
{
dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange;
}
else if (string.IsNullOrEmpty(dgvMeasureContent.Rows[i].Cells["Classification"].Value.ToString()))
{
dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Red;
}
else
{
}
}
}
#endregion
}
catch (Exception ex)
{
MyBase.TraceWriteLine("[AnalysisNextSenseCSV] 函数分析异常:" + ex.ToString());
}
}
private void FileSorter_OnFileParsed(string strCarID)
{
// 线程安全更新 UI
if (InvokeRequired)
{
Invoke(new Action<string>(FileSorter_OnFileParsed), strCarID);
return;
}
// 这里可以更新界面控件,例如 ListBox、Label 等
// 例如:listBoxParsedFiles.Items.Add(fileName);
// 或 rleMessage.Text = $"已解析: {fileName}";
rleMessage.Text = $"已解析: {strCarID}";
// 显示数据, 此时为左侧或右侧数据
DisplayMeasureData(strCarID);
}
/// 通过给定的文件流,判断文件的编码类型
/// <param name="fs">文件流</param>
/// <returns>文件的编码类型</returns>
public static Encoding GetType(FileStream fs)
{
byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
System.Text.Encoding reVal = System.Text.Encoding.Default;
System.IO.BinaryReader r = new System.IO.BinaryReader(fs, System.Text.Encoding.Default);
int i;
int.TryParse(fs.Length.ToString(), out i);
byte[] ss = r.ReadBytes(i);
if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))
{
reVal = System.Text.Encoding.UTF8;
}
else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
{
reVal = System.Text.Encoding.BigEndianUnicode;
}
else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
{
reVal = System.Text.Encoding.Unicode;
}
r.Close();
return reVal;
}
/// 判断是否是不带 BOM 的 UTF8 格式
/// <param name="data"></param>
/// <returns></returns>
private static bool IsUTF8Bytes(byte[] data)
{
int charByteCounter = 1; //计算当前正分析的字符应还有的字节数
byte curByte; //当前分析的字节.
for (int i = 0; i < data.Length; i++)
{
curByte = data[i];
if (charByteCounter == 1)
{
if (curByte >= 0x80)
{
//判断当前
while (((curByte <<= 1) & 0x80) != 0)
{
charByteCounter++;
}
//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X 
if (charByteCounter == 1 || charByteCounter > 6)
{
return false;
}
}
}
else
{
//若是UTF-8 此时第一位必须为1
if ((curByte & 0xC0) != 0x80)
{
return false;
}
charByteCounter--;
}
}
if (charByteCounter > 1)
{
throw new Exception("非预期的byte格式");
}
return true;
}
public Encoding GetType(string FileName)
{
FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);
Encoding er = GetType(fs);
fs.Close();
return er;
}
private void btn_MouseHover(object sender, EventArgs e)
{
RadButton btn = sender as RadButton;
btn.BackColor = Color.FromArgb(0, 151, 186);
}
private void btn_MouseLeave(object sender, EventArgs e)
{
RadButton btn = sender as RadButton;
btn.BackColor = Color.FromArgb(19, 46, 53);
}
public void SetdgvRowBgColor(DataGridView dgv) //设置DataGridView各行变色
{
if (dgv.Rows.Count > 0)
{
foreach (DataGridViewRow item in dgv.Rows)
{
if (item.Index % 2 == 0)
{
item.DefaultCellStyle.BackColor = Color.FromArgb(19, 46, 53);
}
else
{
item.DefaultCellStyle.BackColor = Color.FromArgb(27, 60, 68);
}
}
}
}
#region
#region datagridview分页功能
private void LoadPage()
{
if (currentPage < 1) currentPage = 1;
if (currentPage > pageCount) currentPage = pageCount;
int beginRecord; //开始指针
int endRecord; //结束指针
DataTable dtTemp;
dtTemp = PageTable.Clone();//Clone方法只会复制DataTable的结构(列定义),而不会复制数据行的引用。
beginRecord = pageSize * (currentPage - 1);
if (currentPage == 1) beginRecord = 0;
endRecord = pageSize * currentPage;
if (currentPage == pageCount) endRecord = recordCount;
for (int i = beginRecord; i < endRecord; i++)
{
// 使用ImportRow方法将源PageTable的行导入到目标dtTemp
dtTemp.ImportRow(PageTable.Rows[i]);
}
dgvSelectMeasureData.Rows.Clear();
for (int i = 0; i < dtTemp.Rows.Count; i++)
{
dgvSelectMeasureData.Rows.Add(new object[] { dtTemp.Rows[i][0], dtTemp.Rows[i][1], dtTemp.Rows[i][2], dtTemp.Rows[i][3], dtTemp.Rows[i][4], dtTemp.Rows[i][5], dtTemp.Rows[i][6], dtTemp.Rows[i][7], dtTemp.Rows[i][8] });
}
SetdgvRowBgColor(dgvSelectMeasureData);
for (int i = 0; i < dgvSelectMeasureData.Rows.Count; i++)
{
string strResult = dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Value.ToString();
if (strResult.ToLower().Contains("ng"))
{
//dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Style.ForeColor = Color.Orange;
dgvSelectMeasureData.Rows[i].DefaultCellStyle.BackColor = Color.Orange;
}
if (strResult.ToLower().Contains("rej"))
{
dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Style.ForeColor = Color.Red;
}
}
labCurrentPage.Text = "当前页:" + currentPage.ToString(); //当前页
labSumPages.Text = "共 " + pageCount.ToString() + " 页";//总页数
labSumRecorders.Text = "总共 " + recordCount.ToString() + " 条记录";//总记录数
}
private void rbtnFirtstPage_Click(object sender, EventArgs e)
{
if (currentPage == 1)
{ return; }
currentPage = 1;
LoadPage();
}
private void rbtnPrevPage_Click(object sender, EventArgs e)
{
if (currentPage == 1)
{ return; }
currentPage--;
LoadPage();
}
private void rbtnNextPage_Click(object sender, EventArgs e)
{
if (currentPage == pageCount)
{ return; }
currentPage++;
LoadPage();
}
private void rbtnLastPage_Click(object sender, EventArgs e)
{
if (currentPage == pageCount)
{ return; }
currentPage = pageCount;
LoadPage();
}
private void rddlPageRecorderCount_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
{
pageSize = int.Parse(rddlPageRecorderCount.Text.Trim());
//PageSorter();
}
#endregion datagridview分页功能
private void rbtnSearchMeaserData_Click(object sender, EventArgs e)
{
dgvFPYResult.Visible = false;
chartFPYLine.Visible = false;
rbtnExportCSVReport.Visible = false;
string strStartTime = rdtpStartTime.Value.ToString("yyyy-MM-dd") + " 00:00:00";
string strEndTime = rdtpEndTime.Value.ToString("yyyy-MM-dd") + " 23:59:59";
string strCarID = rtbPartID.Text.Trim();
PageTable.Clear();
PageTable = tmdal.SelectTMeasureDataByCarIDAndTime(strCarID, strStartTime, strEndTime);
if (PageTable.Rows.Count > 0)
{
recordCount = PageTable.Rows.Count; //记录总行数
pageCount = (recordCount / pageSize);
if ((recordCount % pageSize) > 0)
{
pageCount++;
}
//默认第一页
currentPage = 1;
LoadPage();//调用加载数据的方法
dgvSelectMeasureData.Visible = true;
rbtnExportCSVReport.Visible = true;
pnlPage.Visible = true;
labSearchResult.Visible = false;
pnlPage.Visible = true;
}
else
{
dgvSelectMeasureData.Visible = false;
labSearchResult.Visible = true;
rbtnExportCSVReport.Visible = false;
pnlPage.Visible = false;
}
}
private void rbtSelectFPY_Click(object sender, EventArgs e)
{
dgvSelectMeasureData.Visible = false;
rbtnExportCSVReport.Visible = false;
pnlPage.Visible = false;
string strStartTime = rdtpStartTime.Value.ToString("yyyy-MM-dd") + " 00:00:00";
string strEndTime = rdtpEndTime.Value.ToString("yyyy-MM-dd") + " 23:59:59";
string strCarID = rtbPartID.Text.Trim();
DataTable dtFPY = new DataTable();
dtFPY = tmdal.SelectTMeasureResultByTime(strCarID, strStartTime, strEndTime);
if (dtFPY.Rows.Count > 0)
{
dgvFPYResult.Visible = true;
labSearchResult.Visible = false;
rbtnExportCSVReport.Visible = true;
chartFPYLine.Visible = true;
dgvFPYResult.DataSource = dtFPY;
SetdgvRowBgColor(dgvFPYResult);
for (int i = 0; i < dgvFPYResult.Rows.Count; i++)
{
if (dgvFPYResult.Rows[i].Cells["SMResult"].Value.ToString().ToLower().Contains("不合格"))
{
dgvFPYResult.Rows[i].Cells["SMResult"].Style.ForeColor = Color.Red;
}
}
#region 线
//合格率折线图
string[] strXDate = new string[dtFPY.Rows.Count];
double[] dFPYResult = new double[dtFPY.Rows.Count];
for (int i = 0; i < dtFPY.Rows.Count; i++)
{
strXDate[i] = dtFPY.Rows[i]["CarID"].ToString();
}
for (int i = 0; i < dtFPY.Rows.Count; i++)
{
double dResult = double.Parse(dtFPY.Rows[i]["FPY"].ToString());
dFPYResult[i] = dResult * 100.00;
}
chartFPYLine.ChartAreas[0].AxisX.LabelStyle.Angle = -50; //X轴标签倾斜角度设置
chartFPYLine.ChartAreas[0].AxisY.LabelStyle.Format = "{0:F2}" + "%"; //设置Y轴值的格式化 带%
chartFPYLine.Series[0].Label = "#VAL%"; //设置显示Y的值
chartFPYLine.Series[0].LabelForeColor = Color.White;
chartFPYLine.Series[0].ToolTip = "车身编号 : #VALX \r\n合格率 : #VAL%"; //鼠标移动到对应点显示数值
chartFPYLine.Series[0].Points.DataBindXY(strXDate, dFPYResult);
#endregion 线
}
else
{
dgvFPYResult.Visible = false;
labSearchResult.Visible = true;
rbtnExportCSVReport.Visible = false;
chartFPYLine.Visible = false;
}
}
public static void ExportdgvDataToCsv(DataGridView dataGridView, string filePath)
{
StringBuilder sb = new StringBuilder();
// 添加列标题
foreach (DataGridViewColumn column in dataGridView.Columns)
{
sb.Append(column.HeaderText);
sb.Append(",");
}
sb.Remove(sb.Length - 1, 1);
sb.AppendLine();
// 添加行数据
foreach (DataGridViewRow row in dataGridView.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
sb.Append(cell.Value);
sb.Append(",");
}
sb.Remove(sb.Length - 1, 1);
sb.AppendLine();
}
// 将数据写入CSV文件
File.WriteAllText(filePath, sb.ToString(), Encoding.GetEncoding("GBK"));
}
public static void ExportDataTableDataToCsv(DataTable dt, string filePath)
{
StringBuilder sb = new StringBuilder();
// 添加列标题
foreach (DataColumn column in dt.Columns)
{
sb.Append(column.ColumnName);
sb.Append(",");
}
sb.Remove(sb.Length - 1, 1);
sb.AppendLine();
// 添加行数据
foreach (DataRow row in dt.Rows)
{
foreach (object item in row.ItemArray)
{
sb.Append(item);
sb.Append(",");
}
sb.Remove(sb.Length - 1, 1);
sb.AppendLine();
}
// 将数据写入CSV文件
File.WriteAllText(filePath, sb.ToString());
}
private void rbtnExportCSVReport_Click(object sender, EventArgs e)
{
string strCSVExportPath = "";
string strExportTime = DateTime.Now.ToString("yyyyMMddHHmmssfff");
FolderBrowserDialog m_Folder = new FolderBrowserDialog();
m_Folder.Description = "请选择要导出的CSV文件的路径";
m_Folder.RootFolder = Environment.SpecialFolder.Desktop;
if (dgvFPYResult.Visible == true && dgvFPYResult.Rows.Count > 0)
{
m_Folder.ShowDialog();
if (Directory.Exists(m_Folder.SelectedPath))
{
strCSVExportPath = m_Folder.SelectedPath + "\\合格率" + strExportTime + ".CSV";
try
{
ExportdgvDataToCsv(dgvFPYResult, strCSVExportPath);
MyBase.TraceWriteLine("合格率数据导出成功,路径为:" + strCSVExportPath);
//弹窗 提示
MessageBox.Show("合格率数据导出成功,路径为:" + strCSVExportPath, "导出成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MyBase.TraceWriteLine("导出合格率数据时发生错误:" + ex.Message);
}
}
}
if (dgvSelectMeasureData.Visible == true && dgvSelectMeasureData.Rows.Count > 0)
{
m_Folder.ShowDialog();
if (Directory.Exists(m_Folder.SelectedPath))
{
strCSVExportPath = m_Folder.SelectedPath + "\\车身尺寸数据" + strExportTime + ".CSV";
try
{
ExportDataTableDataToCsv(PageTable, strCSVExportPath);
MyBase.TraceWriteLine("车身尺寸数据导出成功,路径为:" + strCSVExportPath);
//弹窗 提示
MessageBox.Show("车身尺寸数据导出成功,路径为:" + strCSVExportPath, "导出成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MyBase.TraceWriteLine("导出车身尺寸数据时发生错误:" + ex.Message);
}
}
}
}
private void dgvFPYResult_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1);
}
private void dgvSelectMeasureData_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1);
}
private void tmrMonitorDBToCreateReport_Tick(object sender, EventArgs e)
{
tmrMonitorDBToCreateReport.Stop();
int iCurrentMeasureCount = tmdal.SelectTMeasureResultCount();
if (iCurrentMeasureCount > iLastMesureCount && (iCurrentMeasureCount == (iLastMesureCount + 1)))
{
MyBase.TraceWriteLine("监控数据库,开始生成ipn文件:");
DataTable dtMeaResult = tmdal.SelectNewestTMeasureResult();
string strVIN = dtMeaResult.Rows[0]["CarID"].ToString();
DateTime dateMeaDate = Convert.ToDateTime(dtMeaResult.Rows[0]["Remark"].ToString());
DataTable dtMeaContent = tmdal.SelectCJLRMeaDataByCarID(strVIN);
string strCarType = dtMeaContent.Rows[0][2].ToString();
int iMeaCount = dtMeaContent.Rows.Count;
#region
string filePath = "";
if (strCarType.ToLower().Contains("tava"))
{
filePath = ConfigDfn.strReportPath + "\\" + strCarType + "_" + strVIN + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".ipn";
}
else
{
filePath = ConfigDfn.strReportPath2 + "\\" + strCarType + "_" + strVIN + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".ipn";
}
StringBuilder sb = new StringBuilder();
#region
sb.Append("GAUGE ID");
sb.Append("\t");
sb.Append("JSN");
sb.Append("\t");
sb.Append("MO");
sb.Append("\t");
sb.Append("DAY");
sb.Append("\t");
sb.Append("YR");
sb.Append("\t");
sb.Append("HR");
sb.Append("\t");
sb.Append("MIN");
sb.Append("\t");
sb.Append("SEC");
sb.Append("\t");
sb.Append("MODEL");
sb.Append("\t");
sb.Append("AuxID1");
sb.Append("\t");
sb.Append("AuxID2");
sb.Append("\t");
sb.Append("QUAL");
sb.Append("\t");
sb.Append("SHIFT");
sb.Append("\t");
sb.Append("DATA TYPE");
sb.Append("\t");
sb.Append("FIXTURE");
sb.Append("\t");
for (int i = 0; i < iMeaCount / 2; i++)
{
string strMeaPointName = dtMeaContent.Rows[i * 2]["MeasPointName"].ToString();
string strMPF = strMeaPointName + " Flush";
string strMPG = strMeaPointName + " Gap";
sb.Append("D " + strMPF);
sb.Append("\t");
sb.Append("D " + strMPG);
sb.Append("\t");
sb.Append("B " + strMPF);
sb.Append("\t");
sb.Append("B " + strMPG);
sb.Append("\t");
sb.Append("A " + strMPF);
sb.Append("\t");
sb.Append("A " + strMPG);
sb.Append("\t");
sb.Append("US " + strMPF);
sb.Append("\t");
sb.Append("LS " + strMPF);
sb.Append("\t");
sb.Append("US " + strMPG);
sb.Append("\t");
sb.Append("LS " + strMPG);
sb.Append("\t");
sb.Append("UR " + strMPF);
sb.Append("\t");
sb.Append("LR " + strMPF);
sb.Append("\t");
sb.Append("UR " + strMPG);
sb.Append("\t");
sb.Append("LR " + strMPG);
sb.Append("\t");
sb.Append("UT " + strMPF);
sb.Append("\t");
sb.Append("LT " + strMPF);
sb.Append("\t");
sb.Append("UT " + strMPG);
sb.Append("\t");
sb.Append("LT " + strMPG);
sb.Append("\t");
}
#endregion
sb.AppendLine();
#region
sb.Append(ConfigDfn.strStationName);
sb.Append("\t");
sb.Append(strVIN);
sb.Append("\t");
sb.Append(dateMeaDate.Month.ToString());
sb.Append("\t");
sb.Append(dateMeaDate.Day.ToString());
sb.Append("\t");
sb.Append(dateMeaDate.Year.ToString().Substring(2));
sb.Append("\t");
sb.Append(dateMeaDate.Hour.ToString());
sb.Append("\t");
sb.Append(dateMeaDate.Minute.ToString());
sb.Append("\t");
sb.Append(dateMeaDate.Second.ToString());
sb.Append("\t");
if (strCarType.ToLower().Contains("tava"))
sb.Append(ConfigDfn.strUploadPath);
else
{
sb.Append(ConfigDfn.strUploadPath2);
}
sb.Append("\t");
sb.Append("Unknow");
sb.Append("\t");
sb.Append("Unknow");
sb.Append("\t");
sb.Append("2");
sb.Append("\t");
sb.Append("");
sb.Append("\t");
sb.Append("AUTO");
sb.Append("\t");
sb.Append("NONE");
sb.Append("\t");
double dDevFVal = 0;
double dDevGVal = 0;
double dMeaFVal = 0;
double dMeaGVal = 0;
double dNorFVal = 0;
double dNorGVal = 0;
double dFUpper = 0;
double dFLower = 0;
double dGUpper = 0;
double dGLower = 0;
double dFUpper2 = 0;
double dFLower2 = 0;
double dGUpper2 = 0;
double dGLower2 = 0;
double dFUpper3 = 0;
double dFLower3 = 0;
double dGUpper3 = 0;
double dGLower3 = 0;
for (int i = 0; i < iMeaCount / 2; i++)
{
string strMeasureFValue = dtMeaContent.Rows[i * 2]["MeasureValue"].ToString();
string strMeasureGValue = dtMeaContent.Rows[i * 2 + 1]["MeasureValue"].ToString();
string strNormalFValue = dtMeaContent.Rows[i * 2]["NormalValue"].ToString();
string strNormalGValue = dtMeaContent.Rows[i * 2 + 1]["NormalValue"].ToString();
dNorFVal = double.Parse(strNormalFValue);
dNorGVal = double.Parse(strNormalGValue);
dFUpper = double.Parse(dtMeaContent.Rows[i * 2]["UpperTolVal"].ToString());
dFLower = double.Parse(dtMeaContent.Rows[i * 2]["LowerTolVal"].ToString());
dGUpper = double.Parse(dtMeaContent.Rows[i * 2 + 1]["UpperTolVal"].ToString());
dGLower = double.Parse(dtMeaContent.Rows[i * 2 + 1]["LowerTolVal"].ToString());
dFUpper2 = dFUpper * ConfigDfn.dLevel2;
dFLower2 = dFLower * ConfigDfn.dLevel2;
dGUpper2 = dGUpper * ConfigDfn.dLevel2;
dGLower2 = dGLower * ConfigDfn.dLevel2;
dFUpper3 = dFUpper * ConfigDfn.dLevel3;
dFLower3 = dFLower * ConfigDfn.dLevel3;
dGUpper3 = dGUpper * ConfigDfn.dLevel3;
dGLower3 = dGLower * ConfigDfn.dLevel3;
if (strMeasureFValue.Contains("inv"))
{
sb.Append("inv");
sb.Append("\t");
}
else
{
dMeaFVal = double.Parse(strMeasureFValue);
dDevFVal = dMeaFVal - dNorFVal;
sb.Append(dDevFVal.ToString("F3"));
sb.Append("\t");
}
if (strMeasureGValue.Contains("inv"))
{
sb.Append("inv");
sb.Append("\t");
}
else
{
dMeaGVal = double.Parse(strMeasureGValue);
dDevGVal = dMeaGVal - dNorGVal;
sb.Append(dDevGVal.ToString("F3"));
sb.Append("\t");
}
sb.Append(strNormalFValue);
sb.Append("\t");
sb.Append(strNormalGValue);
sb.Append("\t");
sb.Append(strMeasureFValue);
sb.Append("\t");
sb.Append(strMeasureGValue);
sb.Append("\t");
sb.Append(dFUpper.ToString("F3"));
sb.Append("\t");
sb.Append(dFLower.ToString("F3"));
sb.Append("\t");
sb.Append(dGUpper.ToString("F3"));
sb.Append("\t");
sb.Append(dGLower.ToString("F3"));
sb.Append("\t");
sb.Append(dFUpper2.ToString("F3"));
sb.Append("\t");
sb.Append(dFLower2.ToString("F3"));
sb.Append("\t");
sb.Append(dGUpper2.ToString("F3"));
sb.Append("\t");
sb.Append(dGLower2.ToString("F3"));
sb.Append("\t");
sb.Append(dFUpper3.ToString("F3"));
sb.Append("\t");
sb.Append(dFLower3.ToString("F3"));
sb.Append("\t");
sb.Append(dGUpper3.ToString("F3"));
sb.Append("\t");
sb.Append(dGLower3.ToString("F3"));
sb.Append("\t");
}
#endregion
// 将数据写入CSV文件
File.WriteAllText(filePath, sb.ToString());
MyBase.TraceWriteLine("客户定制ipn报告生成完毕,路径为:" + filePath);
#endregion
}
iLastMesureCount = iCurrentMeasureCount;
tmrMonitorDBToCreateReport.Start();
}
private void lpcSoftwareSetup_Click(object sender, EventArgs e)
{
string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消");
if (strInputPwd.Contains("-999.999"))
{
return;
}
else if (strInputPwd == ConfigDfn.strPwd)
{
FSoftwareSetup fss = new FSoftwareSetup();
fss.ShowDialog(this);
}
else
{
MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void lpcToleranceSetup_Click(object sender, EventArgs e)
{
string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消");
if (strInputPwd.Contains("-999.999"))
{
return;
}
else if (strInputPwd == ConfigDfn.strPwd)
{
FToleranceSetup fts = new FToleranceSetup();
fts.ShowDialog(this);
}
else
{
MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void lpcAboutSoftware_Click(object sender, EventArgs e)
{
AboutSoftwareInfo asi = new AboutSoftwareInfo();
asi.ShowDialog();
}
private void lpcShowLog_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("notepad.exe", LogDebugDfn.strDebugFile);
}
#endregion
}
public class AnalysisResult
{
public string CarID { get; set; }
public int TotalCount { get; set; }
public int OutCount { get; set; }
public int OKCount { get; set; }
public int RejectedCount { get; set; }
public double FPYPercent { get; set; }
public static AnalysisResult AnalyzeMeasureData(DataTable dt)
{
var result = new AnalysisResult();
if (dt == null || dt.Rows.Count == 0)
return result;
// Accessing the first row of the DataTable to retrieve values
var firstRow = dt.Rows[0];
result.CarID = firstRow["CarID"].ToString();
result.TotalCount = Convert.ToInt32(firstRow["TotalCount"]);
result.OKCount = Convert.ToInt32(firstRow["PassCount"]);
result.OutCount = Convert.ToInt32(firstRow["NGCount"]);
result.RejectedCount = Convert.ToInt32(firstRow["RejectCount"]);
result.FPYPercent = Convert.ToDouble(firstRow["FPY"]);
return result;
}
public static void DisplayAnalysisResult(AnalysisResult result)
{
Console.WriteLine("===== 测量结果分析 =====");
Console.WriteLine($"车身编号: {result.CarID}");
Console.WriteLine($"总测量项: {result.TotalCount}");
Console.WriteLine($"合格项(OK): {result.OKCount}");
Console.WriteLine($"超差项(Out): {result.OutCount}");
Console.WriteLine($"异常项(Rejected): {result.RejectedCount}");
Console.WriteLine($"首次通过率(FPY): {result.FPYPercent:F2}%");
}
}
}