SVN-Revision: r863
This commit is contained in:
tdx
2025-07-16 10:05:36 +00:00
parent 49be28c88d
commit 01630a951c
+73 -110
View File
@@ -1937,178 +1937,141 @@ namespace Lskj.ProductiSched
/// <param name="dataDayPlan"></param> /// <param name="dataDayPlan"></param>
/// <param name="startDate"></param> /// <param name="startDate"></param>
/// <returns></returns> /// <returns></returns>
private DataTable MergeMainDataWithDayPlan(DataTable dataMain, DataTable dataDayPlan, DateTime startDate, string typeDate = "0") private DataTable MergeMainDataWithDayPlan(
DataTable dataMain,
DataTable dataDayPlan,
DateTime startDate,
string typeDate = "0")
{ {
string rightPrimaryKey = DataModel.RightModuleModel.ParmaryKey; string rightPrimaryKey = DataModel.RightModuleModel.ParmaryKey;
string topPrimaryKey = "keyvalue";// DataModel.TopModuleModel.ParmaryKey; string topPrimaryKey = "keyvalue"; // DataModel.TopModuleModel.ParmaryKey;
DateTime endDate = startDate.AddMonths(3).AddDays(-1); // 计算结束日期
// **1. 预索引 dataDayPlan 数据(billdocument_id -> 该 key 相关的所有行)** // 结束日期 = 开始日期 + 3 个月(不包含该日)
Dictionary<string, List<DataRow>> dayPlanMap = new Dictionary<string, List<DataRow>>(); DateTime endDate = startDate.AddMonths(3);
/* ---------- 1. 预索引 dataDayPlan ---------- */
var dayPlanMap = new Dictionary<string, List<DataRow>>();
foreach (DataRow row in dataDayPlan.Rows) foreach (DataRow row in dataDayPlan.Rows)
{ {
string billId = row[rightPrimaryKey].ToString(); string billId = row[rightPrimaryKey].ToString();
if (!dayPlanMap.ContainsKey(billId)) if (!dayPlanMap.TryGetValue(billId, out var list))
{ {
dayPlanMap[billId] = new List<DataRow>(); list = new List<DataRow>();
dayPlanMap[billId] = list;
} }
dayPlanMap[billId].Add(row); list.Add(row);
} }
/* ---------- 2. 预构建主数据列 ---------- */
// **2. 预构建主数据的列** for (DateTime dt = startDate; dt < endDate; dt = dt.AddDays(1))
for (DateTime dt = startDate; dt <= endDate; dt = dt.AddDays(1))
{ {
string colName = dt.ToString("yyyy-MM-dd"); string colName = dt.ToString("yyyy-MM-dd");
if (!dataMain.Columns.Contains(colName)) if (!dataMain.Columns.Contains(colName))
{ dataMain.Columns.Add(colName, typeof(decimal));
dataMain.Columns.Add(colName, typeof(decimal)); // 确保列存在
}
} }
// **3. 预构建数据填充映射表** /* ---------- 3. 填充映射表 ---------- */
Dictionary<string, Dictionary<string, decimal>> dataMap = new Dictionary<string, Dictionary<string, decimal>>(); var dataMap = new Dictionary<string, Dictionary<string, decimal>>();
foreach (DataRow row in dataMain.Rows) foreach (DataRow row in dataMain.Rows)
{ {
string key = row[topPrimaryKey].ToString(); string key = row[topPrimaryKey].ToString();
if (!dataMap.ContainsKey(key)) if (!dataMap.ContainsKey(key))
{
dataMap[key] = new Dictionary<string, decimal>(); dataMap[key] = new Dictionary<string, decimal>();
}
// **查找 key 关联的时间数据** if (!dayPlanMap.TryGetValue(key, out var plans)) continue;
if (dayPlanMap.ContainsKey(key))
foreach (var dayRow in plans)
{ {
foreach (DataRow dayRow in dayPlanMap[key]) if (dayRow["day"] == DBNull.Value) continue;
{
if (dayRow["day"] != DBNull.Value)
{
DateTime dayValue = Convert.ToDateTime(dayRow["day"]);
string colName = dayValue.ToString("yyyy-MM-dd");
// 检查日期是否在范围内,并且列存在 var dayValue = Convert.ToDateTime(dayRow["day"]);
if (dayValue >= startDate && dayValue <= endDate && dataMain.Columns.Contains(colName)) if (dayValue < startDate || dayValue >= endDate) continue; // 改成 < endDate
{
decimal.TryParse(dayRow["amount"] + "", out decimal amountValue);
// 如果日期已存在,则累加金额;否则直接赋值 string colName = dayValue.ToString("yyyy-MM-dd");
if (dataMap[key].ContainsKey(colName)) decimal.TryParse(dayRow["amount"] + "", out var amount);
{
dataMap[key][colName] += amountValue; // 累加金额 if (dataMap[key].ContainsKey(colName))
} dataMap[key][colName] += amount;
else else
{ dataMap[key][colName] = amount;
dataMap[key][colName] = amountValue; // 直接赋值
}
}
}
}
} }
} }
// **4. 如果有报告(HasReport 为 true)且 typeDate "1",合并同一周的数据** /* ---------- 4. 周报合并(仅当 HasReport && typeDate == "1" ---------- */
if (DataModel.TopModuleModel.HasReport && typeDate == "1") if (DataModel.TopModuleModel.HasReport && typeDate == "1")
{ {
int weekIndex = 0; int weekIndex = 0;
DateTime tempStartDate = startDate; DateTime weekStart = startDate;
while (tempStartDate <= endDate && weekIndex < 15) while (weekStart < endDate && weekIndex < 15)
{ {
DateTime weekEnd = tempStartDate.AddDays(6); // 计算本周的周日 DateTime weekEnd = weekStart.AddDays(6);
// 为每个 key 存储合并的数据 var weekSumMap = new Dictionary<string, decimal>();
Dictionary<string, decimal> weekSumMap = new Dictionary<string, decimal>(); for (DateTime dt = weekStart; dt <= weekEnd && dt < endDate; dt = dt.AddDays(1))
// 查找当前周的所有列(如 03-01, 03-02, ...
string weekColumnPrefix = $"{tempStartDate:yyyy-MM-dd}";
// 对每一天的列进行累加,合并到这一周的第一天
for (DateTime dt = tempStartDate; dt <= weekEnd && dt <= endDate; dt = dt.AddDays(1))
{ {
string colName = dt.ToString("yyyy-MM-dd"); // 使用 yyyy-MM-dd 格式 string col = dt.ToString("yyyy-MM-dd");
if (dataMain.Columns.Contains(colName)) if (!dataMain.Columns.Contains(col)) continue;
foreach (DataRow row in dataMain.Rows)
{ {
foreach (DataRow row in dataMain.Rows) string key = row[topPrimaryKey].ToString();
{ if (dataMap.TryGetValue(key, out var map) && map.TryGetValue(col, out var v))
string key = row[topPrimaryKey].ToString(); weekSumMap[key] = weekSumMap.TryGetValue(key, out var x) ? x + v : v;
if (dataMap.ContainsKey(key) && dataMap[key].ContainsKey(colName))
{
// 累加数据并更新 weekSumMap
if (!weekSumMap.ContainsKey(key))
{
weekSumMap[key] = 0;
}
weekSumMap[key] += dataMap[key][colName]; // 累加当前列的数据
}
}
} }
} }
// 将合并的数据写入到周一(即第一天)的列 string firstDayCol = weekStart.ToString("yyyy-MM-dd");
string firstDayCol = tempStartDate.ToString("yyyy-MM-dd"); // 使用 yyyy-MM-dd 格式
// 为每个 key 更新其对应的合并数据
foreach (DataRow row in dataMain.Rows) foreach (DataRow row in dataMain.Rows)
{ {
string key = row[topPrimaryKey].ToString(); string key = row[topPrimaryKey].ToString();
if (weekSumMap.ContainsKey(key)) if (weekSumMap.TryGetValue(key, out var sum))
{ row[firstDayCol] = sum;
row[firstDayCol] = weekSumMap[key]; // 设置周一的值为合并后的总和
}
} }
// 隐藏其他非周一的列 for (DateTime dt = weekStart.AddDays(1); dt <= weekEnd && dt < endDate; dt = dt.AddDays(1))
for (DateTime dt = tempStartDate.AddDays(1); dt <= weekEnd && dt <= endDate; dt = dt.AddDays(1))
{ {
string colName = dt.ToString("yyyy-MM-dd"); // 使用 yyyy-MM-dd 格式 string col = dt.ToString("yyyy-MM-dd");
if (dataMain.Columns.Contains(colName)) if (dataMain.Columns.Contains(col))
{ dataMain.Columns[col].ColumnMapping = MappingType.Hidden;
dataMain.Columns[colName].ColumnMapping = MappingType.Hidden; // 将非周一列隐藏
}
} }
// 更新到下一周 weekStart = weekEnd.AddDays(1);
tempStartDate = weekEnd.AddDays(1); // 下一周的周一
weekIndex++; weekIndex++;
} }
} }
// **5. 一次性填充 DataTable(避免逐行赋值带来的性能问题)** /* ---------- 5. 一次性写入 DataTable ---------- */
bandGcTop.rowDateValues.Clear(); bandGcTop.rowDateValues.Clear();
if (!dataMain.Columns.Contains("PrecomputedMaxDate")) if (!dataMain.Columns.Contains("PrecomputedMaxDate"))
{
dataMain.Columns.Add("PrecomputedMaxDate", typeof(string)); dataMain.Columns.Add("PrecomputedMaxDate", typeof(string));
}
for (int rowIndex = 0; rowIndex < dataMain.Rows.Count; rowIndex++) for (int i = 0; i < dataMain.Rows.Count; i++)
{ {
DataRow row = dataMain.Rows[rowIndex]; var row = dataMain.Rows[i];
List<DateTime> validDateColumns = new List<DateTime>(); bandGcTop.rowDateValues[i] = new List<DateTime>();
bandGcTop.rowDateValues[rowIndex] = validDateColumns;
string key = row[topPrimaryKey].ToString(); string key = row[topPrimaryKey].ToString();
if (dataMap.ContainsKey(key)) if (!dataMap.TryGetValue(key, out var map)) continue;
foreach (var kvp in map)
{ {
foreach (var col in dataMap[key]) row[kvp.Key] = kvp.Value;
{
DataColumn column = row.Table.Columns[col.Key]; if (DateTime.TryParse(kvp.Key, out var d))
var cellValue = col.Value; bandGcTop.rowDateValues[i].Add(d);
row[column] = cellValue;
// 检查列可解析为日期格式
if (DateTime.TryParse(column.ToString(), out DateTime newDate))
{
if (!validDateColumns.Contains(newDate))
{
validDateColumns.Add(newDate);
}
}
}
} }
// 赋值操作,确保为字符串格式
row["PrecomputedMaxDate"] = validDateColumns.Count > 0 ? validDateColumns.Max().ToString("yyyy-MM-dd") : ""; row["PrecomputedMaxDate"] = bandGcTop.rowDateValues[i].Any()
? bandGcTop.rowDateValues[i].Max().ToString("yyyy-MM-dd")
: "";
} }
dataMain.ColumnChanged += OnDataMainColumnChanged; dataMain.ColumnChanged += OnDataMainColumnChanged;
dataMain.AcceptChanges(); dataMain.AcceptChanges();
return dataMain; return dataMain;
} }
/// <summary> /// <summary>
/// 数据值改变时 /// 数据值改变时
/// </summary> /// </summary>