diff --git a/插件库/Lskj.PubAccraditation/FrmAccraditation.cs b/插件库/Lskj.PubAccraditation/FrmAccraditation.cs index 79deb5a..8eb8b05 100644 --- a/插件库/Lskj.PubAccraditation/FrmAccraditation.cs +++ b/插件库/Lskj.PubAccraditation/FrmAccraditation.cs @@ -88,6 +88,10 @@ namespace Lskj.PubAccraditation /// 主表动态生成的日期列 /// public List DateColumnList = new List(); + /// + /// 主表动态生成的合计列 + /// + public GridColumn SumGridColumn = new GridColumn(); #region 私有变量 /// /// id(推送记录) @@ -1166,17 +1170,9 @@ namespace Lskj.PubAccraditation /// 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(); - } - UpdateDynamicColumns(dateTime); - OnGcMainDataSourceChanged(gridBillInfo.GridView, null);//手动刷新日期合计数据源 - } + AddDataColumns(); + UpdateDynamicColumns(); + OnGcMainDataSourceChanged(gridBillInfo.GridView, null);//手动刷新日期合计数据源 } private void AddDataColumns() { @@ -1184,27 +1180,67 @@ namespace Lskj.PubAccraditation { 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) { - GridColumn gridColumn = new GridColumn(); - gridColumn.AppearanceCell.Options.UseTextOptions = true; - gridColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center; - gridColumn.AppearanceHeader.Options.UseTextOptions = true; - gridColumn.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center; - gridColumn.OptionsColumn.AllowMove = false; - gridColumn.OptionsColumn.AllowSize = false; - gridColumn.OptionsFilter.AllowFilter = false; - gridColumn.OptionsColumn.AllowMerge = DefaultBoolean.False; - gridColumn.OptionsColumn.AllowSort = DefaultBoolean.False; - gridColumn.FieldName = $"DDay_{i}"; - gridColumn.Width = 70; - gridColumn.DisplayFormat.FormatType = FormatType.Numeric; - gridColumn.DisplayFormat.FormatString = "{0:#,##0.####}"; - gridColumn.Visible = false; - gridColumn.SummaryItem.SummaryType = SummaryItemType.Sum; - gridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}"; - gridBillInfo.GridView.Columns.Add(gridColumn); - DateColumnList.Add(gridColumn); + 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.AppearanceCell.Options.UseTextOptions = true; + gridColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center; + gridColumn.AppearanceHeader.Options.UseTextOptions = true; + gridColumn.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center; + gridColumn.OptionsColumn.AllowMove = false; + gridColumn.OptionsColumn.AllowSize = false; + gridColumn.OptionsFilter.AllowFilter = false; + gridColumn.OptionsColumn.AllowMerge = DefaultBoolean.False; + gridColumn.OptionsColumn.AllowSort = DefaultBoolean.False; + gridColumn.FieldName = $"DDay_{i}"; + gridColumn.Width = 70; + gridColumn.DisplayFormat.FormatType = FormatType.Numeric; + gridColumn.DisplayFormat.FormatString = "{0:#,##0.####}"; + gridColumn.Visible = true; + gridColumn.SummaryItem.SummaryType = SummaryItemType.Sum; + gridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}"; + gridBillInfo.GridView.Columns.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); } } @@ -1212,9 +1248,26 @@ namespace Lskj.PubAccraditation /// 根据日期修改列状态 /// /// - 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(); try { @@ -1235,6 +1288,7 @@ namespace Lskj.PubAccraditation gridColumn.Visible = false; } } + } finally { @@ -1310,66 +1364,86 @@ namespace Lskj.PubAccraditation string dateField = "showday"; string amountField = "amount"; string topPrimaryKey = BillModelObj.DetailUUIDKey; - DateTime endDate = startDate.AddDays(7); // 计算结束日期 - // **1. 预索引 dataDayPlan 数据(billdocument_id -> 该 key 相关的所有行)** - Dictionary> dayPlanMap = new Dictionary>(); + 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 = startDate.AddDays(dayCount); + + // ---------- 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("workingsum")) + dataMain.Columns.Add("workingsum", 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["workingsum"] = rowSum; // 行汇总 } + return dataMain; } #endregion