public static IEnumerable <ProductionPlan> GetDetails(DateTime time, Workshop workshop, StatisticProcessTimeEnum timeType, int range, string step) { var res = new List <ProductionPlan>(); try { var shiftTime = DateTimeExtend.GetDayWorkDay(workshop.Shifts, workshop.StatisticTimeList, time); IEnumerable <ProductionPlan> data = null; var startTime = default(DateTime); var endTime = default(DateTime); switch (timeType) { case StatisticProcessTimeEnum.小时: break; case StatisticProcessTimeEnum.日: endTime = shiftTime.Item1.Date; startTime = shiftTime.Item1.AddDays(1 - range).Date; break; case StatisticProcessTimeEnum.周: var week = DateTimeExtend.GetWorkWeek(0, time, workshop.StatisticTimeList); endTime = week.Item2.Date; startTime = week.Item1.AddWeeks(-range).Date; break; case StatisticProcessTimeEnum.月: var month = DateTimeExtend.GetWorkMonth(0, time, workshop.StatisticTimeList); endTime = month.Item2.Date; startTime = month.Item1.AddMonths(-range).Date; break; case StatisticProcessTimeEnum.年: var year = DateTimeExtend.GetWorkYear(0, time, workshop.StatisticTimeList); endTime = year.Item2.Date; startTime = year.Item1.AddYears(-range).Date; break; } if (startTime == default(DateTime) || endTime == default(DateTime)) { return(res); } data = GetDetails(startTime, endTime, step); var productionList = data.Select(x => x.Production).Distinct(); switch (timeType) { case StatisticProcessTimeEnum.小时: break; case StatisticProcessTimeEnum.日: #region 日 for (var i = range - 1; i >= 0; i--) { var t = endTime.AddDays(-i); var sfTimes = new Tuple <DateTime, DateTime>(t, t.AddDays(1)); foreach (var production in productionList) { var tData = data.Where(x => x.Date.InSameRange(sfTimes) && x.Production == production); AddProduction(sfTimes.Item1, ref res, tData, production); } } #endregion break; case StatisticProcessTimeEnum.周: #region 周 for (var i = range; i > 0; i--) { var t = endTime.AddWeeks(-i); var week = DateTimeExtend.GetWeek(0, t); foreach (var production in productionList) { var tData = data.Where(x => { if (x.Date.InSameRange(week) && x.Production == production) { var sfTimes = new Tuple <DateTime, DateTime>(t, t.AddWeeks(1)); return(x.Date.InSameRange(sfTimes)); } return(false); }); AddProduction(week.Item1, ref res, tData, production); } } #endregion break; case StatisticProcessTimeEnum.月: #region 月 for (var i = range; i > 0; i--) { var t = endTime.AddMonths(-i); var month = DateTimeExtend.GetMonth(0, t); foreach (var production in productionList) { var tData = data.Where(x => { if (x.Date.InSameRange(month) && x.Production == production) { var sfTimes = new Tuple <DateTime, DateTime>(t, t.AddMonths(1)); return(x.Date.InSameRange(sfTimes)); } return(false); }); AddProduction(month.Item1, ref res, tData, production); } } #endregion break; case StatisticProcessTimeEnum.年: #region 年 for (var i = range; i > 0; i--) { var t = endTime.AddYears(-i); var year = DateTimeExtend.GetYear(0, t); foreach (var production in productionList) { var tData = data.Where(x => { if (x.Date.InSameRange(year) && x.Production == production) { var sfTimes = new Tuple <DateTime, DateTime>(t, t.AddYears(1)); return(x.Date.InSameRange(sfTimes)); } return(false); }); AddProduction(year.Item1, ref res, tData, production); } } #endregion break; } } catch (Exception e) { Log.Error(e); } return(res); }