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