SVN r863
SVN-Revision: r863
This commit is contained in:
@@ -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"]);
|
||||
string colName = dayValue.ToString("yyyy-MM-dd");
|
||||
if (dayRow["day"] == DBNull.Value) continue;
|
||||
|
||||
// 检查日期是否在范围内,并且列存在
|
||||
if (dayValue >= startDate && dayValue <= endDate && dataMain.Columns.Contains(colName))
|
||||
{
|
||||
decimal.TryParse(dayRow["amount"] + "", out decimal amountValue);
|
||||
var dayValue = Convert.ToDateTime(dayRow["day"]);
|
||||
if (dayValue < startDate || dayValue >= endDate) continue; // 改成 < endDate
|
||||
|
||||
// 如果日期已存在,则累加金额;否则直接赋值
|
||||
if (dataMap[key].ContainsKey(colName))
|
||||
{
|
||||
dataMap[key][colName] += amountValue; // 累加金额
|
||||
}
|
||||
else
|
||||
{
|
||||
dataMap[key][colName] = amountValue; // 直接赋值
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
string colName = dayValue.ToString("yyyy-MM-dd");
|
||||
decimal.TryParse(dayRow["amount"] + "", out var amount);
|
||||
|
||||
if (dataMap[key].ContainsKey(colName))
|
||||
dataMap[key][colName] += amount;
|
||||
else
|
||||
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))
|
||||
var weekSumMap = new Dictionary<string, decimal>();
|
||||
for (DateTime dt = weekStart; dt <= weekEnd && dt < endDate; dt = dt.AddDays(1))
|
||||
{
|
||||
string colName = dt.ToString("yyyy-MM-dd"); // 使用 yyyy-MM-dd 格式
|
||||
if (dataMain.Columns.Contains(colName))
|
||||
string col = dt.ToString("yyyy-MM-dd");
|
||||
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.ContainsKey(key) && dataMap[key].ContainsKey(colName))
|
||||
{
|
||||
// 累加数据并更新 weekSumMap
|
||||
if (!weekSumMap.ContainsKey(key))
|
||||
{
|
||||
weekSumMap[key] = 0;
|
||||
}
|
||||
weekSumMap[key] += dataMap[key][colName]; // 累加当前列的数据
|
||||
}
|
||||
}
|
||||
string key = row[topPrimaryKey].ToString();
|
||||
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"] = 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.AcceptChanges();
|
||||
return dataMain;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 数据值改变时
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user