feat:优化预警仓储逻辑
This commit is contained in:
parent
e056585fc6
commit
99037a2da7
@ -37,15 +37,26 @@ public class TrackPushContentConfigDto
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public int OrderType { get; set; }
|
public int OrderType { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送顺序
|
||||||
|
/// </summary>
|
||||||
|
public int Sort { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹内容id
|
||||||
|
/// 我们系统的轨迹内容id
|
||||||
|
/// </summary>
|
||||||
|
public int TrackContentId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 我们系统的轨迹code
|
/// 我们系统的轨迹code
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string TrackCode { get; set; } = null!;
|
public string TrackCode { get; set; } = null!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 推送顺序
|
/// 可交换顺序的轨迹内容id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int Sort { get; set; }
|
public int? SwapTrackContentId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 可交换顺序的轨迹code
|
/// 可交换顺序的轨迹code
|
||||||
|
|||||||
@ -4,7 +4,6 @@ public class TrackPushInput
|
|||||||
{
|
{
|
||||||
public string OrderNo { get; set; } = null!;
|
public string OrderNo { get; set; } = null!;
|
||||||
|
|
||||||
//原TrackItem,为了扩展字段入参变更为字典
|
|
||||||
public List<Dictionary<string,object?>> Data { get; set; } = new();
|
public List<Dictionary<string,object?>> Data { get; set; } = new();
|
||||||
|
|
||||||
public string Log { get; set; }
|
public string Log { get; set; }
|
||||||
@ -14,7 +13,6 @@ public class TrackUpdateInput
|
|||||||
{
|
{
|
||||||
public string OrderNo { get; set; } = null!;
|
public string OrderNo { get; set; } = null!;
|
||||||
|
|
||||||
//原TrackItem,为了扩展字段入参变更为字典
|
|
||||||
public List<Dictionary<string,object?>> Data { get; set; } = new();
|
public List<Dictionary<string,object?>> Data { get; set; } = new();
|
||||||
|
|
||||||
public string Log { get; set; }
|
public string Log { get; set; }
|
||||||
|
|||||||
@ -1,5 +1,9 @@
|
|||||||
namespace SJZY.Track.Application.Contract.Events;
|
namespace SJZY.Track.Application.Contract.Events;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹推送事件
|
||||||
|
/// 每次可传递多个订单,但仅能传递同一个轨迹内容
|
||||||
|
/// </summary>
|
||||||
public class TrackPushEvent
|
public class TrackPushEvent
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -55,11 +59,21 @@ public class TrackPushEvent
|
|||||||
|
|
||||||
public struct SystemPushStruct
|
public struct SystemPushStruct
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹状态id
|
||||||
|
/// </summary>
|
||||||
|
public int TrackStatusId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 轨迹状态
|
/// 轨迹状态
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string TrackStatus { get; set; }
|
public string TrackStatus { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹内容id
|
||||||
|
/// </summary>
|
||||||
|
public int TrackContentId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 轨迹内容
|
/// 轨迹内容
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -1,12 +1,10 @@
|
|||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
using System.Text.Json;
|
|
||||||
using DotNetCore.CAP;
|
using DotNetCore.CAP;
|
||||||
using SJZY.Expand.ABP.Core.Logger;
|
using SJZY.Expand.ABP.Core.Logger;
|
||||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||||
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||||
using SJZY.Track.Application.Contract.Events;
|
using SJZY.Track.Application.Contract.Events;
|
||||||
using SJZY.Track.Application.Contract.Services;
|
using SJZY.Track.Application.Contract.Services;
|
||||||
using SJZY.Track.Application.Helpers;
|
|
||||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||||
using SJZY.Track.Domain.Enums;
|
using SJZY.Track.Domain.Enums;
|
||||||
|
|||||||
@ -179,20 +179,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// //配置的类型如何和订单类型不一致则不允许推送
|
|
||||||
// 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(),
|
||||||
OrderId = order.Id,
|
OrderId = order.Id,
|
||||||
OrderNo = order.OrderNo,
|
OrderNo = order.OrderNo,
|
||||||
|
CompareFields = @event.SystemPushInfo.CompareFields,
|
||||||
|
TrackStatusId = @event.SystemPushInfo.TrackStatusId,
|
||||||
TrackStatus = @event.SystemPushInfo.TrackStatus,
|
TrackStatus = @event.SystemPushInfo.TrackStatus,
|
||||||
|
TrackContentId = @event.SystemPushInfo.TrackContentId,
|
||||||
TrackCode = @event.TrackCode,
|
TrackCode = @event.TrackCode,
|
||||||
TrackContent = @event.SystemPushInfo.TrackContent,
|
TrackContent = @event.SystemPushInfo.TrackContent,
|
||||||
TrackPlace = @event.SystemPushInfo.TrackPlace,
|
TrackPlace = @event.SystemPushInfo.TrackPlace,
|
||||||
@ -255,21 +250,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
continue;
|
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(),
|
||||||
OrderId = order.Id,
|
OrderId = order.Id,
|
||||||
OrderNo = order.OrderNo,
|
OrderNo = order.OrderNo,
|
||||||
|
CompareFields = @event.SystemPushInfo.CompareFields,
|
||||||
|
TrackStatusId = @event.SystemPushInfo.TrackStatusId,
|
||||||
TrackStatus = @event.SystemPushInfo.TrackStatus,
|
TrackStatus = @event.SystemPushInfo.TrackStatus,
|
||||||
TrackCode = @event.TrackCode,
|
TrackCode = @event.TrackCode,
|
||||||
|
TrackContentId = @event.SystemPushInfo.TrackContentId,
|
||||||
TrackContent = @event.SystemPushInfo.TrackContent,
|
TrackContent = @event.SystemPushInfo.TrackContent,
|
||||||
TrackPlace = @event.SystemPushInfo.TrackPlace,
|
TrackPlace = @event.SystemPushInfo.TrackPlace,
|
||||||
TrackTime = @event.SystemPushInfo.TrackTime,
|
TrackTime = @event.SystemPushInfo.TrackTime,
|
||||||
@ -308,21 +298,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
continue;
|
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(),
|
||||||
OrderId = order.Id,
|
OrderId = order.Id,
|
||||||
OrderNo = order.OrderNo,
|
OrderNo = order.OrderNo,
|
||||||
|
CompareFields = @event.SystemPushInfo.CompareFields,
|
||||||
|
TrackStatusId = @event.SystemPushInfo.TrackStatusId,
|
||||||
TrackStatus = @event.SystemPushInfo.TrackStatus,
|
TrackStatus = @event.SystemPushInfo.TrackStatus,
|
||||||
TrackCode = @event.TrackCode,
|
TrackCode = @event.TrackCode,
|
||||||
|
TrackContentId = @event.SystemPushInfo.TrackContentId,
|
||||||
TrackContent = @event.SystemPushInfo.TrackContent,
|
TrackContent = @event.SystemPushInfo.TrackContent,
|
||||||
TrackPlace = @event.SystemPushInfo.TrackPlace,
|
TrackPlace = @event.SystemPushInfo.TrackPlace,
|
||||||
TrackTime = @event.SystemPushInfo.TrackTime,
|
TrackTime = @event.SystemPushInfo.TrackTime,
|
||||||
|
|||||||
@ -178,12 +178,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
await _trackDetailsEsRepository.AddManyAsync(insertTracks);
|
await _trackDetailsEsRepository.AddManyAsync(insertTracks);
|
||||||
|
|
||||||
//批量写入订单操作日志
|
//批量写入订单操作日志
|
||||||
_ = _orderOperationRecordEsRepository
|
_ = _orderOperationRecordEsRepository.AddManyAsync(insertTracks.Select(t => BuildOrderOperationRecord(@event, t, new OrderIdentifier
|
||||||
.AddManyAsync(insertTracks.Select(t => BuildOrderOperationRecord(@event, t, new OrderIdentifier
|
{
|
||||||
{
|
OrderNo = t.OrderNo,
|
||||||
OrderNo = t.OrderNo,
|
OrderId = t.OrderId
|
||||||
OrderId = t.OrderId
|
})).ToList());
|
||||||
})).ToList());
|
|
||||||
|
|
||||||
// 添加轨迹触发订单拉取状态更新
|
// 添加轨迹触发订单拉取状态更新
|
||||||
await _orderRepository.UpdatePullStatusToSilenceAsync(insertTracks.Select(x => x.OrderId).ToList(),
|
await _orderRepository.UpdatePullStatusToSilenceAsync(insertTracks.Select(x => x.OrderId).ToList(),
|
||||||
@ -217,6 +216,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 触发轨迹推送事件(异步)
|
// 触发轨迹推送事件(异步)
|
||||||
|
// tips:同一个轨迹内容,多个订单多条轨迹
|
||||||
var trackPushEvent = new TrackPushEvent
|
var trackPushEvent = new TrackPushEvent
|
||||||
{
|
{
|
||||||
OptionType = @event.IsAdd ? OptionType.新增 : OptionType.修改,
|
OptionType = @event.IsAdd ? OptionType.新增 : OptionType.修改,
|
||||||
@ -227,7 +227,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
TrackCode = @event.TrackCode,
|
TrackCode = @event.TrackCode,
|
||||||
SystemPushInfo = new SystemPushStruct
|
SystemPushInfo = new SystemPushStruct
|
||||||
{
|
{
|
||||||
|
TrackStatusId = trackContent.TrackStatusId,
|
||||||
TrackStatus = trackContent.TrackStatus,
|
TrackStatus = trackContent.TrackStatus,
|
||||||
|
TrackContentId = trackContent.TrackContentId,
|
||||||
TrackContent = trackContent.TrackContent,
|
TrackContent = trackContent.TrackContent,
|
||||||
TrackPlace = @event.TrackPlace,
|
TrackPlace = @event.TrackPlace,
|
||||||
TrackTime = @event.NewTrackTime ?? @event.TrackTime,
|
TrackTime = @event.NewTrackTime ?? @event.TrackTime,
|
||||||
|
|||||||
@ -61,13 +61,13 @@ public class TrackPushService : ApplicationService, ITrackPushService
|
|||||||
|
|
||||||
var subSystemCode = await _provideQueries.SubSystemId2CodeAsync(input.SubSystemId);
|
var subSystemCode = await _provideQueries.SubSystemId2CodeAsync(input.SubSystemId);
|
||||||
var orders = await _orderRepository.GetArrayAsync(x =>
|
var orders = await _orderRepository.GetArrayAsync(x =>
|
||||||
x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType &&
|
x.SubSystemId == input.SubSystemId
|
||||||
input.OrderNos.Contains(x.OrderNo),
|
&& x.OrderType == input.OrderType
|
||||||
x => new
|
&& input.OrderNos.Contains(x.OrderNo), x => new
|
||||||
{
|
{
|
||||||
x.Id,
|
x.Id,
|
||||||
x.CustomId
|
x.CustomId
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!orders.Any())
|
if (!orders.Any())
|
||||||
{
|
{
|
||||||
@ -82,13 +82,11 @@ public class TrackPushService : ApplicationService, ITrackPushService
|
|||||||
|
|
||||||
var name = userInfo.Data.UserName;
|
var name = userInfo.Data.UserName;
|
||||||
|
|
||||||
//查出需要推送的轨迹
|
//查出可能需要推送的轨迹
|
||||||
var tracks = await _trackDetailsEsRepository
|
var tracks = await _trackDetailsEsRepository.GetListAsync(input.SubSystemId, input.OrderType, input.OrderNos, new List<string>
|
||||||
.GetListAsync(input.SubSystemId, input.OrderType, input.OrderNos,
|
{
|
||||||
new List<string>
|
input.TrackCode
|
||||||
{
|
});
|
||||||
input.TrackCode
|
|
||||||
});
|
|
||||||
if (tracks.Count == 0)
|
if (tracks.Count == 0)
|
||||||
{
|
{
|
||||||
throw new BusinessException(message: "没有需要推送的轨迹");
|
throw new BusinessException(message: "没有需要推送的轨迹");
|
||||||
@ -116,13 +114,20 @@ public class TrackPushService : ApplicationService, ITrackPushService
|
|||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
//不同单可能会有不同的轨迹内容,先推送只推送最新的一条
|
// 经过过滤后不存在需要推送的轨迹
|
||||||
|
if (tracks.Count == 0)
|
||||||
|
{
|
||||||
|
throw new BusinessException(message: "没有需要推送的轨迹");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构建每个单最早的轨迹(已经指定了code)
|
||||||
|
var orderIdTrackDict = tracks.GroupBy(x => x.OrderId)
|
||||||
|
.ToDictionary(x => x.Key, y => y.OrderByDescending(a => a.CreateTime).First());
|
||||||
|
|
||||||
|
//不同单可能会有不同的轨迹内容,手动推送只推送最新的一条
|
||||||
foreach (var order in orders)
|
foreach (var order in orders)
|
||||||
{
|
{
|
||||||
//找出每个单的某个code的最新轨迹内容
|
var track = orderIdTrackDict.GetValueOrDefault(order.Id);
|
||||||
var track = tracks.Where(x => x.OrderId == order.Id)
|
|
||||||
.OrderByDescending(x => x.CreateTime)
|
|
||||||
.FirstOrDefault();
|
|
||||||
if (track == null) continue;
|
if (track == null) continue;
|
||||||
|
|
||||||
var trackPushEvent = new TrackPushEvent
|
var trackPushEvent = new TrackPushEvent
|
||||||
@ -134,9 +139,11 @@ public class TrackPushService : ApplicationService, ITrackPushService
|
|||||||
OrderIds = new[] { order.Id },
|
OrderIds = new[] { order.Id },
|
||||||
TrackCode = input.TrackCode,
|
TrackCode = input.TrackCode,
|
||||||
OperationMan = name,
|
OperationMan = name,
|
||||||
SystemPushInfo = new SystemPushStruct()
|
SystemPushInfo = new SystemPushStruct
|
||||||
{
|
{
|
||||||
|
TrackStatusId = track.TrackStatusId,
|
||||||
TrackStatus = track.TrackStatus,
|
TrackStatus = track.TrackStatus,
|
||||||
|
TrackContentId = track.TrackContentId,
|
||||||
TrackContent = track.TrackContent,
|
TrackContent = track.TrackContent,
|
||||||
TrackPlace = track.TrackPlace,
|
TrackPlace = track.TrackPlace,
|
||||||
TrackTime = track.TrackTime,
|
TrackTime = track.TrackTime,
|
||||||
@ -149,7 +156,7 @@ public class TrackPushService : ApplicationService, ITrackPushService
|
|||||||
await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent);
|
await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new UnifyResultDto(true, $"即将推送轨迹代码{input.TrackCode}给{orders.Length}个订单");
|
return new UnifyResultDto(true, $"即将推送轨迹代码{input.TrackCode}给{orderIdTrackDict.Count}个订单");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -180,8 +187,11 @@ public class TrackPushService : ApplicationService, ITrackPushService
|
|||||||
public async Task<UnifyResultDto<List<TrackPushRecordOutput>>> GetTrackPushRecordsAsync([FromQuery] OrderNoInfo input)
|
public async Task<UnifyResultDto<List<TrackPushRecordOutput>>> GetTrackPushRecordsAsync([FromQuery] OrderNoInfo input)
|
||||||
{
|
{
|
||||||
var orderId = await _orderRepository.GetFirstAsync(x =>
|
var orderId = await _orderRepository.GetFirstAsync(x =>
|
||||||
x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && input.OrderNo == x.OrderNo,
|
x.SubSystemId == input.SubSystemId
|
||||||
x => x.Id);
|
&& x.OrderType == input.OrderType
|
||||||
|
&& input.OrderNo == x.OrderNo,
|
||||||
|
x => x.Id
|
||||||
|
);
|
||||||
if (orderId == default)
|
if (orderId == default)
|
||||||
{
|
{
|
||||||
throw new BusinessException(message: "订单不存在");
|
throw new BusinessException(message: "订单不存在");
|
||||||
@ -192,6 +202,4 @@ public class TrackPushService : ApplicationService, ITrackPushService
|
|||||||
var res = ObjectMapper.Map<List<TrackPushRecordIndex>, List<TrackPushRecordOutput>>(records);
|
var res = ObjectMapper.Map<List<TrackPushRecordIndex>, List<TrackPushRecordOutput>>(records);
|
||||||
return new UnifyResultDto<List<TrackPushRecordOutput>>(true, res, "操作成功");
|
return new UnifyResultDto<List<TrackPushRecordOutput>>(true, res, "操作成功");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -84,8 +84,10 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc
|
|||||||
TimezoneFormat = trackPushConfig.TimezoneFormat,
|
TimezoneFormat = trackPushConfig.TimezoneFormat,
|
||||||
ServiceProviderCode = item.ServiceProviderCode,
|
ServiceProviderCode = item.ServiceProviderCode,
|
||||||
OrderType = item.OrderType,
|
OrderType = item.OrderType,
|
||||||
TrackCode = item.TrackCode,
|
|
||||||
Sort = item.Sort,
|
Sort = item.Sort,
|
||||||
|
TrackContentId = item.TrackContentId,
|
||||||
|
TrackCode = item.TrackCode,
|
||||||
|
SwapTrackContentId = item.SwapTrackContentId,
|
||||||
SwapTrackCode = item.SwapTrackCode,
|
SwapTrackCode = item.SwapTrackCode,
|
||||||
TrackStatusValue = item.TrackStatusValue,
|
TrackStatusValue = item.TrackStatusValue,
|
||||||
TrackContentCodeValue = item.TrackContentCodeValue,
|
TrackContentCodeValue = item.TrackContentCodeValue,
|
||||||
|
|||||||
@ -3,8 +3,8 @@ using SJZY.Track.Application.Contract.Dtos.Warning;
|
|||||||
using SJZY.Track.Application.Contract.Dtos.Warning.Complete;
|
using SJZY.Track.Application.Contract.Dtos.Warning.Complete;
|
||||||
using SJZY.Track.Application.Contract.Dtos.Warning.Return;
|
using SJZY.Track.Application.Contract.Dtos.Warning.Return;
|
||||||
using SJZY.Track.Application.Helpers;
|
using SJZY.Track.Application.Helpers;
|
||||||
using SJZY.Track.Application.Services.Warning.Handlers.Model;
|
using SJZY.Track.Application.Services.Warning.Handlers;
|
||||||
using SJZY.Track.Application.Services.Warning.Handlers.Warning;
|
using SJZY.Track.Application.Services.Warning.Model;
|
||||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||||
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
|
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
|
||||||
@ -138,8 +138,7 @@ public class CompleteWarningService : ApplicationService
|
|||||||
|
|
||||||
// 查最新轨迹
|
// 查最新轨迹
|
||||||
var orderIds = result.List.Select(x => x.OrderId).ToHashSet();
|
var orderIds = result.List.Select(x => x.OrderId).ToHashSet();
|
||||||
var orderTracks = await _trackDetailsEsRepository.GetLatestListAsync(orderIds);
|
var orderIdTrackDict = await _trackDetailsEsRepository.GetLatestDictAsync(orderIds);
|
||||||
var orderIdTrackDict = orderTracks.ToDictionary(x => x.OrderId);
|
|
||||||
|
|
||||||
// :填充子系统名称(冗余?)
|
// :填充子系统名称(冗余?)
|
||||||
// :填充客户简称(冗余?)
|
// :填充客户简称(冗余?)
|
||||||
@ -207,14 +206,12 @@ public class CompleteWarningService : ApplicationService
|
|||||||
TrackStatusId = id,
|
TrackStatusId = id,
|
||||||
TrackStatus = trackStatusName
|
TrackStatus = trackStatusName
|
||||||
};
|
};
|
||||||
|
|
||||||
}).Where(x => x != null);
|
}).Where(x => x != null);
|
||||||
|
|
||||||
return trackStatus.ToList()!;
|
return trackStatus.ToList()!;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 编辑完整预警规则列表
|
/// 编辑完整预警规则列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -70,7 +70,7 @@ public class TransportWarningService : ApplicationService
|
|||||||
sb.Append($"{entity.CargoType}");
|
sb.Append($"{entity.CargoType}");
|
||||||
// 月份
|
// 月份
|
||||||
if (!string.IsNullOrWhiteSpace(entity.Months))
|
if (!string.IsNullOrWhiteSpace(entity.Months))
|
||||||
sb.Append($"/{entity.Months.Replace("/", "|")}月份");
|
sb.Append($"/{entity.Months.Replace("/", ",")}月份");
|
||||||
// 中转
|
// 中转
|
||||||
if (entity.IsTransit != null)
|
if (entity.IsTransit != null)
|
||||||
sb.Append($"/中转为{(entity.IsTransit.Value ? "是" : "否")}");
|
sb.Append($"/中转为{(entity.IsTransit.Value ? "是" : "否")}");
|
||||||
|
|||||||
@ -65,4 +65,10 @@ public interface IKpiAreaRepository : IBasicRepository<RuleAreaEntity>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
List<KpiAreaInfo>? GetAreaInfosByAreaId(int areaId);
|
List<KpiAreaInfo>? GetAreaInfosByAreaId(int areaId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取所有区域信息
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<Dictionary<int, List<KpiAreaInfo>>> GetAreaInfosDictByAreaId(HashSet<int> areaIds);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
using SJZY.Expand.ElasticSearch.Services;
|
using SJZY.Expand.ElasticSearch.Services;
|
||||||
using SJZY.Track.Domain.Dtos.TrackContents;
|
using SJZY.Track.Domain.Dtos.TrackDetails;
|
||||||
using SJZY.Track.Domain.Enums;
|
using SJZY.Track.Domain.Enums;
|
||||||
|
|
||||||
namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||||
@ -8,7 +8,14 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService<TrackDe
|
|||||||
{
|
{
|
||||||
Task<List<TrackDetailsIndex>> GetListAsync(int[] orderIds, string trackCode, bool forUpsert = false);
|
Task<List<TrackDetailsIndex>> GetListAsync(int[] orderIds, string trackCode, bool forUpsert = false);
|
||||||
|
|
||||||
Task<List<TrackDetailsIndex>> GetLatestListAsync(HashSet<int> eventOrderIds);
|
// 复杂查询,返回 k:订单id v:轨迹列表
|
||||||
|
Task<Dictionary<int, List<TrackDetailsIndex>>> GetOrderTracksDictAsync(GetOrderTracksDictVO input);
|
||||||
|
|
||||||
|
// 查询订单的每个轨迹状态的最旧/早轨迹,返回 k:订单id v:[k:轨迹状态id,v:最早轨迹]
|
||||||
|
Task<Dictionary<int, Dictionary<int, TrackDetailsIndex>>> GetTrackStatusEarliestDictAsync(HashSet<int> orderIds);
|
||||||
|
|
||||||
|
// 查询订单的最新/晚轨迹,返回 k:订单id v:最早轨迹
|
||||||
|
Task<Dictionary<int, TrackDetailsIndex>> GetLatestDictAsync(HashSet<int> orderIds);
|
||||||
|
|
||||||
Task<List<TrackDetailsIndex>> GetLatestListAsync(int[] eventOrderIds, List<string> trackCodes);
|
Task<List<TrackDetailsIndex>> GetLatestListAsync(int[] eventOrderIds, List<string> trackCodes);
|
||||||
|
|
||||||
|
|||||||
@ -5,5 +5,9 @@ namespace SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
|
|||||||
public interface ITrackStatusRepository : IBasicRepository<TrackStatusEntity>
|
public interface ITrackStatusRepository : IBasicRepository<TrackStatusEntity>
|
||||||
{
|
{
|
||||||
Task<GetTrackStatusDetailVO?> GetDetailAsync(int id);
|
Task<GetTrackStatusDetailVO?> GetDetailAsync(int id);
|
||||||
|
|
||||||
Task<UnifyPageResultDto<GetTrackStatusListVO>> GetPageTrackStatus(GetPagedTrackStatusVO input);
|
Task<UnifyPageResultDto<GetTrackStatusListVO>> GetPageTrackStatus(GetPagedTrackStatusVO input);
|
||||||
|
|
||||||
|
// 获取轨迹状态Id与名称字典
|
||||||
|
Task<Dictionary<int, string>> GetTrackStatusIdNameDictAsync(HashSet<int> trackStatusIds);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,8 +12,8 @@ public interface IWarningDetailsEsRepository
|
|||||||
// 分页获取运输预警明细
|
// 分页获取运输预警明细
|
||||||
Task<UnifyPageResultDto<TransportWarningDetailsIndex>> GetPageTransportWarningDetailsAsync(GetPageTransportWarningDetailsInputVO input);
|
Task<UnifyPageResultDto<TransportWarningDetailsIndex>> GetPageTransportWarningDetailsAsync(GetPageTransportWarningDetailsInputVO input);
|
||||||
|
|
||||||
// 获取运输预警明细(预警规则id+状态)
|
// 复杂查询,只关注默认只关注(即将超时/已超时)
|
||||||
Task<List<TransportWarningDetailsIndex>> GetTransportWarningDetailsAsync(HashSet<int> ruleItemIds, HashSet<int> status);
|
Task<List<TransportWarningDetailsIndex>> GetTransportWarningDetailsAsync(GetTransportWarningDetailsVO input);
|
||||||
|
|
||||||
// 更新运输预警明细
|
// 更新运输预警明细
|
||||||
Task UpdateTransportWarningDetailsAsync(TransportWarningDetailsIndex detail);
|
Task UpdateTransportWarningDetailsAsync(TransportWarningDetailsIndex detail);
|
||||||
@ -22,9 +22,7 @@ public interface IWarningDetailsEsRepository
|
|||||||
Task BulkUpdateTransportWarningDetailsAsync(List<TransportWarningDetailsIndex> details, int maxRetries = 3);
|
Task BulkUpdateTransportWarningDetailsAsync(List<TransportWarningDetailsIndex> details, int maxRetries = 3);
|
||||||
|
|
||||||
// 批量关闭运输预警明细
|
// 批量关闭运输预警明细
|
||||||
Task BulkCloseTransportWarningDetailsAsync(HashSet<string> detailIds, int maxRetries = 3);
|
Task BulkCloseTransportWarningDetailsAsync(BulkCloseTransportWarningDetailsVO input, int maxRetries = 3);
|
||||||
// 批量关闭运输预警明细
|
|
||||||
Task BulkCloseTransportWarningDetailsAsync(HashSet<int> ruleItemIds, int maxRetries = 3);
|
|
||||||
|
|
||||||
// 新增运输预警明细
|
// 新增运输预警明细
|
||||||
Task InsertTransportWarningDetailsAsync(TransportWarningDetailsIndex detail);
|
Task InsertTransportWarningDetailsAsync(TransportWarningDetailsIndex detail);
|
||||||
@ -39,6 +37,9 @@ public interface IWarningDetailsEsRepository
|
|||||||
// 分页获取回传预警明细
|
// 分页获取回传预警明细
|
||||||
Task<UnifyPageResultDto<ReturnWarningDetailsIndex>> GetPageReturnWarningDetailsAsync(GetPageReturnWarningDetailsInputVO input);
|
Task<UnifyPageResultDto<ReturnWarningDetailsIndex>> GetPageReturnWarningDetailsAsync(GetPageReturnWarningDetailsInputVO input);
|
||||||
|
|
||||||
|
// 复杂查询,只关注默认只关注(重试中/人工介入)
|
||||||
|
Task<List<ReturnWarningDetailsIndex>> GetReturnWarningDetailsAsync(GetReturnWarningDetailsVO input);
|
||||||
|
|
||||||
// 获取回传日志列表
|
// 获取回传日志列表
|
||||||
Task<List<ReturnMessageRecordIndex>> GetReturnMessageRecordListByIdAsync(string esId);
|
Task<List<ReturnMessageRecordIndex>> GetReturnMessageRecordListByIdAsync(string esId);
|
||||||
|
|
||||||
@ -48,6 +49,9 @@ public interface IWarningDetailsEsRepository
|
|||||||
// 批量更新回传预警明细
|
// 批量更新回传预警明细
|
||||||
Task BulkUpdateReturnWarningDetailsAsync(List<ReturnWarningDetailsIndex> details, int maxRetries = 3);
|
Task BulkUpdateReturnWarningDetailsAsync(List<ReturnWarningDetailsIndex> details, int maxRetries = 3);
|
||||||
|
|
||||||
|
// 批量关闭回传预警明细
|
||||||
|
Task BulkCloseReturnWarningDetailsAsync(BulkCloseReturnWarningDetailsVO input, int maxRetries = 3);
|
||||||
|
|
||||||
// 新增回传预警明细
|
// 新增回传预警明细
|
||||||
Task InsertReturnWarningDetailsAsync(ReturnWarningDetailsIndex detail);
|
Task InsertReturnWarningDetailsAsync(ReturnWarningDetailsIndex detail);
|
||||||
|
|
||||||
@ -67,6 +71,12 @@ public interface IWarningDetailsEsRepository
|
|||||||
// 分页获取完整预警明细
|
// 分页获取完整预警明细
|
||||||
Task<UnifyPageResultDto<CompleteWarningDetailsIndex>> GetPageCompleteWarningDetailsAsync(GetPageCompleteWarningDetailsInputVO input);
|
Task<UnifyPageResultDto<CompleteWarningDetailsIndex>> GetPageCompleteWarningDetailsAsync(GetPageCompleteWarningDetailsInputVO input);
|
||||||
|
|
||||||
|
// 复杂查询,只关注默认只关注(待处理)
|
||||||
|
Task<List<CompleteWarningDetailsIndex>> GetCompleteWarningDetailsAsync(GetCompleteWarningDetailsVO input);
|
||||||
|
|
||||||
|
// 批量关闭完整预警明细
|
||||||
|
Task BulkCloseCompleteWarningDetailsAsync(BulkCloseCompleteWarningDetailsVO input, int maxRetries = 3);
|
||||||
|
|
||||||
// 更新完整预警明细
|
// 更新完整预警明细
|
||||||
Task UpdateCompleteWarningDetailsAsync(CompleteWarningDetailsIndex detail);
|
Task UpdateCompleteWarningDetailsAsync(CompleteWarningDetailsIndex detail);
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,7 @@ public interface IWarningTaskRepository
|
|||||||
// 批量添加预警通知任务
|
// 批量添加预警通知任务
|
||||||
Task<int> BulkInsertWarningNotifyTaskAsync(List<WarningNotifyTaskEntity> entities);
|
Task<int> BulkInsertWarningNotifyTaskAsync(List<WarningNotifyTaskEntity> entities);
|
||||||
|
|
||||||
// 关闭预警通知任务
|
// 关闭预警通知任务,预警类型+detailsId 可以唯一确定
|
||||||
Task<int> CloseWarningNotifyTaskAsync(Expression<Func<WarningNotifyTaskEntity, bool>> expression);
|
Task<int> CloseWarningNotifyTaskAsync(Expression<Func<WarningNotifyTaskEntity, bool>> expression);
|
||||||
|
|
||||||
// 关闭预警通知任务
|
// 关闭预警通知任务
|
||||||
|
|||||||
@ -86,4 +86,9 @@ public class ReturnWarningDetailsIndex : IdBaseIndex
|
|||||||
|
|
||||||
return TextJsonHelper.EqJsonStringField(extra, Extra, compareFields);
|
return TextJsonHelper.EqJsonStringField(extra, Extra, compareFields);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool MatchTrackTime(DateTime trackTime, float trackTimeZone)
|
||||||
|
{
|
||||||
|
return TrackTime == trackTime && Math.Abs(TrackTimeZone - trackTimeZone) < 0.1f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,15 +22,25 @@ public class TrackPushContentConfigVO
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ServiceProviderCode { get; set; } = null!;
|
public string ServiceProviderCode { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送顺序
|
||||||
|
/// </summary>
|
||||||
|
public int Sort { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹内容id
|
||||||
|
/// </summary>
|
||||||
|
public int TrackContentId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 轨迹code
|
/// 轨迹code
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string TrackCode { get; set; } = null!;
|
public string TrackCode { get; set; } = null!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 推送顺序
|
/// 可交换顺序的轨迹内容id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int Sort { get; set; }
|
public int? SwapTrackContentId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 可交换顺序的轨迹code
|
/// 可交换顺序的轨迹code
|
||||||
|
|||||||
@ -17,7 +17,6 @@ public class GetReturnWarningDetailsVO
|
|||||||
public HashSet<int> Status { get; set; } = DefaultFollowStatus;
|
public HashSet<int> Status { get; set; } = DefaultFollowStatus;
|
||||||
public Dictionary<int, HashSet<int>>? OrderIdTrackContentIdsDict { get; set; }
|
public Dictionary<int, HashSet<int>>? OrderIdTrackContentIdsDict { get; set; }
|
||||||
public Dictionary<int, HashSet<string>>? OrderIdTrackEsIdsDict { get; set; }
|
public Dictionary<int, HashSet<string>>? OrderIdTrackEsIdsDict { get; set; }
|
||||||
|
|
||||||
public HashSet<(int SubSystemId, int CustomId, int TrackContentId)>? PushConfigLinks { get; set; }
|
public HashSet<(int SubSystemId, int CustomId, int TrackContentId)>? PushConfigLinks { get; set; }
|
||||||
|
|
||||||
public bool HasDetailsIds => DetailsIds?.Count > 0;
|
public bool HasDetailsIds => DetailsIds?.Count > 0;
|
||||||
|
|||||||
@ -137,9 +137,11 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
|
|||||||
IsAllPush = a.IsAllPush,
|
IsAllPush = a.IsAllPush,
|
||||||
ServiceProviderCode = a.ServiceProviderCode,
|
ServiceProviderCode = a.ServiceProviderCode,
|
||||||
OrderType = b.OrderNoType,
|
OrderType = b.OrderNoType,
|
||||||
TrackCode = d.Code,
|
|
||||||
SwapTrackCode = e.Code,
|
|
||||||
Sort = b.Sort,
|
Sort = b.Sort,
|
||||||
|
TrackContentId = d.Id,
|
||||||
|
TrackCode = d.Code,
|
||||||
|
SwapTrackContentId = e.Id,
|
||||||
|
SwapTrackCode = e.Code,
|
||||||
TrackContentCodeValue = b.TrackContentCodeValue,
|
TrackContentCodeValue = b.TrackContentCodeValue,
|
||||||
TrackContentValue = b.TrackContentValue,
|
TrackContentValue = b.TrackContentValue,
|
||||||
TrackEnContentValue = b.TrackEnContentValue,
|
TrackEnContentValue = b.TrackEnContentValue,
|
||||||
|
|||||||
@ -75,4 +75,20 @@ public class TrackStatusRepository : BasicRepository<TrackStatusEntity>, ITrackS
|
|||||||
|
|
||||||
return pagedList;
|
return pagedList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<Dictionary<int, string>> GetTrackStatusIdNameDictAsync(HashSet<int> trackStatusIds)
|
||||||
|
{
|
||||||
|
if (trackStatusIds.Count == 0) return new Dictionary<int, string>(0);
|
||||||
|
|
||||||
|
var result = await Context.Queryable<TrackStatusEntity>()
|
||||||
|
.Where(x => trackStatusIds.Contains(x.Id))
|
||||||
|
.Select(x => new
|
||||||
|
{
|
||||||
|
x.Id,
|
||||||
|
x.Status
|
||||||
|
})
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
return result.ToDictionary(x => x.Id, x => x.Status);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ using SJZY.Track.Domain.Aggregates.WarningAggregate.Transport;
|
|||||||
|
|
||||||
namespace SJZY.Track.Repository.Repositories;
|
namespace SJZY.Track.Repository.Repositories;
|
||||||
|
|
||||||
public sealed class WarningTaskRepository : BasicRepository<WarningNotifyTaskEntity>, IWarningTaskRepository
|
public sealed class WarningTaskRepository : BasicRepository<WarningNotifyTaskEntity>, IWarningTaskRepository, ITransientDependency
|
||||||
{
|
{
|
||||||
#region 预警通知任务
|
#region 预警通知任务
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user