这个任务是安排某个小组的人员的排班情况,日期排班比较好处理,但是按星期排班的话有点麻烦,主要是有跨星期的情况,比如从周五到周二。本篇文章我将分析根据时间段获取某个小组的排班情况,并且不管是日期排班还是星期排班都以日期的形式显示出来,附加条件为根据姓名,小组名和是否排班可以得出不同的结果,先贴一些页面的截图用来了解具体逻辑。
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.最后,这个任务并不复杂,但是跨周的逻辑需要理清,花费了我不少时间,故记录下来,以供以后参考。
原标题:日期跨星期处理(ASP .NET MVC)
关键词:.NET