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;
}
+
///
/// 构建带日期的数据源
///