소스 검색

期满时间

Dun.Jason 4 달 전
부모
커밋
8f614c9369
1개의 변경된 파일106개의 추가작업 그리고 12개의 파일을 삭제
  1. 106 12
      src/Hotline/Settings/TimeLimitDomain/ExpireTimeSupplier/WorkDaySupplier.cs

+ 106 - 12
src/Hotline/Settings/TimeLimitDomain/ExpireTimeSupplier/WorkDaySupplier.cs

@@ -182,13 +182,23 @@ public class WorkDaySupplier : IExpireTimeSupplier, IScopeDependency
                 startTimeOne = startTimeOne.AddSeconds(scondsOne);
                 break;
             case 1:
+
+                //计算一天多少个工作小时
+                var durationType1 = WorkEndTime - WorkBeginTime;
+                double workMinutesType1 = durationType1.TotalMinutes;
+                double totalWorkMinutesType1 = (workMinutesType1 * timeConfig.Count) * (timeConfig.Percentage / 100.00);
+                double totalWorkMinutesOneType1 = (workMinutesType1 * timeConfig.Count) * (timeConfig.PercentageOne / 100.00);
+
+                #region 计算期满时间
                 if (!isWorkSend)
                 {
                     beginTime = WorkBeginTime;
+                    startTime = WorkBeginTime;
+                    startTimeOne = WorkBeginTime;
                 }
-                while(true)
+                while (true)
                 {
-                   
+
                     if (!await IsWorkDay(beginTime))
                         beginTime = beginTime.AddDays(1);
                     else
@@ -197,7 +207,7 @@ public class WorkDaySupplier : IExpireTimeSupplier, IScopeDependency
                 int w = timeConfig.Count;
                 int days = 1;
                 while (true && w != 0)
-                {   
+                {
                     if (await IsWorkDay(beginTime.AddDays(days)))
                     {
                         beginTime = beginTime.AddDays(days);
@@ -211,11 +221,11 @@ public class WorkDaySupplier : IExpireTimeSupplier, IScopeDependency
                     }
                 }
                 beginTime = beginTime.AddSeconds(-1);
-                while(true)
+                while (true)
                 {
-                    if(await IsWorkDay(beginTime))
+                    if (await IsWorkDay(beginTime))
                     {
-                        if (beginTime< DateTime.Parse(beginTime.ToShortDateString()+" "+ timeConfig.WorkTime[0]+":00"))
+                        if (beginTime < DateTime.Parse(beginTime.ToShortDateString() + " " + timeConfig.WorkTime[0] + ":00"))
                         {
                             beginTime = DateTime.Parse(beginTime.AddDays(-1).ToShortDateString() + " " + timeConfig.WorkTime[1] + ":00");
                         }
@@ -224,20 +234,104 @@ public class WorkDaySupplier : IExpireTimeSupplier, IScopeDependency
                             break;
                         }
                     }
-                    else if(!await IsWorkDay(beginTime))
+                    else if (!await IsWorkDay(beginTime))
                     {
-                        beginTime = DateTime.Parse(beginTime.AddDays(-1).ToShortDateString() +" "+ timeConfig.WorkTime[1] + ":00");
+                        beginTime = DateTime.Parse(beginTime.AddDays(-1).ToShortDateString() + " " + timeConfig.WorkTime[1] + ":00");
                     }
                     //else
                     //{
                     //    beginTime = beginTime.AddDays(1);
                     //}
                 }
+                #endregion
+
+                //计算即将超期时间
+                while (true)
+                {
+                    if (!await IsWorkDay(startTime))
+                        startTime = startTime.AddDays(1);
+                    else
+                        break;
+                }
+
+                days = 1;
+                while (true && totalWorkMinutesType1 != 0)
+                {
+                    if (await IsWorkDay(startTime.AddDays(days)))
+                    {
+                        if (totalWorkMinutesType1 > workMinutesType1)
+                        {
+                            startTime = startTime.AddDays(days);
+                            totalWorkMinutesType1 = totalWorkMinutesType1 - workMinutesType1;
+                            days = 1;
+                        }
+                        else
+                        {
+                            if (startTime.AddMinutes(totalWorkMinutesType1) > DateTime.Parse(startTime.ToShortDateString() + " " + timeConfig.WorkTime[1] + ":00"))
+                            {
+                                totalWorkMinutesType1 = totalWorkMinutesType1 - ((DateTime.Parse(startTime.ToShortDateString() + " " + timeConfig.WorkTime[1] + ":00") - startTime).TotalMinutes);
+                                startTime = startTime.AddDays(days);
+                                startTime = DateTime.Parse(startTime.ToShortDateString() + " " + timeConfig.WorkTime[0] + ":00").AddMinutes(totalWorkMinutesType1);
+                                totalWorkMinutesType1 = 0;
+                                days = 1;
+                            }
+                            else
+                            {
+                                startTime = startTime.AddMinutes(totalWorkMinutesType1);
+                                totalWorkMinutesType1 = 0;
+                                days = 1;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        days++;
+                    }
+                }
+
+                //计算50%即将超期时间
+                while (true)
+                {
+                    if (!await IsWorkDay(startTimeOne))
+                        startTimeOne = startTimeOne.AddDays(1);
+                    else
+                        break;
+                }
 
-                var scondsPlan = (beginTime - startTime).TotalSeconds * (timeConfig.Percentage / 100.00);
-                startTime = startTime.AddSeconds(scondsPlan);
-                var scondsPlanOne = (beginTime - startTimeOne).TotalSeconds * (timeConfig.PercentageOne / 100.00);
-                startTimeOne = startTimeOne.AddSeconds(scondsPlanOne);
+                days = 1;
+                while (true && totalWorkMinutesOneType1 != 0)
+                {
+                    if (await IsWorkDay(startTimeOne.AddDays(days)))
+                    {
+                        if (totalWorkMinutesOneType1 > workMinutesType1)
+                        {
+                            startTimeOne = startTimeOne.AddDays(days);
+                            totalWorkMinutesOneType1 = totalWorkMinutesOneType1 - workMinutesType1;
+                            days = 1;
+                        }
+                        else if (totalWorkMinutesOneType1 <= workMinutesType1)
+                        {
+                            if (startTimeOne.AddMinutes(totalWorkMinutesOneType1) > DateTime.Parse(startTimeOne.ToShortDateString() + " " + timeConfig.WorkTime[1] + ":00"))
+                            {
+                                totalWorkMinutesOneType1 = totalWorkMinutesOneType1 - ((DateTime.Parse(startTimeOne.ToShortDateString() + " " + timeConfig.WorkTime[1] + ":00") - startTimeOne).TotalMinutes);
+                                startTimeOne = startTimeOne.AddDays(days);
+                                startTimeOne = DateTime.Parse(startTimeOne.ToShortDateString() + " " + timeConfig.WorkTime[0] + ":00").AddMinutes(totalWorkMinutesOneType1);
+                                totalWorkMinutesOneType1 = 0;
+                                days = 1;
+                            }
+                            else
+                            {
+                                startTimeOne = startTimeOne.AddMinutes(totalWorkMinutesOneType1);
+                                totalWorkMinutesOneType1 = 0;
+                                days = 1;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        days++;
+                    }
+                }
                 break;
             case 2:
                 //计算一天多少个工作小时