Explorar o código

Merge branch 'master' of https://gitee.com/masuit/Masuit.Tools

lazy y chen %!s(int64=2) %!d(string=hai) anos
pai
achega
5d66db4ded

+ 80 - 0
Masuit.Tools.Abstractions/DateTimeExt/DateTimeHelper.cs

@@ -1,6 +1,8 @@
 using System;
 using System;
+using System.Collections.Generic;
 using System.Diagnostics;
 using System.Diagnostics;
 using System.Globalization;
 using System.Globalization;
+using System.Linq;
 using System.Runtime.InteropServices;
 using System.Runtime.InteropServices;
 
 
 namespace Masuit.Tools.DateTimeExt
 namespace Masuit.Tools.DateTimeExt
@@ -520,6 +522,84 @@ namespace Masuit.Tools.DateTimeExt
             strResout += sec + "秒";
             strResout += sec + "秒";
             return strResout;
             return strResout;
         }
         }
+
+        /// <summary>
+        /// 时间段并集
+        /// </summary>
+        /// <param name="destination"></param>
+        /// <param name="sources"></param>
+        /// <typeparam name="T"></typeparam>
+        /// <returns></returns>
+        public static ICollection<T> GetUnionSet<T>(this T destination, List<T> sources) where T : ITimePeriod, new()
+        {
+            var result = true;
+            ICollection<T> frames = new List<T>();
+
+            var timeFrames = sources.Where(frame =>
+                !(destination.StartTime > frame.EndTime || destination.EndTime < frame.StartTime)).ToList();
+            if (timeFrames.Any())
+                foreach (var frame in timeFrames)
+                {
+                    frames.Add(frame);
+                    sources.Remove(frame);
+                }
+
+            if (!frames.Any()) return frames;
+            var timePeriod = new T()
+            {
+                EndTime = frames.OrderBy(frame => frame.EndTime).Max(frame => frame.EndTime),
+                StartTime = frames.OrderBy(frame => frame.StartTime).Min(frame => frame.StartTime)
+            };
+
+            while (result)
+            {
+                var maxTimeFrame = GetUnionSet<T>(timePeriod, sources);
+                if (!maxTimeFrame.Any())
+                    result = false;
+                else
+                    foreach (var frame in maxTimeFrame)
+                        frames.Add(frame);
+            }
+
+            return frames;
+        }
+
+        /// <summary>
+        /// 获取一批时间段内存在相互重叠的最大时间段
+        /// </summary>
+        /// <param name="destination">基础时间段</param>
+        /// <param name="sources">一批时间段</param>
+        /// <typeparam name="T"></typeparam>
+        /// <returns></returns>
+        /// <remarks>源数据sources 会受到影响</remarks>
+        public static T GetMaxTimePeriod<T>(this T destination, List<T> sources) where T : ITimePeriod, new()
+        {
+            var list = sources.Select(period => new T()
+            {
+                EndTime = period.EndTime,
+                StartTime = period.StartTime,
+            }).ToList();
+
+            var timePeriods = GetUnionSet(destination, list);
+            return new T()
+            {
+                EndTime = timePeriods.OrderBy(period => period.EndTime).Max(period => period.EndTime),
+                StartTime = timePeriods.OrderBy(period => period.StartTime).Min(period => period.StartTime)
+            };
+        }
+    }
+
+    public interface ITimePeriod
+    {
+        /// <summary>
+        /// 起始时间
+        /// </summary>
+        public DateTime StartTime { get; set; }
+
+        /// <summary>
+        /// 终止时间
+        /// </summary>
+        public DateTime EndTime { get; set; }
     }
     }
 
 
     /// <summary>
     /// <summary>

+ 2 - 2
Masuit.Tools.AspNetCore/Masuit.Tools.AspNetCore.csproj

@@ -59,9 +59,9 @@
         <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[5.0.17]" />
         <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[5.0.17]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net6'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'net6'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[6.0.18]" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[6.0.19]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net7'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'net7'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.7" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.8" />
     </ItemGroup>
     </ItemGroup>
 </Project>
 </Project>

+ 2 - 2
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -48,10 +48,10 @@ github:https://github.com/ldqk/Masuit.Tools
         <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[5.0.17]" />
         <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[5.0.17]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net6'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'net6'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[6.0.18]" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="[6.0.19]" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net7'">
     <ItemGroup Condition=" '$(TargetFramework)' == 'net7'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.7" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.8" />
     </ItemGroup>
     </ItemGroup>
     <ItemGroup>
     <ItemGroup>
       <Compile Remove="..\Masuit.Tools.Abstractions\Mapping\**" />
       <Compile Remove="..\Masuit.Tools.Abstractions\Mapping\**" />