submitlvreq.aspx.cs
来自「基于.net(c#+sql)人事管理系统」· CS 代码 · 共 527 行 · 第 1/2 页
CS
527 行
lblErrorMsg.Text = "请检查输入日期的正确性";
lblTotalHours.Text = "";
return;
}
else
{
lblErrorMsg.Text = "";
}
//在界面上显示请假的总小时数。
lblTotalHours.Text = iTotalHours.ToString() + "小时";
}
/// <summary>
/// 该函数根据用户选定的请假日期,返回请假的总小时数,如果请假日期不正确,则返回 0。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
int CalculateHours()
{
//计算日历控件当月所包含的国定假日。
ReCalculateHoliday();
string strStartDate, strEndDate;
//拼接得到用户请假的起始时间字符串(日期+小时)。
strStartDate = cldStartDate.SelectedDate.ToString("yyyy-MM-dd ") + cmbStartTime.SelectedItem.ToString();
//拼接得到用户请假的结束时间字符串(日期+小时)。
strEndDate = cldEndDate.SelectedDate.ToString("yyyy-MM-dd ") + cmbEndTime.SelectedItem.ToString();
//将时间字符串转换成日期数据类型。
DateTime dtStart = DateTime.Parse(strStartDate);
DateTime dtEnd = DateTime.Parse(strEndDate);
//下面进行总时数统计:
int iTotalHours = 0;
//如果开始时间在星期六,则后移两天。
if ( dtStart.DayOfWeek == DayOfWeek.Saturday )
{
dtStart = DateTime.Parse(dtStart.AddDays(2).ToString("yyyy-MM-dd 9:00"));
}
//如果开始时间在星期天,则后移一天。
if ( dtStart.DayOfWeek == DayOfWeek.Sunday )
{
dtStart = DateTime.Parse(dtStart.AddDays(1).ToString("yyyy-MM-dd 9:00"));
}
//如果结束时间在星期六,则后移两天。
if ( dtEnd.DayOfWeek == DayOfWeek.Saturday )
{
dtEnd = DateTime.Parse(dtEnd.AddDays(2).ToString("yyyy-MM-dd 9:00"));
}
//如果结束时间在星期天,则后移一天。
if ( dtEnd.DayOfWeek == DayOfWeek.Sunday )
{
dtEnd = DateTime.Parse(dtEnd.AddDays(1).ToString("yyyy-MM-dd 9:00"));
}
//如果开始时间大于结束时间,则设两者相等。
if ( DateTime.Compare(dtStart, dtEnd) >= 0 )
{
dtStart = dtEnd;
}
//循环直至开始时间和结束时间为同一天。
while ( dtStart.ToString("yyyyMMdd") != dtEnd.ToString("yyyyMMdd") )
{
if ( dtStart.DayOfWeek != DayOfWeek.Saturday && dtStart.DayOfWeek != DayOfWeek.Sunday )
{
//如果开始时间为工作日(即不是双休日,也不是国定假日)。
//检查是否为国定假日
if ( !IsHoliday(dtStart) )
{
//如果为工作日,则请假的总小时数增加。
iTotalHours += 8;
}
}
//开始时间向后推移一天。
dtStart = dtStart.AddDays(1);
}
if ( iTotalHours == 0 && IsHoliday(dtStart) )
{
//如果前面的计算没有有效的小时数,且结束时间为国定假日,则应返回 0。
iTotalHours = 0;
}
else
{
int iStartHour, iEndHour;
//获取开始时间中的小时信息。
iStartHour = int.Parse(dtStart.ToString("HH"));
//获取结束时间中的小时信息。
iEndHour = int.Parse(dtEnd.ToString("HH"));
//跳过中间休息的一个小时
if ( iStartHour <= 12 && iEndHour > 12 )
{
iStartHour += 1;
}
//总小时数加上一天内的小时差。
iTotalHours += iEndHour - iStartHour;
}
//返回总小时数。
return iTotalHours;
}
/// <summary>
/// 该函数计算某指定日期是否为国定假日。
/// 参数 dt:指定的日期。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
bool IsHoliday( DateTime dt )
{
int iCount;
bool bIsHoliday = false;
//指定日期和数组 alHolidayL 中保存的国定假日进行比较,相同则说明该日期为国定假日。
for ( iCount = 0; iCount<= alHolidayL.Count - 1; iCount++ )
{
if ( dt.ToString("MM/dd") == ((DateTime)alHolidayL[iCount]).ToString("MM/dd") )
{
bIsHoliday = true;
}
}
//指定日期和数组 alHolidayR 中保存的国定假日进行比较,相同则说明该日期为国定假日。
for ( iCount = 0; iCount<= alHolidayR.Count - 1; iCount++ )
{
if ( dt.ToString("MM/dd") == ((DateTime)alHolidayR[iCount]).ToString("MM/dd") )
{
bIsHoliday = true;
}
}
return bIsHoliday;
}
/// <summary>
/// 当用户对“开始时间”日历控件进行操作时,该方法重新计算国定假日。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cldStartDate_SelectionChanged(object sender, System.EventArgs e)
{
ReCalculateHoliday();
}
/// <summary>
/// 当用户对“结束时间”日历控件进行操作时,该方法重新计算国定假日。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cldEndDate_SelectionChanged(object sender, System.EventArgs e)
{
ReCalculateHoliday();
}
/// <summary>
/// 当用户单击“提交”按钮时,该方法将请假请求保存到数据库中。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSubmit_Click(object sender, System.EventArgs e)
{
int iTotalHours;
lblTotalHours.Text = "";
//检查“请假事由”文本框是否为空,是则显示出错信息并退出。
if ( txtReason.Text.Trim() == "" )
{
lblErrorMsg.Text = "请假事由不能为空";
return;
}
//计算用户请假的总小时数。
iTotalHours = CalculateHours();
//如果请假时间非法,则显示出错信息并退出。
if ( iTotalHours <= 0 )
{
lblErrorMsg.Text = "请检查输入日期的正确性";
return;
}
//检查用户请假的小时数是否超过了可请范围,是则显示出错信息并退出。
if ( iTotalHours > int.Parse(lblALhours.Text) )
{
lblErrorMsg.Text = "请假的小时数超过了可请的年假数!";
return;
}
int iNormalDays = 0;
//从数据库中获取常规请假天数,一般为 5 天。
DBUtils.SubmitLvReq.GetNormalLeaveDays(ref iNormalDays);
//如果用户请假超过了常规请假天数,则只有总经理才可审批。
if ( iTotalHours > 8 * iNormalDays )
{
cmbApproverList.SelectedIndex = cmbApproverList.Items.Count - 1;
}
//获取请假审批者的员工编号。
int iApproverID;
iApproverID = int.Parse(cmbApproverList.SelectedItem.Value);
//拼接请假的开始时间和结束字符串。
string strStartDate, strEndDate;
strStartDate = cldStartDate.SelectedDate.ToString("yyyy-MM-dd ") + cmbStartTime.SelectedItem.ToString();
strEndDate = cldEndDate.SelectedDate.ToString("yyyy-MM-dd ") + cmbEndTime.SelectedItem.ToString();
//将时间字符串转换成日期数据类型。
DateTime dtStart = DateTime.Parse(strStartDate);
DateTime dtEnd = DateTime.Parse(strEndDate);
//向数据库提交该请假请求。
int iRetValue;
int iEmpID;
iEmpID= int.Parse ((string)(Session["EmployeeID"]));
iRetValue = DBUtils.SubmitLvReq.AddLeaveReq(iEmpID, DateTime.Now, dtStart, dtEnd, iApproverID, iTotalHours, txtReason.Text.Trim());
if ( iRetValue == (int)DBResult.Success )
{
//如果数据库操作成功,则显示提示信息,并相应的减少用户可请的年假小时数。
lblErrorMsg.Text = "";
Response.Write("<script>alert('已成功提交请假记录!')</script>");
lblALhours.Text = (int.Parse(lblALhours.Text) - iTotalHours).ToString();
}
else
{
//如果数据库操作失败,一般是重复提交相同的请假时间段引起的,显示出错信息并退出。
lblErrorMsg.Text = "提交请假记录失败!";
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?