🍒 refactor(sysSerial): 优化流水号类型检查

This commit is contained in:
喵你个汪呀 2025-08-25 22:01:08 +08:00
parent 334a9a327b
commit 4558b53891
8 changed files with 28 additions and 19 deletions

View File

@ -22,7 +22,7 @@ public class TestCodeGenDemo : EntityBase
/// <summary> /// <summary>
/// 流水号 /// 流水号
/// </summary> /// </summary>
[BindSerial(nameof(SysSerialTypeProvider.Test))] [BindSerial(nameof(SerialTypeProvider.Test))]
[SugarColumn(ColumnDescription = "流水号", Length = 128)] [SugarColumn(ColumnDescription = "流水号", Length = 128)]
public string? SeqNo { get; set; } public string? SeqNo { get; set; }

View File

@ -21,7 +21,7 @@ public class SysSerialSeedData : ISqlSugarEntitySeedData<SysSerial>
{ {
return return
[ [
new(){ Id=1300000000101, Type=SysSerialTypeProvider.Test, ResetInterval=ResetIntervalEnum.Day, Formater="T{yyyy}{MM}{SEQ}", Seq=0, Min=1, Max=9999999, Expy=DateTime.Parse("2025-01-01 12:00:00"), TenantId=SqlSugarConst.DefaultTenantId, OrderNo=100 }, new(){ Id=1300000000101, Type=SerialTypeProvider.Test, ResetInterval=ResetIntervalEnum.Day, Formater="T{yyyy}{MM}{SEQ}", Seq=0, Min=1, Max=9999999, Expy=DateTime.Parse("2025-01-01 12:00:00"), TenantId=SqlSugarConst.DefaultTenantId, OrderNo=100 },
]; ];
} }
} }

View File

@ -9,7 +9,7 @@ namespace Admin.NET.Application;
/// <summary> /// <summary>
/// 扩展流水号插槽 /// 扩展流水号插槽
/// </summary> /// </summary>
public class SysSerialSlotProvider : ISysSerialSlotProvider public class SerialSlotProvider : ISerialSlotProvider
{ {
private static Lazy<UserManager> UserManager => new(() => App.GetService<UserManager>()); private static Lazy<UserManager> UserManager => new(() => App.GetService<UserManager>());
public Dictionary<string, Func<long, long, DateTime, string>> GetSlotMap() public Dictionary<string, Func<long, long, DateTime, string>> GetSlotMap()

View File

@ -9,7 +9,7 @@ namespace Admin.NET.Application;
/// <summary> /// <summary>
/// 业务流水号类型常量 /// 业务流水号类型常量
/// </summary> /// </summary>
public class SysSerialTypeProvider : ISysSerialTypeProvider public class SerialTypeProvider : ISerialTypeProvider
{ {
/// <summary> /// <summary>
/// 测试流水号 /// 测试流水号

View File

@ -912,4 +912,10 @@ public enum ErrorCodeEnum
/// </summary> /// </summary>
[ErrorCodeItemMetadata("无效的流水号类型:{0}")] [ErrorCodeItemMetadata("无效的流水号类型:{0}")]
S0007, S0007,
/// <summary>
/// 存在相同流水号类型请检查所有实现了ISerialTypeProvider接口的类字段
/// </summary>
[ErrorCodeItemMetadata("存在相同流水号类型请检查所有实现了ISerialTypeProvider接口的类字段")]
S0008,
} }

View File

@ -7,9 +7,9 @@
namespace Admin.NET.Core.Service; namespace Admin.NET.Core.Service;
/// <summary> /// <summary>
/// 系统流水号插槽接口 /// 流水号插槽提供者接口
/// </summary> /// </summary>
public interface ISysSerialSlotProvider public interface ISerialSlotProvider
{ {
public Dictionary<string, Func<long, long, DateTime, string>> GetSlotMap(); public Dictionary<string, Func<long, long, DateTime, string>> GetSlotMap();
} }

View File

@ -7,8 +7,8 @@
namespace Admin.NET.Core; namespace Admin.NET.Core;
/// <summary> /// <summary>
/// 系统流水号类型常量提供者接口 /// 流水号类型提供者接口
/// </summary> /// </summary>
public class ISysSerialTypeProvider public interface ISerialTypeProvider
{ {
} }

View File

@ -134,15 +134,18 @@ public class SysSerialService : IDynamicApiController, ITransient
[DisplayName("获取流水号类型"), HttpGet] [DisplayName("获取流水号类型"), HttpGet]
public List<SelectListItem> GetTypeList() public List<SelectListItem> GetTypeList()
{ {
return _sysCacheService.GetOrAdd(CacheConst.KeySysSerialType, _ => var typeList = _sysCacheService.Get<List<SelectListItem>>(CacheConst.KeySysSerialType);
{ if (typeList != null) return typeList;
return App.EffectiveTypes
.Where(u => !u.IsInterface && u.IsClass && u.HasImplementedRawGeneric(typeof(ISysSerialTypeProvider))) typeList = App.EffectiveTypes
.SelectMany(u => u.GetFields()) .Where(u => !u.IsInterface && u.IsClass && u.HasImplementedRawGeneric(typeof(ISerialTypeProvider)))
.DistinctBy(u => u.Name) .SelectMany(u => u.GetFields())
.Select(u => new SelectListItem(u.GetCustomAttribute<DescriptionAttribute>()?.Description ?? u.Name, u.Name)) .Select(u => new SelectListItem(u.GetCustomAttribute<DescriptionAttribute>()?.Description ?? u.Name, u.Name))
.ToList(); .ToList();
});
if (typeList.GroupBy(u => u.Value).Any(u => u.Count() > 1)) throw Oops.Oh(ErrorCodeEnum.S0008);
_sysCacheService.Set(CacheConst.KeySysSerialType, typeList);
return typeList;
} }
/// <summary> /// <summary>
@ -332,8 +335,8 @@ public class SysSerialService : IDynamicApiController, ITransient
// 扩展插槽提供者 // 扩展插槽提供者
var providers = App.EffectiveTypes var providers = App.EffectiveTypes
.Where(u => !u.IsInterface && u.IsClass && u.HasImplementedRawGeneric(typeof(ISysSerialSlotProvider))) .Where(u => !u.IsInterface && u.IsClass && u.HasImplementedRawGeneric(typeof(ISerialSlotProvider)))
.Select(u => (ISysSerialSlotProvider)Activator.CreateInstance(u)) .Select(u => (ISerialSlotProvider)Activator.CreateInstance(u))
.ToList(); .ToList();
foreach (var provider in providers) foreach (var provider in providers)
{ {