【 7. 轨迹增删改,去除对轨迹模板的依赖】

https://www.tapd.cn/60863849/prong/tasks/view/1160863849001027883
This commit is contained in:
xiaolipro 2024-09-04 11:22:53 +08:00
parent 4d30d935ba
commit bd0287dfb0
10 changed files with 34 additions and 125 deletions

View File

@ -26,4 +26,10 @@ public class TrackDeleteEvent
/// 已经处理过的订单 /// 已经处理过的订单
/// </summary> /// </summary>
public List<int> Visited { get; set; } = new(); public List<int> Visited { get; set; } = new();
public override string ToString()
{
return $"[TrackDelete by {OperationMan}] SubSystemId: {SubSystemId}, OrderIds: {string.Join(",",
OrderIds)}, TrackCodes: {string.Join(",", TrackCodes)}";
}
} }

View File

@ -58,4 +58,11 @@ public class TrackUpsertEvent
/// 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种 /// 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种
/// </summary> /// </summary>
public int DeficiencyTagValue { get; set; } public int DeficiencyTagValue { get; set; }
public override string ToString()
{
return
$"[{(IsAdd ? "TrackInsert" : "TrackUpdate")} by {OperationMan}] SubSystemId: {SubSystemId}, OrderIds: {string.Join(",",
OrderIdentifiers.Select(x => x.OrderId))}, TrackCode: {TrackCode}, TrackPlace: {TrackPlace}, TrackTime: {TrackTime}";
}
} }

View File

@ -32,7 +32,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
var dup = @event.Visited.Intersect(@event.OrderIds).ToArray(); var dup = @event.Visited.Intersect(@event.OrderIds).ToArray();
if (dup.Any()) if (dup.Any())
{ {
LogHelper.Error($"删除轨迹时,发现循环依赖:{dup.JoinAsString(",")}"); LogHelper.Warn($"删除轨迹时,发现循环依赖:{dup.JoinAsString(",")}", true);
return; return;
} }
@ -58,7 +58,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
if (mapCodes.Count == 0) if (mapCodes.Count == 0)
{ {
//throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员"); LogHelper.Warn($"订单跨子系统,未配置内容映射,请联系管理员:{@event}", true);
continue; continue;
} }

View File

