例如我们在设置审批流程时,往往需要设置限制时限,例如2天内审核好等等,这时候会遇到休息日,需要把休息日去掉,当然有各种各样复杂的情况,我们先把问题想得简单一些,就按普通的休息一整天,全公司都统一休息的方式。

下面是程序的运行效果,主要是把12个月展示在上面,有时候费力一些,黑色部分是表示休息,本想用红色显示,但是微软默认是黑色的,没能搞定

实现代码可以参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//--------------------------------------------------------------------
// 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));
         }
     }
}

还有几个函数相关函数,可以参考一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//-----------------------------------------------------------------
// 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;
         }
     }
}