SVN-Revision: r362
This commit is contained in:
tdx
2025-03-20 12:37:23 +00:00
parent d4d0103708
commit d8885630b9
+371 -60
View File
@@ -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>