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@"