你的位置:首页 > ASP.net教程

[ASP.net教程]日期跨星期处理(ASP .NET MVC)


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

  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.Name100                   });101                 }102                 haveDate.Add(date);103               }104               if (startTwo <= week && endTwo >= week)105               {106                 if (isArrange == 1 || isArrange == 2)107                 {108                   result.Add(new ArrangementViewModel109                   {110                     ArrangeDate = date.ToDateTime().ToString("yyyy-MM-dd"),111                     ArrangeStatus = "已排",112                     ArrangeMember = list.Name113                   });114                 }115                 haveDate.Add(date);116               }117             }118           }119         }120       }121       #endregion122 123       //获得无排班的日期124       if (isArrange == 0 || isArrange == 2)125       {126         haveDate = haveDate.Distinct().ToList();127         //若全部没有排班,则将所有日期赋给无排班的list128         if (haveDate.Count == 0)129         {130           foreach(var date in dates)131             if (!string.IsNullOrEmpty(date))132             {133               noDate.Add(date);134             }135         }136         else137         {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                 else157                 {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 ArrangementViewModel168           {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.最后,这个任务并不复杂,但是跨周的逻辑需要理清,花费了我不少时间,故记录下来,以供以后参考。