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