fix
This commit is contained in:
parent
d4716e3faf
commit
a7d824151e
@ -2,6 +2,8 @@ using AutoMapper;
|
||||
using TrackCenter.Application.Dtos.Warning.Complete;
|
||||
using TrackCenter.Application.Dtos.Warning.Return;
|
||||
using TrackCenter.Application.Dtos.Warning.Transport;
|
||||
using TrackCenter.Domain.Aggregates.KPIAreaAggregate;
|
||||
using TrackCenter.Domain.Dtos.Forewarning;
|
||||
using TrackCenter.Domain.Dtos.Warning;
|
||||
|
||||
namespace TrackCenter.Application.AutoMapper;
|
||||
@ -13,5 +15,27 @@ public class WarningMapperProfile : Profile
|
||||
CreateMap<GetPageCompleteWarningDetailsInput, GetPageCompleteWarningDetailsInputVO>(MemberList.None);
|
||||
CreateMap<GetPageReturnWarningDetailsInput, GetPageReturnWarningDetailsInputVO>(MemberList.None);
|
||||
CreateMap<GetPageTransportWarningDetailsInput, GetPageTransportWarningDetailsInputVO>(MemberList.None);
|
||||
// kpi区域
|
||||
CreateMap<UpdateRuleAreaRequest, RuleAreaEntity>(MemberList.None);
|
||||
CreateMap<AddRuleAreaInfoRequest, RuleAreaInfoEntity>(MemberList.None)
|
||||
.ForMember(dest => dest.CountryCode, opt => opt.MapFrom(src => src.CountryCode))
|
||||
.ForMember(dest => dest.CountryName, opt => opt.MapFrom(src => src.CountryName))
|
||||
.ForMember(dest => dest.Province, opt => opt.MapFrom(src => src.Province))
|
||||
.ForMember(dest => dest.City, opt => opt.MapFrom(src => src.City))
|
||||
.ForMember(dest => dest.LeftPostcode, opt => opt.MapFrom(src => src.LeftPostCode))
|
||||
.ForMember(dest => dest.RightPostcode, opt => opt.MapFrom(src => src.RightPostCode))
|
||||
.ForMember(dest => dest.AreaId, opt => opt.MapFrom(src => src.AreaId));
|
||||
|
||||
CreateMap<CreateRuleAreaRequest, RuleAreaEntity>(MemberList.None)
|
||||
.ForMember(dest => dest.AppKey, opt => opt.MapFrom(src => src.AppKey))
|
||||
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name));
|
||||
|
||||
CreateMap<UpdateRuleAreaInfoRequest, RuleAreaInfoEntity>(MemberList.None)
|
||||
.ForMember(dest => dest.CountryCode, opt => opt.MapFrom(src => src.CountryCode))
|
||||
.ForMember(dest => dest.CountryName, opt => opt.MapFrom(src => src.CountryName))
|
||||
.ForMember(dest => dest.Province, opt => opt.MapFrom(src => src.Province))
|
||||
.ForMember(dest => dest.City, opt => opt.MapFrom(src => src.City))
|
||||
.ForMember(dest => dest.LeftPostcode, opt => opt.MapFrom(src => src.LeftPostCode))
|
||||
.ForMember(dest => dest.RightPostcode, opt => opt.MapFrom(src => src.RightPostCode));
|
||||
}
|
||||
}
|
||||
|
||||
92
src/TrackCenter.Application/Services/DictionaryService.cs
Normal file
92
src/TrackCenter.Application/Services/DictionaryService.cs
Normal file
@ -0,0 +1,92 @@
|
||||
using System.ComponentModel;
|
||||
using System.Reflection;
|
||||
|
||||
namespace TrackCenter.Application.Services;
|
||||
|
||||
/// <summary>
|
||||
/// 字典服务
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "应用服务")]
|
||||
public class DictionaryService : ApplicationService
|
||||
{
|
||||
private static readonly Dictionary<string, List<EnumCacheEntry>> EnumCache = new();
|
||||
|
||||
/// <summary>
|
||||
/// 列表
|
||||
/// </summary>
|
||||
/// <param name="type">枚举类型</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("Dictionary/GetList")]
|
||||
public List<EnumCacheEntry> GetList(string type)
|
||||
{
|
||||
// 优先读枚举值
|
||||
return GetKvsByEnumTypeName(type);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清除缓存
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
[HttpPost("Dictionary/CleanCache")]
|
||||
public void CleanCache(string type)
|
||||
{
|
||||
EnumCache.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取枚举下拉列表
|
||||
/// </summary>
|
||||
/// <param name="enumTypeName">枚举类型名称</param>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
private List<EnumCacheEntry> GetKvsByEnumTypeName(string enumTypeName)
|
||||
{
|
||||
// Check if the type is already cached
|
||||
if (EnumCache.TryGetValue(enumTypeName, out var res))
|
||||
{
|
||||
return res;
|
||||
}
|
||||
|
||||
// Load the assembly
|
||||
var assemblyName = "TrackCenter.Domain";
|
||||
var assembly = Assembly.Load(assemblyName);
|
||||
if (assembly == null)
|
||||
{
|
||||
throw new ArgumentException($"Assembly '{assemblyName}' could not be loaded.");
|
||||
}
|
||||
|
||||
// Get the enum type
|
||||
var enumType = assembly.GetType("TrackCenter.Domain.Enums." + enumTypeName);
|
||||
if (enumType == null || !enumType.IsEnum)
|
||||
{
|
||||
throw new ArgumentException($"The type '{enumTypeName}' is not a valid enum.");
|
||||
}
|
||||
|
||||
// Retrieve the descriptions and values
|
||||
var list = new List<EnumCacheEntry>();
|
||||
foreach (var value in enumType.GetEnumValues())
|
||||
{
|
||||
var name = value.ToString();
|
||||
var fieldInfo = enumType.GetField(name);
|
||||
var descriptionAttribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
|
||||
string description = descriptionAttribute != null ? descriptionAttribute.Description : name;
|
||||
list.Add(new EnumCacheEntry
|
||||
{
|
||||
Key = (int)value,
|
||||
Value = description
|
||||
});
|
||||
}
|
||||
|
||||
// Cache the result
|
||||
EnumCache[enumTypeName] = list;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public class EnumCacheEntry
|
||||
{
|
||||
public int Key { get; set; }
|
||||
|
||||
public string Value { get; set; } = null!;
|
||||
}
|
||||
}
|
||||
@ -4,6 +4,7 @@ using InterfaceForward.Domain.Shared.Helpers;
|
||||
using TrackCenter.Application.Dtos.TrackPush;
|
||||
using TrackCenter.Application.Helpers;
|
||||
using TrackCenter.Application.Services.Warning.Handlers;
|
||||
using TrackCenter.Domain.Aggregates.OrderAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackPushAggregate;
|
||||
using TrackCenter.Domain.Dtos.TrackPush;
|
||||
|
||||
@ -14,22 +15,12 @@ namespace TrackCenter.Application.Services.TrackPush;
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "轨迹推送")]
|
||||
[Route("/Track/PushConfig")]
|
||||
public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
public class TrackPushService(
|
||||
ITrackPushConfigRepository trackPushConfigRepository,
|
||||
TrackPushCacheService trackPushCacheService,
|
||||
IServiceProvider serviceProvider)
|
||||
: ApplicationServiceBase, ISingletonDependency
|
||||
{
|
||||
private readonly TrackPushCacheService _trackPushCacheService;
|
||||
private readonly ITrackPushConfigRepository _trackPushConfigRepository;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
public TrackPushService(
|
||||
ITrackPushConfigRepository trackPushConfigRepository,
|
||||
TrackPushCacheService trackPushCacheService,
|
||||
IServiceProvider serviceProvider)
|
||||
{
|
||||
_trackPushConfigRepository = trackPushConfigRepository;
|
||||
_trackPushCacheService = trackPushCacheService;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹推送配置列表
|
||||
/// </summary>
|
||||
@ -38,7 +29,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
[HttpPost("GetPage")]
|
||||
public async Task<PagedResult<GetTrackPushConfigPageOutputVO>> GetPageAsync([FromBody] KeywordsInputVO input)
|
||||
{
|
||||
return await _trackPushConfigRepository.GetPageAsync(input);
|
||||
return await trackPushConfigRepository.GetPageAsync(input);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -50,7 +41,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
public async Task<PagedResult<GetTrackPushContentPageOutputVO>> GetContentPageAsync(
|
||||
[FromBody] GetTrackPushContentPageInputVO input)
|
||||
{
|
||||
return await _trackPushConfigRepository.GetContentPageAsync(input);
|
||||
return await trackPushConfigRepository.GetContentPageAsync(input);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -61,7 +52,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
[HttpGet("GetDetail")]
|
||||
public async Task<GetTrackPushConfigDetailOutputVO> GetDetailAsync(int id)
|
||||
{
|
||||
return await _trackPushConfigRepository.GetDetailAsync(id);
|
||||
return await trackPushConfigRepository.GetDetailAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -72,7 +63,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
[HttpGet("GetContentDetail")]
|
||||
public async Task<GetTrackPushContentDetailOutputVO> GetContentDetailAsync(int id)
|
||||
{
|
||||
return await _trackPushConfigRepository.GetContentDetailAsync(id);
|
||||
return await trackPushConfigRepository.GetContentDetailAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -88,7 +79,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
Expression<Func<TrackPushConfigEntity, bool>> isAnyExp = x => x.Customer == input.Customer;
|
||||
if (input.Options == OptionTypeNoNull.修改) isAnyExp = isAnyExp.And(x => x.Id != input.Id);
|
||||
|
||||
if (await _trackPushConfigRepository.IsAnyAsync(isAnyExp))
|
||||
if (await trackPushConfigRepository.IsAnyAsync(isAnyExp))
|
||||
throw new BusinessException(message: "配置已存在");
|
||||
}
|
||||
|
||||
@ -107,28 +98,28 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
case OptionTypeNoNull.新增:
|
||||
var trackPushEntity = ObjectMapper.Map<EditTrackPushConfigInput, TrackPushConfigEntity>(input);
|
||||
|
||||
await _trackPushConfigRepository.InsertReturnIdentityAsync(trackPushEntity);
|
||||
await _trackPushCacheService.SetPushContentConfigsAsync(trackPushEntity.AppKey,
|
||||
await trackPushConfigRepository.InsertReturnIdentityAsync(trackPushEntity);
|
||||
await trackPushCacheService.SetPushContentConfigsAsync(trackPushEntity.AppKey,
|
||||
trackPushEntity.Customer);
|
||||
break;
|
||||
|
||||
case OptionTypeNoNull.修改:
|
||||
var oldTrackPushEntity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ??
|
||||
var oldTrackPushEntity = await trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ??
|
||||
throw new BusinessException(message: "找不到数据");
|
||||
|
||||
ObjectMapper.Map(input, oldTrackPushEntity);
|
||||
await _trackPushConfigRepository.UpdateAsync(oldTrackPushEntity);
|
||||
await _trackPushCacheService.SetPushContentConfigsAsync(oldTrackPushEntity.AppKey,
|
||||
await trackPushConfigRepository.UpdateAsync(oldTrackPushEntity);
|
||||
await trackPushCacheService.SetPushContentConfigsAsync(oldTrackPushEntity.AppKey,
|
||||
oldTrackPushEntity.Customer);
|
||||
break;
|
||||
|
||||
case OptionTypeNoNull.删除:
|
||||
var entity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ??
|
||||
var entity = await trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ??
|
||||
throw new BusinessException(message: "找不到数据");
|
||||
|
||||
await _trackPushConfigRepository.SoftDeleteAsync(x => x.Id == input.Id);
|
||||
await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.TrackPushConfigId == input.Id);
|
||||
await _trackPushCacheService.SetPushContentConfigsAsync(entity.AppKey, entity.Customer);
|
||||
await trackPushConfigRepository.SoftDeleteAsync(x => x.Id == input.Id);
|
||||
await trackPushConfigRepository.SoftDeleteContentAsync(x => x.TrackPushConfigId == input.Id);
|
||||
await trackPushCacheService.SetPushContentConfigsAsync(entity.AppKey, entity.Customer);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -154,23 +145,23 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
&& x.OrderNoType == input.OrderNoType;
|
||||
if (input.Options == OptionTypeNoNull.修改) isContentAnyExp = isContentAnyExp.And(x => x.Id != input.Id);
|
||||
|
||||
if (await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
if (await trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
x.TrackContentId == input.TrackContentId)))
|
||||
throw new BusinessException(message: "TrackContentId配置已存在");
|
||||
if (!input.TrackContentCodeValue.IsNullOrWhiteSpace() &&
|
||||
await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
await trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
x.TrackContentCodeValue == input.TrackContentCodeValue)))
|
||||
throw new BusinessException(message: "TrackContentCodeValue配置已存在");
|
||||
if (!input.TrackStatusValue.IsNullOrWhiteSpace() &&
|
||||
await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
await trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
x.TrackStatusValue == input.TrackStatusValue)))
|
||||
throw new BusinessException(message: "TrackStatusValue配置已存在");
|
||||
if (!input.TrackContentValue.IsNullOrWhiteSpace() &&
|
||||
await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
await trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
x.TrackContentValue == input.TrackContentValue)))
|
||||
throw new BusinessException(message: "TrackContentValue配置已存在");
|
||||
if (!input.TrackEnContentValue.IsNullOrWhiteSpace() &&
|
||||
await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
await trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
x.TrackEnContentValue == input.TrackEnContentValue)))
|
||||
throw new BusinessException(message: "TrackEnContentValue配置已存在");
|
||||
}
|
||||
@ -185,36 +176,36 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
{
|
||||
case OptionTypeNoNull.新增:
|
||||
{
|
||||
var maxSort = await _trackPushConfigRepository.ContentMaxAsync(x => x.Sort, x =>
|
||||
var maxSort = await trackPushConfigRepository.ContentMaxAsync(x => x.Sort, x =>
|
||||
x.OrderNoType == input.OrderNoType
|
||||
&& x.TrackPushConfigId == input.TrackPushConfigId
|
||||
);
|
||||
|
||||
var entity = ObjectMapper.Map<EditTrackPushContentInput, TrackPushContentConfigEntity>(input);
|
||||
entity.Sort = maxSort + 1;
|
||||
await _trackPushConfigRepository.InsertContentAsync(entity);
|
||||
await trackPushConfigRepository.InsertContentAsync(entity);
|
||||
break;
|
||||
}
|
||||
|
||||
case OptionTypeNoNull.修改:
|
||||
{
|
||||
var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ??
|
||||
var entity = await trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ??
|
||||
throw new BusinessException(message: "找不到数据");
|
||||
oldContentConfig = entity.DeepCopy();
|
||||
ObjectMapper.Map(input, entity);
|
||||
await _trackPushConfigRepository.UpdateContentAsync(entity);
|
||||
await trackPushConfigRepository.UpdateContentAsync(entity);
|
||||
postContentConfig = entity;
|
||||
break;
|
||||
}
|
||||
|
||||
case OptionTypeNoNull.删除:
|
||||
{
|
||||
var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ??
|
||||
var entity = await trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ??
|
||||
throw new BusinessException(message: "找不到数据");
|
||||
oldContentConfig = entity;
|
||||
trackPushConfigId = entity.TrackPushConfigId;
|
||||
await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id);
|
||||
await _trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1, x =>
|
||||
await trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id);
|
||||
await trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1, x =>
|
||||
x.OrderNoType == entity.OrderNoType
|
||||
&& x.TrackPushConfigId == entity.TrackPushConfigId
|
||||
&& x.Sort > entity.Sort
|
||||
@ -226,10 +217,10 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
var pushConfig = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == trackPushConfigId);
|
||||
var pushConfig = await trackPushConfigRepository.GetFirstAsync(x => x.Id == trackPushConfigId);
|
||||
if (pushConfig != null)
|
||||
{
|
||||
await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.AppKey, pushConfig.Customer);
|
||||
await trackPushCacheService.SetPushContentConfigsAsync(pushConfig.AppKey, pushConfig.Customer);
|
||||
}
|
||||
|
||||
ts.Complete();
|
||||
@ -250,7 +241,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
{
|
||||
var ids = input.SortInfo.Select(x => int.Parse(x.Key)).ToList();
|
||||
|
||||
var trackPushContentEntities = await _trackPushConfigRepository.GetContentListAsync(x => ids.Contains(x.Id));
|
||||
var trackPushContentEntities = await trackPushConfigRepository.GetContentListAsync(x => ids.Contains(x.Id));
|
||||
|
||||
trackPushContentEntities.ForEach(item => { item.Sort = input.SortInfo.Single(x => x.Key == item.Id.ToString()).Value; });
|
||||
|
||||
@ -258,9 +249,9 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
{
|
||||
using var ts = TransacationHelper.GetReadCommitted();
|
||||
|
||||
await _trackPushConfigRepository.UpdateContentRangeAsync(trackPushContentEntities);
|
||||
await trackPushConfigRepository.UpdateContentRangeAsync(trackPushContentEntities);
|
||||
|
||||
var pushConfig = await _trackPushConfigRepository.GetFirstAsync(
|
||||
var pushConfig = await trackPushConfigRepository.GetFirstAsync(
|
||||
x => x.Id == trackPushContentEntities[0].TrackPushConfigId,
|
||||
y => new
|
||||
{
|
||||
@ -269,7 +260,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
});
|
||||
if (pushConfig != null)
|
||||
{
|
||||
await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.AppKey, pushConfig.Customer);
|
||||
await trackPushCacheService.SetPushContentConfigsAsync(pushConfig.AppKey, pushConfig.Customer);
|
||||
}
|
||||
|
||||
ts.Complete();
|
||||
@ -292,7 +283,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
|
||||
_ = Task.Run(async () =>
|
||||
{
|
||||
var scope = _serviceProvider.CreateScope();
|
||||
var scope = serviceProvider.CreateScope();
|
||||
try
|
||||
{
|
||||
var handler = scope.ServiceProvider.GetRequiredService<IReturnWarningHandler>();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user