SVN r362
SVN-Revision: r362
This commit is contained in:
@@ -362,6 +362,13 @@ namespace Lskj.ProductiSched
|
||||
/// </summary>
|
||||
private bool SaveDatePlanRecord()
|
||||
{
|
||||
BaseUserControl dataTypeControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast<System.Windows.Forms.Control>().Where(n => n is LabelComboxEdit).Cast<BaseUserControl>().FirstOrDefault(); // 获取第一个符合条件的控件
|
||||
string typeDate = "0";
|
||||
if (dataTypeControl != null)
|
||||
{
|
||||
LabelComboxEdit labelAutoTextEdit = dataTypeControl as LabelComboxEdit;
|
||||
typeDate = labelAutoTextEdit.EditValue;
|
||||
}
|
||||
// 获取主数据源,假设已绑定到 gridControl1
|
||||
DataTable mainDataSource = bandGcTop.BandedView.GridControl.DataSourceTable();
|
||||
if (mainDataSource == null)
|
||||
@@ -417,7 +424,7 @@ namespace Lskj.ProductiSched
|
||||
}
|
||||
// 调用存储过程保存变更数据
|
||||
string msg;
|
||||
int ret = SaveDayPlanChanges(tvp, out msg);
|
||||
int ret = SaveDayPlanChanges(tvp, typeDate,out msg);
|
||||
if (ret == 1)
|
||||
{
|
||||
MessageUtil.Show("保存成功:" + msg);
|
||||
@@ -437,35 +444,48 @@ namespace Lskj.ProductiSched
|
||||
/// <param name="tvp">包含所有变更记录的 DataTable,必须与 dbo.DayPlanChangeType 定义一致</param>
|
||||
/// <param name="message">输出提示信息,存储过程执行后的返回消息</param>
|
||||
/// <returns>存储过程返回值,成功返回 1,失败返回 0</returns>
|
||||
public int SaveDayPlanChanges(DataTable tvp, out string message)
|
||||
public int SaveDayPlanChanges(DataTable tvp, string typeDate, out string message)
|
||||
{
|
||||
// 创建输出参数 @msg
|
||||
SqlParameter pMsg = new SqlParameter("@msg", SqlDbType.VarChar, 2000)
|
||||
{
|
||||
Direction = ParameterDirection.Output
|
||||
};
|
||||
|
||||
// 创建返回值参数 @return
|
||||
SqlParameter returnValue = new SqlParameter("@return", SqlDbType.Int)
|
||||
{
|
||||
Direction = ParameterDirection.ReturnValue
|
||||
};
|
||||
|
||||
// 创建 TVP 参数,名称必须与存储过程参数一致
|
||||
SqlParameter tvpParam = new SqlParameter("@DayPlanChanges", SqlDbType.Structured)
|
||||
{
|
||||
TypeName = "dbo.DayPlanChangeType",
|
||||
Value = tvp
|
||||
};
|
||||
|
||||
// 创建 typeDate 参数并传入存储过程
|
||||
SqlParameter typeDateParam = new SqlParameter("@TypeDate", SqlDbType.VarChar, 10)
|
||||
{
|
||||
Value = typeDate
|
||||
};
|
||||
|
||||
// 构造参数数组
|
||||
SqlParameter[] parameters = new SqlParameter[] { tvpParam, pMsg, returnValue };
|
||||
SqlParameter[] parameters = new SqlParameter[] { tvpParam, typeDateParam, pMsg, returnValue };
|
||||
|
||||
// 执行存储过程,此处调用 ExecuteNonQuery 即可,不需要返回数据集
|
||||
// 请确保 DBUtil.ExecuteNonQuery 方法能够传递参数并执行存储过程
|
||||
// 请确保 BaseImpl.ExecProcedure 方法能够传递参数并执行存储过程
|
||||
BaseImpl.ExecProcedure("usp_MergeDayPlanChanges", parameters);
|
||||
|
||||
// 获取输出参数 @msg 中的提示信息
|
||||
message = pMsg.Value.ToString();
|
||||
|
||||
// 获取存储过程的返回值
|
||||
int result = Convert.ToInt32(returnValue.Value);
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 单元格点击刷新当前行数据
|
||||
/// </summary>
|
||||
@@ -479,14 +499,27 @@ namespace Lskj.ProductiSched
|
||||
DataRow rowItem = bandGcTop.BandedView.GetFocusedDataRow();
|
||||
if (rowItem != null)
|
||||
{
|
||||
BaseUserControl baseUserControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast<BaseUserControl>().Where(n => n is LabelDateEdit).FirstOrDefault();
|
||||
BaseUserControl dataTypeControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast<System.Windows.Forms.Control>().Where(n => n is LabelComboxEdit).Cast<BaseUserControl>().FirstOrDefault(); // 获取第一个符合条件的控件
|
||||
string typeDate = "0";
|
||||
LabelDateEdit labelDateEdit = null;
|
||||
if (baseUserControl != null)
|
||||
{
|
||||
labelDateEdit = baseUserControl as LabelDateEdit;
|
||||
}
|
||||
if (dataTypeControl != null)
|
||||
{
|
||||
LabelComboxEdit labelAutoTextEdit = dataTypeControl as LabelComboxEdit;
|
||||
typeDate = labelAutoTextEdit.EditValue;
|
||||
}
|
||||
string searchSql = this.GetSearchSql(model, rowItem, false);
|
||||
string isweekcond = DataModel.TopModuleModel.HasReport ? "" : $"and isWeek='{typeDate}'";
|
||||
searchSql = $"{ReplaceHelper.ReplaceWhereCond(searchSql)} and day >= '{labelDateEdit.TextEdit.DateTime.ToString("yyyy-MM-dd")}' {isweekcond}";
|
||||
gcRight.SetGridViewDataSource(BaseImpl.GetDataTableResult(searchSql));
|
||||
if (e != null)
|
||||
{
|
||||
BaseUserControl baseUserControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast<BaseUserControl>().Where(n => n is LabelDateEdit).FirstOrDefault();
|
||||
if (baseUserControl != null)
|
||||
if (labelDateEdit != null)
|
||||
{
|
||||
LabelDateEdit labelDateEdit = baseUserControl as LabelDateEdit;
|
||||
DateTime dateTime = labelDateEdit.TextEdit.DateTime;
|
||||
DataRow focusedRow = bandGcTop.BandedView.GetFocusedDataRow();
|
||||
DataTable dataDayPlan = gcRight.GridControl.DataSourceTable().Copy();
|
||||
@@ -599,12 +632,20 @@ namespace Lskj.ProductiSched
|
||||
private void OnDataSourceBindCallBack(object sender, EventArgs e)
|
||||
{
|
||||
BaseUserControl baseUserControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast<BaseUserControl>().Where(n => n is LabelDateEdit).FirstOrDefault();
|
||||
BaseUserControl dataTypeControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast<System.Windows.Forms.Control>().Where(n => n is LabelComboxEdit).Cast<BaseUserControl>().FirstOrDefault(); // 获取第一个符合条件的控件
|
||||
string typeDate = "0";
|
||||
if (dataTypeControl != null)
|
||||
{
|
||||
LabelComboxEdit labelAutoTextEdit = dataTypeControl as LabelComboxEdit;
|
||||
typeDate = labelAutoTextEdit.EditValue;
|
||||
}
|
||||
|
||||
if (baseUserControl != null)
|
||||
{
|
||||
LabelDateEdit labelDateEdit = baseUserControl as LabelDateEdit;
|
||||
DateTime dateTime = labelDateEdit.TextEdit.DateTime;
|
||||
UpdateDynamicColumns(bandGcTop, dateTime);
|
||||
UpdateDynamicColumns(bandGcBottom, dateTime);
|
||||
UpdateDynamicColumns(bandGcTop, dateTime,typeDate);
|
||||
UpdateDynamicColumns(bandGcBottom, dateTime,typeDate);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
@@ -615,19 +656,34 @@ namespace Lskj.ProductiSched
|
||||
private void OnSearchAfterCallBack(object sender, EventArgs e)
|
||||
{
|
||||
BaseUserControl baseUserControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast<BaseUserControl>().Where(n => n is LabelDateEdit).FirstOrDefault();
|
||||
BaseUserControl dataTypeControl = DataModel.TopSearchObj.ParentPanel.Controls.Cast<System.Windows.Forms.Control>().Where(n => n is LabelComboxEdit).Cast<BaseUserControl>().FirstOrDefault(); // 获取第一个符合条件的控件
|
||||
string typeDate = "0";
|
||||
if (dataTypeControl != null)
|
||||
{
|
||||
LabelComboxEdit labelAutoTextEdit = dataTypeControl as LabelComboxEdit;
|
||||
typeDate = labelAutoTextEdit.EditValue;
|
||||
}
|
||||
if (baseUserControl != null)
|
||||
{
|
||||
LabelDateEdit labelDateEdit = baseUserControl as LabelDateEdit;
|
||||
if (typeDate == "1")
|
||||
{
|
||||
DateTime endDate = labelDateEdit.TextEdit.DateTime.AddMonths(3).AddDays(-1); // 计算结束日期
|
||||
int weekIndex = 0;
|
||||
DateTime weekStart = GetStartOfWeek(labelDateEdit.TextEdit.DateTime); // 获取本周的周一日期
|
||||
labelDateEdit.TextEdit.DateTime = weekStart;
|
||||
}
|
||||
DateTime dateTime = labelDateEdit.TextEdit.DateTime;
|
||||
UpdateDynamicColumns(bandGcTop, dateTime);
|
||||
UpdateDynamicColumns(bandGcBottom, dateTime);
|
||||
UpdateDynamicColumns(bandGcTop, dateTime, typeDate);
|
||||
UpdateDynamicColumns(bandGcBottom, dateTime, typeDate);
|
||||
DataTable dataMain = bandGcTop.GridControl.DataSourceTable().Copy();
|
||||
DataTable dataDetail = bandGcTop.GridControl.DataSourceTable().Copy();
|
||||
bandGcTop.GridControl.DataSource = null;
|
||||
string sqlValue = DataModel.RightModuleModel.MenuSql;
|
||||
sqlValue = $"{ReplaceHelper.ReplaceWhereCond(sqlValue)} and day >= '{dateTime.ToString("yyyy-MM-dd")}'";
|
||||
string isweekcond = DataModel.TopModuleModel.HasReport?"":$"and isWeek='{typeDate}'";
|
||||
sqlValue = $"{ReplaceHelper.ReplaceWhereCond(sqlValue)} and day >= '{dateTime.ToString("yyyy-MM-dd")}' {isweekcond}";
|
||||
DataTable dataDayPlan = BaseImpl.GetDataTableResult(sqlValue);
|
||||
MergeMainDataWithDayPlan(dataMain, dataDayPlan, dateTime);
|
||||
MergeMainDataWithDayPlan(dataMain, dataDayPlan, dateTime, typeDate);
|
||||
bandGcTop.BandedView.GridControl.DataSource = dataMain;
|
||||
if (bandGcBottom.Visible)
|
||||
{
|
||||
@@ -725,60 +781,61 @@ namespace Lskj.ProductiSched
|
||||
}
|
||||
gridBand.Columns.Add(gridColumn);
|
||||
}
|
||||
// 现在添加15个周列
|
||||
for (int i = 93; i < 108; i++) // 新增15个周列
|
||||
{
|
||||
GridBand gridBand = new GridBand();
|
||||
gridBand.Name = $"Week_{i - 93}";
|
||||
gridBand.Caption = "";
|
||||
gridBand.OptionsBand.AllowMove = false;
|
||||
gridBand.OptionsBand.AllowSize = false;
|
||||
gridBand.AppearanceHeader.Options.UseFont = true;
|
||||
gridBand.AppearanceHeader.Font = new Font("宋体", 9, FontStyle.Bold);
|
||||
gridBand.AppearanceHeader.Options.UseTextOptions = true;
|
||||
gridBand.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center;
|
||||
bandedGridControlEx.BandedView.Bands.Add(gridBand);
|
||||
BandedGridColumn gridColumn = new BandedGridColumn();
|
||||
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 = $"WWeek_{i - 93}";
|
||||
gridColumn.Width = 140;
|
||||
gridColumn.DisplayFormat.FormatType = FormatType.Numeric;
|
||||
gridColumn.DisplayFormat.FormatString = "{0:#,##0.####}";
|
||||
gridColumn.Visible = false;
|
||||
if (bandedGridControlEx == bandGcTop)
|
||||
{
|
||||
gridColumn.SummaryItem.SummaryType = SummaryItemType.Sum;
|
||||
gridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}";
|
||||
}
|
||||
gridBand.Columns.Add(gridColumn);
|
||||
}
|
||||
}
|
||||
#region 类型切换日期展示方法
|
||||
/// <summary>
|
||||
/// 根据日期修改列状态
|
||||
/// 构建带日期或周期
|
||||
/// </summary>
|
||||
/// <param name="bandedGridControlEx"></param>
|
||||
/// <param name="currentDate"></param>
|
||||
private void UpdateDynamicColumns(BandedGridControlEx bandedGridControlEx, DateTime currentDate)
|
||||
/// <param name="typeDate"></param>
|
||||
private void UpdateDynamicColumns(BandedGridControlEx bandedGridControlEx, DateTime currentDate, string typeDate = "0")
|
||||
{
|
||||
// 定义三个月的结束日期:起始日期加3个月减1天
|
||||
DateTime endDate = currentDate.AddMonths(3).AddDays(-1);
|
||||
bandedGridControlEx.BandedView.BeginUpdate();
|
||||
try
|
||||
{
|
||||
for (int i = 0; i < 93; i++)
|
||||
if (typeDate == "1")
|
||||
{
|
||||
// 以构建列时的命名规则 "Day_{i}" 查找对应的 GridBand
|
||||
string bandTitle = $"Day_{i}";
|
||||
GridBand gridBand = bandedGridControlEx.BandedView.Bands.Cast<GridBand>().FirstOrDefault(x => x.Name == bandTitle);
|
||||
if (gridBand == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// 假定每个 GridBand 下只有一个子列
|
||||
BandedGridColumn gridColumn = gridBand.Columns.Count > 0 ? gridBand.Columns[0] : null;
|
||||
if (gridColumn == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// 当前列对应的日期 = 起始日期加 i 天
|
||||
DateTime dateForColumn = currentDate.AddDays(i);
|
||||
if (dateForColumn <= endDate)
|
||||
{
|
||||
gridBand.Caption = dateForColumn.ToString("MM-dd");
|
||||
gridBand.Visible = true;
|
||||
gridColumn.FieldName = dateForColumn.ToString("yyyy-MM-dd");
|
||||
gridColumn.Caption = GetChineseWeekDayNumber(dateForColumn);
|
||||
gridColumn.Tag = dateForColumn;
|
||||
if (bandedGridControlEx == bandGcTop)
|
||||
{
|
||||
if (dateForColumn.Date < DateTime.Now.Date)
|
||||
{
|
||||
gridColumn.OptionsColumn.AllowEdit = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
gridColumn.OptionsColumn.AllowEdit = true;
|
||||
}
|
||||
}
|
||||
gridColumn.Visible = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
gridBand.Visible = false;
|
||||
gridColumn.Visible = false;
|
||||
}
|
||||
UpdateWeeklyColumns(bandedGridControlEx, currentDate);
|
||||
}
|
||||
else
|
||||
{
|
||||
UpdateDailyColumns(bandedGridControlEx, currentDate);
|
||||
}
|
||||
}
|
||||
finally
|
||||
@@ -787,17 +844,190 @@ namespace Lskj.ProductiSched
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 按照周结构生成列
|
||||
/// </summary>
|
||||
/// <param name="grid"></param>
|
||||
/// <param name="currentDate"></param>
|
||||
private void UpdateWeeklyColumns(BandedGridControlEx grid, DateTime currentDate)
|
||||
{
|
||||
DateTime endDate = currentDate.AddMonths(3).AddDays(-1); // 计算结束日期
|
||||
int weekIndex = 0;
|
||||
DateTime weekStart = GetStartOfWeek(currentDate); // 获取本周的周一日期
|
||||
|
||||
// 查找并更新15个虚拟的周列
|
||||
while (weekStart <= endDate && weekIndex < 15)
|
||||
{
|
||||
DateTime weekEnd = weekStart.AddDays(6); // 周日的日期是周一 + 6 天
|
||||
|
||||
// 查找现有的虚拟周列(Week_0, Week_1, ..., Week_14)
|
||||
string bandTitle = $"Week_{weekIndex}";
|
||||
GridBand weekBand = grid.BandedView.Bands.Cast<GridBand>()
|
||||
.FirstOrDefault(b => b.Name == bandTitle);
|
||||
|
||||
if (weekBand != null && weekBand.Columns.Count > 0)
|
||||
{
|
||||
BandedGridColumn weekColumn = weekBand.Columns[0];
|
||||
weekBand.Visible = true;
|
||||
// 设置周列表头:例如 "03-01至03-07"
|
||||
weekBand.Caption = $"{weekStart:MM-dd}至{weekEnd:MM-dd}";
|
||||
weekColumn.FieldName = weekStart.ToString("yyyy-MM-dd");
|
||||
// 设置列的内容为“第几周”
|
||||
weekColumn.Caption = $"第{GetWeekOfYear(weekStart)}周";
|
||||
|
||||
// 设置列的宽度
|
||||
weekColumn.Width = 140;
|
||||
|
||||
// 设置该列的Tag为周的开始日期(便于后续操作)
|
||||
weekColumn.Tag = weekStart;
|
||||
|
||||
// 设置是否允许编辑
|
||||
if (weekEnd >= DateTime.Today)
|
||||
{
|
||||
weekColumn.OptionsColumn.AllowEdit = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
weekColumn.OptionsColumn.AllowEdit = false;
|
||||
}
|
||||
|
||||
weekColumn.Visible = true; // 显示该列
|
||||
}
|
||||
|
||||
// 更新到下一周
|
||||
weekStart = weekEnd.AddDays(1); // 下一周的周一
|
||||
weekIndex++;
|
||||
}
|
||||
|
||||
// 隐藏多余的周列(超过15周的列)
|
||||
foreach (int i in Enumerable.Range(weekIndex, 15 - weekIndex))
|
||||
{
|
||||
GridBand band = grid.BandedView.Bands.Cast<GridBand>()
|
||||
.FirstOrDefault(b => b.Name == $"Week_{i}");
|
||||
if (band != null) band.Visible = false;
|
||||
}
|
||||
|
||||
// 隐藏所有包含 Day_ 的列
|
||||
foreach (var band in grid.BandedView.Bands.Cast<GridBand>())
|
||||
{
|
||||
if (band.Name.StartsWith("Day_"))
|
||||
{
|
||||
band.Visible = false;
|
||||
foreach (BandedGridColumn column in band.Columns)
|
||||
{
|
||||
column.Visible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取给定日期所在周的开始日期(周一)。
|
||||
/// </summary>
|
||||
private DateTime GetStartOfWeek(DateTime date)
|
||||
{
|
||||
// 这里假设一周是从周一开始的
|
||||
int diff = (7 + (date.DayOfWeek - DayOfWeek.Monday)) % 7;
|
||||
DateTime startOfWeek = date.AddDays(-diff);
|
||||
return startOfWeek.Date; // 返回周一的日期
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 计算某个日期属于这一年的第几周
|
||||
/// </summary>
|
||||
/// <param name="date">日期</param>
|
||||
/// <returns>周数</returns>
|
||||
private int GetWeekOfYear(DateTime date)
|
||||
{
|
||||
var cultureInfo = new CultureInfo("zh-CN");
|
||||
var calendar = cultureInfo.Calendar;
|
||||
return calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private void UpdateDailyColumns(BandedGridControlEx grid, DateTime currentDate)
|
||||
{
|
||||
// 原有的日处理逻辑(保持原代码不变)
|
||||
DateTime endDate = currentDate.AddMonths(3).AddDays(-1);
|
||||
|
||||
// 处理每天的列(现有逻辑)
|
||||
for (int i = 0; i < 93; i++)
|
||||
{
|
||||
// 以构建列时的命名规则 "Day_{i}" 查找对应的 GridBand
|
||||
string bandTitle = $"Day_{i}";
|
||||
GridBand gridBand = grid.BandedView.Bands.Cast<GridBand>().FirstOrDefault(x => x.Name == bandTitle);
|
||||
if (gridBand == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 假定每个 GridBand 下只有一个子列
|
||||
BandedGridColumn gridColumn = gridBand.Columns.Count > 0 ? gridBand.Columns[0] : null;
|
||||
if (gridColumn == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 当前列对应的日期 = 起始日期加 i 天
|
||||
DateTime dateForColumn = currentDate.AddDays(i);
|
||||
if (dateForColumn <= endDate)
|
||||
{
|
||||
gridBand.Caption = dateForColumn.ToString("MM-dd");
|
||||
gridBand.Visible = true;
|
||||
gridColumn.FieldName = dateForColumn.ToString("yyyy-MM-dd");
|
||||
gridColumn.Caption = GetChineseWeekDayNumber(dateForColumn);
|
||||
gridColumn.Width = 70;
|
||||
gridColumn.Tag = dateForColumn;
|
||||
if (grid == bandGcTop)
|
||||
{
|
||||
if (dateForColumn.Date < DateTime.Now.Date)
|
||||
{
|
||||
gridColumn.OptionsColumn.AllowEdit = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
gridColumn.OptionsColumn.AllowEdit = true;
|
||||
}
|
||||
}
|
||||
gridColumn.Visible = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
gridBand.Visible = false;
|
||||
gridColumn.Visible = false;
|
||||
}
|
||||
}
|
||||
//隐藏所有包含 week_ 的列
|
||||
foreach (var band in grid.BandedView.Bands.Cast<GridBand>())
|
||||
{
|
||||
if (band.Name.StartsWith("Week_"))
|
||||
{
|
||||
band.Visible = false;
|
||||
foreach (BandedGridColumn column in band.Columns)
|
||||
{
|
||||
column.Visible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
/// <summary>
|
||||
/// 构建带日期的数据源
|
||||
/// </summary>
|
||||
/// <param name="dataMain"></param>
|
||||
/// <param name="dataDayPlan"></param>
|
||||
/// <param name="startDate"></param>
|
||||
/// <returns></returns>
|
||||
private DataTable MergeMainDataWithDayPlan(DataTable dataMain, DataTable dataDayPlan, DateTime startDate)
|
||||
private DataTable MergeMainDataWithDayPlan(DataTable dataMain, DataTable dataDayPlan, DateTime startDate, string typeDate = "0")
|
||||
{
|
||||
string rightPrimaryKey = DataModel.RightModuleModel.ParmaryKey;
|
||||
string topPrimaryKey = DataModel.TopModuleModel.ParmaryKey;
|
||||
DateTime endDate = startDate.AddMonths(3).AddDays(-1); // 计算结束日期
|
||||
|
||||
// **1. 预索引 dataDayPlan 数据(billdocument_id -> 该 key 相关的所有行)**
|
||||
Dictionary<string, List<DataRow>> dayPlanMap = new Dictionary<string, List<DataRow>>();
|
||||
foreach (DataRow row in dataDayPlan.Rows)
|
||||
@@ -809,6 +1039,7 @@ namespace Lskj.ProductiSched
|
||||
}
|
||||
dayPlanMap[billId].Add(row);
|
||||
}
|
||||
|
||||
// **2. 预构建主数据的列**
|
||||
for (DateTime dt = startDate; dt <= endDate; dt = dt.AddDays(1))
|
||||
{
|
||||
@@ -818,6 +1049,7 @@ namespace Lskj.ProductiSched
|
||||
dataMain.Columns.Add(colName, typeof(decimal)); // 确保列存在
|
||||
}
|
||||
}
|
||||
|
||||
// **3. 预构建数据填充映射表**
|
||||
Dictionary<string, Dictionary<string, decimal>> dataMap = new Dictionary<string, Dictionary<string, decimal>>();
|
||||
foreach (DataRow row in dataMain.Rows)
|
||||
@@ -845,7 +1077,75 @@ namespace Lskj.ProductiSched
|
||||
}
|
||||
}
|
||||
}
|
||||
// **4. 一次性填充 DataTable(避免逐行赋值带来的性能问题)**
|
||||
|
||||
// **4. 如果有报告(HasReport 为 true)且 typeDate 为 "1",合并同一周的数据**
|
||||
if (DataModel.TopModuleModel.HasReport && typeDate == "1")
|
||||
{
|
||||
int weekIndex = 0;
|
||||
DateTime tempStartDate = startDate;
|
||||
|
||||
while (tempStartDate <= endDate && weekIndex < 15)
|
||||
{
|
||||
DateTime weekEnd = tempStartDate.AddDays(6); // 计算本周的周日
|
||||
|
||||
// 为每个 key 存储合并的数据
|
||||
Dictionary<string, decimal> weekSumMap = new Dictionary<string, decimal>();
|
||||
|
||||
// 查找当前周的所有列(如 03-01, 03-02, ...)
|
||||
string weekColumnPrefix = $"{tempStartDate:yyyy-MM-dd}";
|
||||
|
||||
// 对每一天的列进行累加,合并到这一周的第一天
|
||||
for (DateTime dt = tempStartDate; dt <= weekEnd && dt <= endDate; dt = dt.AddDays(1))
|
||||
{
|
||||
string colName = dt.ToString("yyyy-MM-dd"); // 使用 yyyy-MM-dd 格式
|
||||
if (dataMain.Columns.Contains(colName))
|
||||
{
|
||||
foreach (DataRow row in dataMain.Rows)
|
||||
{
|
||||
string key = row[topPrimaryKey].ToString();
|
||||
if (dataMap.ContainsKey(key) && dataMap[key].ContainsKey(colName))
|
||||
{
|
||||
// 累加数据并更新 weekSumMap
|
||||
if (!weekSumMap.ContainsKey(key))
|
||||
{
|
||||
weekSumMap[key] = 0;
|
||||
}
|
||||
weekSumMap[key] += dataMap[key][colName]; // 累加当前列的数据
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将合并的数据写入到周一(即第一天)的列
|
||||
string firstDayCol = tempStartDate.ToString("yyyy-MM-dd"); // 使用 yyyy-MM-dd 格式
|
||||
|
||||
// 为每个 key 更新其对应的合并数据
|
||||
foreach (DataRow row in dataMain.Rows)
|
||||
{
|
||||
string key = row[topPrimaryKey].ToString();
|
||||
if (weekSumMap.ContainsKey(key))
|
||||
{
|
||||
row[firstDayCol] = weekSumMap[key]; // 设置周一的值为合并后的总和
|
||||
}
|
||||
}
|
||||
|
||||
// 隐藏其他非周一的列
|
||||
for (DateTime dt = tempStartDate.AddDays(1); dt <= weekEnd && dt <= endDate; dt = dt.AddDays(1))
|
||||
{
|
||||
string colName = dt.ToString("yyyy-MM-dd"); // 使用 yyyy-MM-dd 格式
|
||||
if (dataMain.Columns.Contains(colName))
|
||||
{
|
||||
dataMain.Columns[colName].ColumnMapping = MappingType.Hidden; // 将非周一列隐藏
|
||||
}
|
||||
}
|
||||
|
||||
// 更新到下一周
|
||||
tempStartDate = weekEnd.AddDays(1); // 下一周的周一
|
||||
weekIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
// **5. 一次性填充 DataTable(避免逐行赋值带来的性能问题)**
|
||||
foreach (DataRow row in dataMain.Rows)
|
||||
{
|
||||
string key = row[topPrimaryKey].ToString();
|
||||
@@ -859,6 +1159,7 @@ namespace Lskj.ProductiSched
|
||||
}
|
||||
return dataMain;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 构建带日期的数据源
|
||||
/// </summary>
|
||||
@@ -1002,14 +1303,24 @@ namespace Lskj.ProductiSched
|
||||
/// <param name="e"></param>
|
||||
private void OnCustomDrawColumnHeader(object sender, ColumnHeaderCustomDrawEventArgs e)
|
||||
{
|
||||
// 判断列的Tag是否为 DateTime
|
||||
if (e.Column != null && e.Column.Tag != null && e.Column.Tag is DateTime dateTime)
|
||||
{
|
||||
// 判断是否为周列,如果是周列则跳过标红
|
||||
if (e.Column.Caption.StartsWith("第"))
|
||||
{
|
||||
return; // 跳过周列
|
||||
}
|
||||
|
||||
// 判断日期是否为周末(星期六或星期日)
|
||||
if (dateTime.DayOfWeek == DayOfWeek.Saturday || dateTime.DayOfWeek == DayOfWeek.Sunday)
|
||||
{
|
||||
// 设置表头文字颜色为红色
|
||||
e.Appearance.ForeColor = Color.Red;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按键点击事件
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user