private void calculateTime(int type, int intervalNum, DateTime beginTime, DateTime endTime, List <FrequencyTiming> timingList, string guid, bool firstFlag) { FrequencyTiming ft = new FrequencyTiming(); ft.executeTime = beginTime; ft.PeriodFlag = firstFlag; ft.Identify = guid; timingList.Add(ft); DateTime newTime = beginTime; if (type == 1)//间隔分钟 { newTime = beginTime.AddMinutes(Convert.ToDouble(intervalNum)); } else if (type == 2)//间隔小时 { newTime = beginTime.AddHours(Convert.ToDouble(intervalNum)); } else if (type == 3)//间隔天 { newTime = beginTime.AddDays(Convert.ToDouble(intervalNum)); } if (newTime < endTime) { calculateTime(type, intervalNum, newTime, endTime, timingList, guid, false); } }
/// <summary> /// 获取频次时间点 /// </summary> /// <param name="frequencyID">频次ID</param> /// <param name="beginTime">开始时间</param> /// <param name="endTime">结束时间</param> /// <param name="firstCount">首次,无首次默认-1</param> /// <param name="lastCount">末次,无末次默认-1</param> /// <returns></returns> public List <FrequencyTiming> GetTiming(int frequencyID, DateTime beginTime, DateTime endTime, int firstCount, int lastCount) { List <FrequencyTiming> timingList = new List <FrequencyTiming>(); if (beginTime > endTime) { return(timingList); } string ExecuteCode = NewDao <IPublicManageDao>().GetExecuteCode(frequencyID); ExecuteCode = ExecuteCode == null ? "" : ExecuteCode; string[] codes = ExecuteCode.Split('@'); string execType = codes[0];//执行类型 switch (execType) { case "M": //间隔多少分钟执行(M@20) int minute = Convert.ToInt32(codes[1]); calculateTime(1, minute, beginTime, endTime, timingList, Guid.NewGuid().ToString(), true); break; case "H": //间隔多少小时执行(H@2) int hour = Convert.ToInt32(codes[1]); calculateTime(2, hour, beginTime, endTime, timingList, Guid.NewGuid().ToString(), true); break; case "D": if (codes.Length == 2) //间隔多少天执行(D@1) { int day = Convert.ToInt32(codes[1]); calculateTime(3, day, beginTime, endTime, timingList, Guid.NewGuid().ToString(), true); } else if (codes.Length == 4) //1天几次,每次时间点(D@1@3@1|10:30#1|12:30#1|20:00 一天三次) { int day = Convert.ToInt32(codes[1]); int count = Convert.ToInt32(codes[2]); string[] points = codes[3].Split('#'); List <string> strs = new List <string>(); foreach (string s in points) { if (!string.IsNullOrEmpty(s)) { strs.Add(s); } } string[] rePoints = strs.ToArray(); if (count == rePoints.Length) //避免执行代码错误 { calculatePoint(day, count, rePoints, beginTime, endTime, timingList, firstCount, lastCount); } } break; case "S": //立即执行,1次(S@1 立即执行一次) FrequencyTiming ft = new FrequencyTiming(); ft.executeTime = beginTime; ft.PeriodFlag = true; ft.Identify = Guid.NewGuid().ToString(); timingList.Add(ft); break; } return(timingList); }
private void calculatePoint(int day, int count, string[] points, DateTime beginTime, DateTime endTime, List <FrequencyTiming> timingList, int firstCount, int lastCount) { List <FrequencyTiming> _timingList = new List <FrequencyTiming>(); DateTime newTime = Convert.ToDateTime(beginTime.Date.ToString("yyyy-MM-dd") + " " + CycleTime);//从0点开始算 newTime = newTime.AddDays(Convert.ToDouble(day)); DateTime date = beginTime.Date; bool PeriodFlag = true;//首次设执行周期 string guid = Guid.NewGuid().ToString(); for (int i = 0; i < count; i++) { int index = Convert.ToInt32(points[i].Split('|')[0]); string time = points[i].Split('|')[1].ToString().Trim() + ":00"; DateTime thistime = Convert.ToDateTime(date.AddDays(index - 1).ToString("yyyy-MM-dd") + " " + time); if (thistime >= beginTime && thistime <= newTime && thistime <= endTime) { FrequencyTiming ft = new FrequencyTiming(); ft.executeTime = thistime; ft.PeriodFlag = PeriodFlag; PeriodFlag = false; ft.Identify = guid; _timingList.Add(ft); } } timingList.AddRange(_timingList); #region 处理首次 if (firstCount != -1)//首次 { timingList.Clear(); //List<FrequencyTiming> FT = _timingList.FindAll(x => x.GroupID == orderCheck.GroupID) if (_timingList.Count > firstCount)//首次小于正常频次 { _timingList.RemoveRange(firstCount, _timingList.Count - firstCount); } else if (_timingList.Count < firstCount)//首次大于正常频次 { int num = firstCount - _timingList.Count; string _guid = _timingList.Count == 0 ? Guid.NewGuid().ToString() : _timingList[0].Identify; for (int i = 1; i <= num; i++) { FrequencyTiming ft = new FrequencyTiming(); ft.executeTime = newTime.AddSeconds(-1 * i); ft.PeriodFlag = PeriodFlag; PeriodFlag = false; ft.Identify = _guid; _timingList.Add(ft); } } timingList.AddRange(_timingList); firstCount = -1; } #endregion if (newTime < endTime)//继续计算 { calculatePoint(day, count, points, newTime, endTime, timingList, -1, lastCount); } else//末次 { #region 处理末次 if (lastCount != -1)//设置了末次 { timingList.RemoveRange(timingList.Count - _timingList.Count, _timingList.Count); if (_timingList.Count > lastCount)//末次小于正常频次 { _timingList.RemoveRange(lastCount, _timingList.Count - lastCount); } else if (_timingList.Count < lastCount)//末次大于正常频次 { int num = lastCount - _timingList.Count; string _guid = _timingList.Count == 0 ? Guid.NewGuid().ToString() : _timingList[0].Identify; for (int i = 1; i <= num; i++) { FrequencyTiming ft = new FrequencyTiming(); ft.executeTime = endTime.AddSeconds(-1 * i); ft.PeriodFlag = false; ft.Identify = _guid; _timingList.Add(ft); } } timingList.AddRange(_timingList); lastCount = -1; } #endregion } }
/// <summary> /// 获取频次时间点 /// </summary> /// <param name="frequencyID">频次ID</param> /// <param name="beginTime">开始时间</param> /// <param name="endTime">结束时间</param> /// <param name="firstCount">首次,无首次默认-1</param> /// <param name="lastCount">末次,无末次默认-1</param> /// <returns></returns> public List <FrequencyTiming> GetTimingRef(int frequencyID, DateTime beginTime, ref DateTime endTime, int firstCount, int lastCount) { List <FrequencyTiming> timingList = new List <FrequencyTiming>(); if (beginTime > endTime) { return(timingList); } if (beginTime.AddMonths(3) < endTime) { return(timingList); } string ExecuteCode = frequencyID > 0?NewDao <IPublicManageDao>().GetExecuteCode(frequencyID): "D@1@1@1|10:30"; ExecuteCode = ExecuteCode == null ? "" : ExecuteCode; string[] codes = ExecuteCode.Split('@'); string execType = codes[0];//执行类型 switch (execType) { case "M": //间隔多少分钟执行(M@20) int minute = Convert.ToInt32(codes[1]); calculateTime(1, minute, beginTime, endTime, timingList, Guid.NewGuid().ToString(), true); endTime = timingList.Last <FrequencyTiming>().executeTime.AddMinutes(minute); break; case "H": //间隔多少小时执行(H@2) int hour = Convert.ToInt32(codes[1]); calculateTime(2, hour, beginTime, endTime, timingList, Guid.NewGuid().ToString(), true); endTime = timingList.Last <FrequencyTiming>().executeTime.AddHours(hour); break; case "D": if (codes.Length == 2) //间隔多少天执行(D@1) { int day = Convert.ToInt32(codes[1]); //D天N次的 需要将结束时间定到D天之后,但是如果结束时间-开始时间>D 则不作处理 if (day > 1) { TimeSpan timeSpan = DateTime.Parse(endTime.ToString("yyyy-MM-dd HH:mm:ss")) - DateTime.Parse(beginTime.ToString("yyyy-MM-dd 23:59:59")); decimal dDays = timeSpan.Days + ((timeSpan.Hours + timeSpan.Milliseconds + timeSpan.Seconds) > 0?1:0); int iPriod = Convert.ToInt32(Math.Ceiling(dDays / day)); endTime = Convert.ToDateTime(beginTime.AddDays(iPriod * day - 1).ToString("yyyy-MM-dd 23:59:59")); } calculateTime(3, day, beginTime, endTime, timingList, Guid.NewGuid().ToString(), true); } else if (codes.Length == 4) //1天几次,每次时间点(D@1@3@1|10:30#1|12:30#1|20:00 一天三次) { int day = Convert.ToInt32(codes[1]); int count = Convert.ToInt32(codes[2]); string[] points = codes[3].Split('#'); List <string> strs = new List <string>(); foreach (string s in points) { if (!string.IsNullOrEmpty(s)) { strs.Add(s); } } string[] rePoints = strs.ToArray(); //D天N次的 需要将结束时间定到D天之后,但是如果结束时间-开始时间>D 则不作处理 if (day > 1) { TimeSpan timeSpan = DateTime.Parse(endTime.ToString("yyyy-MM-dd HH:mm:ss")) - DateTime.Parse(beginTime.ToString("yyyy-MM-dd HH:mm:ss")); decimal dDays = timeSpan.Days + ((timeSpan.Hours + timeSpan.Milliseconds + timeSpan.Seconds) > 0 ? 1 : 0); int iPriod = Convert.ToInt32(Math.Ceiling(dDays / day)); endTime = Convert.ToDateTime(beginTime.AddDays(iPriod * day).ToString("yyyy-MM-dd 00:00:00")); } if (count == rePoints.Length) //避免执行代码错误 { calculatePoint(day, count, rePoints, beginTime, endTime, timingList, firstCount, lastCount); } } break; case "S": //立即执行,1次(S@1 立即执行一次) FrequencyTiming ft = new FrequencyTiming(); ft.executeTime = beginTime; ft.PeriodFlag = true; ft.Identify = Guid.NewGuid().ToString(); timingList.Add(ft); break; } return(timingList); }