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 + -
显示快捷键?