Merge branch 'S06' into test
This commit is contained in:
commit
1b3290375b
@ -95,7 +95,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
|
|
||||||
private async Task DoPushAsync(TrackPushEvent @event)
|
private async Task DoPushAsync(TrackPushEvent @event)
|
||||||
{
|
{
|
||||||
// todo: 轨迹中台推送逻辑致使的未推送,也需要广播到mq,告知业务系统缘故
|
|
||||||
var items = new List<TrackPushInput>();
|
var items = new List<TrackPushInput>();
|
||||||
TrackPushContentConfigDto? config;
|
TrackPushContentConfigDto? config;
|
||||||
var isSystemPush = @event.OperationMan == null;
|
var isSystemPush = @event.OperationMan == null;
|
||||||
@ -357,14 +356,22 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
body = DeserializeForTextJson<TrackPushInput>(history.PushContent);
|
body = DeserializeForTextJson<TrackPushInput>(history.PushContent);
|
||||||
if (config.IsAllPushWithLatest)
|
if (config.IsAllPushWithLatest)
|
||||||
{
|
{
|
||||||
|
//同code同比较字段保证唯一
|
||||||
var old = body!.Data
|
var old = body!.Data
|
||||||
.Where(x => x["code"] == cur["code"])
|
.Where(x =>
|
||||||
.WhereIf(!compareFields.IsNullOrWhiteSpace(), x =>
|
{
|
||||||
|
//反序列化出的JsonElement和字典字符串类型做比较
|
||||||
|
var a = ((JsonElement) x["code"]!).GetString();
|
||||||
|
var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同
|
||||||
|
return a == b;
|
||||||
|
}).WhereIf(!compareFields.IsNullOrWhiteSpace(), x =>
|
||||||
{
|
{
|
||||||
if (x["extra"] == null || log.Extra == null) return false;
|
if (x["extra"] == null || log.Extra == null) return false;
|
||||||
return EqExtraByFieldForTextJson(x["extra"]!, DeserializeForTextJson<JsonElement>(log.Extra)!, compareFields!);
|
return EqExtraByFieldForTextJson(x["extra"]!, DeserializeForTextJson<JsonElement>(log.Extra), compareFields!);
|
||||||
})
|
})
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
|
||||||
if (old != null)
|
if (old != null)
|
||||||
{
|
{
|
||||||
body.Data.Remove(old);
|
body.Data.Remove(old);
|
||||||
|
|||||||
@ -176,6 +176,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
// 批量add to es
|
// 批量add to es
|
||||||
await _trackDetailsEsRepository.AddManyAsync(insertTracks);
|
await _trackDetailsEsRepository.AddManyAsync(insertTracks);
|
||||||
|
|
||||||
|
//批量写入订单操作日志
|
||||||
|
_ = _orderOperationRecordEsRepository
|
||||||
|
.AddManyAsync(insertTracks.Select(t => BuildOrderOperationRecord(@event, t, new OrderIdentifier
|
||||||
|
{
|
||||||
|
OrderNo = t.OrderNo,
|
||||||
|
OrderId = t.OrderId
|
||||||
|
})).ToList());
|
||||||
|
|
||||||
// 添加轨迹触发订单拉取状态更新
|
// 添加轨迹触发订单拉取状态更新
|
||||||
await _orderRepository.UpdatePullStatusToSilenceAsync(insertTracks.Select(x => x.OrderId).ToList(),
|
await _orderRepository.UpdatePullStatusToSilenceAsync(insertTracks.Select(x => x.OrderId).ToList(),
|
||||||
@event.TrackCode);
|
@event.TrackCode);
|
||||||
@ -243,7 +251,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
|
|
||||||
var insertTracks = new List<TrackDetailsIndex>();
|
var insertTracks = new List<TrackDetailsIndex>();
|
||||||
var updateTracks = new List<TrackDetailsIndex>();
|
var updateTracks = new List<TrackDetailsIndex>();
|
||||||
|
var operationRecords = new List<OrderOperationRecordIndex>();
|
||||||
foreach (var order in @event.OrderIdentifiers)
|
foreach (var order in @event.OrderIdentifiers)
|
||||||
{
|
{
|
||||||
// fast path: by update with es id case
|
// fast path: by update with es id case
|
||||||
@ -277,7 +285,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
{
|
{
|
||||||
var oldExtraDict = GetExtraDictForTextJson(x.Extra);
|
var oldExtraDict = GetExtraDictForTextJson(x.Extra);
|
||||||
// tips:注意兼容性,历史轨迹的字段可能为空
|
// tips:注意兼容性,历史轨迹的字段可能为空
|
||||||
if (oldExtraDict == null|| !oldExtraDict.TryGetValue(@event.CompareFields, out var oldValue))
|
if (oldExtraDict == null || !oldExtraDict.TryGetValue(@event.CompareFields, out var oldValue))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -301,6 +309,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
if (track == null) continue; // 不存在不让改
|
if (track == null) continue; // 不存在不让改
|
||||||
|
|
||||||
updateTracks.Add(BuiltUpdateTrack(@event, track, order, trackContent));
|
updateTracks.Add(BuiltUpdateTrack(@event, track, order, trackContent));
|
||||||
|
operationRecords.Add(BuildOrderOperationRecord(@event, track, order));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -317,6 +326,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
{
|
{
|
||||||
//批量差异化更新轨迹
|
//批量差异化更新轨迹
|
||||||
await _trackDetailsEsRepository.BulkUpdateAsync(updateTracks);
|
await _trackDetailsEsRepository.BulkUpdateAsync(updateTracks);
|
||||||
|
//批量写入操作日志
|
||||||
|
_ = _orderOperationRecordEsRepository.AddManyAsync(operationRecords);
|
||||||
}
|
}
|
||||||
|
|
||||||
return insertTracks;
|
return insertTracks;
|
||||||
@ -363,19 +374,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
track.EstimatedDeliveryDate = @event.EstimatedDeliveryDate;
|
track.EstimatedDeliveryDate = @event.EstimatedDeliveryDate;
|
||||||
track.Extra = @event.Extra;
|
track.Extra = @event.Extra;
|
||||||
|
|
||||||
// todo:如果后面写es异常了,这里日志不就不准了,这里应该和写轨迹一样,做成批量的,放到写完轨迹只会写日志
|
|
||||||
// 写入操作日志
|
|
||||||
_ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex
|
|
||||||
{
|
|
||||||
OrderId = order.OrderId,
|
|
||||||
OrderNo = order.OrderNo,
|
|
||||||
OptionType = OrderOperationType.修改轨迹.ToString(),
|
|
||||||
Content = track.ToJson(),
|
|
||||||
CreateUserId = @event.OperationManId,
|
|
||||||
CreateUserName = @event.OperationMan ?? "",
|
|
||||||
CreateTime = DateTime.Now
|
|
||||||
});
|
|
||||||
|
|
||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -429,19 +427,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
? track.TrackTime
|
? track.TrackTime
|
||||||
: track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
|
: track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
|
||||||
|
|
||||||
// todo:如果后面写es异常了,这里日志不就不准了,这里应该和写轨迹一样,做成批量的,放到写完轨迹只会写日志
|
|
||||||
// 写入操作日志
|
|
||||||
_ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex
|
|
||||||
{
|
|
||||||
OrderId = order.OrderId,
|
|
||||||
OrderNo = order.OrderNo,
|
|
||||||
OptionType = OrderOperationType.创建轨迹.ToString(),
|
|
||||||
Content = track.ToJson(),
|
|
||||||
CreateUserId = @event.OperationManId,
|
|
||||||
CreateUserName = @event.OperationMan ?? "",
|
|
||||||
CreateTime = DateTime.Now
|
|
||||||
});
|
|
||||||
|
|
||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,4 +446,18 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private OrderOperationRecordIndex BuildOrderOperationRecord(TrackUpsertEvent @event, TrackDetailsIndex track, OrderIdentifier order)
|
||||||
|
{
|
||||||
|
return new OrderOperationRecordIndex
|
||||||
|
{
|
||||||
|
OrderId = order.OrderId,
|
||||||
|
OrderNo = order.OrderNo,
|
||||||
|
OptionType = @event.IsAdd ? OrderOperationType.创建轨迹.ToString() : OrderOperationType.修改轨迹.ToString(),
|
||||||
|
Content = track.ToJson(),
|
||||||
|
CreateUserId = @event.OperationManId,
|
||||||
|
CreateUserName = @event.OperationMan ?? "",
|
||||||
|
CreateTime = DateTime.Now
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -157,7 +157,7 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync();
|
var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync();
|
||||||
if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null)
|
if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null)
|
||||||
{
|
{
|
||||||
//todo:保留之前的方式 后续可去除
|
//todo:保留之前的方式(FBA在用) 后续可能去除
|
||||||
userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId);
|
userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId);
|
||||||
|
|
||||||
if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null)
|
if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null)
|
||||||
@ -225,12 +225,32 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
var trackCodes = input.TrackIdentifiers?.Select(x => x.TrackCode).ToList();
|
var trackCodes = input.TrackIdentifiers?.Select(x => x.TrackCode).ToList();
|
||||||
var trackIds = input.TrackIdentifiers?.Select(y => $"{y.TrackCode}{y.TrackTime}").ToHashSet();
|
var trackIds = input.TrackIdentifiers?.Select(y => $"{y.TrackCode}{y.TrackTime}").ToHashSet();
|
||||||
//没有任何需要操作的轨迹
|
//没有任何需要操作的轨迹
|
||||||
if (trackIds == null || trackIds.Count == 0) goto NO_DELETE_TRACK;
|
if (trackIds == null || trackIds.Count == 0)
|
||||||
|
{
|
||||||
|
throw new BusinessException(message: "没有任何轨迹要删除,请检查输入参数");
|
||||||
|
}
|
||||||
|
|
||||||
//删除轨迹约束,只要其中有一条来源是外部的就立即返回错误
|
//删除轨迹约束,只要其中有一条来源是外部的就立即返回错误
|
||||||
tracks = await _trackDetailsEsRepository.GetListAsync(new[] { orderId }, trackCodes);
|
tracks = await _trackDetailsEsRepository.GetListAsync(new[] { orderId }, trackCodes);
|
||||||
//检查删除的轨迹中是否包含外部轨迹
|
//检查删除的轨迹中是否包含外部轨迹
|
||||||
existsExternal = tracks
|
existsExternal = tracks
|
||||||
.Where(x => x.Source == (int) TrackSourceEnum.ExternalServiceProvide)
|
.Where(x => x.Source == (int) TrackSourceEnum.ExternalServiceProvide)
|
||||||
|
.WhereIf(!input.CompareFields.IsNullOrWhiteSpace(), y =>
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(y.Extra))
|
||||||
|
{
|
||||||
|
throw new BusinessException(message: "轨迹extra为空无法使用比较字段比较,请检查轨迹");
|
||||||
|
}
|
||||||
|
|
||||||
|
var extraDict = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(y.Extra);
|
||||||
|
if (extraDict!.TryGetValue(input.CompareFields!, out var compareValue))
|
||||||
|
{
|
||||||
|
//tips:可能会有问题
|
||||||
|
return compareValue.Equals(input.CompareValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
})
|
||||||
.Select(x => $"{x.TrackCode}{x.TrackTime}")
|
.Select(x => $"{x.TrackCode}{x.TrackTime}")
|
||||||
.Any(x => trackIds.Contains(x));
|
.Any(x => trackIds.Contains(x));
|
||||||
}
|
}
|
||||||
@ -240,24 +260,23 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除");
|
throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// todo:非必须不用goto,除非是在写算法,业务逻辑理论上都能通过if和方法规避
|
|
||||||
NO_DELETE_TRACK:
|
|
||||||
if (tracks.Count == 0)
|
if (tracks.Count == 0)
|
||||||
{
|
{
|
||||||
throw new BusinessException(message: "没有任何轨迹要删除,请检查输入参数");
|
throw new BusinessException(message: "没有任何轨迹要删除,请检查输入参数");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除轨迹
|
// 删除轨迹
|
||||||
var @event = new TrackDeleteEvent
|
await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe,
|
||||||
{
|
new TrackDeleteEvent
|
||||||
EsIds = input.EsIds?.ToArray(),
|
{
|
||||||
OrderIds = new[] { orderId },
|
EsIds = input.EsIds?.ToArray(),
|
||||||
TrackIdentifiers = input.TrackIdentifiers,
|
OrderIds = new[] { orderId },
|
||||||
SubSystemId = input.SubSystemId,
|
CompareFields = input.CompareFields,
|
||||||
OperationMan = name
|
CompareValue = input.CompareValue,
|
||||||
};
|
TrackIdentifiers = input.TrackIdentifiers,
|
||||||
await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event);
|
SubSystemId = input.SubSystemId,
|
||||||
|
OperationMan = name
|
||||||
|
});
|
||||||
|
|
||||||
return new UnifyResultDto(true, true);
|
return new UnifyResultDto(true, true);
|
||||||
}
|
}
|
||||||
@ -351,6 +370,8 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
{
|
{
|
||||||
OrderIds = orderIds.ToArray(),
|
OrderIds = orderIds.ToArray(),
|
||||||
TrackIdentifiers = input.TrackIdentifiers,
|
TrackIdentifiers = input.TrackIdentifiers,
|
||||||
|
CompareFields = input.CompareFields,
|
||||||
|
CompareValue = input.CompareValue,
|
||||||
SubSystemId = input.SubSystemId,
|
SubSystemId = input.SubSystemId,
|
||||||
OperationMan = userInfo.Data.UserName,
|
OperationMan = userInfo.Data.UserName,
|
||||||
};
|
};
|
||||||
@ -360,7 +381,6 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// todo:代码封装性太差了,拆小一点
|
// todo:代码封装性太差了,拆小一点
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 批量新增、更新轨迹
|
/// 批量新增、更新轨迹
|
||||||
|
|||||||
@ -9,6 +9,13 @@ public interface IOrderOperationRecordEsRepository
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task AddAsync(OrderOperationRecordIndex index);
|
Task AddAsync(OrderOperationRecordIndex index);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 添加订单操作记录(批量)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="indexes"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task AddManyAsync(List<OrderOperationRecordIndex> indexes);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取订单操作记录
|
/// 获取订单操作记录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -29,6 +29,24 @@ public class OrderOperationRecordEsRepository : ElasticSearchContextAbstract<Ord
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task AddManyAsync(List<OrderOperationRecordIndex> indexes)
|
||||||
|
{
|
||||||
|
// 按天写入es
|
||||||
|
var indexName = $"{GlobalConst.OrderOperationRecordIndex}-{DateTime.Now:yyyy.MM.dd}";
|
||||||
|
indexes.ForEach(x =>
|
||||||
|
{
|
||||||
|
x.IndexName = indexName;
|
||||||
|
x.CreateTime = DateTime.Now;
|
||||||
|
});
|
||||||
|
|
||||||
|
var r = await Context.IndexManyAsync(indexes, indexName);
|
||||||
|
|
||||||
|
if (!r.IsValid)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"{indexes.Count}条订单变更记录写入失败,原因:{r.DebugInformation}。");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<List<OrderOperationRecordIndex>> GetOrderOperationsByIdAsync(int orderId)
|
public async Task<List<OrderOperationRecordIndex>> GetOrderOperationsByIdAsync(int orderId)
|
||||||
{
|
{
|
||||||
var data = await Context.SearchAsync<OrderOperationRecordIndex>(x => x
|
var data = await Context.SearchAsync<OrderOperationRecordIndex>(x => x
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user