SVN r863
SVN-Revision: r863
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user