码迷,mamicode.com
首页 > Web开发 > 详细

日期跨星期处理(ASP .NET MVC)

时间:2016-07-21 17:51:13      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

  这个任务是安排某个小组的人员的排班情况,日期排班比较好处理,但是按星期排班的话有点麻烦,主要是有跨星期的情况,比如从周五到周二。本篇文章我将分析根据时间段获取某个小组的排班情况,并且不管是日期排班还是星期排班都以日期的形式显示出来,附加条件为根据姓名,小组名和是否排班可以得出不同的结果,先贴一些页面的截图用来了解具体逻辑。

  1.页面截图

  • 排班设置页

技术分享

 

  •  排班查询页

技术分享

 

  2.实现代码,主要讲解的是查询,暂时不涉及排班设置的代码,而且排班设置的逻辑比较简单,单纯的存储数据就行了。跨周的情况主要处理思路是将其分为两个时间段,比如周四到周二就分为周四到周日和周一到周二,这样就比较好处理了;还有最后的结果会有重复,因为是工作日排班和日期排班分开算的,在代码中之所以不用Distinct方法,是因为方法在这里无效,在代码里比较的是引用类型,始终是不相同的,所以只能用foreach循环去重。

  1         /// <summary>
  2         /// 排班查询接口
  3         /// 郑鑫2016年7月11日
  4         /// </summary>
  5         /// <param name="groupId">组ID</param>
  6         /// <param name="beginDate">开始日期</param>
  7         /// <param name="endDate">结束日期</param>
  8         /// <param name="jobNumber">姓名</param>
  9         /// <param name="isArrange">是否有排班</param>
 10         /// <returns></returns>
 11         public string GetAllArrangeMent(int groupId, string beginDate, string endDate, string jobNumber, int isArrange)
 12         {
 13             var result = new List<ArrangementViewModel>();
 14             //开始日期和结束日期必填且跨度不超过30天
 15             if (string.IsNullOrEmpty(beginDate) || string.IsNullOrEmpty(endDate))
 16             {
 17                 return null;
 18             }
 19             if (beginDate.ToDateTime().AddDays(30) < endDate.ToDateTime())
 20             {
 21                 return null;
 22             }
 23             var unArrangement = string.Empty;
 24             var beginDates = Convert.ToDateTime(beginDate);
 25             var endDates = Convert.ToDateTime(endDate).AddDays(86399F / 86400);
 26             //获取时间段内所有日期
 27             DateTime tempDate = beginDates;
 28             while (tempDate <= endDates)
 29             {
 30                 unArrangement += tempDate.ToString("yyyy-MM-dd") + ",";
 31                 tempDate = tempDate.AddDays(1);
 32             }
 33             //获取所填时间段的数组
 34             var dates = unArrangement.Split(,);
 35             //有排班和无排班的日期list
 36             var haveDate = new List<string>();
 37             var noDate = new List<string>();
 38             //获取List数据,获取数据的方法此处暂时不论
 39             var listResult = _woPublicRoleArrangementServices.GetAllArrangeMent(groupId, beginDates.ToString(), endDates.ToString(), jobNumber);
 40             
 41             #region 获取有排班的日期
 42             foreach (var date in dates)
 43             {
 44                 if (!string.IsNullOrEmpty(date))
 45                 {
 46                     var week = (int)date.ToDateTime().DayOfWeek;
 47                     //DayOfWeek方法中星期天为0,但是我的数据库中星期天是7
 48                     if (week == 0)
 49                     {
 50                         week = 7;
 51                     }
 52                     foreach (var list in listResult)
 53                     {
 54                         //日期排班
 55                         if (list.ArrangementType == (int)WorkOrderEnum.ArrangementTypeEnum.Date &&
 56                             (list.StartTime.ToDateTime() <= date.ToDateTime().Date && list.EndTime.ToDateTime().Date >= date.ToDateTime().Date))
 57                         {
 58                             if (isArrange == 1 || isArrange == 2)
 59                             {
 60                                 result.Add(new ArrangementViewModel
 61                                 {
 62                                     ArrangeDate = date.ToDateTime().ToString("yyyy-MM-dd"),
 63                                     ArrangeStatus = "已排",
 64                                     ArrangeMember = list.Name
 65                                 });
 66                             }
 67                             haveDate.Add(date);
 68                         }
 69                         //工作日排班
 70                         if (list.ArrangementType == (int)WorkOrderEnum.ArrangementTypeEnum.Weekday && list.StartWeekday <= list.EndWeekday &&
 71                             (list.StartWeekday <= week && list.EndWeekday >= week))
 72                         {
 73                             if (isArrange == 1 || isArrange == 2)
 74                             {
 75                                 result.Add(new ArrangementViewModel
 76                                 {
 77                                     ArrangeDate = date.ToDateTime().ToString("yyyy-MM-dd"),
 78                                     ArrangeStatus = "已排",
 79                                     ArrangeMember = list.Name
 80                                 });
 81                             }
 82                             haveDate.Add(date);
 83                         }
 84                         //跨周的工作日排班
 85                         if (list.ArrangementType == (int)WorkOrderEnum.ArrangementTypeEnum.Weekday && list.StartWeekday > list.EndWeekday)
 86                         {
 87                             int startOne = list.StartWeekday;
 88                             int endOne = (int)WorkOrderEnum.WeekdayArrangementEnum.Sunday;
 89                             int startTwo = (int)WorkOrderEnum.WeekdayArrangementEnum.Monday;
 90                             int endTwo = list.EndWeekday;
 91                             if (startOne <= week && endOne >= week)
 92                             {
 93                                 if (isArrange == 1 || isArrange == 2)
 94                                 {
 95                                     result.Add(new ArrangementViewModel
 96                                     {
 97                                         ArrangeDate = date.ToDateTime().ToString("yyyy-MM-dd"),
 98                                         ArrangeStatus = "已排",
 99                                         ArrangeMember = list.Name
100                                     });
101                                 }
102                                 haveDate.Add(date);
103                             }
104                             if (startTwo <= week && endTwo >= week)
105                             {
106                                 if (isArrange == 1 || isArrange == 2)
107                                 {
108                                     result.Add(new ArrangementViewModel
109                                     {
110                                         ArrangeDate = date.ToDateTime().ToString("yyyy-MM-dd"),
111                                         ArrangeStatus = "已排",
112                                         ArrangeMember = list.Name
113                                     });
114                                 }
115                                 haveDate.Add(date);
116                             }
117                         }
118                     }
119                 }
120             }
121             #endregion
122 
123             //获得无排班的日期
124             if (isArrange == 0 || isArrange == 2)
125             {
126                 haveDate = haveDate.Distinct().ToList();
127                 //若全部没有排班,则将所有日期赋给无排班的list
128                 if (haveDate.Count == 0)
129                 {
130                     foreach(var date in dates)
131                         if (!string.IsNullOrEmpty(date))
132                         {
133                             noDate.Add(date);
134                         }
135                 }
136                 else
137                 {
138                     foreach (var date in dates)
139                     {
140                         if (!string.IsNullOrEmpty(date))
141                         {
142                             foreach (var have in haveDate)
143                             {
144                                 //防止有排班的日期list为空后导致循环终止,无法继续为无排班的list赋值
145                                 if (date == have && date == haveDate.Last())
146                                 {
147                                     haveDate.Remove(have);
148                                     haveDate.Add("0");
149                                     break;
150                                 }
151                                 if (date == have)
152                                 {
153                                     haveDate.Remove(have);
154                                     break;
155                                 }
156                                 else
157                                 {
158                                     noDate.Add(date);
159                                 }
160                             }
161                         }
162                     }
163                 }
164                 noDate = noDate.Distinct().ToList();
165                 foreach (var date in noDate)
166                 {
167                     result.Add(new ArrangementViewModel
168                     {
169                         ArrangeDate = date.ToDateTime().ToString("yyyy-MM-dd"),
170                         ArrangeStatus = "未排",
171                         ArrangeMember = "--"
172                     });
173                 }
174             }
175             //结果去重
176             for (int i = 0; i < result.Count - 1; i++)
177             {
178                 if (result[i].ArrangeStatus == "已排")
179                 {
180                     for (int j = result.Count - 1; j > i; j--)
181                     {
182                         if (result[i].ArrangeDate == result[j].ArrangeDate && result[i].ArrangeMember == result[j].ArrangeMember)
183                         {
184                             result.Remove(result[j]);
185                         }
186                         if (result[i].ArrangeDate == result[j].ArrangeDate)
187                         {
188                             result[i].ArrangeMember += "," + result[j].ArrangeMember;
189                             result.Remove(result[j]);
190                         }
191                     }
192                 }
193             }
194             //按时间和姓名排序
195             result = result.OrderBy(item => item.ArrangeDate).ThenBy(i=>i.ArrangeMember).ToList();
196             return result.ToJson();
197         }

  3.最后,这个任务并不复杂,但是跨周的逻辑需要理清,花费了我不少时间,故记录下来,以供以后参考。

 

日期跨星期处理(ASP .NET MVC)

标签:

原文地址:http://www.cnblogs.com/zxxxx/p/5691385.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!