private void ChartDt()
{
GetPreviousDate getPreviousDate = new GetPreviousDate();
List<string> PreviousFridayList = new List<string>();
List<string> FriNextThursdayList = new List<string>();
List<string> MonthStartList = new List<string>();
List<string> MonthEndList = new List<string>();
// 近三月三周始末日期
for (int i = 1; i <= 3; i++)
{
PreviousFridayList.Add(getPreviousDate.GetPreviousFriday(i).ToString("yyyyMMdd"));
FriNextThursdayList.Add(getPreviousDate.GetFriNextThursday(i).ToString("yyyyMMdd"));
MonthStartList.Add(getPreviousDate.GetMonthStart(i).ToString("yyyyMMdd"));
MonthEndList.Add(getPreviousDate.GetMonthStart(i - 1).ToString("yyyyMMdd"));// 次月月初
}
// FriNextThursdayList 处理日期 +1天
List<string> AddFriNextThursdayList = FriNextThursdayList.Select(s =>
{
DateTime date;
if (DateTime.TryParseExact(s, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
return date.AddDays(1).ToString("yyyyMMdd"); // 加1天并格式化
}
else
{
return s; // 无效日期时返回原字符串(可选:可抛出异常或返回null)
}
}).ToList();
// 近七天日期
IEnumerable<DateTime> last7Days = getPreviousDate.GetLast7Days(baseDate);
List<string> PreviousDayList = new List<string>();
foreach (var day in last7Days)
{
PreviousDayList.Add(day.ToString("yyyyMMdd"));
}
// 近七天日期
IEnumerable<DateTime> last7Days_ = getPreviousDate.GetLast7Days_(baseDate);
List<string> PreviousDayList_ = new List<string>();
foreach (var day in last7Days_)
{
PreviousDayList_.Add(day.ToString("yyyyMMdd"));
}
#region
// 周 dt
List<string> WeekSqlList = new List<string>();
List<DataTable> WeekDetailsDtList = new List<DataTable>();
List<DataTable> WeekRatioDtList = new List<DataTable>();
for (int i = 0; i < 3; i++)
{
string sql = string.Format(@"
SELECT lotid, stage, equipmentname, trackoutqty, trackintime, trackouttime, SubStr(PROCESS,2,5) tech
FROM SDB_TB_WIP_TITO_HIST
WHERE 1=1
AND lottype NOT IN ('C','D','V','Z','Y','L','T','X')
AND equipmentname = '{0}'
AND trackintime >= '{1} 073000000'
AND trackintime <= '{2} 073000000'
ORDER BY trackintime
", EqpSelection.Text, PreviousFridayList[i], AddFriNextThursdayList[i]);
WeekSqlList.Add(sql);
DataTable dt = ws.GetDataTable(Mainfrom.dataSoure, WeekSqlList[i]);
WeekDetailsDtList.Add(dt);
WeekRatioDtList.Add(EachDtProcess(WeekDetailsDtList[i]));
}
// 天 dt
List<string> DaySqlList = new List<string>();
List<DataTable> DayDetailsDtList = new List<DataTable>();
List<DataTable> DayRatioDtList = new List<DataTable>();
for (int i = 0; i < 7; i++)
{
string sql = string.Format(@"
SELECT lotid, stage, equipmentname, trackoutqty, trackintime, trackouttime, SubStr(PROCESS,2,5) tech
FROM SDB_TB_WIP_TITO_HIST
WHERE 1=1
AND lottype NOT IN ('C','D','V','Z','Y','L','T','X')
AND equipmentname = '{0}'
AND trackintime >= '{1} 073000000'
AND trackintime <= '{2} 073000000'
ORDER BY trackintime
", EqpSelection.Text, PreviousDayList[i], PreviousDayList_[i]);
DaySqlList.Add(sql);
DataTable dt = ws.GetDataTable(Mainfrom.dataSoure, DaySqlList[i]);
DayDetailsDtList.Add(dt);
DayRatioDtList.Add(EachDtProcess(DayDetailsDtList[i]));
}
// 月 dt
List<string> MonthSqlList = new List<string>();
List<DataTable> MonthDetailsDtList = new List<DataTable>();
List<DataTable> MonthRatioDtList = new List<DataTable>();
for (int i = 0; i < 3; i++)
{
string sql = string.Format(@"
SELECT lotid, stage, equipmentname, trackoutqty, trackintime, trackouttime, SubStr(PROCESS,2,5) tech
FROM SDB_TB_WIP_TITO_HIST
WHERE 1=1
AND lottype NOT IN ('C','D','V','Z','Y','L','T','X')
AND equipmentname = '{0}'
AND trackintime >= '{1} 073000000'
AND trackintime <= '{2} 073000000'
ORDER BY trackintime
", EqpSelection.Text, MonthStartList[i], MonthEndList[i]);
MonthSqlList.Add(sql);
DataTable dt = ws.GetDataTable(Mainfrom.dataSoure, MonthSqlList[i]);
MonthDetailsDtList.Add(dt);
MonthRatioDtList.Add(EachDtProcess(MonthDetailsDtList[i]));
}
//List<List<int>> CountList = new List<List<int>>();
//List<int> tempList = new List<int>();
//for (int i = 0; i < MdtRatioList.Count; i++ )
//{
// tempList.Clear();
// foreach (DataRow row in MdtRatioList[i].Rows)
// {
// int num = row.Field<int>("Count");
// tempList.Add(num);
// }
// CountList.Add(tempList);
//}
//
// 单机台周平均
//
// 遍历 周 Ratio dt Count列
List<List<object>> WeekCountList = new List<List<object>>();
foreach (DataTable dt in WeekRatioDtList)
{
// 验证列存在性
if (!dt.Columns.Contains("Count")) continue;
// 创建当前表的存储列表
List<object> currentTableData = new List<object>();
// 遍历行并提取数据
foreach (DataRow row in dt.Rows)
{
object value = row["Count"];
currentTableData.Add(value == DBNull.Value ? null : value);
}
WeekCountList.Add(currentTableData);
}
// 合并123批
List<List<int>> WeekMergeList = new List<List<int>>();
foreach (List<object> subList in WeekCountList)
{
List<int> processed = new List<int>();
// 计算前三个有效数字的和(自动跳过null值)
int sum = subList.Take(3)
.Where(x => x != null)
.Sum(x => Convert.ToInt32(x));
processed.Add(sum);
// 添加后续元素(自动转换并跳过null)
processed.AddRange(subList.Skip(3)
.Where(x => x != null)
.Select(x => Convert.ToInt32(x)));
WeekMergeList.Add(processed);
}
List<List<double>> WeekRatioList = new List<List<double>>();
foreach (List<int> subList in WeekMergeList)
{
// 提取合格数和不合格数
int qualified = subList[0];
int unqualified = subList[1];
// 计算总数(带防零处理)
int total = qualified + unqualified;
if (total == 0)
{
WeekRatioList.Add(new List<double> { 0.0, 0.0 });
continue;
}
// 计算比率(保留两位小数)
double qualifiedRate = Math.Round(qualified * 1.00 / total, 2);
double unqualifiedRate = Math.Round(unqualified * 1.00 / total, 2);
// 比率平衡处理(确保总和为100%)
if (qualifiedRate + unqualifiedRate != 1.00)
{
qualifiedRate = 1.00 - unqualifiedRate;
}
WeekRatioList.Add(new List<double> { qualifiedRate, unqualifiedRate });
}
#endregion
// 今天的 ISO周
string TODAY = CustomWeekFormatter.GetCustomWeek(baseDate);
// 前周五的 ISO周
List<string> preFriWeek = new List<string>();
foreach (string weekdate in PreviousFridayList)
{
preFriWeek.Add(CustomWeekFormatter.ConvertYyyyMmDdToWeek(weekdate));
}
// 前周五的下周四 ISO周
List<string> preNextThuWeek = new List<string>();
foreach (string weekdate in FriNextThursdayList)
{
preNextThuWeek.Add(CustomWeekFormatter.ConvertYyyyMmDdToWeek(weekdate));
}
// 合成新 DT表
DataTable WeekRatioOverviewTable = new DataTable("QualityStats");
WeekRatioOverviewTable.Columns.Add("Date", typeof(string));
WeekRatioOverviewTable.Columns.Add("Qualified", typeof(int));
WeekRatioOverviewTable.Columns.Add("Unqualified", typeof(int));
WeekRatioOverviewTable.Columns.Add("PassRate", typeof(double));
WeekRatioOverviewTable.Columns.Add("FailureRate", typeof(double));
// 检查列表长度是否一致
if (preFriWeek.Count != WeekMergeList.Count || WeekMergeList.Count != WeekRatioList.Count)
{
throw new ArgumentException("所有列表长度必须相同");
}
// 合并数据到DataTable
for (int i = 0; i < preFriWeek.Count; i++)
{
DataRow newRow = WeekRatioOverviewTable.NewRow();
newRow["Date"] = preFriWeek[i];
newRow["Qualified"] = WeekMergeList[i][0]; // 合格数
newRow["Unqualified"] = WeekMergeList[i][1]; // 不合格数
newRow["PassRate"] = WeekRatioList[i][0]; // 合格率
newRow["FailureRate"] = WeekRatioList[i][1]; // 不合格率
WeekRatioOverviewTable.Rows.Add(newRow);
}
//// 周绑定数据
//chartControl2.DataSource = WeekRatioOverviewTable;
//chartControl2.Series[0].ArgumentDataMember = "Date";
//chartControl2.Series[0].ValueDataMembers[0] = "Qualified";
//chartControl2.Series[1].ArgumentDataMember = "Date";
//chartControl2.Series[1].ValueDataMembers[0] = "UnQualified";
//chartControl2.Series[2].ArgumentDataMember = "Date";
//chartControl2.Series[2].ValueDataMembers[0] = "PassRate";
//chartControl2.Series[3].ArgumentDataMember = "Date";
//chartControl2.Series[3].ValueDataMembers[0] = "FailureRate";
//
// 单机台月平均
//
// 遍历 周 Ratio dt Count列
List<List<object>> MonthCountList = new List<List<object>>();
foreach (DataTable dt in MonthRatioDtList)
{
// 验证列存在性
if (!dt.Columns.Contains("Count")) continue;
// 创建当前表的存储列表
List<object> currentTableData = new List<object>();
// 遍历行并提取数据
foreach (DataRow row in dt.Rows)
{
object value = row["Count"];
currentTableData.Add(value == DBNull.Value ? null : value);
}
MonthCountList.Add(currentTableData);
}
// 合并123批
List<List<int>> MonthMergeList = new List<List<int>>();
foreach (List<object> subList in MonthCountList)
{
List<int> processed = new List<int>();
// 计算前三个有效数字的和(自动跳过null值)
int sum = subList.Take(3)
.Where(x => x != null)
.Sum(x => Convert.ToInt32(x));
processed.Add(sum);
// 添加后续元素(自动转换并跳过null)
processed.AddRange(subList.Skip(3)
.Where(x => x != null)
.Select(x => Convert.ToInt32(x)));
MonthMergeList.Add(processed);
}
List<List<double>> MonthRatioList = new List<List<double>>();
foreach (List<int> subList in MonthMergeList)
{
// 提取合格数和不合格数
int qualified = subList[0];
int unqualified = subList[1];
// 计算总数(带防零处理)
int total = qualified + unqualified;
if (total == 0)
{
MonthRatioList.Add(new List<double> { 0.0, 0.0 });
continue;
}
// 计算比率(保留两位小数)
double qualifiedRate = Math.Round(qualified * 1.00 / total, 2);
double unqualifiedRate = Math.Round(unqualified * 1.00 / total, 2);
// 比率平衡处理(确保总和为100%)
if (qualifiedRate + unqualifiedRate != 1.00)
{
qualifiedRate = 1.00 - unqualifiedRate;
}
MonthRatioList.Add(new List<double> { qualifiedRate, unqualifiedRate });
}
// 截取操作:从索引2开始取4位(yyMM)
List<string> preMonth = MonthStartList
.Select(s => s.Substring(2, 4))
.ToList();
// 合成新 DT表
DataTable MonthRatioOverviewTable = new DataTable("QualityStats");
MonthRatioOverviewTable.Columns.Add("Date", typeof(string));
MonthRatioOverviewTable.Columns.Add("Qualified", typeof(int));
MonthRatioOverviewTable.Columns.Add("Unqualified", typeof(int));
MonthRatioOverviewTable.Columns.Add("PassRate", typeof(double));
MonthRatioOverviewTable.Columns.Add("FailureRate", typeof(double));
// 检查列表长度是否一致
if (preMonth.Count != MonthMergeList.Count || MonthMergeList.Count != MonthRatioList.Count)
{
throw new ArgumentException("所有列表长度必须相同");
}
// 合并数据到DataTable
for (int i = 0; i < preMonth.Count; i++)
{
DataRow newRow = MonthRatioOverviewTable.NewRow();
newRow["Date"] = preMonth[i];
newRow["Qualified"] = MonthMergeList[i][0]; // 合格数
newRow["Unqualified"] = MonthMergeList[i][1]; // 不合格数
newRow["PassRate"] = MonthRatioList[i][0]; // 合格率
newRow["FailureRate"] = MonthRatioList[i][1]; // 不合格率
MonthRatioOverviewTable.Rows.Add(newRow);
}
//
//
//
// 单机台天平均
//
// 遍历 周 Ratio dt Count列
List<List<object>> DayCountList = new List<List<object>>();
foreach (DataTable dt in DayRatioDtList)
{
// 验证列存在性
if (!dt.Columns.Contains("Count")) continue;
// 创建当前表的存储列表
List<object> currentTableData = new List<object>();
// 遍历行并提取数据
foreach (DataRow row in dt.Rows)
{
object value = row["Count"];
currentTableData.Add(value == DBNull.Value ? null : value);
}
DayCountList.Add(currentTableData);
}
// 合并123批
List<List<int>> DayMergeList = new List<List<int>>();
foreach (List<object> subList in DayCountList)
{
List<int> processed = new List<int>();
// 计算前三个有效数字的和(自动跳过null值)
int sum = subList.Take(3)
.Where(x => x != null)
.Sum(x => Convert.ToInt32(x));
processed.Add(sum);
// 添加后续元素(自动转换并跳过null)
processed.AddRange(subList.Skip(3)
.Where(x => x != null)
.Select(x => Convert.ToInt32(x)));
DayMergeList.Add(processed);
}
List<List<double>> DayRatioList = new List<List<double>>();
foreach (List<int> subList in DayMergeList)
{
// 提取合格数和不合格数
int qualified = subList[0];
int unqualified = subList[1];
// 计算总数(带防零处理)
int total = qualified + unqualified;
if (total == 0)
{
DayRatioList.Add(new List<double> { 0.0, 0.0 });
continue;
}
// 计算比率(保留两位小数)
double qualifiedRate = Math.Round(qualified * 1.00 / total, 2);
double unqualifiedRate = Math.Round(unqualified * 1.00 / total, 2);
// 比率平衡处理(确保总和为100%)
if (qualifiedRate + unqualifiedRate != 1.00)
{
qualifiedRate = 1.00 - unqualifiedRate;
}
DayRatioList.Add(new List<double> { qualifiedRate, unqualifiedRate });
}
// 截取操作:从索引2开始取4位(yyMM)
List<string> preDay = PreviousDayList;
//.Select(s => s.Substring(2, 4))
//.ToList();
// 合成新 DT表
DataTable DayRatioOverviewTable = new DataTable("QualityStats");
DayRatioOverviewTable.Columns.Add("Date", typeof(string));
DayRatioOverviewTable.Columns.Add("Qualified", typeof(int));
DayRatioOverviewTable.Columns.Add("Unqualified", typeof(int));
DayRatioOverviewTable.Columns.Add("PassRate", typeof(double));
DayRatioOverviewTable.Columns.Add("FailureRate", typeof(double));
// 检查列表长度是否一致
if (preDay.Count != DayMergeList.Count || DayMergeList.Count != DayRatioList.Count)
{
throw new ArgumentException("所有列表长度必须相同");
}
// 合并数据到DataTable
for (int i = 0; i < preDay.Count; i++)
{
DataRow newRow = DayRatioOverviewTable.NewRow();
newRow["Date"] = preDay[i];
newRow["Qualified"] = DayMergeList[i][0]; // 合格数
newRow["Unqualified"] = DayMergeList[i][1]; // 不合格数
newRow["PassRate"] = DayRatioList[i][0]; // 合格率
newRow["FailureRate"] = DayRatioList[i][1]; // 不合格率
DayRatioOverviewTable.Rows.Add(newRow);
}
// 合并 DataTable 并添加分隔符
DataTable mergedTable = MergeDataTablesWithSeparator(MonthRatioOverviewTable, WeekRatioOverviewTable, DayRatioOverviewTable);
// 绑定数据
chartControl2.DataSource = mergedTable;
chartControl2.Series[0].ArgumentDataMember = "Date";
chartControl2.Series[0].ValueDataMembers[0] = "Qualified";
chartControl2.Series[1].ArgumentDataMember = "Date";
chartControl2.Series[1].ValueDataMembers[0] = "UnQualified";
chartControl2.Series[2].ArgumentDataMember = "Date";
chartControl2.Series[2].ValueDataMembers[0] = "PassRate";
chartControl2.Series[3].ArgumentDataMember = "Date";
chartControl2.Series[3].ValueDataMembers[0] = "FailureRate";
}
优化这部分代码,减少行数提升可读性,并提高效率