From c4ea33a08e246a71660c04f056d7851050c77f85 Mon Sep 17 00:00:00 2001 From: tdx Date: Fri, 23 May 2025 07:13:55 +0000 Subject: [PATCH] SVN r634 SVN-Revision: r634 --- 插件库/Lskj.PubBill/BillModule.cs | 112 +++++++++++++++++------------- 1 file changed, 63 insertions(+), 49 deletions(-) diff --git a/插件库/Lskj.PubBill/BillModule.cs b/插件库/Lskj.PubBill/BillModule.cs index de2cd9f..f179fc5 100644 --- a/插件库/Lskj.PubBill/BillModule.cs +++ b/插件库/Lskj.PubBill/BillModule.cs @@ -1228,6 +1228,7 @@ namespace Lskj.PubBill gridColumn.Visible = false; } } + } finally { @@ -5428,80 +5429,93 @@ namespace Lskj.PubBill } /// - /// 构建带日期的数据源 + /// 计划明细与主数据合并: + /// 1) 按 起算 7 天动态生成列; + /// 2) 把 dataDayPlan 中对应日期的 amount 值填入主表; + /// 3) 计算行级合计写入 “heji” 列。 /// - /// - /// - /// - /// - private DataTable MergeMainDataWithDayPlan(DataTable dataMain, DataTable dataDayPlan, DateTime startDate) + private DataTable MergeMainDataWithDayPlan( + DataTable dataMain, + DataTable dataDayPlan, + DateTime startDate) { - string rightPrimaryKey = "billdocument_id"; - string dateField = "showday"; - string amountField = "amount"; - string topPrimaryKey = BillModel.DetailUUIDKey; - DateTime endDate = startDate.AddDays(7); // 计算结束日期 - // **1. 预索引 dataDayPlan 数据(billdocument_id -> 该 key 相关的所有行)** - Dictionary> dayPlanMap = new Dictionary>(); + const string rightPrimaryKey = "billdocument_id"; // dataDayPlan 主键 + const string dateField = "showday"; + const string amountField = "amount"; + string topPrimaryKey = BillModel.DetailUUIDKey; // dataMain 主键 + + DateTime endDate = startDate.AddDays(7); + + // ---------- 1. 预索引 dataDayPlan:billdocument_id -> List ---------- + var dayPlanMap = new Dictionary>(); 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(); + list = new List(); + dayPlanMap[billId] = list; } - dayPlanMap[billId].Add(row); + list.Add(row); } - // **2. 预构建主数据的列** - for (DateTime dt = startDate; dt <= endDate; dt = dt.AddDays(1)) + + // ---------- 2. 为主表添加日期列和合计列 ---------- + for (DateTime d = startDate; d <= endDate; d = d.AddDays(1)) { - string colName = dt.ToString("yyyy-MM-dd"); + string colName = d.ToString("yyyy-MM-dd"); if (!dataMain.Columns.Contains(colName)) - { - dataMain.Columns.Add(colName, typeof(decimal)); // 确保列存在 - } + dataMain.Columns.Add(colName, typeof(decimal)); } - // **3. 预构建数据填充映射表** - Dictionary> dataMap = new Dictionary>(); - foreach (DataRow row in dataMain.Rows) + if (!dataMain.Columns.Contains("heji")) + dataMain.Columns.Add("heji", typeof(decimal)); + + // ---------- 3. 预构建填充映射:主键 -> (日期列名, 金额) ---------- + var dataMap = new Dictionary>(); + foreach (DataRow mainRow in dataMain.Rows) { - string key = row[topPrimaryKey].ToString(); - if (!dataMap.ContainsKey(key)) + string key = mainRow[topPrimaryKey].ToString(); + var inner = new Dictionary(); + dataMap[key] = inner; + + if (dayPlanMap.TryGetValue(key, out var rows)) { - dataMap[key] = new Dictionary(); - } - // **查找 key 关联的时间数据** - if (dayPlanMap.ContainsKey(key)) - { - foreach (DataRow dayRow in dayPlanMap[key]) + foreach (DataRow dayRow in rows) { - if (dayRow[dateField] != DBNull.Value) - { - DateTime dayValue = Convert.ToDateTime(dayRow[dateField]); - string colName = dayValue.ToString("yyyy-MM-dd"); - if (dayValue >= startDate && dayValue <= endDate && dataMain.Columns.Contains(colName)) - { - decimal.TryParse(dayRow[amountField] + "", out decimal amountValue); - dataMap[key][colName] = amountValue; - } - } + if (dayRow[dateField] == DBNull.Value) continue; + + DateTime d = Convert.ToDateTime(dayRow[dateField]); + if (d < startDate || d > endDate) continue; + + string col = d.ToString("yyyy-MM-dd"); + if (!dataMain.Columns.Contains(col)) continue; + + if (decimal.TryParse(dayRow[amountField]?.ToString(), out decimal amt)) + inner[col] = amt; } } } - // **4. 一次性填充 DataTable(避免逐行赋值带来的性能问题)** - foreach (DataRow row in dataMain.Rows) + + // ---------- 4. 一次性填充并计算行合计 ---------- + foreach (DataRow mainRow in dataMain.Rows) { - string key = row[topPrimaryKey].ToString(); - if (dataMap.ContainsKey(key)) + string key = mainRow[topPrimaryKey].ToString(); + decimal rowSum = 0m; + + if (dataMap.TryGetValue(key, out var inner)) { - foreach (var col in dataMap[key]) + foreach (var kv in inner) { - row[col.Key] = col.Value; + mainRow[kv.Key] = kv.Value; + rowSum += kv.Value; } } + + mainRow["heji"] = rowSum; // 行汇总 } + return dataMain; } + /// /// 构建带日期的数据源 ///