/// <summary>
/// 某年某月第几个星期几是几号
/// </summary>
/// <param name="year"></param>
/// <param name="month"></param>
/// <param name="weekIndex"></param>
/// <param name="week"></param>
/// <returns></returns>
private DateTime? GetDateTimeByWeekAndDay(int year, int month, int weekIndex, DayOfWeek week)
{
DateTime? result = null;
DateTime date = new DateTime(year, month, 1);
int startWeek = (int)date.DayOfWeek; //当前月 第一天是星期几
int week2 = (int)week;
if (startWeek <= week2)
{
date = date.AddDays((weekIndex - 1) * 7).AddDays(week2 - startWeek);
}
else
{
date = date.AddDays(weekIndex * 7).AddDays(week2 - startWeek);
}
if (date.Month == month)
{
return date;
}
if (result == null && weekIndex == 5)
{
return GetDateTimeByWeekAndDay(year, month, weekIndex - 1, week);
}
return null;
}
/// <summary>
///某个月是季度的第几月
/// </summary>
/// <param name="month"></param>
/// <returns></returns>
private int GetMonthSeqOfQuarterBySeason(int month)
{
int k = (month - 1) / 3;
return month - 3 * k;
}
/// <summary>
/// 某个月是半年的第几月
/// </summary>
/// <param name="month"></param>
/// <returns></returns>
private int GetMonthSeqOfQuarterByHalf(int month)
{
if (month > 6)
{
return month - 6;
}
else
{
return month;
}
}
/// <summary>
/// 提交生成日历
/// 已经生成订单的schedule和订单不变,删除其他schedule重新生成
/// </summary>
/// <param name="maintenancePlan"></param>
/// <returns></returns>
private async Task CreateScheduleAsync(MaintenancePlan maintenancePlan)
{
var maintenanceSchedules = new List<MaintenanceSchedule>();
foreach (var schedule in maintenancePlan.MaintenancePlanSchedules)
{
schedule.MaintenancePlan = maintenancePlan;
switch (schedule.Cycle)
{
case MaintenanceCycle.Weekly:
CreateWeeklyData(maintenanceSchedules, schedule);
break;
case MaintenanceCycle.Monthly:
CreatMonthlyData(maintenanceSchedules, schedule);
break;
case MaintenanceCycle.Season:
CreatSeasonData(maintenanceSchedules, schedule);
break;
case MaintenanceCycle.Half:
CreatHalfData(maintenanceSchedules, schedule);
break;
case MaintenanceCycle.Year:
CreatYearData(maintenanceSchedules, schedule);
break;
}
}
await DeleteSchedules(maintenancePlan.Id);
await _maintenanceScheduleRepository.InsertManyAsync(maintenanceSchedules);
}
/// <summary>
/// 生成年计划
/// </summary>
/// <param name="schedules"></param>
/// <param name="schedule"></param>
private void CreatYearData(List<MaintenanceSchedule> schedules, MaintenancePlanSchedule schedule)
{
var monthVal = schedule.Month;
var weekVal = schedule.Week;
var dayVal = schedule.Day;
var dt = DateTime.Now;
var year = dt.Year;
var month = dt.Month;
var dateCount = 0;
for (int i = 0; i <= MaintenanceConsts.YEARCOUNT; i++)
{
if (dateCount == MaintenanceConsts.YEARCOUNT)
{
break;
}
for (int j = 0; j < MaintenanceConsts.MONTHCOUNT; j++)
{
if (month == monthVal)
{
DateTime? result = GetDateTimeByWeekAndDay(year, month, weekVal, (DayOfWeek)dayVal);
if (result.HasValue && result.Value > dt)
{
dateCount++;
MaintenanceSchedule maintenanceSchedule = new MaintenanceSchedule();
maintenanceSchedule.OperatorDate = result.Value;
maintenanceSchedule.Cycle = MaintenanceCycle.Year;
maintenanceSchedule.Name = schedule.MaintenancePlan.Name + " " +
MaintenanceConsts.YEAR + " " + maintenanceSchedule.OperatorDate.ToString("yyyyMMdd");
maintenanceSchedule.StartTime = schedule.StartTime;
maintenanceSchedule.EndTime = schedule.EndTime;
schedules.Add(maintenanceSchedule);
}
}
month++;
if (month == 13)
{
month = 1;
year++;
}
}
}
}
/// <summary>
/// 生成半年计划
/// </summary>
/// <param name="schedules"></param>
/// <param name="schedule"></param>
private void CreatHalfData(List<MaintenanceSchedule> schedules, MaintenancePlanSchedule schedule)
{
var monthVal = schedule.Month;
var weekVal = schedule.Week;
var dayVal = schedule.Day;
var dt = DateTime.Now;
var year = dt.Year;
var month = dt.Month;
var dateCount = 0;
for (int i = 0; i <= MaintenanceConsts.HALFCOUNT; i++)
{
if (dateCount == MaintenanceConsts.HALFCOUNT)
{
break;
}
for (int j = 0; j < MaintenanceConsts.HALFMONTHCOUNT; j++)
{
if (GetMonthSeqOfQuarterByHalf(month) == monthVal)
{
DateTime? result = GetDateTimeByWeekAndDay(year, month, weekVal, (DayOfWeek)dayVal);
if (result.HasValue && result.Value > dt)
{
dateCount++;
MaintenanceSchedule maintenanceSchedule = new MaintenanceSchedule();
maintenanceSchedule.OperatorDate = result.Value;
maintenanceSchedule.Cycle = MaintenanceCycle.Half;
maintenanceSchedule.Name = schedule.MaintenancePlan.Name + " " +
MaintenanceConsts.HALF + " " + maintenanceSchedule.OperatorDate.ToString("yyyyMMdd");
maintenanceSchedule.StartTime = schedule.StartTime;
maintenanceSchedule.EndTime = schedule.EndTime;
schedules.Add(maintenanceSchedule);
}
}
month++;
if (month == 13)
{
month = 1;
year++;
}
}
}
}
/// <summary>
/// 生成季度计划
/// </summary>
/// <param name="schedules"></param>
/// <param name="schedule"></param>
private void CreatSeasonData(List<MaintenanceSchedule> schedules, MaintenancePlanSchedule schedule)
{
var monthVal = schedule.Month;
var weekVal = schedule.Week;
var dayVal = schedule.Day;
var dt = DateTime.Now;
var year = dt.Year;
var month = dt.Month;
var dateCount = 0;
//循环季度
for (int i = 0; i <= MaintenanceConsts.SEASONCOUNT; i++)
{
if (dateCount == MaintenanceConsts.SEASONCOUNT)
{
break;
}
//循环季度里的三个月
for (int j = 0; j < MaintenanceConsts.SEASONMONTHCOUNT; j++)
{
if (GetMonthSeqOfQuarterBySeason(month) == monthVal)
{
DateTime? result = GetDateTimeByWeekAndDay(year, month, weekVal, (DayOfWeek)dayVal);
if (result.HasValue && result.Value > dt)
{
dateCount++;
MaintenanceSchedule maintenanceSchedule = new MaintenanceSchedule();
maintenanceSchedule.OperatorDate = result.Value;//firstDate.AddDays(i * 7);
maintenanceSchedule.Cycle = MaintenanceCycle.Season;
maintenanceSchedule.Name = schedule.MaintenancePlan.Name + " " +
MaintenanceConsts.SEASON + " " + maintenanceSchedule.OperatorDate.ToString("yyyyMMdd");
maintenanceSchedule.StartTime = schedule.StartTime;
maintenanceSchedule.EndTime = schedule.EndTime;
schedules.Add(maintenanceSchedule);
}
}
month++;
if (month == 13)
{
month = 1;
year++;
}
}
}
}
/// <summary>
/// 生成月计划
/// chedule.Week第几周?
/// schedule.Day周几?
/// </summary>
/// <param name="schedules"></param>
/// <param name="schedule"></param>
private void CreatMonthlyData(List<MaintenanceSchedule> schedules, MaintenancePlanSchedule schedule)
{
var weekVal = schedule.Week;
var dayVal = schedule.Day;
var dt = DateTime.Now;
var year = dt.Year;
var month = dt.Month;
var dateCount = 0;
for (int i = 0; i <= MaintenanceConsts.MONTHCOUNT; i++)
{
if (dateCount == MaintenanceConsts.MONTHCOUNT)
{
break;
}
DateTime? result = GetDateTimeByWeekAndDay(year, month, weekVal, (DayOfWeek)dayVal);
if (result.HasValue && result.Value > dt)
{
dateCount++;
MaintenanceSchedule maintenanceSchedule = new MaintenanceSchedule();
maintenanceSchedule.OperatorDate = result.Value;//firstDate.AddDays(i * 7);
maintenanceSchedule.Cycle = MaintenanceCycle.Monthly;
maintenanceSchedule.Name = schedule.MaintenancePlan.Name + " " +
MaintenanceConsts.MONTHLY + " " + maintenanceSchedule.OperatorDate.ToString("yyyyMMdd");
maintenanceSchedule.StartTime = schedule.StartTime;
maintenanceSchedule.EndTime = schedule.EndTime;
schedules.Add(maintenanceSchedule);
}
month++;
if (month == 13)
{
month = 1;
year++;
}
}
}
/// <summary>
/// 生成周计划
/// </summary>
/// <param name="schedules"></param>
/// <param name="schedule"></param>
/// <returns></returns>
private void CreateWeeklyData(List<MaintenanceSchedule> schedules,
MaintenancePlanSchedule schedule)
{
//一年的周数
var dayVal = schedule.Day;
//如果7就是周日周日c# DayOfWeek是0
if (dayVal == 7)
{
dayVal = 0;
}
var firstDate = DateTime.Now;
for (int i = 0; i < MaintenanceConsts.WEEKDAYS; i++)
{
if ((int)DateTime.Now.AddDays(i).DayOfWeek == dayVal)
{
firstDate = DateTime.Now.AddDays(i);
break;
}
}
for (int i = 0; i < MaintenanceConsts.WEEKCOUNT; i++)
{
MaintenanceSchedule maintenanceSchedule = new MaintenanceSchedule();
maintenanceSchedule.OperatorDate = firstDate.AddDays(i * 7);
maintenanceSchedule.Cycle = MaintenanceCycle.Weekly;
maintenanceSchedule.Name = schedule.MaintenancePlan.Name + " " +
MaintenanceConsts.WEEKLY + " " + maintenanceSchedule.OperatorDate.ToString("yyyyMMdd");
maintenanceSchedule.StartTime = schedule.StartTime;
maintenanceSchedule.EndTime = schedule.EndTime;
schedules.Add(maintenanceSchedule);
}
}
/// <summary>
/// 生成多久的计划
/// 1.提交计划
/// 2.定时任务
/// </summary>
public const int WEEKCOUNT = 52;
/// <summary>
/// 一周有几天
/// </summary>
public const int WEEKDAYS = 7;
/// <summary>
/// 一年12月
/// </summary>
public const int MONTHCOUNT = 12;
/// <summary>
/// 一年四个季度
/// </summary>
public const int SEASONCOUNT = 4;
/// <summary>
/// 一年包含2个半年
/// </summary>
public const int HALFCOUNT = 2;
/// <summary>
/// 一年包含一个一年
/// </summary>
public const int YEARCOUNT = 1;
/// <summary>
/// 半年包含6个月
/// </summary>
public const int HALFMONTHCOUNT = 6;
/// <summary>
/// 一季度包含3个月
/// </summary>
public const int SEASONMONTHCOUNT = 3;
public const string YEAR = "Year";
public const string HALF = "Half";
public const string SEASON = "Season";
public const string MONTHLY = "Monthly";
public const string WEEKLY = "Weekly";