@ -36,7 +36,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
var dup = @event.Visited.Intersect(orderIds).ToArray(); var dup = @event.Visited.Intersect(orderIds).ToArray();
if (dup.Any()) if (dup.Any())
{ {
LogHelper.Error($"{(@event.IsAdd ? "添加" : "修改")}轨迹时,发现循环依赖:{dup.JoinAsString(",")}"); LogHelper.Warn($"{(@event.IsAdd ? "添加" : "修改")}轨迹时,发现循环依赖:{dup.JoinAsString(",")}", true);
return; return;
} }
@ -108,20 +108,19 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
private async Task HandleTrackAsync(TrackUpsertEvent @event, List<int> canNextOrderIds) private async Task HandleTrackAsync(TrackUpsertEvent @event, List<int> canNextOrderIds)
{ {
var content = await _provideQueries.GetTrackContentAsync(@event.SubSystemId, @event.TrackCode); var trackContent = await _provideQueries.GetTrackContentAsync(@event.SubSystemId, @event.TrackCode);
if (content == null) return; if (trackContent == null)
{
// 找不到轨迹内容,直接结束
LogHelper.Warn($"找不到轨迹内容:{@event}", true);
return;
}
var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray();
var tracks = await _trackDetailsRepository.GetListAsync(orderIds, @event.TrackCode, true);
// important:轨迹code相同,时间、发生地不同的,允许存在多条!! // important:轨迹code相同,时间、发生地不同的,可能存在多条!!
var newOrderIds = orderIds var tracks = await _trackDetailsRepository.GetListAsync(orderIds, @event.TrackCode, true);
.Except(tracks
.Where(x => x.TrackTime == @event.TrackTime && x.TrackPlace == @event.TrackPlace)
.Select(x => x.OrderId)
).ToArray();
var trackContents = await _provideQueries.MatchTrackContentAsync(newOrderIds, @event.TrackCode);
var insertTracks = new List<TrackDetailsIndex>(); var insertTracks = new List<TrackDetailsIndex>();
@ -148,22 +147,12 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString, OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString,
OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString, OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString,
CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, CreateUser = @event.OperationMan ?? GlobalConst.SystemUser,
CreateTime = DateTime.Now CreateTime = DateTime.Now,
TrackStatus = trackContent.TrackStatus,
TrackContent = trackContent.TrackContent,
TrackEnContent = trackContent.TrackEnContent
}; };
// 根据轨迹code在订单模板内容中寻找匹配的
var trackContent = trackContents.FirstOrDefault(x => x.OrderId == order.OrderId);
if (trackContent == default)
{
// 订单所绑定的模板,没有一条内容可以匹配发生的轨迹
continue;
}
track.TrackStatus = trackContent.Status;
track.TrackCode = trackContent.TrackCode;
track.TrackContent = trackContent.Content;
track.TrackEnContent = trackContent.EnContent;
track.IsCanDelete = trackContent.IsCanDelete;
track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
? track.TrackTime ? track.TrackTime
: track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
@ -199,9 +188,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
CustomId = @event.CustomId, CustomId = @event.CustomId,
OrderIds = canNextOrderIds.ToArray(), OrderIds = canNextOrderIds.ToArray(),
IsCompleted = @event.TrackRefreshData.IsCompleted, IsCompleted = @event.TrackRefreshData.IsCompleted,
TrackContent = content.TrackContent, TrackContent = trackContent.TrackContent,
TrackEnContent = content.TrackEnContent, TrackEnContent = trackContent.TrackEnContent,
TrackStatusId = content.TrackStatusId, TrackStatusId = trackContent.TrackStatusId,
TrackPlace = @event.TrackPlace, TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime, TrackTime = @event.TrackTime,
TrackTimeZone = @event.TrackTimeZone, TrackTimeZone = @event.TrackTimeZone,
@ -219,8 +208,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackCode = @event.TrackCode, TrackCode = @event.TrackCode,
SystemPushInfo = new SystemPushStruct SystemPushInfo = new SystemPushStruct
{ {
TrackStatus = content.TrackStatus, TrackStatus = trackContent.TrackStatus,
TrackContent = content.TrackContent, TrackContent = trackContent.TrackContent,
TrackPlace = @event.TrackPlace, TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime, TrackTime = @event.TrackTime,
TrackTimeZone = @event.TrackTimeZone TrackTimeZone = @event.TrackTimeZone

View File

@ -82,11 +82,6 @@ public class TrackDetailsIndex : IdBaseIndex
/// </summary> /// </summary>
public DateTime ZeroTrackTime { get; set; } public DateTime ZeroTrackTime { get; set; }
/// <summary>
/// 是否可删
/// </summary>
public bool IsCanDelete { get; set; }
/// <summary> /// <summary>
/// 创建人 /// 创建人
/// </summary> /// </summary>

View File

@ -1,34 +0,0 @@
namespace SJZY.Track.Domain.Dtos.TrackDetails;
public class MatchTrackContentDto
{
/// <summary>
/// 订单Id
/// </summary>
public int OrderId { get; set; }
/// <summary>
/// 轨迹内容code
/// </summary>
public string TrackCode { get; set; } = null!;
/// <summary>
/// 轨迹内容
/// </summary>
public string Content { get; set; } = null!;
/// <summary>
/// 轨迹内容英文
/// </summary>
public string EnContent { get; set; } = null!;
/// <summary>
/// 轨迹状态
/// </summary>
public string Status { get; set; } = null!;
/// <summary>
/// 是否可删
/// </summary>
public bool IsCanDelete { get; set; }
}

View File

@ -1,14 +0,0 @@
namespace SJZY.Track.Domain.Dtos.TrackDetails;
public class MatchTrackContentsDto
{
/// <summary>
/// 轨迹代码
/// </summary>
public string TrackCode { get; set; } = null!;
/// <summary>
/// 是否支持删除
/// </summary>
public bool IsCanDelete { get; set; }
}

View File

@ -1,9 +0,0 @@
namespace SJZY.Track.Domain.Dtos.TrackDetails;
public class TrackDetailsQueryInput : PageInfoInput
{
/// <summary>
/// 单号
/// </summary>
public List<string> OrderNos { get; set; } = new();
}

View File

@ -1,6 +1,5 @@
using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Dtos.Order;
using SJZY.Track.Domain.Dtos.TrackContents; using SJZY.Track.Domain.Dtos.TrackContents;
using SJZY.Track.Domain.Dtos.TrackDetails;
namespace SJZY.Track.Domain.Queries; namespace SJZY.Track.Domain.Queries;
@ -9,14 +8,6 @@ namespace SJZY.Track.Domain.Queries;
/// </summary> /// </summary>
public interface IProvideQueries public interface IProvideQueries
{ {
/// <summary>
/// 根据订单id找到订单模板,匹配模板命中的轨迹内容
/// </summary>
/// <param name="orderIds">订单ids</param>
/// <param name="code">轨迹代码</param>
/// <returns></returns>
Task<List<MatchTrackContentDto>> MatchTrackContentAsync(int[] orderIds, string code);
/// <summary> /// <summary>
/// 根据子系统内容映射,得到映射后的轨迹code /// 根据子系统内容映射,得到映射后的轨迹code
/// </summary> /// </summary>

View File

@ -1,10 +1,8 @@
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Dtos.Order;
using SJZY.Track.Domain.Dtos.TrackContents; using SJZY.Track.Domain.Dtos.TrackContents;
using SJZY.Track.Domain.Dtos.TrackDetails;
using SJZY.Track.Domain.Queries; using SJZY.Track.Domain.Queries;
using SJZY.Track.Domain.VEntities; using SJZY.Track.Domain.VEntities;
@ -24,26 +22,6 @@ public class ProvideQueries : ISugarRepository, IProvideQueries,
Context = SqlsugarScopeBasic.GetContextSafely("default"); Context = SqlsugarScopeBasic.GetContextSafely("default");
} }
/// <inheritdoc />
public async Task<List<MatchTrackContentDto>> MatchTrackContentAsync(int[] orderIds, string code)
{
if (orderIds.Length == 0) return new List<MatchTrackContentDto>();
return await Context.Queryable<OrderTemplateEntity>()
.LeftJoin<TrackTemplateContentEntity>((x, a) => x.TrackTemplateId == a.TrackTemplateId)
.LeftJoin<TrackContentEntity>((x, a, b) => a.TrackContentId == b.Id)
.LeftJoin<TrackStatusEntity>((x, a, b, c) => b.TrackStatusId == c.Id)
.Where((x, a, b) => orderIds.Contains(x.OrderId) && b.Code == code)
.Select((x, a, b, c) => new MatchTrackContentDto
{
OrderId = x.OrderId,
TrackCode = b.Code,
Content = b.Content,
EnContent = b.EnContent,
Status = c.Status
})
.ToListAsync();
}
/// <inheritdoc /> /// <inheritdoc />
public async Task<List<string>> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes) public async Task<List<string>> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes)
{ {