Merge branch 'S07' into test
This commit is contained in:
commit
97ddcd8df8
@ -0,0 +1,14 @@
|
|||||||
|
namespace SJZY.Track.Application.Contract.Dtos.TrackPush;
|
||||||
|
|
||||||
|
public class TrackPushConfigTagDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 订单类型值
|
||||||
|
/// </summary>
|
||||||
|
public int Type { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 订单类型名称
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
@ -42,6 +42,11 @@ public class TrackPushContentConfigDto
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string TrackCode { get; set; } = null!;
|
public string TrackCode { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送顺序
|
||||||
|
/// </summary>
|
||||||
|
public int Sort { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 可交换顺序的轨迹code
|
/// 可交换顺序的轨迹code
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -31,6 +31,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
private readonly IBroadcastingService _broadcastingService;
|
private readonly IBroadcastingService _broadcastingService;
|
||||||
private List<OrderEntity> _orders = null!;
|
private List<OrderEntity> _orders = null!;
|
||||||
private List<TrackPushContentConfigDto> _pushConfigs = null!;
|
private List<TrackPushContentConfigDto> _pushConfigs = null!;
|
||||||
|
private Dictionary<int, List<TrackPushContentConfigDto>> _orderTypeSortedConfigsDict = null!; //订单类型,根据sort从小到大排序后的配置字典
|
||||||
|
|
||||||
public TrackPushEventHandler(IHttpClientProxy<IInterfaceForwardServiceV2> httpClientProxy,
|
public TrackPushEventHandler(IHttpClientProxy<IInterfaceForwardServiceV2> httpClientProxy,
|
||||||
IOrderRepository orderRepository,
|
IOrderRepository orderRepository,
|
||||||
@ -61,6 +62,11 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
}
|
}
|
||||||
|
|
||||||
_pushConfigs = pushConfigs;
|
_pushConfigs = pushConfigs;
|
||||||
|
_orderTypeSortedConfigsDict = pushConfigs
|
||||||
|
.GroupBy(x => x.OrderType)
|
||||||
|
.ToDictionary(x => x.Key,
|
||||||
|
y => y.OrderBy(item => item.Sort).ToList()
|
||||||
|
);
|
||||||
|
|
||||||
var orders = await _orderRepository.GetListAsync(x =>
|
var orders = await _orderRepository.GetListAsync(x =>
|
||||||
@event.OrderIds.Contains(x.Id),
|
@event.OrderIds.Contains(x.Id),
|
||||||
@ -142,33 +148,43 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
|
|
||||||
private async Task BuiltManualPushItemsAsync(TrackPushEvent @event, List<TrackPushInput> items)
|
private async Task BuiltManualPushItemsAsync(TrackPushEvent @event, List<TrackPushInput> items)
|
||||||
{
|
{
|
||||||
// tips: 手工强制推送直接使用配置
|
|
||||||
var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode);
|
|
||||||
foreach (var order in _orders)
|
foreach (var order in _orders)
|
||||||
{
|
{
|
||||||
if (config is { IsAllPush: true })
|
// tips:不同订单类型可能会有不同的顺序
|
||||||
|
if (!_orderTypeSortedConfigsDict.TryGetValue(order.OrderType, out var sortedConfigs))
|
||||||
{
|
{
|
||||||
// 非强制推送需要 推断 本次推送 是否可行
|
TrackPushFailedPublicTopic($"子系统id:[{@event.SubSystemId}],客户id:[{@event.CustomId}],没有订单类型[{order.OrderType}]的推送映射配置", @event, order);
|
||||||
if (!@event.ForcedPush)
|
continue;
|
||||||
{
|
}
|
||||||
config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event);
|
|
||||||
}
|
// tips: 手工/强制推送直接使用配置
|
||||||
|
var config = sortedConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode);
|
||||||
|
|
||||||
|
if (config == null)
|
||||||
|
{
|
||||||
|
TrackPushFailedPublicTopic($"针对于订单类型[{order.OrderType}]没有找到轨迹代码[{@event.TrackCode}]对应的配置", @event, order);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 非强制推送需要 推断 本次推送 是否可行
|
||||||
|
if (config.IsAllPush && !@event.ForcedPush)
|
||||||
|
{
|
||||||
|
config = GetValidPushConfigAsync(sortedConfigs, order.LatestPushTrackCode, @event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config == null)
|
if (config == null)
|
||||||
{
|
{
|
||||||
TrackPushFailedPublicTopic("推送顺序异常,找不到有效推送配置", @event, order);
|
TrackPushFailedPublicTopic($"推送顺序有误,针对于订单类型[{order.OrderType}],轨迹代码[{@event.TrackCode}]", @event, order);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// //配置的类型如何和订单类型不一致则不允许推送
|
||||||
//配置的类型如何和订单类型不一致则不允许推送
|
// if (config.OrderType != order.OrderType)
|
||||||
if (config.OrderType != order.OrderType)
|
// {
|
||||||
{
|
// TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event,
|
||||||
TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event,
|
// order);
|
||||||
order);
|
// continue;
|
||||||
continue;
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
var log = new TrackPushRecordIndex
|
var log = new TrackPushRecordIndex
|
||||||
{
|
{
|
||||||
@ -194,12 +210,21 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
|
|
||||||
private async Task BuiltSystemPushItemsAsync(TrackPushEvent @event, List<TrackPushInput> items)
|
private async Task BuiltSystemPushItemsAsync(TrackPushEvent @event, List<TrackPushInput> items)
|
||||||
{
|
{
|
||||||
var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode);
|
|
||||||
foreach (var order in _orders)
|
foreach (var order in _orders)
|
||||||
{
|
{
|
||||||
|
// tips:不同订单类型可能会有不同的顺序
|
||||||
|
if (!_orderTypeSortedConfigsDict.TryGetValue(order.OrderType, out var sortedConfigs))
|
||||||
|
{
|
||||||
|
TrackPushFailedPublicTopic($"子系统id:[{@event.SubSystemId}],客户id:[{@event.CustomId}],没有订单类型[{order.OrderType}]的推送映射配置", @event, order);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// tips: 手工/强制推送直接使用配置
|
||||||
|
var config = sortedConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode);
|
||||||
if (config == null)
|
if (config == null)
|
||||||
{
|
{
|
||||||
TrackPushFailedPublicTopic($"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order);
|
TrackPushFailedPublicTopic($"子系统id:[{@event.SubSystemId}],客户id:[{@event.CustomId}],没有订单类型[{order.OrderType}]的推送映射配置," +
|
||||||
|
$"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,7 +239,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
// 如果当前推送code与订单上的最后的code不一致,则考虑推送映射顺序
|
// 如果当前推送code与订单上的最后的code不一致,则考虑推送映射顺序
|
||||||
if (!string.Equals(order.LatestPushTrackCode, @event.TrackCode))
|
if (!string.Equals(order.LatestPushTrackCode, @event.TrackCode))
|
||||||
{
|
{
|
||||||
config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event);
|
config = GetValidPushConfigAsync(sortedConfigs, order.LatestPushTrackCode, @event);
|
||||||
if (config == null)
|
if (config == null)
|
||||||
{
|
{
|
||||||
TrackPushFailedPublicTopic("推送顺序异常,找不到有效推送配置", @event, order);
|
TrackPushFailedPublicTopic("推送顺序异常,找不到有效推送配置", @event, order);
|
||||||
@ -229,13 +254,13 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 配置的类型如何和订单类型不一致则不允许推送
|
// // 配置的类型如何和订单类型不一致则不允许推送
|
||||||
if (config.OrderType != order.OrderType)
|
// if (config.OrderType != order.OrderType)
|
||||||
{
|
// {
|
||||||
TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event,
|
// TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event,
|
||||||
order);
|
// order);
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
|
|
||||||
var log = new TrackPushRecordIndex
|
var log = new TrackPushRecordIndex
|
||||||
{
|
{
|
||||||
@ -267,14 +292,29 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
var items = new List<TrackUpdateInput>();
|
var items = new List<TrackUpdateInput>();
|
||||||
foreach (var order in _orders)
|
foreach (var order in _orders)
|
||||||
{
|
{
|
||||||
//配置的类型如何和订单类型不一致则不允许推送
|
// tips:不同订单类型可能会有不同的顺序
|
||||||
if (config.OrderType != order.OrderType)
|
if (!_orderTypeSortedConfigsDict.TryGetValue(order.OrderType, out var sortedConfigs))
|
||||||
{
|
{
|
||||||
TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event,
|
TrackPushFailedPublicTopic($"子系统id:[{@event.SubSystemId}],客户id:[{@event.CustomId}],没有订单类型[{order.OrderType}]的推送映射配置", @event, order);
|
||||||
order);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// tips:更新轨迹要求只能更新已经推过的历史轨迹
|
||||||
|
config = sortedConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode);
|
||||||
|
if (config == null)
|
||||||
|
{
|
||||||
|
TrackPushFailedPublicTopic($"针对于订单类型[{order.OrderType}]没有找到轨迹代码[{@event.TrackCode}]对应的配置", @event, order);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// //配置的类型如何和订单类型不一致则不允许推送
|
||||||
|
// if (config.OrderType != order.OrderType)
|
||||||
|
// {
|
||||||
|
// TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event,
|
||||||
|
// order);
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
|
||||||
var log = new TrackPushRecordIndex
|
var log = new TrackPushRecordIndex
|
||||||
{
|
{
|
||||||
OptionType = @event.OptionType.ToString(),
|
OptionType = @event.OptionType.ToString(),
|
||||||
@ -353,7 +393,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
|
|
||||||
var body = new TrackPushInput
|
var body = new TrackPushInput
|
||||||
{
|
{
|
||||||
OrderNo = log.OrderNo,
|
OrderNo = log.OrderNo
|
||||||
};
|
};
|
||||||
var cur = new Dictionary<string, object?>
|
var cur = new Dictionary<string, object?>
|
||||||
{
|
{
|
||||||
@ -372,7 +412,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
if (config.IsAllPush)
|
if (config.IsAllPush)
|
||||||
{
|
{
|
||||||
var history = await _trackPushRecordEsRepository.GetLatestTrackPushRecordAsync(log.OrderId, true);
|
var history = await _trackPushRecordEsRepository.GetLatestTrackPushRecordAsync(log.OrderId, true);
|
||||||
if (history != default)
|
if (history != null)
|
||||||
{
|
{
|
||||||
body = TextJsonHelper.Deserialize<TrackPushInput>(history.PushContent);
|
body = TextJsonHelper.Deserialize<TrackPushInput>(history.PushContent);
|
||||||
|
|
||||||
@ -382,13 +422,18 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
var trackIdentifies = tracks.Select(x =>
|
var trackIdentifies = tracks.Select(x =>
|
||||||
{
|
{
|
||||||
//寻找映射配置(转换后的code)
|
//寻找映射配置(转换后的code)
|
||||||
var code = _pushConfigs.First(y => y.TrackCode == x.TrackCode).TrackContentCodeValue;
|
var matchConfig = _orderTypeSortedConfigsDict.TryGetValue(x.OrderType, out var sortedConfigs)
|
||||||
|
? sortedConfigs.FirstOrDefault(y => y.TrackCode == x.TrackCode)
|
||||||
|
: null;
|
||||||
|
if (matchConfig == null) return null;
|
||||||
|
var code = matchConfig.TrackContentCodeValue;
|
||||||
var timeStr = DateTimeFormat(x.TrackTime, config.TrackTimeZone ?? log.TrackTimeZone, config);
|
var timeStr = DateTimeFormat(x.TrackTime, config.TrackTimeZone ?? log.TrackTimeZone, config);
|
||||||
return string.IsNullOrWhiteSpace(compareFields)
|
return string.IsNullOrWhiteSpace(compareFields)
|
||||||
? $"{code}{timeStr}"
|
? $"{code}{timeStr}"
|
||||||
: $"{code}{TextJsonHelper.ExtractValue(x.Extra, compareFields)}";
|
: $"{code}{TextJsonHelper.ExtractValue(x.Extra, compareFields)}";
|
||||||
}
|
})
|
||||||
).ToImmutableHashSet();
|
.Where(x => x != null)
|
||||||
|
.ToImmutableHashSet();
|
||||||
//在历史中选取在订单当前轨迹明细中的记录
|
//在历史中选取在订单当前轨迹明细中的记录
|
||||||
body!.Data = body.Data.Where(x =>
|
body!.Data = body.Data.Where(x =>
|
||||||
{
|
{
|
||||||
@ -431,7 +476,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加当前要推送的轨迹
|
// 添加当前要推送的轨迹,到末尾
|
||||||
body.Data.Add(cur);
|
body.Data.Add(cur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -457,7 +502,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
return cache[idx];
|
return cache[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (idx + 1 >= cache.Count) return default; // 推完了
|
if (idx + 1 >= cache.Count) return null; // 推完了
|
||||||
|
|
||||||
// find next
|
// find next
|
||||||
var matched = cache[idx + 1].TrackCode == trackCode
|
var matched = cache[idx + 1].TrackCode == trackCode
|
||||||
@ -466,7 +511,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
: cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode);
|
: cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode);
|
||||||
|
|
||||||
//没推完,可能不符合推送顺序
|
//没推完,可能不符合推送顺序
|
||||||
return matched != null && matched.TrackCode == trackCode ? matched : default;
|
return matched != null && matched.TrackCode == trackCode ? matched : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -494,17 +539,18 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
{
|
{
|
||||||
_broadcastingService.TrackPushFailedPubilcTopic(new TrackPushRecordDto
|
_broadcastingService.TrackPushFailedPubilcTopic(new TrackPushRecordDto
|
||||||
{
|
{
|
||||||
|
SubSystemCode = @event.SubSystemCode,
|
||||||
|
IsManualPush = @event.OperationMan != null,
|
||||||
|
PushTime = DateTime.Now,
|
||||||
//还没请求接口通
|
//还没请求接口通
|
||||||
RequestId = null,
|
RequestId = null,
|
||||||
IsSuccess = false,
|
|
||||||
Message = failedMessage,
|
Message = failedMessage,
|
||||||
OperationMan = @event.OperationMan,
|
OperationMan = @event.OperationMan,
|
||||||
PushTime = DateTime.Now,
|
|
||||||
OptionType = @event.OptionType.ToString(),
|
OptionType = @event.OptionType.ToString(),
|
||||||
IsManualPush = @event.OperationMan != null,
|
OrderNo = order.OrderNo,
|
||||||
|
IsSuccess = false,
|
||||||
//还没到构建推送内容那一步就被拦截
|
//还没到构建推送内容那一步就被拦截
|
||||||
PushContent = string.Empty,
|
PushContent = string.Empty,
|
||||||
OrderNo = order.OrderNo,
|
|
||||||
TrackStatus = @event.SystemPushInfo.TrackStatus,
|
TrackStatus = @event.SystemPushInfo.TrackStatus,
|
||||||
TrackContent = @event.SystemPushInfo.TrackStatus,
|
TrackContent = @event.SystemPushInfo.TrackStatus,
|
||||||
TrackTimeZone = @event.SystemPushInfo.TrackTimeZone,
|
TrackTimeZone = @event.SystemPushInfo.TrackTimeZone,
|
||||||
@ -526,15 +572,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
{
|
{
|
||||||
_broadcastingService.TrackPushFailedPubilcTopic(new TrackPushRecordDto
|
_broadcastingService.TrackPushFailedPubilcTopic(new TrackPushRecordDto
|
||||||
{
|
{
|
||||||
RequestId = requestId,
|
SubSystemCode = @event.SubSystemCode,
|
||||||
IsSuccess = false,
|
|
||||||
Message = failedMessage,
|
|
||||||
OperationMan = @event.OperationMan,
|
|
||||||
PushTime = DateTime.Now,
|
|
||||||
OptionType = @event.OptionType.ToString(),
|
|
||||||
IsManualPush = @event.OperationMan != null,
|
IsManualPush = @event.OperationMan != null,
|
||||||
PushContent = TextJsonHelper.Serialize(pushInput),
|
PushTime = DateTime.Now,
|
||||||
|
OperationMan = @event.OperationMan,
|
||||||
OrderNo = pushInput.OrderNo,
|
OrderNo = pushInput.OrderNo,
|
||||||
|
RequestId = requestId,
|
||||||
|
Message = failedMessage,
|
||||||
|
OptionType = @event.OptionType.ToString(),
|
||||||
|
IsSuccess = false,
|
||||||
|
PushContent = TextJsonHelper.Serialize(pushInput),
|
||||||
TrackStatus = @event.SystemPushInfo.TrackStatus,
|
TrackStatus = @event.SystemPushInfo.TrackStatus,
|
||||||
TrackContent = @event.SystemPushInfo.TrackStatus,
|
TrackContent = @event.SystemPushInfo.TrackStatus,
|
||||||
TrackTimeZone = @event.SystemPushInfo.TrackTimeZone,
|
TrackTimeZone = @event.SystemPushInfo.TrackTimeZone,
|
||||||
|
|||||||
@ -57,16 +57,6 @@ public class InterfaceRelayParamsConfigOptions
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string PushTrackInterfaceCode { get; set; }
|
public string PushTrackInterfaceCode { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 推送轨迹接口Id
|
|
||||||
/// </summary>
|
|
||||||
public int PushTrackInterfaceId { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 推送轨迹接口 内容项 参数别名前缀
|
|
||||||
/// </summary>
|
|
||||||
public string PushTrackItemParamAliasPrefix { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 更新轨迹接口代码
|
/// 更新轨迹接口代码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -60,6 +60,15 @@ public class TrackOrderService : ApplicationService
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取订单类型字典
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("GetOrderTypeDict")]
|
||||||
|
public async Task<Dictionary<string, string>> GetOrderTypeDict()
|
||||||
|
{
|
||||||
|
return await _orderRepository.GetTrackOrderTypeDict();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 更新订单状态
|
/// 更新订单状态
|
||||||
|
|||||||
@ -85,6 +85,7 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc
|
|||||||
ServiceProviderCode = item.ServiceProviderCode,
|
ServiceProviderCode = item.ServiceProviderCode,
|
||||||
OrderType = item.OrderType,
|
OrderType = item.OrderType,
|
||||||
TrackCode = item.TrackCode,
|
TrackCode = item.TrackCode,
|
||||||
|
Sort = item.Sort,
|
||||||
SwapTrackCode = item.SwapTrackCode,
|
SwapTrackCode = item.SwapTrackCode,
|
||||||
TrackStatusValue = item.TrackStatusValue,
|
TrackStatusValue = item.TrackStatusValue,
|
||||||
TrackContentCodeValue = item.TrackContentCodeValue,
|
TrackContentCodeValue = item.TrackContentCodeValue,
|
||||||
|
|||||||
@ -5,6 +5,7 @@ using SJZY.Expand.ABP.Core.PublicMethords;
|
|||||||
using SJZY.Track.Application.Contract.Dtos.TrackPush;
|
using SJZY.Track.Application.Contract.Dtos.TrackPush;
|
||||||
using SJZY.Track.Application.Contract.Services;
|
using SJZY.Track.Application.Contract.Services;
|
||||||
using SJZY.Track.Application.Localization;
|
using SJZY.Track.Application.Localization;
|
||||||
|
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||||
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
|
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
|
||||||
using SJZY.Track.Domain.Dtos.Common;
|
using SJZY.Track.Domain.Dtos.Common;
|
||||||
using SJZY.Track.Domain.Dtos.TrackPush;
|
using SJZY.Track.Domain.Dtos.TrackPush;
|
||||||
@ -22,15 +23,18 @@ public class TrackPushService : ApplicationService, ISingletonDependency
|
|||||||
private readonly IStringLocalizer<TrackLocalizationResource> _stringLocalizer;
|
private readonly IStringLocalizer<TrackLocalizationResource> _stringLocalizer;
|
||||||
private readonly ITrackPushCacheService _trackPushCacheService;
|
private readonly ITrackPushCacheService _trackPushCacheService;
|
||||||
private readonly ITrackPushConfigRepository _trackPushConfigRepository;
|
private readonly ITrackPushConfigRepository _trackPushConfigRepository;
|
||||||
|
private readonly IOrderRepository _orderRepository;
|
||||||
|
|
||||||
public TrackPushService(
|
public TrackPushService(
|
||||||
IStringLocalizer<TrackLocalizationResource> stringLocalizer,
|
IStringLocalizer<TrackLocalizationResource> stringLocalizer,
|
||||||
ITrackPushConfigRepository trackPushConfigRepository,
|
ITrackPushConfigRepository trackPushConfigRepository,
|
||||||
ITrackPushCacheService trackPushCacheService)
|
ITrackPushCacheService trackPushCacheService,
|
||||||
|
IOrderRepository orderRepository)
|
||||||
{
|
{
|
||||||
_stringLocalizer = stringLocalizer;
|
_stringLocalizer = stringLocalizer;
|
||||||
_trackPushConfigRepository = trackPushConfigRepository;
|
_trackPushConfigRepository = trackPushConfigRepository;
|
||||||
_trackPushCacheService = trackPushCacheService;
|
_trackPushCacheService = trackPushCacheService;
|
||||||
|
_orderRepository = orderRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -44,6 +48,26 @@ public class TrackPushService : ApplicationService, ISingletonDependency
|
|||||||
return await _trackPushConfigRepository.GetPageAsync(input);
|
return await _trackPushConfigRepository.GetPageAsync(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取推送配置类型标签卡列表
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost("GetConfigTags")]
|
||||||
|
public async Task<List<TrackPushConfigTagDto>> GetConfigTags([FromBody] GetConfigTagsInputVO inputVo)
|
||||||
|
{
|
||||||
|
var orderTypes = await _trackPushConfigRepository.GetConfigTags(inputVo);
|
||||||
|
if (orderTypes.Count == 0) return new List<TrackPushConfigTagDto>();
|
||||||
|
var trackOrderTypes = await _orderRepository.GetTrackOrderTypeDict();
|
||||||
|
|
||||||
|
return orderTypes.Select(x => new TrackPushConfigTagDto
|
||||||
|
{
|
||||||
|
Type = x,
|
||||||
|
Name = trackOrderTypes[x.ToString()]
|
||||||
|
})
|
||||||
|
.OrderBy(x => x.Type)
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 轨迹推送配置内容列表
|
/// 轨迹推送配置内容列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -159,7 +183,8 @@ public class TrackPushService : ApplicationService, ISingletonDependency
|
|||||||
if (input.Options != OptionTypeNoNull.删除)
|
if (input.Options != OptionTypeNoNull.删除)
|
||||||
{
|
{
|
||||||
Expression<Func<TrackPushContentConfigEntity, bool>> isContentAnyExp = x =>
|
Expression<Func<TrackPushContentConfigEntity, bool>> isContentAnyExp = x =>
|
||||||
x.TrackPushConfigId == input.TrackPushConfigId;
|
x.TrackPushConfigId == input.TrackPushConfigId
|
||||||
|
&& x.OrderNoType == input.OrderNoType;
|
||||||
if (input.Options == OptionTypeNoNull.修改) isContentAnyExp = isContentAnyExp.And(x => x.Id != input.Id);
|
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 =>
|
||||||
@ -191,8 +216,10 @@ public class TrackPushService : ApplicationService, ISingletonDependency
|
|||||||
{
|
{
|
||||||
case OptionTypeNoNull.新增:
|
case OptionTypeNoNull.新增:
|
||||||
{
|
{
|
||||||
int maxSort = await _trackPushConfigRepository.ContentMaxAsync(x => x.Sort,
|
var maxSort = await _trackPushConfigRepository.ContentMaxAsync(x => x.Sort, x =>
|
||||||
x => x.TrackPushConfigId == input.TrackPushConfigId);
|
x.OrderNoType == input.OrderNoType
|
||||||
|
&& x.TrackPushConfigId == input.TrackPushConfigId
|
||||||
|
);
|
||||||
|
|
||||||
var entity = ObjectMapper.Map<EditTrackPushContentInput, TrackPushContentConfigEntity>(input);
|
var entity = ObjectMapper.Map<EditTrackPushContentInput, TrackPushContentConfigEntity>(input);
|
||||||
entity.Sort = maxSort + 1;
|
entity.Sort = maxSort + 1;
|
||||||
@ -216,8 +243,11 @@ public class TrackPushService : ApplicationService, ISingletonDependency
|
|||||||
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
|
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
|
||||||
trackPushConfigId = entity.TrackPushConfigId;
|
trackPushConfigId = entity.TrackPushConfigId;
|
||||||
await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id);
|
await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id);
|
||||||
await _trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1,
|
await _trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1, x =>
|
||||||
x => x.TrackPushConfigId == entity.TrackPushConfigId && x.Sort > entity.Sort);
|
x.OrderNoType == entity.OrderNoType
|
||||||
|
&& x.TrackPushConfigId == entity.TrackPushConfigId
|
||||||
|
&& x.Sort > entity.Sort
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,10 +279,7 @@ public class TrackPushService : ApplicationService, ISingletonDependency
|
|||||||
|
|
||||||
var trackPushContentEntities = await _trackPushConfigRepository.GetContentListAsync(x => ids.Contains(x.Id));
|
var trackPushContentEntities = await _trackPushConfigRepository.GetContentListAsync(x => ids.Contains(x.Id));
|
||||||
|
|
||||||
trackPushContentEntities.ForEach(item =>
|
trackPushContentEntities.ForEach(item => { item.Sort = input.SortInfo.Single(x => x.Key == item.Id.ToString()).Value; });
|
||||||
{
|
|
||||||
item.Sort = input.SortInfo.Single(x => x.Key == item.Id.ToString()).Value;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (trackPushContentEntities.Count > 0)
|
if (trackPushContentEntities.Count > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -5,6 +5,13 @@ namespace SJZY.Track.Domain.Aggregates.OrderAggregate;
|
|||||||
|
|
||||||
public interface IOrderRepository : IBasicRepository<OrderEntity>
|
public interface IOrderRepository : IBasicRepository<OrderEntity>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取订单类型字典
|
||||||
|
/// key:OrderType value:TypeName
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<Dictionary<string, string>> GetTrackOrderTypeDict();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取分页的轨迹订单
|
/// 获取分页的轨迹订单
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -78,7 +85,7 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
|
|||||||
/// <param name="orderType"></param>
|
/// <param name="orderType"></param>
|
||||||
/// <param name="orderNos"></param>
|
/// <param name="orderNos"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<List<OrderTemplateVO>> GetOrderTemplateAsync(int subSystemId,int orderType,List<string> orderNos);
|
Task<List<OrderTemplateVO>> GetOrderTemplateAsync(int subSystemId, int orderType, List<string> orderNos);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
@ -39,4 +39,5 @@ public interface ITrackPushConfigRepository : IBasicRepository<TrackPushConfigEn
|
|||||||
Task<List<QueryTrackPullMappingsInfoVO>> QueryTrackPullMappingsAsync(QueryTrackPullMappingsInputVO input);
|
Task<List<QueryTrackPullMappingsInfoVO>> QueryTrackPullMappingsAsync(QueryTrackPullMappingsInputVO input);
|
||||||
Task<List<GetTrackPushContentListVo>> GetTrackPushContentListAsync(int subSystemId, int customerId);
|
Task<List<GetTrackPushContentListVo>> GetTrackPushContentListAsync(int subSystemId, int customerId);
|
||||||
Task<string?> GetServiceCodeByCustomerIdAsync(int customerId);
|
Task<string?> GetServiceCodeByCustomerIdAsync(int customerId);
|
||||||
|
Task<HashSet<int>> GetConfigTags(GetConfigTagsInputVO inputVo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -71,4 +71,9 @@ public partial class GlobalConst
|
|||||||
/// 轨迹推送预警redis key前缀
|
/// 轨迹推送预警redis key前缀
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string TrackPushWaringKeyPrefix = "TrackPushWaring";
|
public const string TrackPushWaringKeyPrefix = "TrackPushWaring";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹订单类型redis key前缀(hash类型)
|
||||||
|
/// </summary>
|
||||||
|
public const string TrackOrderTypeKey = "TrackOrderType";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
namespace SJZY.Track.Domain.Dtos.TrackPush;
|
||||||
|
|
||||||
|
public class GetConfigTagsInputVO
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹推送配置id
|
||||||
|
/// </summary>
|
||||||
|
public int TrackPushConfigId { get; set; }
|
||||||
|
}
|
||||||
@ -6,4 +6,9 @@ public class GetTrackPushContentPageInputVO : PageInfoInput
|
|||||||
/// 轨迹推送配置id
|
/// 轨迹推送配置id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int TrackPushConfigId { get; set; }
|
public int TrackPushConfigId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 配置单号类型,当为空时查所有,不区分单号类型
|
||||||
|
/// </summary>
|
||||||
|
public int? OrderNoType { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,6 +27,11 @@ public class TrackPushContentConfigVO
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string TrackCode { get; set; } = null!;
|
public string TrackCode { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送顺序
|
||||||
|
/// </summary>
|
||||||
|
public int Sort { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 可交换顺序的轨迹code
|
/// 可交换顺序的轨迹code
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -18,6 +18,7 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
|
|||||||
private static readonly Dictionary<string, Dictionary<int, string>> _empty2 = new();
|
private static readonly Dictionary<string, Dictionary<int, string>> _empty2 = new();
|
||||||
private static readonly TimeSpan _thirdPartyOrderNumberCacheTimeSpan = TimeSpan.FromMinutes(3);
|
private static readonly TimeSpan _thirdPartyOrderNumberCacheTimeSpan = TimeSpan.FromMinutes(3);
|
||||||
private static readonly TimeSpan _mainDataEnumCacheTimeSpan = TimeSpan.FromMinutes(5);
|
private static readonly TimeSpan _mainDataEnumCacheTimeSpan = TimeSpan.FromMinutes(5);
|
||||||
|
private static readonly TimeSpan _orderTypeCacheTimeSpan = TimeSpan.FromMinutes(1);
|
||||||
|
|
||||||
private async Task<Dictionary<int, string>> GetThirdPartyOrderNumberForCacheAsync(int[] orderIds)
|
private async Task<Dictionary<int, string>> GetThirdPartyOrderNumberForCacheAsync(int[] orderIds)
|
||||||
{
|
{
|
||||||
@ -99,6 +100,28 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
|
|||||||
return dict;
|
return dict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<Dictionary<string, string>> GetTrackOrderTypeDict()
|
||||||
|
{
|
||||||
|
const string key = "TrackOrderType";
|
||||||
|
var orderTypes = await _memoryCache.GetOrCreateAsync(key, async (entry) =>
|
||||||
|
{
|
||||||
|
// 固定时间周期后强制更新
|
||||||
|
entry.AbsoluteExpirationRelativeToNow = _orderTypeCacheTimeSpan;
|
||||||
|
// 查询主数据
|
||||||
|
return await Context.Queryable<VEnumValueInfoEntity>()
|
||||||
|
.Where(x => x.Property == GlobalConst.MainDataKey_OrderType)
|
||||||
|
.ToDictionaryAsync(x => x.Enumkey, x => x.Disp);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 更新redis缓存
|
||||||
|
await RedisHelper.Client.HMSetAsync(GlobalConst.TrackOrderTypeKey, orderTypes);
|
||||||
|
|
||||||
|
// redis内数据只更新不清理
|
||||||
|
var dict = RedisHelper.Client.HGetAll<string>(GlobalConst.TrackOrderTypeKey);
|
||||||
|
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<UnifyPageResultDto<TrackOrderVO>> GetTrackOrderPagedList(GetPageTrackOrderInputVO input)
|
public async Task<UnifyPageResultDto<TrackOrderVO>> GetTrackOrderPagedList(GetPageTrackOrderInputVO input)
|
||||||
{
|
{
|
||||||
//查询完去重
|
//查询完去重
|
||||||
|
|||||||
@ -45,6 +45,7 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
|
|||||||
enumValue.Property == EnumPropertyEnums.单号类型.GetDescription() &&
|
enumValue.Property == EnumPropertyEnums.单号类型.GetDescription() &&
|
||||||
pushContent.OrderNoType == enumValue.Enumkey && !enumValue.IsDeleted)
|
pushContent.OrderNoType == enumValue.Enumkey && !enumValue.IsDeleted)
|
||||||
.Where(pushContent => pushContent.TrackPushConfigId == input.TrackPushConfigId)
|
.Where(pushContent => pushContent.TrackPushConfigId == input.TrackPushConfigId)
|
||||||
|
.WhereIF(input.OrderNoType.HasValue, pushContent => pushContent.OrderNoType == input.OrderNoType)
|
||||||
.OrderBy(pushContent => pushContent.Sort)
|
.OrderBy(pushContent => pushContent.Sort)
|
||||||
.Select(
|
.Select(
|
||||||
(pushContent, trackContent, enumValue) => new GetTrackPushContentPageOutputVO
|
(pushContent, trackContent, enumValue) => new GetTrackPushContentPageOutputVO
|
||||||
@ -138,6 +139,7 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
|
|||||||
OrderType = b.OrderNoType,
|
OrderType = b.OrderNoType,
|
||||||
TrackCode = d.Code,
|
TrackCode = d.Code,
|
||||||
SwapTrackCode = e.Code,
|
SwapTrackCode = e.Code,
|
||||||
|
Sort = b.Sort,
|
||||||
TrackContentCodeValue = b.TrackContentCodeValue,
|
TrackContentCodeValue = b.TrackContentCodeValue,
|
||||||
TrackContentValue = b.TrackContentValue,
|
TrackContentValue = b.TrackContentValue,
|
||||||
TrackEnContentValue = b.TrackEnContentValue,
|
TrackEnContentValue = b.TrackEnContentValue,
|
||||||
@ -226,4 +228,14 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
|
|||||||
.Select(x => x.ApiServiceCode)
|
.Select(x => x.ApiServiceCode)
|
||||||
.FirstAsync();
|
.FirstAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<HashSet<int>> GetConfigTags(GetConfigTagsInputVO input)
|
||||||
|
{
|
||||||
|
var orderTypes = await Context.Queryable<TrackPushContentConfigEntity>()
|
||||||
|
.Where(x => x.TrackPushConfigId == input.TrackPushConfigId)
|
||||||
|
.Select(x => x.OrderNoType)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
return new HashSet<int>(orderTypes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user