例如我们在设置审批流程时,往往需要设置限制时限,例如2天内审核好等等,这时候会遇到休息日,需要把休息日去掉,当然有各种各样复杂的情况,我们先把问题想得简单一些,就按普通的休息一整天,全公司都统一休息的方式。
下面是程序的运行效果,主要是把12个月展示在上面,有时候费力一些,黑色部分是表示休息,本想用红色显示,但是微软默认是黑色的,没能搞定
实现代码可以参考
//-------------------------------------------------------------------- // All Rights Reserved ,Copyright (C) 2012 , Hairihan TECH, Ltd. . //-------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Windows.Forms; using DotNet.Business; using DotNet.Utilities; namespace DotNet.WinForm { public partial class FrmHolidays : BaseForm { public FrmHolidays() { InitializeComponent(); } private void GetYearList() { // 绑定最近几年就可以了 for (int i = DateTime.Now.Year - 3; i < DateTime.Now.Year + 2; i++) { this.cmbYear.Items.Add(i.ToString()); } // 今年为默认选中 this.cmbYear.SelectedIndex = this.cmbYear.Items.Count - 2; } private void FrmHolidays_Load(object sender, EventArgs e) { this.GetYearList(); } /// <summary> /// 获取节假日 /// </summary> /// <param name="holiday">当前点中了某个日期了</param> private void GetYearDas(string holiday = null) { BaseHolidaysManager manager = new BaseHolidaysManager(this.UserInfo); if (!string.IsNullOrEmpty(holiday)) { int returnValue = manager.Delete(new KeyValuePair<string, object>(BaseHolidaysEntity.FieldHoliday, holiday)); if (returnValue == 0) { manager.AddHoliday(holiday, false); } } int year = int.Parse(this.cmbYear.SelectedItem.ToString()); this.mc.Enabled = false; if (this.mc.MinDate.Year <= year) { this.mc.MaxDate = new DateTime(year, 12, 31); this.mc.MinDate = new DateTime(year, 1, 1); } else { this.mc.MinDate = new DateTime(year, 1, 1); this.mc.MaxDate = new DateTime(year, 12, 31); } this.mc.Enabled = true; // 把这一年的变粗的都加上来,这个是后台处理程序,所以没考虑数据库性能的问题,每次都读取了一下,有需要时可以改进一下 string where = BaseHolidaysEntity.FieldHoliday + " >= '" + this.mc.MinDate.ToString(BaseSystemInfo.DateFormat) + "'" + " AND " + BaseHolidaysEntity.FieldHoliday + " <= '" + this.mc.MaxDate.ToString(BaseSystemInfo.DateFormat) + "'"; List<BaseHolidaysEntity> listEntity = manager.GetList<BaseHolidaysEntity>(where); List<DateTime> boldedDates = new List<DateTime>(); foreach (BaseHolidaysEntity entity in listEntity) { boldedDates.Add(DateTime.Parse(entity.Holiday)); } this.mc.BoldedDates = boldedDates.ToArray(); } private void cmbYear_SelectedIndexChanged(object sender, EventArgs e) { // 从数据库里读取出来节假日的设置 GetYearDas(); } private void btnInitializeYear_Click(object sender, EventArgs e) { BaseHolidaysManager manager = new BaseHolidaysManager(this.UserInfo); // 这里把周日,知道的5.1. 10.1 等节日进行休息日设置 int year = int.Parse(this.cmbYear.SelectedItem.ToString()); DateTime startDate = new DateTime(year, 1, 1); while (startDate.Year == year) { // 周六周日是默认休息日 if (startDate.DayOfWeek == DayOfWeek.Saturday || startDate.DayOfWeek == DayOfWeek.Sunday) { manager.AddHoliday(startDate.ToString(BaseSystemInfo.DateFormat)); } // 5.1 是休息日 // 10.1 是休息日 startDate = startDate.AddDays(1); } // 从数据库里读取出来节假日的设置 GetYearDas(); } private void mc_DateSelected(object sender, DateRangeEventArgs e) { GetYearDas(this.mc.SelectionStart.ToString(BaseSystemInfo.DateFormat)); } } }
还有几个函数相关函数,可以参考一下
//----------------------------------------------------------------- // All Rights Reserved , Copyright (C) 2012 , Hairihan TECH, Ltd. //----------------------------------------------------------------- using System; using System.Data; using System.Collections.Generic; using System.Linq; namespace DotNet.Business { using DotNet.Utilities; /// <summary> /// BaseHolidaysManager /// 节假日表 /// /// 修改记录 /// /// 2012.12.24 版本:1.0 JiRiGaLa 创建主键。 /// /// /// 版本:1.0 /// </summary> /// <author> /// <name>JiRiGaLa</name> /// <date>2012.12.24</date> /// </author> /// </summary> public partial class BaseHolidaysManager : BaseManager //, IBaseRoleManager { /// <summary> /// 计算截至日期为几号 /// </summary> /// <param name="currentDay">当前日期</param> /// <param name="days">几个工作日</param> /// <returns>应该在几号完成 yyyy-MM-dd</returns> public static string CalculateDays(DateTime currentDate, int days) { // 计算有几个节假日 string where = BaseHolidaysEntity.FieldHoliday + " >= '" + currentDate.ToString(BaseSystemInfo.DateFormat) + "'"; BaseHolidaysManager manager = new DotNet.Business.BaseHolidaysManager(); List<BaseHolidaysEntity> listEntity = manager.GetList<BaseHolidaysEntity>(where); DateTime endDay = currentDate; bool find = false; for (int i = 0; i < days; i++) { find = false; // 若这个日期是节假日,需要继续加一天 find = listEntity.Count(entity => !string.IsNullOrEmpty(entity.Holiday) && entity.Holiday.Equals(endDay.ToString(BaseSystemInfo.DateFormat), StringComparison.OrdinalIgnoreCase)) > 0; while (find) { // 若这个日期是节假日,需要继续加一天 endDay = endDay.AddDays(1); find = listEntity.Count(entity => !string.IsNullOrEmpty(entity.Holiday) && entity.Holiday.Equals(endDay.ToString(BaseSystemInfo.DateFormat), StringComparison.OrdinalIgnoreCase)) > 0; } } // 计算 return endDay.ToString(BaseSystemInfo.DateFormat); } /// <summary> /// 计算截至日期为几号 /// </summary> /// <param name="currentDay">当前日期 yyyy-MM-dd</param> /// <param name="days">几个工作日</param> /// <returns>应该在几号完成</returns> public static string CalculateDays(string currentDate, int days) { DateTime dateTime = DateTime.Parse(currentDate); return CalculateDays(dateTime, days); } /// <summary> /// 前日期与指定一个日期之间的, 工作日天数对吧? /// </summary> /// <param name="currentDate">开始日期 yyyy-MM-dd</param> /// <param name="endDate">结束日期 yyyy-MM-dd</param> /// <returns>工作日天数</returns> public static int CalculateWorkDays(string currentDate, string endDate) { int returnValue = 0; // 计算这2个日期相差几天 DateTime dateTime1 = DateTime.Parse(currentDate); DateTime dateTime2 = DateTime.Parse(endDate); TimeSpan timeSpan = new TimeSpan(dateTime2.Ticks).Subtract(new TimeSpan(dateTime1.Ticks)).Duration(); returnValue = timeSpan.Days; // 计算有几个节假日 string where = BaseHolidaysEntity.FieldHoliday + " >= '" + currentDate + "'" + " AND " + BaseHolidaysEntity.FieldHoliday + " <= '" + endDate + "'"; BaseHolidaysManager manager = new DotNet.Business.BaseHolidaysManager(); List<BaseHolidaysEntity> listEntity = manager.GetList<BaseHolidaysEntity>(where); // 在数据库里找还有几个工作日 returnValue = returnValue - listEntity.Count; return returnValue; } } }