1122222eee
This commit is contained in:
parent
cd475c0b19
commit
be1a18dfcb
43
src/TrackCenter.Application/Caching/AppNameDictCache.cs
Normal file
43
src/TrackCenter.Application/Caching/AppNameDictCache.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using TrackCenter.Domain.VEntities;
|
||||
|
||||
namespace TrackCenter.Application.Caching;
|
||||
|
||||
/// <summary>
|
||||
/// 系统id中文名称字典缓存
|
||||
/// </summary>
|
||||
public class AppNameDictCache : BasicCacheForPeriodicRefresh<string, string>, ISingletonDependency
|
||||
{
|
||||
private readonly IBasicRepository<VAppEntity> _appRepository;
|
||||
|
||||
public AppNameDictCache(IBasicRepository<VAppEntity> appRepository) : base(RedisHelper.Client)
|
||||
{
|
||||
_appRepository = appRepository;
|
||||
}
|
||||
|
||||
protected override string BuildRedisKey(string key) => $"{GlobalConst.TrackDataDictKeyPrefix}:AppName:{key}";
|
||||
|
||||
protected override TimeSpan RedisExpire => TimeSpan.FromSeconds(-1); // 设置缓存不过期,指定id系统被删除时仍能兜底提供系统中文名
|
||||
protected override TimeSpan LocalExpire => TimeSpan.FromMinutes(10); // 本地缓存10分钟过期后在次请求会刷新数据
|
||||
protected override TimeSpan MissingKeySetNullRedisExpire => TimeSpan.FromMinutes(1); // 缓存不存在时设置redisNull
|
||||
|
||||
protected override async ValueTask<string?> LoadAsync(string key)
|
||||
{
|
||||
if (key.IsNullOrEmpty()) return null;
|
||||
return await _appRepository.GetFirstAsync(x => x.AppKey == key, x => x.Name);
|
||||
}
|
||||
|
||||
protected override async ValueTask<Dictionary<string, string>> LoadAsync(HashSet<string> keys)
|
||||
{
|
||||
if (keys.Count == 0) return Empty<string, string>.Dict;
|
||||
|
||||
var result = await _appRepository.GetListAsync(x => keys.Contains(x.AppKey), x => new
|
||||
{
|
||||
x.AppKey,
|
||||
x.Name
|
||||
});
|
||||
|
||||
return result.Count == 0
|
||||
? Empty<string, string>.Dict
|
||||
: result.ToDictionary(x => x.AppKey, y => y.Name);
|
||||
}
|
||||
}
|
||||
@ -6,14 +6,4 @@ public class GetDetailTimelineInput
|
||||
/// 订单编号
|
||||
/// </summary>
|
||||
public string OrderNumber { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单所属应用
|
||||
/// </summary>
|
||||
public string AppKey { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前用户登陆应用
|
||||
/// </summary>
|
||||
public int CurrenUserAppKey { get; set; }
|
||||
}
|
||||
|
||||
@ -76,12 +76,6 @@ public class UpdateOrderInput : OrderNoInfo
|
||||
/// 订单航班信息
|
||||
/// </summary>
|
||||
public List<OrderFlightInfo> FlightInfos { get; set; } = new();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 模板code
|
||||
/// </summary>
|
||||
public List<string>? TemplateCodes { get; set; }
|
||||
}
|
||||
|
||||
public class PullConfigInfo
|
||||
|
||||
@ -12,7 +12,7 @@ public class EditTrackPullConfigInput
|
||||
/// <summary>
|
||||
/// 应用
|
||||
/// </summary>
|
||||
public int? AppKey { get; set; }
|
||||
public string? AppKey { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 服务商id
|
||||
|
||||
@ -8,7 +8,7 @@ public class GetWarningRuleInput
|
||||
/// <summary>
|
||||
/// 应用
|
||||
/// </summary>
|
||||
public int? AppKey { get; set; }
|
||||
public string? AppKey { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// kpi名称 模糊查询
|
||||
|
||||
@ -1,98 +0,0 @@
|
||||
using Fake.DependencyInjection;
|
||||
using Fake.DomainDrivenDesign.Repositories.SqlSugarCore;
|
||||
using SqlSugar;
|
||||
using TrackCenter.Domain.VEntities;
|
||||
|
||||
namespace TrackCenter.Repository.Queries;
|
||||
|
||||
/// <summary>
|
||||
/// 时区查询
|
||||
/// </summary>
|
||||
public class TimezoneQueries : SqlSugarRootlessRepository<TrackCenterDbContext>, ITransientDependency
|
||||
{
|
||||
public ISqlSugarClient Context => GetDbContextAsync().Result;
|
||||
|
||||
/// <summary>
|
||||
/// 获取城市时区
|
||||
/// </summary>
|
||||
/// <param name="cityEnName">城市英文名称</param>
|
||||
/// <returns>时区</returns>
|
||||
public async Task<string> GetCityTimezone(string cityEnName)
|
||||
{
|
||||
var key = GetCityKey(cityEnName);
|
||||
var timezone = RedisHelper.Client.Get<string>(key);
|
||||
if (!string.IsNullOrEmpty(timezone))
|
||||
{
|
||||
return timezone;
|
||||
}
|
||||
|
||||
var cityTimezone = await GetTimezoneByCityName(cityEnName);
|
||||
if (cityTimezone == null!)
|
||||
{
|
||||
await RedisHelper.Client.SetAsync(key, string.Empty, TimeSpan.FromSeconds(20));
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
await RedisHelper.Client.SetAsync(key, cityTimezone.Timezone, TimeSpan.FromHours(24));
|
||||
return cityTimezone.Timezone;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取港口时区
|
||||
/// </summary>
|
||||
/// <param name="airCode">港口三字码</param>
|
||||
/// <returns>时区</returns>
|
||||
public async Task<string> GetPortTimezone(string airCode)
|
||||
{
|
||||
var key = GetPortKey(airCode);
|
||||
var timezone = RedisHelper.Client.Get<string>(key);
|
||||
if (!string.IsNullOrEmpty(timezone))
|
||||
{
|
||||
return timezone;
|
||||
}
|
||||
|
||||
var portTimezone = await GetTimezoneByPortCode(airCode);
|
||||
if (portTimezone == null!)
|
||||
{
|
||||
await RedisHelper.Client.SetAsync(key, string.Empty, TimeSpan.FromSeconds(20));
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
await RedisHelper.Client.SetAsync(key, portTimezone.Timezone, TimeSpan.FromHours(24));
|
||||
return portTimezone.Timezone;
|
||||
}
|
||||
|
||||
private string GetCityKey(string cityEnName)
|
||||
{
|
||||
return $"{GlobalConst.CityTimezoneKeyPrefix}:{cityEnName}";
|
||||
}
|
||||
|
||||
private string GetPortKey(string airCode)
|
||||
{
|
||||
return $"{GlobalConst.PortTimezoneKeyPrefix}:{airCode}";
|
||||
}
|
||||
|
||||
private Task<CityTimezoneDto> GetTimezoneByCityName(string cityEnName)
|
||||
{
|
||||
return Context.Queryable<VCityEntity>().Where(val => !val.IsDeleted && val.EnName == cityEnName)
|
||||
.Select(val => new CityTimezoneDto()
|
||||
{
|
||||
CityEnName = val.EnName,
|
||||
Timezone = val.TimeZone
|
||||
})
|
||||
.FirstAsync();
|
||||
}
|
||||
|
||||
private Task<PortTimezoneDto> GetTimezoneByPortCode(string airCode)
|
||||
{
|
||||
return Context.Queryable<VCityEntity>()
|
||||
.InnerJoin<VAirportEntity>((city, airport) => city.Id == airport.CityId)
|
||||
.Where((city, airport) => !airport.IsDeleted && !city.IsDeleted && airport.Code == airCode)
|
||||
.Select((city, airport) => new PortTimezoneDto()
|
||||
{
|
||||
PortCode = airport.Code,
|
||||
Timezone = city.TimeZone
|
||||
})
|
||||
.FirstAsync();
|
||||
}
|
||||
}
|
||||
@ -79,7 +79,6 @@ public partial class OrderService : ApplicationServiceBase
|
||||
order = ObjectMapper.Map<UpsertOrderInput, OrderEntity>(input);
|
||||
order.OrderFlights = ObjectMapper.Map<List<OrderFlightInfo>, List<OrderFlightEntity>>(input.FlightInfos);
|
||||
order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos);
|
||||
order.TemplateCodes = input.TemplateCodes == null ? null : string.Join(',', input.TemplateCodes);
|
||||
order.SetThirdPartyOrderNumber(order.OrderPullStatus);
|
||||
|
||||
var orderId = await _orderRepository.CreateOrderAsync(order);
|
||||
@ -135,7 +134,6 @@ public partial class OrderService : ApplicationServiceBase
|
||||
var order2 = ObjectMapper.Map(input2, order);
|
||||
order2.OrderFlights = ObjectMapper.Map<List<OrderFlightInfo>, List<OrderFlightEntity>>(input2.FlightInfos);
|
||||
order2.OrderPullStatus = BuiltOrderPullStatus(input2.PullConfigInfos);
|
||||
order2.TemplateCodes = input2.TemplateCodes == null ? null : string.Join(',', input2.TemplateCodes);
|
||||
order2.SetThirdPartyOrderNumber(order.OrderPullStatus);
|
||||
updateOrders.Add(order2);
|
||||
updateRecords.Add(new OrderOperationRecordIndex
|
||||
@ -170,7 +168,6 @@ public partial class OrderService : ApplicationServiceBase
|
||||
var order = ObjectMapper.Map<UpsertOrderInput, OrderEntity>(insertInput);
|
||||
order.OrderFlights = ObjectMapper.Map<List<OrderFlightInfo>, List<OrderFlightEntity>>(insertInput.FlightInfos);
|
||||
order.OrderPullStatus = BuiltOrderPullStatus(insertInput.PullConfigInfos);
|
||||
order.TemplateCodes = insertInput.TemplateCodes == null ? null : string.Join(',', insertInput.TemplateCodes);
|
||||
order.SetThirdPartyOrderNumber(order.OrderPullStatus);
|
||||
insertOrders.Add(order);
|
||||
createRecords.Add(new OrderOperationRecordIndex
|
||||
@ -228,7 +225,6 @@ public partial class OrderService : ApplicationServiceBase
|
||||
order = ObjectMapper.Map(input, order);
|
||||
order.OrderFlights = ObjectMapper.Map<List<OrderFlightInfo>, List<OrderFlightEntity>>(input.FlightInfos);
|
||||
order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos);
|
||||
order.TemplateCodes = input.TemplateCodes == null ? null : string.Join(',', input.TemplateCodes);
|
||||
order.SetThirdPartyOrderNumber(order.OrderPullStatus);
|
||||
await _orderRepository.UpdateOrderAsync(order);
|
||||
}
|
||||
|
||||
@ -7,7 +7,6 @@ using TrackCenter.Application.Helpers;
|
||||
using TrackCenter.Application.Options;
|
||||
using TrackCenter.Domain.Aggregates.OrderAggregate;
|
||||
using TrackCenter.Domain.Enums;
|
||||
using TrackCenter.Repository.Queries;
|
||||
|
||||
namespace TrackCenter.Application.Services.TimerTaskss;
|
||||
|
||||
@ -19,14 +18,11 @@ public class TrackButtomUpScanTask : ApplicationServiceBase
|
||||
{
|
||||
private readonly IOptionsSnapshot<TrackAppOptions> _options;
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly TimezoneQueries _timezoneQueries;
|
||||
|
||||
public TrackButtomUpScanTask(IOptionsSnapshot<TrackAppOptions> options, IOrderRepository orderRepository,
|
||||
TimezoneQueries timezoneQueries)
|
||||
public TrackButtomUpScanTask(IOptionsSnapshot<TrackAppOptions> options, IOrderRepository orderRepository)
|
||||
{
|
||||
_options = options;
|
||||
_orderRepository = orderRepository;
|
||||
_timezoneQueries = timezoneQueries;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -59,52 +55,6 @@ public class TrackButtomUpScanTask : ApplicationServiceBase
|
||||
return "ok";
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取轨迹时区
|
||||
/// </summary>
|
||||
/// <param name="matchedContentConfig">配置信息</param>
|
||||
/// <param name="context">订单id</param>
|
||||
/// <returns>时区,是否执行了兜底轨迹时区</returns>
|
||||
private async Task<(float? trackTimeZone, bool hasTimezoneBottomLine)> GetTimezone(
|
||||
TrackPullContentConfigDto? matchedContentConfig,
|
||||
TrackRefreshContext context)
|
||||
{
|
||||
float? trackTimeZone = null;
|
||||
var hasTimezoneBottomLine = false; // 执行了兜底但是没有兜底住,需要记录
|
||||
if (matchedContentConfig?.TrackZonePlaceValue is not null)
|
||||
{
|
||||
//兜底没配置的就不需要兜底,拉取的发生地没就没
|
||||
var timezone = await GetTimezone(matchedContentConfig, context.OrderId);
|
||||
|
||||
trackTimeZone = timezone;
|
||||
hasTimezoneBottomLine = !timezone.HasValue;
|
||||
}
|
||||
|
||||
return (trackTimeZone, hasTimezoneBottomLine);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得轨迹地址
|
||||
/// </summary>
|
||||
/// <param name="matchedContentConfig">配置信息</param>
|
||||
/// <param name="context">订单id</param>
|
||||
/// <returns>时区,是否执行了兜底轨迹时区</returns>
|
||||
private async Task<(string? trackPlace, bool hasPlaceBottomLine)> GetTrackPlace(
|
||||
TrackPullContentConfigDto? matchedContentConfig, TrackRefreshContext context)
|
||||
{
|
||||
string? trackPlace = null;
|
||||
var hasPlaceBottomLine = false; //执行了兜底但是没有兜底住,需要记录
|
||||
if (matchedContentConfig?.TrackPlaceValue is not null)
|
||||
{
|
||||
//兜底没配置的就不需要兜底,拉取的发生地没就没
|
||||
trackPlace = await GetPlaceByOrder(matchedContentConfig!.TrackPlaceValue.Value, context.OrderId);
|
||||
hasPlaceBottomLine = string.IsNullOrWhiteSpace(trackPlace);
|
||||
}
|
||||
|
||||
return (trackPlace, hasPlaceBottomLine);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据订单id获取兜底位置
|
||||
/// </summary>
|
||||
@ -127,33 +77,6 @@ public class TrackButtomUpScanTask : ApplicationServiceBase
|
||||
return _orderRepository.GetFirstAsync(x => x.Id == orderId, resultExpression);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取时区
|
||||
/// </summary>
|
||||
/// <param name="matchedContentConfig"></param>
|
||||
/// <param name="orderId"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<float?> GetTimezone(TrackPullContentConfigDto matchedContentConfig, int orderId)
|
||||
{
|
||||
var placeOrCode = await GetPlaceByOrder(matchedContentConfig!.TrackZonePlaceValue.Value, orderId);
|
||||
string timezone = null;
|
||||
if (!string.IsNullOrEmpty(placeOrCode))
|
||||
{
|
||||
if (matchedContentConfig!.TrackZonePlaceValue.Value == (int) TrackLocationValue.ArrivalPort
|
||||
|| matchedContentConfig!.TrackZonePlaceValue.Value == (int) TrackLocationValue.LeavePort)
|
||||
{
|
||||
timezone = await _timezoneQueries.GetPortTimezone(placeOrCode);
|
||||
return DateTimeHelper.ConvertTimeZoneToFloat(timezone);
|
||||
}
|
||||
|
||||
timezone = await _timezoneQueries.GetCityTimezone(placeOrCode);
|
||||
return DateTimeHelper.ConvertTimeZoneToFloat(timezone);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 触发了兜底,但是没有兜底住,对订单进行标记
|
||||
/// 1表示时区,2表示发生地,3表示两种
|
||||
|
||||
@ -1,25 +1,17 @@
|
||||
using System.Linq.Expressions;
|
||||
using Fake.Application.Dtos;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using SJZY.Expand.ABP.Core.Localization;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using SJZY.Expand.AliyunOSS;
|
||||
using TrackCenter.Application.Dtos.ProvideServices;
|
||||
using TrackCenter.Application.Dtos.TrackContents;
|
||||
using TrackCenter.Application.Helpers;
|
||||
using TrackCenter.Application.Helpers.OSS;
|
||||
using TrackCenter.Application.Services;
|
||||
using TrackCenter.Application.Localization;
|
||||
using TrackCenter.Application.Services.TrackPush;
|
||||
using TrackCenter.Domain.Aggregates.OrderAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackContentAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackFlagAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackStatusAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackTemplateAggregate;
|
||||
using TrackCenter.Domain.Dtos.TrackContents;
|
||||
using TrackCenter.Domain.Enums;
|
||||
using TrackCenter.Domain.Queries;
|
||||
using TrackCenter.Repository;
|
||||
|
||||
namespace TrackCenter.Application.Services.TrackContents;
|
||||
@ -32,7 +24,6 @@ namespace TrackCenter.Application.Services.TrackContents;
|
||||
public class TrackContentService : ApplicationServiceBase
|
||||
{
|
||||
private readonly ITrackContentRepository _trackContentRepository;
|
||||
private readonly ITrackTemplateRepository _trackTemplateRepository;
|
||||
private readonly IBasicRepository<TrackFlagEntity> _trackFlagBasicQuery;
|
||||
private readonly IBasicRepository<TrackStatusEntity> _trackStatusBasicQuery;
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
@ -45,14 +36,13 @@ public class TrackContentService : ApplicationServiceBase
|
||||
IBasicRepository<TrackFlagEntity> trackFlagBasicQuery,
|
||||
IOrderRepository orderRepository,
|
||||
ITrackDetailsEsRepository trackDetailsEsRepository,
|
||||
ITrackTemplateRepository trackTemplateRepository, TrackPushCacheService trackPushCacheService)
|
||||
TrackPushCacheService trackPushCacheService)
|
||||
{
|
||||
_trackContentRepository = trackContentRepository;
|
||||
_trackStatusBasicQuery = trackStatusBasicQuery;
|
||||
_trackFlagBasicQuery = trackFlagBasicQuery;
|
||||
_orderRepository = orderRepository;
|
||||
_trackDetailsEsRepository = trackDetailsEsRepository;
|
||||
_trackTemplateRepository = trackTemplateRepository;
|
||||
_trackPushCacheService = trackPushCacheService;
|
||||
}
|
||||
|
||||
@ -82,13 +72,22 @@ public class TrackContentService : ApplicationServiceBase
|
||||
}
|
||||
}
|
||||
|
||||
return input.Options switch
|
||||
switch (input.Options)
|
||||
{
|
||||
OptionType.新增 => await AddAsync(input),
|
||||
OptionType.修改 => await UpdateAsync(input),
|
||||
OptionType.删除 => await DeleteAsync(input),
|
||||
_ => throw new BusinessException(message: "当前操作动作不合法")
|
||||
};
|
||||
case OptionType.无:
|
||||
break;
|
||||
case OptionType.新增:
|
||||
await AddAsync(input);
|
||||
break;
|
||||
case OptionType.删除:
|
||||
await DeleteAsync(input);
|
||||
break;
|
||||
case OptionType.修改:
|
||||
await UpdateAsync(input);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -156,14 +155,14 @@ public class TrackContentService : ApplicationServiceBase
|
||||
if (input.Options != OptionTypeNoNull.删除)
|
||||
{
|
||||
if (input.AppKey == input.MapAppKey)
|
||||
throw new BusinessException(message: _stringLocalizer["NotAllowedToMapApp"]);
|
||||
throw new BusinessException("禁止自己映射自己");
|
||||
|
||||
Expression<Func<TrackContentMapEntity, bool>> isMapAnyExp = x =>
|
||||
x.TrackContentId == input.TrackContentId && x.MapTrackContentId == input.MapTrackContentId;
|
||||
if (input.Options == OptionTypeNoNull.修改) isMapAnyExp.And(x => x.Id != input.Id);
|
||||
|
||||
if (await _trackContentRepository.IsMapAnyAsync(isMapAnyExp))
|
||||
throw new BusinessException(message: _stringLocalizer["IsTrackContentMapAny"]);
|
||||
throw new BusinessException("映射已经存在");
|
||||
}
|
||||
|
||||
switch (input.Options)
|
||||
@ -176,7 +175,7 @@ public class TrackContentService : ApplicationServiceBase
|
||||
|
||||
case OptionTypeNoNull.修改:
|
||||
var oldTrackContentMapEntity = await _trackContentRepository.GetMapByIdAsync(input.Id!.Value) ??
|
||||
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
|
||||
throw new BusinessException("找不到数据");
|
||||
|
||||
ObjectMapper.Map(input, oldTrackContentMapEntity);
|
||||
|
||||
@ -188,8 +187,7 @@ public class TrackContentService : ApplicationServiceBase
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new BusinessException(message: _stringLocalizer[SjzyBasicLocalization.Validation_IsInEnum,
|
||||
nameof(EditTrackContentMapInput.Options)]);
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -203,27 +201,16 @@ public class TrackContentService : ApplicationServiceBase
|
||||
[HttpPost("GetTrackContentByCode")]
|
||||
public async Task<GetTrackContentByCodeOutput> GetTrackContentByCodeAsync([FromBody] GetTrackContentByCodeInput input)
|
||||
{
|
||||
if (input.AppKey <= 0)
|
||||
return new UnifyResultDto<GetTrackContentByCodeOutput>(false, "应用必须大于等于0");
|
||||
|
||||
if (string.IsNullOrEmpty(input.Code))
|
||||
return new UnifyResultDto<GetTrackContentByCodeOutput>(false, "轨迹内容code不能为空");
|
||||
|
||||
var content = await _trackContentRepository.GetByCodeAsync(input.AppKey, input.Code);
|
||||
if (content == null)
|
||||
return new UnifyResultDto<GetTrackContentByCodeOutput>(false, "在当前应用中未找到指定code的轨迹内容");
|
||||
throw new BusinessException("在当前应用中未找到指定code的轨迹内容");
|
||||
|
||||
var res = new UnifyResultDto<GetTrackContentByCodeOutput>(true)
|
||||
return new GetTrackContentByCodeOutput
|
||||
{
|
||||
Data = new GetTrackContentByCodeOutput
|
||||
{
|
||||
Content = content.Content,
|
||||
EnContent = content.EnContent,
|
||||
IsExternal = content.IsExternal
|
||||
}
|
||||
Content = content.Content,
|
||||
EnContent = content.EnContent,
|
||||
IsExternal = content.IsExternal
|
||||
};
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -296,6 +283,7 @@ public class TrackContentService : ApplicationServiceBase
|
||||
{
|
||||
trackDetails = trackDetails.Where(m => m.Source != (int) TrackSourceEnum.ExternalServiceProvide).ToList();
|
||||
}
|
||||
var res = new List<GetAvailableContentOutput>();
|
||||
|
||||
//进行推送时,匹配订单类型一致的轨迹
|
||||
if (input.TrackOptionType == TrackOptionType.推送)
|
||||
@ -312,7 +300,6 @@ public class TrackContentService : ApplicationServiceBase
|
||||
trackDetails = trackDetails.Where(m => trackCodes.Contains(m.TrackCode)).ToList();
|
||||
}
|
||||
|
||||
var res = new List<GetAvailableContentOutput>();
|
||||
//进行删除和推送行为无任何轨迹内容,直接返回为空即可
|
||||
if (input.TrackOptionType is TrackOptionType.删除 or TrackOptionType.推送 && trackDetails.Count == 0)
|
||||
{
|
||||
@ -324,14 +311,6 @@ public class TrackContentService : ApplicationServiceBase
|
||||
if (contentList == null)
|
||||
throw new BusinessException(message: "当前应用下未找到任何可用的轨迹内容!");
|
||||
|
||||
//如果订单给了获取模板code,则进一步根据模板code进行过滤
|
||||
if (!string.IsNullOrEmpty(order.TemplateCodes))
|
||||
{
|
||||
var currentCodes = order.TemplateCodes.Split(",");
|
||||
var template = await _trackTemplateRepository.GetContentByTemplateCodes(currentCodes, input.AppKey);
|
||||
contentList = contentList.Where(m => template.Contains(m.Code)).ToList();
|
||||
}
|
||||
|
||||
foreach (var item in contentList)
|
||||
{
|
||||
//新增时,不允许重复的轨迹,跳过已存在轨迹内容
|
||||
|
||||
@ -1,11 +1,9 @@
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Fake.Application.Dtos;
|
||||
using TrackCenter.Application.Dtos.TrackFlags;
|
||||
using TrackCenter.Domain.Aggregates.TrackContentAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackFlagAggregate;
|
||||
using TrackCenter.Domain.Dtos.TrackFlags;
|
||||
using SqlSugar;
|
||||
using TrackCenter.Application.Localization;
|
||||
using Volo.Abp.DependencyInjection;
|
||||
|
||||
namespace TrackCenter.Application.Services.TrackFlags;
|
||||
|
||||
@ -16,17 +14,14 @@ namespace TrackCenter.Application.Services.TrackFlags;
|
||||
[Route("/Track/Flag")]
|
||||
public class TrackFlagService : ApplicationServiceBase, ITransientDependency
|
||||
{
|
||||
private readonly IStringLocalizer<TrackLocalizationResource> _stringLocalizer;
|
||||
private readonly ITrackContentRepository _trackContentRepository;
|
||||
private readonly ITrackFlagRepository _trackFlagRepository;
|
||||
|
||||
public TrackFlagService(
|
||||
IStringLocalizer<TrackLocalizationResource> stringLocalizer,
|
||||
ITrackFlagRepository trackFlagRepository,
|
||||
ITrackContentRepository trackContentRepository
|
||||
)
|
||||
{
|
||||
this._stringLocalizer = stringLocalizer;
|
||||
this._trackFlagRepository = trackFlagRepository;
|
||||
this._trackContentRepository = trackContentRepository;
|
||||
}
|
||||
@ -36,15 +31,24 @@ public class TrackFlagService : ApplicationServiceBase, ITransientDependency
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("Edit")]
|
||||
public async Task<UnifyResultDto> EditAsync(EditTrackFlagInput input)
|
||||
public async Task EditAsync(EditTrackFlagInput input)
|
||||
{
|
||||
return input.Options switch
|
||||
switch (input.Options)
|
||||
{
|
||||
OptionType.新增 => await AddAsync(input),
|
||||
OptionType.修改 => await UpdateAsync(input),
|
||||
OptionType.删除 => await DeleteAsync(input),
|
||||
_ => throw new BusinessException(message: "当前操作动作不合法")
|
||||
};
|
||||
case OptionType.无:
|
||||
break;
|
||||
case OptionType.新增:
|
||||
await AddAsync(input);
|
||||
break;
|
||||
case OptionType.删除:
|
||||
await DeleteAsync(input);
|
||||
break;
|
||||
case OptionType.修改:
|
||||
await UpdateAsync(input);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -53,16 +57,11 @@ public class TrackFlagService : ApplicationServiceBase, ITransientDependency
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("GetDetail")]
|
||||
public async Task<UnifyResultDto<GetTrackFlagDetailDto>> GetDetailAsync(int id)
|
||||
public async Task<GetTrackFlagDetailDto> GetDetailAsync(int id)
|
||||
{
|
||||
var detailInfo = await _trackFlagRepository.GetDetailAsync(id);
|
||||
if (detailInfo == null)
|
||||
{
|
||||
return new UnifyResultDto<GetTrackFlagDetailDto>(false, null, "未查询到轨迹状态");
|
||||
}
|
||||
|
||||
var dto = ObjectMapper.Map<GetTrackFlagDetailVO, GetTrackFlagDetailDto>(detailInfo);
|
||||
return new UnifyResultDto<GetTrackFlagDetailDto>(GlobalConst.SuccessCode, "", dto);
|
||||
var dto = ObjectMapper.Map<GetTrackFlagDetailVO, GetTrackFlagDetailDto>(detailInfo!);
|
||||
return dto;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -84,7 +83,7 @@ public class TrackFlagService : ApplicationServiceBase, ITransientDependency
|
||||
|
||||
#region 私有方法
|
||||
|
||||
private async Task<UnifyResultDto> AddAsync(EditTrackFlagInput input)
|
||||
private async Task AddAsync(EditTrackFlagInput input)
|
||||
{
|
||||
#region 业务校验
|
||||
|
||||
@ -109,11 +108,9 @@ public class TrackFlagService : ApplicationServiceBase, ITransientDependency
|
||||
|
||||
var entity = ObjectMapper.Map<EditTrackFlagInput, TrackFlagEntity>(input);
|
||||
var isTrue = await _trackFlagRepository.InsertAsync(entity);
|
||||
|
||||
return new UnifyResultDto(GlobalConst.SuccessCode, "新增成功", isTrue);
|
||||
}
|
||||
|
||||
private async Task<UnifyResultDto> UpdateAsync(EditTrackFlagInput input)
|
||||
private async Task UpdateAsync(EditTrackFlagInput input)
|
||||
{
|
||||
#region 业务校验
|
||||
|
||||
@ -146,11 +143,9 @@ public class TrackFlagService : ApplicationServiceBase, ITransientDependency
|
||||
|
||||
ObjectMapper.Map(input, trackFlag);
|
||||
var isTrue = await _trackFlagRepository.UpdateAsync(trackFlag);
|
||||
|
||||
return new UnifyResultDto(GlobalConst.SuccessCode, "修改成功", isTrue);
|
||||
}
|
||||
|
||||
private async Task<UnifyResultDto> DeleteAsync(EditTrackFlagInput input)
|
||||
private async Task DeleteAsync(EditTrackFlagInput input)
|
||||
{
|
||||
#region 业务校验
|
||||
|
||||
@ -164,8 +159,6 @@ public class TrackFlagService : ApplicationServiceBase, ITransientDependency
|
||||
#endregion
|
||||
|
||||
var isTrue = await _trackFlagRepository.SoftDeleteAsync(x => x.Id == input.Id);
|
||||
|
||||
return new UnifyResultDto(GlobalConst.SuccessCode, "删除成功", isTrue);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -1,173 +0,0 @@
|
||||
using Fake.Application.Dtos;
|
||||
using TrackCenter.Application.Dtos.TrackNode;
|
||||
using TrackCenter.Application.Dtos.TrackStatus;
|
||||
using TrackCenter.Application.Helpers;
|
||||
using TrackCenter.Domain.Aggregates.TrackNodeAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackStatusAggregate;
|
||||
using TrackCenter.Domain.Dtos.TrackNode;
|
||||
|
||||
namespace TrackCenter.Application.Services.TrackNode;
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹节点服务
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "轨迹节点")]
|
||||
[Route("/Track/Node")]
|
||||
public class TrackNodeService : ApplicationServiceBase
|
||||
{
|
||||
private readonly ITrackNodeRepository _trackNodeRepository;
|
||||
private readonly ITrackStatusRepository _trackStatusRepository;
|
||||
|
||||
public TrackNodeService(
|
||||
ITrackNodeRepository trackNodeRepository, ITrackStatusRepository trackStatusRepository)
|
||||
{
|
||||
this._trackNodeRepository = trackNodeRepository;
|
||||
_trackStatusRepository = trackStatusRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹节点编辑
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("Edit")]
|
||||
public async Task EditAsync(EditTrackNodeInput input)
|
||||
{
|
||||
switch (input.Options)
|
||||
{
|
||||
case OptionType.无:
|
||||
break;
|
||||
case OptionType.新增:
|
||||
await AddAsync(input);
|
||||
break;
|
||||
case OptionType.删除:
|
||||
await DeleteAsync(input);
|
||||
break;
|
||||
case OptionType.修改:
|
||||
await UpdateAsync(input);
|
||||
break;
|
||||
default:
|
||||
throw new BusinessException(message: "当前操作动作不合法");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取分页轨迹节点
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("GetList")]
|
||||
public async Task<PagedResult<TrackNodeDto>> GetPageTrackNode(QueryTrackNodeRequest input)
|
||||
{
|
||||
var queryParam = ObjectMapper.Map<QueryTrackNodeRequest, TrackNodePageDto>(input);
|
||||
var resultDto = await _trackNodeRepository.GetPageList(queryParam);
|
||||
return resultDto;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取详情
|
||||
/// </summary>
|
||||
/// <param name="nodeid">节点id</param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("GetDetail")]
|
||||
public async Task<TrackNodeDto> GetDetail(int nodeid)
|
||||
{
|
||||
var resultDto = await _trackNodeRepository.GetDetail(nodeid);
|
||||
return resultDto;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取分页轨迹字典,下拉框用的
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("GetTrackNodeOption")]
|
||||
public async Task<PagedResult<TrackNodeDicDto>> GetTrackNodeOption(QueryTrackNodeRequest input)
|
||||
{
|
||||
var queryParam = ObjectMapper.Map<QueryTrackNodeRequest, TrackNodePageDto>(input);
|
||||
var resultDto = await _trackNodeRepository.GetPageDicList(queryParam);
|
||||
return resultDto;
|
||||
}
|
||||
|
||||
#region 私有方法
|
||||
|
||||
private async Task AddAsync(EditTrackNodeInput input)
|
||||
{
|
||||
#region 业务校验
|
||||
|
||||
if (string.IsNullOrEmpty(input.NodeName) || string.IsNullOrEmpty(input.NodeEnName) ||
|
||||
!input.AppKey.HasValue)
|
||||
{
|
||||
throw new BusinessException("NodeName,NodeEnName,AppKey 必填");
|
||||
}
|
||||
|
||||
var trackNodesEntitys = await _trackNodeRepository.GetListAsync(a =>
|
||||
a.AppKey == input.AppKey &&
|
||||
(a.NodeName == input.NodeName || a.NodeEnName == input.NodeEnName));
|
||||
if (trackNodesEntitys.Any())
|
||||
{
|
||||
var trackNodeName = trackNodesEntitys.FirstOrDefault(a => a.NodeName == input.NodeName);
|
||||
if (trackNodeName != null)
|
||||
{
|
||||
throw new BusinessException(message: "该应用下节点名称已存在");
|
||||
}
|
||||
|
||||
var trackNodeEnName = trackNodesEntitys.FirstOrDefault(a => a.NodeEnName == input.NodeEnName);
|
||||
if (trackNodeEnName != null)
|
||||
{
|
||||
throw new BusinessException(message: "该应用下节点英文名称已存在");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
if (!StringHelper.IsValidEnglishString(input.NodeEnName))
|
||||
{
|
||||
throw new BusinessException("节点英文名称必须是英文和常用英文符号");
|
||||
}
|
||||
|
||||
var entity = ObjectMapper.Map<EditTrackNodeInput, TrackNodeEntity>(input);
|
||||
await _trackNodeRepository.InsertAsync(entity);
|
||||
}
|
||||
|
||||
private async Task UpdateAsync(EditTrackNodeInput input)
|
||||
{
|
||||
#region 业务校验
|
||||
|
||||
if (string.IsNullOrEmpty(input.NodeName) || string.IsNullOrEmpty(input.NodeEnName))
|
||||
{
|
||||
throw new BusinessException("NodeName,NodeEnName 必填");
|
||||
}
|
||||
|
||||
var trackNodesEntitys = await _trackNodeRepository.GetFirstAsync(a => a.Id == input.Id);
|
||||
if (trackNodesEntitys == null)
|
||||
{
|
||||
throw new BusinessException("没有找到数据,更新失败");
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
trackNodesEntitys.NodeEnName = input.NodeEnName;
|
||||
trackNodesEntitys.NodeName = input.NodeName;
|
||||
await _trackNodeRepository.UpdateAsync(trackNodesEntitys);
|
||||
}
|
||||
|
||||
private async Task DeleteAsync(EditTrackNodeInput input)
|
||||
{
|
||||
if (input.Id <= 0 || !input.AppKey.HasValue)
|
||||
{
|
||||
throw new BusinessException("AppKey 必填");
|
||||
}
|
||||
|
||||
var trackStatus =
|
||||
await _trackStatusRepository.GetFirstAsync(val =>
|
||||
val.Node == input.Id && val.AppKey == input.AppKey);
|
||||
if (trackStatus != null)
|
||||
{
|
||||
throw new BusinessException("删除失败,该节点已被使用");
|
||||
}
|
||||
|
||||
await _trackNodeRepository.DeleteById(input.Id);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@ -1,9 +1,9 @@
|
||||
using System.Linq.Expressions;
|
||||
using SJZY.Expand.ABP.Core.Logger;
|
||||
using SJZY.Expand.AliyunOSS;
|
||||
using Fake.Application.Dtos;
|
||||
using TrackCenter.Application.Dtos.ProvideServices;
|
||||
using TrackCenter.Application.Dtos.TrackOrder;
|
||||
using TrackCenter.Application.Helpers;
|
||||
using TrackCenter.Application.Helpers.OSS;
|
||||
using TrackCenter.Application.Services.Warning.Handlers;
|
||||
using TrackCenter.Domain.Aggregates.OrderAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackContentAggregate;
|
||||
@ -11,6 +11,7 @@ using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackPushAggregate;
|
||||
using TrackCenter.Domain.Aggregates.TrackStatusAggregate;
|
||||
using TrackCenter.Domain.Dtos.Order;
|
||||
using TrackCenter.Repository.Aggregates.OrderAggregate;
|
||||
|
||||
namespace TrackCenter.Application.Services.TrackOrders;
|
||||
|
||||
@ -23,8 +24,6 @@ public class TrackOrderService : ApplicationServiceBase
|
||||
{
|
||||
private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository;
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly ITrackContentRepository _trackContentRepository;
|
||||
private readonly ITrackStatusRepository _trackStatusRepository;
|
||||
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
|
||||
private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
@ -32,17 +31,14 @@ public class TrackOrderService : ApplicationServiceBase
|
||||
public TrackOrderService(
|
||||
IOrderRepository orderRepository,
|
||||
ITrackDetailsEsRepository trackDetailsEsRepository,
|
||||
ITrackContentRepository trackContentRepository,
|
||||
ITrackPushRecordEsRepository trackPushRecordEsRepository,
|
||||
IOrderOperationRecordEsRepository orderOperationRecordEsRepository,
|
||||
ITrackStatusRepository trackStatusRepository, IServiceProvider serviceProvider)
|
||||
IServiceProvider serviceProvider)
|
||||
{
|
||||
_orderRepository = orderRepository;
|
||||
_trackDetailsEsRepository = trackDetailsEsRepository;
|
||||
_trackContentRepository = trackContentRepository;
|
||||
_trackPushRecordEsRepository = trackPushRecordEsRepository;
|
||||
_orderOperationRecordEsRepository = orderOperationRecordEsRepository;
|
||||
_trackStatusRepository = trackStatusRepository;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
@ -147,7 +143,7 @@ public class TrackOrderService : ApplicationServiceBase
|
||||
whereExpression = m => m.Id == orderId;
|
||||
|
||||
//根据订单号+系统id查询
|
||||
if (!string.IsNullOrEmpty(orderNo) && appKey != null && appKey > 0)
|
||||
if (!string.IsNullOrEmpty(orderNo) && !string.IsNullOrEmpty(appKey))
|
||||
whereExpression = m => m.OrderNo == orderNo && m.AppKey == appKey;
|
||||
|
||||
if (whereExpression == default)
|
||||
@ -199,9 +195,6 @@ public class TrackOrderService : ApplicationServiceBase
|
||||
case SortMethod.ByTrackTimeDesc:
|
||||
list.Sort((a, b) => DateTimeHelper.ConvertUtc0Compare(b.TrackTime, b.TrackTimeZoneValue, a.TrackTime, a.TrackTimeZoneValue));
|
||||
break;
|
||||
case SortMethod.ByTemplateAndTrackTime:
|
||||
case SortMethod.ByTemplateAndTrackTimeDesc:
|
||||
throw new BusinessException(message: "该接口暂不支持该模板排序方式,如需支持请联系轨迹中台负责人");
|
||||
case SortMethod.ByCreateTime:
|
||||
list.Sort((a, b) => a.CreateTime.CompareTo(b.CreateTime));
|
||||
break;
|
||||
@ -222,41 +215,25 @@ public class TrackOrderService : ApplicationServiceBase
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("GetDetailTimeline")]
|
||||
public async Task<UnifyResultDto<List<GetDetailTimelineOutput>>> GetDetailTimeline(GetDetailTimelineInput input)
|
||||
public async Task<List<GetDetailTimelineOutput>> GetDetailTimeline(GetDetailTimelineInput input)
|
||||
{
|
||||
var res = new UnifyResultDto<List<GetDetailTimelineOutput>>(true);
|
||||
var res = new List<GetDetailTimelineOutput>();
|
||||
|
||||
var order = await _orderRepository.GetFirstAsync(m => m.OrderNo == input.OrderNumber);
|
||||
if (order == null)
|
||||
return new UnifyResultDto<List<GetDetailTimelineOutput>>(false, "订单不存在");
|
||||
|
||||
if (input.AppKey <= 0)
|
||||
return new UnifyResultDto<List<GetDetailTimelineOutput>>(false, "应用不合法");
|
||||
|
||||
if (input.CurrenUserAppKey <= 0)
|
||||
return new UnifyResultDto<List<GetDetailTimelineOutput>>(false, "当前登陆用户应用不合法");
|
||||
|
||||
var system = await _orderRepository.GetSystemInfoById(input.CurrenUserAppKey);
|
||||
if (system == null)
|
||||
return new UnifyResultDto<List<GetDetailTimelineOutput>>(false, "未找到指定id的应用");
|
||||
throw new BusinessException("订单不存在");
|
||||
|
||||
var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id);
|
||||
//时间轴不显示轨迹内容为空的轨迹,进行过滤
|
||||
trackDetails = trackDetails.Where(x => !x.TrackContent.IsNullOrWhiteSpace() && x.TrackContent != GlobalConst.EmptyString).ToList();
|
||||
res.Data = new List<GetDetailTimelineOutput>();
|
||||
|
||||
foreach (var item in trackDetails)
|
||||
{
|
||||
//如果是外部系统,且轨迹内容不对外则跳过这条轨迹内容
|
||||
if (system.SystemProperty == 2 && !item.IsExternal)
|
||||
continue;
|
||||
|
||||
//时间和时区任意一个为空则使用创建时间做为排序参照值
|
||||
var timeTick = ToUnixTimestamp((item.TrackTime == null
|
||||
|| Math.Abs(item.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1)
|
||||
var timeTick = ToUnixTimestamp(Math.Abs(item.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
|
||||
? item.CreateTime
|
||||
: item.TrackTime);
|
||||
res.Data.Add(new GetDetailTimelineOutput()
|
||||
res.Add(new GetDetailTimelineOutput()
|
||||
{
|
||||
IsHighlight = true,
|
||||
IsShowHover = true,
|
||||
@ -282,17 +259,17 @@ public class TrackOrderService : ApplicationServiceBase
|
||||
}
|
||||
|
||||
// 按轨迹发生时间正序排序
|
||||
res.Data = res.Data.OrderBy(m => m.TrackTime).ToList();
|
||||
res = res.OrderBy(m => m.TrackTime).ToList();
|
||||
|
||||
if (!order.IsCompleted) //如果没完结则显示签收节点
|
||||
{
|
||||
var eddUnixTimestamp = order.EstimatedDeliveryDate.HasValue ? ToUnixTimestamp(DateTime.Parse(order.EstimatedDeliveryDate.ToString()!)) : 0;
|
||||
var isShowTime = eddUnixTimestamp > 0 && res.Data.All(m => m.TrackTime < eddUnixTimestamp);
|
||||
var isShowTime = eddUnixTimestamp > 0 && res.All(m => m.TrackTime < eddUnixTimestamp);
|
||||
|
||||
//当存在需要显示的轨迹才需要补充签收节点
|
||||
if (res.Data.Count != 0)
|
||||
if (res.Count != 0)
|
||||
{
|
||||
res.Data.Add(new GetDetailTimelineOutput()
|
||||
res.Add(new GetDetailTimelineOutput()
|
||||
{
|
||||
Content = "签收",
|
||||
IsHighlight = false,
|
||||
|
||||
@ -1,14 +1,11 @@
|
||||
using SJZY.Expand.ABP.Core;
|
||||
using Fake.ObjectMapping;
|
||||
using TrackCenter.Application.Dtos.TrackPull;
|
||||
using TrackCenter.Application.Services;
|
||||
using TrackCenter.Domain.Aggregates.TrackPullAggregate;
|
||||
using TrackCenter.Domain.Dtos.TrackPull;
|
||||
using Volo.Abp.DependencyInjection;
|
||||
using Volo.Abp.ObjectMapping;
|
||||
|
||||
namespace TrackCenter.Application.Services.TrackPull;
|
||||
|
||||
public class TrackPullCacheService : ITransientDependency, ITrackPullCacheService
|
||||
public class TrackPullCacheService : ITransientDependency
|
||||
{
|
||||
private readonly IObjectMapper _objectMapper;
|
||||
private readonly ITrackPullConfigRepository _trackPullConfigRepository;
|
||||
|
||||
@ -1,18 +1,14 @@
|
||||
using System.ComponentModel;
|
||||
using System.Linq.Expressions;
|
||||
using Fake.Application.Dtos;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Options;
|
||||
using SJZY.Expand.ABP.Core.Localization;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using TrackCenter.Application.Dtos.TrackPull;
|
||||
using TrackCenter.Application.Services;
|
||||
using TrackCenter.Domain.Aggregates.TrackPullAggregate;
|
||||
using TrackCenter.Domain.Dtos.TrackPull;
|
||||
using SqlSugar;
|
||||
using TrackCenter.Application.Helpers;
|
||||
using TrackCenter.Application.Localization;
|
||||
using TrackCenter.Application.Options;
|
||||
using TrackCenter.Repository;
|
||||
|
||||
namespace TrackCenter.Application.Services.TrackPull;
|
||||
|
||||
@ -212,7 +208,7 @@ public class TrackPullService : ApplicationServiceBase
|
||||
|
||||
if (await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
|
||||
x.TrackContentId == input.TrackContentId)))
|
||||
throw new BusinessException("找不到配置");
|
||||
throw new BusinessException("配置已存在");
|
||||
|
||||
if (!input.TrackStatusValues.IsNullOrEmpty())
|
||||
{
|
||||
@ -223,7 +219,7 @@ public class TrackPullService : ApplicationServiceBase
|
||||
});
|
||||
|
||||
if (await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(trackStatusValuesExp)))
|
||||
throw new BusinessException(message: _stringLocalizer["IsTrackPullContentStatusValueAny"]);
|
||||
throw new BusinessException(message: "配置已存在");
|
||||
}
|
||||
|
||||
if (!input.TrackKeywords.IsNullOrEmpty())
|
||||
@ -235,7 +231,7 @@ public class TrackPullService : ApplicationServiceBase
|
||||
});
|
||||
|
||||
if (await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(trackKeywordExp)))
|
||||
throw new BusinessException(message: _stringLocalizer["IsTrackPullContentKeywordsAny"]);
|
||||
throw new BusinessException(message: "配置已存在");
|
||||
}
|
||||
}
|
||||
|
||||
@ -255,7 +251,7 @@ public class TrackPullService : ApplicationServiceBase
|
||||
{
|
||||
var oldTrackPullContentEntity =
|
||||
await _trackPullConfigRepository.GetContentByIdAsync(input.Id!.Value) ??
|
||||
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
|
||||
throw new BusinessException(message: "找不到数据");
|
||||
|
||||
ObjectMapper.Map(input, oldTrackPullContentEntity);
|
||||
|
||||
@ -269,7 +265,7 @@ public class TrackPullService : ApplicationServiceBase
|
||||
{
|
||||
var oldTrackPullContentEntity =
|
||||
await _trackPullConfigRepository.GetContentByIdAsync(input.Id!.Value) ??
|
||||
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
|
||||
throw new BusinessException(message: "找不到数据");
|
||||
|
||||
await _trackPullConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id);
|
||||
await _trackPullCacheService.SetPullConfigAsync(oldTrackPullContentEntity.TrackPullConfigId);
|
||||
@ -278,8 +274,7 @@ public class TrackPullService : ApplicationServiceBase
|
||||
}
|
||||
|
||||
default:
|
||||
throw new BusinessException(message: _stringLocalizer[SjzyBasicLocalization.Validation_IsInEnum,
|
||||
nameof(EditTrackPullContentInput.Options)]);
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@ -147,7 +147,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
|
||||
case OptionTypeNoNull.修改:
|
||||
var oldTrackPushEntity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ??
|
||||
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
|
||||
throw new BusinessException(message: "找不到数据");
|
||||
|
||||
ObjectMapper.Map(input, oldTrackPushEntity);
|
||||
await _trackPushConfigRepository.UpdateAsync(oldTrackPushEntity);
|
||||
@ -157,7 +157,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
|
||||
case OptionTypeNoNull.删除:
|
||||
var entity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ??
|
||||
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
|
||||
throw new BusinessException(message: "找不到数据");
|
||||
|
||||
await _trackPushConfigRepository.SoftDeleteAsync(x => x.Id == input.Id);
|
||||
await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.TrackPushConfigId == input.Id);
|
||||
@ -245,7 +245,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
case OptionTypeNoNull.修改:
|
||||
{
|
||||
var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ??
|
||||
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
|
||||
throw new BusinessException(message: "找不到数据");
|
||||
oldContentConfig = entity.DeepCopy();
|
||||
ObjectMapper.Map(input, entity);
|
||||
await _trackPushConfigRepository.UpdateContentAsync(entity);
|
||||
@ -256,7 +256,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
|
||||
case OptionTypeNoNull.删除:
|
||||
{
|
||||
var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ??
|
||||
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
|
||||
throw new BusinessException(message: "找不到数据");
|
||||
oldContentConfig = entity;
|
||||
trackPushConfigId = entity.TrackPushConfigId;
|
||||
await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id);
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
using DotNetCore.CAP;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using Fake.Application.Dtos;
|
||||
using InterfaceForward.Domain.Shared.Helpers;
|
||||
using TrackCenter.Application.Dtos.Warning;
|
||||
using TrackCenter.Application.Dtos.Warning.Return;
|
||||
using TrackCenter.Application.Events;
|
||||
@ -7,13 +8,10 @@ using TrackCenter.Domain.Aggregates.OrderAggregate;
|
||||
using TrackCenter.Domain.Aggregates.WarningAggregate;
|
||||
using TrackCenter.Domain.Dtos.Warning;
|
||||
using TrackCenter.Domain.Enums;
|
||||
using TrackCenter.Domain.Queries;
|
||||
using SJZY.UserCenter.HttpApi.Services.User;
|
||||
using TrackCenter.Application.Caching;
|
||||
using TrackCenter.Application.Helpers;
|
||||
using TrackCenter.Application.Services.Warning.Handlers;
|
||||
using TrackCenter.Application.Services.Warning.Model;
|
||||
using Volo.Abp.Http.Client.DynamicProxying;
|
||||
|
||||
namespace TrackCenter.Application.Services.Warning;
|
||||
|
||||
@ -25,39 +23,30 @@ namespace TrackCenter.Application.Services.Warning;
|
||||
public class ReturnWarningService : ApplicationServiceBase
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly IVSystemQueries _vSystemQueries;
|
||||
private readonly IReturnWarningHandler _returnWarningHandler;
|
||||
private readonly IWarningRuleRepository _warningRuleRepository;
|
||||
private readonly IWarningDetailsEsRepository _warningDetailsEsRepository;
|
||||
private readonly ICapPublisher _capPublisher;
|
||||
private readonly IHttpClientProxy<IUserBaseInfoService> _requestCurrentUserService;
|
||||
private readonly TrackStatusNameDictCache _trackStatusNameDictCache;
|
||||
private readonly CustomAbbreviationDictCache _customAbbreviationDictCache;
|
||||
private readonly SystemCnNameDictCache _systemCnNameDictCache;
|
||||
private readonly AppNameDictCache _appNameDictCache;
|
||||
|
||||
public ReturnWarningService(
|
||||
IOrderRepository orderRepository,
|
||||
IVSystemQueries vSystemQueries,
|
||||
IReturnWarningHandler returnWarningHandler,
|
||||
IWarningRuleRepository warningRuleRepository,
|
||||
IWarningDetailsEsRepository warningDetailsEsRepository,
|
||||
ICapPublisher capPublisher,
|
||||
IHttpClientProxy<IUserBaseInfoService> requestCurrentUserService,
|
||||
TrackStatusNameDictCache trackStatusNameDictCache,
|
||||
CustomAbbreviationDictCache customAbbreviationDictCache,
|
||||
SystemCnNameDictCache systemCnNameDictCache
|
||||
AppNameDictCache appNameDictCache
|
||||
)
|
||||
{
|
||||
_orderRepository = orderRepository;
|
||||
_vSystemQueries = vSystemQueries;
|
||||
_returnWarningHandler = returnWarningHandler;
|
||||
_warningRuleRepository = warningRuleRepository;
|
||||
_warningDetailsEsRepository = warningDetailsEsRepository;
|
||||
_capPublisher = capPublisher;
|
||||
_requestCurrentUserService = requestCurrentUserService;
|
||||
_trackStatusNameDictCache = trackStatusNameDictCache;
|
||||
_customAbbreviationDictCache = customAbbreviationDictCache;
|
||||
_systemCnNameDictCache = systemCnNameDictCache;
|
||||
_appNameDictCache = appNameDictCache;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -66,12 +55,12 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("GetReturnWarningRuleItem")]
|
||||
public async Task<UnifyResultDto<List<ReturnWarningRuleItemDto>>> GetReturnWarningRuleItem(GetReturnWarningRuleItemInput input)
|
||||
public async Task<List<ReturnWarningRuleItemDto>> GetReturnWarningRuleItem(GetReturnWarningRuleItemInput input)
|
||||
{
|
||||
var result = await _warningRuleRepository.GetReturnRuleItemsAsync(input.WarningId);
|
||||
|
||||
if (result.Count == 0)
|
||||
return new UnifyResultDto<List<ReturnWarningRuleItemDto>>(true, new List<ReturnWarningRuleItemDto>());
|
||||
return new List<ReturnWarningRuleItemDto>();
|
||||
|
||||
var trackStatusIds = result
|
||||
.SelectMany(x => x.TrackStatusIds.Split(',').Select(int.Parse))
|
||||
@ -83,10 +72,10 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
Id = x.Id,
|
||||
TrackStatus = BuildTrackStatus(x.TrackStatusIds),
|
||||
ReturnTimeSpan = x.ReturnTimeSpan,
|
||||
NotifyUsers = x.NotifyUsers.ToObject<List<NotifyUserDto>>()
|
||||
NotifyUsers = x.NotifyUsers.ToObject<List<NotifyUserDto>>()!
|
||||
});
|
||||
|
||||
return new UnifyResultDto<List<ReturnWarningRuleItemDto>>(true, map.ToList());
|
||||
return map.ToList();
|
||||
|
||||
List<TrackStatusDto> BuildTrackStatus(string statusIds)
|
||||
{
|
||||
@ -112,28 +101,25 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
{
|
||||
var vo = ObjectMapper.Map<GetPageReturnWarningDetailsInput, GetPageReturnWarningDetailsInputVO>(input);
|
||||
var result = await _warningDetailsEsRepository.GetPageReturnWarningDetailsAsync(vo);
|
||||
if (result.List.Count == 0)
|
||||
if (result.Items.Count == 0)
|
||||
{
|
||||
return new PagedResult<ReturnWarningDetailsDto>(new List<ReturnWarningDetailsDto>(),
|
||||
result.Pagination.PageIndex,
|
||||
result.Pagination.PageSize,
|
||||
result.Pagination.Total);
|
||||
return new PagedResult<ReturnWarningDetailsDto>(result.TotalCount, new List<ReturnWarningDetailsDto>());
|
||||
}
|
||||
|
||||
// 订单类型名称字典
|
||||
var orderTypeDict = await _orderRepository.GetTrackOrderTypeDictAsync();
|
||||
// 客户id简称字典
|
||||
var customIds = result.List.Select(x => x.CustomId).ToHashSet();
|
||||
var customIds = result.Items.Select(x => x.CustomId).ToHashSet();
|
||||
var customDict = await _customAbbreviationDictCache.SafeGetBatchAsync(customIds);
|
||||
// 应用中文名字典
|
||||
var AppKeys = result.List.Select(x => x.AppKey).ToHashSet();
|
||||
var AppDict = await _systemCnNameDictCache.SafeGetBatchAsync(AppKeys);
|
||||
var appKeys = result.Items.Select(x => x.AppKey).ToHashSet();
|
||||
var appDict = await _appNameDictCache.SafeGetBatchAsync(appKeys);
|
||||
|
||||
var map = result.List.Select(x => new ReturnWarningDetailsDto
|
||||
var map = result.Items.Select(x => new ReturnWarningDetailsDto
|
||||
{
|
||||
EsId = x.Id,
|
||||
AppKey = x.AppKey,
|
||||
AppName = AppDict.GetValueOrDefault(x.AppKey, GlobalConst.EmptyString),
|
||||
AppName = appDict.GetValueOrDefault(x.AppKey, GlobalConst.EmptyString),
|
||||
OrderType = x.OrderType,
|
||||
OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString(), GlobalConst.EmptyString),
|
||||
OrderId = x.OrderId,
|
||||
@ -173,18 +159,14 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
.OrderBy(x => x.Status == (int) ReturnWarningStatus.人工介入 ? 1 : 2)
|
||||
.ThenByDescending(x => x.CreateTime); //同状态组按时间降序;
|
||||
|
||||
return new PagedResult<ReturnWarningDetailsDto>(
|
||||
sorted.ToList(),
|
||||
result.Pagination.PageIndex,
|
||||
result.Pagination.PageSize,
|
||||
result.Pagination.Total);
|
||||
return new PagedResult<ReturnWarningDetailsDto>(result.TotalCount, sorted.ToList());
|
||||
|
||||
// 通知用户提取用户名称
|
||||
string ToUserNames(string? notifyUsers)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(notifyUsers))
|
||||
return string.Empty;
|
||||
return string.Join(',', notifyUsers.ToObject<List<NotifyUserDto>>().Select(x => x.UserName));
|
||||
return string.Join(',', notifyUsers.ToObject<List<NotifyUserDto>>()!.Select(x => x.UserName));
|
||||
}
|
||||
|
||||
// 时间
|
||||
@ -200,7 +182,7 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
/// 获取回传报文日志
|
||||
/// </summary>
|
||||
[HttpPost("GetReturnMessageRecord")]
|
||||
public async Task<UnifyResultDto<List<ReturnMessageRecordDto>>> GetReturnMessageRecord(GetReturnMessageRecordInput input)
|
||||
public async Task<List<ReturnMessageRecordDto>> GetReturnMessageRecord(GetReturnMessageRecordInput input)
|
||||
{
|
||||
var result = await _warningDetailsEsRepository.GetReturnMessageRecordListByIdAsync(input.WarningDetailsId);
|
||||
|
||||
@ -213,7 +195,7 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
CreateTime = x.CreateTime
|
||||
});
|
||||
|
||||
return new UnifyResultDto<List<ReturnMessageRecordDto>>(true, map.ToList());
|
||||
return map.ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -222,7 +204,7 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("EditReturnWarningRuleItem")]
|
||||
public async Task<UnifyResultDto> EditReturnWarningRuleItem(EditReturnWarningRuleItemInput input)
|
||||
public async Task EditReturnWarningRuleItem(EditReturnWarningRuleItemInput input)
|
||||
{
|
||||
var rule = await _warningRuleRepository.GetWarningRuleByIdAsync(input.WarningId, WarningRuleType.回传时效预警);
|
||||
if (rule == null)
|
||||
@ -238,8 +220,6 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
}
|
||||
|
||||
await _returnWarningHandler.HandleEditAsync(rule, bos);
|
||||
|
||||
return new UnifyResultDto(true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -247,7 +227,7 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("ReturnPush")]
|
||||
public async Task<UnifyResultDto> ReturnPush(ReturnPushInput input)
|
||||
public async Task<string> ReturnPush(ReturnPushInput input)
|
||||
{
|
||||
if (input.WarningDetailIds.Count == 0)
|
||||
{
|
||||
@ -275,22 +255,6 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
throw new BusinessException(message: "一个能推送的也没有");
|
||||
}
|
||||
|
||||
// 获取当前用户信息
|
||||
var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync();
|
||||
if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null)
|
||||
{
|
||||
throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}");
|
||||
}
|
||||
|
||||
// 应用换code
|
||||
var AppKeys = filtered.Select(x => x.AppKey).ToHashSet();
|
||||
var AppCodeDict = (await _vSystemQueries
|
||||
.GetListAsync(x => AppKeys.Contains(x.Id), x => new
|
||||
{
|
||||
x.Id,
|
||||
x.Key
|
||||
})).ToDictionary(x => x.Id, x => x.Key);
|
||||
|
||||
// 3.进行推送
|
||||
foreach (var detail in filtered)
|
||||
{
|
||||
@ -298,14 +262,13 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
{
|
||||
OptionType = OptionType.新增,
|
||||
AppKey = detail.AppKey,
|
||||
AppCode = AppCodeDict.GetValueOrDefault(detail.AppKey, $"系统代码{detail.AppKey}不存在"),
|
||||
CustomId = detail.CustomId,
|
||||
OrderIdTrackMetadataDict = new Dictionary<int, KeyValuePair<string, long>>
|
||||
OrderIdTrackMetadataDict = new Dictionary<int, TrackMetadata>
|
||||
{
|
||||
[detail.OrderId] = KeyValuePair.Create(detail.TrackEsId, detail.TrackVersion)
|
||||
[detail.OrderId] = TrackMetadata.Build(detail.Id, detail.TrackVersion, detail.CreateTime)
|
||||
},
|
||||
TrackCode = detail.TrackCode,
|
||||
OperationMan = userInfo.Data.UserName,
|
||||
OperationMan = CurrentUser.UserName,
|
||||
SystemPushInfo = new SystemPushStruct
|
||||
{
|
||||
TrackStatusId = detail.TrackStatusId,
|
||||
@ -323,7 +286,7 @@ public class ReturnWarningService : ApplicationServiceBase
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent);
|
||||
}
|
||||
|
||||
return new UnifyResultDto(true, $"即将进行{filtered.Count}个回传推送!");
|
||||
return $"即将进行{filtered.Count}个回传推送!";
|
||||
}
|
||||
|
||||
// 检查集合中是否存在交集
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using Fake.Application.Dtos;
|
||||
using InterfaceForward.Domain.Shared.Helpers;
|
||||
using TrackCenter.Application.Dtos.Warning;
|
||||
using TrackCenter.Application.Dtos.Warning.Transport;
|
||||
using TrackCenter.Application.Caching;
|
||||
@ -29,8 +30,7 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
|
||||
private readonly ITransportWarningHandler _transportWarningHandler;
|
||||
private readonly TrackStatusNameDictCache _trackStatusNameDictCache;
|
||||
private readonly CustomAbbreviationDictCache _customAbbreviationDictCache;
|
||||
private readonly SystemCnNameDictCache _systemCnNameDictCache;
|
||||
private readonly AppNameDictCache _appNameDictCache;
|
||||
|
||||
public TransportWarningService(
|
||||
IOrderRepository orderRepository,
|
||||
@ -40,8 +40,7 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
ITrackDetailsEsRepository trackDetailsEsRepository,
|
||||
ITransportWarningHandler transportWarningHandler,
|
||||
TrackStatusNameDictCache trackStatusNameDictCache,
|
||||
CustomAbbreviationDictCache customAbbreviationDictCache,
|
||||
SystemCnNameDictCache systemCnNameDictCache
|
||||
AppNameDictCache appNameDictCache
|
||||
)
|
||||
{
|
||||
_orderRepository = orderRepository;
|
||||
@ -51,8 +50,7 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
_trackDetailsEsRepository = trackDetailsEsRepository;
|
||||
_transportWarningHandler = transportWarningHandler;
|
||||
_trackStatusNameDictCache = trackStatusNameDictCache;
|
||||
_customAbbreviationDictCache = customAbbreviationDictCache;
|
||||
_systemCnNameDictCache = systemCnNameDictCache;
|
||||
_appNameDictCache = appNameDictCache;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -61,10 +59,10 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("GetTransportWarningScene")]
|
||||
public async Task<UnifyResultDto<List<TransportWarningSceneDto>>> GetTransportWarningScene(GetTransportWarningSceneInput input)
|
||||
public async Task<List<TransportWarningSceneDto>> GetTransportWarningScene(GetTransportWarningSceneInput input)
|
||||
{
|
||||
var entities = await _warningRuleRepository.GetTransportSceneAsync(input.WarningId);
|
||||
if (entities.Count == 0) return new UnifyResultDto<List<TransportWarningSceneDto>>(true, Empty<TransportWarningSceneDto>.List);
|
||||
if (entities.Count == 0) return Empty<TransportWarningSceneDto>.List;
|
||||
|
||||
var areaIds = entities
|
||||
.Select(x => x.AreaId)
|
||||
@ -97,7 +95,7 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
AreaName = x.AreaId.HasValue ? areaNameDict?.GetValueOrDefault(x.AreaId.Value) : null
|
||||
});
|
||||
|
||||
return new UnifyResultDto<List<TransportWarningSceneDto>>(true, map.ToList());
|
||||
return map.ToList();
|
||||
|
||||
// 构建场景摘要
|
||||
string BuildSummary(TransportWarningSceneEntity entity)
|
||||
@ -139,7 +137,7 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("GetTransportWarningSceneRuleItem")]
|
||||
public async Task<UnifyResultDto<List<TransportWarningSceneRuleItemDto>>> GetTransportWarningSceneRuleItem(GetTransportWarningSceneRuleItemInput input)
|
||||
public async Task<List<TransportWarningSceneRuleItemDto>> GetTransportWarningSceneRuleItem(GetTransportWarningSceneRuleItemInput input)
|
||||
{
|
||||
var entities = await _warningRuleRepository.GetTransportSceneRuleItemsAsync(input.WarningId, input.SceneId);
|
||||
|
||||
@ -162,7 +160,7 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
NotifyUsers = x.NotifyUsers.ToObject<List<NotifyUserDto>>()
|
||||
});
|
||||
|
||||
return new UnifyResultDto<List<TransportWarningSceneRuleItemDto>>(true, map.ToList());
|
||||
return map.ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -178,16 +176,13 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
if (input.Status == (int) TransportWarningStatus.已超时)
|
||||
vo.Status = (int) TransportWarningStatus.即将超时;
|
||||
var result = await _warningDetailsEsRepository.GetPageTransportWarningDetailsAsync(vo);
|
||||
if (result.List.Count == 0)
|
||||
if (result.Items.Count == 0)
|
||||
{
|
||||
return new PagedResult<TransportWarningDetailsDto>(new List<TransportWarningDetailsDto>(),
|
||||
result.Pagination.PageIndex,
|
||||
result.Pagination.PageSize,
|
||||
result.Pagination.Total);
|
||||
return new PagedResult<TransportWarningDetailsDto>(0, new List<TransportWarningDetailsDto>());
|
||||
}
|
||||
|
||||
// 查最新轨迹(创建时间)
|
||||
var orderIds = result.List.Select(x => x.OrderId).ToHashSet();
|
||||
var orderIds = result.Items.Select(x => x.OrderId).ToHashSet();
|
||||
var orderIdTrackDict = await _trackDetailsEsRepository.GetLatestDictAsync(orderIds);
|
||||
// 查轨迹状态最早轨迹
|
||||
var orderIdTrackStatusEarliestTrackDict = await _trackDetailsEsRepository.GetTrackStatusEarliestDictAsync(orderIds);
|
||||
@ -195,13 +190,13 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
// 订单类型名称字典
|
||||
var orderTypeDict = await _orderRepository.GetTrackOrderTypeDictAsync();
|
||||
// 客户id简称字典
|
||||
var customIds = result.List.Select(x => x.CustomId).ToHashSet();
|
||||
var customIds = result.Items.Select(x => x.CustomId).ToHashSet();
|
||||
var customDict = await _customAbbreviationDictCache.SafeGetBatchAsync(customIds);
|
||||
// 应用中文名字典
|
||||
var AppKeys = result.List.Select(x => x.AppKey).ToHashSet();
|
||||
var AppDict = await _systemCnNameDictCache.SafeGetBatchAsync(AppKeys);
|
||||
var appKeys = result.Items.Select(x => x.AppKey).ToHashSet();
|
||||
var appDict = await _appNameDictCache.SafeGetBatchAsync(appKeys);
|
||||
|
||||
var map = result.List.Select(x =>
|
||||
var map = result.Items.Select(x =>
|
||||
{
|
||||
var orderIdTrack = orderIdTrackDict.GetValueOrDefault(x.OrderId);
|
||||
var orderIdTrackStatusEarliestTracks = orderIdTrackStatusEarliestTrackDict.GetValueOrDefault(x.OrderId);
|
||||
@ -211,7 +206,7 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
{
|
||||
EsId = x.Id,
|
||||
AppKey = x.AppKey,
|
||||
AppName = AppDict.GetValueOrDefault(x.AppKey, GlobalConst.EmptyString),
|
||||
AppName = appDict.GetValueOrDefault(x.AppKey, GlobalConst.EmptyString),
|
||||
CustomId = x.CustomId,
|
||||
CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
|
||||
OrderId = x.OrderId,
|
||||
@ -259,18 +254,14 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
.ThenByDescending(x => x.CreateTime) //同状态组按时间降序
|
||||
.ToList();
|
||||
|
||||
return new PagedResult<TransportWarningDetailsDto>(
|
||||
sorted,
|
||||
result.Pagination.PageIndex,
|
||||
result.Pagination.PageSize,
|
||||
result.Pagination.Total);
|
||||
return new PagedResult<TransportWarningDetailsDto>(0, sorted);
|
||||
|
||||
// 通知用户提取用户名称
|
||||
string ToUserNames(string notifyUsers)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(notifyUsers))
|
||||
return string.Empty;
|
||||
return string.Join(',', notifyUsers.ToObject<List<NotifyUserDto>>().Select(x => x.UserName));
|
||||
return string.Join(',', notifyUsers.ToObject<List<NotifyUserDto>>()!.Select(x => x.UserName));
|
||||
}
|
||||
|
||||
// 格式化累计运输时间为文本形式
|
||||
@ -288,7 +279,7 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("UpsertTransportWarningScene")]
|
||||
public async Task<UnifyResultDto<IdBaseDto>> UpsertTransportWarningScene(UpsertTransportWarningSceneInput input)
|
||||
public async Task<IdBaseDto> UpsertTransportWarningScene(UpsertTransportWarningSceneInput input)
|
||||
{
|
||||
var rule = await _warningRuleRepository.GetWarningRuleByIdAsync(input.WarningId, WarningRuleType.运输时效预警);
|
||||
if (rule == null)
|
||||
@ -315,10 +306,10 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
if (oldBo != null)
|
||||
await _transportWarningHandler.HandleSceneChangedAsync(rule, oldBo, postBo);
|
||||
|
||||
return new UnifyResultDto<IdBaseDto>(true, new IdBaseDto
|
||||
return new IdBaseDto
|
||||
{
|
||||
Id = id
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -327,7 +318,7 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("DeleteTransportWarningScene")]
|
||||
public async Task<UnifyResultDto> DeleteTransportWarningScene(DeleteTransportWarningSceneInput input)
|
||||
public async Task DeleteTransportWarningScene(DeleteTransportWarningSceneInput input)
|
||||
{
|
||||
var rule = await _warningRuleRepository.GetWarningRuleByIdAsync(input.WarningId, WarningRuleType.运输时效预警);
|
||||
if (rule == null)
|
||||
@ -346,8 +337,6 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
|
||||
// 处理删除后
|
||||
await _transportWarningHandler.HandleSceneDeletedAsync(rule, TransportWarningSceneBO.From(scene));
|
||||
|
||||
return new UnifyResultDto(true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -356,7 +345,7 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("EditTransportWarningSceneRuleItem")]
|
||||
public async Task<UnifyResultDto> EditTransportWarningSceneRuleItem(EditTransportWarningSceneRuleItemInput input)
|
||||
public async Task EditTransportWarningSceneRuleItem(EditTransportWarningSceneRuleItemInput input)
|
||||
{
|
||||
// 起始轨迹生成预警时间不能大于时效
|
||||
if (input.Items.Count > 0 && input.Items.Any(x => x.StartTrackWarningTimeSpan >= x.TransportTimeSpan))
|
||||
@ -393,7 +382,5 @@ public class TransportWarningService : ApplicationServiceBase
|
||||
|
||||
var sceneBo = TransportWarningSceneBO.From(ruleScene);
|
||||
await _transportWarningHandler.HandleEditAsync(rule, sceneBo, postRuleItems);
|
||||
|
||||
return new UnifyResultDto(true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@ public class WarningService : ApplicationServiceBase
|
||||
private readonly ITransportWarningHandler _transportWarningHandler;
|
||||
private readonly IReturnWarningHandler _returnWarningHandler;
|
||||
private readonly CustomAbbreviationDictCache _customAbbreviationDictCache;
|
||||
private readonly SystemCnNameDictCache _systemCnNameDictCache;
|
||||
private readonly AppNameDictCache _appNameDictCache;
|
||||
|
||||
public WarningService(
|
||||
IWarningRuleRepository warningRuleRepository,
|
||||
@ -26,7 +26,7 @@ public class WarningService : ApplicationServiceBase
|
||||
ITransportWarningHandler transportWarningHandler,
|
||||
IReturnWarningHandler returnWarningHandler,
|
||||
CustomAbbreviationDictCache customAbbreviationDictCache,
|
||||
SystemCnNameDictCache systemCnNameDictCache
|
||||
AppNameDictCache appNameDictCache
|
||||
)
|
||||
{
|
||||
_warningRuleRepository = warningRuleRepository;
|
||||
@ -34,7 +34,7 @@ public class WarningService : ApplicationServiceBase
|
||||
_transportWarningHandler = transportWarningHandler;
|
||||
_returnWarningHandler = returnWarningHandler;
|
||||
_customAbbreviationDictCache = customAbbreviationDictCache;
|
||||
_systemCnNameDictCache = systemCnNameDictCache;
|
||||
_appNameDictCache = appNameDictCache;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -43,24 +43,24 @@ public class WarningService : ApplicationServiceBase
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("GetWarningRule")]
|
||||
public async Task<UnifyResultDto<List<WarningRuleDto>>> GetWarningRule(GetWarningRuleInput input)
|
||||
public async Task<List<WarningRuleDto>> GetWarningRule(GetWarningRuleInput input)
|
||||
{
|
||||
var result = await _warningRuleRepository.GetWarningRuleListAsync(input.AppKey, input.CustomId, input.KpiName, input.IsEnabled, input.WarningType);
|
||||
if (result.Count == 0)
|
||||
return new UnifyResultDto<List<WarningRuleDto>>(true, new List<WarningRuleDto>());
|
||||
return new List<WarningRuleDto>();
|
||||
|
||||
// 客户id简称字典
|
||||
var customIds = result.Select(x => x.CustomId).ToHashSet();
|
||||
var customDict = await _customAbbreviationDictCache.SafeGetBatchAsync(customIds);
|
||||
// 应用中文名字典
|
||||
var AppKeys = result.Select(x => x.AppKey).ToHashSet();
|
||||
var AppDict = await _systemCnNameDictCache.SafeGetBatchAsync(AppKeys);
|
||||
var appKeys = result.Select(x => x.AppKey).ToHashSet();
|
||||
var appDict = await _appNameDictCache.SafeGetBatchAsync(appKeys);
|
||||
|
||||
return new UnifyResultDto<List<WarningRuleDto>>(true, result.Select(x => new WarningRuleDto
|
||||
return result.Select(x => new WarningRuleDto
|
||||
{
|
||||
Id = x.Id,
|
||||
AppKey = x.AppKey,
|
||||
AppName = AppDict.GetValueOrDefault(x.AppKey, GlobalConst.EmptyString),
|
||||
AppName = appDict.GetValueOrDefault(x.AppKey, GlobalConst.EmptyString),
|
||||
CustomId = x.CustomId,
|
||||
CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
|
||||
Name = x.Name,
|
||||
@ -69,7 +69,7 @@ public class WarningService : ApplicationServiceBase
|
||||
Version = x.Version,
|
||||
CreateTime = x.CreateTime,
|
||||
UpdateTime = x.UpdateTime,
|
||||
}).ToList());
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -79,7 +79,7 @@ public class WarningService : ApplicationServiceBase
|
||||
/// <returns></returns>
|
||||
/// <exception cref="BusinessException"></exception>
|
||||
[HttpPost("UpdateEnabledStatus")]
|
||||
public async Task<UnifyResultDto<IdBaseDto>> UpdateEnabledStatus(UpdateEnabledStatusInput input)
|
||||
public async Task<IdBaseDto> UpdateEnabledStatus(UpdateEnabledStatusInput input)
|
||||
{
|
||||
var rule = await _warningRuleRepository.GetWarningRuleByIdAsync(input.WarningId, (WarningRuleType) input.WarningType);
|
||||
if (rule == null)
|
||||
@ -105,10 +105,10 @@ public class WarningService : ApplicationServiceBase
|
||||
// 预警规则主体状态变化处理
|
||||
await HandleRuleEnabledChangedAsync(rule);
|
||||
|
||||
return new UnifyResultDto<IdBaseDto>(true, new IdBaseDto
|
||||
return new IdBaseDto
|
||||
{
|
||||
Id = rule.Id
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -117,7 +117,7 @@ public class WarningService : ApplicationServiceBase
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("UpsertWarningRule")]
|
||||
public async Task<UnifyResultDto<IdBaseDto>> UpsertWarningRule(UpsertWarningRuleInput input)
|
||||
public async Task<IdBaseDto> UpsertWarningRule(UpsertWarningRuleInput input)
|
||||
{
|
||||
WarningRuleEntity? ruleEntity = null;
|
||||
// 当为修改操作时,则要求被修改的主体必须存在
|
||||
@ -169,10 +169,10 @@ public class WarningService : ApplicationServiceBase
|
||||
if (enabledChanged)
|
||||
await HandleRuleEnabledChangedAsync(ruleEntity);
|
||||
|
||||
return new UnifyResultDto<IdBaseDto>(true, new IdBaseDto
|
||||
return new IdBaseDto
|
||||
{
|
||||
Id = id
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
private async Task HandleRuleEnabledChangedAsync(WarningRuleEntity rule)
|
||||
|
||||
@ -189,12 +189,6 @@ public class OrderEntity : FullAuditedAggregateRoot<int>
|
||||
[SugarColumn(ColumnName = "DestinationTimeZone")]
|
||||
public float? DestinationTimeZone { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 模板code
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "TemplateCodes")]
|
||||
public string? TemplateCodes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 冗余订单第三方订单号(创建订单,更新订单时维护)
|
||||
/// </summary>
|
||||
|
||||
33
src/TrackCenter.Domain/ExpressionExtensions.cs
Normal file
33
src/TrackCenter.Domain/ExpressionExtensions.cs
Normal file
@ -0,0 +1,33 @@
|
||||
namespace TrackCenter.Domain;
|
||||
|
||||
public static class ExpressionExtensions
|
||||
{
|
||||
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
|
||||
{
|
||||
Expression right = new RebindParameterVisitor(expr2.Parameters[0], expr1.Parameters[0]).Visit(expr2.Body);
|
||||
return Expression.Lambda<Func<T, bool>>((Expression) Expression.AndAlso(expr1.Body, right), (IEnumerable<ParameterExpression>) expr1.Parameters);
|
||||
}
|
||||
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
|
||||
Expression<Func<T, bool>> expr2)
|
||||
{
|
||||
var expr2Body = new RebindParameterVisitor(expr2.Parameters[0], expr1.Parameters[0]).Visit(expr2.Body);
|
||||
return Expression.Lambda<Func<T, bool>>(Expression.OrElse(expr1.Body, expr2Body), expr1.Parameters);
|
||||
}
|
||||
|
||||
private class RebindParameterVisitor : ExpressionVisitor
|
||||
{
|
||||
private readonly ParameterExpression _oldParameter;
|
||||
private readonly ParameterExpression _newParameter;
|
||||
|
||||
public RebindParameterVisitor(ParameterExpression oldParameter, ParameterExpression newParameter)
|
||||
{
|
||||
_oldParameter = oldParameter;
|
||||
_newParameter = newParameter;
|
||||
}
|
||||
|
||||
protected override Expression VisitParameter(ParameterExpression node)
|
||||
{
|
||||
return node == _oldParameter ? _newParameter : base.VisitParameter(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -116,29 +116,4 @@ public static class CollectionExtensions
|
||||
_ => false
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
|
||||
{
|
||||
Expression right = new RebindParameterVisitor(expr2.Parameters[0], expr1.Parameters[0]).Visit(expr2.Body);
|
||||
return Expression.Lambda<Func<T, bool>>((Expression) Expression.AndAlso(expr1.Body, right), (IEnumerable<ParameterExpression>) expr1.Parameters);
|
||||
}
|
||||
|
||||
private class RebindParameterVisitor : ExpressionVisitor
|
||||
{
|
||||
private readonly ParameterExpression _oldParameter;
|
||||
private readonly ParameterExpression _newParameter;
|
||||
|
||||
public RebindParameterVisitor(ParameterExpression oldParameter, ParameterExpression newParameter)
|
||||
{
|
||||
_oldParameter = oldParameter;
|
||||
_newParameter = newParameter;
|
||||
}
|
||||
|
||||
protected override Expression VisitParameter(ParameterExpression node)
|
||||
{
|
||||
return node == _oldParameter ? _newParameter : base.VisitParameter(node);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user