SVN-Revision: r640
This commit is contained in:
wyf
2025-05-23 08:09:27 +00:00
parent b733cfbf02
commit 656a2779be
@@ -88,6 +88,10 @@ namespace Lskj.PubAccraditation
/// 主表动态生成的日期列 /// 主表动态生成的日期列
/// </summary> /// </summary>
public List<GridColumn> DateColumnList = new List<GridColumn>(); public List<GridColumn> DateColumnList = new List<GridColumn>();
/// <summary>
/// 主表动态生成的合计列
/// </summary>
public GridColumn SumGridColumn = new GridColumn();
#region #region
/// <summary> /// <summary>
/// id(推送记录) /// id(推送记录)
@@ -1165,26 +1169,36 @@ namespace Lskj.PubAccraditation
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void OnDataFileRefrshFile(object sender, EventArgs e) private void OnDataFileRefrshFile(object sender, EventArgs e)
{
BaseUserControl baseControl = (sender as System.Windows.Forms.Control).ToBaseUserControl();
if (baseControl is LabelDateEdit labelDateEdit)
{
DateTime dateTime = labelDateEdit.TextEdit.DateTime;
if (DateColumnList.Count == 0)
{ {
AddDataColumns(); AddDataColumns();
} UpdateDynamicColumns();
UpdateDynamicColumns(dateTime);
OnGcMainDataSourceChanged(gridBillInfo.GridView, null);//手动刷新日期合计数据源 OnGcMainDataSourceChanged(gridBillInfo.GridView, null);//手动刷新日期合计数据源
} }
}
private void AddDataColumns() private void AddDataColumns()
{ {
foreach (GridColumn gridColumn in gridBillInfo.GridView.Columns) foreach (GridColumn gridColumn in gridBillInfo.GridView.Columns)
{ {
gridColumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left; gridColumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left;
} }
for (int i = 0; i < 7; i++) int dayCount = 0;
BaseUserControl baseUserControl = ControlObj.FindControl("bom_rdm_tianshu");
if (baseUserControl != null)
{
int.TryParse(baseUserControl.EditText, out dayCount);
}
if (dayCount <= 0)
{
dayCount = 7;
}
if (DateColumnList.Count != dayCount)
{
foreach (GridColumn item in DateColumnList)
{
gridBillInfo.GridView.Columns.Remove(item);
}
gridBillInfo.GridView.Columns.Remove(SumGridColumn);
DateColumnList.Clear();
for (int i = 0; i < dayCount; i++)
{ {
GridColumn gridColumn = new GridColumn(); GridColumn gridColumn = new GridColumn();
gridColumn.AppearanceCell.Options.UseTextOptions = true; gridColumn.AppearanceCell.Options.UseTextOptions = true;
@@ -1200,21 +1214,60 @@ namespace Lskj.PubAccraditation
gridColumn.Width = 70; gridColumn.Width = 70;
gridColumn.DisplayFormat.FormatType = FormatType.Numeric; gridColumn.DisplayFormat.FormatType = FormatType.Numeric;
gridColumn.DisplayFormat.FormatString = "{0:#,##0.####}"; gridColumn.DisplayFormat.FormatString = "{0:#,##0.####}";
gridColumn.Visible = false; gridColumn.Visible = true;
gridColumn.SummaryItem.SummaryType = SummaryItemType.Sum; gridColumn.SummaryItem.SummaryType = SummaryItemType.Sum;
gridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}"; gridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}";
gridBillInfo.GridView.Columns.Add(gridColumn); gridBillInfo.GridView.Columns.Add(gridColumn);
DateColumnList.Add(gridColumn); DateColumnList.Add(gridColumn);
} }
GridColumn sumGridColumn = new GridColumn();
sumGridColumn.AppearanceCell.Options.UseTextOptions = true;
sumGridColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center;
sumGridColumn.AppearanceHeader.Options.UseTextOptions = true;
sumGridColumn.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center;
sumGridColumn.OptionsColumn.AllowEdit = false;
sumGridColumn.OptionsColumn.AllowMove = false;
sumGridColumn.OptionsColumn.AllowSize = false;
sumGridColumn.OptionsFilter.AllowFilter = false;
sumGridColumn.OptionsColumn.AllowMerge = DefaultBoolean.False;
sumGridColumn.OptionsColumn.AllowSort = DefaultBoolean.False;
sumGridColumn.FieldName = $"workingsum";
sumGridColumn.Caption = $"工时合计";
sumGridColumn.Width = 70;
sumGridColumn.DisplayFormat.FormatType = FormatType.Numeric;
sumGridColumn.DisplayFormat.FormatString = "{0:#,##0.####}";
sumGridColumn.Visible = true;
sumGridColumn.SummaryItem.SummaryType = SummaryItemType.Sum;
sumGridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}";
SumGridColumn = sumGridColumn;
gridBillInfo.GridView.Columns.Add(sumGridColumn);
}
} }
/// <summary> /// <summary>
/// 根据日期修改列状态 /// 根据日期修改列状态
/// </summary> /// </summary>
/// <param name="currentDate"></param> /// <param name="currentDate"></param>
private void UpdateDynamicColumns(DateTime currentDate) private void UpdateDynamicColumns()
{ {
DateTime endDate = currentDate.AddDays(7); DateTime currentDate = DateTime.Now;
BaseUserControl dateUserControl = ControlObj.FindControl("bom_rdm_ksdt");
if (dateUserControl is LabelDateEdit labelDateEdit)
{
currentDate = labelDateEdit.TextEdit.DateTime;
}
int dayCount = 0;
BaseUserControl baseUserControl = ControlObj.FindControl("bom_rdm_tianshu");
if (baseUserControl != null)
{
int.TryParse(baseUserControl.EditText, out dayCount);
}
if (dayCount <= 0)
{
dayCount = 7;
}
DateTime endDate = currentDate.AddDays(dayCount);
gridBillInfo.GridView.BeginUpdate(); gridBillInfo.GridView.BeginUpdate();
try try
{ {
@@ -1235,6 +1288,7 @@ namespace Lskj.PubAccraditation
gridColumn.Visible = false; gridColumn.Visible = false;
} }
} }
} }
finally finally
{ {
@@ -1310,66 +1364,86 @@ namespace Lskj.PubAccraditation
string dateField = "showday"; string dateField = "showday";
string amountField = "amount"; string amountField = "amount";
string topPrimaryKey = BillModelObj.DetailUUIDKey; string topPrimaryKey = BillModelObj.DetailUUIDKey;
DateTime endDate = startDate.AddDays(7); // 计算结束日期 int dayCount = 0;
// **1. 预索引 dataDayPlan 数据(billdocument_id -> 该 key 相关的所有行)**
Dictionary<string, List<DataRow>> dayPlanMap = new Dictionary<string, List<DataRow>>(); BaseUserControl baseUserControl = ControlObj.FindControl("bom_rdm_tianshu");
if (baseUserControl != null)
{
int.TryParse(baseUserControl.EditText, out dayCount);
}
if (dayCount <= 0)
{
dayCount = 7;
}
DateTime endDate = startDate.AddDays(dayCount);
// ---------- 1. 预索引 dataDayPlanbilldocument_id -> List<DataRow> ----------
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. 预构建主数据的列**
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)) if (!dataMain.Columns.Contains(colName))
dataMain.Columns.Add(colName, typeof(decimal));
}
if (!dataMain.Columns.Contains("workingsum"))
dataMain.Columns.Add("workingsum", typeof(decimal));
// ---------- 3. 预构建填充映射:主键 -> (日期列名, 金额) ----------
var dataMap = new Dictionary<string, Dictionary<string, decimal>>();
foreach (DataRow mainRow in dataMain.Rows)
{ {
dataMain.Columns.Add(colName, typeof(decimal)); // 确保列存在 string key = mainRow[topPrimaryKey].ToString();
} var inner = new Dictionary<string, decimal>();
} dataMap[key] = inner;
// **3. 预构建数据填充映射表**
Dictionary<string, Dictionary<string, decimal>> dataMap = new Dictionary<string, Dictionary<string, decimal>>(); if (dayPlanMap.TryGetValue(key, out var rows))
foreach (DataRow row in dataMain.Rows)
{ {
string key = row[topPrimaryKey].ToString(); foreach (DataRow dayRow in rows)
if (!dataMap.ContainsKey(key))
{ {
dataMap[key] = new Dictionary<string, decimal>(); 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;
} }
// **查找 key 关联的时间数据** }
if (dayPlanMap.ContainsKey(key)) }
// ---------- 4. 一次性填充并计算行合计 ----------
foreach (DataRow mainRow in dataMain.Rows)
{ {
foreach (DataRow dayRow in dayPlanMap[key]) string key = mainRow[topPrimaryKey].ToString();
decimal rowSum = 0m;
if (dataMap.TryGetValue(key, out var inner))
{ {
if (dayRow[dateField] != DBNull.Value) foreach (var kv in inner)
{ {
DateTime dayValue = Convert.ToDateTime(dayRow[dateField]); mainRow[kv.Key] = kv.Value;
string colName = dayValue.ToString("yyyy-MM-dd"); rowSum += kv.Value;
if (dayValue >= startDate && dayValue <= endDate && dataMain.Columns.Contains(colName))
{
decimal.TryParse(dayRow[amountField] + "", out decimal amountValue);
dataMap[key][colName] = amountValue;
}
}
}
}
}
// **4. 一次性填充 DataTable(避免逐行赋值带来的性能问题)**
foreach (DataRow row in dataMain.Rows)
{
string key = row[topPrimaryKey].ToString();
if (dataMap.ContainsKey(key))
{
foreach (var col in dataMap[key])
{
row[col.Key] = col.Value;
} }
} }
mainRow["workingsum"] = rowSum; // 行汇总
} }
return dataMain; return dataMain;
} }
#endregion #endregion