入参模型更新:
UpsertTrackInput(新增/更新轨迹):来源轨迹明细新增的相关字段 BatchUpsertTrackInput(批量新增更新/轨迹):来源轨迹明细新增的相关字段 反参模型更新: TrackOrderDetailDto(查询轨迹明细) feat: - 增加(新增/更新轨迹)(单个/批量)入参【目的地时区】和【预计到达时间】的校验 - 增加(删除轨迹)(单个/批量)外部来源不允许删除的约束(异常后同步返回) - 当(新增/更新轨迹)(单个/批量)时如果输入【目的地时区】和【预计到达时间】则同步到订单主表 - 支持【轨迹内容】【轨迹内容英文】的二次修改,修改内容来源于请求 - 【批量新增轨迹】增加当内容不允许重复时,更新相同code的轨迹明细的轨迹内容,并限制不允许更改轨迹来源
This commit is contained in:
parent
725f60bed3
commit
6a2faf90a2
@ -35,4 +35,67 @@ public class BatchUpsertTrackInput : OrderNosInfo
|
|||||||
[Required]
|
[Required]
|
||||||
[Range(-12, 12)]
|
[Range(-12, 12)]
|
||||||
public float TrackTimeZone { get; set; }
|
public float TrackTimeZone { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客户是否可见
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
public bool IsVisibility { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
public int Source { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹备注
|
||||||
|
/// </summary>
|
||||||
|
public string? Remarks { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 附件集合
|
||||||
|
/// </summary>
|
||||||
|
public List<FileItemDto>? Files { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹内容,若为空则取轨迹内容表中该轨迹Code对应的轨迹内容
|
||||||
|
/// </summary>
|
||||||
|
public string? Content { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹内容英文,若为空则取轨迹内容表中该轨迹Code对应的轨迹英文内容
|
||||||
|
/// </summary>
|
||||||
|
public string? EnStatus { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(城市)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceCity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(省/州)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceProvince { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(国家/地区)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceNation { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地邮编
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlacePostcode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 预计到达时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? EstimatedDeliveryDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 目的地时区
|
||||||
|
/// </summary>
|
||||||
|
[Range(-12, 12)]
|
||||||
|
public float? DestinationTimeZone { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -86,4 +86,54 @@ public class TrackOrderDetailDto
|
|||||||
/// 创建人
|
/// 创建人
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string? CreateUser { get; set; }
|
public string? CreateUser { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客户是否可见
|
||||||
|
/// </summary>
|
||||||
|
public bool IsVisibility { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
|
||||||
|
/// </summary>
|
||||||
|
public int Source { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 备注
|
||||||
|
/// </summary>
|
||||||
|
public string? Remarks { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 附件集合
|
||||||
|
/// </summary>
|
||||||
|
public List<FileItemDto>? Files { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(城市)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceCity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(省/州)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceProvince { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(国家/地区)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceNation { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地邮编
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlacePostcode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 预计到达时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? EstimatedDeliveryDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 目的地时区
|
||||||
|
/// </summary>
|
||||||
|
public float? DestinationTimeZone { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,4 +35,67 @@ public class UpsertTrackInput : OrderNoInfo
|
|||||||
[Required]
|
[Required]
|
||||||
[Range(-12, 12)]
|
[Range(-12, 12)]
|
||||||
public float? TrackTimeZone { get; set; }
|
public float? TrackTimeZone { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客户是否可见
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
public bool IsVisibility { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
public int Source { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹备注
|
||||||
|
/// </summary>
|
||||||
|
public string? Remarks { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 附件集合
|
||||||
|
/// </summary>
|
||||||
|
public List<FileItemDto>? Files { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹内容,若为空则取轨迹内容表中该轨迹Code对应的轨迹内容
|
||||||
|
/// </summary>
|
||||||
|
public string? Content { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹内容英文,若为空则取轨迹内容表中该轨迹Code对应的轨迹英文内容
|
||||||
|
/// </summary>
|
||||||
|
public string? EnStatus { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(城市)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceCity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(省/州)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceProvince { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(国家/地区)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceNation { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地邮编
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlacePostcode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 预计到达时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? EstimatedDeliveryDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 目的地时区
|
||||||
|
/// </summary>
|
||||||
|
[Range(-12, 12)]
|
||||||
|
public float? DestinationTimeZone { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -41,4 +41,14 @@ public class TrackChangeAfterUpdateOrderEvent
|
|||||||
/// 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种
|
/// 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int DeficiencyTagValue { get; set; }
|
public int DeficiencyTagValue { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 预计到达时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? EstimatedDeliveryDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 签收地时区
|
||||||
|
/// </summary>
|
||||||
|
public float? DestinationTimeZone { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||||
|
|
||||||
namespace SJZY.Track.Application.Contract.Events;
|
namespace SJZY.Track.Application.Contract.Events;
|
||||||
|
|
||||||
public class TrackUpsertEvent
|
public class TrackUpsertEvent
|
||||||
@ -54,6 +56,66 @@ public class TrackUpsertEvent
|
|||||||
|
|
||||||
public TrackRefreshStruct TrackRefreshData { get; set; }
|
public TrackRefreshStruct TrackRefreshData { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客户是否可见
|
||||||
|
/// </summary>
|
||||||
|
public bool IsVisibility { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
|
||||||
|
/// </summary>
|
||||||
|
public int Source { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹备注
|
||||||
|
/// </summary>
|
||||||
|
public string? Remarks { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 附件集合
|
||||||
|
/// </summary>
|
||||||
|
public List<FileItemDto>? Files { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹内容,若为空则取轨迹内容表中该轨迹Code对应的轨迹内容
|
||||||
|
/// </summary>
|
||||||
|
public string? Content { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹内容英文,若为空则取轨迹内容表中该轨迹Code对应的轨迹英文内容
|
||||||
|
/// </summary>
|
||||||
|
public string? EnStatus { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(城市)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceCity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(省/州)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceProvince { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地(国家/地区)
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlaceNation { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹发生地邮编
|
||||||
|
/// </summary>
|
||||||
|
public string? TrackPlacePostcode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 预计到达时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? EstimatedDeliveryDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 目的地时区
|
||||||
|
/// </summary>
|
||||||
|
public float? DestinationTimeZone { get; set; }
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
|
|||||||
@ -33,6 +33,7 @@ public class OrderAutoMapperProfile : Profile
|
|||||||
.ForMember(dest => dest.Content, opt => opt.MapFrom(m => m.TrackContent))
|
.ForMember(dest => dest.Content, opt => opt.MapFrom(m => m.TrackContent))
|
||||||
.ForMember(dest => dest.EnContent, opt => opt.MapFrom(m => m.TrackEnContent))
|
.ForMember(dest => dest.EnContent, opt => opt.MapFrom(m => m.TrackEnContent))
|
||||||
.ForMember(dest => dest.TrackTimeZoneValue, opt => opt.MapFrom(m => m.TrackTimeZone));
|
.ForMember(dest => dest.TrackTimeZoneValue, opt => opt.MapFrom(m => m.TrackTimeZone));
|
||||||
|
CreateMap<FileItem, FileItemDto>(MemberList.None);
|
||||||
|
|
||||||
CreateMap<TrackPushRecordIndex, TrackPushRecordOutput>(MemberList.None);
|
CreateMap<TrackPushRecordIndex, TrackPushRecordOutput>(MemberList.None);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,6 +26,8 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//指示是否需要更新【预计签收时间】【签收地时区】
|
||||||
|
var isNeedUpdate = false;
|
||||||
var updateOrders = new List<OrderEntity>();
|
var updateOrders = new List<OrderEntity>();
|
||||||
foreach (var order in orders)
|
foreach (var order in orders)
|
||||||
{
|
{
|
||||||
@ -55,11 +57,20 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
|
|||||||
order.LatestTrackPlace = @event.TrackPlace;
|
order.LatestTrackPlace = @event.TrackPlace;
|
||||||
order.LatestTrackTime = @event.TrackTime;
|
order.LatestTrackTime = @event.TrackTime;
|
||||||
order.LatestTrackTimeZone = @event.TrackTimeZone;
|
order.LatestTrackTimeZone = @event.TrackTimeZone;
|
||||||
|
//当【预计签收时间】【签收地时区】同时存在时则更新主表
|
||||||
|
if (@event.EstimatedDeliveryDate.HasValue && @event.DestinationTimeZone.HasValue)
|
||||||
|
{
|
||||||
|
order.EstimatedDeliveryDate = @event.EstimatedDeliveryDate.Value;
|
||||||
|
order.DestinationTimeZone = @event.DestinationTimeZone.Value;
|
||||||
|
isNeedUpdate = true;
|
||||||
|
}
|
||||||
|
|
||||||
updateOrders.Add(order);
|
updateOrders.Add(order);
|
||||||
}
|
}
|
||||||
|
|
||||||
await _orderRepository.UpdateRangeAsync(updateOrders,
|
await _orderRepository.UpdateRangeAsync(updateOrders,
|
||||||
x => new
|
isNeedUpdate
|
||||||
|
? x => new
|
||||||
{
|
{
|
||||||
x.IsCompleted,
|
x.IsCompleted,
|
||||||
x.LatestTrackContent,
|
x.LatestTrackContent,
|
||||||
@ -67,8 +78,22 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
|
|||||||
x.LatestTrackPlace,
|
x.LatestTrackPlace,
|
||||||
x.LatestTrackTime,
|
x.LatestTrackTime,
|
||||||
x.LatestTrackTimeZone,
|
x.LatestTrackTimeZone,
|
||||||
x.DeficiencyTag
|
x.DeficiencyTag,
|
||||||
});
|
//当标识指示需要更新时添加更新列
|
||||||
|
x.EstimatedDeliveryDate,
|
||||||
|
x.DestinationTimeZone
|
||||||
|
}
|
||||||
|
: x => new
|
||||||
|
{
|
||||||
|
x.IsCompleted,
|
||||||
|
x.LatestTrackContent,
|
||||||
|
x.LatestTrackEnContent,
|
||||||
|
x.LatestTrackPlace,
|
||||||
|
x.LatestTrackTime,
|
||||||
|
x.LatestTrackTimeZone,
|
||||||
|
x.DeficiencyTag,
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<OrderEntity>> GetOrdersAsync(int[] orderIds)
|
private async Task<List<OrderEntity>> GetOrdersAsync(int[] orderIds)
|
||||||
|
|||||||
@ -5,6 +5,7 @@ using SJZY.Track.Application.Contract.Events;
|
|||||||
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.Dtos.TrackContents;
|
using SJZY.Track.Domain.Dtos.TrackContents;
|
||||||
|
using SJZY.Track.Domain.Enums;
|
||||||
using SJZY.Track.Domain.Queries;
|
using SJZY.Track.Domain.Queries;
|
||||||
using Volo.Abp.DependencyInjection;
|
using Volo.Abp.DependencyInjection;
|
||||||
using OrderIdentifier = SJZY.Track.Application.Contract.Events.OrderIdentifier;
|
using OrderIdentifier = SJZY.Track.Application.Contract.Events.OrderIdentifier;
|
||||||
@ -171,6 +172,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
TrackPlace = @event.TrackPlace,
|
TrackPlace = @event.TrackPlace,
|
||||||
TrackTime = @event.TrackTime,
|
TrackTime = @event.TrackTime,
|
||||||
TrackTimeZone = @event.TrackTimeZone,
|
TrackTimeZone = @event.TrackTimeZone,
|
||||||
|
DestinationTimeZone = @event.DestinationTimeZone,
|
||||||
|
EstimatedDeliveryDate = @event.EstimatedDeliveryDate
|
||||||
});
|
});
|
||||||
|
|
||||||
// 触发轨迹推送事件(异步)
|
// 触发轨迹推送事件(异步)
|
||||||
@ -200,16 +203,21 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray();
|
var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray();
|
||||||
|
|
||||||
// important:轨迹code相同,时间、发生地不同的,可能存在多条!!
|
// important:轨迹code相同,时间、发生地不同的,可能存在多条!!
|
||||||
|
//todo:查出多条轨迹,同订单同code也可能出现多条,
|
||||||
|
//按同code找轨迹如果有多条则不允许修改,如果没有则进行新增
|
||||||
var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true);
|
var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true);
|
||||||
|
|
||||||
var insertTracks = new List<TrackDetailsIndex>();
|
var insertTracks = new List<TrackDetailsIndex>();
|
||||||
var updateTracks = new List<TrackDetailsIndex>();
|
var updateTracks = new List<TrackDetailsIndex>();
|
||||||
|
|
||||||
|
//todo:标识轨迹内容是否是重复的,将来需要替换会从轨迹内容中获取
|
||||||
|
var isRepeatable = true;
|
||||||
foreach (var order in @event.OrderIdentifiers)
|
foreach (var order in @event.OrderIdentifiers)
|
||||||
{
|
{
|
||||||
TrackDetailsIndex? track;
|
TrackDetailsIndex? track;
|
||||||
if (!@event.IsAdd)
|
if (!@event.IsAdd)
|
||||||
{
|
{
|
||||||
|
//同一订单同轨迹code如果有多条轨迹明细则不允许修改
|
||||||
var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray();
|
var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray();
|
||||||
if (existTracks.Length > 1)
|
if (existTracks.Length > 1)
|
||||||
{
|
{
|
||||||
@ -220,13 +228,39 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
track = existTracks.FirstOrDefault();
|
track = existTracks.FirstOrDefault();
|
||||||
|
|
||||||
if (track == null) continue; // 不存在不让改
|
if (track == null) continue; // 不存在不让改
|
||||||
|
|
||||||
|
//来源与外部服务商不允许修改
|
||||||
|
if (track.Source == (int) TrackSourceEnum.ExternalServiceProvide) continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
track = tracks.FirstOrDefault(x =>
|
// 【批量新增】所有可能遇到的场景
|
||||||
x.OrderId == order.OrderId && x.TrackTime == @event.TrackTime && x.TrackPlace == @event.TrackPlace);
|
// 标识:允许重复,不允许重复,零条,一条,多条;
|
||||||
|
// 场景A:允许重复,零条 => 新增
|
||||||
|
// 场景B:允许重复,一条 => 新增(约束受限新增,否则跳过新增)
|
||||||
|
// 场景C:允许重复,多条 => 新增(约束受限新增,否则跳过新增)
|
||||||
|
// 场景D:不允许重复,零条 => 新增
|
||||||
|
// 场景E:不允许重复,一条 => 更新
|
||||||
|
// 场景F:不允许重复,(理想不会出现多条) => 跳过
|
||||||
|
var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray();
|
||||||
|
track = existTracks.FirstOrDefault();
|
||||||
|
|
||||||
if (track != null) continue; // 存在不让创建
|
if (isRepeatable && existTracks.Length >= 1)
|
||||||
|
{
|
||||||
|
if (existTracks.Any(x => x.TrackPlace == @event.TrackPlace && x.TrackTime == @event.TrackTime))
|
||||||
|
{
|
||||||
|
//允许重复,出现【轨迹发生地】,【轨迹发生时间】的都重复,则不允许新增
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置null后面执行新增逻辑
|
||||||
|
track = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isRepeatable && existTracks.Length > 1)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (track == default)
|
if (track == default)
|
||||||
@ -246,9 +280,25 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
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,
|
TrackStatus = trackContent.TrackStatus,
|
||||||
TrackContent = trackContent.TrackContent,
|
TrackContent = trackContent.TrackContent,
|
||||||
TrackEnContent = trackContent.TrackEnContent
|
TrackEnContent = trackContent.TrackEnContent,
|
||||||
|
//新增轨迹明细字段
|
||||||
|
IsVisibility = @event.IsVisibility,
|
||||||
|
Source = @event.Source,
|
||||||
|
Remarks = @event.Remarks ?? GlobalConst.EmptyString,
|
||||||
|
Files = @event.Files?.Select(x => new FileItem
|
||||||
|
{
|
||||||
|
OssKey = x.OssKey,
|
||||||
|
FileName = x.FileName
|
||||||
|
}).ToList(),
|
||||||
|
TrackPlaceCity = @event.TrackPlaceCity ?? GlobalConst.EmptyString,
|
||||||
|
TrackPlaceProvince = @event.TrackPlaceProvince ?? GlobalConst.EmptyString,
|
||||||
|
TrackPlaceNation = @event.TrackPlaceNation ?? GlobalConst.EmptyString,
|
||||||
|
TrackPlacePostcode = @event.TrackPlacePostcode ?? GlobalConst.EmptyString,
|
||||||
|
DestinationTimeZone = @event.DestinationTimeZone,
|
||||||
|
EstimatedDeliveryDate = @event.EstimatedDeliveryDate,
|
||||||
};
|
};
|
||||||
|
|
||||||
track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
|
track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
|
||||||
@ -267,6 +317,27 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser;
|
track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser;
|
||||||
track.UpdateTime = DateTime.Now;
|
track.UpdateTime = DateTime.Now;
|
||||||
|
|
||||||
|
//允许二次修改,在修改了轨迹内容后进行修改轨迹操作,如果输入的轨迹内容和英文则进行更改
|
||||||
|
track.TrackStatus = trackContent.TrackStatus; //todo?允许修改状么?
|
||||||
|
track.TrackContent = @event.Content ?? trackContent.TrackContent;
|
||||||
|
track.TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent;
|
||||||
|
|
||||||
|
//todo:修改轨迹增加字段(其中某些字段不允许更改)
|
||||||
|
track.IsVisibility = @event.IsVisibility;
|
||||||
|
//track.Source = @event.Source; //来源不允许更改
|
||||||
|
track.Remarks = @event.Remarks ?? GlobalConst.EmptyString;
|
||||||
|
track.Files = @event.Files?.Select(x => new FileItem
|
||||||
|
{
|
||||||
|
OssKey = x.OssKey,
|
||||||
|
FileName = x.FileName
|
||||||
|
}).ToList();
|
||||||
|
track.TrackPlaceCity = @event.TrackPlaceCity ?? GlobalConst.EmptyString;
|
||||||
|
track.TrackPlaceProvince = @event.TrackPlaceProvince ?? GlobalConst.EmptyString;
|
||||||
|
track.TrackPlaceNation = @event.TrackPlaceNation ?? GlobalConst.EmptyString;
|
||||||
|
track.TrackPlacePostcode = @event.TrackPlacePostcode ?? GlobalConst.EmptyString;
|
||||||
|
track.DestinationTimeZone = @event.DestinationTimeZone;
|
||||||
|
track.EstimatedDeliveryDate = @event.EstimatedDeliveryDate;
|
||||||
|
|
||||||
updateTracks.Add(track);
|
updateTracks.Add(track);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,6 +5,7 @@ using SJZY.Track.Application.Contract.Services.ProvideServices;
|
|||||||
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.TrackDetailsAggregate;
|
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||||
|
using SJZY.Track.Domain.Enums;
|
||||||
using SJZY.UserCenter.HttpApi.Services;
|
using SJZY.UserCenter.HttpApi.Services;
|
||||||
using Volo.Abp.Http.Client.DynamicProxying;
|
using Volo.Abp.Http.Client.DynamicProxying;
|
||||||
|
|
||||||
@ -59,6 +60,12 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
throw new BusinessException(message: "轨迹时间不合法");
|
throw new BusinessException(message: "轨迹时间不合法");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue) ||
|
||||||
|
(input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false))
|
||||||
|
{
|
||||||
|
throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入");
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
@ -112,6 +119,14 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
|
|
||||||
var name = userInfo.Data.UserName;
|
var name = userInfo.Data.UserName;
|
||||||
|
|
||||||
|
//删除轨迹约束,只要其中有一条来源是外部的就立即返回错误
|
||||||
|
var tracks = await _trackDetailsEsRepository
|
||||||
|
.GetListAsync(new[] { orderId }, input.TrackCodes, TrackSourceEnum.ExternalServiceProvide);
|
||||||
|
if (tracks.Count > 0)
|
||||||
|
{
|
||||||
|
throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除");
|
||||||
|
}
|
||||||
|
|
||||||
// 删除轨迹
|
// 删除轨迹
|
||||||
var @event = new TrackDeleteEvent
|
var @event = new TrackDeleteEvent
|
||||||
{
|
{
|
||||||
@ -153,6 +168,14 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}");
|
throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//删除轨迹约束,只要其中有一条来源是外部的就立即返回错误
|
||||||
|
var tracks = await _trackDetailsEsRepository
|
||||||
|
.GetListAsync(orderIds.ToArray(), input.TrackCodes, TrackSourceEnum.ExternalServiceProvide);
|
||||||
|
if (tracks.Count > 0)
|
||||||
|
{
|
||||||
|
throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除");
|
||||||
|
}
|
||||||
|
|
||||||
// 删除轨迹
|
// 删除轨迹
|
||||||
var @event = new TrackDeleteEvent
|
var @event = new TrackDeleteEvent
|
||||||
{
|
{
|
||||||
@ -191,6 +214,12 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
throw new BusinessException(message: "订单一个都不存在");
|
throw new BusinessException(message: "订单一个都不存在");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue) ||
|
||||||
|
(input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false))
|
||||||
|
{
|
||||||
|
throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入");
|
||||||
|
}
|
||||||
|
|
||||||
// 获取用户name
|
// 获取用户name
|
||||||
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)
|
||||||
@ -216,7 +245,19 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
TrackPlace = input.TrackPlace,
|
TrackPlace = input.TrackPlace,
|
||||||
TrackTime = input.TrackTime,
|
TrackTime = input.TrackTime,
|
||||||
TrackTimeZone = input.TrackTimeZone,
|
TrackTimeZone = input.TrackTimeZone,
|
||||||
OperationMan = userInfo.Data.UserName
|
OperationMan = userInfo.Data.UserName,
|
||||||
|
IsVisibility = input.IsVisibility,
|
||||||
|
Source = input.Source,
|
||||||
|
Remarks = input.Remarks,
|
||||||
|
Files = input.Files,
|
||||||
|
Content = input.Content,
|
||||||
|
EnStatus = input.EnStatus,
|
||||||
|
TrackPlaceCity = input.TrackPlaceCity,
|
||||||
|
TrackPlaceProvince = input.TrackPlaceProvince,
|
||||||
|
TrackPlaceNation = input.TrackPlaceNation,
|
||||||
|
TrackPlacePostcode = input.TrackPlacePostcode,
|
||||||
|
EstimatedDeliveryDate = input.EstimatedDeliveryDate,
|
||||||
|
DestinationTimeZone = input.DestinationTimeZone
|
||||||
};
|
};
|
||||||
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event);
|
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using SJZY.Expand.ElasticSearch.Services;
|
using SJZY.Expand.ElasticSearch.Services;
|
||||||
|
using SJZY.Track.Domain.Enums;
|
||||||
|
|
||||||
namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||||
|
|
||||||
@ -22,6 +23,8 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService<TrackDe
|
|||||||
|
|
||||||
Task<List<TrackDetailsIndex>> GetListAsync(int orderId);
|
Task<List<TrackDetailsIndex>> GetListAsync(int orderId);
|
||||||
|
|
||||||
|
Task<List<TrackDetailsIndex>> GetListAsync(int[] orderIds, List<string> trackCodes, TrackSourceEnum source);
|
||||||
|
|
||||||
Task<List<int>> DeleteTrackAsync(int[] orderIds, List<string> trackCodes);
|
Task<List<int>> DeleteTrackAsync(int[] orderIds, List<string> trackCodes);
|
||||||
|
|
||||||
Task DeleteTrackByIdAsync(string id, string indexName);
|
Task DeleteTrackByIdAsync(string id, string indexName);
|
||||||
|
|||||||
24
src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs
Normal file
24
src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
|
namespace SJZY.Track.Domain.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 轨迹来源
|
||||||
|
/// </summary>
|
||||||
|
public enum TrackSourceEnum
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 外部服务商创建
|
||||||
|
/// </summary>
|
||||||
|
[Description("外部服务商创建")] ExternalServiceProvide = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 内部系统创建
|
||||||
|
/// </summary>
|
||||||
|
[Description("内部系统创建")] InternalService = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 人工创建
|
||||||
|
/// </summary>
|
||||||
|
[Description("人工创建")] Artificial = 3,
|
||||||
|
}
|
||||||
@ -3,6 +3,7 @@ using SJZY.Expand.ABP.Core.PublicMethords;
|
|||||||
using SJZY.Expand.ElasticSearch.Services;
|
using SJZY.Expand.ElasticSearch.Services;
|
||||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||||
using SJZY.Track.Domain.Consts;
|
using SJZY.Track.Domain.Consts;
|
||||||
|
using SJZY.Track.Domain.Enums;
|
||||||
|
|
||||||
namespace SJZY.Track.Repository.Repositories;
|
namespace SJZY.Track.Repository.Repositories;
|
||||||
|
|
||||||
@ -174,6 +175,19 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract<TrackDetail
|
|||||||
ctx._source.trackTimeZone = params.trackTimeZone;
|
ctx._source.trackTimeZone = params.trackTimeZone;
|
||||||
ctx._source.updateUser = params.updateUser;
|
ctx._source.updateUser = params.updateUser;
|
||||||
ctx._source.updateTime = params.updateTime;
|
ctx._source.updateTime = params.updateTime;
|
||||||
|
ctx._source.trackStatus = params.trackStatus;
|
||||||
|
ctx._source.trackContent = params.trackContent;
|
||||||
|
ctx._source.trackEnContent = params.trackEnContent;
|
||||||
|
ctx._source.isVisibility = params.isVisibility;
|
||||||
|
ctx._source.remarks = params.remarks;
|
||||||
|
ctx._source.files = params.files;
|
||||||
|
ctx._source.trackPlaceCity = params.trackPlaceCity;
|
||||||
|
ctx._source.trackPlaceProvince = params.trackPlaceProvince;
|
||||||
|
ctx._source.trackPlaceNation = params.trackPlaceNation;
|
||||||
|
ctx._source.trackPlacePostcode = params.trackPlacePostcode;
|
||||||
|
ctx._source.destinationTimeZone = params.destinationTimeZone;
|
||||||
|
ctx._source.estimatedDeliveryDate = params.estimatedDeliveryDate;
|
||||||
|
|
||||||
")
|
")
|
||||||
.Params(p => p
|
.Params(p => p
|
||||||
.Add("trackPlace", track.TrackPlace)
|
.Add("trackPlace", track.TrackPlace)
|
||||||
@ -181,6 +195,19 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract<TrackDetail
|
|||||||
.Add("trackTimeZone", track.TrackTimeZone)
|
.Add("trackTimeZone", track.TrackTimeZone)
|
||||||
.Add("updateUser", track.UpdateUser)
|
.Add("updateUser", track.UpdateUser)
|
||||||
.Add("updateTime", DateTime.Now)
|
.Add("updateTime", DateTime.Now)
|
||||||
|
//新增字段更新
|
||||||
|
.Add("trackStatus", track.TrackStatus)
|
||||||
|
.Add("trackContent", track.TrackContent)
|
||||||
|
.Add("trackEnContent", track.TrackEnContent)
|
||||||
|
.Add("isVisibility", track.IsVisibility)
|
||||||
|
.Add("remarks", track.Remarks)
|
||||||
|
.Add("files", track.Files)
|
||||||
|
.Add("trackPlaceCity", track.TrackPlaceCity)
|
||||||
|
.Add("trackPlaceProvince", track.TrackPlaceProvince)
|
||||||
|
.Add("trackPlaceNation", track.TrackPlaceNation)
|
||||||
|
.Add("trackPlacePostcode", track.TrackPlacePostcode)
|
||||||
|
.Add("destinationTimeZone", track.DestinationTimeZone)
|
||||||
|
.Add("estimatedDeliveryDate", track.EstimatedDeliveryDate)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@ -298,6 +325,26 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract<TrackDetail
|
|||||||
return r.ToIdList();
|
return r.ToIdList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<List<TrackDetailsIndex>> GetListAsync(int[] orderIds, List<string> trackCodes, TrackSourceEnum source)
|
||||||
|
{
|
||||||
|
var r = await Context.SearchAsync<TrackDetailsIndex>(x => x
|
||||||
|
.Index(GlobalConst.TrackDetailsIndex)
|
||||||
|
.Query(q =>
|
||||||
|
q.Terms(t => t.Field(f => f.OrderId).Terms(orderIds))
|
||||||
|
&& q.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes))
|
||||||
|
&& q.Term(t => t.Source, (int) source)
|
||||||
|
)
|
||||||
|
.Size(SafelyLimit)
|
||||||
|
.Sort(s => s.Field(f => f.ZeroTrackTime, SortOrder.Descending)));
|
||||||
|
|
||||||
|
if (!r.IsValid)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"轨迹查询失败,orderIds:[{string.Join(',', orderIds)}],原因:{r.DebugInformation}。");
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.ToIdList();
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<List<int>> DeleteTrackAsync(int[] orderIds, List<string> trackCodes)
|
public async Task<List<int>> DeleteTrackAsync(int[] orderIds, List<string> trackCodes)
|
||||||
{
|
{
|
||||||
// var deleteResponse = await Context.DeleteByQueryAsync<TrackDetailsIndex>(d => d
|
// var deleteResponse = await Context.DeleteByQueryAsync<TrackDetailsIndex>(d => d
|
||||||
@ -334,6 +381,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract<TrackDetail
|
|||||||
$"轨迹查询失败,orderIds:[{orderIds.JoinAsString(", ")}],trackCodes:[{trackCodes.JoinAsString(", ")}],原因:{search.DebugInformation}。");
|
$"轨迹查询失败,orderIds:[{orderIds.JoinAsString(", ")}],trackCodes:[{trackCodes.JoinAsString(", ")}],原因:{search.DebugInformation}。");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//按订单id和code分组,只删除组元素数量为1的轨迹
|
||||||
var tracks = search.ToIdList().GroupBy(doc => new
|
var tracks = search.ToIdList().GroupBy(doc => new
|
||||||
{
|
{
|
||||||
doc.OrderId,
|
doc.OrderId,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user