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();
///
/// 每页记录数
///
public int pageSize = 20;
///
/// 总记录数
///
public int recordCount = 0;
///
/// 总页数
///
public int pageCount = 0;
///
/// 当前页
///
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(FileSorter_OnFileParsed), strCarID);
return;
}
// 这里可以更新界面控件,例如 ListBox、Label 等
// 例如:listBoxParsedFiles.Items.Add(fileName);
// 或 rleMessage.Text = $"已解析: {fileName}";
rleMessage.Text = $"已解析: {strCarID}";
// 显示数据, 此时为左侧或右侧数据
DisplayMeasureData(strCarID);
}
/// 通过给定的文件流,判断文件的编码类型
/// 文件流
/// 文件的编码类型
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 格式
///
///
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}%");
}
}
}