diff --git a/插件库/Lskj.PubAccraditation/FrmAccraditation.cs b/插件库/Lskj.PubAccraditation/FrmAccraditation.cs index 548fe9f..39ffe90 100644 --- a/插件库/Lskj.PubAccraditation/FrmAccraditation.cs +++ b/插件库/Lskj.PubAccraditation/FrmAccraditation.cs @@ -30,6 +30,8 @@ using DevExpress.XtraBars; using System.Collections; using Lskj.Core; using System.Threading.Tasks; +using DevExpress.Utils; +using DevExpress.Data; namespace Lskj.PubAccraditation { @@ -80,6 +82,10 @@ namespace Lskj.PubAccraditation /// The sender. public event RefreshThePage refreshThePage; public delegate void RefreshThePage(string promptInformation, string id); + /// + /// 主表动态生成的日期列 + /// + public List DateColumnList = new List(); #region 私有变量 /// /// id(推送记录) @@ -943,6 +949,7 @@ namespace Lskj.PubAccraditation this.pl_left_top.AutoScroll = true; } this.ControlObj.OnDataSourceBindCallBack += new EventHandler(OnControlObjOnDataSourceBindCallBack); + this.ControlObj.OnDataFileRefrshCallBack += OnDataFileRefrshFile; this.pl_left_top.Height = this.BillModelObj.ParentHeight - 36 > this.pl_left_top.Height ? this.pl_left_top.Height : this.BillModelObj.ParentHeight; //初始明细数据 this.gridBillInfo.Model = this.SysModel; @@ -1144,6 +1151,194 @@ namespace Lskj.PubAccraditation MessageUtil.Show(Message, ex.Message); } } + /// + /// 说明:刷新表格列(时间) + /// 创建人:王一帆 + /// 创建日期:2018-08-16 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// + /// + 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);//手动刷新日期合计数据源 + } + } + private void AddDataColumns() + { + foreach (GridColumn gridColumn in gridBillInfo.GridView.Columns) + { + gridColumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left; + } + for (int i = 0; i < 7; 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 = false; + gridColumn.SummaryItem.SummaryType = SummaryItemType.Sum; + gridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}"; + gridBillInfo.GridView.Columns.Add(gridColumn); + DateColumnList.Add(gridColumn); + } + } + + /// + /// 根据日期修改列状态 + /// + /// + private void UpdateDynamicColumns(DateTime currentDate) + { + DateTime endDate = currentDate.AddDays(7); + gridBillInfo.GridView.BeginUpdate(); + try + { + for (int i = 0; i < DateColumnList.Count; i++) + { + GridColumn gridColumn = DateColumnList[i]; + // 当前列对应的日期 = 起始日期加 i 天 + DateTime dateForColumn = currentDate.AddDays(i); + if (dateForColumn <= endDate) + { + gridColumn.FieldName = dateForColumn.ToString("yyyy-MM-dd"); + gridColumn.Caption = dateForColumn.ToString("MM-dd"); + gridColumn.Visible = true; + gridColumn.Tag = dateForColumn; + } + else + { + gridColumn.Visible = false; + } + } + } + finally + { + gridBillInfo.GridView.EndUpdate(); + } + } + /// + /// 主表数据源改变时 + /// + /// + /// + private void OnGcMainDataSourceChanged(object sender, EventArgs e) + { + if (DateColumnList.Count > 0 && DateColumnList[0].Tag is DateTime dateTime) + { + string billNo = SysModel.BillDocumentId; + this.gridBillInfo.GridControl.DataSourceChanged -= OnGcMainDataSourceChanged; + DataTable dataTable = gridBillInfo.GridControl.DataSource as DataTable; + if (dataTable != null) + { + //DataTable dataMain = dataTable.Copy(); + string sqlValue = "select * from RD_worktimetab where 1 = 1"; + sqlValue = $"{sqlValue} and lblOrderNo = '{billNo}' and showday >= '{dateTime.ToString("yyyy-MM-dd")}'"; + DataTable dataDayPlan = BaseImpl.GetDataTableResult(sqlValue); + MergeMainDataWithDayPlan(dataTable, dataDayPlan, dateTime); + this.gridBillInfo.GridControl.DataSource = null; + this.gridBillInfo.GridControl.DataSource = dataTable; + } + this.gridBillInfo.GridControl.DataSourceChanged += OnGcMainDataSourceChanged; + } + } + /// + /// 构建带日期的数据源 + /// + /// + /// + /// + /// + private DataTable MergeMainDataWithDayPlan(DataTable dataMain, DataTable dataDayPlan, DateTime startDate) + { + string rightPrimaryKey = "billdocument_id"; + string dateField = "showday"; + string amountField = "amount"; + string topPrimaryKey = BillModelObj.DetailUUIDKey; + DateTime endDate = startDate.AddDays(7); // 计算结束日期 + // **1. 预索引 dataDayPlan 数据(billdocument_id -> 该 key 相关的所有行)** + Dictionary> dayPlanMap = new Dictionary>(); + foreach (DataRow row in dataDayPlan.Rows) + { + string billId = row[rightPrimaryKey].ToString(); + if (!dayPlanMap.ContainsKey(billId)) + { + dayPlanMap[billId] = new List(); + } + dayPlanMap[billId].Add(row); + } + // **2. 预构建主数据的列** + for (DateTime dt = startDate; dt <= endDate; dt = dt.AddDays(1)) + { + string colName = dt.ToString("yyyy-MM-dd"); + if (!dataMain.Columns.Contains(colName)) + { + dataMain.Columns.Add(colName, typeof(decimal)); // 确保列存在 + } + } + // **3. 预构建数据填充映射表** + Dictionary> dataMap = new Dictionary>(); + foreach (DataRow row in dataMain.Rows) + { + string key = row[topPrimaryKey].ToString(); + if (!dataMap.ContainsKey(key)) + { + dataMap[key] = new Dictionary(); + } + // **查找 key 关联的时间数据** + if (dayPlanMap.ContainsKey(key)) + { + foreach (DataRow dayRow in dayPlanMap[key]) + { + 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; + } + } + } + } + } + // **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; + } + } + } + return dataMain; + } #endregion #region 右键菜单执行后刷新 @@ -2291,7 +2486,7 @@ namespace Lskj.PubAccraditation { defaultValue = BaseImpl.GetDefaultValue(defaultValue); } - string billNo = this.BillModelObj.NewVer == 1|| SystemInfo.Instance.SplitOrderNewVer ? BillImpl.GetBillNo(this.BillModelObj.BillSeq) : defaultValue; + string billNo = this.BillModelObj.NewVer == 1 || SystemInfo.Instance.SplitOrderNewVer ? BillImpl.GetBillNo(this.BillModelObj.BillSeq) : defaultValue; //构造表头 string masterSql = this.GetBillHearder(billNo); //构造明细"@billdocument_id@"